diff --git a/apps/example/index.html b/apps/example/index.html
new file mode 100644
index 0000000000..a2e3764367
--- /dev/null
+++ b/apps/example/index.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+ Example
+
+
+
+
+
+
+
+
+
diff --git a/apps/example/index.web.js b/apps/example/index.web.js
new file mode 100644
index 0000000000..8dec729e3b
--- /dev/null
+++ b/apps/example/index.web.js
@@ -0,0 +1,23 @@
+import { AppRegistry } from "react-native";
+
+import App from "./src/App";
+import { name as appName } from "./app.json";
+
+AppRegistry.registerComponent(appName, () => App);
+
+const rootTag = document.getElementById("root");
+
+if (process.env.NODE_ENV !== "production") {
+ if (!rootTag) {
+ throw new Error(
+ 'Required HTML element with id "root" was not found in the document HTML.'
+ );
+ }
+}
+
+CanvasKitInit({
+ locateFile: (file) => `https://unpkg.com/canvaskit-wasm/bin/full/${file}`,
+}).then((CanvasKit) => {
+ window.CanvasKit = global.CanvasKit = CanvasKit;
+ AppRegistry.runApplication(appName, { rootTag });
+});
diff --git a/apps/example/metro.config.js b/apps/example/metro.config.js
index 96c8bc6572..e44064a8d7 100644
--- a/apps/example/metro.config.js
+++ b/apps/example/metro.config.js
@@ -1,5 +1,15 @@
+const path = require("path");
+const { resolve: defaultResolve } = require("metro-resolver");
const { makeMetroConfig } = require("@rnx-kit/metro-config");
-module.exports = makeMetroConfig({
+
+const root = path.resolve(__dirname, "../..");
+const rnwPath = path.resolve(root, "node_modules/react-native-web");
+const assetRegistryPath = path.resolve(
+ root,
+ "node_modules/react-native-web/dist/modules/AssetRegistry/index",
+);
+
+const metroConfig = makeMetroConfig({
transformer: {
getTransformOptions: async () => ({
transform: {
@@ -9,3 +19,39 @@ module.exports = makeMetroConfig({
}),
},
});
+
+function getWebMetroConfig(config) {
+ config.resolver = config.resolver ?? {};
+ config.resolver.platforms = ["ios", "android", "web"];
+
+ const origResolveRequest =
+ config.resolver.resolveRequest ??
+ ((context, moduleName, platform) =>
+ defaultResolve(context, moduleName, platform));
+
+ config.resolver.resolveRequest = (contextRaw, moduleName, platform) => {
+ const context = {
+ ...contextRaw,
+ preferNativePlatform: false,
+ };
+
+ if (moduleName === "react-native") {
+ return {
+ filePath: path.resolve(rnwPath, "dist/index.js"),
+ type: "sourceFile",
+ };
+ }
+
+ // Let default config handle other modules
+ return origResolveRequest(context, moduleName, platform);
+ };
+
+ config.transformer = config.transformer ?? {};
+ config.transformer.assetRegistryPath = assetRegistryPath;
+
+ return config;
+}
+
+module.exports = !!process.env.IS_WEB_BUILD
+ ? getWebMetroConfig(metroConfig)
+ : metroConfig;
diff --git a/apps/example/package.json b/apps/example/package.json
index 3399160a62..de639bf27f 100644
--- a/apps/example/package.json
+++ b/apps/example/package.json
@@ -16,7 +16,8 @@
"pod:install": "cd ios && pod install",
"test": "jest",
"tsc": "tsc --noEmit",
- "start": "react-native start"
+ "start": "react-native start",
+ "web": "IS_WEB_BUILD=true react-native start"
},
"dependencies": {
"@callstack/react-native-visionos": "^0.75.0",
@@ -30,6 +31,7 @@
"cdt2d": "^1.0.0",
"its-fine": "^2.0.0",
"react": "19.0.0",
+ "react-dom": "19.0.0",
"react-native": "0.78.0",
"react-native-gesture-handler": "^2.24.0",
"react-native-macos": "^0.78.3",
@@ -37,6 +39,7 @@
"react-native-safe-area-context": "^5.2.0",
"react-native-screens": "^4.9.1",
"react-native-svg": "^15.11.2",
+ "react-native-web": "^0.21.2",
"react-native-windows": "^0.75.0"
},
"devDependencies": {
@@ -54,6 +57,8 @@
"@rnx-kit/metro-config": "^2.0.0",
"@types/jest": "^29.5.13",
"@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@types/react-native-web": "^0.19.2",
"@types/react-test-renderer": "^19.0.0",
"eslint": "9.36.0",
"eslint-config-react-native-wcandillon": "4.0.1",
diff --git a/apps/example/src/App.tsx b/apps/example/src/App.tsx
index 277e37330d..b11b743622 100644
--- a/apps/example/src/App.tsx
+++ b/apps/example/src/App.tsx
@@ -39,6 +39,7 @@ import { HomeScreen } from "./Home";
import type { StackParamList } from "./types";
import { useAssets } from "./Tests/useAssets";
import { Chess } from "./Examples/Chess";
+import "./resolveAssetSourcePolyfill";
const linking: LinkingOptions = {
config: {
diff --git a/apps/example/src/resolveAssetSourcePolyfill.js b/apps/example/src/resolveAssetSourcePolyfill.js
new file mode 100644
index 0000000000..e8041f5cc2
--- /dev/null
+++ b/apps/example/src/resolveAssetSourcePolyfill.js
@@ -0,0 +1,57 @@
+import { Image, PixelRatio, Platform } from "react-native";
+import { getAssetByID } from "react-native-web/dist/modules/AssetRegistry";
+
+// react-native-web does not support resolveAssetSource out of the box
+// https://github.com/necolas/react-native-web/issues/1666
+if (Platform.OS === "web") {
+ function resolveAssetUri(source) {
+ let uri = null;
+ if (typeof source === "number") {
+ // get the URI from the packager
+ const asset = getAssetByID(source);
+ if (asset == null) {
+ throw new Error(
+ `Image: asset with ID "${source}" could not be found. Please check the image source or packager.`,
+ );
+ }
+ // eslint-disable-next-line prefer-destructuring
+ let scale = asset.scales[0];
+ if (asset.scales.length > 1) {
+ const preferredScale = PixelRatio.get();
+ // Get the scale which is closest to the preferred scale
+ scale = asset.scales.reduce((prev, curr) =>
+ Math.abs(curr - preferredScale) < Math.abs(prev - preferredScale)
+ ? curr
+ : prev,
+ );
+ }
+ const scaleSuffix = scale !== 1 ? `@${scale}x` : "";
+ uri = asset
+ ? `${asset.httpServerLocation}/${asset.name}${scaleSuffix}.${asset.type}`
+ : "";
+ } else if (typeof source === "string") {
+ uri = source;
+ } else if (source && typeof source.uri === "string") {
+ // eslint-disable-next-line prefer-destructuring
+ uri = source.uri;
+ }
+
+ if (uri) {
+ const svgDataUriPattern = /^(data:image\/svg\+xml;utf8,)(.*)/;
+ const match = uri.match(svgDataUriPattern);
+ // inline SVG markup may contain characters (e.g., #, ") that need to be escaped
+ if (match) {
+ const [, prefix, svg] = match;
+ const encodedSvg = encodeURIComponent(svg);
+ return `${prefix}${encodedSvg}`;
+ }
+ }
+
+ return uri;
+ }
+
+ Image.resolveAssetSource = (source) => {
+ const uri = resolveAssetUri(source) || "";
+ return { uri };
+ };
+}
diff --git a/packages/skia/src/__tests__/setup.ts b/packages/skia/src/__tests__/setup.ts
index b527a91aeb..aa8f822051 100644
--- a/packages/skia/src/__tests__/setup.ts
+++ b/packages/skia/src/__tests__/setup.ts
@@ -9,8 +9,9 @@ import type { SkSurface, SkImage } from "../skia/types";
export const E2E = process.env.E2E === "true";
export const CI = process.env.CI === "true";
+export const WEB = process.env.WEB === "true";
export const itFailsE2e = E2E ? it.failing : it;
-export const itRunsE2eOnly = E2E ? it : it.skip;
+export const itRunsE2eOnly = E2E && !WEB ? it : it.skip;
export const itRunsNodeOnly = E2E ? it.skip : it;
export const itRunsCIAndNodeOnly = CI || !E2E ? it : it.skip;
diff --git a/yarn.lock b/yarn.lock
index df6b1e1bd0..6653550dc0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5733,7 +5733,7 @@ __metadata:
languageName: node
linkType: hard
-"@jest/create-cache-key-function@npm:^29.6.3":
+"@jest/create-cache-key-function@npm:^29.6.3, @jest/create-cache-key-function@npm:^29.7.0":
version: 29.7.0
resolution: "@jest/create-cache-key-function@npm:29.7.0"
dependencies:
@@ -7872,6 +7872,13 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/assets-registry@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/assets-registry@npm:0.82.1"
+ checksum: f511a248f455c7fe2bae330ed15929294d5d25e5d8aa27e148588a554bde31a1ddf54d08ebc21128cabe9978be4604b2e8ad4343566c9840fc49e2b0d119cbc6
+ languageName: node
+ linkType: hard
+
"@react-native/assets@npm:1.0.0":
version: 1.0.0
resolution: "@react-native/assets@npm:1.0.0"
@@ -8207,6 +8214,23 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/codegen@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/codegen@npm:0.82.1"
+ dependencies:
+ "@babel/core": ^7.25.2
+ "@babel/parser": ^7.25.3
+ glob: ^7.1.1
+ hermes-parser: 0.32.0
+ invariant: ^2.2.4
+ nullthrows: ^1.1.1
+ yargs: ^17.6.2
+ peerDependencies:
+ "@babel/core": "*"
+ checksum: d965d9f387a62e27a75d80546a6c825b21a42b56738eedf294b59221c117345148daa0362af5b793a2d5ce3e089e3682dd4bdd9548235ab040543f0aa21d46f0
+ languageName: node
+ linkType: hard
+
"@react-native/community-cli-plugin@npm:0.75.2":
version: 0.75.2
resolution: "@react-native/community-cli-plugin@npm:0.75.2"
@@ -8292,6 +8316,29 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/community-cli-plugin@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/community-cli-plugin@npm:0.82.1"
+ dependencies:
+ "@react-native/dev-middleware": 0.82.1
+ debug: ^4.4.0
+ invariant: ^2.2.4
+ metro: ^0.83.1
+ metro-config: ^0.83.1
+ metro-core: ^0.83.1
+ semver: ^7.1.3
+ peerDependencies:
+ "@react-native-community/cli": "*"
+ "@react-native/metro-config": "*"
+ peerDependenciesMeta:
+ "@react-native-community/cli":
+ optional: true
+ "@react-native/metro-config":
+ optional: true
+ checksum: 680aef3270c56a73467ba40f7de416d32fef8b7e484421fccd437f940692eee76382e82eddd0a4749675b855d642fd6c83b147136bdcf03ee84f36ed38f7e0de
+ languageName: node
+ linkType: hard
+
"@react-native/debugger-frontend@npm:0.75.2":
version: 0.75.2
resolution: "@react-native/debugger-frontend@npm:0.75.2"
@@ -8320,6 +8367,23 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/debugger-frontend@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/debugger-frontend@npm:0.82.1"
+ checksum: b767c7586c782a130d3579a1d8c137a8c55361d579028e44a31b220c566ab793a83b256b39eb114a759e07031574cd142cae1bdc1ec80dc02e7a6a191409548e
+ languageName: node
+ linkType: hard
+
+"@react-native/debugger-shell@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/debugger-shell@npm:0.82.1"
+ dependencies:
+ cross-spawn: ^7.0.6
+ fb-dotslash: 0.5.8
+ checksum: 9b4ec7f413d5e776a7361f1a5e8ecc7dbc8b56c7fc119fec1895f4821071a7b95b2a3db0cef016614a1eb50288df0282c7f7cf5944e3934bc8694529556f44e8
+ languageName: node
+ linkType: hard
+
"@react-native/dev-middleware@npm:0.75.2":
version: 0.75.2
resolution: "@react-native/dev-middleware@npm:0.75.2"
@@ -8400,6 +8464,26 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/dev-middleware@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/dev-middleware@npm:0.82.1"
+ dependencies:
+ "@isaacs/ttlcache": ^1.4.1
+ "@react-native/debugger-frontend": 0.82.1
+ "@react-native/debugger-shell": 0.82.1
+ chrome-launcher: ^0.15.2
+ chromium-edge-launcher: ^0.2.0
+ connect: ^3.6.5
+ debug: ^4.4.0
+ invariant: ^2.2.4
+ nullthrows: ^1.1.1
+ open: ^7.0.3
+ serve-static: ^1.16.2
+ ws: ^6.2.3
+ checksum: 0fed27cb7d7bd9e2e3b9cd20776000ec730ea6672779ccd971e831c67a4b25adcda9d82e0042d3f37e1311736add0d4bb51519c463ea81a11565a2bac1cee68c
+ languageName: node
+ linkType: hard
+
"@react-native/eslint-config@npm:0.78.0":
version: 0.78.0
resolution: "@react-native/eslint-config@npm:0.78.0"
@@ -8458,6 +8542,13 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/gradle-plugin@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/gradle-plugin@npm:0.82.1"
+ checksum: 7e7e2d768a8ff599dba5ef7b0a417e1d14a032a3344cc1e57852d4ebee1587dc877f83ae9dd4beae3b27fe2389d235227df12bd8aaa9be8b6ef1c7784419e0de
+ languageName: node
+ linkType: hard
+
"@react-native/js-polyfills@npm:0.75.2":
version: 0.75.2
resolution: "@react-native/js-polyfills@npm:0.75.2"
@@ -8486,6 +8577,13 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/js-polyfills@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/js-polyfills@npm:0.82.1"
+ checksum: 271d5bcff95d3867237ae4ec4745247c7048ea950912b3c31c8bbffd801c714509294b04d176c8121389788a192680f482b21e99ab24c9b2dcbce37acfdeaa5f
+ languageName: node
+ linkType: hard
+
"@react-native/metro-babel-transformer@npm:0.75.2":
version: 0.75.2
resolution: "@react-native/metro-babel-transformer@npm:0.75.2"
@@ -8582,6 +8680,13 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/normalize-colors@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/normalize-colors@npm:0.82.1"
+ checksum: d180cc6591989a3d490ad4454d63a19ec9be796314632adb29051515eb31e98fbdd12903c00750d4ce023306e159a2498867bf6f25bcf11a8ed48e5486482947
+ languageName: node
+ linkType: hard
+
"@react-native/normalize-colors@npm:^0.74.1":
version: 0.74.89
resolution: "@react-native/normalize-colors@npm:0.74.89"
@@ -8647,6 +8752,23 @@ __metadata:
languageName: node
linkType: hard
+"@react-native/virtualized-lists@npm:0.82.1":
+ version: 0.82.1
+ resolution: "@react-native/virtualized-lists@npm:0.82.1"
+ dependencies:
+ invariant: ^2.2.4
+ nullthrows: ^1.1.1
+ peerDependencies:
+ "@types/react": ^19.1.1
+ react: "*"
+ react-native: "*"
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 4961af57d477f16c1b7e0b584e9f54cef876bbb738b3e628b5dfc8ddc157f83bbe1b3e9d8a0c426f41018cdec5d1073f2ffe23b830e288c7d8b730753700608a
+ languageName: node
+ linkType: hard
+
"@react-navigation/bottom-tabs@npm:^7.2.1":
version: 7.3.8
resolution: "@react-navigation/bottom-tabs@npm:7.3.8"
@@ -10411,6 +10533,16 @@ __metadata:
languageName: node
linkType: hard
+"@types/react-native-web@npm:^0.19.2":
+ version: 0.19.2
+ resolution: "@types/react-native-web@npm:0.19.2"
+ dependencies:
+ "@types/react": "*"
+ react-native: "*"
+ checksum: d6c6bbaa4610dbc1588205b2a936d88938f3d24e6b6a79d238192ff1cf1dc1865864c9c5e00d500c108f0324b6464c3903e5b5aba9e69fc1ab5638ec81b0f163
+ languageName: node
+ linkType: hard
+
"@types/react-reconciler@npm:0.28.9, @types/react-reconciler@npm:^0.28.0, @types/react-reconciler@npm:^0.28.9":
version: 0.28.9
resolution: "@types/react-reconciler@npm:0.28.9"
@@ -12511,6 +12643,15 @@ __metadata:
languageName: node
linkType: hard
+"babel-plugin-syntax-hermes-parser@npm:0.32.0":
+ version: 0.32.0
+ resolution: "babel-plugin-syntax-hermes-parser@npm:0.32.0"
+ dependencies:
+ hermes-parser: 0.32.0
+ checksum: ec76abeefabf940e2d571db3b47d022a9be7602286133291e8e047d4855af6a8afc079e4631bc9a56209d751fad54b5199932a55753b1e2b56a719d20e2d5065
+ languageName: node
+ linkType: hard
+
"babel-plugin-transform-flow-enums@npm:^0.0.2":
version: 0.0.2
resolution: "babel-plugin-transform-flow-enums@npm:0.0.2"
@@ -17504,6 +17645,8 @@ __metadata:
"@testing-library/react-native": ^13.1.0
"@types/jest": ^29.5.13
"@types/react": ^19.0.0
+ "@types/react-dom": ^19.0.0
+ "@types/react-native-web": ^0.19.2
"@types/react-test-renderer": ^19.0.0
babel-plugin-transform-inline-environment-variables: ^0.4.4
cdt2d: ^1.0.0
@@ -17515,6 +17658,7 @@ __metadata:
jest-transform-stub: ^2.0.0
prettier: 2.8.8
react: 19.0.0
+ react-dom: 19.0.0
react-native: 0.78.0
react-native-gesture-handler: ^2.24.0
react-native-macos: ^0.78.3
@@ -17523,6 +17667,7 @@ __metadata:
react-native-screens: ^4.9.1
react-native-svg: ^15.11.2
react-native-test-app: 4.4.7
+ react-native-web: ^0.21.2
react-native-windows: ^0.75.0
react-test-renderer: 19.0.0
typescript: ^5.2.2
@@ -17900,6 +18045,15 @@ __metadata:
languageName: node
linkType: hard
+"fb-dotslash@npm:0.5.8":
+ version: 0.5.8
+ resolution: "fb-dotslash@npm:0.5.8"
+ bin:
+ dotslash: bin/dotslash
+ checksum: 5678efe96898294e41c983cb8ea28952539566df5f8bfd2913e8e146425d7d9999d2c458bb4f3e0b07b36b5bcd23cada0868d94509c8b2d4b17de8bf0641775a
+ languageName: node
+ linkType: hard
+
"fb-watchman@npm:^2.0.0, fb-watchman@npm:^2.0.2":
version: 2.0.2
resolution: "fb-watchman@npm:2.0.2"
@@ -19318,6 +19472,13 @@ __metadata:
languageName: unknown
linkType: soft
+"hermes-compiler@npm:0.0.0":
+ version: 0.0.0
+ resolution: "hermes-compiler@npm:0.0.0"
+ checksum: 8b6fc8a64c2fa18c9aa6ddb8831c92253b6a2f10adf7d5d8f361b574f07e91b64f0c44b1370665075c33c17dd71c02fd19422124a3d2aa1717c37006ab12a1f0
+ languageName: node
+ linkType: hard
+
"hermes-estree@npm:0.22.0":
version: 0.22.0
resolution: "hermes-estree@npm:0.22.0"
@@ -19339,6 +19500,13 @@ __metadata:
languageName: node
linkType: hard
+"hermes-estree@npm:0.32.0":
+ version: 0.32.0
+ resolution: "hermes-estree@npm:0.32.0"
+ checksum: 7b0606a8d2cf4593634d01b0eae0764c0e4703bc5cd73cbb0547fb8dda9445a27a83345117c08eef64f6bdab1287e3c5a4e3001deed465a715d26f4e918c8b22
+ languageName: node
+ linkType: hard
+
"hermes-parser@npm:0.22.0":
version: 0.22.0
resolution: "hermes-parser@npm:0.22.0"
@@ -19366,6 +19534,15 @@ __metadata:
languageName: node
linkType: hard
+"hermes-parser@npm:0.32.0":
+ version: 0.32.0
+ resolution: "hermes-parser@npm:0.32.0"
+ dependencies:
+ hermes-estree: 0.32.0
+ checksum: 7ec172ec763ee5ba1d01f273084ab4c7ad7a543d1ed11e887ea3a9eba7c0b83854dde08e835e38f29b74146b5ce17e67d556774324a63f8afe16fb57021bfdcb
+ languageName: node
+ linkType: hard
+
"highlight.js@npm:^10.7.1":
version: 10.7.3
resolution: "highlight.js@npm:10.7.3"
@@ -19729,7 +19906,7 @@ __metadata:
languageName: node
linkType: hard
-"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1":
+"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5":
version: 7.0.6
resolution: "https-proxy-agent@npm:7.0.6"
dependencies:
@@ -24166,6 +24343,18 @@ __metadata:
languageName: node
linkType: hard
+"metro-babel-transformer@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-babel-transformer@npm:0.83.3"
+ dependencies:
+ "@babel/core": ^7.25.2
+ flow-enums-runtime: ^0.0.6
+ hermes-parser: 0.32.0
+ nullthrows: ^1.1.1
+ checksum: dd178409d1718dae12dfffb6572ebc5bb78f1e0d7e93dce829c945957f8a686cb1b4c466c69585d7b982b3937fbea28d5c53a80691f2fc66717a0bcc800bc5b8
+ languageName: node
+ linkType: hard
+
"metro-cache-key@npm:0.80.12":
version: 0.80.12
resolution: "metro-cache-key@npm:0.80.12"
@@ -24193,6 +24382,15 @@ __metadata:
languageName: node
linkType: hard
+"metro-cache-key@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-cache-key@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ checksum: a6f9d2bf8b810f57d330d6f8f1ebf029e1224f426c5895f73d9bc1007482684048bfc7513a855626ee7f3ae72ca46e1b08cf983aefbfa84321bb7c0cef4ba4ae
+ languageName: node
+ linkType: hard
+
"metro-cache@npm:0.80.12":
version: 0.80.12
resolution: "metro-cache@npm:0.80.12"
@@ -24226,6 +24424,18 @@ __metadata:
languageName: node
linkType: hard
+"metro-cache@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-cache@npm:0.83.3"
+ dependencies:
+ exponential-backoff: ^3.1.1
+ flow-enums-runtime: ^0.0.6
+ https-proxy-agent: ^7.0.5
+ metro-core: 0.83.3
+ checksum: 95606275411d85de071fd95171a9548406cd1154320850a554bf00207804f7844ed252f9750a802d6612ade839c579b23bd87927ae173f43c368e8f5d900149d
+ languageName: node
+ linkType: hard
+
"metro-config@npm:0.80.12, metro-config@npm:^0.80.3":
version: 0.80.12
resolution: "metro-config@npm:0.80.12"
@@ -24274,6 +24484,22 @@ __metadata:
languageName: node
linkType: hard
+"metro-config@npm:0.83.3, metro-config@npm:^0.83.1":
+ version: 0.83.3
+ resolution: "metro-config@npm:0.83.3"
+ dependencies:
+ connect: ^3.6.5
+ flow-enums-runtime: ^0.0.6
+ jest-validate: ^29.7.0
+ metro: 0.83.3
+ metro-cache: 0.83.3
+ metro-core: 0.83.3
+ metro-runtime: 0.83.3
+ yaml: ^2.6.1
+ checksum: a14b77668a9712abbcebe5bf6a0081f0fd46caf8d37405174f261765abcd44d7a99910533fcc05edde3de10f9b22820cc9910c7dee2b01e761692a0a322f2608
+ languageName: node
+ linkType: hard
+
"metro-core@npm:0.80.12, metro-core@npm:^0.80.3":
version: 0.80.12
resolution: "metro-core@npm:0.80.12"
@@ -24307,6 +24533,17 @@ __metadata:
languageName: node
linkType: hard
+"metro-core@npm:0.83.3, metro-core@npm:^0.83.1":
+ version: 0.83.3
+ resolution: "metro-core@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ lodash.throttle: ^4.1.1
+ metro-resolver: 0.83.3
+ checksum: d06871313310cd718094ecbae805bcacea3f325340f6dff3c5044b62457c4690dd729cdb938349bdd3c41efa6f28032ae07696467ef006d5509fec9045c1966f
+ languageName: node
+ linkType: hard
+
"metro-file-map@npm:0.80.12":
version: 0.80.12
resolution: "metro-file-map@npm:0.80.12"
@@ -24364,6 +24601,23 @@ __metadata:
languageName: node
linkType: hard
+"metro-file-map@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-file-map@npm:0.83.3"
+ dependencies:
+ debug: ^4.4.0
+ fb-watchman: ^2.0.0
+ flow-enums-runtime: ^0.0.6
+ graceful-fs: ^4.2.4
+ invariant: ^2.2.4
+ jest-worker: ^29.7.0
+ micromatch: ^4.0.4
+ nullthrows: ^1.1.1
+ walker: ^1.0.7
+ checksum: 0dea599206e93b6e8628be2aa98452d4dae16e805b810759ec8b50cebcd83f2d053f7e5865196d464f3793f86b3b5003830c6713f91bf62fa406a4af7c93a776
+ languageName: node
+ linkType: hard
+
"metro-minify-terser@npm:0.80.12":
version: 0.80.12
resolution: "metro-minify-terser@npm:0.80.12"
@@ -24394,6 +24648,16 @@ __metadata:
languageName: node
linkType: hard
+"metro-minify-terser@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-minify-terser@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ terser: ^5.15.0
+ checksum: 1de88b70b7c903147807baa46497491a87600594fd0868b6538bbb9d7785242cabfbe8bccf36cc2285d0e17be72445b512d00c496952a159572545f3e6bcb199
+ languageName: node
+ linkType: hard
+
"metro-resolver@npm:0.80.12":
version: 0.80.12
resolution: "metro-resolver@npm:0.80.12"
@@ -24421,6 +24685,15 @@ __metadata:
languageName: node
linkType: hard
+"metro-resolver@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-resolver@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ checksum: de2ae5ced6239b004a97712f98934c6e830870d11614e2dba48250930214581f0746df8a4f0f1cb71060fe21c2cf919d3359106ad4f375c2500ba08e10922896
+ languageName: node
+ linkType: hard
+
"metro-runtime@npm:0.80.12, metro-runtime@npm:^0.80.3":
version: 0.80.12
resolution: "metro-runtime@npm:0.80.12"
@@ -24451,6 +24724,16 @@ __metadata:
languageName: node
linkType: hard
+"metro-runtime@npm:0.83.3, metro-runtime@npm:^0.83.1":
+ version: 0.83.3
+ resolution: "metro-runtime@npm:0.83.3"
+ dependencies:
+ "@babel/runtime": ^7.25.0
+ flow-enums-runtime: ^0.0.6
+ checksum: dcbdc5502020d1e20cee1a3a8019323ab2f3ca2aa2d6ddb2b7a2b8547835a20b84fe4afc23c397f788584e108c70411db93df2f61322b44a4f0f119275052d03
+ languageName: node
+ linkType: hard
+
"metro-source-map@npm:0.80.12, metro-source-map@npm:^0.80.3":
version: 0.80.12
resolution: "metro-source-map@npm:0.80.12"
@@ -24504,6 +24787,24 @@ __metadata:
languageName: node
linkType: hard
+"metro-source-map@npm:0.83.3, metro-source-map@npm:^0.83.1":
+ version: 0.83.3
+ resolution: "metro-source-map@npm:0.83.3"
+ dependencies:
+ "@babel/traverse": ^7.25.3
+ "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3"
+ "@babel/types": ^7.25.2
+ flow-enums-runtime: ^0.0.6
+ invariant: ^2.2.4
+ metro-symbolicate: 0.83.3
+ nullthrows: ^1.1.1
+ ob1: 0.83.3
+ source-map: ^0.5.6
+ vlq: ^1.0.0
+ checksum: 5bf3b7a1561bc1f0ad6ab3b7b550d4b4581da31964a7f218727a3201576912076c909a2e50fba4dd3c649d79312324dec683a37228f4559811c37b69ecca8831
+ languageName: node
+ linkType: hard
+
"metro-symbolicate@npm:0.80.12":
version: 0.80.12
resolution: "metro-symbolicate@npm:0.80.12"
@@ -24553,6 +24854,22 @@ __metadata:
languageName: node
linkType: hard
+"metro-symbolicate@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-symbolicate@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ invariant: ^2.2.4
+ metro-source-map: 0.83.3
+ nullthrows: ^1.1.1
+ source-map: ^0.5.6
+ vlq: ^1.0.0
+ bin:
+ metro-symbolicate: src/index.js
+ checksum: 943cc2456d56ae2ed8369495c18966d91feff636b37909b5225ffb8ce2a50eba8fbedf116f3bea3059d431ebc621c9c9af8a8bfd181b0cd1fece051507e10ffd
+ languageName: node
+ linkType: hard
+
"metro-transform-plugins@npm:0.80.12":
version: 0.80.12
resolution: "metro-transform-plugins@npm:0.80.12"
@@ -24595,6 +24912,20 @@ __metadata:
languageName: node
linkType: hard
+"metro-transform-plugins@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-transform-plugins@npm:0.83.3"
+ dependencies:
+ "@babel/core": ^7.25.2
+ "@babel/generator": ^7.25.0
+ "@babel/template": ^7.25.0
+ "@babel/traverse": ^7.25.3
+ flow-enums-runtime: ^0.0.6
+ nullthrows: ^1.1.1
+ checksum: 6f92b9dfa53bdb63e79038bbd4d68791379ab26cf874679e64563618c578eeed3a828795debf8076ffd518431dff53191990784fb619046bcc03fff114b0cb21
+ languageName: node
+ linkType: hard
+
"metro-transform-worker@npm:0.80.12":
version: 0.80.12
resolution: "metro-transform-worker@npm:0.80.12"
@@ -24658,6 +24989,27 @@ __metadata:
languageName: node
linkType: hard
+"metro-transform-worker@npm:0.83.3":
+ version: 0.83.3
+ resolution: "metro-transform-worker@npm:0.83.3"
+ dependencies:
+ "@babel/core": ^7.25.2
+ "@babel/generator": ^7.25.0
+ "@babel/parser": ^7.25.3
+ "@babel/types": ^7.25.2
+ flow-enums-runtime: ^0.0.6
+ metro: 0.83.3
+ metro-babel-transformer: 0.83.3
+ metro-cache: 0.83.3
+ metro-cache-key: 0.83.3
+ metro-minify-terser: 0.83.3
+ metro-source-map: 0.83.3
+ metro-transform-plugins: 0.83.3
+ nullthrows: ^1.1.1
+ checksum: fcb25ebc1ce703d830ef60c9af87325f996af4c3946325ab957b65ca59d12d181fe6c527c9ba1f932cd954d23a400052293117fe56f9a2727dfbc0a118e7bb27
+ languageName: node
+ linkType: hard
+
"metro@npm:0.80.12, metro@npm:^0.80.3":
version: 0.80.12
resolution: "metro@npm:0.80.12"
@@ -24810,6 +25162,56 @@ __metadata:
languageName: node
linkType: hard
+"metro@npm:0.83.3, metro@npm:^0.83.1":
+ version: 0.83.3
+ resolution: "metro@npm:0.83.3"
+ dependencies:
+ "@babel/code-frame": ^7.24.7
+ "@babel/core": ^7.25.2
+ "@babel/generator": ^7.25.0
+ "@babel/parser": ^7.25.3
+ "@babel/template": ^7.25.0
+ "@babel/traverse": ^7.25.3
+ "@babel/types": ^7.25.2
+ accepts: ^1.3.7
+ chalk: ^4.0.0
+ ci-info: ^2.0.0
+ connect: ^3.6.5
+ debug: ^4.4.0
+ error-stack-parser: ^2.0.6
+ flow-enums-runtime: ^0.0.6
+ graceful-fs: ^4.2.4
+ hermes-parser: 0.32.0
+ image-size: ^1.0.2
+ invariant: ^2.2.4
+ jest-worker: ^29.7.0
+ jsc-safe-url: ^0.2.2
+ lodash.throttle: ^4.1.1
+ metro-babel-transformer: 0.83.3
+ metro-cache: 0.83.3
+ metro-cache-key: 0.83.3
+ metro-config: 0.83.3
+ metro-core: 0.83.3
+ metro-file-map: 0.83.3
+ metro-resolver: 0.83.3
+ metro-runtime: 0.83.3
+ metro-source-map: 0.83.3
+ metro-symbolicate: 0.83.3
+ metro-transform-plugins: 0.83.3
+ metro-transform-worker: 0.83.3
+ mime-types: ^2.1.27
+ nullthrows: ^1.1.1
+ serialize-error: ^2.1.0
+ source-map: ^0.5.6
+ throat: ^5.0.0
+ ws: ^7.5.10
+ yargs: ^17.6.2
+ bin:
+ metro: src/cli.js
+ checksum: 306d8c06b5a1a45e18df6e41f494bbc8b439700985429284eea7b3c3c82108e3c3795d859a8ab3ed7a85793d64e3160519be9aa84c6418d6ed37bd5ae4500b57
+ languageName: node
+ linkType: hard
+
"micromark-core-commonmark@npm:^2.0.0":
version: 2.0.3
resolution: "micromark-core-commonmark@npm:2.0.3"
@@ -26358,6 +26760,15 @@ __metadata:
languageName: node
linkType: hard
+"ob1@npm:0.83.3":
+ version: 0.83.3
+ resolution: "ob1@npm:0.83.3"
+ dependencies:
+ flow-enums-runtime: ^0.0.6
+ checksum: 20dfe91d48d0cadd97159cfd53f5abdca435b55d58b1f562e0687485e8f44f8a95e8ab3c835badd13d0d8c01e3d7b14d639a316aa4bf82841ac78b49611d4e5c
+ languageName: node
+ linkType: hard
+
"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
@@ -29637,6 +30048,16 @@ __metadata:
languageName: node
linkType: hard
+"react-devtools-core@npm:^6.1.5":
+ version: 6.1.5
+ resolution: "react-devtools-core@npm:6.1.5"
+ dependencies:
+ shell-quote: ^1.6.1
+ ws: ^7
+ checksum: b54f2d2416f5f5ca61b1741367865eab18b0040d7e4b3236693595803dfdf82ae02adbcb480acc5b9767748b615a2d5ce3af286cde3a7f8c193123c62c777428
+ languageName: node
+ linkType: hard
+
"react-dom@npm:19.0.0":
version: 19.0.0
resolution: "react-dom@npm:19.0.0"
@@ -30050,6 +30471,25 @@ __metadata:
languageName: node
linkType: hard
+"react-native-web@npm:^0.21.2":
+ version: 0.21.2
+ resolution: "react-native-web@npm:0.21.2"
+ dependencies:
+ "@babel/runtime": ^7.18.6
+ "@react-native/normalize-colors": ^0.74.1
+ fbjs: ^3.0.4
+ inline-style-prefixer: ^7.0.1
+ memoize-one: ^6.0.0
+ nullthrows: ^1.1.1
+ postcss-value-parser: ^4.2.0
+ styleq: ^0.1.3
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ checksum: 3d8be3ee2bae2790949683d8002973882538a49d5182bdda2a38739d44f0a5918bf082427ad062c98b71d3585ab9664c406685ceafe2432bb99877188dc9782d
+ languageName: node
+ linkType: hard
+
"react-native-windows@npm:^0.75.0":
version: 0.75.14
resolution: "react-native-windows@npm:0.75.14"
@@ -30106,6 +30546,57 @@ __metadata:
languageName: node
linkType: hard
+"react-native@npm:*":
+ version: 0.82.1
+ resolution: "react-native@npm:0.82.1"
+ dependencies:
+ "@jest/create-cache-key-function": ^29.7.0
+ "@react-native/assets-registry": 0.82.1
+ "@react-native/codegen": 0.82.1
+ "@react-native/community-cli-plugin": 0.82.1
+ "@react-native/gradle-plugin": 0.82.1
+ "@react-native/js-polyfills": 0.82.1
+ "@react-native/normalize-colors": 0.82.1
+ "@react-native/virtualized-lists": 0.82.1
+ abort-controller: ^3.0.0
+ anser: ^1.4.9
+ ansi-regex: ^5.0.0
+ babel-jest: ^29.7.0
+ babel-plugin-syntax-hermes-parser: 0.32.0
+ base64-js: ^1.5.1
+ commander: ^12.0.0
+ flow-enums-runtime: ^0.0.6
+ glob: ^7.1.1
+ hermes-compiler: 0.0.0
+ invariant: ^2.2.4
+ jest-environment-node: ^29.7.0
+ memoize-one: ^5.0.0
+ metro-runtime: ^0.83.1
+ metro-source-map: ^0.83.1
+ nullthrows: ^1.1.1
+ pretty-format: ^29.7.0
+ promise: ^8.3.0
+ react-devtools-core: ^6.1.5
+ react-refresh: ^0.14.0
+ regenerator-runtime: ^0.13.2
+ scheduler: 0.26.0
+ semver: ^7.1.3
+ stacktrace-parser: ^0.1.10
+ whatwg-fetch: ^3.0.0
+ ws: ^6.2.3
+ yargs: ^17.6.2
+ peerDependencies:
+ "@types/react": ^19.1.1
+ react: ^19.1.1
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ bin:
+ react-native: cli.js
+ checksum: 16c5945aae14bd8d7113d2751ad558d91a0bc8cfbffd8ad588722635aac404b512be5ef0f5953ce62b9808ae7ddcbefac909575bcf7da013d06146ab0d48f29a
+ languageName: node
+ linkType: hard
+
"react-native@npm:0.78.0":
version: 0.78.0
resolution: "react-native@npm:0.78.0"
@@ -31519,7 +32010,7 @@ __metadata:
languageName: node
linkType: hard
-"scheduler@npm:^0.26.0":
+"scheduler@npm:0.26.0, scheduler@npm:^0.26.0":
version: 0.26.0
resolution: "scheduler@npm:0.26.0"
checksum: c63a9f1c0e5089b537231cff6c11f75455b5c8625ae09535c1d7cd0a1b0c77ceecdd9f1074e5e063da5d8dc11e73e8033dcac3361791088be08a6e60c0283ed9
@@ -36359,6 +36850,15 @@ __metadata:
languageName: node
linkType: hard
+"yaml@npm:^2.6.1":
+ version: 2.8.1
+ resolution: "yaml@npm:2.8.1"
+ bin:
+ yaml: bin.mjs
+ checksum: 35b46150d48bc1da2fd5b1521a48a4fa36d68deaabe496f3c3fa9646d5796b6b974f3930a02c4b5aee6c85c860d7d7f79009416724465e835f40b87898c36de4
+ languageName: node
+ linkType: hard
+
"yargs-parser@npm:^18.1.2":
version: 18.1.3
resolution: "yargs-parser@npm:18.1.3"