diff --git a/packages/repack/src/plugins/NativeEntryPlugin.ts b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts similarity index 77% rename from packages/repack/src/plugins/NativeEntryPlugin.ts rename to packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts index f215fba4f..e8244d00c 100644 --- a/packages/repack/src/plugins/NativeEntryPlugin.ts +++ b/packages/repack/src/plugins/NativeEntryPlugin/NativeEntryPlugin.ts @@ -1,7 +1,8 @@ import path from 'node:path'; import type { ResolveAlias, Compiler as RspackCompiler } from '@rspack/core'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler, moveElementBefore } from '../helpers/index.js'; +import { isRspackCompiler, moveElementBefore } from '../../helpers/index.js'; +import { makePolyfillsRuntimeModule } from './PolyfillsRuntimeModule.js'; export interface NativeEntryPluginConfig { /** @@ -55,18 +56,35 @@ export class NativeEntryPlugin { path.join(reactNativePath, 'Libraries/Core/InitializeCore.js'); const initializeScriptManagerPath = require.resolve( - '../modules/InitializeScriptManager.js' + '../../modules/InitializeScriptManager.js' ); - const includeModulesPath = require.resolve('../modules/IncludeModules.js'); + const includeModulesPath = require.resolve( + '../../modules/IncludeModules.js' + ); + + const polyfillPaths = getReactNativePolyfills(); const nativeEntries = [ - ...getReactNativePolyfills(), initializeCorePath, initializeScriptManagerPath, includeModulesPath, ]; + // Add polyfills as runtime modules so they execute before the startup function. + // This ensures polyfills run before Module Federation's embed_federation_runtime wrapper. + compiler.hooks.compilation.tap('RepackNativeEntryPlugin', (compilation) => { + compilation.hooks.additionalTreeRuntimeRequirements.tap( + 'RepackNativeEntryPlugin', + (chunk) => { + compilation.addRuntimeModule( + chunk, + makePolyfillsRuntimeModule(compiler, { polyfillPaths }) + ); + } + ); + }); + compiler.hooks.entryOption.tap( { name: 'RepackNativeEntryPlugin', before: 'RepackDevelopmentPlugin' }, (_, entry) => { @@ -76,14 +94,12 @@ export class NativeEntryPlugin { ); } + // add native entries to each declared entry point Object.keys(entry).forEach((entryName) => { - // runtime property defines the chunk name, otherwise it defaults to the entry key const entryChunkName = entry[entryName].runtime || entryName; - - // add native entries to all declared entry points for (const nativeEntry of nativeEntries) { new compiler.webpack.EntryPlugin(compiler.context, nativeEntry, { - name: entryChunkName, // prepends the entry to the chunk of specified name + name: entryChunkName, }).apply(compiler); } }); diff --git a/packages/repack/src/plugins/NativeEntryPlugin/PolyfillsRuntimeModule.ts b/packages/repack/src/plugins/NativeEntryPlugin/PolyfillsRuntimeModule.ts new file mode 100644 index 000000000..429360648 --- /dev/null +++ b/packages/repack/src/plugins/NativeEntryPlugin/PolyfillsRuntimeModule.ts @@ -0,0 +1,45 @@ +import fs from 'node:fs'; +import type { + Compiler, + RuntimeModule as RuntimeModuleType, +} from '@rspack/core'; + +interface PolyfillsRuntimeModuleConfig { + polyfillPaths: string[]; +} + +/** + * Creates a runtime module that inlines React Native polyfills. + * Runtime modules are executed before the startup function (__webpack_require__.x), + * which means they run before Module Federation's embed_federation_runtime wrapper. + */ +export const makePolyfillsRuntimeModule = ( + compiler: Compiler, + moduleConfig: PolyfillsRuntimeModuleConfig +): RuntimeModuleType => { + const Template = compiler.webpack.Template; + const RuntimeModule = compiler.webpack.RuntimeModule; + + const PolyfillsRuntimeModule = class extends RuntimeModule { + constructor(private config: PolyfillsRuntimeModuleConfig) { + // Use STAGE_BASIC to ensure polyfills run early among runtime modules + super('repack/polyfills', RuntimeModule.STAGE_BASIC); + } + + generate() { + const polyfillCode = this.config.polyfillPaths.map((polyfillPath) => { + const content = fs.readFileSync(polyfillPath, 'utf-8'); + return Template.asString([ + `// Polyfill: ${polyfillPath.split('/').pop()}`, + '(function() {', + Template.indent(content), + '})();', + ]); + }); + + return Template.asString(polyfillCode); + } + }; + + return new PolyfillsRuntimeModule(moduleConfig); +}; diff --git a/packages/repack/src/plugins/NativeEntryPlugin/index.ts b/packages/repack/src/plugins/NativeEntryPlugin/index.ts new file mode 100644 index 000000000..52b9bf882 --- /dev/null +++ b/packages/repack/src/plugins/NativeEntryPlugin/index.ts @@ -0,0 +1,2 @@ +export { NativeEntryPlugin } from './NativeEntryPlugin.js'; +export type { NativeEntryPluginConfig } from './NativeEntryPlugin.js'; diff --git a/packages/repack/src/plugins/RepackPlugin.ts b/packages/repack/src/plugins/RepackPlugin.ts index bcd6b6ea9..9d6c7db00 100644 --- a/packages/repack/src/plugins/RepackPlugin.ts +++ b/packages/repack/src/plugins/RepackPlugin.ts @@ -3,7 +3,7 @@ import type { Compiler as WebpackCompiler } from 'webpack'; import { BabelPlugin } from './BabelPlugin.js'; import { DevelopmentPlugin } from './DevelopmentPlugin.js'; import { LoggerPlugin, type LoggerPluginConfig } from './LoggerPlugin.js'; -import { NativeEntryPlugin } from './NativeEntryPlugin.js'; +import { NativeEntryPlugin } from './NativeEntryPlugin/index.js'; import { OutputPlugin, type OutputPluginConfig } from './OutputPlugin/index.js'; import { RepackTargetPlugin } from './RepackTargetPlugin/index.js'; import { SourceMapPlugin } from './SourceMapPlugin.js'; diff --git a/packages/repack/src/plugins/__tests__/NativeEntryPlugin.test.ts b/packages/repack/src/plugins/__tests__/NativeEntryPlugin.test.ts new file mode 100644 index 000000000..662bfe4b4 --- /dev/null +++ b/packages/repack/src/plugins/__tests__/NativeEntryPlugin.test.ts @@ -0,0 +1,139 @@ +import path from 'node:path'; +import { + type RspackPluginInstance, + type StatsModule, + rspack, +} from '@rspack/core'; +import memfs from 'memfs'; +import { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module'; +import { ModuleFederationPluginV2 } from '../ModuleFederationPluginV2.js'; +import { NativeEntryPlugin } from '../NativeEntryPlugin/index.js'; + +const FIXTURES_PATH = path.join(__dirname, '__fixtures__'); +const REACT_NATIVE_PATH = path.join(FIXTURES_PATH, 'react-native'); + +interface CompileBundleOptions { + extraAliases?: Record; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + externals?: any; +} + +async function compileBundle( + entry: Record, + virtualModules: Record, + extraPlugins: RspackPluginInstance[] = [], + options: CompileBundleOptions = {} +) { + const compiler = rspack({ + context: __dirname, + mode: 'development', + devtool: false, + entry, + output: { + path: '/out', + filename: '[name].js', + }, + resolve: { + alias: { + 'react-native': REACT_NATIVE_PATH, + ...options.extraAliases, + }, + }, + externals: options.externals, + plugins: [ + new NativeEntryPlugin({}), + ...extraPlugins, + new RspackVirtualModulePlugin({ + ...virtualModules, + }), + ], + }); + + const volume = new memfs.Volume(); + const fileSystem = memfs.createFsFromVolume(volume); + // @ts-expect-error memfs is compatible enough + compiler.outputFileSystem = fileSystem; + + return new Promise<{ + code: string; + fileSystem: typeof memfs.fs; + volume: typeof memfs.vol; + modules: StatsModule[]; + }>((resolve, reject) => + compiler.run((error, stats) => { + if (error) { + reject(error); + } else { + const statsJson = stats?.toJson({ modules: true }); + resolve({ + code: fileSystem.readFileSync('/out/main.js', 'utf-8') as string, + fileSystem, + volume, + modules: statsJson?.modules ?? [], + }); + } + }) + ); +} + +describe('NativeEntryPlugin', () => { + it('should add polyfills as runtime modules that execute before MF v2 federation runtime', async () => { + const { code } = await compileBundle( + { main: { import: ['./index.js'] } }, + { + './index.js': 'globalThis.__APP_ENTRY__ = true;', + './App.js': 'export default globalThis.__FEDERATED_EXPORT__ = true;', + }, + [ + new ModuleFederationPluginV2({ + name: 'testContainer', + exposes: { + './App': './App.js', + }, + shared: { + react: { singleton: true, eager: true }, + 'react-native': { singleton: true, eager: true }, + }, + // Disable default runtime plugins to simplify test + defaultRuntimePlugins: [], + }), + ], + { + externals: ( + { request, context }: { request?: string; context?: string }, + callback: (err: Error | null, result?: string) => void + ) => { + // Externalize all @module-federation packages and their internal paths + if ( + request?.includes('@module-federation') || + context?.includes('@module-federation') || + request?.includes('isomorphic-rslog') + ) { + return callback(null, 'globalThis.__MF_EXTERNAL__'); + } + callback(null); + }, + } + ); + + expect(code).toMatchSnapshot('mf-v2'); + + // MF v2 uses embed_federation_runtime which wraps the startup function + expect(code).toContain('embed_federation_runtime'); + + // Polyfills are now runtime modules (webpack/runtime/repack/polyfills) + // Runtime modules execute BEFORE __webpack_require__.x() (the startup function) + // This means polyfills run before MF v2's embed_federation_runtime wrapper + expect(code).toContain('webpack/runtime/repack/polyfills'); + + // Verify polyfills are in the runtime section (before startup execution) + const polyfillsRuntimePos = code.indexOf( + 'webpack/runtime/repack/polyfills' + ); + const startupExecutionPos = code.indexOf('__webpack_require__.x()'); + + expect(polyfillsRuntimePos).toBeGreaterThan(-1); + expect(startupExecutionPos).toBeGreaterThan(-1); + expect(polyfillsRuntimePos).toBeLessThan(startupExecutionPos); + }); +}); diff --git a/packages/repack/src/plugins/__tests__/__fixtures__/react-native/Libraries/Core/InitializeCore.js b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/Libraries/Core/InitializeCore.js new file mode 100644 index 000000000..bef2b86e8 --- /dev/null +++ b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/Libraries/Core/InitializeCore.js @@ -0,0 +1 @@ +globalThis.__INITIALIZE_CORE__ = true; diff --git a/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill1.js b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill1.js new file mode 100644 index 000000000..d7bc5c956 --- /dev/null +++ b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill1.js @@ -0,0 +1 @@ +globalThis.__POLYFILL_1__ = true; diff --git a/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill2.js b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill2.js new file mode 100644 index 000000000..6da8082bc --- /dev/null +++ b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/polyfill2.js @@ -0,0 +1 @@ +globalThis.__POLYFILL_2__ = true; diff --git a/packages/repack/src/plugins/__tests__/__fixtures__/react-native/rn-get-polyfills.js b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/rn-get-polyfills.js new file mode 100644 index 000000000..62c3a6a78 --- /dev/null +++ b/packages/repack/src/plugins/__tests__/__fixtures__/react-native/rn-get-polyfills.js @@ -0,0 +1,8 @@ +const path = require('node:path'); + +module.exports = function getPolyfills() { + return [ + path.join(__dirname, 'polyfill1.js'), + path.join(__dirname, 'polyfill2.js'), + ]; +}; diff --git a/packages/repack/src/plugins/__tests__/__snapshots__/NativeEntryPlugin.test.ts.snap b/packages/repack/src/plugins/__tests__/__snapshots__/NativeEntryPlugin.test.ts.snap new file mode 100644 index 000000000..08265547b --- /dev/null +++ b/packages/repack/src/plugins/__tests__/__snapshots__/NativeEntryPlugin.test.ts.snap @@ -0,0 +1,191 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NativeEntryPlugin should add polyfills as runtime modules that execute before MF v2 federation runtime: mf-v2 1`] = ` +"(() => { // webpackBootstrap +var __webpack_modules__ = ({ +"../../modules/IncludeModules.ts": +/*!***************************************!*\\ + !*** ../../modules/IncludeModules.ts ***! + \\***************************************/ +(function () { +/* + * This module is added as an entry module to prevent stripping of these React Native deep imports from the bundle. + * We use require.resolve from Rspack/Webpack to ensure these modules are included even if not directly used. + * This allows us to include the modules into the bundle without evaluating them. + * These modules are required by assetsLoader and should be shared as deep imports when using ModuleFederation. + */ + +/*require.resolve*/(/*! react-native/Libraries/Image/AssetRegistry */ "webpack/sharing/consume/default/react-native/Libraries/Image/AssetRegistry"); +/*require.resolve*/(/*! react-native/Libraries/Image/AssetSourceResolver */ "webpack/sharing/consume/default/react-native/Libraries/Image/AssetSourceResolver"); + + +}), +"../../modules/InitializeScriptManager.ts": +/*!************************************************!*\\ + !*** ../../modules/InitializeScriptManager.ts ***! + \\************************************************/ +(function (__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +Object(function webpackMissingModule() { var e = new Error("Cannot find module './ScriptManager/ScriptManager.js'"); e.code = 'MODULE_NOT_FOUND'; throw e; }()); + + +Object(function webpackMissingModule() { var e = new Error("Cannot find module './ScriptManager/ScriptManager.js'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())(); + + +}), +"@module-federation/runtime/rspack.js!=!data:text/javascript,import __module_federation_bundler_runtime__ from \\"/Users/jbroma/Developer/repack/node_modules/.pnpm/@module-federation+webpack-bundler-runtime@0.8.9/node_modules/@module-federation/webpack-bundler-runtime/dist/index.cjs.js\\";const __module_federation_runtime_plugins__ = [];const __module_federation_remote_infos__ = {};const __module_federation_container_name__ = \\"testContainer\\";const __module_federation_share_strategy__ = \\"loaded-first\\";if((__webpack_require__.initializeSharingData||__webpack_require__.initializeExposesData)&&__webpack_require__.federation){var __webpack_require___remotesLoadingData,__webpack_require___remotesLoadingData1,__webpack_require___initializeSharingData,__webpack_require___consumesLoadingData,__webpack_require___consumesLoadingData1,__webpack_require___initializeExposesData,__webpack_require___consumesLoadingData2;const override=(obj,key,value)=>{if(!obj)return;if(obj[key])obj[key]=value};const merge=(obj,key,fn)=>{const value=fn();if(Array.isArray(value)){var _obj,_key;var _;(_=(_obj=obj)[_key=key])!==null&&_!==void 0?_:_obj[_key]=[];obj[key].push(...value)}else if(typeof value===\\"object\\"&&value!==null){var _obj1,_key1;var _1;(_1=(_obj1=obj)[_key1=key])!==null&&_1!==void 0?_1:_obj1[_key1]={};Object.assign(obj[key],value)}};const early=(obj,key,initial)=>{var _obj,_key;var _;(_=(_obj=obj)[_key=key])!==null&&_!==void 0?_:_obj[_key]=initial()};var __webpack_require___remotesLoadingData_chunkMapping;const remotesLoadingChunkMapping=(__webpack_require___remotesLoadingData_chunkMapping=(__webpack_require___remotesLoadingData=__webpack_require__.remotesLoadingData)===null||__webpack_require___remotesLoadingData===void 0?void 0:__webpack_require___remotesLoadingData.chunkMapping)!==null&&__webpack_require___remotesLoadingData_chunkMapping!==void 0?__webpack_require___remotesLoadingData_chunkMapping:{};var __webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping;const remotesLoadingModuleIdToRemoteDataMapping=(__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping=(__webpack_require___remotesLoadingData1=__webpack_require__.remotesLoadingData)===null||__webpack_require___remotesLoadingData1===void 0?void 0:__webpack_require___remotesLoadingData1.moduleIdToRemoteDataMapping)!==null&&__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping!==void 0?__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping:{};var __webpack_require___initializeSharingData_scopeToSharingDataMapping;const initializeSharingScopeToInitDataMapping=(__webpack_require___initializeSharingData_scopeToSharingDataMapping=(__webpack_require___initializeSharingData=__webpack_require__.initializeSharingData)===null||__webpack_require___initializeSharingData===void 0?void 0:__webpack_require___initializeSharingData.scopeToSharingDataMapping)!==null&&__webpack_require___initializeSharingData_scopeToSharingDataMapping!==void 0?__webpack_require___initializeSharingData_scopeToSharingDataMapping:{};var __webpack_require___consumesLoadingData_chunkMapping;const consumesLoadingChunkMapping=(__webpack_require___consumesLoadingData_chunkMapping=(__webpack_require___consumesLoadingData=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData===void 0?void 0:__webpack_require___consumesLoadingData.chunkMapping)!==null&&__webpack_require___consumesLoadingData_chunkMapping!==void 0?__webpack_require___consumesLoadingData_chunkMapping:{};var __webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping;const consumesLoadingModuleToConsumeDataMapping=(__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping=(__webpack_require___consumesLoadingData1=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData1===void 0?void 0:__webpack_require___consumesLoadingData1.moduleIdToConsumeDataMapping)!==null&&__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping!==void 0?__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping:{};const consumesLoadinginstalledModules={};const initializeSharingInitPromises=[];const initializeSharingInitTokens={};const containerShareScope=(__webpack_require___initializeExposesData=__webpack_require__.initializeExposesData)===null||__webpack_require___initializeExposesData===void 0?void 0:__webpack_require___initializeExposesData.shareScope;for(const key in __module_federation_bundler_runtime__){__webpack_require__.federation[key]=__module_federation_bundler_runtime__[key]}early(__webpack_require__.federation,\\"consumesLoadingModuleToHandlerMapping\\",()=>{const consumesLoadingModuleToHandlerMapping={};for(let[moduleId,data]of Object.entries(consumesLoadingModuleToConsumeDataMapping)){consumesLoadingModuleToHandlerMapping[moduleId]={getter:data.fallback,shareInfo:{shareConfig:{fixedDependencies:false,requiredVersion:data.requiredVersion,strictVersion:data.strictVersion,singleton:data.singleton,eager:data.eager},scope:[data.shareScope]},shareKey:data.shareKey}}return consumesLoadingModuleToHandlerMapping});early(__webpack_require__.federation,\\"initOptions\\",()=>({}));early(__webpack_require__.federation.initOptions,\\"name\\",()=>__module_federation_container_name__);early(__webpack_require__.federation.initOptions,\\"shareStrategy\\",()=>__module_federation_share_strategy__);early(__webpack_require__.federation.initOptions,\\"shared\\",()=>{const shared={};for(let[scope,stages]of Object.entries(initializeSharingScopeToInitDataMapping)){for(let stage of stages){if(typeof stage===\\"object\\"&&stage!==null){const{name,version,factory,eager,singleton,requiredVersion,strictVersion}=stage;const shareConfig={};const isValidValue=function(val){return typeof val!==\\"undefined\\"};if(isValidValue(singleton)){shareConfig.singleton=singleton}if(isValidValue(requiredVersion)){shareConfig.requiredVersion=requiredVersion}if(isValidValue(eager)){shareConfig.eager=eager}if(isValidValue(strictVersion)){shareConfig.strictVersion=strictVersion}const options={version,scope:[scope],shareConfig,get:factory};if(shared[name]){shared[name].push(options)}else{shared[name]=[options]}}}}return shared});merge(__webpack_require__.federation.initOptions,\\"remotes\\",()=>Object.values(__module_federation_remote_infos__).flat().filter(remote=>remote.externalType===\\"script\\"));merge(__webpack_require__.federation.initOptions,\\"plugins\\",()=>__module_federation_runtime_plugins__);early(__webpack_require__.federation,\\"bundlerRuntimeOptions\\",()=>({}));early(__webpack_require__.federation.bundlerRuntimeOptions,\\"remotes\\",()=>({}));early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"chunkMapping\\",()=>remotesLoadingChunkMapping);early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"remoteInfos\\",()=>__module_federation_remote_infos__);early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"idToExternalAndNameMapping\\",()=>{const remotesLoadingIdToExternalAndNameMappingMapping={};for(let[moduleId,data]of Object.entries(remotesLoadingModuleIdToRemoteDataMapping)){remotesLoadingIdToExternalAndNameMappingMapping[moduleId]=[data.shareScope,data.name,data.externalModuleId,data.remoteName]}return remotesLoadingIdToExternalAndNameMappingMapping});early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"webpackRequire\\",()=>__webpack_require__);merge(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"idToRemoteMap\\",()=>{const idToRemoteMap={};for(let[id,remoteData]of Object.entries(remotesLoadingModuleIdToRemoteDataMapping)){const info=__module_federation_remote_infos__[remoteData.remoteName];if(info)idToRemoteMap[id]=info}return idToRemoteMap});override(__webpack_require__,\\"S\\",__webpack_require__.federation.bundlerRuntime.S);if(__webpack_require__.federation.attachShareScopeMap){__webpack_require__.federation.attachShareScopeMap(__webpack_require__)}override(__webpack_require__.f,\\"remotes\\",(chunkId,promises)=>__webpack_require__.federation.bundlerRuntime.remotes({chunkId,promises,chunkMapping:remotesLoadingChunkMapping,idToExternalAndNameMapping:__webpack_require__.federation.bundlerRuntimeOptions.remotes.idToExternalAndNameMapping,idToRemoteMap:__webpack_require__.federation.bundlerRuntimeOptions.remotes.idToRemoteMap,webpackRequire:__webpack_require__}));override(__webpack_require__.f,\\"consumes\\",(chunkId,promises)=>__webpack_require__.federation.bundlerRuntime.consumes({chunkId,promises,chunkMapping:consumesLoadingChunkMapping,moduleToHandlerMapping:__webpack_require__.federation.consumesLoadingModuleToHandlerMapping,installedModules:consumesLoadinginstalledModules,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"I\\",(name,initScope)=>__webpack_require__.federation.bundlerRuntime.I({shareScopeName:name,initScope,initPromises:initializeSharingInitPromises,initTokens:initializeSharingInitTokens,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"initContainer\\",(shareScope,initScope,remoteEntryInitOptions)=>__webpack_require__.federation.bundlerRuntime.initContainerEntry({shareScope,initScope,remoteEntryInitOptions,shareScopeKey:containerShareScope,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"getContainer\\",(module1,getScope)=>{var moduleMap=__webpack_require__.initializeExposesData.moduleMap;__webpack_require__.R=getScope;getScope=Object.prototype.hasOwnProperty.call(moduleMap,module1)?moduleMap[module1]():Promise.resolve().then(()=>{throw new Error('Module \\"'+module1+'\\" does not exist in container.')});__webpack_require__.R=undefined;return getScope});__webpack_require__.federation.instance=__webpack_require__.federation.runtime.init(__webpack_require__.federation.initOptions);if((__webpack_require___consumesLoadingData2=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData2===void 0?void 0:__webpack_require___consumesLoadingData2.initialConsumes){__webpack_require__.federation.bundlerRuntime.installInitialConsumes({webpackRequire:__webpack_require__,installedModules:consumesLoadinginstalledModules,initialConsumes:__webpack_require__.consumesLoadingData.initialConsumes,moduleToHandlerMapping:__webpack_require__.federation.consumesLoadingModuleToHandlerMapping})}}": +/*!*********************************************!*\\ + !*** external "globalThis.__MF_EXTERNAL__" ***! + \\*********************************************/ +(function (module) { +"use strict"; +module.exports = globalThis.__MF_EXTERNAL__; + +}), +"../../../node_modules/rspack-virtual-module-d092e06c/index.js": +/*!*********************************************************************!*\\ + !*** ../../../node_modules/rspack-virtual-module-d092e06c/index.js ***! + \\*********************************************************************/ +(function () { +globalThis.__APP_ENTRY__ = true; + +}), +"./__fixtures__/react-native/Libraries/Core/InitializeCore.js": +/*!********************************************************************!*\\ + !*** ./__fixtures__/react-native/Libraries/Core/InitializeCore.js ***! + \\********************************************************************/ +(function () { +globalThis.__INITIALIZE_CORE__ = true; + + +}), + +}); +/************************************************************************/ +// The module cache +var __webpack_module_cache__ = {}; + +// The require function +function __webpack_require__(moduleId) { + +// Check if module is in cache +var cachedModule = __webpack_module_cache__[moduleId]; +if (cachedModule !== undefined) { +return cachedModule.exports; +} +// Create a new module (and put it into the cache) +var module = (__webpack_module_cache__[moduleId] = { +exports: {} +}); +// Execute the module function +__webpack_modules__[moduleId](module, module.exports, __webpack_require__); + +// Return the exports of the module +return module.exports; + +} + +// expose the modules object (__webpack_modules__) +__webpack_require__.m = __webpack_modules__; + +// expose the module cache +__webpack_require__.c = __webpack_module_cache__; + +// the startup function +__webpack_require__.x = () => { +// Load entry module and return exports +__webpack_require__("./__fixtures__/react-native/Libraries/Core/InitializeCore.js"); +__webpack_require__("../../modules/InitializeScriptManager.ts"); +__webpack_require__("../../modules/IncludeModules.ts"); +var __webpack_exports__ = __webpack_require__("../../../node_modules/rspack-virtual-module-d092e06c/index.js"); +return __webpack_exports__ +}; + +/************************************************************************/ +// module_federation/runtime +(() => { + +if(!__webpack_require__.federation){ + __webpack_require__.federation = { + +chunkMatcher: function(chunkId) { + return true; +}, +rootOutputDir: "", + + }; +} + +})(); +// webpack/runtime/embed_federation_runtime +(() => { +var prevStartup = __webpack_require__.x; +var hasRun = false; +__webpack_require__.x = function() { + if (!hasRun) { + hasRun = true; + __webpack_require__("@module-federation/runtime/rspack.js!=!data:text/javascript,import __module_federation_bundler_runtime__ from \\"/Users/jbroma/Developer/repack/node_modules/.pnpm/@module-federation+webpack-bundler-runtime@0.8.9/node_modules/@module-federation/webpack-bundler-runtime/dist/index.cjs.js\\";const __module_federation_runtime_plugins__ = [];const __module_federation_remote_infos__ = {};const __module_federation_container_name__ = \\"testContainer\\";const __module_federation_share_strategy__ = \\"loaded-first\\";if((__webpack_require__.initializeSharingData||__webpack_require__.initializeExposesData)&&__webpack_require__.federation){var __webpack_require___remotesLoadingData,__webpack_require___remotesLoadingData1,__webpack_require___initializeSharingData,__webpack_require___consumesLoadingData,__webpack_require___consumesLoadingData1,__webpack_require___initializeExposesData,__webpack_require___consumesLoadingData2;const override=(obj,key,value)=>{if(!obj)return;if(obj[key])obj[key]=value};const merge=(obj,key,fn)=>{const value=fn();if(Array.isArray(value)){var _obj,_key;var _;(_=(_obj=obj)[_key=key])!==null&&_!==void 0?_:_obj[_key]=[];obj[key].push(...value)}else if(typeof value===\\"object\\"&&value!==null){var _obj1,_key1;var _1;(_1=(_obj1=obj)[_key1=key])!==null&&_1!==void 0?_1:_obj1[_key1]={};Object.assign(obj[key],value)}};const early=(obj,key,initial)=>{var _obj,_key;var _;(_=(_obj=obj)[_key=key])!==null&&_!==void 0?_:_obj[_key]=initial()};var __webpack_require___remotesLoadingData_chunkMapping;const remotesLoadingChunkMapping=(__webpack_require___remotesLoadingData_chunkMapping=(__webpack_require___remotesLoadingData=__webpack_require__.remotesLoadingData)===null||__webpack_require___remotesLoadingData===void 0?void 0:__webpack_require___remotesLoadingData.chunkMapping)!==null&&__webpack_require___remotesLoadingData_chunkMapping!==void 0?__webpack_require___remotesLoadingData_chunkMapping:{};var __webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping;const remotesLoadingModuleIdToRemoteDataMapping=(__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping=(__webpack_require___remotesLoadingData1=__webpack_require__.remotesLoadingData)===null||__webpack_require___remotesLoadingData1===void 0?void 0:__webpack_require___remotesLoadingData1.moduleIdToRemoteDataMapping)!==null&&__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping!==void 0?__webpack_require___remotesLoadingData_moduleIdToRemoteDataMapping:{};var __webpack_require___initializeSharingData_scopeToSharingDataMapping;const initializeSharingScopeToInitDataMapping=(__webpack_require___initializeSharingData_scopeToSharingDataMapping=(__webpack_require___initializeSharingData=__webpack_require__.initializeSharingData)===null||__webpack_require___initializeSharingData===void 0?void 0:__webpack_require___initializeSharingData.scopeToSharingDataMapping)!==null&&__webpack_require___initializeSharingData_scopeToSharingDataMapping!==void 0?__webpack_require___initializeSharingData_scopeToSharingDataMapping:{};var __webpack_require___consumesLoadingData_chunkMapping;const consumesLoadingChunkMapping=(__webpack_require___consumesLoadingData_chunkMapping=(__webpack_require___consumesLoadingData=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData===void 0?void 0:__webpack_require___consumesLoadingData.chunkMapping)!==null&&__webpack_require___consumesLoadingData_chunkMapping!==void 0?__webpack_require___consumesLoadingData_chunkMapping:{};var __webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping;const consumesLoadingModuleToConsumeDataMapping=(__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping=(__webpack_require___consumesLoadingData1=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData1===void 0?void 0:__webpack_require___consumesLoadingData1.moduleIdToConsumeDataMapping)!==null&&__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping!==void 0?__webpack_require___consumesLoadingData_moduleIdToConsumeDataMapping:{};const consumesLoadinginstalledModules={};const initializeSharingInitPromises=[];const initializeSharingInitTokens={};const containerShareScope=(__webpack_require___initializeExposesData=__webpack_require__.initializeExposesData)===null||__webpack_require___initializeExposesData===void 0?void 0:__webpack_require___initializeExposesData.shareScope;for(const key in __module_federation_bundler_runtime__){__webpack_require__.federation[key]=__module_federation_bundler_runtime__[key]}early(__webpack_require__.federation,\\"consumesLoadingModuleToHandlerMapping\\",()=>{const consumesLoadingModuleToHandlerMapping={};for(let[moduleId,data]of Object.entries(consumesLoadingModuleToConsumeDataMapping)){consumesLoadingModuleToHandlerMapping[moduleId]={getter:data.fallback,shareInfo:{shareConfig:{fixedDependencies:false,requiredVersion:data.requiredVersion,strictVersion:data.strictVersion,singleton:data.singleton,eager:data.eager},scope:[data.shareScope]},shareKey:data.shareKey}}return consumesLoadingModuleToHandlerMapping});early(__webpack_require__.federation,\\"initOptions\\",()=>({}));early(__webpack_require__.federation.initOptions,\\"name\\",()=>__module_federation_container_name__);early(__webpack_require__.federation.initOptions,\\"shareStrategy\\",()=>__module_federation_share_strategy__);early(__webpack_require__.federation.initOptions,\\"shared\\",()=>{const shared={};for(let[scope,stages]of Object.entries(initializeSharingScopeToInitDataMapping)){for(let stage of stages){if(typeof stage===\\"object\\"&&stage!==null){const{name,version,factory,eager,singleton,requiredVersion,strictVersion}=stage;const shareConfig={};const isValidValue=function(val){return typeof val!==\\"undefined\\"};if(isValidValue(singleton)){shareConfig.singleton=singleton}if(isValidValue(requiredVersion)){shareConfig.requiredVersion=requiredVersion}if(isValidValue(eager)){shareConfig.eager=eager}if(isValidValue(strictVersion)){shareConfig.strictVersion=strictVersion}const options={version,scope:[scope],shareConfig,get:factory};if(shared[name]){shared[name].push(options)}else{shared[name]=[options]}}}}return shared});merge(__webpack_require__.federation.initOptions,\\"remotes\\",()=>Object.values(__module_federation_remote_infos__).flat().filter(remote=>remote.externalType===\\"script\\"));merge(__webpack_require__.federation.initOptions,\\"plugins\\",()=>__module_federation_runtime_plugins__);early(__webpack_require__.federation,\\"bundlerRuntimeOptions\\",()=>({}));early(__webpack_require__.federation.bundlerRuntimeOptions,\\"remotes\\",()=>({}));early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"chunkMapping\\",()=>remotesLoadingChunkMapping);early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"remoteInfos\\",()=>__module_federation_remote_infos__);early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"idToExternalAndNameMapping\\",()=>{const remotesLoadingIdToExternalAndNameMappingMapping={};for(let[moduleId,data]of Object.entries(remotesLoadingModuleIdToRemoteDataMapping)){remotesLoadingIdToExternalAndNameMappingMapping[moduleId]=[data.shareScope,data.name,data.externalModuleId,data.remoteName]}return remotesLoadingIdToExternalAndNameMappingMapping});early(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"webpackRequire\\",()=>__webpack_require__);merge(__webpack_require__.federation.bundlerRuntimeOptions.remotes,\\"idToRemoteMap\\",()=>{const idToRemoteMap={};for(let[id,remoteData]of Object.entries(remotesLoadingModuleIdToRemoteDataMapping)){const info=__module_federation_remote_infos__[remoteData.remoteName];if(info)idToRemoteMap[id]=info}return idToRemoteMap});override(__webpack_require__,\\"S\\",__webpack_require__.federation.bundlerRuntime.S);if(__webpack_require__.federation.attachShareScopeMap){__webpack_require__.federation.attachShareScopeMap(__webpack_require__)}override(__webpack_require__.f,\\"remotes\\",(chunkId,promises)=>__webpack_require__.federation.bundlerRuntime.remotes({chunkId,promises,chunkMapping:remotesLoadingChunkMapping,idToExternalAndNameMapping:__webpack_require__.federation.bundlerRuntimeOptions.remotes.idToExternalAndNameMapping,idToRemoteMap:__webpack_require__.federation.bundlerRuntimeOptions.remotes.idToRemoteMap,webpackRequire:__webpack_require__}));override(__webpack_require__.f,\\"consumes\\",(chunkId,promises)=>__webpack_require__.federation.bundlerRuntime.consumes({chunkId,promises,chunkMapping:consumesLoadingChunkMapping,moduleToHandlerMapping:__webpack_require__.federation.consumesLoadingModuleToHandlerMapping,installedModules:consumesLoadinginstalledModules,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"I\\",(name,initScope)=>__webpack_require__.federation.bundlerRuntime.I({shareScopeName:name,initScope,initPromises:initializeSharingInitPromises,initTokens:initializeSharingInitTokens,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"initContainer\\",(shareScope,initScope,remoteEntryInitOptions)=>__webpack_require__.federation.bundlerRuntime.initContainerEntry({shareScope,initScope,remoteEntryInitOptions,shareScopeKey:containerShareScope,webpackRequire:__webpack_require__}));override(__webpack_require__,\\"getContainer\\",(module1,getScope)=>{var moduleMap=__webpack_require__.initializeExposesData.moduleMap;__webpack_require__.R=getScope;getScope=Object.prototype.hasOwnProperty.call(moduleMap,module1)?moduleMap[module1]():Promise.resolve().then(()=>{throw new Error('Module \\"'+module1+'\\" does not exist in container.')});__webpack_require__.R=undefined;return getScope});__webpack_require__.federation.instance=__webpack_require__.federation.runtime.init(__webpack_require__.federation.initOptions);if((__webpack_require___consumesLoadingData2=__webpack_require__.consumesLoadingData)===null||__webpack_require___consumesLoadingData2===void 0?void 0:__webpack_require___consumesLoadingData2.initialConsumes){__webpack_require__.federation.bundlerRuntime.installInitialConsumes({webpackRequire:__webpack_require__,installedModules:consumesLoadinginstalledModules,initialConsumes:__webpack_require__.consumesLoadingData.initialConsumes,moduleToHandlerMapping:__webpack_require__.federation.consumesLoadingModuleToHandlerMapping})}}") + } + if (typeof prevStartup === 'function') { + return prevStartup(); + } else { + console.warn('[MF] Invalid prevStartup'); + } +}; +})(); +// webpack/runtime/has_own_property +(() => { +__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +})(); +// webpack/runtime/make_namespace_object +(() => { +// define __esModule on exports +__webpack_require__.r = (exports) => { + if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { + Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); + } + Object.defineProperty(exports, '__esModule', { value: true }); +}; +})(); +// webpack/runtime/rspack_version +(() => { +__webpack_require__.rv = () => ("1.6.0") +})(); +// webpack/runtime/sharing +(() => { + +__webpack_require__.S = {}; +__webpack_require__.initializeSharingData = { scopeToSharingDataMapping: { }, uniqueName: "" }; +__webpack_require__.I = __webpack_require__.I || function() { throw new Error("should have __webpack_require__.I") } + +})(); +// webpack/runtime/repack/polyfills +(() => { +// Polyfill: polyfill1.js +(function() { + globalThis.__POLYFILL_1__ = true; +})(); +// Polyfill: polyfill2.js +(function() { + globalThis.__POLYFILL_2__ = true; +})(); +})(); +// webpack/runtime/consumes_loading +(() => { + +__webpack_require__.consumesLoadingData = { chunkMapping: {"main":["webpack/sharing/consume/default/react-native/Libraries/Image/AssetRegistry","webpack/sharing/consume/default/react-native/Libraries/Image/AssetSourceResolver"]}, moduleIdToConsumeDataMapping: {"webpack/sharing/consume/default/react-native/Libraries/Image/AssetRegistry": { shareScope: "default", shareKey: "react-native/Libraries/Image/AssetRegistry", import: null, requiredVersion: "*", strictVersion: false, singleton: true, eager: true, fallback: undefined }, "webpack/sharing/consume/default/react-native/Libraries/Image/AssetSourceResolver": { shareScope: "default", shareKey: "react-native/Libraries/Image/AssetSourceResolver", import: null, requiredVersion: "*", strictVersion: false, singleton: true, eager: true, fallback: undefined }}, initialConsumes: ["webpack/sharing/consume/default/react-native/Libraries/Image/AssetRegistry","webpack/sharing/consume/default/react-native/Libraries/Image/AssetSourceResolver"] }; + +})(); +// webpack/runtime/rspack_unique_id +(() => { +__webpack_require__.ruid = "bundler=rspack@1.6.0"; + +})(); +/************************************************************************/ +// module cache are used so entry inlining is disabled +// run startup +var __webpack_exports__ = __webpack_require__.x(); +})() +;" +`;