From c939e2e7a717b188399ab235db740c2215f33807 Mon Sep 17 00:00:00 2001 From: Francesco-Voto Date: Mon, 24 Aug 2026 11:35:54 +0200 Subject: [PATCH 1/4] chore: support rn 0.87 --- .../src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts index 433228f33..bb799eff6 100644 --- a/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts +++ b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts @@ -47,9 +47,9 @@ export class NativeEntryPlugin { : undefined ); - const getReactNativePolyfills: () => string[] = require( - path.join(reactNativePath, 'rn-get-polyfills.js') - ); + const rnGetPolyfillsPath = path.join(reactNativePath, 'rn-get-polyfills.js'); + const getReactNativePolyfills = require(require('node:fs').existsSync(rnGetPolyfillsPath) ? rnGetPolyfillsPath : '@react-native/js-polyfills'); + const initializeCorePath = this.config?.initializeCoreLocation ?? From 9438ca8c268a718ebcbb9fe02a4ea184d0217acb Mon Sep 17 00:00:00 2001 From: Francesco-Voto Date: Tue, 25 Aug 2026 16:51:30 +0200 Subject: [PATCH 2/4] fix: lint --- .../plugins/NativeEntryPlugin/NativeEntryPlugin.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts index bb799eff6..ddbebc7e2 100644 --- a/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts +++ b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts @@ -47,9 +47,15 @@ export class NativeEntryPlugin { : undefined ); - const rnGetPolyfillsPath = path.join(reactNativePath, 'rn-get-polyfills.js'); - const getReactNativePolyfills = require(require('node:fs').existsSync(rnGetPolyfillsPath) ? rnGetPolyfillsPath : '@react-native/js-polyfills'); - + const rnGetPolyfillsPath = path.join( + reactNativePath, + 'rn-get-polyfills.js' + ); + const getReactNativePolyfills = require( + require('node:fs').existsSync(rnGetPolyfillsPath) + ? rnGetPolyfillsPath + : '@react-native/js-polyfills' + ); const initializeCorePath = this.config?.initializeCoreLocation ?? From 527aa348e060f14dccbc9ce2fd2a7b292ba7dd79 Mon Sep 17 00:00:00 2001 From: Francesco-Voto Date: Fri, 11 Sep 2026 10:37:56 +0200 Subject: [PATCH 3/4] chore: add check about what is present in the rn version --- packages/repack/src/loaders/assetsLoader/extractAssets.ts | 7 ++++++- packages/repack/src/modules/IncludeModules.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/repack/src/loaders/assetsLoader/extractAssets.ts b/packages/repack/src/loaders/assetsLoader/extractAssets.ts index f50d91e80..a88d28b0d 100644 --- a/packages/repack/src/loaders/assetsLoader/extractAssets.ts +++ b/packages/repack/src/loaders/assetsLoader/extractAssets.ts @@ -56,7 +56,12 @@ export function extractAssets( ); return dedent` - var AssetRegistry = require('react-native/Libraries/Image/AssetRegistry'); + var AssetRegistry; + try { + AssetRegistry = require('react-native/asset-registry'); + } catch (e) { + AssetRegistry = require('react-native/Libraries/Image/AssetRegistry'); + } module.exports = AssetRegistry.registerAsset({ __packager_asset: true, scales: ${JSON.stringify(scales)}, diff --git a/packages/repack/src/modules/IncludeModules.ts b/packages/repack/src/modules/IncludeModules.ts index 11b0ae9fb..bb9b4745b 100644 --- a/packages/repack/src/modules/IncludeModules.ts +++ b/packages/repack/src/modules/IncludeModules.ts @@ -5,5 +5,10 @@ * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -require.resolve('react-native/Libraries/Image/AssetRegistry'); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + require.resolve('react-native/Libraries/Image/AssetRegistry'); +} catch { + require.resolve('react-native/asset-registry'); +} require.resolve('react-native/Libraries/Image/AssetSourceResolver'); From d47bd38d35556ced750dadcd32bb02e531e0a8ee Mon Sep 17 00:00:00 2001 From: Francesco-Voto Date: Fri, 11 Sep 2026 16:00:35 +0200 Subject: [PATCH 4/4] test: update test --- .../rspack/NativeEntryPlugin.test.ts.snap | 35 ++++++++++++++++--- .../webpack/NativeEntryPlugin.test.ts.snap | 35 ++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/tests/integration/src/plugins/__snapshots__/rspack/NativeEntryPlugin.test.ts.snap b/tests/integration/src/plugins/__snapshots__/rspack/NativeEntryPlugin.test.ts.snap index 410b2ec7b..eb452170e 100644 --- a/tests/integration/src/plugins/__snapshots__/rspack/NativeEntryPlugin.test.ts.snap +++ b/tests/integration/src/plugins/__snapshots__/rspack/NativeEntryPlugin.test.ts.snap @@ -15,7 +15,12 @@ var __webpack_modules__ = ({ * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); }), @@ -767,7 +772,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); }), @@ -967,7 +977,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); }), @@ -1167,7 +1182,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); }), @@ -1409,7 +1429,12 @@ var __webpack_modules__ = ({ * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); }), diff --git a/tests/integration/src/plugins/__snapshots__/webpack/NativeEntryPlugin.test.ts.snap b/tests/integration/src/plugins/__snapshots__/webpack/NativeEntryPlugin.test.ts.snap index 1271284b3..e4855d7c9 100644 --- a/tests/integration/src/plugins/__snapshots__/webpack/NativeEntryPlugin.test.ts.snap +++ b/tests/integration/src/plugins/__snapshots__/webpack/NativeEntryPlugin.test.ts.snap @@ -17,7 +17,12 @@ exports[`NativeEntryPlugin > with Module Federation v1 > should execute polyfill * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /***/ }, @@ -228,7 +233,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /***/ }, @@ -552,7 +562,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /***/ }, @@ -881,7 +896,12 @@ module.exports = globalThis.__MF_EXTERNAL__; * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /***/ }, @@ -1246,7 +1266,12 @@ exports[`NativeEntryPlugin > without Module Federation > should execute polyfill * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. */ -/*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +// react-native/Libraries/Image/AssetRegistry was replaced by react-native/asset-registry in newer versions. +try { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetRegistry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} catch { + /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/asset-registry'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); +} /*require.resolve*/(Object(function webpackMissingModule() { var e = new Error("Cannot find module 'react-native/Libraries/Image/AssetSourceResolver'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /***/ },