@module-federation/runtime-core 2.0.1 → 2.1.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 (204) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +19 -0
  2. package/dist/_virtual/_rolldown/runtime.js +18 -0
  3. package/dist/constant.cjs +9 -0
  4. package/dist/constant.cjs.map +1 -0
  5. package/dist/constant.js +7 -0
  6. package/dist/constant.js.map +1 -0
  7. package/dist/core.cjs +153 -0
  8. package/dist/core.cjs.map +1 -0
  9. package/dist/core.d.ts +132 -0
  10. package/dist/core.js +153 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/global.cjs +160 -0
  13. package/dist/global.cjs.map +1 -0
  14. package/dist/global.d.ts +46 -0
  15. package/dist/global.js +142 -0
  16. package/dist/global.js.map +1 -0
  17. package/dist/helpers.cjs +44 -0
  18. package/dist/helpers.cjs.map +1 -0
  19. package/dist/helpers.d.ts +32 -0
  20. package/dist/helpers.js +44 -0
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/index.cjs +59 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +30 -1
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/module/index.cjs +128 -0
  28. package/dist/module/index.cjs.map +1 -0
  29. package/dist/module/index.d.ts +32 -0
  30. package/dist/module/index.js +128 -0
  31. package/dist/module/index.js.map +1 -0
  32. package/dist/plugins/generate-preload-assets.cjs +182 -0
  33. package/dist/plugins/generate-preload-assets.cjs.map +1 -0
  34. package/dist/plugins/generate-preload-assets.js +182 -0
  35. package/dist/plugins/generate-preload-assets.js.map +1 -0
  36. package/dist/plugins/snapshot/SnapshotHandler.cjs +184 -0
  37. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
  38. package/dist/plugins/snapshot/SnapshotHandler.d.ts +68 -0
  39. package/dist/plugins/snapshot/SnapshotHandler.js +183 -0
  40. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
  41. package/dist/plugins/snapshot/index.cjs +62 -0
  42. package/dist/plugins/snapshot/index.cjs.map +1 -0
  43. package/dist/plugins/snapshot/index.js +61 -0
  44. package/dist/plugins/snapshot/index.js.map +1 -0
  45. package/dist/remote/index.cjs +303 -0
  46. package/dist/remote/index.cjs.map +1 -0
  47. package/dist/remote/index.d.ts +121 -0
  48. package/dist/remote/index.js +303 -0
  49. package/dist/remote/index.js.map +1 -0
  50. package/dist/shared/index.cjs +304 -0
  51. package/dist/shared/index.cjs.map +1 -0
  52. package/dist/shared/index.d.ts +85 -0
  53. package/dist/shared/index.js +304 -0
  54. package/dist/shared/index.js.map +1 -0
  55. package/dist/type/config.d.ts +130 -0
  56. package/dist/type/index.cjs +13 -0
  57. package/dist/type/index.cjs.map +1 -0
  58. package/dist/type/index.d.ts +11 -0
  59. package/dist/type/index.js +8 -0
  60. package/dist/type/index.js.map +1 -0
  61. package/dist/type/plugin.d.ts +27 -0
  62. package/dist/type/preload.d.ts +31 -0
  63. package/dist/types.cjs +0 -0
  64. package/dist/types.d.ts +5 -1
  65. package/dist/types.js +1 -0
  66. package/dist/utils/env.cjs +10 -0
  67. package/dist/utils/env.cjs.map +1 -0
  68. package/dist/utils/env.d.ts +1 -0
  69. package/dist/utils/env.js +10 -0
  70. package/dist/utils/env.js.map +1 -0
  71. package/dist/utils/hooks/asyncHook.cjs +23 -0
  72. package/dist/utils/hooks/asyncHook.cjs.map +1 -0
  73. package/dist/utils/hooks/asyncHook.d.ts +10 -0
  74. package/dist/utils/hooks/asyncHook.js +23 -0
  75. package/dist/utils/hooks/asyncHook.js.map +1 -0
  76. package/dist/utils/hooks/asyncWaterfallHooks.cjs +42 -0
  77. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
  78. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
  79. package/dist/utils/hooks/asyncWaterfallHooks.js +42 -0
  80. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
  81. package/dist/utils/hooks/index.cjs +5 -0
  82. package/dist/utils/hooks/index.d.ts +5 -0
  83. package/dist/utils/hooks/index.js +7 -0
  84. package/dist/utils/hooks/pluginSystem.cjs +37 -0
  85. package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
  86. package/dist/utils/hooks/pluginSystem.d.ts +19 -0
  87. package/dist/utils/hooks/pluginSystem.js +37 -0
  88. package/dist/utils/hooks/pluginSystem.js.map +1 -0
  89. package/dist/utils/hooks/syncHook.cjs +36 -0
  90. package/dist/utils/hooks/syncHook.cjs.map +1 -0
  91. package/dist/utils/hooks/syncHook.d.ts +16 -0
  92. package/dist/utils/hooks/syncHook.js +35 -0
  93. package/dist/utils/hooks/syncHook.js.map +1 -0
  94. package/dist/utils/hooks/syncWaterfallHook.cjs +39 -0
  95. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
  96. package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
  97. package/dist/utils/hooks/syncWaterfallHook.js +38 -0
  98. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
  99. package/dist/utils/index.cjs +7 -0
  100. package/dist/utils/index.d.ts +6 -0
  101. package/dist/utils/index.js +8 -0
  102. package/dist/utils/load.cjs +177 -0
  103. package/dist/utils/load.cjs.map +1 -0
  104. package/dist/utils/load.d.ts +16 -0
  105. package/dist/utils/load.js +175 -0
  106. package/dist/utils/load.js.map +1 -0
  107. package/dist/utils/logger.cjs +28 -0
  108. package/dist/utils/logger.cjs.map +1 -0
  109. package/dist/utils/logger.d.ts +7 -0
  110. package/dist/utils/logger.js +25 -0
  111. package/dist/utils/logger.js.map +1 -0
  112. package/dist/utils/manifest.cjs +51 -0
  113. package/dist/utils/manifest.cjs.map +1 -0
  114. package/dist/utils/manifest.d.ts +12 -0
  115. package/dist/utils/manifest.js +49 -0
  116. package/dist/utils/manifest.js.map +1 -0
  117. package/dist/utils/plugin.cjs +27 -0
  118. package/dist/utils/plugin.cjs.map +1 -0
  119. package/dist/utils/plugin.d.ts +2 -0
  120. package/dist/utils/plugin.js +27 -0
  121. package/dist/utils/plugin.js.map +1 -0
  122. package/dist/utils/preload.cjs +146 -0
  123. package/dist/utils/preload.cjs.map +1 -0
  124. package/dist/utils/preload.d.ts +10 -0
  125. package/dist/utils/preload.js +143 -0
  126. package/dist/utils/preload.js.map +1 -0
  127. package/dist/utils/semver/compare.cjs +48 -0
  128. package/dist/utils/semver/compare.cjs.map +1 -0
  129. package/dist/utils/semver/compare.js +47 -0
  130. package/dist/utils/semver/compare.js.map +1 -0
  131. package/dist/utils/semver/constants.cjs +41 -0
  132. package/dist/utils/semver/constants.cjs.map +1 -0
  133. package/dist/utils/semver/constants.js +31 -0
  134. package/dist/utils/semver/constants.js.map +1 -0
  135. package/dist/utils/semver/index.cjs +68 -0
  136. package/dist/utils/semver/index.cjs.map +1 -0
  137. package/dist/utils/semver/index.d.ts +5 -0
  138. package/dist/utils/semver/index.js +68 -0
  139. package/dist/utils/semver/index.js.map +1 -0
  140. package/dist/utils/semver/parser.cjs +104 -0
  141. package/dist/utils/semver/parser.cjs.map +1 -0
  142. package/dist/utils/semver/parser.js +96 -0
  143. package/dist/utils/semver/parser.js.map +1 -0
  144. package/dist/utils/semver/utils.cjs +28 -0
  145. package/dist/utils/semver/utils.cjs.map +1 -0
  146. package/dist/utils/semver/utils.js +24 -0
  147. package/dist/utils/semver/utils.js.map +1 -0
  148. package/dist/utils/share.cjs +284 -0
  149. package/dist/utils/share.cjs.map +1 -0
  150. package/dist/utils/share.d.ts +26 -0
  151. package/dist/utils/share.js +278 -0
  152. package/dist/utils/share.js.map +1 -0
  153. package/dist/utils/tool.cjs +82 -0
  154. package/dist/utils/tool.cjs.map +1 -0
  155. package/dist/utils/tool.d.ts +9 -0
  156. package/dist/utils/tool.js +71 -0
  157. package/dist/utils/tool.js.map +1 -0
  158. package/package.json +9 -9
  159. package/dist/index.cjs.cjs +0 -3442
  160. package/dist/index.cjs.cjs.map +0 -1
  161. package/dist/index.cjs.d.ts +0 -1
  162. package/dist/index.esm.js +0 -3418
  163. package/dist/index.esm.js.map +0 -1
  164. package/dist/src/constant.d.ts +0 -2
  165. package/dist/src/core.d.ts +0 -119
  166. package/dist/src/global.d.ts +0 -42
  167. package/dist/src/helpers.d.ts +0 -38
  168. package/dist/src/index.d.ts +0 -14
  169. package/dist/src/module/index.d.ts +0 -25
  170. package/dist/src/plugins/generate-preload-assets.d.ts +0 -8
  171. package/dist/src/plugins/snapshot/SnapshotHandler.d.ts +0 -60
  172. package/dist/src/plugins/snapshot/index.d.ts +0 -5
  173. package/dist/src/remote/index.d.ts +0 -109
  174. package/dist/src/shared/index.d.ts +0 -75
  175. package/dist/src/type/config.d.ts +0 -128
  176. package/dist/src/type/index.d.ts +0 -3
  177. package/dist/src/type/plugin.d.ts +0 -35
  178. package/dist/src/type/preload.d.ts +0 -26
  179. package/dist/src/types.d.ts +0 -1
  180. package/dist/src/utils/env.d.ts +0 -3
  181. package/dist/src/utils/hooks/asyncHook.d.ts +0 -6
  182. package/dist/src/utils/hooks/asyncWaterfallHooks.d.ts +0 -10
  183. package/dist/src/utils/hooks/index.d.ts +0 -6
  184. package/dist/src/utils/hooks/pluginSystem.d.ts +0 -16
  185. package/dist/src/utils/hooks/syncHook.d.ts +0 -12
  186. package/dist/src/utils/hooks/syncWaterfallHook.d.ts +0 -9
  187. package/dist/src/utils/index.d.ts +0 -6
  188. package/dist/src/utils/load.d.ts +0 -11
  189. package/dist/src/utils/logger.d.ts +0 -6
  190. package/dist/src/utils/manifest.d.ts +0 -7
  191. package/dist/src/utils/plugin.d.ts +0 -3
  192. package/dist/src/utils/preload.d.ts +0 -6
  193. package/dist/src/utils/semver/compare.d.ts +0 -9
  194. package/dist/src/utils/semver/constants.d.ts +0 -10
  195. package/dist/src/utils/semver/index.d.ts +0 -2
  196. package/dist/src/utils/semver/parser.d.ts +0 -9
  197. package/dist/src/utils/semver/utils.d.ts +0 -11
  198. package/dist/src/utils/share.d.ts +0 -45
  199. package/dist/src/utils/tool.d.ts +0 -18
  200. package/dist/types.cjs.cjs +0 -3
  201. package/dist/types.cjs.cjs.map +0 -1
  202. package/dist/types.cjs.d.ts +0 -1
  203. package/dist/types.esm.js +0 -2
  204. package/dist/types.esm.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) {
6
+ __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ }
11
+ if (!no_symbols) {
12
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ }
14
+ return target;
15
+ };
16
+
17
+ //#endregion
18
+
19
+ exports.__exportAll = __exportAll;
@@ -0,0 +1,18 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) {
6
+ __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ }
11
+ if (!no_symbols) {
12
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ }
14
+ return target;
15
+ };
16
+
17
+ //#endregion
18
+ export { __exportAll };
@@ -0,0 +1,9 @@
1
+
2
+ //#region src/constant.ts
3
+ const DEFAULT_SCOPE = "default";
4
+ const DEFAULT_REMOTE_TYPE = "global";
5
+
6
+ //#endregion
7
+ exports.DEFAULT_REMOTE_TYPE = DEFAULT_REMOTE_TYPE;
8
+ exports.DEFAULT_SCOPE = DEFAULT_SCOPE;
9
+ //# sourceMappingURL=constant.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constant.cjs","names":[],"sources":["../src/constant.ts"],"sourcesContent":["export const DEFAULT_SCOPE = 'default';\nexport const DEFAULT_REMOTE_TYPE = 'global';\n"],"mappings":";;AAAA,MAAa,gBAAgB;AAC7B,MAAa,sBAAsB"}
@@ -0,0 +1,7 @@
1
+ //#region src/constant.ts
2
+ const DEFAULT_SCOPE = "default";
3
+ const DEFAULT_REMOTE_TYPE = "global";
4
+
5
+ //#endregion
6
+ export { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE };
7
+ //# sourceMappingURL=constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constant.js","names":[],"sources":["../src/constant.ts"],"sourcesContent":["export const DEFAULT_SCOPE = 'default';\nexport const DEFAULT_REMOTE_TYPE = 'global';\n"],"mappings":";AAAA,MAAa,gBAAgB;AAC7B,MAAa,sBAAsB"}
package/dist/core.cjs ADDED
@@ -0,0 +1,153 @@
1
+ const require_logger = require('./utils/logger.cjs');
2
+ const require_constant = require('./constant.cjs');
3
+ const require_share = require('./utils/share.cjs');
4
+ const require_env = require('./utils/env.cjs');
5
+ const require_plugin = require('./utils/plugin.cjs');
6
+ const require_load = require('./utils/load.cjs');
7
+ require('./utils/index.cjs');
8
+ const require_index$1 = require('./module/index.cjs');
9
+ const require_syncHook = require('./utils/hooks/syncHook.cjs');
10
+ const require_asyncHook = require('./utils/hooks/asyncHook.cjs');
11
+ const require_syncWaterfallHook = require('./utils/hooks/syncWaterfallHook.cjs');
12
+ const require_asyncWaterfallHooks = require('./utils/hooks/asyncWaterfallHooks.cjs');
13
+ const require_pluginSystem = require('./utils/hooks/pluginSystem.cjs');
14
+ require('./utils/hooks/index.cjs');
15
+ const require_index$3 = require('./plugins/snapshot/index.cjs');
16
+ const require_generate_preload_assets = require('./plugins/generate-preload-assets.cjs');
17
+ const require_SnapshotHandler = require('./plugins/snapshot/SnapshotHandler.cjs');
18
+ const require_index$4 = require('./shared/index.cjs');
19
+ const require_index$5 = require('./remote/index.cjs');
20
+ let _module_federation_sdk = require("@module-federation/sdk");
21
+ let _module_federation_error_codes = require("@module-federation/error-codes");
22
+
23
+ //#region src/core.ts
24
+ const USE_SNAPSHOT = typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === "boolean" ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN : true;
25
+ var ModuleFederation = class {
26
+ constructor(userOptions) {
27
+ this.hooks = new require_pluginSystem.PluginSystem({
28
+ beforeInit: new require_syncWaterfallHook.SyncWaterfallHook("beforeInit"),
29
+ init: new require_syncHook.SyncHook(),
30
+ beforeInitContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("beforeInitContainer"),
31
+ initContainer: new require_asyncWaterfallHooks.AsyncWaterfallHook("initContainer")
32
+ });
33
+ this.version = "2.1.0";
34
+ this.moduleCache = /* @__PURE__ */ new Map();
35
+ this.loaderHook = new require_pluginSystem.PluginSystem({
36
+ getModuleInfo: new require_syncHook.SyncHook(),
37
+ createScript: new require_syncHook.SyncHook(),
38
+ createLink: new require_syncHook.SyncHook(),
39
+ fetch: new require_asyncHook.AsyncHook(),
40
+ loadEntryError: new require_asyncHook.AsyncHook(),
41
+ getModuleFactory: new require_asyncHook.AsyncHook()
42
+ });
43
+ this.bridgeHook = new require_pluginSystem.PluginSystem({
44
+ beforeBridgeRender: new require_syncHook.SyncHook(),
45
+ afterBridgeRender: new require_syncHook.SyncHook(),
46
+ beforeBridgeDestroy: new require_syncHook.SyncHook(),
47
+ afterBridgeDestroy: new require_syncHook.SyncHook()
48
+ });
49
+ const plugins = USE_SNAPSHOT ? [require_index$3.snapshotPlugin(), require_generate_preload_assets.generatePreloadAssetsPlugin()] : [];
50
+ const defaultOptions = {
51
+ id: require_env.getBuilderId(),
52
+ name: userOptions.name,
53
+ plugins,
54
+ remotes: [],
55
+ shared: {},
56
+ inBrowser: (0, _module_federation_sdk.isBrowserEnv)()
57
+ };
58
+ this.name = userOptions.name;
59
+ this.options = defaultOptions;
60
+ this.snapshotHandler = new require_SnapshotHandler.SnapshotHandler(this);
61
+ this.sharedHandler = new require_index$4.SharedHandler(this);
62
+ this.remoteHandler = new require_index$5.RemoteHandler(this);
63
+ this.shareScopeMap = this.sharedHandler.shareScopeMap;
64
+ this.registerPlugins([...defaultOptions.plugins, ...userOptions.plugins || []]);
65
+ this.options = this.formatOptions(defaultOptions, userOptions);
66
+ }
67
+ initOptions(userOptions) {
68
+ if (userOptions.name && userOptions.name !== this.options.name) require_logger.error((0, _module_federation_error_codes.getShortErrorMsg)(_module_federation_error_codes.RUNTIME_010, _module_federation_error_codes.runtimeDescMap));
69
+ this.registerPlugins(userOptions.plugins);
70
+ const options = this.formatOptions(this.options, userOptions);
71
+ this.options = options;
72
+ return options;
73
+ }
74
+ async loadShare(pkgName, extraOptions) {
75
+ return this.sharedHandler.loadShare(pkgName, extraOptions);
76
+ }
77
+ loadShareSync(pkgName, extraOptions) {
78
+ return this.sharedHandler.loadShareSync(pkgName, extraOptions);
79
+ }
80
+ initializeSharing(shareScopeName = require_constant.DEFAULT_SCOPE, extraOptions) {
81
+ return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);
82
+ }
83
+ initRawContainer(name, url, container) {
84
+ const remoteInfo = require_load.getRemoteInfo({
85
+ name,
86
+ entry: url
87
+ });
88
+ const module = new require_index$1.Module({
89
+ host: this,
90
+ remoteInfo
91
+ });
92
+ module.remoteEntryExports = container;
93
+ this.moduleCache.set(name, module);
94
+ return module;
95
+ }
96
+ async loadRemote(id, options) {
97
+ return this.remoteHandler.loadRemote(id, options);
98
+ }
99
+ async preloadRemote(preloadOptions) {
100
+ return this.remoteHandler.preloadRemote(preloadOptions);
101
+ }
102
+ initShareScopeMap(scopeName, shareScope, extraOptions = {}) {
103
+ this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);
104
+ }
105
+ formatOptions(globalOptions, userOptions) {
106
+ const { allShareInfos: shared } = require_share.formatShareConfigs(globalOptions, userOptions);
107
+ const { userOptions: userOptionsRes, options: globalOptionsRes } = this.hooks.lifecycle.beforeInit.emit({
108
+ origin: this,
109
+ userOptions,
110
+ options: globalOptions,
111
+ shareInfo: shared
112
+ });
113
+ const remotes = this.remoteHandler.formatAndRegisterRemote(globalOptionsRes, userOptionsRes);
114
+ const { allShareInfos } = this.sharedHandler.registerShared(globalOptionsRes, userOptionsRes);
115
+ const plugins = [...globalOptionsRes.plugins];
116
+ if (userOptionsRes.plugins) userOptionsRes.plugins.forEach((plugin) => {
117
+ if (!plugins.includes(plugin)) plugins.push(plugin);
118
+ });
119
+ const optionsRes = {
120
+ ...globalOptions,
121
+ ...userOptions,
122
+ plugins,
123
+ remotes,
124
+ shared: allShareInfos
125
+ };
126
+ this.hooks.lifecycle.init.emit({
127
+ origin: this,
128
+ options: optionsRes
129
+ });
130
+ return optionsRes;
131
+ }
132
+ registerPlugins(plugins) {
133
+ const pluginRes = require_plugin.registerPlugins(plugins, this);
134
+ this.options.plugins = this.options.plugins.reduce((res, plugin) => {
135
+ if (!plugin) return res;
136
+ if (res && !res.find((item) => item.name === plugin.name)) res.push(plugin);
137
+ return res;
138
+ }, pluginRes || []);
139
+ }
140
+ registerRemotes(remotes, options) {
141
+ return this.remoteHandler.registerRemotes(remotes, options);
142
+ }
143
+ registerShared(shared) {
144
+ this.sharedHandler.registerShared(this.options, {
145
+ ...this.options,
146
+ shared
147
+ });
148
+ }
149
+ };
150
+
151
+ //#endregion
152
+ exports.ModuleFederation = ModuleFederation;
153
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +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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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,132 @@
1
+ import { Module as Module$1 } from "./module/index.js";
2
+ import { SyncHook } from "./utils/hooks/syncHook.js";
3
+ import { AsyncHook } from "./utils/hooks/asyncHook.js";
4
+ import { SyncWaterfallHook } from "./utils/hooks/syncWaterfallHook.js";
5
+ import { AsyncWaterfallHook } from "./utils/hooks/asyncWaterfallHooks.js";
6
+ import { PluginSystem } from "./utils/hooks/pluginSystem.js";
7
+ import "./utils/hooks/index.js";
8
+ import { SnapshotHandler } from "./plugins/snapshot/SnapshotHandler.js";
9
+ import { RemoteHandler } from "./remote/index.js";
10
+ import { SharedHandler } from "./shared/index.js";
11
+ import { CallFrom, InitScope, Options, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, ShareInfos, ShareScopeMap, Shared, UserOptions } from "./type/config.js";
12
+ import { PreloadRemoteArgs } from "./type/preload.js";
13
+ import "./type/index.js";
14
+ import { getRemoteEntry } from "./utils/load.js";
15
+ import "./utils/index.js";
16
+ import { CreateScriptHookReturn, GlobalModuleInfo, ModuleInfo } from "@module-federation/sdk";
17
+
18
+ //#region src/core.d.ts
19
+ declare class ModuleFederation {
20
+ options: Options;
21
+ hooks: PluginSystem<{
22
+ beforeInit: SyncWaterfallHook<{
23
+ userOptions: UserOptions;
24
+ options: Options;
25
+ origin: ModuleFederation;
26
+ /**
27
+ * @deprecated shareInfo will be removed soon, please use userOptions directly!
28
+ */
29
+ shareInfo: ShareInfos;
30
+ }>;
31
+ init: SyncHook<[{
32
+ options: Options;
33
+ origin: ModuleFederation;
34
+ }], void>;
35
+ beforeInitContainer: AsyncWaterfallHook<{
36
+ shareScope: ShareScopeMap[string];
37
+ initScope: InitScope;
38
+ remoteEntryInitOptions: RemoteEntryInitOptions;
39
+ remoteInfo: RemoteInfo;
40
+ origin: ModuleFederation;
41
+ }>;
42
+ initContainer: AsyncWaterfallHook<{
43
+ shareScope: ShareScopeMap[string];
44
+ initScope: InitScope;
45
+ remoteEntryInitOptions: RemoteEntryInitOptions;
46
+ remoteInfo: RemoteInfo;
47
+ remoteEntryExports: RemoteEntryExports;
48
+ origin: ModuleFederation;
49
+ id?: string;
50
+ remoteSnapshot?: ModuleInfo;
51
+ }>;
52
+ }>;
53
+ version: string;
54
+ name: string;
55
+ moduleCache: Map<string, Module$1>;
56
+ snapshotHandler: SnapshotHandler;
57
+ sharedHandler: SharedHandler;
58
+ remoteHandler: RemoteHandler;
59
+ shareScopeMap: ShareScopeMap;
60
+ loaderHook: PluginSystem<{
61
+ getModuleInfo: SyncHook<[{
62
+ target: Record<string, any>;
63
+ key: any;
64
+ }], void | {
65
+ value: any | undefined;
66
+ key: string;
67
+ }>;
68
+ createScript: SyncHook<[{
69
+ url: string;
70
+ attrs?: Record<string, any>;
71
+ }], CreateScriptHookReturn>;
72
+ createLink: SyncHook<[{
73
+ url: string;
74
+ attrs?: Record<string, any>;
75
+ }], void | HTMLLinkElement>;
76
+ fetch: AsyncHook<[string, RequestInit], false | void | Promise<Response>>;
77
+ loadEntryError: AsyncHook<[{
78
+ getRemoteEntry: typeof getRemoteEntry;
79
+ origin: ModuleFederation;
80
+ remoteInfo: RemoteInfo;
81
+ remoteEntryExports?: RemoteEntryExports | undefined;
82
+ globalLoading: Record<string, Promise<void | RemoteEntryExports> | undefined>;
83
+ uniqueKey: string;
84
+ }], Promise<Promise<RemoteEntryExports | undefined> | undefined>>;
85
+ getModuleFactory: AsyncHook<[{
86
+ remoteEntryExports: RemoteEntryExports;
87
+ expose: string;
88
+ moduleInfo: RemoteInfo;
89
+ }], Promise<(() => Promise<Module$1>) | undefined>>;
90
+ }>;
91
+ bridgeHook: PluginSystem<{
92
+ beforeBridgeRender: SyncHook<[Record<string, any>], void | Record<string, any>>;
93
+ afterBridgeRender: SyncHook<[Record<string, any>], void | Record<string, any>>;
94
+ beforeBridgeDestroy: SyncHook<[Record<string, any>], void | Record<string, any>>;
95
+ afterBridgeDestroy: SyncHook<[Record<string, any>], void | Record<string, any>>;
96
+ }>;
97
+ moduleInfo?: GlobalModuleInfo[string];
98
+ constructor(userOptions: UserOptions);
99
+ initOptions(userOptions: UserOptions): Options;
100
+ loadShare<T>(pkgName: string, extraOptions?: {
101
+ customShareInfo?: Partial<Shared>;
102
+ resolver?: (sharedOptions: ShareInfos[string]) => Shared;
103
+ }): Promise<false | (() => T | undefined)>;
104
+ loadShareSync<T>(pkgName: string, extraOptions?: {
105
+ customShareInfo?: Partial<Shared>;
106
+ from?: 'build' | 'runtime';
107
+ resolver?: (sharedOptions: ShareInfos[string]) => Shared;
108
+ }): () => T | never;
109
+ initializeSharing(shareScopeName?: string, extraOptions?: {
110
+ initScope?: InitScope;
111
+ from?: CallFrom;
112
+ strategy?: Shared['strategy'];
113
+ }): Array<Promise<void>>;
114
+ initRawContainer(name: string, url: string, container: RemoteEntryExports): Module$1;
115
+ loadRemote<T>(id: string, options?: {
116
+ loadFactory?: boolean;
117
+ from: CallFrom;
118
+ }): Promise<T | null>;
119
+ preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void>;
120
+ initShareScopeMap(scopeName: string, shareScope: ShareScopeMap[string], extraOptions?: {
121
+ hostShareScopeMap?: ShareScopeMap;
122
+ }): void;
123
+ formatOptions(globalOptions: Options, userOptions: UserOptions): Options;
124
+ registerPlugins(plugins: UserOptions['plugins']): void;
125
+ registerRemotes(remotes: Remote[], options?: {
126
+ force?: boolean;
127
+ }): void;
128
+ registerShared(shared: UserOptions['shared']): void;
129
+ }
130
+ //#endregion
131
+ export { ModuleFederation };
132
+ //# sourceMappingURL=core.d.ts.map
package/dist/core.js ADDED
@@ -0,0 +1,153 @@
1
+ import { error } from "./utils/logger.js";
2
+ import { DEFAULT_SCOPE } from "./constant.js";
3
+ import { formatShareConfigs } from "./utils/share.js";
4
+ import { getBuilderId } from "./utils/env.js";
5
+ import { registerPlugins } from "./utils/plugin.js";
6
+ import { getRemoteInfo } from "./utils/load.js";
7
+ import "./utils/index.js";
8
+ import { Module as Module$1 } from "./module/index.js";
9
+ import { SyncHook } from "./utils/hooks/syncHook.js";
10
+ import { AsyncHook } from "./utils/hooks/asyncHook.js";
11
+ import { SyncWaterfallHook } from "./utils/hooks/syncWaterfallHook.js";
12
+ import { AsyncWaterfallHook } from "./utils/hooks/asyncWaterfallHooks.js";
13
+ import { PluginSystem } from "./utils/hooks/pluginSystem.js";
14
+ import "./utils/hooks/index.js";
15
+ import { snapshotPlugin } from "./plugins/snapshot/index.js";
16
+ import { generatePreloadAssetsPlugin } from "./plugins/generate-preload-assets.js";
17
+ import { SnapshotHandler } from "./plugins/snapshot/SnapshotHandler.js";
18
+ import { SharedHandler } from "./shared/index.js";
19
+ import { RemoteHandler } from "./remote/index.js";
20
+ import { isBrowserEnv } from "@module-federation/sdk";
21
+ import { RUNTIME_010, getShortErrorMsg, runtimeDescMap } from "@module-federation/error-codes";
22
+
23
+ //#region src/core.ts
24
+ const USE_SNAPSHOT = typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === "boolean" ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN : true;
25
+ var ModuleFederation = class {
26
+ constructor(userOptions) {
27
+ this.hooks = new PluginSystem({
28
+ beforeInit: new SyncWaterfallHook("beforeInit"),
29
+ init: new SyncHook(),
30
+ beforeInitContainer: new AsyncWaterfallHook("beforeInitContainer"),
31
+ initContainer: new AsyncWaterfallHook("initContainer")
32
+ });
33
+ this.version = "2.1.0";
34
+ this.moduleCache = /* @__PURE__ */ new Map();
35
+ this.loaderHook = new PluginSystem({
36
+ getModuleInfo: new SyncHook(),
37
+ createScript: new SyncHook(),
38
+ createLink: new SyncHook(),
39
+ fetch: new AsyncHook(),
40
+ loadEntryError: new AsyncHook(),
41
+ getModuleFactory: new AsyncHook()
42
+ });
43
+ this.bridgeHook = new PluginSystem({
44
+ beforeBridgeRender: new SyncHook(),
45
+ afterBridgeRender: new SyncHook(),
46
+ beforeBridgeDestroy: new SyncHook(),
47
+ afterBridgeDestroy: new SyncHook()
48
+ });
49
+ const plugins = USE_SNAPSHOT ? [snapshotPlugin(), generatePreloadAssetsPlugin()] : [];
50
+ const defaultOptions = {
51
+ id: getBuilderId(),
52
+ name: userOptions.name,
53
+ plugins,
54
+ remotes: [],
55
+ shared: {},
56
+ inBrowser: isBrowserEnv()
57
+ };
58
+ this.name = userOptions.name;
59
+ this.options = defaultOptions;
60
+ this.snapshotHandler = new SnapshotHandler(this);
61
+ this.sharedHandler = new SharedHandler(this);
62
+ this.remoteHandler = new RemoteHandler(this);
63
+ this.shareScopeMap = this.sharedHandler.shareScopeMap;
64
+ this.registerPlugins([...defaultOptions.plugins, ...userOptions.plugins || []]);
65
+ this.options = this.formatOptions(defaultOptions, userOptions);
66
+ }
67
+ initOptions(userOptions) {
68
+ if (userOptions.name && userOptions.name !== this.options.name) error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));
69
+ this.registerPlugins(userOptions.plugins);
70
+ const options = this.formatOptions(this.options, userOptions);
71
+ this.options = options;
72
+ return options;
73
+ }
74
+ async loadShare(pkgName, extraOptions) {
75
+ return this.sharedHandler.loadShare(pkgName, extraOptions);
76
+ }
77
+ loadShareSync(pkgName, extraOptions) {
78
+ return this.sharedHandler.loadShareSync(pkgName, extraOptions);
79
+ }
80
+ initializeSharing(shareScopeName = DEFAULT_SCOPE, extraOptions) {
81
+ return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);
82
+ }
83
+ initRawContainer(name, url, container) {
84
+ const remoteInfo = getRemoteInfo({
85
+ name,
86
+ entry: url
87
+ });
88
+ const module = new Module$1({
89
+ host: this,
90
+ remoteInfo
91
+ });
92
+ module.remoteEntryExports = container;
93
+ this.moduleCache.set(name, module);
94
+ return module;
95
+ }
96
+ async loadRemote(id, options) {
97
+ return this.remoteHandler.loadRemote(id, options);
98
+ }
99
+ async preloadRemote(preloadOptions) {
100
+ return this.remoteHandler.preloadRemote(preloadOptions);
101
+ }
102
+ initShareScopeMap(scopeName, shareScope, extraOptions = {}) {
103
+ this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);
104
+ }
105
+ formatOptions(globalOptions, userOptions) {
106
+ const { allShareInfos: shared } = formatShareConfigs(globalOptions, userOptions);
107
+ const { userOptions: userOptionsRes, options: globalOptionsRes } = this.hooks.lifecycle.beforeInit.emit({
108
+ origin: this,
109
+ userOptions,
110
+ options: globalOptions,
111
+ shareInfo: shared
112
+ });
113
+ const remotes = this.remoteHandler.formatAndRegisterRemote(globalOptionsRes, userOptionsRes);
114
+ const { allShareInfos } = this.sharedHandler.registerShared(globalOptionsRes, userOptionsRes);
115
+ const plugins = [...globalOptionsRes.plugins];
116
+ if (userOptionsRes.plugins) userOptionsRes.plugins.forEach((plugin) => {
117
+ if (!plugins.includes(plugin)) plugins.push(plugin);
118
+ });
119
+ const optionsRes = {
120
+ ...globalOptions,
121
+ ...userOptions,
122
+ plugins,
123
+ remotes,
124
+ shared: allShareInfos
125
+ };
126
+ this.hooks.lifecycle.init.emit({
127
+ origin: this,
128
+ options: optionsRes
129
+ });
130
+ return optionsRes;
131
+ }
132
+ registerPlugins(plugins) {
133
+ const pluginRes = registerPlugins(plugins, this);
134
+ this.options.plugins = this.options.plugins.reduce((res, plugin) => {
135
+ if (!plugin) return res;
136
+ if (res && !res.find((item) => item.name === plugin.name)) res.push(plugin);
137
+ return res;
138
+ }, pluginRes || []);
139
+ }
140
+ registerRemotes(remotes, options) {
141
+ return this.remoteHandler.registerRemotes(remotes, options);
142
+ }
143
+ registerShared(shared) {
144
+ this.sharedHandler.registerShared(this.options, {
145
+ ...this.options,
146
+ shared
147
+ });
148
+ }
149
+ };
150
+
151
+ //#endregion
152
+ export { ModuleFederation };
153
+ //# sourceMappingURL=core.js.map
@@ -0,0 +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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"}