@module-federation/runtime-core 2.8.1 → 2.9.0

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.
Files changed (67) hide show
  1. package/dist/core.cjs +4 -8
  2. package/dist/core.cjs.map +1 -1
  3. package/dist/core.d.ts +16 -14
  4. package/dist/core.js +4 -8
  5. package/dist/core.js.map +1 -1
  6. package/dist/global.cjs +17 -2
  7. package/dist/global.cjs.map +1 -1
  8. package/dist/global.d.ts +1 -0
  9. package/dist/global.js +16 -3
  10. package/dist/global.js.map +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/module/index.cjs +11 -9
  15. package/dist/module/index.cjs.map +1 -1
  16. package/dist/module/index.d.ts +3 -2
  17. package/dist/module/index.js +11 -9
  18. package/dist/module/index.js.map +1 -1
  19. package/dist/plugins/snapshot/SnapshotHandler.cjs +48 -5
  20. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
  21. package/dist/plugins/snapshot/SnapshotHandler.d.ts +23 -0
  22. package/dist/plugins/snapshot/SnapshotHandler.js +48 -5
  23. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
  24. package/dist/plugins/snapshot/index.cjs +31 -21
  25. package/dist/plugins/snapshot/index.cjs.map +1 -1
  26. package/dist/plugins/snapshot/index.js +31 -21
  27. package/dist/plugins/snapshot/index.js.map +1 -1
  28. package/dist/remote/index.cjs +1 -1
  29. package/dist/remote/index.cjs.map +1 -1
  30. package/dist/remote/index.d.ts +1 -0
  31. package/dist/remote/index.js +1 -1
  32. package/dist/remote/index.js.map +1 -1
  33. package/dist/shared/index.cjs +86 -27
  34. package/dist/shared/index.cjs.map +1 -1
  35. package/dist/shared/index.d.ts +19 -10
  36. package/dist/shared/index.js +86 -27
  37. package/dist/shared/index.js.map +1 -1
  38. package/dist/type/config.d.ts +9 -1
  39. package/dist/type/index.d.ts +3 -3
  40. package/dist/type/plugin.d.ts +4 -3
  41. package/dist/type/preload.d.ts +7 -1
  42. package/dist/types.d.ts +3 -3
  43. package/dist/utils/hooks/pluginSystem.cjs +6 -5
  44. package/dist/utils/hooks/pluginSystem.cjs.map +1 -1
  45. package/dist/utils/hooks/pluginSystem.d.ts +2 -5
  46. package/dist/utils/hooks/pluginSystem.js +6 -5
  47. package/dist/utils/hooks/pluginSystem.js.map +1 -1
  48. package/dist/utils/load.cjs +81 -20
  49. package/dist/utils/load.cjs.map +1 -1
  50. package/dist/utils/load.js +81 -20
  51. package/dist/utils/load.js.map +1 -1
  52. package/dist/utils/plugin.cjs +30 -7
  53. package/dist/utils/plugin.cjs.map +1 -1
  54. package/dist/utils/plugin.js +30 -7
  55. package/dist/utils/plugin.js.map +1 -1
  56. package/dist/utils/preload.cjs +21 -10
  57. package/dist/utils/preload.cjs.map +1 -1
  58. package/dist/utils/preload.d.ts +1 -1
  59. package/dist/utils/preload.js +21 -10
  60. package/dist/utils/preload.js.map +1 -1
  61. package/dist/utils/share.cjs +3 -2
  62. package/dist/utils/share.cjs.map +1 -1
  63. package/dist/utils/share.d.ts +3 -2
  64. package/dist/utils/share.js +3 -2
  65. package/dist/utils/share.js.map +1 -1
  66. package/package.json +3 -3
  67. package/dist/utils/hooks/index.d.ts +0 -5
@@ -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 },\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(remoteInfo, host, assets, true, {\n initiator: 'preloadRemote',\n id: preloadId,\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":";;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAa,gBAAb,MAA2B;CAgJzB,YAAY,MAAwB;eA5I5B,IAAI,aAAa;GACvB,sBAAsB,IAAI,kBAGvB,uBAAuB;GAC1B,gBAAgB,IAAI,kBAGjB,iBAAiB;GACpB,eAAe,IAAI,mBAIhB,gBAAgB;GACnB,kBAAkB,IAAI,UAapB,mBAAmB;GACrB,QAAQ,IAAI,UAeV,SAAS;GACX,iBAAiB,IAAI,UAgBnB,kBAAkB;GACpB,qBAAqB,IAAI,SAYvB,sBAAsB;GACxB,iBAAiB,IAAI,UAkBnB,kBAAkB;GACpB,qBAAqB,IAAI,UAQvB,sBAAsB;GACxB,uBAAuB,IAAI,UAYzB,wBAAwB;GAC1B,oBAAoB,IAAI,UAUtB,qBAAqB;GAEvB,WAAW,IAAI,WAUZ;GACJ,CAAC;AAGA,OAAK,OAAO;AACZ,OAAK,gBAAgB,EAAE;;CAGzB,wBAAwB,eAAwB,aAA0B;AAGxE,UAFoB,YAAY,WAAW,EAAE,EAE1B,QAAQ,KAAK,WAAW;AACzC,QAAK,eAAe,QAAQ,KAAK,EAAE,OAAO,OAAO,CAAC;AAClD,UAAO;KACN,cAAc,QAAQ;;CAG3B,iBAAiB,IAAY,iBAAkC;EAC7D,MAAM,EAAE,QAAQ,WAAW;EAC3B,MAAM,EAAE,MAAM,UAAU;AACxB,OAAK,cAAc,MAAM;GAAE,MAAM,OAAO;GAAM;GAAQ;AACtD,MAAI,SAAS,GAAG,WAAW,KAAK,EAAE;GAChC,MAAM,cAAc,GAAG,QAAQ,MAAM,MAAM;AAC3C,QAAK,cAAc,eAAe;IAAE,MAAM,OAAO;IAAM;IAAQ;AAC/D;;AAGF,MAAI,SAAS,GAAG,WAAW,MAAM,EAAE;GACjC,MAAM,aAAa,GAAG,QAAQ,OAAO,KAAK;AAC1C,QAAK,cAAc,cAAc;IAAE,MAAM,OAAO;IAAM;IAAQ;;;CAMlE,MAAM,WACJ,IACA,SACmB;EACnB,MAAM,EAAE,SAAS;EACjB,MAAM,iBAAiB,6BACrB,KAAK,QAAQ,SACb,GACD;EACD,IAAI,oBAAoB;EACxB,IAAI,iBAAiB,gBAAgB;EACrC,IAAI,iBAAiB,iBACjB,cAAc,eAAe,OAAO,GACpC;EACJ,IAAI;AAMJ,MAAI;GACF,MAAM,EAAE,cAAc,SAAS,WAAW,EACxC,aAAa,MACd;GAQD,MAAM,EAAE,QAAQ,eAAe,oBAC7B,MAAM,KAAK,0BAA0B,EACnC,IACD,CAAC;GACJ,MAAM,EACJ,gBACA,QACA,QACA,IAAI,OACJ,mBACE;AACJ,uBAAoB;AACpB,oBAAiB;AACjB,oBAAiB,cAAc,OAAO;GAEtC,MAAM,kBAAmB,MAAM,OAAO,IACpC,OACA,QACA,SACA,eACD;GAED,MAAM,gBAAgB,MAAM,KAAK,MAAM,UAAU,OAAO,KAAK;IAC3D,IAAI;IACJ;IACA;IACA,cAAc,cAAc,kBAAkB;IAC9C,qBAAqB,cAAc,SAAY;IAC/C;IACA,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACT,CAAC;AAEF,QAAK,iBAAiB,IAAI,gBAAgB;AAC1C,yBAAsB;IACpB,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR;IACA,QAAQ;IACT;AAED,OAAI,OAAO,kBAAkB,WAC3B,QAAO;AAGT,UAAO;WACA,OAAO;GACd,MAAM,EAAE,OAAO,cAAc,WAAW,EAAE,MAAM,WAAW;GAE3D,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK;KACzD;KACA;KACA;KACA,WAAW;KACX,QAAQ;KACR,QAAQ;KACR,QAAQ;KACT,CAAC;YACK,WAAW;AAClB,0BAAsB;KACpB,IAAI;KACJ,QAAQ;KACR,QAAQ;KACR;KACA,OAAO;KACP,QAAQ;KACT;AACD,UAAM;;AAGR,OAAI,CAAC,UAAU;AACb,0BAAsB;KACpB,IAAI;KACJ,QAAQ;KACR,QAAQ;KACR;KACA;KACA,QAAQ;KACT;AACD,UAAM;;AAGR,yBAAsB;IACpB,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR;IACA;IACA,QAAQ;IACR,WAAW;IACZ;AAED,UAAO;YACC;AACR,OAAI,oBACF,OAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK,oBAAoB;;;CAM1E,MAAM,cAAc,gBAAyD;EAC3E,MAAM,EAAE,SAAS;EACjB,MAAM,iBAAwC,EAAE;AAEhD,QAAM,KAAK,MAAM,UAAU,oBAAoB,KAAK;GAClD,YAAY;GACZ,SAAS,KAAK;GACd,QAAQ;GACT,CAAC;EAEF,MAAM,aAA6B,kBACjC,KAAK,QAAQ,SACb,eACD;EAED,MAAM,yBAAyB,QAAgC;GAC7D,MAAM,EAAE,eAAe,WAAW;GAClC,MAAM,UAAU,cAAc,WAAW,EAAE;AAE3C,OAAI,CAAC,QAAQ,OACX,QAAO,CACL;IACE;IACA,IAAI,GAAG,OAAO,KAAK;IACpB,CACF;AAGH,UAAO,QAAQ,KAAK,YAAY;IAC9B,KAAK;KACH,GAAG;KACH,eAAe;MACb,GAAG;MACH,SAAS,CAAC,OAAO;MAClB;KACF;IACD,IAAI,uBAAuB,OAAO,MAAM,OAAO;IAChD,EAAE;;EAGL,IAAI;AAEJ,QAAM,QAAQ,IACZ,WAAW,QAAQ,sBAAsB,CAAC,IAAI,OAAO,aAAa;GAChE,MAAM,EAAE,KAAK,IAAI,cAAc;GAC/B,MAAM,EAAE,QAAQ,kBAAkB;GAClC,MAAM,aAAa,cAAc,OAAO;AACxC,OAAI;IACF,MAAM,EAAE,gBAAgB,mBACtB,MAAM,KAAK,gBAAgB,uBAAuB;KAChD,YAAY;KACZ,IAAI;KACJ,WAAW;KACZ,CAAC;IAEJ,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU,sBAAsB,KAAK;KACnE,QAAQ;KACR,gBAAgB;KAChB;KACA;KACA;KACA;KACD,CAAC;AACF,QAAI,CAAC,OACH;IAEF,MAAM,UAAU,MAAM,cAAc,YAAY,MAAM,QAAQ,MAAM;KAClE,WAAW;KACX,IAAI;KACL,CAAC;AACF,mBAAe,KAAK;KAClB;KACA;KACA;KACA,IAAI;KACJ;KACD,CAAC;YACK,OAAO;AACd,mBAAe,KAAK;KAClB;KACA;KACA;KACA,IAAI;KACJ,SAAS,CACP;MACE,KAAK,WAAW;MAChB,QAAQ;MACR,cAAc,oBAAoB,KAAK,WAAW,MAAM,GACpD,aACA;MACJ,WAAW;MACX,IAAI;MACJ;MACD,CACF;KACF,CAAC;;IAEJ,CACH;EAED,MAAM,gBAAgB,eAAe,SAAS,kBAC5C,cAAc,QAAQ,QACnB,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,UAC5D,CACF;AACD,MAAI,cAAc,SAAS,GAAG;AAC5B,kCAAe,IAAI,MACjB,gCAAgC,cAAc,OAAO,eACtD;AACD,UAAO,OAAO,cAAc;IAC1B,SAAS;IACT;IACD,CAAC;;AAGJ,QAAM,KAAK,MAAM,UAAU,mBAAmB,KAAK;GACjD,YAAY;GACZ,SAAS,KAAK;GACd,QAAQ;GACR,SAAS;GACT,OAAO;GACR,CAAC;AAEF,MAAI,aACF,OAAM;;CAIV,gBAAgB,SAAmB,SAAqC;EACtE,MAAM,EAAE,SAAS;AACjB,UAAQ,SAAS,WAAW;AAC1B,QAAK,eAAe,QAAQ,KAAK,QAAQ,SAAS,EAChD,OAAO,SAAS,OACjB,CAAC;IACF;;CAGJ,iBACE,MACA,KACA,WACQ;EACR,MAAM,EAAE,SAAS;EAEjB,MAAM,SAAS,IAAIA,SAAO;GAAE;GAAM,YADf,cAAc;IAAE;IAAM,OAAO;IAAK,CAAC;GACR,CAAC;AAE/C,SAAO,qBAAqB;AAC5B,OAAK,YAAY,IAAI,MAAM,OAAO;AAElC,SAAO;;CAGT,MAAM,0BAA0B,SAI7B;EACD,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,OAAO;EACf,IAAI;AAEJ,MAAI;AACF,oBAAiB,MAAM,KAAK,MAAM,UAAU,cAAc,KAAK;IAC7D;IACA,SAAS,KAAK;IACd,QAAQ;IACT,CAAC;WACK,OAAO;AACd,oBAAkB,MAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK;IAChE;IACA,SAAS,KAAK;IACd,QAAQ;IACR,MAAM;IACN;IACA,WAAW;IACZ,CAAC;AAMF,OAAI,CAAC,eACH,OAAM;;EAIV,MAAM,EAAE,IAAI,UAAU;EAEtB,MAAM,kBAAkB,6BACtB,KAAK,QAAQ,SACb,MACD;AACD,MAAI,CAAC,gBACH,KAAI;AACF,SACE,aACA,gBACA;IACE,UAAU,KAAK,QAAQ;IACvB,WAAW;IACZ,EACD,QACA,mBAAmB,KAAK,QAAQ,CACjC;WACM,YAAY;AACnB,SAAM,KAAK,MAAM,UAAU,iBAAiB,KAAK;IAC/C,IAAI;IACJ,SAAS,KAAK;IACd,OAAO;IACP,QAAQ;IACT,CAAC;AACF,SAAM;;EAIV,MAAM,EAAE,QAAQ,cAAc;EAC9B,MAAM,aAAa,cAAc,UAAU;AAC3C,QAAM,KAAK,MAAM,UAAU,iBAAiB,KAAK;GAC/C,IAAI;GACJ,GAAG;GACH,SAAS,KAAK;GACd;GACA,QAAQ;GACT,CAAC;EACF,MAAM,YACJ,MAAM,KAAK,cAAc,MAAM,UAAU,aAAa,KAAK;GACzD,IAAI;GACJ,GAAG;GACH,SAAS,KAAK;GACd,QAAQ;GACR;GACD,CAAC;EAEJ,MAAM,EAAE,QAAQ,WAAW;AAC3B,SACE,UAAU,QACV,yHAAyH,MAAM,GAChI;EACD,IAAI,SAA6B,KAAK,YAAY,IAAI,OAAO,KAAK;EAElE,MAAM,gBAA+B;GAC7B;GACN;GACD;AAED,MAAI,CAAC,QAAQ;AACX,YAAS,IAAIA,SAAO,cAAc;AAClC,QAAK,YAAY,IAAI,OAAO,MAAM,OAAO;;AAE3C,SAAO;GACL;GACA;GACA,iBAAiB;GAClB;;CAGH,eACE,QACA,eACA,SACM;EACN,MAAM,EAAE,SAAS;EACjB,MAAM,wBAAwB;AAC5B,OAAI,OAAO,OAAO;IAGhB,MAAM,YAAY,cAAc,MAC7B,SACC,OAAO,UACN,KAAK,KAAK,WAAW,OAAO,MAAM,IACjC,KAAK,OAAO,WAAW,OAAO,MAAM,EACzC;AACD,WACE,CAAC,WACD,aAAa,OAAO,MAAM,aACxB,OAAO,KACR,sCACC,aAAa,UAAU,KACxB,gBACF;;AAGH,OAAI,WAAW,QACb;QACE,qBACA,OAAO,WAAW,eAClB,CAAC,OAAO,MAAM,WAAW,OAAO,CAEhC,QAAO,QAAQ,IAAI,IAAI,OAAO,OAAO,OAAO,SAAS,OAAO,CAAC;;AAGjE,OAAI,CAAC,OAAO,WACV,QAAO,aAAa;AAEtB,OAAI,CAAC,OAAO,KACV,QAAO,OAAO;;AAGlB,OAAK,MAAM,UAAU,qBAAqB,KAAK;GAAE;GAAQ,QAAQ;GAAM,CAAC;EACxE,MAAM,mBAAmB,cAAc,MACpC,SAAS,KAAK,SAAS,OAAO,KAChC;AACD,MAAI,CAAC,kBAAkB;AACrB,oBAAiB;AACjB,iBAAc,KAAK,OAAO;AAC1B,QAAK,MAAM,UAAU,eAAe,KAAK;IAAE;IAAQ,QAAQ;IAAM,CAAC;SAC7D;GACL,MAAM,WAAW,CACf,eAAe,OAAO,KAAK,2BAC3B,8DACD;AACD,OAAI,SAAS,OAAO;AAElB,SAAK,aAAa,iBAAiB;AACnC,qBAAiB;AACjB,kBAAc,KAAK,OAAO;AAC1B,SAAK,MAAM,UAAU,eAAe,KAAK;KAAE;KAAQ,QAAQ;KAAM,CAAC;AAClE,SAAK,SAAS,KAAK,IAAI,CAAC;;;;CAK9B,AAAQ,aAAa,QAAsB;AACzC,MAAI;GACF,MAAM,EAAE,SAAS;GACjB,MAAM,EAAE,SAAS;GACjB,MAAM,cAAc,KAAK,QAAQ,QAAQ,WACtC,SAAS,KAAK,SAAS,KACzB;AACD,OAAI,gBAAgB,GAClB,MAAK,QAAQ,QAAQ,OAAO,aAAa,EAAE;GAE7C,MAAM,oBAAoB,mBACxB,cAAc,eAAe,YAC7B,QAAQ,OAAO,CAChB,CAAC;AACF,UAAO,cAAc,eAAe,WAAW;AAE/C,OAAI,WAAW,QAAQ;AACrB,SAAK,gBAAgB,cAAc,OAAO,OAAO,MAAM;AACvD,WAAO,OAAO,eAAe,qBAAqB,OAAO;;GAG3D,MAAM,EAAE,uBAAuB,oBAAoB,QAAQ,KAAK;AAChE,OAAI,oBAAoB;IACtB,MAAM,YACJ,sBACA,iBAAiB,sBACjB,mBAAmB,eACnB,mBAAmB,mBAAmB,aAAa,OAAO,KAAK,CAAC;AAClE,QAAI,UACF,QAAO,mBAAmB,YAAY;;GAI1C,MAAM,eAAe,KAAK,YAAY,IAAI,OAAO,KAAK;AACtD,OAAI,cAAc;IAChB,MAAM,aAAa,aAAa;IAChC,MAAM,MAAM,WAAW;AAEvB,QAAI,cAAc,KAChB,KACE,OAAO,yBAAyB,eAAe,IAAI,EAAE,aAErD,QAAO,cAAc;QAGrB,eAAc,OAAO;IAGzB,MAAM,uBAAuB,wBAC3B,aAAa,WACd;AAED,QAAI,cAAc,sBAChB,QAAO,cAAc;IAIvB,IAAI,cAAc,WAAW,eACzB,wBAAwB,WAAW,MAAM,WAAW,aAAa,GACjE,WAAW;IACf,MAAM,iBACJ,cAAc,eAAe,cAAc,WAAW,QAAQ;AAC5D,SAAI,WAAW,aACb,QAAO,IAAI,QAAQ,OAAO;SAE1B,QAAO,IAAI,SAAS;MAEtB;AACJ,QAAI,mBAAmB,IAAI;KACzB,MAAM,YACJ,cAAc,eAAe,cAAc;AAC7C,mBAAc,UAAU,QAAQ,MAAM;KACtC,MAAM,sBAAsB,qBAAqB;KAEjD,IAAI,qBAAqB;KACzB,MAAM,iBAA0D,EAAE;AAClE,YAAO,KAAK,oBAAoB,CAAC,SAAS,WAAW;MACnD,MAAM,gBAAgB,oBAAoB;AAC1C,uBACE,OAAO,KAAK,cAAc,CAAC,SAAS,eAAe;OACjD,MAAM,gBAAgB,cAAc;AACpC,wBACE,OAAO,KAAK,cAAc,CAAC,SAAS,cAAc;QAChD,MAAM,aAAa,cAAc;AACjC,sBACE,OAAO,KAAK,WAAW,CAAC,SAAS,iBAAiB;SAChD,MAAM,SAAS,WAAW;AAC1B,aACE,UACA,OAAO,WAAW,YAClB,OAAO,SAAS,WAAW,KAE3B,KAAI,OAAO,UAAU,OAAO,SAAS;AACnC,iBAAO,QAAQ,OAAO,MAAM,QACzB,iBACC,iBAAiB,WAAW,KAC/B;AACD,cAAI,OAAO,MAAM,OACf,sBAAqB;cAErB,gBAAe,KAAK;WAClB;WACA;WACA;WACA;WACD,CAAC;eAGJ,gBAAe,KAAK;UAClB;UACA;UACA;UACA;UACD,CAAC;UAGN;SACJ;QACJ;OACJ;AAEF,SAAI,oBAAoB;AACtB,gBAAU,gBAAgB,EAAE;AAC5B,aAAO,oBAAoB;;AAE7B,oBAAe,SACZ,CAAC,OAAO,YAAY,WAAW,kBAAkB;AAChD,aAAO,oBAAoB,SAAS,cAAc,aAChD;OAGL;AACD,mBAAc,eAAe,cAAc,OAAO,gBAAgB,EAAE;;AAGtE,SAAK,YAAY,OAAO,OAAO,KAAK;;WAE/B,KAAK;AACZ,UAAO,MACL,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACzE"}
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":";;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAa,gBAAb,MAA2B;CAiJzB,YAAY,MAAwB;eA7I5B,IAAI,aAAa;GACvB,sBAAsB,IAAI,kBAGvB,uBAAuB;GAC1B,gBAAgB,IAAI,kBAGjB,iBAAiB;GACpB,eAAe,IAAI,mBAIhB,gBAAgB;GACnB,kBAAkB,IAAI,UAapB,mBAAmB;GACrB,QAAQ,IAAI,UAeV,SAAS;GACX,iBAAiB,IAAI,UAgBnB,kBAAkB;GACpB,qBAAqB,IAAI,SAYvB,sBAAsB;GACxB,iBAAiB,IAAI,UAkBnB,kBAAkB;GACpB,qBAAqB,IAAI,UAQvB,sBAAsB;GACxB,uBAAuB,IAAI,UAYzB,wBAAwB;GAC1B,oBAAoB,IAAI,UAUtB,qBAAqB;GAEvB,WAAW,IAAI,WAWZ;GACJ,CAAC;AAGA,OAAK,OAAO;AACZ,OAAK,gBAAgB,EAAE;;CAGzB,wBAAwB,eAAwB,aAA0B;AAGxE,UAFoB,YAAY,WAAW,EAAE,EAE1B,QAAQ,KAAK,WAAW;AACzC,QAAK,eAAe,QAAQ,KAAK,EAAE,OAAO,OAAO,CAAC;AAClD,UAAO;KACN,cAAc,QAAQ;;CAG3B,iBAAiB,IAAY,iBAAkC;EAC7D,MAAM,EAAE,QAAQ,WAAW;EAC3B,MAAM,EAAE,MAAM,UAAU;AACxB,OAAK,cAAc,MAAM;GAAE,MAAM,OAAO;GAAM;GAAQ;AACtD,MAAI,SAAS,GAAG,WAAW,KAAK,EAAE;GAChC,MAAM,cAAc,GAAG,QAAQ,MAAM,MAAM;AAC3C,QAAK,cAAc,eAAe;IAAE,MAAM,OAAO;IAAM;IAAQ;AAC/D;;AAGF,MAAI,SAAS,GAAG,WAAW,MAAM,EAAE;GACjC,MAAM,aAAa,GAAG,QAAQ,OAAO,KAAK;AAC1C,QAAK,cAAc,cAAc;IAAE,MAAM,OAAO;IAAM;IAAQ;;;CAMlE,MAAM,WACJ,IACA,SACmB;EACnB,MAAM,EAAE,SAAS;EACjB,MAAM,iBAAiB,6BACrB,KAAK,QAAQ,SACb,GACD;EACD,IAAI,oBAAoB;EACxB,IAAI,iBAAiB,gBAAgB;EACrC,IAAI,iBAAiB,iBACjB,cAAc,eAAe,OAAO,GACpC;EACJ,IAAI;AAMJ,MAAI;GACF,MAAM,EAAE,cAAc,SAAS,WAAW,EACxC,aAAa,MACd;GAQD,MAAM,EAAE,QAAQ,eAAe,oBAC7B,MAAM,KAAK,0BAA0B,EACnC,IACD,CAAC;GACJ,MAAM,EACJ,gBACA,QACA,QACA,IAAI,OACJ,mBACE;AACJ,uBAAoB;AACpB,oBAAiB;AACjB,oBAAiB,cAAc,OAAO;GAEtC,MAAM,kBAAmB,MAAM,OAAO,IACpC,OACA,QACA,SACA,eACD;GAED,MAAM,gBAAgB,MAAM,KAAK,MAAM,UAAU,OAAO,KAAK;IAC3D,IAAI;IACJ;IACA;IACA,cAAc,cAAc,kBAAkB;IAC9C,qBAAqB,cAAc,SAAY;IAC/C;IACA,SAAS;IACT,gBAAgB;IAChB,QAAQ;IACT,CAAC;AAEF,QAAK,iBAAiB,IAAI,gBAAgB;AAC1C,yBAAsB;IACpB,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR;IACA,QAAQ;IACT;AAED,OAAI,OAAO,kBAAkB,WAC3B,QAAO;AAGT,UAAO;WACA,OAAO;GACd,MAAM,EAAE,OAAO,cAAc,WAAW,EAAE,MAAM,WAAW;GAE3D,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK;KACzD;KACA;KACA;KACA,WAAW;KACX,QAAQ;KACR,QAAQ;KACR,QAAQ;KACT,CAAC;YACK,WAAW;AAClB,0BAAsB;KACpB,IAAI;KACJ,QAAQ;KACR,QAAQ;KACR;KACA,OAAO;KACP,QAAQ;KACT;AACD,UAAM;;AAGR,OAAI,CAAC,UAAU;AACb,0BAAsB;KACpB,IAAI;KACJ,QAAQ;KACR,QAAQ;KACR;KACA;KACA,QAAQ;KACT;AACD,UAAM;;AAGR,yBAAsB;IACpB,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR;IACA;IACA,QAAQ;IACR,WAAW;IACZ;AAED,UAAO;YACC;AACR,OAAI,oBACF,OAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK,oBAAoB;;;CAM1E,MAAM,cAAc,gBAAyD;EAC3E,MAAM,EAAE,SAAS;EACjB,MAAM,iBAAwC,EAAE;AAEhD,QAAM,KAAK,MAAM,UAAU,oBAAoB,KAAK;GAClD,YAAY;GACZ,SAAS,KAAK;GACd,QAAQ;GACT,CAAC;EAEF,MAAM,aAA6B,kBACjC,KAAK,QAAQ,SACb,eACD;EAED,MAAM,yBAAyB,QAAgC;GAC7D,MAAM,EAAE,eAAe,WAAW;GAClC,MAAM,UAAU,cAAc,WAAW,EAAE;AAE3C,OAAI,CAAC,QAAQ,OACX,QAAO,CACL;IACE;IACA,IAAI,GAAG,OAAO,KAAK;IACpB,CACF;AAGH,UAAO,QAAQ,KAAK,YAAY;IAC9B,KAAK;KACH,GAAG;KACH,eAAe;MACb,GAAG;MACH,SAAS,CAAC,OAAO;MAClB;KACF;IACD,IAAI,uBAAuB,OAAO,MAAM,OAAO;IAChD,EAAE;;EAGL,IAAI;AAEJ,QAAM,QAAQ,IACZ,WAAW,QAAQ,sBAAsB,CAAC,IAAI,OAAO,aAAa;GAChE,MAAM,EAAE,KAAK,IAAI,cAAc;GAC/B,MAAM,EAAE,QAAQ,kBAAkB;GAClC,MAAM,aAAa,cAAc,OAAO;AACxC,OAAI;IACF,MAAM,EAAE,gBAAgB,mBACtB,MAAM,KAAK,gBAAgB,uBAAuB;KAChD,YAAY;KACZ,IAAI;KACJ,WAAW;KACZ,CAAC;IAEJ,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU,sBAAsB,KAAK;KACnE,QAAQ;KACR,gBAAgB;KAChB;KACA;KACA;KACA;KACD,CAAC;AACF,QAAI,CAAC,OACH;IAEF,MAAM,UAAU,MAAM,cACpB,YACA,MACA,QACA,MACA;KACE,WAAW;KACX,IAAI;KACL,EACD,cAAc,sBACf;AACD,mBAAe,KAAK;KAClB;KACA;KACA;KACA,IAAI;KACJ;KACD,CAAC;YACK,OAAO;AACd,mBAAe,KAAK;KAClB;KACA;KACA;KACA,IAAI;KACJ,SAAS,CACP;MACE,KAAK,WAAW;MAChB,QAAQ;MACR,cAAc,oBAAoB,KAAK,WAAW,MAAM,GACpD,aACA;MACJ,WAAW;MACX,IAAI;MACJ;MACD,CACF;KACF,CAAC;;IAEJ,CACH;EAED,MAAM,gBAAgB,eAAe,SAAS,kBAC5C,cAAc,QAAQ,QACnB,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,UAC5D,CACF;AACD,MAAI,cAAc,SAAS,GAAG;AAC5B,kCAAe,IAAI,MACjB,gCAAgC,cAAc,OAAO,eACtD;AACD,UAAO,OAAO,cAAc;IAC1B,SAAS;IACT;IACD,CAAC;;AAGJ,QAAM,KAAK,MAAM,UAAU,mBAAmB,KAAK;GACjD,YAAY;GACZ,SAAS,KAAK;GACd,QAAQ;GACR,SAAS;GACT,OAAO;GACR,CAAC;AAEF,MAAI,aACF,OAAM;;CAIV,gBAAgB,SAAmB,SAAqC;EACtE,MAAM,EAAE,SAAS;AACjB,UAAQ,SAAS,WAAW;AAC1B,QAAK,eAAe,QAAQ,KAAK,QAAQ,SAAS,EAChD,OAAO,SAAS,OACjB,CAAC;IACF;;CAGJ,iBACE,MACA,KACA,WACQ;EACR,MAAM,EAAE,SAAS;EAEjB,MAAM,SAAS,IAAIA,SAAO;GAAE;GAAM,YADf,cAAc;IAAE;IAAM,OAAO;IAAK,CAAC;GACR,CAAC;AAE/C,SAAO,qBAAqB;AAC5B,OAAK,YAAY,IAAI,MAAM,OAAO;AAElC,SAAO;;CAGT,MAAM,0BAA0B,SAI7B;EACD,MAAM,EAAE,SAAS;EACjB,MAAM,EAAE,OAAO;EACf,IAAI;AAEJ,MAAI;AACF,oBAAiB,MAAM,KAAK,MAAM,UAAU,cAAc,KAAK;IAC7D;IACA,SAAS,KAAK;IACd,QAAQ;IACT,CAAC;WACK,OAAO;AACd,oBAAkB,MAAM,KAAK,MAAM,UAAU,gBAAgB,KAAK;IAChE;IACA,SAAS,KAAK;IACd,QAAQ;IACR,MAAM;IACN;IACA,WAAW;IACZ,CAAC;AAMF,OAAI,CAAC,eACH,OAAM;;EAIV,MAAM,EAAE,IAAI,UAAU;EAEtB,MAAM,kBAAkB,6BACtB,KAAK,QAAQ,SACb,MACD;AACD,MAAI,CAAC,gBACH,KAAI;AACF,SACE,aACA,gBACA;IACE,UAAU,KAAK,QAAQ;IACvB,WAAW;IACZ,EACD,QACA,mBAAmB,KAAK,QAAQ,CACjC;WACM,YAAY;AACnB,SAAM,KAAK,MAAM,UAAU,iBAAiB,KAAK;IAC/C,IAAI;IACJ,SAAS,KAAK;IACd,OAAO;IACP,QAAQ;IACT,CAAC;AACF,SAAM;;EAIV,MAAM,EAAE,QAAQ,cAAc;EAC9B,MAAM,aAAa,cAAc,UAAU;AAC3C,QAAM,KAAK,MAAM,UAAU,iBAAiB,KAAK;GAC/C,IAAI;GACJ,GAAG;GACH,SAAS,KAAK;GACd;GACA,QAAQ;GACT,CAAC;EACF,MAAM,YACJ,MAAM,KAAK,cAAc,MAAM,UAAU,aAAa,KAAK;GACzD,IAAI;GACJ,GAAG;GACH,SAAS,KAAK;GACd,QAAQ;GACR;GACD,CAAC;EAEJ,MAAM,EAAE,QAAQ,WAAW;AAC3B,SACE,UAAU,QACV,yHAAyH,MAAM,GAChI;EACD,IAAI,SAA6B,KAAK,YAAY,IAAI,OAAO,KAAK;EAElE,MAAM,gBAA+B;GAC7B;GACN;GACD;AAED,MAAI,CAAC,QAAQ;AACX,YAAS,IAAIA,SAAO,cAAc;AAClC,QAAK,YAAY,IAAI,OAAO,MAAM,OAAO;;AAE3C,SAAO;GACL;GACA;GACA,iBAAiB;GAClB;;CAGH,eACE,QACA,eACA,SACM;EACN,MAAM,EAAE,SAAS;EACjB,MAAM,wBAAwB;AAC5B,OAAI,OAAO,OAAO;IAGhB,MAAM,YAAY,cAAc,MAC7B,SACC,OAAO,UACN,KAAK,KAAK,WAAW,OAAO,MAAM,IACjC,KAAK,OAAO,WAAW,OAAO,MAAM,EACzC;AACD,WACE,CAAC,WACD,aAAa,OAAO,MAAM,aACxB,OAAO,KACR,sCACC,aAAa,UAAU,KACxB,gBACF;;AAGH,OAAI,WAAW,QACb;QACE,qBACA,OAAO,WAAW,eAClB,CAAC,OAAO,MAAM,WAAW,OAAO,CAEhC,QAAO,QAAQ,IAAI,IAAI,OAAO,OAAO,OAAO,SAAS,OAAO,CAAC;;AAGjE,OAAI,CAAC,OAAO,WACV,QAAO,aAAa;AAEtB,OAAI,CAAC,OAAO,KACV,QAAO,OAAO;;AAGlB,OAAK,MAAM,UAAU,qBAAqB,KAAK;GAAE;GAAQ,QAAQ;GAAM,CAAC;EACxE,MAAM,mBAAmB,cAAc,MACpC,SAAS,KAAK,SAAS,OAAO,KAChC;AACD,MAAI,CAAC,kBAAkB;AACrB,oBAAiB;AACjB,iBAAc,KAAK,OAAO;AAC1B,QAAK,MAAM,UAAU,eAAe,KAAK;IAAE;IAAQ,QAAQ;IAAM,CAAC;SAC7D;GACL,MAAM,WAAW,CACf,eAAe,OAAO,KAAK,2BAC3B,8DACD;AACD,OAAI,SAAS,OAAO;AAElB,SAAK,aAAa,iBAAiB;AACnC,qBAAiB;AACjB,kBAAc,KAAK,OAAO;AAC1B,SAAK,MAAM,UAAU,eAAe,KAAK;KAAE;KAAQ,QAAQ;KAAM,CAAC;AAClE,SAAK,SAAS,KAAK,IAAI,CAAC;;;;CAK9B,AAAQ,aAAa,QAAsB;AACzC,MAAI;GACF,MAAM,EAAE,SAAS;GACjB,MAAM,EAAE,SAAS;GACjB,MAAM,cAAc,KAAK,QAAQ,QAAQ,WACtC,SAAS,KAAK,SAAS,KACzB;AACD,OAAI,gBAAgB,GAClB,MAAK,QAAQ,QAAQ,OAAO,aAAa,EAAE;GAE7C,MAAM,oBAAoB,mBACxB,cAAc,eAAe,YAC7B,QAAQ,OAAO,CAChB,CAAC;AACF,UAAO,cAAc,eAAe,WAAW;AAE/C,OAAI,WAAW,QAAQ;AACrB,SAAK,gBAAgB,cAAc,OAAO,OAAO,MAAM;AACvD,WAAO,OAAO,eAAe,qBAAqB,OAAO;;GAG3D,MAAM,EAAE,uBAAuB,oBAAoB,QAAQ,KAAK;AAChE,OAAI,oBAAoB;IACtB,MAAM,YACJ,sBACA,iBAAiB,sBACjB,mBAAmB,eACnB,mBAAmB,mBAAmB,aAAa,OAAO,KAAK,CAAC;AAClE,QAAI,UACF,QAAO,mBAAmB,YAAY;;GAI1C,MAAM,eAAe,KAAK,YAAY,IAAI,OAAO,KAAK;AACtD,OAAI,cAAc;IAChB,MAAM,aAAa,aAAa;IAChC,MAAM,MAAM,WAAW;AAEvB,QAAI,cAAc,KAChB,KACE,OAAO,yBAAyB,eAAe,IAAI,EAAE,aAErD,QAAO,cAAc;QAGrB,eAAc,OAAO;IAGzB,MAAM,uBAAuB,wBAC3B,aAAa,WACd;AAED,QAAI,cAAc,sBAChB,QAAO,cAAc;IAIvB,IAAI,cAAc,WAAW,eACzB,wBAAwB,WAAW,MAAM,WAAW,aAAa,GACjE,WAAW;IACf,MAAM,iBACJ,cAAc,eAAe,cAAc,WAAW,QAAQ;AAC5D,SAAI,WAAW,aACb,QAAO,IAAI,QAAQ,OAAO;SAE1B,QAAO,IAAI,SAAS;MAEtB;AACJ,QAAI,mBAAmB,IAAI;KACzB,MAAM,YACJ,cAAc,eAAe,cAAc;AAC7C,mBAAc,UAAU,QAAQ,MAAM;KACtC,MAAM,sBAAsB,qBAAqB;KAEjD,IAAI,qBAAqB;KACzB,MAAM,iBAA0D,EAAE;AAClE,YAAO,KAAK,oBAAoB,CAAC,SAAS,WAAW;MACnD,MAAM,gBAAgB,oBAAoB;AAC1C,uBACE,OAAO,KAAK,cAAc,CAAC,SAAS,eAAe;OACjD,MAAM,gBAAgB,cAAc;AACpC,wBACE,OAAO,KAAK,cAAc,CAAC,SAAS,cAAc;QAChD,MAAM,aAAa,cAAc;AACjC,sBACE,OAAO,KAAK,WAAW,CAAC,SAAS,iBAAiB;SAChD,MAAM,SAAS,WAAW;AAC1B,aACE,UACA,OAAO,WAAW,YAClB,OAAO,SAAS,WAAW,KAE3B,KAAI,OAAO,UAAU,OAAO,SAAS;AACnC,iBAAO,QAAQ,OAAO,MAAM,QACzB,iBACC,iBAAiB,WAAW,KAC/B;AACD,cAAI,OAAO,MAAM,OACf,sBAAqB;cAErB,gBAAe,KAAK;WAClB;WACA;WACA;WACA;WACD,CAAC;eAGJ,gBAAe,KAAK;UAClB;UACA;UACA;UACA;UACD,CAAC;UAGN;SACJ;QACJ;OACJ;AAEF,SAAI,oBAAoB;AACtB,gBAAU,gBAAgB,EAAE;AAC5B,aAAO,oBAAoB;;AAE7B,oBAAe,SACZ,CAAC,OAAO,YAAY,WAAW,kBAAkB;AAChD,aAAO,oBAAoB,SAAS,cAAc,aAChD;OAGL;AACD,mBAAc,eAAe,cAAc,OAAO,gBAAgB,EAAE;;AAGtE,SAAK,YAAY,OAAO,OAAO,KAAK;;WAE/B,KAAK;AACZ,UAAO,MACL,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACzE"}
@@ -16,6 +16,7 @@ var SharedHandler = class {
16
16
  constructor(host) {
17
17
  this.hooks = new require_pluginSystem.PluginSystem({
18
18
  beforeRegisterShare: new require_syncWaterfallHook.SyncWaterfallHook("beforeRegisterShare"),
19
+ afterRegisterShare: new require_syncHook.SyncHook("afterRegisterShare"),
19
20
  afterResolve: new require_asyncWaterfallHooks.AsyncWaterfallHook("afterResolve"),
20
21
  beforeLoadShare: new require_asyncWaterfallHooks.AsyncWaterfallHook("beforeLoadShare"),
21
22
  loadShare: new require_asyncHook.AsyncHook(),
@@ -29,7 +30,15 @@ var SharedHandler = class {
29
30
  this.initTokens = {};
30
31
  this._setGlobalShareScopeMap(host.options);
31
32
  }
32
- emitAfterLoadShare({ lifecycle, pkgName, shareInfo, selectedShared }) {
33
+ emitAfterRegisterShare(pkgName, input) {
34
+ this.hooks.lifecycle.afterRegisterShare.emit({
35
+ pkgName,
36
+ ...input,
37
+ shareScopeMap: this.shareScopeMap,
38
+ origin: this.host
39
+ });
40
+ }
41
+ emitAfterLoadShare({ lifecycle, pkgName, shareInfo, selectedShared, loadContext }) {
33
42
  try {
34
43
  this.hooks.lifecycle.afterLoadShare.emit({
35
44
  pkgName,
@@ -38,13 +47,14 @@ var SharedHandler = class {
38
47
  shared: this.host.options.shared,
39
48
  shareScopeMap: this.shareScopeMap,
40
49
  lifecycle,
50
+ loadContext,
41
51
  origin: this.host
42
52
  });
43
53
  } catch (error) {
44
54
  require_logger.warn(error);
45
55
  }
46
56
  }
47
- emitErrorLoadShare({ lifecycle, pkgName, shareInfo, error, recovered }) {
57
+ emitErrorLoadShare({ lifecycle, pkgName, shareInfo, error, recovered, loadContext }) {
48
58
  try {
49
59
  this.hooks.lifecycle.errorLoadShare.emit({
50
60
  pkgName,
@@ -54,7 +64,8 @@ var SharedHandler = class {
54
64
  lifecycle,
55
65
  origin: this.host,
56
66
  error,
57
- recovered
67
+ recovered,
68
+ loadContext
58
69
  });
59
70
  } catch (hookError) {
60
71
  require_logger.warn(hookError);
@@ -70,7 +81,9 @@ var SharedHandler = class {
70
81
  pkgName: sharedKey,
71
82
  shared: sharedVal
72
83
  });
73
- if (!this.shareScopeMap[sc]?.[sharedKey]) this.setShared({
84
+ const registeredShared = this.shareScopeMap[sc]?.[sharedKey];
85
+ const previousAtVersion = registeredShared?.[sharedVal.version];
86
+ if (!registeredShared) this.setShared({
74
87
  pkgName: sharedKey,
75
88
  lib: sharedVal.lib,
76
89
  get: sharedVal.get,
@@ -78,6 +91,13 @@ var SharedHandler = class {
78
91
  shared: sharedVal,
79
92
  from: userOptions.name
80
93
  });
94
+ this.emitAfterRegisterShare(sharedKey, {
95
+ scope: sc,
96
+ shared: sharedVal,
97
+ previousShared: previousAtVersion,
98
+ registeredShared: this.shareScopeMap[sc]?.[sharedKey]?.[sharedVal.version],
99
+ trigger: "runtime"
100
+ });
81
101
  });
82
102
  });
83
103
  });
@@ -88,6 +108,7 @@ var SharedHandler = class {
88
108
  }
89
109
  async loadShare(pkgName, extraOptions) {
90
110
  const { host } = this;
111
+ let loadContext = extraOptions?.context;
91
112
  const shareOptions = require_share.getTargetSharedOptions({
92
113
  pkgName,
93
114
  extraOptions,
@@ -96,17 +117,23 @@ var SharedHandler = class {
96
117
  let shareOptionsRes = shareOptions;
97
118
  try {
98
119
  if (shareOptions?.scope) await Promise.all(shareOptions.scope.map(async (shareScope) => {
99
- await Promise.all(this.initializeSharing(shareScope, { strategy: shareOptions.strategy }));
120
+ await Promise.all(this.initializeSharing(shareScope, {
121
+ strategy: shareOptions.strategy,
122
+ context: loadContext
123
+ }));
100
124
  }));
101
- shareOptionsRes = (await this.hooks.lifecycle.beforeLoadShare.emit({
125
+ const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({
102
126
  pkgName,
103
127
  shareInfo: shareOptions,
104
128
  shared: host.options.shared,
105
- origin: host
106
- })).shareInfo;
129
+ origin: host,
130
+ loadContext
131
+ });
132
+ shareOptionsRes = loadShareRes.shareInfo;
133
+ loadContext = loadShareRes.loadContext || loadContext;
107
134
  require_logger.assert(shareOptionsRes, `Cannot find shared "${pkgName}" in host "${host.options.name}". Ensure the shared config for "${pkgName}" is declared in the federation plugin options and the host has been initialized before loading shares.`);
108
135
  const resolvedShareOptions = shareOptionsRes;
109
- const { shared: registeredShared, useTreesShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
136
+ const { shared: registeredShared, useTreesShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare, loadContext) || {};
110
137
  if (registeredShared) {
111
138
  const targetShared = require_share.directShare(registeredShared, useTreesShaking);
112
139
  if (targetShared.lib) {
@@ -115,7 +142,8 @@ var SharedHandler = class {
115
142
  lifecycle: "loadShare",
116
143
  pkgName,
117
144
  shareInfo: resolvedShareOptions,
118
- selectedShared: registeredShared
145
+ selectedShared: registeredShared,
146
+ loadContext
119
147
  });
120
148
  return targetShared.lib;
121
149
  } else if (targetShared.loading && !targetShared.loaded) {
@@ -127,7 +155,8 @@ var SharedHandler = class {
127
155
  lifecycle: "loadShare",
128
156
  pkgName,
129
157
  shareInfo: resolvedShareOptions,
130
- selectedShared: registeredShared
158
+ selectedShared: registeredShared,
159
+ loadContext
131
160
  });
132
161
  return factory;
133
162
  } else {
@@ -153,7 +182,8 @@ var SharedHandler = class {
153
182
  lifecycle: "loadShare",
154
183
  pkgName,
155
184
  shareInfo: resolvedShareOptions,
156
- selectedShared: registeredShared
185
+ selectedShared: registeredShared,
186
+ loadContext
157
187
  });
158
188
  return factory;
159
189
  }
@@ -163,7 +193,8 @@ var SharedHandler = class {
163
193
  lifecycle: "loadShare",
164
194
  pkgName,
165
195
  shareInfo: resolvedShareOptions,
166
- recovered: true
196
+ recovered: true,
197
+ loadContext
167
198
  });
168
199
  return false;
169
200
  }
@@ -174,7 +205,7 @@ var SharedHandler = class {
174
205
  targetShared.lib = factory;
175
206
  targetShared.loaded = true;
176
207
  require_share.addUseIn(targetShared, host.options.name);
177
- const { shared: gShared, useTreesShaking: gUseTreeShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, resolvedShareOptions, this.hooks.lifecycle.resolveShare) || {};
208
+ const { shared: gShared, useTreesShaking: gUseTreeShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, resolvedShareOptions, this.hooks.lifecycle.resolveShare, loadContext) || {};
178
209
  if (gShared) {
179
210
  const targetGShared = require_share.directShare(gShared, gUseTreeShaking);
180
211
  targetGShared.lib = factory;
@@ -198,7 +229,8 @@ var SharedHandler = class {
198
229
  lifecycle: "loadShare",
199
230
  pkgName,
200
231
  shareInfo: resolvedShareOptions,
201
- selectedShared: resolvedShareOptions
232
+ selectedShared: resolvedShareOptions,
233
+ loadContext
202
234
  });
203
235
  return factory;
204
236
  }
@@ -207,7 +239,8 @@ var SharedHandler = class {
207
239
  lifecycle: "loadShare",
208
240
  pkgName,
209
241
  shareInfo: shareOptionsRes,
210
- error: shareError
242
+ error: shareError,
243
+ loadContext
211
244
  });
212
245
  throw shareError;
213
246
  }
@@ -221,6 +254,7 @@ var SharedHandler = class {
221
254
  const { host } = this;
222
255
  const from = extraOptions?.from;
223
256
  const strategy = extraOptions?.strategy;
257
+ const trigger = extraOptions?.context?.trigger || from || "runtime";
224
258
  let initScope = extraOptions?.initScope;
225
259
  const promises = [];
226
260
  if (from !== "build") {
@@ -239,15 +273,29 @@ var SharedHandler = class {
239
273
  const { version, eager } = shared;
240
274
  scope[name] = scope[name] || {};
241
275
  const versions = scope[name];
242
- const activeVersion = versions[version] && require_share.directShare(versions[version]);
276
+ const existingShared = versions[version];
277
+ const activeVersion = existingShared && require_share.directShare(existingShared);
243
278
  const activeVersionEager = Boolean(activeVersion && ("eager" in activeVersion && activeVersion.eager || "shareConfig" in activeVersion && activeVersion.shareConfig?.eager));
244
- if (!activeVersion || activeVersion.strategy !== "loaded-first" && !activeVersion.loaded && (Boolean(!eager) !== !activeVersionEager ? eager : hostName > versions[version].from)) versions[version] = shared;
279
+ if (Boolean(!activeVersion || activeVersion.strategy !== "loaded-first" && !activeVersion.loaded && (Boolean(!eager) !== !activeVersionEager ? eager : hostName > versions[version].from))) versions[version] = shared;
280
+ this.emitAfterRegisterShare(name, {
281
+ scope: shareScopeName,
282
+ shared,
283
+ previousShared: existingShared,
284
+ registeredShared: versions[version],
285
+ trigger
286
+ });
245
287
  };
246
288
  const initRemoteModule = async (key) => {
247
289
  const { module } = await host.remoteHandler.getRemoteModuleAndOptions({ id: key });
248
290
  let remoteEntryExports = void 0;
291
+ const resourceContext = {
292
+ initiator: "loadShare",
293
+ id: key,
294
+ resourceType: "remoteEntry",
295
+ url: module.remoteInfo.entry
296
+ };
249
297
  try {
250
- remoteEntryExports = await module.getEntry();
298
+ remoteEntryExports = await module.getEntry(void 0, resourceContext);
251
299
  } catch (error) {
252
300
  remoteEntryExports = await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
253
301
  id: key,
@@ -261,7 +309,7 @@ var SharedHandler = class {
261
309
  } finally {
262
310
  if (remoteEntryExports?.init && !module.initing) {
263
311
  module.remoteEntryExports = remoteEntryExports;
264
- await module.init(void 0, void 0, initScope);
312
+ await module.init(void 0, void 0, initScope, void 0, resourceContext);
265
313
  }
266
314
  }
267
315
  };
@@ -277,6 +325,7 @@ var SharedHandler = class {
277
325
  }
278
326
  loadShareSync(pkgName, extraOptions) {
279
327
  const { host } = this;
328
+ const loadContext = extraOptions?.context;
280
329
  const shareOptions = require_share.getTargetSharedOptions({
281
330
  pkgName,
282
331
  extraOptions,
@@ -284,9 +333,13 @@ var SharedHandler = class {
284
333
  });
285
334
  try {
286
335
  if (shareOptions?.scope) shareOptions.scope.forEach((shareScope) => {
287
- this.initializeSharing(shareScope, { strategy: shareOptions.strategy });
336
+ this.initializeSharing(shareScope, {
337
+ strategy: shareOptions.strategy,
338
+ from: extraOptions?.from,
339
+ context: loadContext
340
+ });
288
341
  });
289
- const { shared: registeredShared } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare) || {};
342
+ const { shared: registeredShared } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare, loadContext) || {};
290
343
  if (registeredShared) {
291
344
  if (typeof registeredShared.lib === "function") {
292
345
  require_share.addUseIn(registeredShared, host.options.name);
@@ -298,7 +351,8 @@ var SharedHandler = class {
298
351
  lifecycle: "loadShareSync",
299
352
  pkgName,
300
353
  shareInfo: shareOptions,
301
- selectedShared: registeredShared
354
+ selectedShared: registeredShared,
355
+ loadContext
302
356
  });
303
357
  return registeredShared.lib;
304
358
  }
@@ -317,7 +371,8 @@ var SharedHandler = class {
317
371
  lifecycle: "loadShareSync",
318
372
  pkgName,
319
373
  shareInfo: shareOptions,
320
- selectedShared: registeredShared
374
+ selectedShared: registeredShared,
375
+ loadContext
321
376
  });
322
377
  return module;
323
378
  }
@@ -329,7 +384,8 @@ var SharedHandler = class {
329
384
  lifecycle: "loadShareSync",
330
385
  pkgName,
331
386
  shareInfo: shareOptions,
332
- selectedShared: shareOptions
387
+ selectedShared: shareOptions,
388
+ loadContext
333
389
  });
334
390
  return shareOptions.lib;
335
391
  }
@@ -351,7 +407,8 @@ var SharedHandler = class {
351
407
  lifecycle: "loadShareSync",
352
408
  pkgName,
353
409
  shareInfo: shareOptions,
354
- selectedShared: shareOptions
410
+ selectedShared: shareOptions,
411
+ loadContext
355
412
  });
356
413
  return shareOptions.lib;
357
414
  }
@@ -364,7 +421,8 @@ var SharedHandler = class {
364
421
  lifecycle: "loadShareSync",
365
422
  pkgName,
366
423
  shareInfo: shareOptions,
367
- error: shareError
424
+ error: shareError,
425
+ loadContext
368
426
  });
369
427
  throw shareError;
370
428
  }
@@ -391,6 +449,7 @@ var SharedHandler = class {
391
449
  merge(targetShared, "loaded", loaded);
392
450
  merge(targetShared, "loading", loading);
393
451
  merge(targetShared, "get", get);
452
+ merge(targetShared, "lib", lib);
394
453
  };
395
454
  scopes.forEach((sc) => {
396
455
  if (!this.shareScopeMap[sc]) this.shareScopeMap[sc] = {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","formatShareConfigs","getTargetSharedOptions","getRegisteredShare","directShare","shouldUseTreeShaking","DEFAULT_SCOPE","RUNTIME_005","RUNTIME_006","runtimeDescMap","optionsToMFContext","getGlobalShareScope"],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n RUNTIME_005,\n RUNTIME_006,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n Options,\n ShareScopeMap,\n ShareInfos,\n Shared,\n RemoteEntryExports,\n UserOptions,\n ShareStrategy,\n InitScope,\n InitTokens,\n CallFrom,\n TreeShakingArgs,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncWaterfallHook,\n SyncHook,\n} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport {\n assert,\n error,\n addUniqueItem,\n optionsToMFContext,\n warn,\n} from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport type { LoadRemoteMatch } from '../remote';\nimport { createRemoteEntryInitOptions } from '../module';\n\nexport class SharedHandler {\n host: ModuleFederation;\n shareScopeMap: ShareScopeMap;\n hooks = new PluginSystem({\n beforeRegisterShare: new SyncWaterfallHook<{\n pkgName: string;\n shared: Shared;\n origin: ModuleFederation;\n }>('beforeRegisterShare'),\n afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n beforeLoadShare: new AsyncWaterfallHook<{\n pkgName: string;\n shareInfo?: Shared;\n shared: Options['shared'];\n origin: ModuleFederation;\n }>('beforeLoadShare'),\n // not used yet\n loadShare: new AsyncHook<[ModuleFederation, string, ShareInfos]>(),\n afterLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadShare'),\n errorLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n origin: ModuleFederation;\n error?: unknown;\n recovered?: boolean;\n },\n ],\n void\n >('errorLoadShare'),\n resolveShare: new SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n }>('resolveShare'),\n // maybe will change, temporarily for internal use only\n initContainerShareScopeMap: new SyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n options: Options;\n origin: ModuleFederation;\n scopeName: string;\n hostShareScopeMap?: ShareScopeMap;\n }>('initContainerShareScopeMap'),\n });\n initTokens: InitTokens;\n constructor(host: ModuleFederation) {\n this.host = host;\n this.shareScopeMap = {};\n this.initTokens = {};\n this._setGlobalShareScopeMap(host.options);\n }\n\n private emitAfterLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n selectedShared,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n }): void {\n try {\n this.hooks.lifecycle.afterLoadShare.emit({\n pkgName,\n shareInfo,\n selectedShared,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n origin: this.host,\n });\n } catch (error) {\n warn(error);\n }\n }\n\n private emitErrorLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n error,\n recovered,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n error?: unknown;\n recovered?: boolean;\n }): void {\n try {\n this.hooks.lifecycle.errorLoadShare.emit({\n pkgName,\n shareInfo,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n origin: this.host,\n error,\n recovered,\n });\n } catch (hookError) {\n warn(hookError);\n }\n }\n\n // register shared in shareScopeMap\n registerShared(globalOptions: Options, userOptions: UserOptions) {\n const { newShareInfos, allShareInfos } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n\n const sharedKeys = Object.keys(newShareInfos);\n sharedKeys.forEach((sharedKey) => {\n const sharedVals = newShareInfos[sharedKey];\n sharedVals.forEach((sharedVal) => {\n sharedVal.scope.forEach((sc) => {\n this.hooks.lifecycle.beforeRegisterShare.emit({\n origin: this.host,\n pkgName: sharedKey,\n shared: sharedVal,\n });\n const registeredShared = this.shareScopeMap[sc]?.[sharedKey];\n if (!registeredShared) {\n this.setShared({\n pkgName: sharedKey,\n lib: sharedVal.lib,\n get: sharedVal.get,\n loaded: sharedVal.loaded || Boolean(sharedVal.lib),\n shared: sharedVal,\n from: userOptions.name,\n });\n }\n });\n });\n });\n\n return {\n newShareInfos,\n allShareInfos,\n };\n }\n\n async loadShare<T>(\n pkgName: string,\n extraOptions?: {\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): Promise<false | (() => T | undefined)> {\n const { host } = this;\n // This function performs the following steps:\n // 1. Checks if the currently loaded share already exists, if not, it throws an error\n // 2. Searches globally for a matching share, if found, it uses it directly\n // 3. If not found, it retrieves it from the current share and stores the obtained share globally.\n\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n let shareOptionsRes: Shared | undefined = shareOptions;\n\n try {\n if (shareOptions?.scope) {\n await Promise.all(\n shareOptions.scope.map(async (shareScope) => {\n await Promise.all(\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n }),\n );\n return;\n }),\n );\n }\n const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({\n pkgName,\n shareInfo: shareOptions,\n shared: host.options.shared,\n origin: host,\n });\n\n shareOptionsRes = loadShareRes.shareInfo;\n\n // Assert that shareInfoRes exists, if not, throw an error\n assert(\n shareOptionsRes,\n `Cannot find shared \"${pkgName}\" in host \"${host.options.name}\". Ensure the shared config for \"${pkgName}\" is declared in the federation plugin options and the host has been initialized before loading shares.`,\n );\n const resolvedShareOptions = shareOptionsRes;\n\n const { shared: registeredShared, useTreesShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptionsRes,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n const targetShared = directShare(registeredShared, useTreesShaking);\n if (targetShared.lib) {\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return targetShared.lib as () => T;\n } else if (targetShared.loading && !targetShared.loaded) {\n const factory = await targetShared.loading;\n targetShared.loaded = true;\n if (!targetShared.lib) {\n targetShared.lib = factory;\n }\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return factory;\n } else {\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n addUseIn(targetShared, host.options.name);\n targetShared.loaded = true;\n targetShared.lib = factory;\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: registeredShared,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: useTreesShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return factory;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n recovered: true,\n });\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(\n resolvedShareOptions.treeShaking,\n );\n const targetShared = directShare(resolvedShareOptions, _useTreeShaking);\n\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n targetShared.lib = factory;\n targetShared.loaded = true;\n addUseIn(targetShared, host.options.name);\n const { shared: gShared, useTreesShaking: gUseTreeShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n resolvedShareOptions,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n if (gShared) {\n const targetGShared = directShare(gShared, gUseTreeShaking);\n targetGShared.lib = factory;\n targetGShared.loaded = true;\n gShared.from = resolvedShareOptions.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: resolvedShareOptions,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: resolvedShareOptions,\n });\n return factory;\n }\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: shareOptionsRes,\n error: shareError,\n });\n throw shareError;\n }\n }\n\n /**\n * This function initializes the sharing sequence (executed only once per share scope).\n * It accepts one argument, the name of the share scope.\n * If the share scope does not exist, it creates one.\n */\n // eslint-disable-next-line @typescript-eslint/member-ordering\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: ShareStrategy;\n },\n ): Array<Promise<void>> {\n const { host } = this;\n const from = extraOptions?.from;\n const strategy = extraOptions?.strategy;\n let initScope = extraOptions?.initScope;\n const promises: Promise<any>[] = [];\n if (from !== 'build') {\n const { initTokens } = this;\n if (!initScope) initScope = [];\n let initToken = initTokens[shareScopeName];\n if (!initToken)\n initToken = initTokens[shareScopeName] = { from: this.host.name };\n if (initScope.indexOf(initToken) >= 0) return promises;\n initScope.push(initToken);\n }\n\n const shareScope = this.shareScopeMap;\n const hostName = host.options.name;\n // Creates a new share scope if necessary\n if (!shareScope[shareScopeName]) {\n shareScope[shareScopeName] = {};\n }\n // Executes all initialization snippets from all accessible modules\n const scope = shareScope[shareScopeName];\n const register = (name: string, shared: Shared) => {\n const { version, eager } = shared;\n scope[name] = scope[name] || {};\n const versions = scope[name];\n const activeVersion: Shared =\n versions[version] && (directShare(versions[version]) as Shared);\n const activeVersionEager = Boolean(\n activeVersion &&\n (('eager' in activeVersion && activeVersion.eager) ||\n ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n );\n if (\n !activeVersion ||\n (activeVersion.strategy !== 'loaded-first' &&\n !activeVersion.loaded &&\n (Boolean(!eager) !== !activeVersionEager\n ? eager\n : hostName > versions[version].from))\n ) {\n versions[version] = shared;\n }\n };\n\n const initRemoteModule = async (key: string): Promise<void> => {\n const { module } = await host.remoteHandler.getRemoteModuleAndOptions({\n id: key,\n });\n let remoteEntryExports: RemoteEntryExports | undefined = undefined;\n try {\n remoteEntryExports = await module.getEntry();\n } catch (error) {\n remoteEntryExports =\n (await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({\n id: key,\n error,\n from: 'runtime',\n lifecycle: 'beforeLoadShare',\n remote: module.remoteInfo,\n origin: host,\n })) as RemoteEntryExports;\n if (!remoteEntryExports) {\n return;\n }\n } finally {\n // prevent self load loop: when host load self , the initTokens is not the same\n if (remoteEntryExports?.init && !module.initing) {\n module.remoteEntryExports = remoteEntryExports;\n await module.init(undefined, undefined, initScope);\n }\n }\n };\n Object.keys(host.options.shared).forEach((shareName) => {\n const sharedArr = host.options.shared[shareName];\n sharedArr.forEach((shared) => {\n if (shared.scope.includes(shareScopeName)) {\n register(shareName, shared);\n }\n });\n });\n // TODO: strategy==='version-first' need to be removed in the future\n if (\n host.options.shareStrategy === 'version-first' ||\n strategy === 'version-first'\n ) {\n host.options.remotes.forEach((remote) => {\n if (remote.shareScope === shareScopeName) {\n promises.push(initRemoteModule(remote.name));\n }\n });\n }\n\n return promises;\n }\n\n // The lib function will only be available if the shared set by eager or runtime init is set or the shared is successfully loaded.\n // 1. If the loaded shared already exists globally, then it will be reused\n // 2. If lib exists in local shared, it will be used directly\n // 3. If the local get returns something other than Promise, then it will be used directly\n loadShareSync<T>(\n pkgName: string,\n extraOptions?: {\n from?: 'build' | 'runtime';\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n const { host } = this;\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n\n try {\n if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n });\n });\n }\n const { shared: registeredShared } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptions,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n if (typeof registeredShared.lib === 'function') {\n addUseIn(registeredShared, host.options.name);\n if (!registeredShared.loaded) {\n registeredShared.loaded = true;\n if (registeredShared.from === host.options.name) {\n shareOptions.loaded = true;\n }\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n });\n return registeredShared.lib as () => T;\n }\n if (typeof registeredShared.get === 'function') {\n const module = registeredShared.get();\n if (!(module instanceof Promise)) {\n addUseIn(registeredShared, host.options.name);\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: module,\n shared: registeredShared,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n });\n return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n });\n return shareOptions.lib as () => T;\n }\n\n if (shareOptions.get) {\n const module = shareOptions.get();\n\n if (module instanceof Promise) {\n const errorCode =\n extraOptions?.from === 'build' ? RUNTIME_005 : RUNTIME_006;\n error(\n errorCode,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n shareOptions.lib = module;\n\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: shareOptions.lib,\n shared: shareOptions,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n });\n return shareOptions.lib as () => T;\n }\n\n error(\n RUNTIME_006,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n error: shareError,\n });\n throw shareError;\n }\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n const { host } = this;\n this.shareScopeMap[scopeName] = shareScope;\n this.hooks.lifecycle.initContainerShareScopeMap.emit({\n shareScope,\n options: host.options,\n origin: host,\n scopeName,\n hostShareScopeMap: extraOptions.hostShareScopeMap,\n });\n }\n\n private setShared({\n pkgName,\n shared,\n from,\n lib,\n loading,\n loaded,\n get,\n treeShaking,\n }: {\n pkgName: string;\n shared: Shared;\n from: string;\n lib: any;\n loaded?: boolean;\n loading?: Shared['loading'];\n get?: Shared['get'];\n treeShaking?: TreeShakingArgs;\n }): void {\n const { version, scope = 'default', ...shareInfo } = shared;\n const scopes: string[] = Array.isArray(scope) ? scope : [scope];\n\n const mergeAttrs = (shared: Shared) => {\n const merge = <K extends keyof TreeShakingArgs>(\n s: TreeShakingArgs,\n key: K,\n val: TreeShakingArgs[K],\n ): void => {\n if (val && !s[key]) {\n s[key] = val;\n }\n };\n const targetShared = (\n treeShaking ? shared.treeShaking! : shared\n ) as TreeShakingArgs;\n merge(targetShared, 'loaded', loaded);\n merge(targetShared, 'loading', loading);\n merge(targetShared, 'get', get);\n };\n scopes.forEach((sc) => {\n if (!this.shareScopeMap[sc]) {\n this.shareScopeMap[sc] = {};\n }\n if (!this.shareScopeMap[sc][pkgName]) {\n this.shareScopeMap[sc][pkgName] = {};\n }\n\n if (!this.shareScopeMap[sc][pkgName][version]) {\n this.shareScopeMap[sc][pkgName][version] = {\n version,\n scope: [sc],\n ...shareInfo,\n lib,\n };\n }\n\n const registeredShared = this.shareScopeMap[sc][pkgName][version];\n mergeAttrs(registeredShared);\n if (from && registeredShared.from !== from) {\n registeredShared.from = from;\n }\n });\n }\n\n private _setGlobalShareScopeMap(hostOptions: Options): void {\n const globalShareScopeMap = getGlobalShareScope();\n const identifier = hostOptions.id || hostOptions.name;\n if (identifier && !globalShareScopeMap[identifier]) {\n globalShareScopeMap[identifier] = this.shareScopeMap;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","SyncHook","AsyncWaterfallHook","AsyncHook","formatShareConfigs","getTargetSharedOptions","getRegisteredShare","directShare","shouldUseTreeShaking","DEFAULT_SCOPE","RUNTIME_005","RUNTIME_006","runtimeDescMap","optionsToMFContext","getGlobalShareScope"],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n RUNTIME_005,\n RUNTIME_006,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n Options,\n ShareScopeMap,\n ShareInfos,\n Shared,\n RemoteEntryExports,\n UserOptions,\n ShareStrategy,\n InitScope,\n InitTokens,\n CallFrom,\n TreeShakingArgs,\n LoadShareExtraOptions,\n SharedLoadContext,\n SharedLoadTrigger,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncWaterfallHook,\n SyncHook,\n} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport {\n assert,\n error,\n addUniqueItem,\n optionsToMFContext,\n warn,\n} from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport type { LoadRemoteMatch } from '../remote';\nimport { createRemoteEntryInitOptions } from '../module';\n\nexport class SharedHandler {\n host: ModuleFederation;\n shareScopeMap: ShareScopeMap;\n hooks = new PluginSystem({\n beforeRegisterShare: new SyncWaterfallHook<{\n pkgName: string;\n shared: Shared;\n origin: ModuleFederation;\n }>('beforeRegisterShare'),\n afterRegisterShare: new SyncHook<\n [\n {\n pkgName: string;\n scope: string;\n shared: Shared;\n previousShared?: Shared;\n registeredShared?: Shared;\n shareScopeMap: ShareScopeMap;\n trigger: SharedLoadTrigger;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterRegisterShare'),\n afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n beforeLoadShare: new AsyncWaterfallHook<{\n pkgName: string;\n shareInfo?: Shared;\n shared: Options['shared'];\n origin: ModuleFederation;\n loadContext?: SharedLoadContext;\n }>('beforeLoadShare'),\n // not used yet\n loadShare: new AsyncHook<[ModuleFederation, string, ShareInfos]>(),\n afterLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n loadContext?: SharedLoadContext;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadShare'),\n errorLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n origin: ModuleFederation;\n error?: unknown;\n recovered?: boolean;\n loadContext?: SharedLoadContext;\n },\n ],\n void\n >('errorLoadShare'),\n resolveShare: new SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n loadContext?: SharedLoadContext;\n }>('resolveShare'),\n // maybe will change, temporarily for internal use only\n initContainerShareScopeMap: new SyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n options: Options;\n origin: ModuleFederation;\n scopeName: string;\n hostShareScopeMap?: ShareScopeMap;\n }>('initContainerShareScopeMap'),\n });\n initTokens: InitTokens;\n constructor(host: ModuleFederation) {\n this.host = host;\n this.shareScopeMap = {};\n this.initTokens = {};\n this._setGlobalShareScopeMap(host.options);\n }\n\n private emitAfterRegisterShare(\n pkgName: string,\n input: {\n scope: string;\n shared: Shared;\n previousShared?: Shared;\n registeredShared?: Shared;\n trigger: SharedLoadTrigger;\n },\n ): void {\n this.hooks.lifecycle.afterRegisterShare.emit({\n pkgName,\n ...input,\n shareScopeMap: this.shareScopeMap,\n origin: this.host,\n });\n }\n\n private emitAfterLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n selectedShared,\n loadContext,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n loadContext?: SharedLoadContext;\n }): void {\n try {\n this.hooks.lifecycle.afterLoadShare.emit({\n pkgName,\n shareInfo,\n selectedShared,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n loadContext,\n origin: this.host,\n });\n } catch (error) {\n warn(error);\n }\n }\n\n private emitErrorLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n error,\n recovered,\n loadContext,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n error?: unknown;\n recovered?: boolean;\n loadContext?: SharedLoadContext;\n }): void {\n try {\n this.hooks.lifecycle.errorLoadShare.emit({\n pkgName,\n shareInfo,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n origin: this.host,\n error,\n recovered,\n loadContext,\n });\n } catch (hookError) {\n warn(hookError);\n }\n }\n\n // register shared in shareScopeMap\n registerShared(globalOptions: Options, userOptions: UserOptions) {\n const { newShareInfos, allShareInfos } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n\n const sharedKeys = Object.keys(newShareInfos);\n sharedKeys.forEach((sharedKey) => {\n const sharedVals = newShareInfos[sharedKey];\n sharedVals.forEach((sharedVal) => {\n sharedVal.scope.forEach((sc) => {\n this.hooks.lifecycle.beforeRegisterShare.emit({\n origin: this.host,\n pkgName: sharedKey,\n shared: sharedVal,\n });\n const registeredShared = this.shareScopeMap[sc]?.[sharedKey];\n const previousAtVersion = registeredShared?.[sharedVal.version];\n if (!registeredShared) {\n this.setShared({\n pkgName: sharedKey,\n lib: sharedVal.lib,\n get: sharedVal.get,\n loaded: sharedVal.loaded || Boolean(sharedVal.lib),\n shared: sharedVal,\n from: userOptions.name,\n });\n }\n this.emitAfterRegisterShare(sharedKey, {\n scope: sc,\n shared: sharedVal,\n previousShared: previousAtVersion,\n registeredShared:\n this.shareScopeMap[sc]?.[sharedKey]?.[sharedVal.version],\n trigger: 'runtime',\n });\n });\n });\n });\n\n return {\n newShareInfos,\n allShareInfos,\n };\n }\n\n async loadShare<T>(\n pkgName: string,\n extraOptions?: LoadShareExtraOptions,\n ): Promise<false | (() => T | undefined)> {\n const { host } = this;\n let loadContext = extraOptions?.context;\n // This function performs the following steps:\n // 1. Checks if the currently loaded share already exists, if not, it throws an error\n // 2. Searches globally for a matching share, if found, it uses it directly\n // 3. If not found, it retrieves it from the current share and stores the obtained share globally.\n\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n let shareOptionsRes: Shared | undefined = shareOptions;\n\n try {\n if (shareOptions?.scope) {\n await Promise.all(\n shareOptions.scope.map(async (shareScope) => {\n await Promise.all(\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n context: loadContext,\n }),\n );\n return;\n }),\n );\n }\n const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({\n pkgName,\n shareInfo: shareOptions,\n shared: host.options.shared,\n origin: host,\n loadContext,\n });\n\n shareOptionsRes = loadShareRes.shareInfo;\n loadContext = loadShareRes.loadContext || loadContext;\n\n // Assert that shareInfoRes exists, if not, throw an error\n assert(\n shareOptionsRes,\n `Cannot find shared \"${pkgName}\" in host \"${host.options.name}\". Ensure the shared config for \"${pkgName}\" is declared in the federation plugin options and the host has been initialized before loading shares.`,\n );\n const resolvedShareOptions = shareOptionsRes;\n\n const { shared: registeredShared, useTreesShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptionsRes,\n this.hooks.lifecycle.resolveShare,\n loadContext,\n ) || {};\n\n if (registeredShared) {\n const targetShared = directShare(registeredShared, useTreesShaking);\n if (targetShared.lib) {\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n loadContext,\n });\n return targetShared.lib as () => T;\n } else if (targetShared.loading && !targetShared.loaded) {\n const factory = await targetShared.loading;\n targetShared.loaded = true;\n if (!targetShared.lib) {\n targetShared.lib = factory;\n }\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n loadContext,\n });\n return factory;\n } else {\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n addUseIn(targetShared, host.options.name);\n targetShared.loaded = true;\n targetShared.lib = factory;\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: registeredShared,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: useTreesShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n loadContext,\n });\n return factory;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n recovered: true,\n loadContext,\n });\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(\n resolvedShareOptions.treeShaking,\n );\n const targetShared = directShare(resolvedShareOptions, _useTreeShaking);\n\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n targetShared.lib = factory;\n targetShared.loaded = true;\n addUseIn(targetShared, host.options.name);\n const { shared: gShared, useTreesShaking: gUseTreeShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n resolvedShareOptions,\n this.hooks.lifecycle.resolveShare,\n loadContext,\n ) || {};\n if (gShared) {\n const targetGShared = directShare(gShared, gUseTreeShaking);\n targetGShared.lib = factory;\n targetGShared.loaded = true;\n gShared.from = resolvedShareOptions.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: resolvedShareOptions,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: resolvedShareOptions,\n loadContext,\n });\n return factory;\n }\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: shareOptionsRes,\n error: shareError,\n loadContext,\n });\n throw shareError;\n }\n }\n\n /**\n * This function initializes the sharing sequence (executed only once per share scope).\n * It accepts one argument, the name of the share scope.\n * If the share scope does not exist, it creates one.\n */\n // eslint-disable-next-line @typescript-eslint/member-ordering\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: ShareStrategy;\n context?: SharedLoadContext;\n },\n ): Array<Promise<void>> {\n const { host } = this;\n const from = extraOptions?.from;\n const strategy = extraOptions?.strategy;\n const trigger: SharedLoadTrigger =\n extraOptions?.context?.trigger || from || 'runtime';\n let initScope = extraOptions?.initScope;\n const promises: Promise<any>[] = [];\n if (from !== 'build') {\n const { initTokens } = this;\n if (!initScope) initScope = [];\n let initToken = initTokens[shareScopeName];\n if (!initToken)\n initToken = initTokens[shareScopeName] = { from: this.host.name };\n if (initScope.indexOf(initToken) >= 0) return promises;\n initScope.push(initToken);\n }\n\n const shareScope = this.shareScopeMap;\n const hostName = host.options.name;\n // Creates a new share scope if necessary\n if (!shareScope[shareScopeName]) {\n shareScope[shareScopeName] = {};\n }\n // Executes all initialization snippets from all accessible modules\n const scope = shareScope[shareScopeName];\n const register = (name: string, shared: Shared) => {\n const { version, eager } = shared;\n scope[name] = scope[name] || {};\n const versions = scope[name];\n const existingShared = versions[version];\n const activeVersion: Shared =\n existingShared && (directShare(existingShared) as Shared);\n const activeVersionEager = Boolean(\n activeVersion &&\n (('eager' in activeVersion && activeVersion.eager) ||\n ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n );\n const shouldReplace = Boolean(\n !activeVersion ||\n (activeVersion.strategy !== 'loaded-first' &&\n !activeVersion.loaded &&\n (Boolean(!eager) !== !activeVersionEager\n ? eager\n : hostName > versions[version].from)),\n );\n if (shouldReplace) {\n versions[version] = shared;\n }\n this.emitAfterRegisterShare(name, {\n scope: shareScopeName,\n shared,\n previousShared: existingShared,\n registeredShared: versions[version],\n trigger,\n });\n };\n\n const initRemoteModule = async (key: string): Promise<void> => {\n const { module } = await host.remoteHandler.getRemoteModuleAndOptions({\n id: key,\n });\n let remoteEntryExports: RemoteEntryExports | undefined = undefined;\n const resourceContext = {\n initiator: 'loadShare' as const,\n id: key,\n resourceType: 'remoteEntry' as const,\n url: module.remoteInfo.entry,\n };\n try {\n remoteEntryExports = await module.getEntry(undefined, resourceContext);\n } catch (error) {\n remoteEntryExports =\n (await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({\n id: key,\n error,\n from: 'runtime',\n lifecycle: 'beforeLoadShare',\n remote: module.remoteInfo,\n origin: host,\n })) as RemoteEntryExports;\n if (!remoteEntryExports) {\n return;\n }\n } finally {\n // prevent self load loop: when host load self , the initTokens is not the same\n if (remoteEntryExports?.init && !module.initing) {\n module.remoteEntryExports = remoteEntryExports;\n await module.init(\n undefined,\n undefined,\n initScope,\n undefined,\n resourceContext,\n );\n }\n }\n };\n Object.keys(host.options.shared).forEach((shareName) => {\n const sharedArr = host.options.shared[shareName];\n sharedArr.forEach((shared) => {\n if (shared.scope.includes(shareScopeName)) {\n register(shareName, shared);\n }\n });\n });\n // TODO: strategy==='version-first' need to be removed in the future\n if (\n host.options.shareStrategy === 'version-first' ||\n strategy === 'version-first'\n ) {\n host.options.remotes.forEach((remote) => {\n if (remote.shareScope === shareScopeName) {\n promises.push(initRemoteModule(remote.name));\n }\n });\n }\n\n return promises;\n }\n\n // The lib function will only be available if the shared set by eager or runtime init is set or the shared is successfully loaded.\n // 1. If the loaded shared already exists globally, then it will be reused\n // 2. If lib exists in local shared, it will be used directly\n // 3. If the local get returns something other than Promise, then it will be used directly\n loadShareSync<T>(\n pkgName: string,\n extraOptions?: LoadShareExtraOptions,\n ): () => T | never {\n const { host } = this;\n const loadContext = extraOptions?.context;\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n\n try {\n if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n from: extraOptions?.from,\n context: loadContext,\n });\n });\n }\n const { shared: registeredShared } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptions,\n this.hooks.lifecycle.resolveShare,\n loadContext,\n ) || {};\n\n if (registeredShared) {\n if (typeof registeredShared.lib === 'function') {\n addUseIn(registeredShared, host.options.name);\n if (!registeredShared.loaded) {\n registeredShared.loaded = true;\n if (registeredShared.from === host.options.name) {\n shareOptions.loaded = true;\n }\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n loadContext,\n });\n return registeredShared.lib as () => T;\n }\n if (typeof registeredShared.get === 'function') {\n const module = registeredShared.get();\n if (!(module instanceof Promise)) {\n addUseIn(registeredShared, host.options.name);\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: module,\n shared: registeredShared,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n loadContext,\n });\n return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n loadContext,\n });\n return shareOptions.lib as () => T;\n }\n\n if (shareOptions.get) {\n const module = shareOptions.get();\n\n if (module instanceof Promise) {\n const errorCode =\n extraOptions?.from === 'build' ? RUNTIME_005 : RUNTIME_006;\n error(\n errorCode,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n shareOptions.lib = module;\n\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: shareOptions.lib,\n shared: shareOptions,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n loadContext,\n });\n return shareOptions.lib as () => T;\n }\n\n error(\n RUNTIME_006,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n error: shareError,\n loadContext,\n });\n throw shareError;\n }\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n const { host } = this;\n this.shareScopeMap[scopeName] = shareScope;\n this.hooks.lifecycle.initContainerShareScopeMap.emit({\n shareScope,\n options: host.options,\n origin: host,\n scopeName,\n hostShareScopeMap: extraOptions.hostShareScopeMap,\n });\n }\n\n private setShared({\n pkgName,\n shared,\n from,\n lib,\n loading,\n loaded,\n get,\n treeShaking,\n }: {\n pkgName: string;\n shared: Shared;\n from: string;\n lib: any;\n loaded?: boolean;\n loading?: Shared['loading'];\n get?: Shared['get'];\n treeShaking?: TreeShakingArgs;\n }): void {\n const { version, scope = 'default', ...shareInfo } = shared;\n const scopes: string[] = Array.isArray(scope) ? scope : [scope];\n\n const mergeAttrs = (shared: Shared) => {\n const merge = <K extends keyof TreeShakingArgs>(\n s: TreeShakingArgs,\n key: K,\n val: TreeShakingArgs[K],\n ): void => {\n if (val && !s[key]) {\n s[key] = val;\n }\n };\n const targetShared = (\n treeShaking ? shared.treeShaking! : shared\n ) as TreeShakingArgs;\n merge(targetShared, 'loaded', loaded);\n merge(targetShared, 'loading', loading);\n merge(targetShared, 'get', get);\n merge(targetShared, 'lib', lib);\n };\n scopes.forEach((sc) => {\n if (!this.shareScopeMap[sc]) {\n this.shareScopeMap[sc] = {};\n }\n if (!this.shareScopeMap[sc][pkgName]) {\n this.shareScopeMap[sc][pkgName] = {};\n }\n\n if (!this.shareScopeMap[sc][pkgName][version]) {\n this.shareScopeMap[sc][pkgName][version] = {\n version,\n scope: [sc],\n ...shareInfo,\n lib,\n };\n }\n\n const registeredShared = this.shareScopeMap[sc][pkgName][version];\n mergeAttrs(registeredShared);\n if (from && registeredShared.from !== from) {\n registeredShared.from = from;\n }\n });\n }\n\n private _setGlobalShareScopeMap(hostOptions: Options): void {\n const globalShareScopeMap = getGlobalShareScope();\n const identifier = hostOptions.id || hostOptions.name;\n if (identifier && !globalShareScopeMap[identifier]) {\n globalShareScopeMap[identifier] = this.shareScopeMap;\n }\n }\n}\n"],"mappings":"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"}