Skip to content

Move AssetRegistry implementation into main package#57233

Open
huntie wants to merge 2 commits into
react:mainfrom
huntie:export-D108750302
Open

Move AssetRegistry implementation into main package#57233
huntie wants to merge 2 commits into
react:mainfrom
huntie:export-D108750302

Conversation

@huntie

@huntie huntie commented Jun 16, 2026

Copy link
Copy Markdown
Member

Summary:
Problem

The separate @react-native/assets-registry package includes a longstanding ecosystem footgun.

registry.js holds asset state in a module-scoped variable, which makes the package a stateful singleton: exactly one instance must exist per JS runtime, or registration and lookup diverge.

We provide no guarantee that this singleton requirement holds:

  • The install layout — how the package manager dedupes packages in node_modules — decides how many copies exist, and react-native's exact-version pin means third-party ranges never dedupe against it.

Effects:

  • Consumers silently break: expo-asset and expo-image can land on a second copy: assets register in one, resolve as undefined from the other. Expo neutralizes this with a shim in expo/cli that redirects every registry import to a single virtual module — bare React Native + Metro has no such protection.
  • This blocks 1.0: The ecosystem can't move from exact-version lockstep to semver ranges until stateful packages like the asset registry are safe to duplicate. Today, relaxing the pin would turn a latent footgun into a common one.

To solve this, move towards (but not quite yet) deleting @react-native/assets-registry, in favour of a replacement AssetRegistry API offered directly by react-native.

This diff

  • Adds new AssetRegistry API, along with the PackagerAsset and AssetDestPathResolver root type exports in react-native.
  • Updates @react-native/assets-registry to source from this relocated implementation — fixing the duplicate install layout bug (where apps/frameworks enforce a single copy of react-native).

Impact

  • ✅ Fixed: Imports from either react-native or @react-native/assets-registry in RN 0.87+ will be durable to duplicate package installs — Expo can remove their virtual module shim.

Changelog:

  • [General][Fixed] - assets-registry: @react-native/assets-registry now shares state across duplicate installs, sourcing from a relocated implementation in the react-native package
  • [General][Added] - Add AssetRegistry API (replaces @react-native/assets-registry/registry)

Differential Revision: D108750302

huntie added 2 commits June 16, 2026 03:04
Summary:
Quality pass on the `assets-registry` package ahead of the next diff.

- Add user-facing notes to package README.
- Add adjacent `.d.ts` definitions (manually/AI-maintained is fine at this scale).
- Move source files to `src/` (`"exports"` map added; no breaking changes).

Changelog: [Internal]

Differential Revision: D108624321
Summary:
**Problem**

The separate `react-native/assets-registry` package isn’t working for the ecosystem.

`registry.js` holds asset state in a module-scoped variable, which makes the package a stateful singleton: exactly one instance must exist per JS runtime, or registration and lookup diverge.

We provide no guarantee that this singleton requirement holds:

- The install layout — how the package manager dedupes packages in `node_modules` — decides how many copies exist, and `react-native`'s exact-version pin means third-party ranges never dedupe against it.

Effects:

- **Consumers silently break**: `expo-asset` and `expo-image` can land on a second copy: assets register in one, resolve as `undefined` from the other. Expo neutralizes this with a shim in `expo/cli` that redirects every registry import to a single virtual module — bare React Native + Metro has no such protection.
- **This blocks 1.0**: The ecosystem can't move from exact-version lockstep to semver ranges until stateful packages like the asset registry are safe to duplicate. Today, relaxing the pin would turn a latent footgun into a common one.

**To solve this**, move towards (but not quite yet) deleting `react-native/assets-registry`, in favour of a replacement `AssetRegistry` API offered directly by `react-native`.

**This diff**

- Adds new `AssetRegistry` API, along with the `PackagerAsset` and `AssetDestPathResolver` root type exports in `react-native`.
- Updates `react-native/assets-registry` to source from this relocated implementation — fixing the duplicate install layout bug (where apps/frameworks enforce a single copy of `react-native`).

**Impact**

- **✅ Fixed**: Imports from either `react-native` or `react-native/assets-registry` in RN 0.87+ will be durable to duplicate package installs — Expo can remove their virtual module shim.

Changelog:
- [General][Fixed] - **assets-registry**: `react-native/assets-registry` now shares state across duplicate installs, sourcing from a relocated implementation in the `react-native` package
- [General][Added] - Add `AssetRegistry` API (replaces `react-native/assets-registry/registry`)

Differential Revision: D108750302
@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jun 16, 2026
@meta-codesync

meta-codesync Bot commented Jun 16, 2026

Copy link
Copy Markdown

@huntie has exported this pull request. If you are a Meta employee, you can view the originating Diff in D108750302.

@github-actions

Copy link
Copy Markdown

Warning

JavaScript API change detected

This PR commits an update to ReactNativeApi.d.ts, indicating a change to React Native's public JavaScript API.

  • Please include a clear changelog message.
  • This change will be subject to additional review.

This change was flagged as: POTENTIALLY_NON_BREAKING

@huntie

huntie commented Jun 16, 2026

Copy link
Copy Markdown
Member Author

cc @byCedric

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. meta-exported p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant