@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
package/dist/core.cjs CHANGED
@@ -30,7 +30,7 @@ var ModuleFederation = class {
30
30
  beforeInitContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("beforeInitContainer"),
31
31
  initContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("initContainer")
32
32
  });
33
- this.version = "2.1.0";
33
+ this.version = "2.2.0";
34
34
  this.moduleCache = /* @__PURE__ */ new Map();
35
35
  this.loaderHook = new require_pluginSystem.PluginSystem({
36
36
  getModuleInfo: new require_syncHook.SyncHook(),
@@ -53,7 +53,7 @@ var ModuleFederation = class {
53
53
  plugins,
54
54
  remotes: [],
55
55
  shared: {},
56
- inBrowser: (0, _module_federation_sdk.isBrowserEnv)()
56
+ inBrowser: _module_federation_sdk.isBrowserEnvValue
57
57
  };
58
58
  this.name = userOptions.name;
59
59
  this.options = defaultOptions;
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":["PluginSystem","SyncWaterfallHook","SyncHook","AsyncWaterfallHook","AsyncHook","snapshotPlugin","generatePreloadAssetsPlugin","getBuilderId","SnapshotHandler","SharedHandler","RemoteHandler","RUNTIME_010","runtimeDescMap","DEFAULT_SCOPE","getRemoteInfo","Module","formatShareConfigs","registerPlugins"],"sources":["../src/core.ts"],"sourcesContent":["import { isBrowserEnv } from '@module-federation/sdk';\nimport type {\n CreateScriptHookReturn,\n GlobalModuleInfo,\n ModuleInfo,\n} from '@module-federation/sdk';\nimport {\n Options,\n PreloadRemoteArgs,\n RemoteEntryExports,\n Remote,\n Shared,\n ShareInfos,\n UserOptions,\n RemoteInfo,\n ShareScopeMap,\n InitScope,\n RemoteEntryInitOptions,\n CallFrom,\n} from './type';\nimport { getBuilderId, registerPlugins, getRemoteEntry, error } from './utils';\nimport {\n getShortErrorMsg,\n RUNTIME_010,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Module } from './module';\nimport {\n AsyncHook,\n AsyncWaterfallHook,\n PluginSystem,\n SyncHook,\n SyncWaterfallHook,\n} from './utils/hooks';\nimport { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets';\nimport { snapshotPlugin } from './plugins/snapshot';\nimport { getRemoteInfo } from './utils/load';\nimport { DEFAULT_SCOPE } from './constant';\nimport { SnapshotHandler } from './plugins/snapshot/SnapshotHandler';\nimport { SharedHandler } from './shared';\nimport { RemoteHandler } from './remote';\nimport { formatShareConfigs } from './utils/share';\n\n// Declare the global constant that will be defined by DefinePlugin\n// Default to true if not defined (e.g., when runtime-core is used outside of webpack)\n// so that snapshot functionality is included by default.\ndeclare const FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN: boolean;\nconst USE_SNAPSHOT =\n typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === 'boolean'\n ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN\n : true; // Default to true (use snapshot) when not explicitly defined\n\nexport class ModuleFederation {\n options: Options;\n hooks = new PluginSystem({\n beforeInit: new SyncWaterfallHook<{\n userOptions: UserOptions;\n options: Options;\n origin: ModuleFederation;\n /**\n * @deprecated shareInfo will be removed soon, please use userOptions directly!\n */\n shareInfo: ShareInfos;\n }>('beforeInit'),\n init: new SyncHook<\n [\n {\n options: Options;\n origin: ModuleFederation;\n },\n ],\n void\n >(),\n // maybe will change, temporarily for internal use only\n beforeInitContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n origin: ModuleFederation;\n }>('beforeInitContainer'),\n // maybe will change, temporarily for internal use only\n initContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n remoteEntryExports: RemoteEntryExports;\n origin: ModuleFederation;\n id?: string;\n remoteSnapshot?: ModuleInfo;\n }>('initContainer'),\n });\n version: string = __VERSION__;\n name: string;\n moduleCache: Map<string, Module> = new Map();\n snapshotHandler: SnapshotHandler;\n sharedHandler: SharedHandler;\n remoteHandler: RemoteHandler;\n shareScopeMap: ShareScopeMap;\n loaderHook = new PluginSystem({\n // FIXME: may not be suitable , not open to the public yet\n getModuleInfo: new SyncHook<\n [\n {\n target: Record<string, any>;\n key: any;\n },\n ],\n { value: any | undefined; key: string } | void\n >(),\n createScript: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n CreateScriptHookReturn\n >(),\n createLink: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n HTMLLinkElement | void\n >(),\n fetch: new AsyncHook<\n [string, RequestInit],\n Promise<Response> | void | false\n >(),\n loadEntryError: new AsyncHook<\n [\n {\n getRemoteEntry: typeof getRemoteEntry;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n globalLoading: Record<\n string,\n Promise<void | RemoteEntryExports> | undefined\n >;\n uniqueKey: string;\n },\n ],\n Promise<Promise<RemoteEntryExports | undefined> | undefined>\n >(),\n getModuleFactory: new AsyncHook<\n [\n {\n remoteEntryExports: RemoteEntryExports;\n expose: string;\n moduleInfo: RemoteInfo;\n },\n ],\n Promise<(() => Promise<Module>) | undefined>\n >(),\n });\n bridgeHook = new PluginSystem({\n beforeBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n beforeBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n });\n moduleInfo?: GlobalModuleInfo[string];\n\n constructor(userOptions: UserOptions) {\n const plugins = USE_SNAPSHOT\n ? [snapshotPlugin(), generatePreloadAssetsPlugin()]\n : [];\n // TODO: Validate the details of the options\n // Initialize options with default values\n const defaultOptions: Options = {\n id: getBuilderId(),\n name: userOptions.name,\n plugins,\n remotes: [],\n shared: {},\n inBrowser: isBrowserEnv(),\n };\n\n this.name = userOptions.name;\n this.options = defaultOptions;\n this.snapshotHandler = new SnapshotHandler(this);\n this.sharedHandler = new SharedHandler(this);\n this.remoteHandler = new RemoteHandler(this);\n this.shareScopeMap = this.sharedHandler.shareScopeMap;\n this.registerPlugins([\n ...defaultOptions.plugins,\n ...(userOptions.plugins || []),\n ]);\n this.options = this.formatOptions(defaultOptions, userOptions);\n }\n\n initOptions(userOptions: UserOptions): Options {\n if (userOptions.name && userOptions.name !== this.options.name) {\n error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));\n }\n this.registerPlugins(userOptions.plugins);\n const options = this.formatOptions(this.options, userOptions);\n\n this.options = options;\n\n return options;\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 return this.sharedHandler.loadShare(pkgName, extraOptions);\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 customShareInfo?: Partial<Shared>;\n from?: 'build' | 'runtime';\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n return this.sharedHandler.loadShareSync(pkgName, extraOptions);\n }\n\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: Shared['strategy'];\n },\n ): Array<Promise<void>> {\n return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host: this, remoteInfo });\n\n module.remoteEntryExports = container;\n this.moduleCache.set(name, module);\n\n return module;\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 return this.remoteHandler.loadRemote(id, options);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n return this.remoteHandler.preloadRemote(preloadOptions);\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);\n }\n\n formatOptions(globalOptions: Options, userOptions: UserOptions): Options {\n const { allShareInfos: shared } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n const { userOptions: userOptionsRes, options: globalOptionsRes } =\n this.hooks.lifecycle.beforeInit.emit({\n origin: this,\n userOptions,\n options: globalOptions,\n shareInfo: shared,\n });\n\n const remotes = this.remoteHandler.formatAndRegisterRemote(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const { allShareInfos } = this.sharedHandler.registerShared(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const plugins = [...globalOptionsRes.plugins];\n\n if (userOptionsRes.plugins) {\n userOptionsRes.plugins.forEach((plugin) => {\n if (!plugins.includes(plugin)) {\n plugins.push(plugin);\n }\n });\n }\n\n const optionsRes: Options = {\n ...globalOptions,\n ...userOptions,\n plugins,\n remotes,\n shared: allShareInfos,\n };\n\n this.hooks.lifecycle.init.emit({\n origin: this,\n options: optionsRes,\n });\n return optionsRes;\n }\n\n registerPlugins(plugins: UserOptions['plugins']) {\n const pluginRes = registerPlugins(plugins, this);\n // Merge plugin\n this.options.plugins = this.options.plugins.reduce((res, plugin) => {\n if (!plugin) return res;\n if (res && !res.find((item) => item.name === plugin.name)) {\n res.push(plugin);\n }\n return res;\n }, pluginRes || []);\n }\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n return this.remoteHandler.registerRemotes(remotes, options);\n }\n\n registerShared(shared: UserOptions['shared']) {\n this.sharedHandler.registerShared(this.options, {\n ...this.options,\n shared,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":["PluginSystem","SyncWaterfallHook","SyncHook","AsyncWaterfallHook","AsyncHook","snapshotPlugin","generatePreloadAssetsPlugin","getBuilderId","isBrowserEnvValue","SnapshotHandler","SharedHandler","RemoteHandler","RUNTIME_010","runtimeDescMap","DEFAULT_SCOPE","getRemoteInfo","Module","formatShareConfigs","registerPlugins"],"sources":["../src/core.ts"],"sourcesContent":["import { isBrowserEnvValue } from '@module-federation/sdk';\nimport type {\n CreateScriptHookReturn,\n GlobalModuleInfo,\n ModuleInfo,\n} from '@module-federation/sdk';\nimport {\n Options,\n PreloadRemoteArgs,\n RemoteEntryExports,\n Remote,\n Shared,\n ShareInfos,\n UserOptions,\n RemoteInfo,\n ShareScopeMap,\n InitScope,\n RemoteEntryInitOptions,\n CallFrom,\n} from './type';\nimport { getBuilderId, registerPlugins, getRemoteEntry, error } from './utils';\nimport {\n getShortErrorMsg,\n RUNTIME_010,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Module } from './module';\nimport {\n AsyncHook,\n AsyncWaterfallHook,\n PluginSystem,\n SyncHook,\n SyncWaterfallHook,\n} from './utils/hooks';\nimport { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets';\nimport { snapshotPlugin } from './plugins/snapshot';\nimport { getRemoteInfo } from './utils/load';\nimport { DEFAULT_SCOPE } from './constant';\nimport { SnapshotHandler } from './plugins/snapshot/SnapshotHandler';\nimport { SharedHandler } from './shared';\nimport { RemoteHandler } from './remote';\nimport { formatShareConfigs } from './utils/share';\n\n// Declare the global constant that will be defined by DefinePlugin\n// Default to true if not defined (e.g., when runtime-core is used outside of webpack)\n// so that snapshot functionality is included by default.\ndeclare const FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN: boolean;\nconst USE_SNAPSHOT =\n typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === 'boolean'\n ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN\n : true; // Default to true (use snapshot) when not explicitly defined\n\nexport class ModuleFederation {\n options: Options;\n hooks = new PluginSystem({\n beforeInit: new SyncWaterfallHook<{\n userOptions: UserOptions;\n options: Options;\n origin: ModuleFederation;\n /**\n * @deprecated shareInfo will be removed soon, please use userOptions directly!\n */\n shareInfo: ShareInfos;\n }>('beforeInit'),\n init: new SyncHook<\n [\n {\n options: Options;\n origin: ModuleFederation;\n },\n ],\n void\n >(),\n // maybe will change, temporarily for internal use only\n beforeInitContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n origin: ModuleFederation;\n }>('beforeInitContainer'),\n // maybe will change, temporarily for internal use only\n initContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n remoteEntryExports: RemoteEntryExports;\n origin: ModuleFederation;\n id?: string;\n remoteSnapshot?: ModuleInfo;\n }>('initContainer'),\n });\n version: string = __VERSION__;\n name: string;\n moduleCache: Map<string, Module> = new Map();\n snapshotHandler: SnapshotHandler;\n sharedHandler: SharedHandler;\n remoteHandler: RemoteHandler;\n shareScopeMap: ShareScopeMap;\n loaderHook = new PluginSystem({\n // FIXME: may not be suitable , not open to the public yet\n getModuleInfo: new SyncHook<\n [\n {\n target: Record<string, any>;\n key: any;\n },\n ],\n { value: any | undefined; key: string } | void\n >(),\n createScript: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n CreateScriptHookReturn\n >(),\n createLink: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n HTMLLinkElement | void\n >(),\n fetch: new AsyncHook<\n [string, RequestInit],\n Promise<Response> | void | false\n >(),\n loadEntryError: new AsyncHook<\n [\n {\n getRemoteEntry: typeof getRemoteEntry;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n globalLoading: Record<\n string,\n Promise<void | RemoteEntryExports> | undefined\n >;\n uniqueKey: string;\n },\n ],\n Promise<Promise<RemoteEntryExports | undefined> | undefined>\n >(),\n getModuleFactory: new AsyncHook<\n [\n {\n remoteEntryExports: RemoteEntryExports;\n expose: string;\n moduleInfo: RemoteInfo;\n },\n ],\n Promise<(() => Promise<Module>) | undefined>\n >(),\n });\n bridgeHook = new PluginSystem({\n beforeBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n beforeBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n });\n moduleInfo?: GlobalModuleInfo[string];\n\n constructor(userOptions: UserOptions) {\n const plugins = USE_SNAPSHOT\n ? [snapshotPlugin(), generatePreloadAssetsPlugin()]\n : [];\n // TODO: Validate the details of the options\n // Initialize options with default values\n const defaultOptions: Options = {\n id: getBuilderId(),\n name: userOptions.name,\n plugins,\n remotes: [],\n shared: {},\n inBrowser: isBrowserEnvValue,\n };\n\n this.name = userOptions.name;\n this.options = defaultOptions;\n this.snapshotHandler = new SnapshotHandler(this);\n this.sharedHandler = new SharedHandler(this);\n this.remoteHandler = new RemoteHandler(this);\n this.shareScopeMap = this.sharedHandler.shareScopeMap;\n this.registerPlugins([\n ...defaultOptions.plugins,\n ...(userOptions.plugins || []),\n ]);\n this.options = this.formatOptions(defaultOptions, userOptions);\n }\n\n initOptions(userOptions: UserOptions): Options {\n if (userOptions.name && userOptions.name !== this.options.name) {\n error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));\n }\n this.registerPlugins(userOptions.plugins);\n const options = this.formatOptions(this.options, userOptions);\n\n this.options = options;\n\n return options;\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 return this.sharedHandler.loadShare(pkgName, extraOptions);\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 customShareInfo?: Partial<Shared>;\n from?: 'build' | 'runtime';\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n return this.sharedHandler.loadShareSync(pkgName, extraOptions);\n }\n\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: Shared['strategy'];\n },\n ): Array<Promise<void>> {\n return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host: this, remoteInfo });\n\n module.remoteEntryExports = container;\n this.moduleCache.set(name, module);\n\n return module;\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 return this.remoteHandler.loadRemote(id, options);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n return this.remoteHandler.preloadRemote(preloadOptions);\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);\n }\n\n formatOptions(globalOptions: Options, userOptions: UserOptions): Options {\n const { allShareInfos: shared } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n const { userOptions: userOptionsRes, options: globalOptionsRes } =\n this.hooks.lifecycle.beforeInit.emit({\n origin: this,\n userOptions,\n options: globalOptions,\n shareInfo: shared,\n });\n\n const remotes = this.remoteHandler.formatAndRegisterRemote(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const { allShareInfos } = this.sharedHandler.registerShared(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const plugins = [...globalOptionsRes.plugins];\n\n if (userOptionsRes.plugins) {\n userOptionsRes.plugins.forEach((plugin) => {\n if (!plugins.includes(plugin)) {\n plugins.push(plugin);\n }\n });\n }\n\n const optionsRes: Options = {\n ...globalOptions,\n ...userOptions,\n plugins,\n remotes,\n shared: allShareInfos,\n };\n\n this.hooks.lifecycle.init.emit({\n origin: this,\n options: optionsRes,\n });\n return optionsRes;\n }\n\n registerPlugins(plugins: UserOptions['plugins']) {\n const pluginRes = registerPlugins(plugins, this);\n // Merge plugin\n this.options.plugins = this.options.plugins.reduce((res, plugin) => {\n if (!plugin) return res;\n if (res && !res.find((item) => item.name === plugin.name)) {\n res.push(plugin);\n }\n return res;\n }, pluginRes || []);\n }\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n return this.remoteHandler.registerRemotes(remotes, options);\n }\n\n registerShared(shared: UserOptions['shared']) {\n this.sharedHandler.registerShared(this.options, {\n ...this.options,\n shared,\n });\n }\n}\n"],"mappings":"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"}
package/dist/core.d.ts CHANGED
@@ -4,15 +4,12 @@ import { AsyncHook } from "./utils/hooks/asyncHook.js";
4
4
  import { SyncWaterfallHook } from "./utils/hooks/syncWaterfallHook.js";
5
5
  import { AsyncWaterfallHook } from "./utils/hooks/asyncWaterfallHooks.js";
6
6
  import { PluginSystem } from "./utils/hooks/pluginSystem.js";
7
- import "./utils/hooks/index.js";
8
7
  import { SnapshotHandler } from "./plugins/snapshot/SnapshotHandler.js";
9
8
  import { RemoteHandler } from "./remote/index.js";
10
9
  import { SharedHandler } from "./shared/index.js";
11
10
  import { CallFrom, InitScope, Options, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, ShareInfos, ShareScopeMap, Shared, UserOptions } from "./type/config.js";
12
11
  import { PreloadRemoteArgs } from "./type/preload.js";
13
- import "./type/index.js";
14
12
  import { getRemoteEntry } from "./utils/load.js";
15
- import "./utils/index.js";
16
13
  import { CreateScriptHookReturn, GlobalModuleInfo, ModuleInfo } from "@module-federation/sdk";
17
14
 
18
15
  //#region src/core.d.ts
package/dist/core.js CHANGED
@@ -17,7 +17,7 @@ import { generatePreloadAssetsPlugin } from "./plugins/generate-preload-assets.j
17
17
  import { SnapshotHandler } from "./plugins/snapshot/SnapshotHandler.js";
18
18
  import { SharedHandler } from "./shared/index.js";
19
19
  import { RemoteHandler } from "./remote/index.js";
20
- import { isBrowserEnv } from "@module-federation/sdk";
20
+ import { isBrowserEnvValue } from "@module-federation/sdk";
21
21
  import { RUNTIME_010, getShortErrorMsg, runtimeDescMap } from "@module-federation/error-codes";
22
22
 
23
23
  //#region src/core.ts
@@ -30,7 +30,7 @@ var ModuleFederation = class {
30
30
  beforeInitContainer: new AsyncWaterfallHook("beforeInitContainer"),
31
31
  initContainer: new AsyncWaterfallHook("initContainer")
32
32
  });
33
- this.version = "2.1.0";
33
+ this.version = "2.2.0";
34
34
  this.moduleCache = /* @__PURE__ */ new Map();
35
35
  this.loaderHook = new PluginSystem({
36
36
  getModuleInfo: new SyncHook(),
@@ -53,7 +53,7 @@ var ModuleFederation = class {
53
53
  plugins,
54
54
  remotes: [],
55
55
  shared: {},
56
- inBrowser: isBrowserEnv()
56
+ inBrowser: isBrowserEnvValue
57
57
  };
58
58
  this.name = userOptions.name;
59
59
  this.options = defaultOptions;
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","names":["Module"],"sources":["../src/core.ts"],"sourcesContent":["import { isBrowserEnv } from '@module-federation/sdk';\nimport type {\n CreateScriptHookReturn,\n GlobalModuleInfo,\n ModuleInfo,\n} from '@module-federation/sdk';\nimport {\n Options,\n PreloadRemoteArgs,\n RemoteEntryExports,\n Remote,\n Shared,\n ShareInfos,\n UserOptions,\n RemoteInfo,\n ShareScopeMap,\n InitScope,\n RemoteEntryInitOptions,\n CallFrom,\n} from './type';\nimport { getBuilderId, registerPlugins, getRemoteEntry, error } from './utils';\nimport {\n getShortErrorMsg,\n RUNTIME_010,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Module } from './module';\nimport {\n AsyncHook,\n AsyncWaterfallHook,\n PluginSystem,\n SyncHook,\n SyncWaterfallHook,\n} from './utils/hooks';\nimport { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets';\nimport { snapshotPlugin } from './plugins/snapshot';\nimport { getRemoteInfo } from './utils/load';\nimport { DEFAULT_SCOPE } from './constant';\nimport { SnapshotHandler } from './plugins/snapshot/SnapshotHandler';\nimport { SharedHandler } from './shared';\nimport { RemoteHandler } from './remote';\nimport { formatShareConfigs } from './utils/share';\n\n// Declare the global constant that will be defined by DefinePlugin\n// Default to true if not defined (e.g., when runtime-core is used outside of webpack)\n// so that snapshot functionality is included by default.\ndeclare const FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN: boolean;\nconst USE_SNAPSHOT =\n typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === 'boolean'\n ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN\n : true; // Default to true (use snapshot) when not explicitly defined\n\nexport class ModuleFederation {\n options: Options;\n hooks = new PluginSystem({\n beforeInit: new SyncWaterfallHook<{\n userOptions: UserOptions;\n options: Options;\n origin: ModuleFederation;\n /**\n * @deprecated shareInfo will be removed soon, please use userOptions directly!\n */\n shareInfo: ShareInfos;\n }>('beforeInit'),\n init: new SyncHook<\n [\n {\n options: Options;\n origin: ModuleFederation;\n },\n ],\n void\n >(),\n // maybe will change, temporarily for internal use only\n beforeInitContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n origin: ModuleFederation;\n }>('beforeInitContainer'),\n // maybe will change, temporarily for internal use only\n initContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n remoteEntryExports: RemoteEntryExports;\n origin: ModuleFederation;\n id?: string;\n remoteSnapshot?: ModuleInfo;\n }>('initContainer'),\n });\n version: string = __VERSION__;\n name: string;\n moduleCache: Map<string, Module> = new Map();\n snapshotHandler: SnapshotHandler;\n sharedHandler: SharedHandler;\n remoteHandler: RemoteHandler;\n shareScopeMap: ShareScopeMap;\n loaderHook = new PluginSystem({\n // FIXME: may not be suitable , not open to the public yet\n getModuleInfo: new SyncHook<\n [\n {\n target: Record<string, any>;\n key: any;\n },\n ],\n { value: any | undefined; key: string } | void\n >(),\n createScript: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n CreateScriptHookReturn\n >(),\n createLink: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n HTMLLinkElement | void\n >(),\n fetch: new AsyncHook<\n [string, RequestInit],\n Promise<Response> | void | false\n >(),\n loadEntryError: new AsyncHook<\n [\n {\n getRemoteEntry: typeof getRemoteEntry;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n globalLoading: Record<\n string,\n Promise<void | RemoteEntryExports> | undefined\n >;\n uniqueKey: string;\n },\n ],\n Promise<Promise<RemoteEntryExports | undefined> | undefined>\n >(),\n getModuleFactory: new AsyncHook<\n [\n {\n remoteEntryExports: RemoteEntryExports;\n expose: string;\n moduleInfo: RemoteInfo;\n },\n ],\n Promise<(() => Promise<Module>) | undefined>\n >(),\n });\n bridgeHook = new PluginSystem({\n beforeBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n beforeBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n });\n moduleInfo?: GlobalModuleInfo[string];\n\n constructor(userOptions: UserOptions) {\n const plugins = USE_SNAPSHOT\n ? [snapshotPlugin(), generatePreloadAssetsPlugin()]\n : [];\n // TODO: Validate the details of the options\n // Initialize options with default values\n const defaultOptions: Options = {\n id: getBuilderId(),\n name: userOptions.name,\n plugins,\n remotes: [],\n shared: {},\n inBrowser: isBrowserEnv(),\n };\n\n this.name = userOptions.name;\n this.options = defaultOptions;\n this.snapshotHandler = new SnapshotHandler(this);\n this.sharedHandler = new SharedHandler(this);\n this.remoteHandler = new RemoteHandler(this);\n this.shareScopeMap = this.sharedHandler.shareScopeMap;\n this.registerPlugins([\n ...defaultOptions.plugins,\n ...(userOptions.plugins || []),\n ]);\n this.options = this.formatOptions(defaultOptions, userOptions);\n }\n\n initOptions(userOptions: UserOptions): Options {\n if (userOptions.name && userOptions.name !== this.options.name) {\n error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));\n }\n this.registerPlugins(userOptions.plugins);\n const options = this.formatOptions(this.options, userOptions);\n\n this.options = options;\n\n return options;\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 return this.sharedHandler.loadShare(pkgName, extraOptions);\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 customShareInfo?: Partial<Shared>;\n from?: 'build' | 'runtime';\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n return this.sharedHandler.loadShareSync(pkgName, extraOptions);\n }\n\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: Shared['strategy'];\n },\n ): Array<Promise<void>> {\n return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host: this, remoteInfo });\n\n module.remoteEntryExports = container;\n this.moduleCache.set(name, module);\n\n return module;\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 return this.remoteHandler.loadRemote(id, options);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n return this.remoteHandler.preloadRemote(preloadOptions);\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);\n }\n\n formatOptions(globalOptions: Options, userOptions: UserOptions): Options {\n const { allShareInfos: shared } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n const { userOptions: userOptionsRes, options: globalOptionsRes } =\n this.hooks.lifecycle.beforeInit.emit({\n origin: this,\n userOptions,\n options: globalOptions,\n shareInfo: shared,\n });\n\n const remotes = this.remoteHandler.formatAndRegisterRemote(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const { allShareInfos } = this.sharedHandler.registerShared(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const plugins = [...globalOptionsRes.plugins];\n\n if (userOptionsRes.plugins) {\n userOptionsRes.plugins.forEach((plugin) => {\n if (!plugins.includes(plugin)) {\n plugins.push(plugin);\n }\n });\n }\n\n const optionsRes: Options = {\n ...globalOptions,\n ...userOptions,\n plugins,\n remotes,\n shared: allShareInfos,\n };\n\n this.hooks.lifecycle.init.emit({\n origin: this,\n options: optionsRes,\n });\n return optionsRes;\n }\n\n registerPlugins(plugins: UserOptions['plugins']) {\n const pluginRes = registerPlugins(plugins, this);\n // Merge plugin\n this.options.plugins = this.options.plugins.reduce((res, plugin) => {\n if (!plugin) return res;\n if (res && !res.find((item) => item.name === plugin.name)) {\n res.push(plugin);\n }\n return res;\n }, pluginRes || []);\n }\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n return this.remoteHandler.registerRemotes(remotes, options);\n }\n\n registerShared(shared: UserOptions['shared']) {\n this.sharedHandler.registerShared(this.options, {\n ...this.options,\n shared,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","names":["Module"],"sources":["../src/core.ts"],"sourcesContent":["import { isBrowserEnvValue } from '@module-federation/sdk';\nimport type {\n CreateScriptHookReturn,\n GlobalModuleInfo,\n ModuleInfo,\n} from '@module-federation/sdk';\nimport {\n Options,\n PreloadRemoteArgs,\n RemoteEntryExports,\n Remote,\n Shared,\n ShareInfos,\n UserOptions,\n RemoteInfo,\n ShareScopeMap,\n InitScope,\n RemoteEntryInitOptions,\n CallFrom,\n} from './type';\nimport { getBuilderId, registerPlugins, getRemoteEntry, error } from './utils';\nimport {\n getShortErrorMsg,\n RUNTIME_010,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Module } from './module';\nimport {\n AsyncHook,\n AsyncWaterfallHook,\n PluginSystem,\n SyncHook,\n SyncWaterfallHook,\n} from './utils/hooks';\nimport { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets';\nimport { snapshotPlugin } from './plugins/snapshot';\nimport { getRemoteInfo } from './utils/load';\nimport { DEFAULT_SCOPE } from './constant';\nimport { SnapshotHandler } from './plugins/snapshot/SnapshotHandler';\nimport { SharedHandler } from './shared';\nimport { RemoteHandler } from './remote';\nimport { formatShareConfigs } from './utils/share';\n\n// Declare the global constant that will be defined by DefinePlugin\n// Default to true if not defined (e.g., when runtime-core is used outside of webpack)\n// so that snapshot functionality is included by default.\ndeclare const FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN: boolean;\nconst USE_SNAPSHOT =\n typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === 'boolean'\n ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN\n : true; // Default to true (use snapshot) when not explicitly defined\n\nexport class ModuleFederation {\n options: Options;\n hooks = new PluginSystem({\n beforeInit: new SyncWaterfallHook<{\n userOptions: UserOptions;\n options: Options;\n origin: ModuleFederation;\n /**\n * @deprecated shareInfo will be removed soon, please use userOptions directly!\n */\n shareInfo: ShareInfos;\n }>('beforeInit'),\n init: new SyncHook<\n [\n {\n options: Options;\n origin: ModuleFederation;\n },\n ],\n void\n >(),\n // maybe will change, temporarily for internal use only\n beforeInitContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n origin: ModuleFederation;\n }>('beforeInitContainer'),\n // maybe will change, temporarily for internal use only\n initContainer: new AsyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n initScope: InitScope;\n remoteEntryInitOptions: RemoteEntryInitOptions;\n remoteInfo: RemoteInfo;\n remoteEntryExports: RemoteEntryExports;\n origin: ModuleFederation;\n id?: string;\n remoteSnapshot?: ModuleInfo;\n }>('initContainer'),\n });\n version: string = __VERSION__;\n name: string;\n moduleCache: Map<string, Module> = new Map();\n snapshotHandler: SnapshotHandler;\n sharedHandler: SharedHandler;\n remoteHandler: RemoteHandler;\n shareScopeMap: ShareScopeMap;\n loaderHook = new PluginSystem({\n // FIXME: may not be suitable , not open to the public yet\n getModuleInfo: new SyncHook<\n [\n {\n target: Record<string, any>;\n key: any;\n },\n ],\n { value: any | undefined; key: string } | void\n >(),\n createScript: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n CreateScriptHookReturn\n >(),\n createLink: new SyncHook<\n [\n {\n url: string;\n attrs?: Record<string, any>;\n },\n ],\n HTMLLinkElement | void\n >(),\n fetch: new AsyncHook<\n [string, RequestInit],\n Promise<Response> | void | false\n >(),\n loadEntryError: new AsyncHook<\n [\n {\n getRemoteEntry: typeof getRemoteEntry;\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n globalLoading: Record<\n string,\n Promise<void | RemoteEntryExports> | undefined\n >;\n uniqueKey: string;\n },\n ],\n Promise<Promise<RemoteEntryExports | undefined> | undefined>\n >(),\n getModuleFactory: new AsyncHook<\n [\n {\n remoteEntryExports: RemoteEntryExports;\n expose: string;\n moduleInfo: RemoteInfo;\n },\n ],\n Promise<(() => Promise<Module>) | undefined>\n >(),\n });\n bridgeHook = new PluginSystem({\n beforeBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeRender: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n beforeBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n afterBridgeDestroy: new SyncHook<\n [Record<string, any>],\n void | Record<string, any>\n >(),\n });\n moduleInfo?: GlobalModuleInfo[string];\n\n constructor(userOptions: UserOptions) {\n const plugins = USE_SNAPSHOT\n ? [snapshotPlugin(), generatePreloadAssetsPlugin()]\n : [];\n // TODO: Validate the details of the options\n // Initialize options with default values\n const defaultOptions: Options = {\n id: getBuilderId(),\n name: userOptions.name,\n plugins,\n remotes: [],\n shared: {},\n inBrowser: isBrowserEnvValue,\n };\n\n this.name = userOptions.name;\n this.options = defaultOptions;\n this.snapshotHandler = new SnapshotHandler(this);\n this.sharedHandler = new SharedHandler(this);\n this.remoteHandler = new RemoteHandler(this);\n this.shareScopeMap = this.sharedHandler.shareScopeMap;\n this.registerPlugins([\n ...defaultOptions.plugins,\n ...(userOptions.plugins || []),\n ]);\n this.options = this.formatOptions(defaultOptions, userOptions);\n }\n\n initOptions(userOptions: UserOptions): Options {\n if (userOptions.name && userOptions.name !== this.options.name) {\n error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));\n }\n this.registerPlugins(userOptions.plugins);\n const options = this.formatOptions(this.options, userOptions);\n\n this.options = options;\n\n return options;\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 return this.sharedHandler.loadShare(pkgName, extraOptions);\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 customShareInfo?: Partial<Shared>;\n from?: 'build' | 'runtime';\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n return this.sharedHandler.loadShareSync(pkgName, extraOptions);\n }\n\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: Shared['strategy'];\n },\n ): Array<Promise<void>> {\n return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);\n }\n\n initRawContainer(\n name: string,\n url: string,\n container: RemoteEntryExports,\n ): Module {\n const remoteInfo = getRemoteInfo({ name, entry: url });\n const module = new Module({ host: this, remoteInfo });\n\n module.remoteEntryExports = container;\n this.moduleCache.set(name, module);\n\n return module;\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 return this.remoteHandler.loadRemote(id, options);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n return this.remoteHandler.preloadRemote(preloadOptions);\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);\n }\n\n formatOptions(globalOptions: Options, userOptions: UserOptions): Options {\n const { allShareInfos: shared } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n const { userOptions: userOptionsRes, options: globalOptionsRes } =\n this.hooks.lifecycle.beforeInit.emit({\n origin: this,\n userOptions,\n options: globalOptions,\n shareInfo: shared,\n });\n\n const remotes = this.remoteHandler.formatAndRegisterRemote(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const { allShareInfos } = this.sharedHandler.registerShared(\n globalOptionsRes,\n userOptionsRes,\n );\n\n const plugins = [...globalOptionsRes.plugins];\n\n if (userOptionsRes.plugins) {\n userOptionsRes.plugins.forEach((plugin) => {\n if (!plugins.includes(plugin)) {\n plugins.push(plugin);\n }\n });\n }\n\n const optionsRes: Options = {\n ...globalOptions,\n ...userOptions,\n plugins,\n remotes,\n shared: allShareInfos,\n };\n\n this.hooks.lifecycle.init.emit({\n origin: this,\n options: optionsRes,\n });\n return optionsRes;\n }\n\n registerPlugins(plugins: UserOptions['plugins']) {\n const pluginRes = registerPlugins(plugins, this);\n // Merge plugin\n this.options.plugins = this.options.plugins.reduce((res, plugin) => {\n if (!plugin) return res;\n if (res && !res.find((item) => item.name === plugin.name)) {\n res.push(plugin);\n }\n return res;\n }, pluginRes || []);\n }\n registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n return this.remoteHandler.registerRemotes(remotes, options);\n }\n\n registerShared(shared: UserOptions['shared']) {\n this.sharedHandler.registerShared(this.options, {\n ...this.options,\n shared,\n });\n }\n}\n"],"mappings":"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"}
package/dist/global.cjs CHANGED
@@ -65,7 +65,7 @@ function getGlobalFederationConstructor() {
65
65
  function setGlobalFederationConstructor(FederationConstructor, isDebug = (0, _module_federation_sdk.isDebugMode)()) {
66
66
  if (isDebug) {
67
67
  CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
68
- CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.1.0";
68
+ CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.2.0";
69
69
  }
70
70
  }
71
71
  function getInfoWithoutType(target, key) {
@@ -89,7 +89,7 @@ function getInfoWithoutType(target, key) {
89
89
  key
90
90
  };
91
91
  }
92
- else throw new Error("key must be string");
92
+ else require_logger.error(`getInfoWithoutType: "key" must be a string, got ${typeof key} (${JSON.stringify(key)}).`);
93
93
  }
94
94
  const getGlobalSnapshot = () => nativeGlobal.__FEDERATION__.moduleInfo;
95
95
  const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot) => {
@@ -1 +1 @@
1
- {"version":3,"file":"global.cjs","names":["getFMId"],"sources":["../src/global.ts"],"sourcesContent":["import { ModuleFederation } from './core';\nimport {\n RemoteEntryExports,\n GlobalShareScopeMap,\n Remote,\n Optional,\n} from './type';\nimport { getFMId } from './utils/tool';\nimport {\n GlobalModuleInfo,\n ModuleInfo,\n isDebugMode,\n} from '@module-federation/sdk';\nimport { warn } from './utils/logger';\nimport { ModuleFederationRuntimePlugin } from './type/plugin';\n\nexport interface Federation {\n __GLOBAL_PLUGIN__: Array<ModuleFederationRuntimePlugin>;\n __DEBUG_CONSTRUCTOR_VERSION__?: string;\n moduleInfo: GlobalModuleInfo;\n __DEBUG_CONSTRUCTOR__?: typeof ModuleFederation;\n __INSTANCES__: Array<ModuleFederation>;\n __SHARE__: GlobalShareScopeMap;\n __MANIFEST_LOADING__: Record<string, Promise<ModuleInfo>>;\n __PRELOADED_MAP__: Map<string, boolean>;\n}\nexport const CurrentGlobal =\n typeof globalThis === 'object' ? globalThis : window;\nexport const nativeGlobal: typeof global = (() => {\n try {\n // get real window (incase of sandbox)\n return document.defaultView;\n } catch {\n // node env\n return CurrentGlobal;\n }\n})() as typeof global;\n\nexport const Global = nativeGlobal;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __FEDERATION__: Federation,\n __VMOK__: Federation,\n // eslint-disable-next-line no-var\n __GLOBAL_LOADING_REMOTE_ENTRY__: Record<\n string,\n undefined | Promise<RemoteEntryExports | void>\n >;\n}\n\nfunction definePropertyGlobalVal(\n target: typeof CurrentGlobal,\n key: string,\n val: any,\n) {\n Object.defineProperty(target, key, {\n value: val,\n configurable: false,\n writable: true,\n });\n}\n\nfunction includeOwnProperty(target: typeof CurrentGlobal, key: string) {\n return Object.hasOwnProperty.call(target, key);\n}\n\n// This section is to prevent encapsulation by certain microfrontend frameworks. Due to reuse policies, sandbox escapes.\n// The sandbox in the microfrontend does not replicate the value of 'configurable'.\n// If there is no loading content on the global object, this section defines the loading object.\nif (!includeOwnProperty(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__')) {\n definePropertyGlobalVal(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__', {});\n}\n\nexport const globalLoading = CurrentGlobal.__GLOBAL_LOADING_REMOTE_ENTRY__;\n\nfunction setGlobalDefaultVal(target: typeof CurrentGlobal) {\n if (\n includeOwnProperty(target, '__VMOK__') &&\n !includeOwnProperty(target, '__FEDERATION__')\n ) {\n definePropertyGlobalVal(target, '__FEDERATION__', target.__VMOK__);\n }\n\n if (!includeOwnProperty(target, '__FEDERATION__')) {\n definePropertyGlobalVal(target, '__FEDERATION__', {\n __GLOBAL_PLUGIN__: [],\n __INSTANCES__: [],\n moduleInfo: {},\n __SHARE__: {},\n __MANIFEST_LOADING__: {},\n __PRELOADED_MAP__: new Map(),\n });\n\n definePropertyGlobalVal(target, '__VMOK__', target.__FEDERATION__);\n }\n\n target.__FEDERATION__.__GLOBAL_PLUGIN__ ??= [];\n target.__FEDERATION__.__INSTANCES__ ??= [];\n target.__FEDERATION__.moduleInfo ??= {};\n target.__FEDERATION__.__SHARE__ ??= {};\n target.__FEDERATION__.__MANIFEST_LOADING__ ??= {};\n target.__FEDERATION__.__PRELOADED_MAP__ ??= new Map();\n}\n\nsetGlobalDefaultVal(CurrentGlobal);\nsetGlobalDefaultVal(nativeGlobal);\n\nexport function resetFederationGlobalInfo(): void {\n CurrentGlobal.__FEDERATION__.__GLOBAL_PLUGIN__ = [];\n CurrentGlobal.__FEDERATION__.__INSTANCES__ = [];\n CurrentGlobal.__FEDERATION__.moduleInfo = {};\n CurrentGlobal.__FEDERATION__.__SHARE__ = {};\n CurrentGlobal.__FEDERATION__.__MANIFEST_LOADING__ = {};\n\n Object.keys(globalLoading).forEach((key) => {\n delete globalLoading[key];\n });\n}\n\nexport function setGlobalFederationInstance(\n FederationInstance: ModuleFederation,\n): void {\n CurrentGlobal.__FEDERATION__.__INSTANCES__.push(FederationInstance);\n}\n\nexport function getGlobalFederationConstructor():\n | typeof ModuleFederation\n | undefined {\n return CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__;\n}\n\nexport function setGlobalFederationConstructor(\n FederationConstructor: typeof ModuleFederation | undefined,\n isDebug = isDebugMode(),\n): void {\n if (isDebug) {\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = __VERSION__;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getInfoWithoutType<T extends object>(\n target: T,\n key: keyof T,\n): { value: T[keyof T] | undefined; key: string } {\n if (typeof key === 'string') {\n const keyRes = target[key];\n if (keyRes) {\n return {\n value: target[key],\n key: key as string,\n };\n } else {\n const targetKeys = Object.keys(target);\n for (const targetKey of targetKeys) {\n const [targetTypeOrName, _] = targetKey.split(':');\n const nKey = `${targetTypeOrName}:${key}` as unknown as keyof T;\n const typeWithKeyRes = target[nKey];\n if (typeWithKeyRes) {\n return {\n value: typeWithKeyRes,\n key: nKey as string,\n };\n }\n }\n return {\n value: undefined,\n key: key as string,\n };\n }\n } else {\n throw new Error('key must be string');\n }\n}\n\nexport const getGlobalSnapshot = (): GlobalModuleInfo =>\n nativeGlobal.__FEDERATION__.moduleInfo;\n\nexport const getTargetSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n snapshot: GlobalModuleInfo,\n): GlobalModuleInfo[string] | undefined => {\n // Check if the remote is included in the hostSnapshot\n const moduleKey = getFMId(moduleInfo);\n const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;\n\n // The remoteSnapshot might not include a version\n if (\n getModuleInfo &&\n !getModuleInfo.version &&\n 'version' in moduleInfo &&\n moduleInfo['version']\n ) {\n getModuleInfo.version = moduleInfo['version'];\n }\n\n if (getModuleInfo) {\n return getModuleInfo;\n }\n\n // If the remote is not included in the hostSnapshot, deploy a micro app snapshot\n if ('version' in moduleInfo && moduleInfo['version']) {\n const { version, ...resModuleInfo } = moduleInfo;\n const moduleKeyWithoutVersion = getFMId(resModuleInfo);\n const getModuleInfoWithoutVersion = getInfoWithoutType(\n nativeGlobal.__FEDERATION__.moduleInfo,\n moduleKeyWithoutVersion,\n ).value;\n\n if (getModuleInfoWithoutVersion?.version === version) {\n return getModuleInfoWithoutVersion;\n }\n }\n\n return;\n};\n\nexport const getGlobalSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n): GlobalModuleInfo[string] | undefined =>\n getTargetSnapshotInfoByModuleInfo(\n moduleInfo,\n nativeGlobal.__FEDERATION__.moduleInfo,\n );\n\nexport const setGlobalSnapshotInfoByModuleInfo = (\n remoteInfo: Remote,\n moduleDetailInfo: GlobalModuleInfo[string],\n): GlobalModuleInfo => {\n const moduleKey = getFMId(remoteInfo);\n nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;\n return nativeGlobal.__FEDERATION__.moduleInfo;\n};\n\nexport const addGlobalSnapshot = (\n moduleInfos: GlobalModuleInfo,\n): (() => void) => {\n nativeGlobal.__FEDERATION__.moduleInfo = {\n ...nativeGlobal.__FEDERATION__.moduleInfo,\n ...moduleInfos,\n };\n return () => {\n const keys = Object.keys(moduleInfos);\n for (const key of keys) {\n delete nativeGlobal.__FEDERATION__.moduleInfo[key];\n }\n };\n};\n\nexport const getRemoteEntryExports = (\n name: string,\n globalName: string | undefined,\n): {\n remoteEntryKey: string;\n entryExports: RemoteEntryExports | undefined;\n} => {\n const remoteEntryKey = globalName || `__FEDERATION_${name}:custom__`;\n const entryExports = (CurrentGlobal as any)[remoteEntryKey];\n return {\n remoteEntryKey,\n entryExports,\n };\n};\n\n// This function is used to register global plugins.\n// It iterates over the provided plugins and checks if they are already registered.\n// If a plugin is not registered, it is added to the global plugins.\n// If a plugin is already registered, a warning message is logged.\nexport const registerGlobalPlugins = (\n plugins: Array<ModuleFederationRuntimePlugin>,\n): void => {\n const { __GLOBAL_PLUGIN__ } = nativeGlobal.__FEDERATION__;\n\n plugins.forEach((plugin) => {\n if (__GLOBAL_PLUGIN__.findIndex((p) => p.name === plugin.name) === -1) {\n __GLOBAL_PLUGIN__.push(plugin);\n } else {\n warn(`The plugin ${plugin.name} has been registered.`);\n }\n });\n};\n\nexport const getGlobalHostPlugins = (): Array<ModuleFederationRuntimePlugin> =>\n nativeGlobal.__FEDERATION__.__GLOBAL_PLUGIN__;\n\nexport const getPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.get(id);\n\nexport const setPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.set(id, true);\n"],"mappings":"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"}
1
+ {"version":3,"file":"global.cjs","names":["getFMId"],"sources":["../src/global.ts"],"sourcesContent":["import { ModuleFederation } from './core';\nimport {\n RemoteEntryExports,\n GlobalShareScopeMap,\n Remote,\n Optional,\n} from './type';\nimport { getFMId } from './utils/tool';\nimport {\n GlobalModuleInfo,\n ModuleInfo,\n isDebugMode,\n} from '@module-federation/sdk';\nimport { warn, error } from './utils/logger';\nimport { ModuleFederationRuntimePlugin } from './type/plugin';\n\nexport interface Federation {\n __GLOBAL_PLUGIN__: Array<ModuleFederationRuntimePlugin>;\n __DEBUG_CONSTRUCTOR_VERSION__?: string;\n moduleInfo: GlobalModuleInfo;\n __DEBUG_CONSTRUCTOR__?: typeof ModuleFederation;\n __INSTANCES__: Array<ModuleFederation>;\n __SHARE__: GlobalShareScopeMap;\n __MANIFEST_LOADING__: Record<string, Promise<ModuleInfo>>;\n __PRELOADED_MAP__: Map<string, boolean>;\n}\nexport const CurrentGlobal =\n typeof globalThis === 'object' ? globalThis : window;\nexport const nativeGlobal: typeof global = (() => {\n try {\n // get real window (incase of sandbox)\n return document.defaultView;\n } catch {\n // node env\n return CurrentGlobal;\n }\n})() as typeof global;\n\nexport const Global = nativeGlobal;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __FEDERATION__: Federation,\n __VMOK__: Federation,\n // eslint-disable-next-line no-var\n __GLOBAL_LOADING_REMOTE_ENTRY__: Record<\n string,\n undefined | Promise<RemoteEntryExports | void>\n >;\n}\n\nfunction definePropertyGlobalVal(\n target: typeof CurrentGlobal,\n key: string,\n val: any,\n) {\n Object.defineProperty(target, key, {\n value: val,\n configurable: false,\n writable: true,\n });\n}\n\nfunction includeOwnProperty(target: typeof CurrentGlobal, key: string) {\n return Object.hasOwnProperty.call(target, key);\n}\n\n// This section is to prevent encapsulation by certain microfrontend frameworks. Due to reuse policies, sandbox escapes.\n// The sandbox in the microfrontend does not replicate the value of 'configurable'.\n// If there is no loading content on the global object, this section defines the loading object.\nif (!includeOwnProperty(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__')) {\n definePropertyGlobalVal(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__', {});\n}\n\nexport const globalLoading = CurrentGlobal.__GLOBAL_LOADING_REMOTE_ENTRY__;\n\nfunction setGlobalDefaultVal(target: typeof CurrentGlobal) {\n if (\n includeOwnProperty(target, '__VMOK__') &&\n !includeOwnProperty(target, '__FEDERATION__')\n ) {\n definePropertyGlobalVal(target, '__FEDERATION__', target.__VMOK__);\n }\n\n if (!includeOwnProperty(target, '__FEDERATION__')) {\n definePropertyGlobalVal(target, '__FEDERATION__', {\n __GLOBAL_PLUGIN__: [],\n __INSTANCES__: [],\n moduleInfo: {},\n __SHARE__: {},\n __MANIFEST_LOADING__: {},\n __PRELOADED_MAP__: new Map(),\n });\n\n definePropertyGlobalVal(target, '__VMOK__', target.__FEDERATION__);\n }\n\n target.__FEDERATION__.__GLOBAL_PLUGIN__ ??= [];\n target.__FEDERATION__.__INSTANCES__ ??= [];\n target.__FEDERATION__.moduleInfo ??= {};\n target.__FEDERATION__.__SHARE__ ??= {};\n target.__FEDERATION__.__MANIFEST_LOADING__ ??= {};\n target.__FEDERATION__.__PRELOADED_MAP__ ??= new Map();\n}\n\nsetGlobalDefaultVal(CurrentGlobal);\nsetGlobalDefaultVal(nativeGlobal);\n\nexport function resetFederationGlobalInfo(): void {\n CurrentGlobal.__FEDERATION__.__GLOBAL_PLUGIN__ = [];\n CurrentGlobal.__FEDERATION__.__INSTANCES__ = [];\n CurrentGlobal.__FEDERATION__.moduleInfo = {};\n CurrentGlobal.__FEDERATION__.__SHARE__ = {};\n CurrentGlobal.__FEDERATION__.__MANIFEST_LOADING__ = {};\n\n Object.keys(globalLoading).forEach((key) => {\n delete globalLoading[key];\n });\n}\n\nexport function setGlobalFederationInstance(\n FederationInstance: ModuleFederation,\n): void {\n CurrentGlobal.__FEDERATION__.__INSTANCES__.push(FederationInstance);\n}\n\nexport function getGlobalFederationConstructor():\n | typeof ModuleFederation\n | undefined {\n return CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__;\n}\n\nexport function setGlobalFederationConstructor(\n FederationConstructor: typeof ModuleFederation | undefined,\n isDebug = isDebugMode(),\n): void {\n if (isDebug) {\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = __VERSION__;\n }\n}\n\nexport function getInfoWithoutType<T extends object>(\n target: T,\n key: keyof T,\n): { value: T[keyof T] | undefined; key: string } {\n if (typeof key === 'string') {\n const keyRes = target[key];\n if (keyRes) {\n return {\n value: target[key],\n key: key as string,\n };\n } else {\n const targetKeys = Object.keys(target);\n for (const targetKey of targetKeys) {\n const [targetTypeOrName, _] = targetKey.split(':');\n const nKey = `${targetTypeOrName}:${key}` as unknown as keyof T;\n const typeWithKeyRes = target[nKey];\n if (typeWithKeyRes) {\n return {\n value: typeWithKeyRes,\n key: nKey as string,\n };\n }\n }\n return {\n value: undefined,\n key: key as string,\n };\n }\n } else {\n error(\n `getInfoWithoutType: \"key\" must be a string, got ${typeof key} (${JSON.stringify(key)}).`,\n );\n }\n}\n\nexport const getGlobalSnapshot = (): GlobalModuleInfo =>\n nativeGlobal.__FEDERATION__.moduleInfo;\n\nexport const getTargetSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n snapshot: GlobalModuleInfo,\n): GlobalModuleInfo[string] | undefined => {\n // Check if the remote is included in the hostSnapshot\n const moduleKey = getFMId(moduleInfo);\n const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;\n\n // The remoteSnapshot might not include a version\n if (\n getModuleInfo &&\n !getModuleInfo.version &&\n 'version' in moduleInfo &&\n moduleInfo['version']\n ) {\n getModuleInfo.version = moduleInfo['version'];\n }\n\n if (getModuleInfo) {\n return getModuleInfo;\n }\n\n // If the remote is not included in the hostSnapshot, deploy a micro app snapshot\n if ('version' in moduleInfo && moduleInfo['version']) {\n const { version, ...resModuleInfo } = moduleInfo;\n const moduleKeyWithoutVersion = getFMId(resModuleInfo);\n const getModuleInfoWithoutVersion = getInfoWithoutType(\n nativeGlobal.__FEDERATION__.moduleInfo,\n moduleKeyWithoutVersion,\n ).value;\n\n if (getModuleInfoWithoutVersion?.version === version) {\n return getModuleInfoWithoutVersion;\n }\n }\n\n return;\n};\n\nexport const getGlobalSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n): GlobalModuleInfo[string] | undefined =>\n getTargetSnapshotInfoByModuleInfo(\n moduleInfo,\n nativeGlobal.__FEDERATION__.moduleInfo,\n );\n\nexport const setGlobalSnapshotInfoByModuleInfo = (\n remoteInfo: Remote,\n moduleDetailInfo: GlobalModuleInfo[string],\n): GlobalModuleInfo => {\n const moduleKey = getFMId(remoteInfo);\n nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;\n return nativeGlobal.__FEDERATION__.moduleInfo;\n};\n\nexport const addGlobalSnapshot = (\n moduleInfos: GlobalModuleInfo,\n): (() => void) => {\n nativeGlobal.__FEDERATION__.moduleInfo = {\n ...nativeGlobal.__FEDERATION__.moduleInfo,\n ...moduleInfos,\n };\n return () => {\n const keys = Object.keys(moduleInfos);\n for (const key of keys) {\n delete nativeGlobal.__FEDERATION__.moduleInfo[key];\n }\n };\n};\n\nexport const getRemoteEntryExports = (\n name: string,\n globalName: string | undefined,\n): {\n remoteEntryKey: string;\n entryExports: RemoteEntryExports | undefined;\n} => {\n const remoteEntryKey = globalName || `__FEDERATION_${name}:custom__`;\n const entryExports = (CurrentGlobal as any)[remoteEntryKey];\n return {\n remoteEntryKey,\n entryExports,\n };\n};\n\n// This function is used to register global plugins.\n// It iterates over the provided plugins and checks if they are already registered.\n// If a plugin is not registered, it is added to the global plugins.\n// If a plugin is already registered, a warning message is logged.\nexport const registerGlobalPlugins = (\n plugins: Array<ModuleFederationRuntimePlugin>,\n): void => {\n const { __GLOBAL_PLUGIN__ } = nativeGlobal.__FEDERATION__;\n\n plugins.forEach((plugin) => {\n if (__GLOBAL_PLUGIN__.findIndex((p) => p.name === plugin.name) === -1) {\n __GLOBAL_PLUGIN__.push(plugin);\n } else {\n warn(`The plugin ${plugin.name} has been registered.`);\n }\n });\n};\n\nexport const getGlobalHostPlugins = (): Array<ModuleFederationRuntimePlugin> =>\n nativeGlobal.__FEDERATION__.__GLOBAL_PLUGIN__;\n\nexport const getPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.get(id);\n\nexport const setPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.set(id, true);\n"],"mappings":"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"}
package/dist/global.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { ModuleFederation } from "./core.js";
2
2
  import { ModuleFederationRuntimePlugin } from "./type/plugin.js";
3
3
  import { GlobalShareScopeMap, Optional, Remote, RemoteEntryExports } from "./type/config.js";
4
- import "./type/index.js";
5
4
  import { GlobalModuleInfo, ModuleInfo } from "@module-federation/sdk";
6
5
 
7
6
  //#region src/global.d.ts
package/dist/global.js CHANGED
@@ -1,4 +1,4 @@
1
- import { warn as warn$1 } from "./utils/logger.js";
1
+ import { error, warn as warn$1 } from "./utils/logger.js";
2
2
  import { getFMId } from "./utils/tool.js";
3
3
  import { isDebugMode } from "@module-federation/sdk";
4
4
 
@@ -65,7 +65,7 @@ function getGlobalFederationConstructor() {
65
65
  function setGlobalFederationConstructor(FederationConstructor, isDebug = isDebugMode()) {
66
66
  if (isDebug) {
67
67
  CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;
68
- CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.1.0";
68
+ CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = "2.2.0";
69
69
  }
70
70
  }
71
71
  function getInfoWithoutType(target, key) {
@@ -89,7 +89,7 @@ function getInfoWithoutType(target, key) {
89
89
  key
90
90
  };
91
91
  }
92
- else throw new Error("key must be string");
92
+ else error(`getInfoWithoutType: "key" must be a string, got ${typeof key} (${JSON.stringify(key)}).`);
93
93
  }
94
94
  const getGlobalSnapshot = () => nativeGlobal.__FEDERATION__.moduleInfo;
95
95
  const getTargetSnapshotInfoByModuleInfo = (moduleInfo, snapshot) => {
@@ -1 +1 @@
1
- {"version":3,"file":"global.js","names":[],"sources":["../src/global.ts"],"sourcesContent":["import { ModuleFederation } from './core';\nimport {\n RemoteEntryExports,\n GlobalShareScopeMap,\n Remote,\n Optional,\n} from './type';\nimport { getFMId } from './utils/tool';\nimport {\n GlobalModuleInfo,\n ModuleInfo,\n isDebugMode,\n} from '@module-federation/sdk';\nimport { warn } from './utils/logger';\nimport { ModuleFederationRuntimePlugin } from './type/plugin';\n\nexport interface Federation {\n __GLOBAL_PLUGIN__: Array<ModuleFederationRuntimePlugin>;\n __DEBUG_CONSTRUCTOR_VERSION__?: string;\n moduleInfo: GlobalModuleInfo;\n __DEBUG_CONSTRUCTOR__?: typeof ModuleFederation;\n __INSTANCES__: Array<ModuleFederation>;\n __SHARE__: GlobalShareScopeMap;\n __MANIFEST_LOADING__: Record<string, Promise<ModuleInfo>>;\n __PRELOADED_MAP__: Map<string, boolean>;\n}\nexport const CurrentGlobal =\n typeof globalThis === 'object' ? globalThis : window;\nexport const nativeGlobal: typeof global = (() => {\n try {\n // get real window (incase of sandbox)\n return document.defaultView;\n } catch {\n // node env\n return CurrentGlobal;\n }\n})() as typeof global;\n\nexport const Global = nativeGlobal;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __FEDERATION__: Federation,\n __VMOK__: Federation,\n // eslint-disable-next-line no-var\n __GLOBAL_LOADING_REMOTE_ENTRY__: Record<\n string,\n undefined | Promise<RemoteEntryExports | void>\n >;\n}\n\nfunction definePropertyGlobalVal(\n target: typeof CurrentGlobal,\n key: string,\n val: any,\n) {\n Object.defineProperty(target, key, {\n value: val,\n configurable: false,\n writable: true,\n });\n}\n\nfunction includeOwnProperty(target: typeof CurrentGlobal, key: string) {\n return Object.hasOwnProperty.call(target, key);\n}\n\n// This section is to prevent encapsulation by certain microfrontend frameworks. Due to reuse policies, sandbox escapes.\n// The sandbox in the microfrontend does not replicate the value of 'configurable'.\n// If there is no loading content on the global object, this section defines the loading object.\nif (!includeOwnProperty(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__')) {\n definePropertyGlobalVal(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__', {});\n}\n\nexport const globalLoading = CurrentGlobal.__GLOBAL_LOADING_REMOTE_ENTRY__;\n\nfunction setGlobalDefaultVal(target: typeof CurrentGlobal) {\n if (\n includeOwnProperty(target, '__VMOK__') &&\n !includeOwnProperty(target, '__FEDERATION__')\n ) {\n definePropertyGlobalVal(target, '__FEDERATION__', target.__VMOK__);\n }\n\n if (!includeOwnProperty(target, '__FEDERATION__')) {\n definePropertyGlobalVal(target, '__FEDERATION__', {\n __GLOBAL_PLUGIN__: [],\n __INSTANCES__: [],\n moduleInfo: {},\n __SHARE__: {},\n __MANIFEST_LOADING__: {},\n __PRELOADED_MAP__: new Map(),\n });\n\n definePropertyGlobalVal(target, '__VMOK__', target.__FEDERATION__);\n }\n\n target.__FEDERATION__.__GLOBAL_PLUGIN__ ??= [];\n target.__FEDERATION__.__INSTANCES__ ??= [];\n target.__FEDERATION__.moduleInfo ??= {};\n target.__FEDERATION__.__SHARE__ ??= {};\n target.__FEDERATION__.__MANIFEST_LOADING__ ??= {};\n target.__FEDERATION__.__PRELOADED_MAP__ ??= new Map();\n}\n\nsetGlobalDefaultVal(CurrentGlobal);\nsetGlobalDefaultVal(nativeGlobal);\n\nexport function resetFederationGlobalInfo(): void {\n CurrentGlobal.__FEDERATION__.__GLOBAL_PLUGIN__ = [];\n CurrentGlobal.__FEDERATION__.__INSTANCES__ = [];\n CurrentGlobal.__FEDERATION__.moduleInfo = {};\n CurrentGlobal.__FEDERATION__.__SHARE__ = {};\n CurrentGlobal.__FEDERATION__.__MANIFEST_LOADING__ = {};\n\n Object.keys(globalLoading).forEach((key) => {\n delete globalLoading[key];\n });\n}\n\nexport function setGlobalFederationInstance(\n FederationInstance: ModuleFederation,\n): void {\n CurrentGlobal.__FEDERATION__.__INSTANCES__.push(FederationInstance);\n}\n\nexport function getGlobalFederationConstructor():\n | typeof ModuleFederation\n | undefined {\n return CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__;\n}\n\nexport function setGlobalFederationConstructor(\n FederationConstructor: typeof ModuleFederation | undefined,\n isDebug = isDebugMode(),\n): void {\n if (isDebug) {\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = __VERSION__;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getInfoWithoutType<T extends object>(\n target: T,\n key: keyof T,\n): { value: T[keyof T] | undefined; key: string } {\n if (typeof key === 'string') {\n const keyRes = target[key];\n if (keyRes) {\n return {\n value: target[key],\n key: key as string,\n };\n } else {\n const targetKeys = Object.keys(target);\n for (const targetKey of targetKeys) {\n const [targetTypeOrName, _] = targetKey.split(':');\n const nKey = `${targetTypeOrName}:${key}` as unknown as keyof T;\n const typeWithKeyRes = target[nKey];\n if (typeWithKeyRes) {\n return {\n value: typeWithKeyRes,\n key: nKey as string,\n };\n }\n }\n return {\n value: undefined,\n key: key as string,\n };\n }\n } else {\n throw new Error('key must be string');\n }\n}\n\nexport const getGlobalSnapshot = (): GlobalModuleInfo =>\n nativeGlobal.__FEDERATION__.moduleInfo;\n\nexport const getTargetSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n snapshot: GlobalModuleInfo,\n): GlobalModuleInfo[string] | undefined => {\n // Check if the remote is included in the hostSnapshot\n const moduleKey = getFMId(moduleInfo);\n const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;\n\n // The remoteSnapshot might not include a version\n if (\n getModuleInfo &&\n !getModuleInfo.version &&\n 'version' in moduleInfo &&\n moduleInfo['version']\n ) {\n getModuleInfo.version = moduleInfo['version'];\n }\n\n if (getModuleInfo) {\n return getModuleInfo;\n }\n\n // If the remote is not included in the hostSnapshot, deploy a micro app snapshot\n if ('version' in moduleInfo && moduleInfo['version']) {\n const { version, ...resModuleInfo } = moduleInfo;\n const moduleKeyWithoutVersion = getFMId(resModuleInfo);\n const getModuleInfoWithoutVersion = getInfoWithoutType(\n nativeGlobal.__FEDERATION__.moduleInfo,\n moduleKeyWithoutVersion,\n ).value;\n\n if (getModuleInfoWithoutVersion?.version === version) {\n return getModuleInfoWithoutVersion;\n }\n }\n\n return;\n};\n\nexport const getGlobalSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n): GlobalModuleInfo[string] | undefined =>\n getTargetSnapshotInfoByModuleInfo(\n moduleInfo,\n nativeGlobal.__FEDERATION__.moduleInfo,\n );\n\nexport const setGlobalSnapshotInfoByModuleInfo = (\n remoteInfo: Remote,\n moduleDetailInfo: GlobalModuleInfo[string],\n): GlobalModuleInfo => {\n const moduleKey = getFMId(remoteInfo);\n nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;\n return nativeGlobal.__FEDERATION__.moduleInfo;\n};\n\nexport const addGlobalSnapshot = (\n moduleInfos: GlobalModuleInfo,\n): (() => void) => {\n nativeGlobal.__FEDERATION__.moduleInfo = {\n ...nativeGlobal.__FEDERATION__.moduleInfo,\n ...moduleInfos,\n };\n return () => {\n const keys = Object.keys(moduleInfos);\n for (const key of keys) {\n delete nativeGlobal.__FEDERATION__.moduleInfo[key];\n }\n };\n};\n\nexport const getRemoteEntryExports = (\n name: string,\n globalName: string | undefined,\n): {\n remoteEntryKey: string;\n entryExports: RemoteEntryExports | undefined;\n} => {\n const remoteEntryKey = globalName || `__FEDERATION_${name}:custom__`;\n const entryExports = (CurrentGlobal as any)[remoteEntryKey];\n return {\n remoteEntryKey,\n entryExports,\n };\n};\n\n// This function is used to register global plugins.\n// It iterates over the provided plugins and checks if they are already registered.\n// If a plugin is not registered, it is added to the global plugins.\n// If a plugin is already registered, a warning message is logged.\nexport const registerGlobalPlugins = (\n plugins: Array<ModuleFederationRuntimePlugin>,\n): void => {\n const { __GLOBAL_PLUGIN__ } = nativeGlobal.__FEDERATION__;\n\n plugins.forEach((plugin) => {\n if (__GLOBAL_PLUGIN__.findIndex((p) => p.name === plugin.name) === -1) {\n __GLOBAL_PLUGIN__.push(plugin);\n } else {\n warn(`The plugin ${plugin.name} has been registered.`);\n }\n });\n};\n\nexport const getGlobalHostPlugins = (): Array<ModuleFederationRuntimePlugin> =>\n nativeGlobal.__FEDERATION__.__GLOBAL_PLUGIN__;\n\nexport const getPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.get(id);\n\nexport const setPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.set(id, true);\n"],"mappings":"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"}
1
+ {"version":3,"file":"global.js","names":[],"sources":["../src/global.ts"],"sourcesContent":["import { ModuleFederation } from './core';\nimport {\n RemoteEntryExports,\n GlobalShareScopeMap,\n Remote,\n Optional,\n} from './type';\nimport { getFMId } from './utils/tool';\nimport {\n GlobalModuleInfo,\n ModuleInfo,\n isDebugMode,\n} from '@module-federation/sdk';\nimport { warn, error } from './utils/logger';\nimport { ModuleFederationRuntimePlugin } from './type/plugin';\n\nexport interface Federation {\n __GLOBAL_PLUGIN__: Array<ModuleFederationRuntimePlugin>;\n __DEBUG_CONSTRUCTOR_VERSION__?: string;\n moduleInfo: GlobalModuleInfo;\n __DEBUG_CONSTRUCTOR__?: typeof ModuleFederation;\n __INSTANCES__: Array<ModuleFederation>;\n __SHARE__: GlobalShareScopeMap;\n __MANIFEST_LOADING__: Record<string, Promise<ModuleInfo>>;\n __PRELOADED_MAP__: Map<string, boolean>;\n}\nexport const CurrentGlobal =\n typeof globalThis === 'object' ? globalThis : window;\nexport const nativeGlobal: typeof global = (() => {\n try {\n // get real window (incase of sandbox)\n return document.defaultView;\n } catch {\n // node env\n return CurrentGlobal;\n }\n})() as typeof global;\n\nexport const Global = nativeGlobal;\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __FEDERATION__: Federation,\n __VMOK__: Federation,\n // eslint-disable-next-line no-var\n __GLOBAL_LOADING_REMOTE_ENTRY__: Record<\n string,\n undefined | Promise<RemoteEntryExports | void>\n >;\n}\n\nfunction definePropertyGlobalVal(\n target: typeof CurrentGlobal,\n key: string,\n val: any,\n) {\n Object.defineProperty(target, key, {\n value: val,\n configurable: false,\n writable: true,\n });\n}\n\nfunction includeOwnProperty(target: typeof CurrentGlobal, key: string) {\n return Object.hasOwnProperty.call(target, key);\n}\n\n// This section is to prevent encapsulation by certain microfrontend frameworks. Due to reuse policies, sandbox escapes.\n// The sandbox in the microfrontend does not replicate the value of 'configurable'.\n// If there is no loading content on the global object, this section defines the loading object.\nif (!includeOwnProperty(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__')) {\n definePropertyGlobalVal(CurrentGlobal, '__GLOBAL_LOADING_REMOTE_ENTRY__', {});\n}\n\nexport const globalLoading = CurrentGlobal.__GLOBAL_LOADING_REMOTE_ENTRY__;\n\nfunction setGlobalDefaultVal(target: typeof CurrentGlobal) {\n if (\n includeOwnProperty(target, '__VMOK__') &&\n !includeOwnProperty(target, '__FEDERATION__')\n ) {\n definePropertyGlobalVal(target, '__FEDERATION__', target.__VMOK__);\n }\n\n if (!includeOwnProperty(target, '__FEDERATION__')) {\n definePropertyGlobalVal(target, '__FEDERATION__', {\n __GLOBAL_PLUGIN__: [],\n __INSTANCES__: [],\n moduleInfo: {},\n __SHARE__: {},\n __MANIFEST_LOADING__: {},\n __PRELOADED_MAP__: new Map(),\n });\n\n definePropertyGlobalVal(target, '__VMOK__', target.__FEDERATION__);\n }\n\n target.__FEDERATION__.__GLOBAL_PLUGIN__ ??= [];\n target.__FEDERATION__.__INSTANCES__ ??= [];\n target.__FEDERATION__.moduleInfo ??= {};\n target.__FEDERATION__.__SHARE__ ??= {};\n target.__FEDERATION__.__MANIFEST_LOADING__ ??= {};\n target.__FEDERATION__.__PRELOADED_MAP__ ??= new Map();\n}\n\nsetGlobalDefaultVal(CurrentGlobal);\nsetGlobalDefaultVal(nativeGlobal);\n\nexport function resetFederationGlobalInfo(): void {\n CurrentGlobal.__FEDERATION__.__GLOBAL_PLUGIN__ = [];\n CurrentGlobal.__FEDERATION__.__INSTANCES__ = [];\n CurrentGlobal.__FEDERATION__.moduleInfo = {};\n CurrentGlobal.__FEDERATION__.__SHARE__ = {};\n CurrentGlobal.__FEDERATION__.__MANIFEST_LOADING__ = {};\n\n Object.keys(globalLoading).forEach((key) => {\n delete globalLoading[key];\n });\n}\n\nexport function setGlobalFederationInstance(\n FederationInstance: ModuleFederation,\n): void {\n CurrentGlobal.__FEDERATION__.__INSTANCES__.push(FederationInstance);\n}\n\nexport function getGlobalFederationConstructor():\n | typeof ModuleFederation\n | undefined {\n return CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__;\n}\n\nexport function setGlobalFederationConstructor(\n FederationConstructor: typeof ModuleFederation | undefined,\n isDebug = isDebugMode(),\n): void {\n if (isDebug) {\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR__ = FederationConstructor;\n CurrentGlobal.__FEDERATION__.__DEBUG_CONSTRUCTOR_VERSION__ = __VERSION__;\n }\n}\n\nexport function getInfoWithoutType<T extends object>(\n target: T,\n key: keyof T,\n): { value: T[keyof T] | undefined; key: string } {\n if (typeof key === 'string') {\n const keyRes = target[key];\n if (keyRes) {\n return {\n value: target[key],\n key: key as string,\n };\n } else {\n const targetKeys = Object.keys(target);\n for (const targetKey of targetKeys) {\n const [targetTypeOrName, _] = targetKey.split(':');\n const nKey = `${targetTypeOrName}:${key}` as unknown as keyof T;\n const typeWithKeyRes = target[nKey];\n if (typeWithKeyRes) {\n return {\n value: typeWithKeyRes,\n key: nKey as string,\n };\n }\n }\n return {\n value: undefined,\n key: key as string,\n };\n }\n } else {\n error(\n `getInfoWithoutType: \"key\" must be a string, got ${typeof key} (${JSON.stringify(key)}).`,\n );\n }\n}\n\nexport const getGlobalSnapshot = (): GlobalModuleInfo =>\n nativeGlobal.__FEDERATION__.moduleInfo;\n\nexport const getTargetSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n snapshot: GlobalModuleInfo,\n): GlobalModuleInfo[string] | undefined => {\n // Check if the remote is included in the hostSnapshot\n const moduleKey = getFMId(moduleInfo);\n const getModuleInfo = getInfoWithoutType(snapshot, moduleKey).value;\n\n // The remoteSnapshot might not include a version\n if (\n getModuleInfo &&\n !getModuleInfo.version &&\n 'version' in moduleInfo &&\n moduleInfo['version']\n ) {\n getModuleInfo.version = moduleInfo['version'];\n }\n\n if (getModuleInfo) {\n return getModuleInfo;\n }\n\n // If the remote is not included in the hostSnapshot, deploy a micro app snapshot\n if ('version' in moduleInfo && moduleInfo['version']) {\n const { version, ...resModuleInfo } = moduleInfo;\n const moduleKeyWithoutVersion = getFMId(resModuleInfo);\n const getModuleInfoWithoutVersion = getInfoWithoutType(\n nativeGlobal.__FEDERATION__.moduleInfo,\n moduleKeyWithoutVersion,\n ).value;\n\n if (getModuleInfoWithoutVersion?.version === version) {\n return getModuleInfoWithoutVersion;\n }\n }\n\n return;\n};\n\nexport const getGlobalSnapshotInfoByModuleInfo = (\n moduleInfo: Optional<Remote, 'alias'>,\n): GlobalModuleInfo[string] | undefined =>\n getTargetSnapshotInfoByModuleInfo(\n moduleInfo,\n nativeGlobal.__FEDERATION__.moduleInfo,\n );\n\nexport const setGlobalSnapshotInfoByModuleInfo = (\n remoteInfo: Remote,\n moduleDetailInfo: GlobalModuleInfo[string],\n): GlobalModuleInfo => {\n const moduleKey = getFMId(remoteInfo);\n nativeGlobal.__FEDERATION__.moduleInfo[moduleKey] = moduleDetailInfo;\n return nativeGlobal.__FEDERATION__.moduleInfo;\n};\n\nexport const addGlobalSnapshot = (\n moduleInfos: GlobalModuleInfo,\n): (() => void) => {\n nativeGlobal.__FEDERATION__.moduleInfo = {\n ...nativeGlobal.__FEDERATION__.moduleInfo,\n ...moduleInfos,\n };\n return () => {\n const keys = Object.keys(moduleInfos);\n for (const key of keys) {\n delete nativeGlobal.__FEDERATION__.moduleInfo[key];\n }\n };\n};\n\nexport const getRemoteEntryExports = (\n name: string,\n globalName: string | undefined,\n): {\n remoteEntryKey: string;\n entryExports: RemoteEntryExports | undefined;\n} => {\n const remoteEntryKey = globalName || `__FEDERATION_${name}:custom__`;\n const entryExports = (CurrentGlobal as any)[remoteEntryKey];\n return {\n remoteEntryKey,\n entryExports,\n };\n};\n\n// This function is used to register global plugins.\n// It iterates over the provided plugins and checks if they are already registered.\n// If a plugin is not registered, it is added to the global plugins.\n// If a plugin is already registered, a warning message is logged.\nexport const registerGlobalPlugins = (\n plugins: Array<ModuleFederationRuntimePlugin>,\n): void => {\n const { __GLOBAL_PLUGIN__ } = nativeGlobal.__FEDERATION__;\n\n plugins.forEach((plugin) => {\n if (__GLOBAL_PLUGIN__.findIndex((p) => p.name === plugin.name) === -1) {\n __GLOBAL_PLUGIN__.push(plugin);\n } else {\n warn(`The plugin ${plugin.name} has been registered.`);\n }\n });\n};\n\nexport const getGlobalHostPlugins = (): Array<ModuleFederationRuntimePlugin> =>\n nativeGlobal.__FEDERATION__.__GLOBAL_PLUGIN__;\n\nexport const getPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.get(id);\n\nexport const setPreloaded = (id: string) =>\n CurrentGlobal.__FEDERATION__.__PRELOADED_MAP__.set(id, true);\n"],"mappings":"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"}
package/dist/helpers.d.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  import { Global, addGlobalSnapshot, getGlobalFederationConstructor, getGlobalHostPlugins, getGlobalSnapshot, getGlobalSnapshotInfoByModuleInfo, getInfoWithoutType, getPreloaded, getRemoteEntryExports, getTargetSnapshotInfoByModuleInfo, registerGlobalPlugins, resetFederationGlobalInfo, setGlobalFederationConstructor, setGlobalFederationInstance, setGlobalSnapshotInfoByModuleInfo, setPreloaded } from "./global.js";
2
- import "./utils/index.js";
3
- import "./utils/preload.js";
4
2
  import { getGlobalShareScope, getRegisteredShare } from "./utils/share.js";
5
3
 
6
4
  //#region src/helpers.d.ts
package/dist/index.cjs CHANGED
@@ -23,6 +23,7 @@ exports.Module = require_index$2.Module;
23
23
  exports.ModuleFederation = require_core.ModuleFederation;
24
24
  exports.addGlobalSnapshot = require_global.addGlobalSnapshot;
25
25
  exports.assert = require_logger.assert;
26
+ exports.error = require_logger.error;
26
27
  exports.getGlobalFederationConstructor = require_global.getGlobalFederationConstructor;
27
28
  exports.getGlobalSnapshot = require_global.getGlobalSnapshot;
28
29
  exports.getInfoWithoutType = require_global.getInfoWithoutType;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["helpersDefault"],"sources":["../src/index.ts"],"sourcesContent":["import helpersDefault, { type IGlobalUtils, type IShareUtils } from './helpers';\n\nconst helpers = helpersDefault;\n\nexport { ModuleFederation } from './core';\nexport {\n type Federation,\n CurrentGlobal,\n Global,\n getGlobalFederationConstructor,\n setGlobalFederationInstance,\n setGlobalFederationConstructor,\n resetFederationGlobalInfo,\n addGlobalSnapshot,\n getGlobalSnapshot,\n getInfoWithoutType,\n} from './global';\nexport type { UserOptions, ModuleFederationRuntimePlugin } from './type';\nexport { assert } from './utils/logger';\nexport { registerGlobalPlugins } from './global';\nexport {\n getRemoteEntry,\n getRemoteInfo,\n isStaticResourcesEqual,\n matchRemoteWithNameAndExpose,\n safeWrapper,\n} from './utils';\nexport { getRegisteredShare } from '../src/utils/share';\nexport { loadScript, loadScriptNode } from '@module-federation/sdk';\nexport { Module } from './module';\nexport * as types from './type';\nexport { helpers };\nexport { satisfy } from '../src/utils/semver';\nexport type { IGlobalUtils, IShareUtils };\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,MAAM,UAAUA"}
1
+ {"version":3,"file":"index.cjs","names":["helpersDefault"],"sources":["../src/index.ts"],"sourcesContent":["import helpersDefault, { type IGlobalUtils, type IShareUtils } from './helpers';\n\nconst helpers = helpersDefault;\n\nexport { ModuleFederation } from './core';\nexport {\n type Federation,\n CurrentGlobal,\n Global,\n getGlobalFederationConstructor,\n setGlobalFederationInstance,\n setGlobalFederationConstructor,\n resetFederationGlobalInfo,\n addGlobalSnapshot,\n getGlobalSnapshot,\n getInfoWithoutType,\n} from './global';\nexport type { UserOptions, ModuleFederationRuntimePlugin } from './type';\nexport { assert, error } from './utils/logger';\nexport { registerGlobalPlugins } from './global';\nexport {\n getRemoteEntry,\n getRemoteInfo,\n isStaticResourcesEqual,\n matchRemoteWithNameAndExpose,\n safeWrapper,\n} from './utils';\nexport { getRegisteredShare } from '../src/utils/share';\nexport { loadScript, loadScriptNode } from '@module-federation/sdk';\nexport { Module } from './module';\nexport * as types from './type';\nexport { helpers };\nexport { satisfy } from '../src/utils/semver';\nexport type { IGlobalUtils, IShareUtils };\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,MAAM,UAAUA"}
package/dist/index.d.ts CHANGED
@@ -6,9 +6,8 @@ import { UserOptions } from "./type/config.js";
6
6
  import { index_d_exports } from "./type/index.js";
7
7
  import { isStaticResourcesEqual, safeWrapper } from "./utils/tool.js";
8
8
  import { matchRemoteWithNameAndExpose } from "./utils/manifest.js";
9
- import { assert } from "./utils/logger.js";
9
+ import { assert, error } from "./utils/logger.js";
10
10
  import { getRemoteEntry, getRemoteInfo } from "./utils/load.js";
11
- import "./utils/index.js";
12
11
  import { preloadAssets } from "./utils/preload.js";
13
12
  import { getRegisteredShare } from "./utils/share.js";
14
13
  import { IGlobalUtils, IShareUtils } from "./helpers.js";
@@ -26,5 +25,5 @@ declare const helpers: {
26
25
  };
27
26
  };
28
27
  //#endregion
29
- export { CurrentGlobal, type Federation, Global, type IGlobalUtils, type IShareUtils, Module, ModuleFederation, type ModuleFederationRuntimePlugin, type UserOptions, addGlobalSnapshot, assert, getGlobalFederationConstructor, getGlobalSnapshot, getInfoWithoutType, getRegisteredShare, getRemoteEntry, getRemoteInfo, helpers, isStaticResourcesEqual, loadScript, loadScriptNode, matchRemoteWithNameAndExpose, registerGlobalPlugins, resetFederationGlobalInfo, safeWrapper, satisfy, setGlobalFederationConstructor, setGlobalFederationInstance, index_d_exports as types };
28
+ export { CurrentGlobal, type Federation, Global, type IGlobalUtils, type IShareUtils, Module, ModuleFederation, type ModuleFederationRuntimePlugin, type UserOptions, addGlobalSnapshot, assert, error, getGlobalFederationConstructor, getGlobalSnapshot, getInfoWithoutType, getRegisteredShare, getRemoteEntry, getRemoteInfo, helpers, isStaticResourcesEqual, loadScript, loadScriptNode, matchRemoteWithNameAndExpose, registerGlobalPlugins, resetFederationGlobalInfo, safeWrapper, satisfy, setGlobalFederationConstructor, setGlobalFederationInstance, index_d_exports as types };
30
29
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { assert } from "./utils/logger.js";
1
+ import { assert, error } from "./utils/logger.js";
2
2
  import { isStaticResourcesEqual, safeWrapper } from "./utils/tool.js";
3
3
  import { CurrentGlobal, Global, addGlobalSnapshot, getGlobalFederationConstructor, getGlobalSnapshot, getInfoWithoutType, registerGlobalPlugins, resetFederationGlobalInfo, setGlobalFederationConstructor, setGlobalFederationInstance } from "./global.js";
4
4
  import { satisfy } from "./utils/semver/index.js";
@@ -16,5 +16,5 @@ import { loadScript, loadScriptNode } from "@module-federation/sdk";
16
16
  const helpers = helpers_default;
17
17
 
18
18
  //#endregion
19
- export { CurrentGlobal, Global, Module, ModuleFederation, addGlobalSnapshot, assert, getGlobalFederationConstructor, getGlobalSnapshot, getInfoWithoutType, getRegisteredShare, getRemoteEntry, getRemoteInfo, helpers, isStaticResourcesEqual, loadScript, loadScriptNode, matchRemoteWithNameAndExpose, registerGlobalPlugins, resetFederationGlobalInfo, safeWrapper, satisfy, setGlobalFederationConstructor, setGlobalFederationInstance, type_exports as types };
19
+ export { CurrentGlobal, Global, Module, ModuleFederation, addGlobalSnapshot, assert, error, getGlobalFederationConstructor, getGlobalSnapshot, getInfoWithoutType, getRegisteredShare, getRemoteEntry, getRemoteInfo, helpers, isStaticResourcesEqual, loadScript, loadScriptNode, matchRemoteWithNameAndExpose, registerGlobalPlugins, resetFederationGlobalInfo, safeWrapper, satisfy, setGlobalFederationConstructor, setGlobalFederationInstance, type_exports as types };
20
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["helpersDefault"],"sources":["../src/index.ts"],"sourcesContent":["import helpersDefault, { type IGlobalUtils, type IShareUtils } from './helpers';\n\nconst helpers = helpersDefault;\n\nexport { ModuleFederation } from './core';\nexport {\n type Federation,\n CurrentGlobal,\n Global,\n getGlobalFederationConstructor,\n setGlobalFederationInstance,\n setGlobalFederationConstructor,\n resetFederationGlobalInfo,\n addGlobalSnapshot,\n getGlobalSnapshot,\n getInfoWithoutType,\n} from './global';\nexport type { UserOptions, ModuleFederationRuntimePlugin } from './type';\nexport { assert } from './utils/logger';\nexport { registerGlobalPlugins } from './global';\nexport {\n getRemoteEntry,\n getRemoteInfo,\n isStaticResourcesEqual,\n matchRemoteWithNameAndExpose,\n safeWrapper,\n} from './utils';\nexport { getRegisteredShare } from '../src/utils/share';\nexport { loadScript, loadScriptNode } from '@module-federation/sdk';\nexport { Module } from './module';\nexport * as types from './type';\nexport { helpers };\nexport { satisfy } from '../src/utils/semver';\nexport type { IGlobalUtils, IShareUtils };\n"],"mappings":";;;;;;;;;;;;;;;AAEA,MAAM,UAAUA"}
1
+ {"version":3,"file":"index.js","names":["helpersDefault"],"sources":["../src/index.ts"],"sourcesContent":["import helpersDefault, { type IGlobalUtils, type IShareUtils } from './helpers';\n\nconst helpers = helpersDefault;\n\nexport { ModuleFederation } from './core';\nexport {\n type Federation,\n CurrentGlobal,\n Global,\n getGlobalFederationConstructor,\n setGlobalFederationInstance,\n setGlobalFederationConstructor,\n resetFederationGlobalInfo,\n addGlobalSnapshot,\n getGlobalSnapshot,\n getInfoWithoutType,\n} from './global';\nexport type { UserOptions, ModuleFederationRuntimePlugin } from './type';\nexport { assert, error } from './utils/logger';\nexport { registerGlobalPlugins } from './global';\nexport {\n getRemoteEntry,\n getRemoteInfo,\n isStaticResourcesEqual,\n matchRemoteWithNameAndExpose,\n safeWrapper,\n} from './utils';\nexport { getRegisteredShare } from '../src/utils/share';\nexport { loadScript, loadScriptNode } from '@module-federation/sdk';\nexport { Module } from './module';\nexport * as types from './type';\nexport { helpers };\nexport { satisfy } from '../src/utils/semver';\nexport type { IGlobalUtils, IShareUtils };\n"],"mappings":";;;;;;;;;;;;;;;AAEA,MAAM,UAAUA"}
@@ -1,6 +1,7 @@
1
1
  const require_logger = require('../utils/logger.cjs');
2
2
  const require_tool = require('../utils/tool.cjs');
3
3
  const require_load = require('../utils/load.cjs');
4
+ const require_context = require('../utils/context.cjs');
4
5
  require('../utils/index.cjs');
5
6
  let _module_federation_sdk = require("@module-federation/sdk");
6
7
  let _module_federation_error_codes = require("@module-federation/error-codes");
@@ -63,12 +64,12 @@ var Module = class {
63
64
  remoteInfo: this.remoteInfo,
64
65
  origin: this.host
65
66
  });
66
- if (typeof remoteEntryExports?.init === "undefined") require_logger.error((0, _module_federation_error_codes.getShortErrorMsg)(_module_federation_error_codes.RUNTIME_002, _module_federation_error_codes.runtimeDescMap, {
67
+ if (typeof remoteEntryExports?.init === "undefined") require_logger.error(_module_federation_error_codes.RUNTIME_002, _module_federation_error_codes.runtimeDescMap, {
67
68
  hostName: this.host.name,
68
69
  remoteName: this.remoteInfo.name,
69
70
  remoteEntryUrl: this.remoteInfo.entry,
70
71
  remoteEntryKey: this.remoteInfo.entryGlobalName
71
- }));
72
+ }, void 0, require_context.optionsToMFContext(this.host.options));
72
73
  await remoteEntryExports.init(initContainerOptions.shareScope, initContainerOptions.initScope, initContainerOptions.remoteEntryInitOptions);
73
74
  await this.host.hooks.lifecycle.initContainer.emit({
74
75
  ...initContainerOptions,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["getRemoteEntry","RUNTIME_002","runtimeDescMap","getFMId","processModuleAlias"],"sources":["../../src/module/index.ts"],"sourcesContent":["import { getFMId, assert, error, processModuleAlias } from '../utils';\nimport { safeToString, ModuleInfo } from '@module-federation/sdk';\nimport {\n getShortErrorMsg,\n RUNTIME_002,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { getRemoteEntry } from '../utils/load';\nimport { ModuleFederation } from '../core';\nimport {\n RemoteEntryExports,\n RemoteInfo,\n InitScope,\n ShareScopeMap,\n} from '../type';\n\nexport type ModuleOptions = ConstructorParameters<typeof Module>[0];\n\nexport function createRemoteEntryInitOptions(\n remoteInfo: RemoteInfo,\n hostShareScopeMap: ShareScopeMap,\n rawInitScope?: InitScope,\n): Record<string, any> {\n const localShareScopeMap = hostShareScopeMap;\n\n const shareScopeKeys = Array.isArray(remoteInfo.shareScope)\n ? remoteInfo.shareScope\n : [remoteInfo.shareScope];\n\n if (!shareScopeKeys.length) {\n shareScopeKeys.push('default');\n }\n shareScopeKeys.forEach((shareScopeKey) => {\n if (!localShareScopeMap[shareScopeKey]) {\n localShareScopeMap[shareScopeKey] = {};\n }\n });\n\n const remoteEntryInitOptions = {\n version: remoteInfo.version || '',\n shareScopeKeys: Array.isArray(remoteInfo.shareScope)\n ? shareScopeKeys\n : remoteInfo.shareScope || 'default',\n };\n\n // Help to find host instance\n Object.defineProperty(remoteEntryInitOptions, 'shareScopeMap', {\n value: localShareScopeMap,\n // remoteEntryInitOptions will be traversed and assigned during container init, ,so this attribute is not allowed to be traversed\n enumerable: false,\n });\n\n // TODO: compate legacy init params, should use shareScopeMap if exist\n const shareScope = localShareScopeMap[shareScopeKeys[0]];\n const initScope: InitScope = rawInitScope ?? [];\n\n return {\n remoteEntryInitOptions,\n shareScope,\n initScope,\n };\n}\n\nclass Module {\n remoteInfo: RemoteInfo;\n inited = false;\n initing = false;\n initPromise?: Promise<void>;\n remoteEntryExports?: RemoteEntryExports;\n lib: RemoteEntryExports | undefined = undefined;\n host: ModuleFederation;\n\n constructor({\n remoteInfo,\n host,\n }: {\n remoteInfo: RemoteInfo;\n host: ModuleFederation;\n }) {\n this.remoteInfo = remoteInfo;\n this.host = host;\n }\n\n async getEntry(): Promise<RemoteEntryExports> {\n if (this.remoteEntryExports) {\n return this.remoteEntryExports;\n }\n\n const remoteEntryExports = await getRemoteEntry({\n origin: this.host,\n remoteInfo: this.remoteInfo,\n remoteEntryExports: this.remoteEntryExports,\n });\n\n assert(\n remoteEntryExports,\n `remoteEntryExports is undefined \\n ${safeToString(this.remoteInfo)}`,\n );\n\n this.remoteEntryExports = remoteEntryExports;\n return this.remoteEntryExports;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n async init(\n id?: string,\n remoteSnapshot?: ModuleInfo,\n rawInitScope?: InitScope,\n ) {\n // Get remoteEntry.js\n const remoteEntryExports = await this.getEntry();\n\n if (this.inited) {\n return remoteEntryExports;\n }\n\n if (this.initPromise) {\n await this.initPromise;\n return remoteEntryExports;\n }\n\n this.initing = true;\n this.initPromise = (async () => {\n const { remoteEntryInitOptions, shareScope, initScope } =\n createRemoteEntryInitOptions(\n this.remoteInfo,\n this.host.shareScopeMap,\n rawInitScope,\n );\n\n const initContainerOptions =\n await this.host.hooks.lifecycle.beforeInitContainer.emit({\n shareScope,\n // @ts-ignore shareScopeMap will be set by Object.defineProperty\n remoteEntryInitOptions,\n initScope,\n remoteInfo: this.remoteInfo,\n origin: this.host,\n });\n\n if (typeof remoteEntryExports?.init === 'undefined') {\n error(\n getShortErrorMsg(RUNTIME_002, runtimeDescMap, {\n hostName: this.host.name,\n remoteName: this.remoteInfo.name,\n remoteEntryUrl: this.remoteInfo.entry,\n remoteEntryKey: this.remoteInfo.entryGlobalName,\n }),\n );\n }\n\n await remoteEntryExports.init(\n initContainerOptions.shareScope,\n initContainerOptions.initScope,\n initContainerOptions.remoteEntryInitOptions,\n );\n\n await this.host.hooks.lifecycle.initContainer.emit({\n ...initContainerOptions,\n id,\n remoteSnapshot,\n remoteEntryExports,\n });\n this.inited = true;\n })();\n\n try {\n await this.initPromise;\n } finally {\n this.initing = false;\n this.initPromise = undefined;\n }\n\n return remoteEntryExports;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n async get(\n id: string,\n expose: string,\n options?: { loadFactory?: boolean },\n remoteSnapshot?: ModuleInfo,\n ) {\n const { loadFactory = true } = options || { loadFactory: true };\n\n const remoteEntryExports = await this.init(id, remoteSnapshot);\n this.lib = remoteEntryExports;\n\n let moduleFactory;\n moduleFactory = await this.host.loaderHook.lifecycle.getModuleFactory.emit({\n remoteEntryExports,\n expose,\n moduleInfo: this.remoteInfo,\n });\n\n // get exposeGetter\n if (!moduleFactory) {\n moduleFactory = await remoteEntryExports.get(expose);\n }\n\n assert(\n moduleFactory,\n `${getFMId(this.remoteInfo)} remote don't export ${expose}.`,\n );\n\n // keep symbol for module name always one format\n const symbolName = processModuleAlias(this.remoteInfo.name, expose);\n const wrapModuleFactory = this.wraperFactory(moduleFactory, symbolName);\n\n if (!loadFactory) {\n return wrapModuleFactory;\n }\n const exposeContent = await wrapModuleFactory();\n\n return exposeContent;\n }\n\n private wraperFactory(\n moduleFactory: () => any | (() => Promise<any>),\n id: string,\n ) {\n function defineModuleId(res: any, id: string) {\n if (\n res &&\n typeof res === 'object' &&\n Object.isExtensible(res) &&\n !Object.getOwnPropertyDescriptor(res, Symbol.for('mf_module_id'))\n ) {\n Object.defineProperty(res, Symbol.for('mf_module_id'), {\n value: id,\n enumerable: false,\n });\n }\n }\n\n if (moduleFactory instanceof Promise) {\n return async () => {\n const res = await moduleFactory();\n // This parameter is used for bridge debugging\n defineModuleId(res, id);\n return res;\n };\n } else {\n return () => {\n const res = moduleFactory();\n // This parameter is used for bridge debugging\n defineModuleId(res, id);\n return res;\n };\n }\n }\n}\n\nexport { Module };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["getRemoteEntry","RUNTIME_002","runtimeDescMap","optionsToMFContext","getFMId","processModuleAlias"],"sources":["../../src/module/index.ts"],"sourcesContent":["import {\n getFMId,\n assert,\n error,\n processModuleAlias,\n optionsToMFContext,\n} from '../utils';\nimport { safeToString, ModuleInfo } from '@module-federation/sdk';\nimport {\n RUNTIME_002,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { getRemoteEntry } from '../utils/load';\nimport { ModuleFederation } from '../core';\nimport {\n RemoteEntryExports,\n RemoteInfo,\n InitScope,\n ShareScopeMap,\n} from '../type';\n\nexport type ModuleOptions = ConstructorParameters<typeof Module>[0];\n\nexport function createRemoteEntryInitOptions(\n remoteInfo: RemoteInfo,\n hostShareScopeMap: ShareScopeMap,\n rawInitScope?: InitScope,\n): Record<string, any> {\n const localShareScopeMap = hostShareScopeMap;\n\n const shareScopeKeys = Array.isArray(remoteInfo.shareScope)\n ? remoteInfo.shareScope\n : [remoteInfo.shareScope];\n\n if (!shareScopeKeys.length) {\n shareScopeKeys.push('default');\n }\n shareScopeKeys.forEach((shareScopeKey) => {\n if (!localShareScopeMap[shareScopeKey]) {\n localShareScopeMap[shareScopeKey] = {};\n }\n });\n\n const remoteEntryInitOptions = {\n version: remoteInfo.version || '',\n shareScopeKeys: Array.isArray(remoteInfo.shareScope)\n ? shareScopeKeys\n : remoteInfo.shareScope || 'default',\n };\n\n // Help to find host instance\n Object.defineProperty(remoteEntryInitOptions, 'shareScopeMap', {\n value: localShareScopeMap,\n // remoteEntryInitOptions will be traversed and assigned during container init, ,so this attribute is not allowed to be traversed\n enumerable: false,\n });\n\n // TODO: compate legacy init params, should use shareScopeMap if exist\n const shareScope = localShareScopeMap[shareScopeKeys[0]];\n const initScope: InitScope = rawInitScope ?? [];\n\n return {\n remoteEntryInitOptions,\n shareScope,\n initScope,\n };\n}\n\nclass Module {\n remoteInfo: RemoteInfo;\n inited = false;\n initing = false;\n initPromise?: Promise<void>;\n remoteEntryExports?: RemoteEntryExports;\n lib: RemoteEntryExports | undefined = undefined;\n host: ModuleFederation;\n\n constructor({\n remoteInfo,\n host,\n }: {\n remoteInfo: RemoteInfo;\n host: ModuleFederation;\n }) {\n this.remoteInfo = remoteInfo;\n this.host = host;\n }\n\n async getEntry(): Promise<RemoteEntryExports> {\n if (this.remoteEntryExports) {\n return this.remoteEntryExports;\n }\n\n const remoteEntryExports = await getRemoteEntry({\n origin: this.host,\n remoteInfo: this.remoteInfo,\n remoteEntryExports: this.remoteEntryExports,\n });\n\n assert(\n remoteEntryExports,\n `remoteEntryExports is undefined \\n ${safeToString(this.remoteInfo)}`,\n );\n\n this.remoteEntryExports = remoteEntryExports;\n return this.remoteEntryExports;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n async init(\n id?: string,\n remoteSnapshot?: ModuleInfo,\n rawInitScope?: InitScope,\n ) {\n // Get remoteEntry.js\n const remoteEntryExports = await this.getEntry();\n\n if (this.inited) {\n return remoteEntryExports;\n }\n\n if (this.initPromise) {\n await this.initPromise;\n return remoteEntryExports;\n }\n\n this.initing = true;\n this.initPromise = (async () => {\n const { remoteEntryInitOptions, shareScope, initScope } =\n createRemoteEntryInitOptions(\n this.remoteInfo,\n this.host.shareScopeMap,\n rawInitScope,\n );\n\n const initContainerOptions =\n await this.host.hooks.lifecycle.beforeInitContainer.emit({\n shareScope,\n // @ts-ignore shareScopeMap will be set by Object.defineProperty\n remoteEntryInitOptions,\n initScope,\n remoteInfo: this.remoteInfo,\n origin: this.host,\n });\n\n if (typeof remoteEntryExports?.init === 'undefined') {\n error(\n RUNTIME_002,\n runtimeDescMap,\n {\n hostName: this.host.name,\n remoteName: this.remoteInfo.name,\n remoteEntryUrl: this.remoteInfo.entry,\n remoteEntryKey: this.remoteInfo.entryGlobalName,\n },\n undefined,\n optionsToMFContext(this.host.options),\n );\n }\n\n await remoteEntryExports.init(\n initContainerOptions.shareScope,\n initContainerOptions.initScope,\n initContainerOptions.remoteEntryInitOptions,\n );\n\n await this.host.hooks.lifecycle.initContainer.emit({\n ...initContainerOptions,\n id,\n remoteSnapshot,\n remoteEntryExports,\n });\n this.inited = true;\n })();\n\n try {\n await this.initPromise;\n } finally {\n this.initing = false;\n this.initPromise = undefined;\n }\n\n return remoteEntryExports;\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n async get(\n id: string,\n expose: string,\n options?: { loadFactory?: boolean },\n remoteSnapshot?: ModuleInfo,\n ) {\n const { loadFactory = true } = options || { loadFactory: true };\n\n const remoteEntryExports = await this.init(id, remoteSnapshot);\n this.lib = remoteEntryExports;\n\n let moduleFactory;\n moduleFactory = await this.host.loaderHook.lifecycle.getModuleFactory.emit({\n remoteEntryExports,\n expose,\n moduleInfo: this.remoteInfo,\n });\n\n // get exposeGetter\n if (!moduleFactory) {\n moduleFactory = await remoteEntryExports.get(expose);\n }\n\n assert(\n moduleFactory,\n `${getFMId(this.remoteInfo)} remote don't export ${expose}.`,\n );\n\n // keep symbol for module name always one format\n const symbolName = processModuleAlias(this.remoteInfo.name, expose);\n const wrapModuleFactory = this.wraperFactory(moduleFactory, symbolName);\n\n if (!loadFactory) {\n return wrapModuleFactory;\n }\n const exposeContent = await wrapModuleFactory();\n\n return exposeContent;\n }\n\n private wraperFactory(\n moduleFactory: () => any | (() => Promise<any>),\n id: string,\n ) {\n function defineModuleId(res: any, id: string) {\n if (\n res &&\n typeof res === 'object' &&\n Object.isExtensible(res) &&\n !Object.getOwnPropertyDescriptor(res, Symbol.for('mf_module_id'))\n ) {\n Object.defineProperty(res, Symbol.for('mf_module_id'), {\n value: id,\n enumerable: false,\n });\n }\n }\n\n if (moduleFactory instanceof Promise) {\n return async () => {\n const res = await moduleFactory();\n // This parameter is used for bridge debugging\n defineModuleId(res, id);\n return res;\n };\n } else {\n return () => {\n const res = moduleFactory();\n // This parameter is used for bridge debugging\n defineModuleId(res, id);\n return res;\n };\n }\n }\n}\n\nexport { Module };\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { ModuleFederation } from "../core.js";
2
2
  import { InitScope, RemoteEntryExports, RemoteInfo } from "../type/config.js";
3
- import "../type/index.js";
4
3
  import { ModuleInfo } from "@module-federation/sdk";
5
4
 
6
5
  //#region src/module/index.d.ts
@@ -1,9 +1,10 @@
1
1
  import { assert, error } from "../utils/logger.js";
2
2
  import { getFMId, processModuleAlias } from "../utils/tool.js";
3
3
  import { getRemoteEntry } from "../utils/load.js";
4
+ import { optionsToMFContext } from "../utils/context.js";
4
5
  import "../utils/index.js";
5
6
  import { safeToString } from "@module-federation/sdk";
6
- import { RUNTIME_002, getShortErrorMsg, runtimeDescMap } from "@module-federation/error-codes";
7
+ import { RUNTIME_002, runtimeDescMap } from "@module-federation/error-codes";
7
8
 
8
9
  //#region src/module/index.ts
9
10
  function createRemoteEntryInitOptions(remoteInfo, hostShareScopeMap, rawInitScope) {
@@ -63,12 +64,12 @@ var Module$1 = class {
63
64
  remoteInfo: this.remoteInfo,
64
65
  origin: this.host
65
66
  });
66
- if (typeof remoteEntryExports?.init === "undefined") error(getShortErrorMsg(RUNTIME_002, runtimeDescMap, {
67
+ if (typeof remoteEntryExports?.init === "undefined") error(RUNTIME_002, runtimeDescMap, {
67
68
  hostName: this.host.name,
68
69
  remoteName: this.remoteInfo.name,
69
70
  remoteEntryUrl: this.remoteInfo.entry,
70
71
  remoteEntryKey: this.remoteInfo.entryGlobalName
71
- }));
72
+ }, void 0, optionsToMFContext(this.host.options));
72
73
  await remoteEntryExports.init(initContainerOptions.shareScope, initContainerOptions.initScope, initContainerOptions.remoteEntryInitOptions);
73
74
  await this.host.hooks.lifecycle.initContainer.emit({
74
75
  ...initContainerOptions,