@module-federation/runtime-core 2.9.0 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.cjs CHANGED
@@ -33,7 +33,7 @@ var ModuleFederation = class {
33
33
  beforeInitContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("beforeInitContainer"),
34
34
  initContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("initContainer")
35
35
  });
36
- this.version = "2.9.0";
36
+ this.version = "2.9.2";
37
37
  this.moduleCache = /* @__PURE__ */ new Map();
38
38
  this.loaderHook = new require_pluginSystem.PluginSystem({
39
39
  getModuleInfo: new require_syncHook.SyncHook(),
package/dist/core.js CHANGED
@@ -33,7 +33,7 @@ var ModuleFederation = class {
33
33
  beforeInitContainer: new AsyncWaterfallHook("beforeInitContainer"),
34
34
  initContainer: new AsyncWaterfallHook("initContainer")
35
35
  });
36
- this.version = "2.9.0";
36
+ this.version = "2.9.2";
37
37
  this.moduleCache = /* @__PURE__ */ new Map();
38
38
  this.loaderHook = new PluginSystem({
39
39
  getModuleInfo: new SyncHook(),
package/dist/global.cjs CHANGED
@@ -69,7 +69,7 @@ function getGlobalFederationConstructor() {
69
69
  function setGlobalFederationConstructor(FederationConstructor, isDebug = (0, _module_federation_sdk.isDebugMode)()) {
70
70
  if (isDebug) {
71
71
  CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
72
- CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.9.0";
72
+ CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.9.2";
73
73
  }
74
74
  }
75
75
  function getInfoWithoutType(target, key) {
package/dist/global.js CHANGED
@@ -69,7 +69,7 @@ function getGlobalFederationConstructor() {
69
69
  function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
70
70
  if (isDebug) {
71
71
  CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
72
- CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.9.0";
72
+ CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.9.2";
73
73
  }
74
74
  }
75
75
  function getInfoWithoutType(target, key) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","matchRemoteWithNameAndExpose","getRemoteInfo","formatPreloadArgs","composeRemoteRequestId","preloadAssets","Module","RUNTIME_004","runtimeDescMap","optionsToMFContext","isBrowserEnvValue","DEFAULT_SCOPE","DEFAULT_REMOTE_TYPE","getInfoWithoutType","CurrentGlobal","getFMId","Global","getGlobalRemoteInfo","getRemoteEntryUniqueKey","globalLoading","getGlobalShareScope"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n getFMId,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n resourceContext?: ResourceLoadContext;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(\n remoteInfo,\n host,\n assets,\n true,\n {\n initiator: 'preloadRemote',\n id: preloadId,\n },\n preloadConfig.recordPreloadedAssets,\n );\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const { host } = this;\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host, remoteInfo });\n\n module.remoteEntryExports = container;\n host.moduleCache.set(name, module);\n\n return module;\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const globalSnapshotKey = getInfoWithoutType(\n CurrentGlobal.__FEDERATION__.moduleInfo,\n getFMId(remote),\n ).key;\n delete CurrentGlobal.__FEDERATION__.moduleInfo[globalSnapshotKey];\n\n if ('entry' in remote) {\n host.snapshotHandler.manifestCache.delete(remote.entry);\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry];\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n }\n }\n\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","matchRemoteWithNameAndExpose","getRemoteInfo","formatPreloadArgs","composeRemoteRequestId","preloadAssets","Module","RUNTIME_004","runtimeDescMap","optionsToMFContext","isBrowserEnvValue","DEFAULT_SCOPE","DEFAULT_REMOTE_TYPE","getInfoWithoutType","CurrentGlobal","getFMId","Global","getGlobalRemoteInfo","getRemoteEntryUniqueKey","globalLoading","getGlobalShareScope"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n ResourceLoadContext,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n getFMId,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n resourceContext?: ResourceLoadContext;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(\n remoteInfo,\n host,\n assets,\n true,\n {\n initiator: 'preloadRemote',\n id: preloadId,\n },\n preloadConfig.recordPreloadedAssets,\n );\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const { host } = this;\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host, remoteInfo });\n\n module.remoteEntryExports = container;\n host.moduleCache.set(name, module);\n\n return module;\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const globalSnapshotKey = getInfoWithoutType(\n CurrentGlobal.__FEDERATION__.moduleInfo,\n getFMId(remote),\n ).key;\n delete CurrentGlobal.__FEDERATION__.moduleInfo[globalSnapshotKey];\n\n if ('entry' in remote) {\n host.snapshotHandler.manifestCache.delete(remote.entry);\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry];\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n }\n }\n\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { AsyncWaterfallHook } from "../utils/hooks/asyncWaterfallHooks.js";
6
6
  import { PluginSystem } from "../utils/hooks/pluginSystem.js";
7
7
  import { ModuleFederation } from "../core.js";
8
8
  import { CallFrom, Options, Remote, RemoteEntryExports, RemoteInfo, UserOptions } from "../type/config.js";
9
- import { PreloadAssets, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult } from "../type/preload.js";
9
+ import { PreloadAssets, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, ResourceLoadContext } from "../type/preload.js";
10
10
  import { GlobalModuleInfo, ModuleInfo } from "@module-federation/sdk";
11
11
 
12
12
  //#region src/remote/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Module"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n getFMId,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n resourceContext?: ResourceLoadContext;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(\n remoteInfo,\n host,\n assets,\n true,\n {\n initiator: 'preloadRemote',\n id: preloadId,\n },\n preloadConfig.recordPreloadedAssets,\n );\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const { host } = this;\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host, remoteInfo });\n\n module.remoteEntryExports = container;\n host.moduleCache.set(name, module);\n\n return module;\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const globalSnapshotKey = getInfoWithoutType(\n CurrentGlobal.__FEDERATION__.moduleInfo,\n getFMId(remote),\n ).key;\n delete CurrentGlobal.__FEDERATION__.moduleInfo[globalSnapshotKey];\n\n if ('entry' in remote) {\n host.snapshotHandler.manifestCache.delete(remote.entry);\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry];\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n }\n }\n\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Module"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n isBrowserEnvValue,\n warn,\n composeKeyWithSeparator,\n ModuleInfo,\n GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n Global,\n getInfoWithoutType,\n globalLoading,\n CurrentGlobal,\n} from '../global';\nimport {\n Options,\n UserOptions,\n PreloadAssets,\n PreloadOptions,\n PreloadRemoteArgs,\n PreloadRemoteResult,\n Remote,\n RemoteInfo,\n RemoteEntryExports,\n CallFrom,\n ResourceLoadContext,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n assert,\n error,\n getRemoteInfo,\n getRemoteEntryUniqueKey,\n getFMId,\n composeRemoteRequestId,\n matchRemoteWithNameAndExpose,\n optionsToMFContext,\n logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n id: string;\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n options: Options;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n host: ModuleFederation;\n idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n hooks = new PluginSystem({\n beforeRegisterRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('beforeRegisterRemote'),\n registerRemote: new SyncWaterfallHook<{\n remote: Remote;\n origin: ModuleFederation;\n }>('registerRemote'),\n beforeRequest: new AsyncWaterfallHook<{\n id: string;\n options: Options;\n origin: ModuleFederation;\n }>('beforeRequest'),\n afterMatchRemote: new AsyncHook<\n [\n {\n id: string;\n options: Options;\n remote?: Remote;\n expose?: string;\n remoteInfo?: RemoteInfo;\n error?: unknown;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterMatchRemote'),\n onLoad: new AsyncHook<\n [\n {\n id: string;\n expose: string;\n pkgNameOrAlias: string;\n remote: Remote;\n options: ModuleOptions;\n origin: ModuleFederation;\n exposeModule: any;\n exposeModuleFactory: any;\n moduleInstance: Module;\n },\n ],\n unknown\n >('onLoad'),\n afterLoadRemote: new AsyncHook<\n [\n {\n id: string;\n expose?: string;\n remote?: RemoteInfo;\n options?: {\n loadFactory?: boolean;\n from?: CallFrom;\n };\n error?: unknown;\n recovered?: boolean;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadRemote'),\n handlePreloadModule: new SyncHook<\n [\n {\n id: string;\n name: string;\n remote: Remote;\n remoteSnapshot: ModuleInfo;\n preloadConfig: PreloadRemoteArgs;\n origin: ModuleFederation;\n },\n ],\n void\n >('handlePreloadModule'),\n errorLoadRemote: new AsyncHook<\n [\n {\n id: string;\n error: unknown;\n options?: any;\n from: CallFrom;\n lifecycle:\n | 'beforeRequest'\n | 'beforeLoadShare'\n | 'afterResolve'\n | 'onLoad';\n remote?: RemoteInfo;\n expose?: string;\n origin: ModuleFederation;\n },\n ],\n void | unknown\n >('errorLoadRemote'),\n beforePreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n },\n ]\n >('beforePreloadRemote'),\n generatePreloadAssets: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n preloadOptions: PreloadOptions[number];\n remote: Remote;\n remoteInfo: RemoteInfo;\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n },\n ],\n Promise<PreloadAssets>\n >('generatePreloadAssets'),\n afterPreloadRemote: new AsyncHook<\n [\n {\n preloadOps: Array<PreloadRemoteArgs>;\n options: Options;\n origin: ModuleFederation;\n results: PreloadRemoteResult[];\n error?: unknown;\n },\n ]\n >('afterPreloadRemote'),\n // TODO: Move to loaderHook\n loadEntry: new AsyncHook<\n [\n {\n origin: ModuleFederation;\n loaderHook: ModuleFederation['loaderHook'];\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n resourceContext?: ResourceLoadContext;\n },\n ],\n Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n >(),\n });\n\n constructor(host: ModuleFederation) {\n this.host = host;\n this.idToRemoteMap = {};\n }\n\n formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n const userRemotes = userOptions.remotes || [];\n\n return userRemotes.reduce((res, remote) => {\n this.registerRemote(remote, res, { force: false });\n return res;\n }, globalOptions.remotes);\n }\n\n setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n const { remote, expose } = remoteMatchInfo;\n const { name, alias } = remote;\n this.idToRemoteMap[id] = { name: remote.name, expose };\n if (alias && id.startsWith(name)) {\n const idWithAlias = id.replace(name, alias);\n this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n return;\n }\n\n if (alias && id.startsWith(alias)) {\n const idWithName = id.replace(alias, name);\n this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n }\n }\n\n // eslint-disable-next-line max-lines-per-function\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async loadRemote<T>(\n id: string,\n options?: { loadFactory?: boolean; from: CallFrom },\n ): Promise<T | null> {\n const { host } = this;\n const startMatchInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n id,\n );\n let completeRequestId = id;\n let completeExpose = startMatchInfo?.expose;\n let completeRemote = startMatchInfo\n ? getRemoteInfo(startMatchInfo.remote)\n : undefined;\n let afterLoadRemoteArgs:\n | Parameters<\n RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n >[0]\n | undefined;\n\n try {\n const { loadFactory = true } = options || {\n loadFactory: true,\n };\n // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n // id: alias(app1) + expose(button) = app1/button\n // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n const { module, moduleOptions, remoteMatchInfo } =\n await this.getRemoteModuleAndOptions({\n id,\n });\n const {\n pkgNameOrAlias,\n remote,\n expose,\n id: idRes,\n remoteSnapshot,\n } = remoteMatchInfo;\n completeRequestId = idRes;\n completeExpose = expose;\n completeRemote = getRemoteInfo(remote);\n\n const moduleOrFactory = (await module.get(\n idRes,\n expose,\n options,\n remoteSnapshot,\n )) as T;\n\n const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n id: idRes,\n pkgNameOrAlias,\n expose,\n exposeModule: loadFactory ? moduleOrFactory : undefined,\n exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n remote,\n options: moduleOptions,\n moduleInstance: module,\n origin: host,\n });\n\n this.setIdToRemoteMap(id, remoteMatchInfo);\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n origin: host,\n };\n\n if (typeof moduleWrapper === 'function') {\n return moduleWrapper as T;\n }\n\n return moduleOrFactory;\n } catch (error) {\n const { from = 'runtime' } = options || { from: 'runtime' };\n\n let failOver;\n try {\n failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n error,\n from,\n lifecycle: 'onLoad',\n expose: completeExpose,\n remote: completeRemote,\n origin: host,\n });\n } catch (hookError) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error: hookError,\n origin: host,\n };\n throw hookError;\n }\n\n if (!failOver) {\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n };\n throw error;\n }\n\n afterLoadRemoteArgs = {\n id: completeRequestId,\n expose: completeExpose,\n remote: completeRemote,\n options,\n error,\n origin: host,\n recovered: true,\n };\n\n return failOver as T;\n } finally {\n if (afterLoadRemoteArgs) {\n await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n const { host } = this;\n const preloadResults: PreloadRemoteResult[] = [];\n\n await this.hooks.lifecycle.beforePreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n });\n\n const preloadOps: PreloadOptions = formatPreloadArgs(\n host.options.remotes,\n preloadOptions,\n );\n\n const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n const { preloadConfig, remote } = ops;\n const exposes = preloadConfig.exposes || [];\n\n if (!exposes.length) {\n return [\n {\n ops,\n id: `${remote.name}/*`,\n },\n ];\n }\n\n return exposes.map((expose) => ({\n ops: {\n ...ops,\n preloadConfig: {\n ...preloadConfig,\n exposes: [expose],\n },\n },\n id: composeRemoteRequestId(remote.name, expose),\n }));\n };\n\n let preloadError: Error | undefined;\n\n await Promise.all(\n preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n const { ops, id: preloadId } = assetOps;\n const { remote, preloadConfig } = ops;\n const remoteInfo = getRemoteInfo(remote);\n try {\n const { globalSnapshot, remoteSnapshot } =\n await host.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: preloadId,\n initiator: 'preloadRemote',\n });\n\n const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n origin: host,\n preloadOptions: ops,\n remote,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n });\n if (!assets) {\n return;\n }\n const results = await preloadAssets(\n remoteInfo,\n host,\n assets,\n true,\n {\n initiator: 'preloadRemote',\n id: preloadId,\n },\n preloadConfig.recordPreloadedAssets,\n );\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results,\n });\n } catch (error) {\n preloadResults.push({\n remote,\n remoteInfo,\n preloadConfig,\n id: preloadId,\n results: [\n {\n url: remoteInfo.entry,\n status: 'error',\n resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n ? 'manifest'\n : 'remoteEntry',\n initiator: 'preloadRemote',\n id: preloadId,\n error,\n },\n ],\n });\n }\n }),\n );\n\n const failedResults = preloadResults.flatMap((preloadResult) =>\n preloadResult.results.filter(\n (result) => result.status === 'error' || result.status === 'timeout',\n ),\n );\n if (failedResults.length > 0) {\n preloadError = new Error(\n `preloadRemote failed to load ${failedResults.length} resource(s).`,\n );\n Object.assign(preloadError, {\n results: preloadResults,\n failedResults,\n });\n }\n\n await this.hooks.lifecycle.afterPreloadRemote.emit({\n preloadOps: preloadOptions,\n options: host.options,\n origin: host,\n results: preloadResults,\n error: preloadError,\n });\n\n if (preloadError) {\n throw preloadError;\n }\n }\n\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n const { host } = this;\n remotes.forEach((remote) => {\n this.registerRemote(remote, host.options.remotes, {\n force: options?.force,\n });\n });\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const { host } = this;\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host, remoteInfo });\n\n module.remoteEntryExports = container;\n host.moduleCache.set(name, module);\n\n return module;\n }\n\n async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n module: Module;\n moduleOptions: ModuleOptions;\n remoteMatchInfo: LoadRemoteMatch;\n }> {\n const { host } = this;\n const { id } = options;\n let loadRemoteArgs;\n\n try {\n loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n id,\n options: host.options,\n origin: host,\n });\n } catch (error) {\n loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n id,\n options: host.options,\n origin: host,\n from: 'runtime',\n error,\n lifecycle: 'beforeRequest',\n })) as {\n id: string;\n options: Options;\n origin: ModuleFederation;\n };\n\n if (!loadRemoteArgs) {\n throw error;\n }\n }\n\n const { id: idRes } = loadRemoteArgs;\n\n const remoteSplitInfo = matchRemoteWithNameAndExpose(\n host.options.remotes,\n idRes,\n );\n if (!remoteSplitInfo) {\n try {\n error(\n RUNTIME_004,\n runtimeDescMap,\n {\n hostName: host.options.name,\n requestId: idRes,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (matchError) {\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n options: host.options,\n error: matchError,\n origin: host,\n });\n throw matchError;\n }\n }\n\n const { remote: rawRemote } = remoteSplitInfo;\n const remoteInfo = getRemoteInfo(rawRemote);\n await this.hooks.lifecycle.afterMatchRemote.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n remoteInfo,\n origin: host,\n });\n const matchInfo =\n await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n id: idRes,\n ...remoteSplitInfo,\n options: host.options,\n origin: host,\n remoteInfo,\n });\n\n const { remote, expose } = matchInfo;\n assert(\n remote && expose,\n `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n );\n let module: Module | undefined = host.moduleCache.get(remote.name);\n\n const moduleOptions: ModuleOptions = {\n host: host,\n remoteInfo,\n };\n\n if (!module) {\n module = new Module(moduleOptions);\n host.moduleCache.set(remote.name, module);\n }\n return {\n module,\n moduleOptions,\n remoteMatchInfo: matchInfo,\n };\n }\n\n registerRemote(\n remote: Remote,\n targetRemotes: Remote[],\n options?: { force?: boolean },\n ): void {\n const { host } = this;\n const normalizeRemote = () => {\n if (remote.alias) {\n // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n const findEqual = targetRemotes.find(\n (item) =>\n remote.alias &&\n (item.name.startsWith(remote.alias) ||\n item.alias?.startsWith(remote.alias)),\n );\n assert(\n !findEqual,\n `The alias ${remote.alias} of remote ${\n remote.name\n } is not allowed to be the prefix of ${\n findEqual && findEqual.name\n } name or alias`,\n );\n }\n // Set the remote entry to a complete path\n if ('entry' in remote) {\n if (\n isBrowserEnvValue &&\n typeof window !== 'undefined' &&\n !remote.entry.startsWith('http')\n ) {\n remote.entry = new URL(remote.entry, window.location.origin).href;\n }\n }\n if (!remote.shareScope) {\n remote.shareScope = DEFAULT_SCOPE;\n }\n if (!remote.type) {\n remote.type = DEFAULT_REMOTE_TYPE;\n }\n };\n this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n const registeredRemote = targetRemotes.find(\n (item) => item.name === remote.name,\n );\n if (!registeredRemote) {\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n } else {\n const messages = [\n `The remote \"${remote.name}\" is already registered.`,\n 'Please note that overriding it may cause unexpected errors.',\n ];\n if (options?.force) {\n // remove registered remote\n this.removeRemote(registeredRemote);\n normalizeRemote();\n targetRemotes.push(remote);\n this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n warn(messages.join(' '));\n }\n }\n }\n\n private removeRemote(remote: Remote): void {\n try {\n const { host } = this;\n const { name } = remote;\n const remoteIndex = host.options.remotes.findIndex(\n (item) => item.name === name,\n );\n if (remoteIndex !== -1) {\n host.options.remotes.splice(remoteIndex, 1);\n }\n const globalSnapshotKey = getInfoWithoutType(\n CurrentGlobal.__FEDERATION__.moduleInfo,\n getFMId(remote),\n ).key;\n delete CurrentGlobal.__FEDERATION__.moduleInfo[globalSnapshotKey];\n\n if ('entry' in remote) {\n host.snapshotHandler.manifestCache.delete(remote.entry);\n delete Global.__FEDERATION__.__MANIFEST_LOADING__[remote.entry];\n }\n\n const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n if (hostGlobalSnapshot) {\n const remoteKey =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n if (remoteKey) {\n delete hostGlobalSnapshot.remotesInfo[remoteKey];\n }\n }\n\n const loadedModule = host.moduleCache.get(remote.name);\n if (loadedModule) {\n const remoteInfo = loadedModule.remoteInfo;\n const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n if (CurrentGlobal[key]) {\n if (\n Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n ) {\n delete CurrentGlobal[key];\n } else {\n // @ts-ignore\n CurrentGlobal[key] = undefined;\n }\n }\n const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n loadedModule.remoteInfo,\n );\n\n if (globalLoading[remoteEntryUniqueKey]) {\n delete globalLoading[remoteEntryUniqueKey];\n }\n\n // delete unloaded shared and instance\n let remoteInsId = remoteInfo.buildVersion\n ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n : remoteInfo.name;\n const remoteInsIndex =\n CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n if (remoteInfo.buildVersion) {\n return ins.options.id === remoteInsId;\n } else {\n return ins.name === remoteInsId;\n }\n });\n if (remoteInsIndex !== -1) {\n const remoteIns =\n CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n remoteInsId = remoteIns.options.id || remoteInsId;\n const globalShareScopeMap = getGlobalShareScope();\n\n let isAllSharedNotUsed = true;\n const needDeleteKeys: Array<[string, string, string, string]> = [];\n Object.keys(globalShareScopeMap).forEach((instId) => {\n const shareScopeMap = globalShareScopeMap[instId];\n shareScopeMap &&\n Object.keys(shareScopeMap).forEach((shareScope) => {\n const shareScopeVal = shareScopeMap[shareScope];\n shareScopeVal &&\n Object.keys(shareScopeVal).forEach((shareName) => {\n const sharedPkgs = shareScopeVal[shareName];\n sharedPkgs &&\n Object.keys(sharedPkgs).forEach((shareVersion) => {\n const shared = sharedPkgs[shareVersion];\n if (\n shared &&\n typeof shared === 'object' &&\n shared.from === remoteInfo.name\n ) {\n if (shared.loaded || shared.loading) {\n shared.useIn = shared.useIn.filter(\n (usedHostName) =>\n usedHostName !== remoteInfo.name,\n );\n if (shared.useIn.length) {\n isAllSharedNotUsed = false;\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n } else {\n needDeleteKeys.push([\n instId,\n shareScope,\n shareName,\n shareVersion,\n ]);\n }\n }\n });\n });\n });\n });\n\n if (isAllSharedNotUsed) {\n remoteIns.shareScopeMap = {};\n delete globalShareScopeMap[remoteInsId];\n }\n needDeleteKeys.forEach(\n ([insId, shareScope, shareName, shareVersion]) => {\n delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n shareVersion\n ];\n },\n );\n CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n }\n\n host.moduleCache.delete(remote.name);\n }\n } catch (err) {\n logger.error(\n `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -171,7 +171,7 @@ async function getRemoteEntry(params) {
171
171
  if (!require_global.globalLoading[uniqueKey]) {
172
172
  const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;
173
173
  const loaderHook = origin.loaderHook;
174
- require_global.globalLoading[uniqueKey] = loadEntryHook.emit({
174
+ const loading = loadEntryHook.emit({
175
175
  origin,
176
176
  loaderHook,
177
177
  remoteInfo,
@@ -235,7 +235,11 @@ async function getRemoteEntry(params) {
235
235
  });
236
236
  throw loadError;
237
237
  });
238
- remoteEntryLoadingOrigins.set(require_global.globalLoading[uniqueKey], origin);
238
+ require_global.globalLoading[uniqueKey] = loading;
239
+ loading.then(void 0, () => {
240
+ if (require_global.globalLoading[uniqueKey] === loading) delete require_global.globalLoading[uniqueKey];
241
+ });
242
+ remoteEntryLoadingOrigins.set(loading, origin);
239
243
  }
240
244
  const remoteEntryLoading = require_global.globalLoading[uniqueKey];
241
245
  if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) try {
@@ -1 +1 @@
1
- {"version":3,"file":"load.cjs","names":["RUNTIME_008","runtimeDescMap","getRemoteEntryExports","RUNTIME_001","globalLoading","isBrowserEnvValue","DEFAULT_REMOTE_TYPE","DEFAULT_SCOPE"],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport {\n Remote,\n RemoteEntryExports,\n RemoteInfo,\n ResourceLoadContext,\n} from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\nconst remoteEntryLoadingOrigins = new WeakMap<\n Promise<RemoteEntryExports | void>,\n ModuleFederation\n>();\n\nconst esmRemoteEntryLoadErrorMessages = [\n 'Failed to fetch dynamically imported module',\n 'Importing a module script failed',\n 'error loading dynamically imported module',\n];\n\nfunction isEsmRemoteEntryLoadError(err: unknown): boolean {\n if (!(err instanceof TypeError)) {\n return false;\n }\n\n return esmRemoteEntryLoadErrorMessages.some((loadErrorMessage) =>\n err.message.includes(loadErrorMessage),\n );\n}\n\nexport function isEsmRemoteType(type: RemoteInfo['type']): boolean {\n return type === 'esm' || type === 'module';\n}\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n name,\n getEntryUrl,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n name: string;\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n const rejectEntry = (loadError: unknown) => {\n if (isEsmRemoteEntryLoadError(loadError)) {\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n try {\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n } catch (runtimeError) {\n reject(runtimeError);\n return;\n }\n }\n\n reject(loadError);\n };\n\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${url}\")${importCallback}`)([\n resolve,\n rejectEntry,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ url)\n .then(resolve)\n .catch(rejectEntry);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${url}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n name: string;\n globalName: string;\n entry: string;\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n if (isEsmRemoteType(type)) {\n return loadEsmEntry({ entry, remoteEntryExports, name, getEntryUrl });\n }\n\n if (type === 'system') {\n return loadSystemJsEntry({ entry, remoteEntryExports });\n }\n\n return loadEntryScript({\n entry,\n globalName,\n name,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n });\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n resourceContext,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n\n if (remoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n cached: true,\n });\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n origin,\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n })\n : loadEntryNode({ remoteInfo, loaderHook, resourceContext });\n })\n .then(async (res) => {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: res,\n resourceContext,\n });\n return res;\n })\n .catch(async (loadError) => {\n const isScriptExecutionError =\n loadError instanceof Error &&\n loadError.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n loadError instanceof Error &&\n loadError.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const recoveredRemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (recoveredRemoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: recoveredRemoteEntryExports,\n resourceContext,\n error: loadError,\n recovered: true,\n });\n return recoveredRemoteEntryExports;\n }\n }\n\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n });\n remoteEntryLoadingOrigins.set(globalLoading[uniqueKey], origin);\n }\n\n const remoteEntryLoading = globalLoading[uniqueKey];\n if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) {\n try {\n const result = await remoteEntryLoading;\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: result,\n resourceContext,\n });\n return result;\n } catch (loadError) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n }\n }\n\n return remoteEntryLoading;\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"load.cjs","names":["RUNTIME_008","runtimeDescMap","getRemoteEntryExports","RUNTIME_001","globalLoading","isBrowserEnvValue","DEFAULT_REMOTE_TYPE","DEFAULT_SCOPE"],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport {\n Remote,\n RemoteEntryExports,\n RemoteInfo,\n ResourceLoadContext,\n} from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\nconst remoteEntryLoadingOrigins = new WeakMap<\n Promise<RemoteEntryExports | void>,\n ModuleFederation\n>();\n\nconst esmRemoteEntryLoadErrorMessages = [\n 'Failed to fetch dynamically imported module',\n 'Importing a module script failed',\n 'error loading dynamically imported module',\n];\n\nfunction isEsmRemoteEntryLoadError(err: unknown): boolean {\n if (!(err instanceof TypeError)) {\n return false;\n }\n\n return esmRemoteEntryLoadErrorMessages.some((loadErrorMessage) =>\n err.message.includes(loadErrorMessage),\n );\n}\n\nexport function isEsmRemoteType(type: RemoteInfo['type']): boolean {\n return type === 'esm' || type === 'module';\n}\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n name,\n getEntryUrl,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n name: string;\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n const rejectEntry = (loadError: unknown) => {\n if (isEsmRemoteEntryLoadError(loadError)) {\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n try {\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n } catch (runtimeError) {\n reject(runtimeError);\n return;\n }\n }\n\n reject(loadError);\n };\n\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${url}\")${importCallback}`)([\n resolve,\n rejectEntry,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ url)\n .then(resolve)\n .catch(rejectEntry);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${url}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n name: string;\n globalName: string;\n entry: string;\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n if (isEsmRemoteType(type)) {\n return loadEsmEntry({ entry, remoteEntryExports, name, getEntryUrl });\n }\n\n if (type === 'system') {\n return loadSystemJsEntry({ entry, remoteEntryExports });\n }\n\n return loadEntryScript({\n entry,\n globalName,\n name,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n });\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n resourceContext,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n\n if (remoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n cached: true,\n });\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n const loading = loadEntryHook\n .emit({\n origin,\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n })\n : loadEntryNode({ remoteInfo, loaderHook, resourceContext });\n })\n .then(async (res) => {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: res,\n resourceContext,\n });\n return res;\n })\n .catch(async (loadError) => {\n const isScriptExecutionError =\n loadError instanceof Error &&\n loadError.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n loadError instanceof Error &&\n loadError.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const recoveredRemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (recoveredRemoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: recoveredRemoteEntryExports,\n resourceContext,\n error: loadError,\n recovered: true,\n });\n return recoveredRemoteEntryExports;\n }\n }\n\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n });\n\n globalLoading[uniqueKey] = loading;\n // Clear rejected entries so a later call can retry. Keep the original\n // promise identity in the cache (do not replace with a cleanup thenable).\n // Identity check: an older rejection must not delete a newer in-flight request.\n loading.then(undefined, () => {\n if (globalLoading[uniqueKey] === loading) {\n delete globalLoading[uniqueKey];\n }\n });\n remoteEntryLoadingOrigins.set(loading, origin);\n }\n\n const remoteEntryLoading = globalLoading[uniqueKey];\n if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) {\n try {\n const result = await remoteEntryLoading;\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: result,\n resourceContext,\n });\n return result;\n } catch (loadError) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n }\n }\n\n return remoteEntryLoading;\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
@@ -171,7 +171,7 @@ async function getRemoteEntry(params) {
171
171
  if (!globalLoading[uniqueKey]) {
172
172
  const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;
173
173
  const loaderHook = origin.loaderHook;
174
- globalLoading[uniqueKey] = loadEntryHook.emit({
174
+ const loading = loadEntryHook.emit({
175
175
  origin,
176
176
  loaderHook,
177
177
  remoteInfo,
@@ -235,7 +235,11 @@ async function getRemoteEntry(params) {
235
235
  });
236
236
  throw loadError;
237
237
  });
238
- remoteEntryLoadingOrigins.set(globalLoading[uniqueKey], origin);
238
+ globalLoading[uniqueKey] = loading;
239
+ loading.then(void 0, () => {
240
+ if (globalLoading[uniqueKey] === loading) delete globalLoading[uniqueKey];
241
+ });
242
+ remoteEntryLoadingOrigins.set(loading, origin);
239
243
  }
240
244
  const remoteEntryLoading = globalLoading[uniqueKey];
241
245
  if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) try {
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","names":[],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport {\n Remote,\n RemoteEntryExports,\n RemoteInfo,\n ResourceLoadContext,\n} from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\nconst remoteEntryLoadingOrigins = new WeakMap<\n Promise<RemoteEntryExports | void>,\n ModuleFederation\n>();\n\nconst esmRemoteEntryLoadErrorMessages = [\n 'Failed to fetch dynamically imported module',\n 'Importing a module script failed',\n 'error loading dynamically imported module',\n];\n\nfunction isEsmRemoteEntryLoadError(err: unknown): boolean {\n if (!(err instanceof TypeError)) {\n return false;\n }\n\n return esmRemoteEntryLoadErrorMessages.some((loadErrorMessage) =>\n err.message.includes(loadErrorMessage),\n );\n}\n\nexport function isEsmRemoteType(type: RemoteInfo['type']): boolean {\n return type === 'esm' || type === 'module';\n}\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n name,\n getEntryUrl,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n name: string;\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n const rejectEntry = (loadError: unknown) => {\n if (isEsmRemoteEntryLoadError(loadError)) {\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n try {\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n } catch (runtimeError) {\n reject(runtimeError);\n return;\n }\n }\n\n reject(loadError);\n };\n\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${url}\")${importCallback}`)([\n resolve,\n rejectEntry,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ url)\n .then(resolve)\n .catch(rejectEntry);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${url}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n name: string;\n globalName: string;\n entry: string;\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n if (isEsmRemoteType(type)) {\n return loadEsmEntry({ entry, remoteEntryExports, name, getEntryUrl });\n }\n\n if (type === 'system') {\n return loadSystemJsEntry({ entry, remoteEntryExports });\n }\n\n return loadEntryScript({\n entry,\n globalName,\n name,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n });\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n resourceContext,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n\n if (remoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n cached: true,\n });\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n origin,\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n })\n : loadEntryNode({ remoteInfo, loaderHook, resourceContext });\n })\n .then(async (res) => {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: res,\n resourceContext,\n });\n return res;\n })\n .catch(async (loadError) => {\n const isScriptExecutionError =\n loadError instanceof Error &&\n loadError.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n loadError instanceof Error &&\n loadError.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const recoveredRemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (recoveredRemoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: recoveredRemoteEntryExports,\n resourceContext,\n error: loadError,\n recovered: true,\n });\n return recoveredRemoteEntryExports;\n }\n }\n\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n });\n remoteEntryLoadingOrigins.set(globalLoading[uniqueKey], origin);\n }\n\n const remoteEntryLoading = globalLoading[uniqueKey];\n if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) {\n try {\n const result = await remoteEntryLoading;\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: result,\n resourceContext,\n });\n return result;\n } catch (loadError) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n }\n }\n\n return remoteEntryLoading;\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":";;;;;;;AAwBA,MAAM,iBAAiB;AACvB,MAAM,4CAA4B,IAAI,SAGnC;AAEH,MAAM,kCAAkC;CACtC;CACA;CACA;CACD;AAED,SAAS,0BAA0B,KAAuB;AACxD,KAAI,EAAE,eAAe,WACnB,QAAO;AAGT,QAAO,gCAAgC,MAAM,qBAC3C,IAAI,QAAQ,SAAS,iBAAiB,CACvC;;AAGH,SAAgB,gBAAgB,MAAmC;AACjE,QAAO,SAAS,SAAS,SAAS;;AAGpC,eAAe,aAAa,EAC1B,OACA,oBACA,MACA,eAM8B;AAC9B,QAAO,IAAI,SAA6B,SAAS,WAAW;EAC1D,MAAM,eAAe,cAAuB;AAC1C,OAAI,0BAA0B,UAAU,EAAE;IACxC,MAAM,cACJ,qBAAqB,QAAQ,UAAU,UAAU,OAAO,UAAU;AACpE,QAAI;AACF,WACE,aACA,gBACA;MACE,YAAY;MACZ,aAAa;MACd,EACD,YACD;aACM,cAAc;AACrB,YAAO,aAAa;AACpB;;;AAIJ,UAAO,UAAU;;EAGnB,MAAM,MAAM,cAAc,YAAY,MAAM,GAAG;AAC/C,MAAI;AACF,OAAI,CAAC,mBACH,KAAI,OAAO,kCAAkC,YAC3C,KAAI,SAAS,aAAa,WAAW,IAAI,IAAI,iBAAiB,CAAC,CAC7D,SACA,YACD,CAAC;OAEF;;;IAAoD;EACjD,KAAK,QAAQ,CACb,MAAM,YAAY;OAGvB,SAAQ,mBAAmB;WAEtB,GAAG;AAEV,SAAM,kCAAkC,IAAI,KADhC,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,GACC;;GAEzD;;AAGJ,eAAe,kBAAkB,EAC/B,OACA,sBAI8B;AAC9B,QAAO,IAAI,SAA6B,SAAS,WAAW;AAC1D,MAAI;AACF,OAAI,CAAC,mBAEH,KAAI,OAAO,uBAAuB,YAEhC,QAAO,OAAO,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,OAAO;OAEhD,KAAI,SACF,aACA,kBAAkB,MAAM,IAAI,iBAC7B,CAAC,CAAC,SAAS,OAAO,CAAC;OAGtB,SAAQ,mBAAmB;WAEtB,GAAG;AAEV,SAAM,uCAAuC,MAAM,KADvC,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,GACQ;;GAEhE;;AAGJ,SAAS,wBACP,MACA,YACA,OACoB;CACpB,MAAM,EAAE,gBAAgB,iBAAiB,sBACvC,MACA,WACD;AAED,KAAI,CAAC,aACH,OAAM,aAAa,gBAAgB;EACjC,YAAY;EACZ,gBAAgB;EAChB;EACD,CAAC;AAGJ,QAAO;;AAGT,eAAe,gBAAgB,EAC7B,MACA,YACA,OACA,YACA,YACA,aACA,mBAS8B;CAC9B,MAAM,EAAE,cAAc,uBAAuB,sBAC3C,MACA,WACD;AAED,KAAI,mBACF,QAAO;CAIT,MAAM,MAAM,cAAc,YAAY,MAAM,GAAG;AAC/C,QAAO,WAAW,KAAK;EACrB,OAAO,EAAE;EACT,mBAAmB,KAAK,UAAU;GAChC,MAAM,MAAM,WAAW,UAAU,aAAa,KAAK;IACjD;IACA;IACA;IACA,iBAAiB,kBACb;KACE,GAAG;KACH;KACD,GACD;IACL,CAAC;AAEF,OAAI,CAAC,IAAK;AAEV,OAAI,eAAe,kBACjB,QAAO;AAGT,OAAI,YAAY,OAAO,aAAa,IAClC,QAAO;;EAKZ,CAAC,CAAC,WACK;AAGJ,SAAO,wBAAwB,MAAM,YAAY,MAAM;KAExD,cAAuB;EAMtB,MAAM,cACJ,qBAAqB,QAAQ,UAAU,UAAU,OAAO,UAAU;AACpE,QACE,aACA,gBACA;GACE,YAAY;GACZ,aAAa;GACd,EACD,YACD;GAEJ;;AAEH,eAAe,aAAa,EAC1B,YACA,oBACA,YACA,aACA,mBAOC;CACD,MAAM,EAAE,OAAO,iBAAiB,YAAY,MAAM,SAAS;AAC3D,KAAI,gBAAgB,KAAK,CACvB,QAAO,aAAa;EAAE;EAAO;EAAoB;EAAM;EAAa,CAAC;AAGvE,KAAI,SAAS,SACX,QAAO,kBAAkB;EAAE;EAAO;EAAoB,CAAC;AAGzD,QAAO,gBAAgB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;;AAGJ,eAAe,cAAc,EAC3B,YACA,YACA,mBAKC;CACD,MAAM,EAAE,OAAO,iBAAiB,YAAY,MAAM,SAAS;CAC3D,MAAM,EAAE,cAAc,uBAAuB,sBAC3C,MACA,WACD;AAED,KAAI,mBACF,QAAO;AAGT,QAAO,eAAe,OAAO;EAC3B,OAAO;GAAE;GAAM;GAAY;GAAM;EACjC,YAAY,EACV,mBAAmB,KAAa,QAA6B,EAAE,KAAK;GAClE,MAAM,MAAM,WAAW,UAAU,aAAa,KAAK;IACjD;IACA;IACA;IACA,iBAAiB,kBACb;KACE,GAAG;KACH;KACD,GACD;IACL,CAAC;AAEF,OAAI,CAAC,IAAK;AAEV,OAAI,SAAS,IACX,QAAO;KAKZ;EACF,CAAC,CACC,WAAW;AACV,SAAO,wBAAwB,MAAM,YAAY,MAAM;GACvD,CACD,OAAO,MAAM;AAEZ,QACE,4CAA4C,KAAK,UAAU,MAAM,KAFvD,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,GAGrD;GACD;;AAGN,SAAgB,wBAAwB,YAAgC;CACtE,MAAM,EAAE,OAAO,SAAS;AACxB,QAAO,wBAAwB,MAAM,MAAM;;AAG7C,eAAsB,eAAe,QAOU;CAC7C,MAAM,EACJ,QACA,oBACA,YACA,aACA,iBACA,mBAAmB,UACjB;CACJ,MAAM,YAAY,wBAAwB,WAAW;AAErD,KAAI,oBAAoB;AACtB,QAAM,OAAO,WAAW,UAAU,eAAe,KAAK;GACpD;GACA;GACA;GACA;GACA,QAAQ;GACT,CAAC;AACF,SAAO;;AAGT,KAAI,CAAC,cAAc,YAAY;EAC7B,MAAM,gBAAgB,OAAO,cAAc,MAAM,UAAU;EAC3D,MAAM,aAAa,OAAO;AAC1B,gBAAc,aAAa,cACxB,KAAK;GACJ;GACA;GACA;GACA;GACA;GACD,CAAC,CACD,MAAM,QAAQ;AACb,OAAI,IACF,QAAO;AAOT,WAJE,OAAO,eAAe,cAClB,eAAe,QACf,qBAGF,aAAa;IACX;IACA;IACA;IACA;IACA;IACD,CAAC,GACF,cAAc;IAAE;IAAY;IAAY;IAAiB,CAAC;IAC9D,CACD,KAAK,OAAO,QAAQ;AACnB,SAAM,OAAO,WAAW,UAAU,eAAe,KAAK;IACpD;IACA;IACA,oBAAoB;IACpB;IACD,CAAC;AACF,UAAO;IACP,CACD,MAAM,OAAO,cAAc;GAC1B,MAAM,yBACJ,qBAAqB,SACrB,UAAU,QAAQ,SAAS,uBAAuB;AAMpD,OAJE,qBAAqB,SACrB,UAAU,QAAQ,SAAS,YAAY,IACvC,CAAC,0BAEsB,CAAC,kBAAkB;IAC1C,MAAM,yBACJ,WACG;AACH,YAAO,eAAe;MAAE,GAAG;MAAQ,kBAAkB;MAAM,CAAC;;IAG9D,MAAM,8BACJ,MAAM,OAAO,WAAW,UAAU,eAAe,KAAK;KACpD,gBAAgB;KAChB;KACA;KACA;KACA;KACA;KACD,CAAC;AAEJ,QAAI,6BAA6B;AAC/B,WAAM,OAAO,WAAW,UAAU,eAAe,KAAK;MACpD;MACA;MACA,oBAAoB;MACpB;MACA,OAAO;MACP,WAAW;MACZ,CAAC;AACF,YAAO;;;AAIX,SAAM,OAAO,WAAW,UAAU,eAAe,KAAK;IACpD;IACA;IACA;IACA,OAAO;IACR,CAAC;AACF,SAAM;IACN;AACJ,4BAA0B,IAAI,cAAc,YAAY,OAAO;;CAGjE,MAAM,qBAAqB,cAAc;AACzC,KAAI,0BAA0B,IAAI,mBAAmB,KAAK,OACxD,KAAI;EACF,MAAM,SAAS,MAAM;AACrB,QAAM,OAAO,WAAW,UAAU,eAAe,KAAK;GACpD;GACA;GACA,oBAAoB;GACpB;GACD,CAAC;AACF,SAAO;UACA,WAAW;AAClB,QAAM,OAAO,WAAW,UAAU,eAAe,KAAK;GACpD;GACA;GACA;GACA,OAAO;GACR,CAAC;AACF,QAAM;;AAIV,QAAO;;AAGT,SAAgB,cAAc,QAA4B;AACxD,QAAO;EACL,GAAG;EACH,OAAO,WAAW,SAAS,OAAO,QAAQ;EAC1C,MAAM,OAAO,QAAQ;EACrB,iBAAiB,OAAO,mBAAmB,OAAO;EAClD,YAAY,OAAO,cAAc;EAClC"}
1
+ {"version":3,"file":"load.js","names":[],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport {\n Remote,\n RemoteEntryExports,\n RemoteInfo,\n ResourceLoadContext,\n} from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\nconst remoteEntryLoadingOrigins = new WeakMap<\n Promise<RemoteEntryExports | void>,\n ModuleFederation\n>();\n\nconst esmRemoteEntryLoadErrorMessages = [\n 'Failed to fetch dynamically imported module',\n 'Importing a module script failed',\n 'error loading dynamically imported module',\n];\n\nfunction isEsmRemoteEntryLoadError(err: unknown): boolean {\n if (!(err instanceof TypeError)) {\n return false;\n }\n\n return esmRemoteEntryLoadErrorMessages.some((loadErrorMessage) =>\n err.message.includes(loadErrorMessage),\n );\n}\n\nexport function isEsmRemoteType(type: RemoteInfo['type']): boolean {\n return type === 'esm' || type === 'module';\n}\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n name,\n getEntryUrl,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n name: string;\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n const rejectEntry = (loadError: unknown) => {\n if (isEsmRemoteEntryLoadError(loadError)) {\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n try {\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n } catch (runtimeError) {\n reject(runtimeError);\n return;\n }\n }\n\n reject(loadError);\n };\n\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${url}\")${importCallback}`)([\n resolve,\n rejectEntry,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ url)\n .then(resolve)\n .catch(rejectEntry);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${url}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n name: string;\n globalName: string;\n entry: string;\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n if (isEsmRemoteType(type)) {\n return loadEsmEntry({ entry, remoteEntryExports, name, getEntryUrl });\n }\n\n if (type === 'system') {\n return loadSystemJsEntry({ entry, remoteEntryExports });\n }\n\n return loadEntryScript({\n entry,\n globalName,\n name,\n remoteInfo,\n loaderHook,\n getEntryUrl,\n resourceContext,\n });\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n resourceContext,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n resourceContext?: ResourceLoadContext;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({\n url,\n attrs,\n remoteInfo,\n resourceContext: resourceContext\n ? {\n ...resourceContext,\n url,\n }\n : undefined,\n });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n resourceContext?: ResourceLoadContext;\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n resourceContext,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n\n if (remoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n cached: true,\n });\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n const loading = loadEntryHook\n .emit({\n origin,\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n resourceContext,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n resourceContext,\n })\n : loadEntryNode({ remoteInfo, loaderHook, resourceContext });\n })\n .then(async (res) => {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: res,\n resourceContext,\n });\n return res;\n })\n .catch(async (loadError) => {\n const isScriptExecutionError =\n loadError instanceof Error &&\n loadError.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n loadError instanceof Error &&\n loadError.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const recoveredRemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (recoveredRemoteEntryExports) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: recoveredRemoteEntryExports,\n resourceContext,\n error: loadError,\n recovered: true,\n });\n return recoveredRemoteEntryExports;\n }\n }\n\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n });\n\n globalLoading[uniqueKey] = loading;\n // Clear rejected entries so a later call can retry. Keep the original\n // promise identity in the cache (do not replace with a cleanup thenable).\n // Identity check: an older rejection must not delete a newer in-flight request.\n loading.then(undefined, () => {\n if (globalLoading[uniqueKey] === loading) {\n delete globalLoading[uniqueKey];\n }\n });\n remoteEntryLoadingOrigins.set(loading, origin);\n }\n\n const remoteEntryLoading = globalLoading[uniqueKey];\n if (remoteEntryLoadingOrigins.get(remoteEntryLoading) !== origin) {\n try {\n const result = await remoteEntryLoading;\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n remoteEntryExports: result,\n resourceContext,\n });\n return result;\n } catch (loadError) {\n await origin.loaderHook.lifecycle.afterLoadEntry.emit({\n origin,\n remoteInfo,\n resourceContext,\n error: loadError,\n });\n throw loadError;\n }\n }\n\n return remoteEntryLoading;\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/runtime-core",
3
- "version": "2.9.0",
3
+ "version": "2.9.2",
4
4
  "type": "module",
5
5
  "author": "zhouxiao <codingzx@gmail.com>",
6
6
  "main": "./dist/index.cjs",
@@ -52,8 +52,8 @@
52
52
  }
53
53
  },
54
54
  "dependencies": {
55
- "@module-federation/sdk": "2.9.0",
56
- "@module-federation/error-codes": "2.9.0"
55
+ "@module-federation/sdk": "2.9.2",
56
+ "@module-federation/error-codes": "2.9.2"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "tsdown --config tsdown.config.ts",