@module-federation/runtime-core 2.1.0 → 2.2.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 (81) hide show
  1. package/dist/core.cjs +2 -2
  2. package/dist/core.cjs.map +1 -1
  3. package/dist/core.d.ts +0 -3
  4. package/dist/core.js +3 -3
  5. package/dist/core.js.map +1 -1
  6. package/dist/global.cjs +2 -2
  7. package/dist/global.cjs.map +1 -1
  8. package/dist/global.d.ts +0 -1
  9. package/dist/global.js +3 -3
  10. package/dist/global.js.map +1 -1
  11. package/dist/helpers.d.ts +0 -2
  12. package/dist/index.cjs +1 -0
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.ts +2 -3
  15. package/dist/index.js +2 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/module/index.cjs +3 -2
  18. package/dist/module/index.cjs.map +1 -1
  19. package/dist/module/index.d.ts +0 -1
  20. package/dist/module/index.js +4 -3
  21. package/dist/module/index.js.map +1 -1
  22. package/dist/plugins/generate-preload-assets.cjs +2 -2
  23. package/dist/plugins/generate-preload-assets.cjs.map +1 -1
  24. package/dist/plugins/generate-preload-assets.js +3 -3
  25. package/dist/plugins/generate-preload-assets.js.map +1 -1
  26. package/dist/plugins/snapshot/SnapshotHandler.cjs +14 -8
  27. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
  28. package/dist/plugins/snapshot/SnapshotHandler.d.ts +0 -2
  29. package/dist/plugins/snapshot/SnapshotHandler.js +16 -10
  30. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
  31. package/dist/plugins/snapshot/index.cjs +3 -2
  32. package/dist/plugins/snapshot/index.cjs.map +1 -1
  33. package/dist/plugins/snapshot/index.js +4 -3
  34. package/dist/plugins/snapshot/index.js.map +1 -1
  35. package/dist/remote/index.cjs +5 -4
  36. package/dist/remote/index.cjs.map +1 -1
  37. package/dist/remote/index.d.ts +0 -2
  38. package/dist/remote/index.js +8 -7
  39. package/dist/remote/index.js.map +1 -1
  40. package/dist/shared/index.cjs +9 -10
  41. package/dist/shared/index.cjs.map +1 -1
  42. package/dist/shared/index.d.ts +0 -3
  43. package/dist/shared/index.js +11 -12
  44. package/dist/shared/index.js.map +1 -1
  45. package/dist/types.d.ts +0 -1
  46. package/dist/utils/context.cjs +45 -0
  47. package/dist/utils/context.cjs.map +1 -0
  48. package/dist/utils/context.d.ts +1 -0
  49. package/dist/utils/context.js +44 -0
  50. package/dist/utils/context.js.map +1 -0
  51. package/dist/utils/env.cjs.map +1 -1
  52. package/dist/utils/env.d.ts +1 -1
  53. package/dist/utils/env.js.map +1 -1
  54. package/dist/utils/hooks/pluginSystem.d.ts +1 -1
  55. package/dist/utils/index.cjs +1 -0
  56. package/dist/utils/index.d.ts +1 -3
  57. package/dist/utils/index.js +1 -0
  58. package/dist/utils/load.cjs +15 -13
  59. package/dist/utils/load.cjs.map +1 -1
  60. package/dist/utils/load.d.ts +0 -2
  61. package/dist/utils/load.js +18 -16
  62. package/dist/utils/load.js.map +1 -1
  63. package/dist/utils/logger.cjs +9 -3
  64. package/dist/utils/logger.cjs.map +1 -1
  65. package/dist/utils/logger.d.ts +5 -2
  66. package/dist/utils/logger.js +9 -3
  67. package/dist/utils/logger.js.map +1 -1
  68. package/dist/utils/manifest.d.ts +0 -2
  69. package/dist/utils/plugin.d.ts +1 -2
  70. package/dist/utils/preload.d.ts +0 -2
  71. package/dist/utils/share.cjs +2 -2
  72. package/dist/utils/share.cjs.map +1 -1
  73. package/dist/utils/share.d.ts +0 -3
  74. package/dist/utils/share.js +2 -2
  75. package/dist/utils/share.js.map +1 -1
  76. package/dist/utils/tool.cjs +1 -1
  77. package/dist/utils/tool.cjs.map +1 -1
  78. package/dist/utils/tool.d.ts +0 -1
  79. package/dist/utils/tool.js +2 -2
  80. package/dist/utils/tool.js.map +1 -1
  81. package/package.json +10 -3
@@ -1,13 +1,14 @@
1
- import { assert } from "../utils/logger.js";
1
+ import { assert, error } from "../utils/logger.js";
2
2
  import { DEFAULT_SCOPE } from "../constant.js";
3
3
  import { addUseIn, directShare, formatShareConfigs, getGlobalShareScope, getRegisteredShare, getTargetSharedOptions, shouldUseTreeShaking } from "../utils/share.js";
4
+ import { optionsToMFContext } from "../utils/context.js";
4
5
  import "../utils/index.js";
5
6
  import { AsyncHook } from "../utils/hooks/asyncHook.js";
6
7
  import { SyncWaterfallHook } from "../utils/hooks/syncWaterfallHook.js";
7
8
  import { AsyncWaterfallHook } from "../utils/hooks/asyncWaterfallHooks.js";
8
9
  import { PluginSystem } from "../utils/hooks/pluginSystem.js";
9
10
  import "../utils/hooks/index.js";
10
- import { RUNTIME_005, RUNTIME_006, getShortErrorMsg, runtimeDescMap } from "@module-federation/error-codes";
11
+ import { RUNTIME_005, RUNTIME_006, runtimeDescMap } from "@module-federation/error-codes";
11
12
 
12
13
  //#region src/shared/index.ts
13
14
  var SharedHandler = class {
@@ -67,7 +68,7 @@ var SharedHandler = class {
67
68
  shared: host.options.shared,
68
69
  origin: host
69
70
  });
70
- assert(shareOptionsRes, `Cannot find ${pkgName} Share in the ${host.options.name}. Please ensure that the ${pkgName} Share parameters have been injected`);
71
+ 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.`);
71
72
  const { shared: registeredShared, useTreesShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
72
73
  if (registeredShared) {
73
74
  const targetShared = directShare(registeredShared, useTreesShaking);
@@ -175,6 +176,7 @@ var SharedHandler = class {
175
176
  lifecycle: "beforeLoadShare",
176
177
  origin: host
177
178
  });
179
+ if (!remoteEntryExports) return;
178
180
  } finally {
179
181
  if (remoteEntryExports?.init && !module.initing) {
180
182
  module.remoteEntryExports = remoteEntryExports;
@@ -233,13 +235,10 @@ var SharedHandler = class {
233
235
  }
234
236
  if (shareOptions.get) {
235
237
  const module = shareOptions.get();
236
- if (module instanceof Promise) {
237
- const errorCode = extraOptions?.from === "build" ? RUNTIME_005 : RUNTIME_006;
238
- throw new Error(getShortErrorMsg(errorCode, runtimeDescMap, {
239
- hostName: host.options.name,
240
- sharedPkgName: pkgName
241
- }));
242
- }
238
+ if (module instanceof Promise) error(extraOptions?.from === "build" ? RUNTIME_005 : RUNTIME_006, runtimeDescMap, {
239
+ hostName: host.options.name,
240
+ sharedPkgName: pkgName
241
+ }, void 0, optionsToMFContext(host.options));
243
242
  shareOptions.lib = module;
244
243
  this.setShared({
245
244
  pkgName,
@@ -250,10 +249,10 @@ var SharedHandler = class {
250
249
  });
251
250
  return shareOptions.lib;
252
251
  }
253
- throw new Error(getShortErrorMsg(RUNTIME_006, runtimeDescMap, {
252
+ error(RUNTIME_006, runtimeDescMap, {
254
253
  hostName: host.options.name,
255
254
  sharedPkgName: pkgName
256
- }));
255
+ }, void 0, optionsToMFContext(host.options));
257
256
  }
258
257
  initShareScopeMap(scopeName, shareScope, extraOptions = {}) {
259
258
  const { host } = this;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n getShortErrorMsg,\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} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport { assert, addUniqueItem } from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport { 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 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 // 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\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 const { shareInfo: shareOptionsRes } = loadShareRes;\n\n // Assert that shareInfoRes exists, if not, throw an error\n assert(\n shareOptionsRes,\n `Cannot find ${pkgName} Share in the ${host.options.name}. Please ensure that the ${pkgName} Share parameters have been injected`,\n );\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 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 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 return loading;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(shareOptionsRes.treeShaking);\n const targetShared = directShare(shareOptionsRes, _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 shareOptionsRes,\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 = shareOptionsRes.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: shareOptionsRes,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n return loading;\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 &&\n 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 origin: host,\n })) as RemoteEntryExports;\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 if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, { strategy: shareOptions.strategy });\n });\n }\n const { shared: registeredShared, useTreesShaking } =\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 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 return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\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 throw new Error(\n getShortErrorMsg(errorCode, runtimeDescMap, {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n }),\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 return shareOptions.lib as () => T;\n }\n\n throw new Error(\n getShortErrorMsg(RUNTIME_006, runtimeDescMap, {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n }),\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.js","names":[],"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} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport { assert, error, addUniqueItem, optionsToMFContext } from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport { 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 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 // 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\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 const { shareInfo: shareOptionsRes } = loadShareRes;\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\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 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 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 return loading;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(shareOptionsRes.treeShaking);\n const targetShared = directShare(shareOptionsRes, _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 shareOptionsRes,\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 = shareOptionsRes.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: shareOptionsRes,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n return loading;\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 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 if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, { strategy: shareOptions.strategy });\n });\n }\n const { shared: registeredShared, useTreesShaking } =\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 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 return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\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 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 }\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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"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { ModuleFederationRuntimePlugin } from "./type/plugin.js";
2
2
  import { CallFrom, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions } from "./type/config.js";
3
3
  import { EntryAssets, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, depsPreloadArg } from "./type/preload.js";
4
- import "./type/index.js";
5
4
  export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions, depsPreloadArg };
@@ -0,0 +1,45 @@
1
+
2
+ //#region src/utils/context.ts
3
+ function remoteToEntry(r) {
4
+ return {
5
+ name: r.name,
6
+ alias: r.alias,
7
+ entry: "entry" in r ? r.entry : void 0,
8
+ version: "version" in r ? r.version : void 0,
9
+ type: r.type,
10
+ entryGlobalName: r.entryGlobalName,
11
+ shareScope: r.shareScope
12
+ };
13
+ }
14
+ /**
15
+ * Build a partial MFContext from runtime Options.
16
+ * Used to enrich diagnostic entries with host context at error sites.
17
+ */
18
+ function optionsToMFContext(options) {
19
+ const shared = {};
20
+ for (const [pkgName, versions] of Object.entries(options.shared)) {
21
+ const first = versions[0];
22
+ if (first) shared[pkgName] = {
23
+ version: first.version,
24
+ singleton: first.shareConfig?.singleton,
25
+ requiredVersion: first.shareConfig?.requiredVersion === false ? false : first.shareConfig?.requiredVersion,
26
+ eager: first.eager,
27
+ strictVersion: first.shareConfig?.strictVersion
28
+ };
29
+ }
30
+ return {
31
+ project: {
32
+ name: options.name,
33
+ mfRole: options.remotes?.length > 0 ? "host" : "unknown"
34
+ },
35
+ mfConfig: {
36
+ name: options.name,
37
+ remotes: options.remotes?.map(remoteToEntry) ?? [],
38
+ shared
39
+ }
40
+ };
41
+ }
42
+
43
+ //#endregion
44
+ exports.optionsToMFContext = optionsToMFContext;
45
+ //# sourceMappingURL=context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.cjs","names":[],"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { MFContext } from '@module-federation/error-codes';\nimport type { Options, Remote } from '../type';\n\nfunction remoteToEntry(\n r: Remote,\n): import('@module-federation/error-codes').MFRemoteEntry {\n return {\n name: r.name,\n alias: r.alias,\n entry: 'entry' in r ? (r as { entry: string }).entry : undefined,\n version: 'version' in r ? (r as { version: string }).version : undefined,\n type: r.type,\n entryGlobalName: r.entryGlobalName,\n shareScope: r.shareScope,\n };\n}\n\n/**\n * Build a partial MFContext from runtime Options.\n * Used to enrich diagnostic entries with host context at error sites.\n */\nexport function optionsToMFContext(options: Options): Partial<MFContext> {\n const shared: MFContext['mfConfig'] extends undefined\n ? never\n : NonNullable<MFContext['mfConfig']>['shared'] = {};\n\n for (const [pkgName, versions] of Object.entries(options.shared)) {\n const first = versions[0];\n if (first) {\n shared[pkgName] = {\n version: first.version,\n singleton: first.shareConfig?.singleton,\n requiredVersion:\n first.shareConfig?.requiredVersion === false\n ? false\n : first.shareConfig?.requiredVersion,\n eager: first.eager,\n strictVersion: first.shareConfig?.strictVersion,\n };\n }\n }\n\n return {\n project: {\n name: options.name,\n mfRole: options.remotes?.length > 0 ? 'host' : 'unknown',\n },\n mfConfig: {\n name: options.name,\n remotes: options.remotes?.map(remoteToEntry) ?? [],\n shared,\n },\n };\n}\n"],"mappings":";;AAGA,SAAS,cACP,GACwD;AACxD,QAAO;EACL,MAAM,EAAE;EACR,OAAO,EAAE;EACT,OAAO,WAAW,IAAK,EAAwB,QAAQ;EACvD,SAAS,aAAa,IAAK,EAA0B,UAAU;EAC/D,MAAM,EAAE;EACR,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf;;;;;;AAOH,SAAgB,mBAAmB,SAAsC;CACvE,MAAM,SAE6C,EAAE;AAErD,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,OAAO,EAAE;EAChE,MAAM,QAAQ,SAAS;AACvB,MAAI,MACF,QAAO,WAAW;GAChB,SAAS,MAAM;GACf,WAAW,MAAM,aAAa;GAC9B,iBACE,MAAM,aAAa,oBAAoB,QACnC,QACA,MAAM,aAAa;GACzB,OAAO,MAAM;GACb,eAAe,MAAM,aAAa;GACnC;;AAIL,QAAO;EACL,SAAS;GACP,MAAM,QAAQ;GACd,QAAQ,QAAQ,SAAS,SAAS,IAAI,SAAS;GAChD;EACD,UAAU;GACR,MAAM,QAAQ;GACd,SAAS,QAAQ,SAAS,IAAI,cAAc,IAAI,EAAE;GAClD;GACD;EACF"}
@@ -0,0 +1 @@
1
+ import { MFContext } from "@module-federation/error-codes";
@@ -0,0 +1,44 @@
1
+ //#region src/utils/context.ts
2
+ function remoteToEntry(r) {
3
+ return {
4
+ name: r.name,
5
+ alias: r.alias,
6
+ entry: "entry" in r ? r.entry : void 0,
7
+ version: "version" in r ? r.version : void 0,
8
+ type: r.type,
9
+ entryGlobalName: r.entryGlobalName,
10
+ shareScope: r.shareScope
11
+ };
12
+ }
13
+ /**
14
+ * Build a partial MFContext from runtime Options.
15
+ * Used to enrich diagnostic entries with host context at error sites.
16
+ */
17
+ function optionsToMFContext(options) {
18
+ const shared = {};
19
+ for (const [pkgName, versions] of Object.entries(options.shared)) {
20
+ const first = versions[0];
21
+ if (first) shared[pkgName] = {
22
+ version: first.version,
23
+ singleton: first.shareConfig?.singleton,
24
+ requiredVersion: first.shareConfig?.requiredVersion === false ? false : first.shareConfig?.requiredVersion,
25
+ eager: first.eager,
26
+ strictVersion: first.shareConfig?.strictVersion
27
+ };
28
+ }
29
+ return {
30
+ project: {
31
+ name: options.name,
32
+ mfRole: options.remotes?.length > 0 ? "host" : "unknown"
33
+ },
34
+ mfConfig: {
35
+ name: options.name,
36
+ remotes: options.remotes?.map(remoteToEntry) ?? [],
37
+ shared
38
+ }
39
+ };
40
+ }
41
+
42
+ //#endregion
43
+ export { optionsToMFContext };
44
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { MFContext } from '@module-federation/error-codes';\nimport type { Options, Remote } from '../type';\n\nfunction remoteToEntry(\n r: Remote,\n): import('@module-federation/error-codes').MFRemoteEntry {\n return {\n name: r.name,\n alias: r.alias,\n entry: 'entry' in r ? (r as { entry: string }).entry : undefined,\n version: 'version' in r ? (r as { version: string }).version : undefined,\n type: r.type,\n entryGlobalName: r.entryGlobalName,\n shareScope: r.shareScope,\n };\n}\n\n/**\n * Build a partial MFContext from runtime Options.\n * Used to enrich diagnostic entries with host context at error sites.\n */\nexport function optionsToMFContext(options: Options): Partial<MFContext> {\n const shared: MFContext['mfConfig'] extends undefined\n ? never\n : NonNullable<MFContext['mfConfig']>['shared'] = {};\n\n for (const [pkgName, versions] of Object.entries(options.shared)) {\n const first = versions[0];\n if (first) {\n shared[pkgName] = {\n version: first.version,\n singleton: first.shareConfig?.singleton,\n requiredVersion:\n first.shareConfig?.requiredVersion === false\n ? false\n : first.shareConfig?.requiredVersion,\n eager: first.eager,\n strictVersion: first.shareConfig?.strictVersion,\n };\n }\n }\n\n return {\n project: {\n name: options.name,\n mfRole: options.remotes?.length > 0 ? 'host' : 'unknown',\n },\n mfConfig: {\n name: options.name,\n remotes: options.remotes?.map(remoteToEntry) ?? [],\n shared,\n },\n };\n}\n"],"mappings":";AAGA,SAAS,cACP,GACwD;AACxD,QAAO;EACL,MAAM,EAAE;EACR,OAAO,EAAE;EACT,OAAO,WAAW,IAAK,EAAwB,QAAQ;EACvD,SAAS,aAAa,IAAK,EAA0B,UAAU;EAC/D,MAAM,EAAE;EACR,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf;;;;;;AAOH,SAAgB,mBAAmB,SAAsC;CACvE,MAAM,SAE6C,EAAE;AAErD,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,OAAO,EAAE;EAChE,MAAM,QAAQ,SAAS;AACvB,MAAI,MACF,QAAO,WAAW;GAChB,SAAS,MAAM;GACf,WAAW,MAAM,aAAa;GAC9B,iBACE,MAAM,aAAa,oBAAoB,QACnC,QACA,MAAM,aAAa;GACzB,OAAO,MAAM;GACb,eAAe,MAAM,aAAa;GACnC;;AAIL,QAAO;EACL,SAAS;GACP,MAAM,QAAQ;GACd,QAAQ,QAAQ,SAAS,SAAS,IAAI,SAAS;GAChD;EACD,UAAU;GACR,MAAM,QAAQ;GACd,SAAS,QAAQ,SAAS,IAAI,cAAc,IAAI,EAAE;GAClD;GACD;EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.cjs","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export { isBrowserEnv, isDebugMode } from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAMA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}
1
+ {"version":3,"file":"env.cjs","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export {\n isBrowserEnv,\n isBrowserEnvValue,\n isDebugMode,\n} from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAUA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}
@@ -1 +1 @@
1
- import "@module-federation/sdk";
1
+ export { };
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export { isBrowserEnv, isDebugMode } from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAMA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}
1
+ {"version":3,"file":"env.js","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export {\n isBrowserEnv,\n isBrowserEnvValue,\n isDebugMode,\n} from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAUA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}
@@ -15,5 +15,5 @@ declare class PluginSystem<T extends Record<string, any>> {
15
15
  removePlugin(pluginName: string): void;
16
16
  }
17
17
  //#endregion
18
- export { Plugin, PluginSystem };
18
+ export { PluginSystem };
19
19
  //# sourceMappingURL=pluginSystem.d.ts.map
@@ -4,4 +4,5 @@ const require_env = require('./env.cjs');
4
4
  const require_manifest = require('./manifest.cjs');
5
5
  const require_plugin = require('./plugin.cjs');
6
6
  const require_load = require('./load.cjs');
7
+ const require_context = require('./context.cjs');
7
8
  let _module_federation_sdk = require("@module-federation/sdk");
@@ -1,6 +1,4 @@
1
- import "./env.js";
2
1
  import { isStaticResourcesEqual, safeWrapper } from "./tool.js";
3
2
  import { matchRemoteWithNameAndExpose } from "./manifest.js";
4
- import { assert } from "./logger.js";
5
- import "./plugin.js";
3
+ import { assert, error } from "./logger.js";
6
4
  import { getRemoteEntry, getRemoteInfo } from "./load.js";
@@ -4,5 +4,6 @@ import { getBuilderId } from "./env.js";
4
4
  import { matchRemote, matchRemoteWithNameAndExpose } from "./manifest.js";
5
5
  import { registerPlugins } from "./plugin.js";
6
6
  import { getRemoteEntry, getRemoteEntryUniqueKey, getRemoteInfo } from "./load.js";
7
+ import { optionsToMFContext } from "./context.js";
7
8
 
8
9
  export { };
@@ -17,7 +17,7 @@ async function loadEsmEntry({ entry, remoteEntryExports }) {
17
17
  ).then(resolve).catch(reject);
18
18
  else resolve(remoteEntryExports);
19
19
  } catch (e) {
20
- reject(e);
20
+ require_logger.error(`Failed to load ESM entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
21
21
  }
22
22
  });
23
23
  }
@@ -28,23 +28,24 @@ async function loadSystemJsEntry({ entry, remoteEntryExports }) {
28
28
  else new Function("callbacks", `System.import("${entry}")${importCallback}`)([resolve, reject]);
29
29
  else resolve(remoteEntryExports);
30
30
  } catch (e) {
31
- reject(e);
31
+ require_logger.error(`Failed to load SystemJS entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
32
32
  }
33
33
  });
34
34
  }
35
35
  function handleRemoteEntryLoaded(name, globalName, entry) {
36
36
  const { remoteEntryKey, entryExports } = require_global.getRemoteEntryExports(name, globalName);
37
- require_logger.assert(entryExports, (0, _module_federation_error_codes.getShortErrorMsg)(_module_federation_error_codes.RUNTIME_001, _module_federation_error_codes.runtimeDescMap, {
37
+ if (!entryExports) require_logger.error(_module_federation_error_codes.RUNTIME_001, _module_federation_error_codes.runtimeDescMap, {
38
38
  remoteName: name,
39
39
  remoteEntryUrl: entry,
40
40
  remoteEntryKey
41
- }));
41
+ });
42
42
  return entryExports;
43
43
  }
44
44
  async function loadEntryScript({ name, globalName, entry, loaderHook, getEntryUrl }) {
45
45
  const { entryExports: remoteEntryExports } = require_global.getRemoteEntryExports(name, globalName);
46
46
  if (remoteEntryExports) return remoteEntryExports;
47
- return (0, _module_federation_sdk.loadScript)(getEntryUrl ? getEntryUrl(entry) : entry, {
47
+ const url = getEntryUrl ? getEntryUrl(entry) : entry;
48
+ return (0, _module_federation_sdk.loadScript)(url, {
48
49
  attrs: {},
49
50
  createScriptHook: (url, attrs) => {
50
51
  const res = loaderHook.lifecycle.createScript.emit({
@@ -57,12 +58,12 @@ async function loadEntryScript({ name, globalName, entry, loaderHook, getEntryUr
57
58
  }
58
59
  }).then(() => {
59
60
  return handleRemoteEntryLoaded(name, globalName, entry);
60
- }).catch((e) => {
61
- require_logger.assert(void 0, (0, _module_federation_error_codes.getShortErrorMsg)(_module_federation_error_codes.RUNTIME_008, _module_federation_error_codes.runtimeDescMap, {
61
+ }, (loadError) => {
62
+ const originalMsg = loadError instanceof Error ? loadError.message : String(loadError);
63
+ require_logger.error(_module_federation_error_codes.RUNTIME_008, _module_federation_error_codes.runtimeDescMap, {
62
64
  remoteName: name,
63
- resourceUrl: entry
64
- }));
65
- throw e;
65
+ resourceUrl: url
66
+ }, originalMsg);
66
67
  });
67
68
  }
68
69
  async function loadEntryDom({ remoteInfo, remoteEntryExports, loaderHook, getEntryUrl }) {
@@ -107,7 +108,7 @@ async function loadEntryNode({ remoteInfo, loaderHook }) {
107
108
  }).then(() => {
108
109
  return handleRemoteEntryLoaded(name, globalName, entry);
109
110
  }).catch((e) => {
110
- throw e;
111
+ require_logger.error(`Failed to load Node.js entry for remote "${name}" from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
111
112
  });
112
113
  }
113
114
  function getRemoteEntryUniqueKey(remoteInfo) {
@@ -127,7 +128,7 @@ async function getRemoteEntry(params) {
127
128
  remoteEntryExports
128
129
  }).then((res) => {
129
130
  if (res) return res;
130
- return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : (0, _module_federation_sdk.isBrowserEnv)()) ? loadEntryDom({
131
+ return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : _module_federation_sdk.isBrowserEnvValue) ? loadEntryDom({
131
132
  remoteInfo,
132
133
  remoteEntryExports,
133
134
  loaderHook,
@@ -138,7 +139,8 @@ async function getRemoteEntry(params) {
138
139
  });
139
140
  }).catch(async (err) => {
140
141
  const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
141
- if (err instanceof Error && err.message.includes(_module_federation_error_codes.RUNTIME_008) && !_inErrorHandling) {
142
+ const isScriptExecutionError = err instanceof Error && err.message.includes("ScriptExecutionError");
143
+ if (err instanceof Error && err.message.includes(_module_federation_error_codes.RUNTIME_008) && !isScriptExecutionError && !_inErrorHandling) {
142
144
  const wrappedGetRemoteEntry = (params) => {
143
145
  return getRemoteEntry({
144
146
  ...params,
@@ -1 +1 @@
1
- {"version":3,"file":"load.cjs","names":["getRemoteEntryExports","RUNTIME_001","runtimeDescMap","RUNTIME_008","globalLoading","DEFAULT_REMOTE_TYPE","DEFAULT_SCOPE"],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnv,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport { Remote, RemoteEntryExports, RemoteInfo } from '../type';\nimport { assert } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n getShortErrorMsg,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${entry}\")${importCallback}`)([\n resolve,\n reject,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ entry)\n .then(resolve)\n .catch(reject);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n assert(\n entryExports,\n getShortErrorMsg(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n }),\n );\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n loaderHook,\n getEntryUrl,\n}: {\n name: string;\n globalName: string;\n entry: string;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n assert(\n undefined,\n getShortErrorMsg(RUNTIME_008, runtimeDescMap, {\n remoteName: name,\n resourceUrl: entry,\n }),\n );\n throw e;\n });\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n switch (type) {\n case 'esm':\n case 'module':\n return loadEsmEntry({ entry, remoteEntryExports });\n case 'system':\n return loadSystemJsEntry({ entry, remoteEntryExports });\n default:\n return loadEntryScript({\n entry,\n globalName,\n name,\n loaderHook,\n getEntryUrl,\n });\n }\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n throw e;\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n // Use ENV_TARGET if defined, otherwise fallback to isBrowserEnv, must keep this\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnv();\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n })\n : loadEntryNode({ remoteInfo, loaderHook });\n })\n .catch(async (err) => {\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n const isScriptLoadError =\n err instanceof Error && err.message.includes(RUNTIME_008);\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const RemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo: remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (RemoteEntryExports) {\n return RemoteEntryExports;\n }\n }\n throw err;\n });\n }\n\n return globalLoading[uniqueKey];\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"load.cjs","names":["getRemoteEntryExports","RUNTIME_001","runtimeDescMap","RUNTIME_008","globalLoading","isBrowserEnvValue","DEFAULT_REMOTE_TYPE","DEFAULT_SCOPE"],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport { Remote, RemoteEntryExports, RemoteInfo } from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${entry}\")${importCallback}`)([\n resolve,\n reject,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ entry)\n .then(resolve)\n .catch(reject);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n loaderHook,\n getEntryUrl,\n}: {\n name: string;\n globalName: string;\n entry: string;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n switch (type) {\n case 'esm':\n case 'module':\n return loadEsmEntry({ entry, remoteEntryExports });\n case 'system':\n return loadSystemJsEntry({ entry, remoteEntryExports });\n default:\n return loadEntryScript({\n entry,\n globalName,\n name,\n loaderHook,\n getEntryUrl,\n });\n }\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n // Use ENV_TARGET if defined, otherwise fallback to isBrowserEnvValue\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n })\n : loadEntryNode({ remoteInfo, loaderHook });\n })\n .catch(async (err) => {\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n // ScriptExecutionError means the script downloaded fine but its IIFE\n // threw at runtime — retrying would reproduce the same error, so exclude it.\n const isScriptExecutionError =\n err instanceof Error && err.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n err instanceof Error &&\n err.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const RemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo: remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (RemoteEntryExports) {\n return RemoteEntryExports;\n }\n }\n throw err;\n });\n }\n\n return globalLoading[uniqueKey];\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { ModuleFederation } from "../core.js";
2
2
  import { Remote, RemoteEntryExports, RemoteInfo } from "../type/config.js";
3
- import "../type/index.js";
4
-
5
3
  //#region src/utils/load.d.ts
6
4
  declare function getRemoteEntry(params: {
7
5
  origin: ModuleFederation;
@@ -1,8 +1,8 @@
1
- import { assert } from "./logger.js";
1
+ import { error } from "./logger.js";
2
2
  import { getRemoteEntryExports, globalLoading } from "../global.js";
3
3
  import { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from "../constant.js";
4
- import { composeKeyWithSeparator, isBrowserEnv, loadScript, loadScriptNode } from "@module-federation/sdk";
5
- import { RUNTIME_001, RUNTIME_008, getShortErrorMsg, runtimeDescMap } from "@module-federation/error-codes";
4
+ import { composeKeyWithSeparator, isBrowserEnvValue, loadScript, loadScriptNode } from "@module-federation/sdk";
5
+ import { RUNTIME_001, RUNTIME_008, runtimeDescMap } from "@module-federation/error-codes";
6
6
 
7
7
  //#region src/utils/load.ts
8
8
  const importCallback = ".then(callbacks[0]).catch(callbacks[1])";
@@ -17,7 +17,7 @@ async function loadEsmEntry({ entry, remoteEntryExports }) {
17
17
  ).then(resolve).catch(reject);
18
18
  else resolve(remoteEntryExports);
19
19
  } catch (e) {
20
- reject(e);
20
+ error(`Failed to load ESM entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
21
21
  }
22
22
  });
23
23
  }
@@ -28,23 +28,24 @@ async function loadSystemJsEntry({ entry, remoteEntryExports }) {
28
28
  else new Function("callbacks", `System.import("${entry}")${importCallback}`)([resolve, reject]);
29
29
  else resolve(remoteEntryExports);
30
30
  } catch (e) {
31
- reject(e);
31
+ error(`Failed to load SystemJS entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
32
32
  }
33
33
  });
34
34
  }
35
35
  function handleRemoteEntryLoaded(name, globalName, entry) {
36
36
  const { remoteEntryKey, entryExports } = getRemoteEntryExports(name, globalName);
37
- assert(entryExports, getShortErrorMsg(RUNTIME_001, runtimeDescMap, {
37
+ if (!entryExports) error(RUNTIME_001, runtimeDescMap, {
38
38
  remoteName: name,
39
39
  remoteEntryUrl: entry,
40
40
  remoteEntryKey
41
- }));
41
+ });
42
42
  return entryExports;
43
43
  }
44
44
  async function loadEntryScript({ name, globalName, entry, loaderHook, getEntryUrl }) {
45
45
  const { entryExports: remoteEntryExports } = getRemoteEntryExports(name, globalName);
46
46
  if (remoteEntryExports) return remoteEntryExports;
47
- return loadScript(getEntryUrl ? getEntryUrl(entry) : entry, {
47
+ const url = getEntryUrl ? getEntryUrl(entry) : entry;
48
+ return loadScript(url, {
48
49
  attrs: {},
49
50
  createScriptHook: (url, attrs) => {
50
51
  const res = loaderHook.lifecycle.createScript.emit({
@@ -57,12 +58,12 @@ async function loadEntryScript({ name, globalName, entry, loaderHook, getEntryUr
57
58
  }
58
59
  }).then(() => {
59
60
  return handleRemoteEntryLoaded(name, globalName, entry);
60
- }).catch((e) => {
61
- assert(void 0, getShortErrorMsg(RUNTIME_008, runtimeDescMap, {
61
+ }, (loadError) => {
62
+ const originalMsg = loadError instanceof Error ? loadError.message : String(loadError);
63
+ error(RUNTIME_008, runtimeDescMap, {
62
64
  remoteName: name,
63
- resourceUrl: entry
64
- }));
65
- throw e;
65
+ resourceUrl: url
66
+ }, originalMsg);
66
67
  });
67
68
  }
68
69
  async function loadEntryDom({ remoteInfo, remoteEntryExports, loaderHook, getEntryUrl }) {
@@ -107,7 +108,7 @@ async function loadEntryNode({ remoteInfo, loaderHook }) {
107
108
  }).then(() => {
108
109
  return handleRemoteEntryLoaded(name, globalName, entry);
109
110
  }).catch((e) => {
110
- throw e;
111
+ error(`Failed to load Node.js entry for remote "${name}" from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
111
112
  });
112
113
  }
113
114
  function getRemoteEntryUniqueKey(remoteInfo) {
@@ -127,7 +128,7 @@ async function getRemoteEntry(params) {
127
128
  remoteEntryExports
128
129
  }).then((res) => {
129
130
  if (res) return res;
130
- return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : isBrowserEnv()) ? loadEntryDom({
131
+ return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : isBrowserEnvValue) ? loadEntryDom({
131
132
  remoteInfo,
132
133
  remoteEntryExports,
133
134
  loaderHook,
@@ -138,7 +139,8 @@ async function getRemoteEntry(params) {
138
139
  });
139
140
  }).catch(async (err) => {
140
141
  const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
141
- if (err instanceof Error && err.message.includes(RUNTIME_008) && !_inErrorHandling) {
142
+ const isScriptExecutionError = err instanceof Error && err.message.includes("ScriptExecutionError");
143
+ if (err instanceof Error && err.message.includes(RUNTIME_008) && !isScriptExecutionError && !_inErrorHandling) {
142
144
  const wrappedGetRemoteEntry = (params) => {
143
145
  return getRemoteEntry({
144
146
  ...params,