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"