@module-federation/runtime-core 2.0.1 → 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 (209) 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 +129 -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 +45 -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 +30 -0
  20. package/dist/helpers.js +44 -0
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/index.cjs +60 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +29 -1
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/module/index.cjs +129 -0
  28. package/dist/module/index.cjs.map +1 -0
  29. package/dist/module/index.d.ts +31 -0
  30. package/dist/module/index.js +129 -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 +190 -0
  37. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
  38. package/dist/plugins/snapshot/SnapshotHandler.d.ts +66 -0
  39. package/dist/plugins/snapshot/SnapshotHandler.js +189 -0
  40. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
  41. package/dist/plugins/snapshot/index.cjs +63 -0
  42. package/dist/plugins/snapshot/index.cjs.map +1 -0
  43. package/dist/plugins/snapshot/index.js +62 -0
  44. package/dist/plugins/snapshot/index.js.map +1 -0
  45. package/dist/remote/index.cjs +304 -0
  46. package/dist/remote/index.cjs.map +1 -0
  47. package/dist/remote/index.d.ts +119 -0
  48. package/dist/remote/index.js +304 -0
  49. package/dist/remote/index.js.map +1 -0
  50. package/dist/shared/index.cjs +303 -0
  51. package/dist/shared/index.cjs.map +1 -0
  52. package/dist/shared/index.d.ts +82 -0
  53. package/dist/shared/index.js +303 -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 +4 -1
  65. package/dist/types.js +1 -0
  66. package/dist/utils/context.cjs +45 -0
  67. package/dist/utils/context.cjs.map +1 -0
  68. package/dist/utils/context.d.ts +1 -0
  69. package/dist/utils/context.js +44 -0
  70. package/dist/utils/context.js.map +1 -0
  71. package/dist/utils/env.cjs +10 -0
  72. package/dist/utils/env.cjs.map +1 -0
  73. package/dist/utils/env.d.ts +1 -0
  74. package/dist/utils/env.js +10 -0
  75. package/dist/utils/env.js.map +1 -0
  76. package/dist/utils/hooks/asyncHook.cjs +23 -0
  77. package/dist/utils/hooks/asyncHook.cjs.map +1 -0
  78. package/dist/utils/hooks/asyncHook.d.ts +10 -0
  79. package/dist/utils/hooks/asyncHook.js +23 -0
  80. package/dist/utils/hooks/asyncHook.js.map +1 -0
  81. package/dist/utils/hooks/asyncWaterfallHooks.cjs +42 -0
  82. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
  83. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
  84. package/dist/utils/hooks/asyncWaterfallHooks.js +42 -0
  85. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
  86. package/dist/utils/hooks/index.cjs +5 -0
  87. package/dist/utils/hooks/index.d.ts +5 -0
  88. package/dist/utils/hooks/index.js +7 -0
  89. package/dist/utils/hooks/pluginSystem.cjs +37 -0
  90. package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
  91. package/dist/utils/hooks/pluginSystem.d.ts +19 -0
  92. package/dist/utils/hooks/pluginSystem.js +37 -0
  93. package/dist/utils/hooks/pluginSystem.js.map +1 -0
  94. package/dist/utils/hooks/syncHook.cjs +36 -0
  95. package/dist/utils/hooks/syncHook.cjs.map +1 -0
  96. package/dist/utils/hooks/syncHook.d.ts +16 -0
  97. package/dist/utils/hooks/syncHook.js +35 -0
  98. package/dist/utils/hooks/syncHook.js.map +1 -0
  99. package/dist/utils/hooks/syncWaterfallHook.cjs +39 -0
  100. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
  101. package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
  102. package/dist/utils/hooks/syncWaterfallHook.js +38 -0
  103. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
  104. package/dist/utils/index.cjs +8 -0
  105. package/dist/utils/index.d.ts +4 -0
  106. package/dist/utils/index.js +9 -0
  107. package/dist/utils/load.cjs +179 -0
  108. package/dist/utils/load.cjs.map +1 -0
  109. package/dist/utils/load.d.ts +14 -0
  110. package/dist/utils/load.js +177 -0
  111. package/dist/utils/load.js.map +1 -0
  112. package/dist/utils/logger.cjs +34 -0
  113. package/dist/utils/logger.cjs.map +1 -0
  114. package/dist/utils/logger.d.ts +10 -0
  115. package/dist/utils/logger.js +31 -0
  116. package/dist/utils/logger.js.map +1 -0
  117. package/dist/utils/manifest.cjs +51 -0
  118. package/dist/utils/manifest.cjs.map +1 -0
  119. package/dist/utils/manifest.d.ts +10 -0
  120. package/dist/utils/manifest.js +49 -0
  121. package/dist/utils/manifest.js.map +1 -0
  122. package/dist/utils/plugin.cjs +27 -0
  123. package/dist/utils/plugin.cjs.map +1 -0
  124. package/dist/utils/plugin.d.ts +1 -0
  125. package/dist/utils/plugin.js +27 -0
  126. package/dist/utils/plugin.js.map +1 -0
  127. package/dist/utils/preload.cjs +146 -0
  128. package/dist/utils/preload.cjs.map +1 -0
  129. package/dist/utils/preload.d.ts +8 -0
  130. package/dist/utils/preload.js +143 -0
  131. package/dist/utils/preload.js.map +1 -0
  132. package/dist/utils/semver/compare.cjs +48 -0
  133. package/dist/utils/semver/compare.cjs.map +1 -0
  134. package/dist/utils/semver/compare.js +47 -0
  135. package/dist/utils/semver/compare.js.map +1 -0
  136. package/dist/utils/semver/constants.cjs +41 -0
  137. package/dist/utils/semver/constants.cjs.map +1 -0
  138. package/dist/utils/semver/constants.js +31 -0
  139. package/dist/utils/semver/constants.js.map +1 -0
  140. package/dist/utils/semver/index.cjs +68 -0
  141. package/dist/utils/semver/index.cjs.map +1 -0
  142. package/dist/utils/semver/index.d.ts +5 -0
  143. package/dist/utils/semver/index.js +68 -0
  144. package/dist/utils/semver/index.js.map +1 -0
  145. package/dist/utils/semver/parser.cjs +104 -0
  146. package/dist/utils/semver/parser.cjs.map +1 -0
  147. package/dist/utils/semver/parser.js +96 -0
  148. package/dist/utils/semver/parser.js.map +1 -0
  149. package/dist/utils/semver/utils.cjs +28 -0
  150. package/dist/utils/semver/utils.cjs.map +1 -0
  151. package/dist/utils/semver/utils.js +24 -0
  152. package/dist/utils/semver/utils.js.map +1 -0
  153. package/dist/utils/share.cjs +284 -0
  154. package/dist/utils/share.cjs.map +1 -0
  155. package/dist/utils/share.d.ts +23 -0
  156. package/dist/utils/share.js +278 -0
  157. package/dist/utils/share.js.map +1 -0
  158. package/dist/utils/tool.cjs +82 -0
  159. package/dist/utils/tool.cjs.map +1 -0
  160. package/dist/utils/tool.d.ts +8 -0
  161. package/dist/utils/tool.js +71 -0
  162. package/dist/utils/tool.js.map +1 -0
  163. package/package.json +16 -9
  164. package/dist/index.cjs.cjs +0 -3442
  165. package/dist/index.cjs.cjs.map +0 -1
  166. package/dist/index.cjs.d.ts +0 -1
  167. package/dist/index.esm.js +0 -3418
  168. package/dist/index.esm.js.map +0 -1
  169. package/dist/src/constant.d.ts +0 -2
  170. package/dist/src/core.d.ts +0 -119
  171. package/dist/src/global.d.ts +0 -42
  172. package/dist/src/helpers.d.ts +0 -38
  173. package/dist/src/index.d.ts +0 -14
  174. package/dist/src/module/index.d.ts +0 -25
  175. package/dist/src/plugins/generate-preload-assets.d.ts +0 -8
  176. package/dist/src/plugins/snapshot/SnapshotHandler.d.ts +0 -60
  177. package/dist/src/plugins/snapshot/index.d.ts +0 -5
  178. package/dist/src/remote/index.d.ts +0 -109
  179. package/dist/src/shared/index.d.ts +0 -75
  180. package/dist/src/type/config.d.ts +0 -128
  181. package/dist/src/type/index.d.ts +0 -3
  182. package/dist/src/type/plugin.d.ts +0 -35
  183. package/dist/src/type/preload.d.ts +0 -26
  184. package/dist/src/types.d.ts +0 -1
  185. package/dist/src/utils/env.d.ts +0 -3
  186. package/dist/src/utils/hooks/asyncHook.d.ts +0 -6
  187. package/dist/src/utils/hooks/asyncWaterfallHooks.d.ts +0 -10
  188. package/dist/src/utils/hooks/index.d.ts +0 -6
  189. package/dist/src/utils/hooks/pluginSystem.d.ts +0 -16
  190. package/dist/src/utils/hooks/syncHook.d.ts +0 -12
  191. package/dist/src/utils/hooks/syncWaterfallHook.d.ts +0 -9
  192. package/dist/src/utils/index.d.ts +0 -6
  193. package/dist/src/utils/load.d.ts +0 -11
  194. package/dist/src/utils/logger.d.ts +0 -6
  195. package/dist/src/utils/manifest.d.ts +0 -7
  196. package/dist/src/utils/plugin.d.ts +0 -3
  197. package/dist/src/utils/preload.d.ts +0 -6
  198. package/dist/src/utils/semver/compare.d.ts +0 -9
  199. package/dist/src/utils/semver/constants.d.ts +0 -10
  200. package/dist/src/utils/semver/index.d.ts +0 -2
  201. package/dist/src/utils/semver/parser.d.ts +0 -9
  202. package/dist/src/utils/semver/utils.d.ts +0 -11
  203. package/dist/src/utils/share.d.ts +0 -45
  204. package/dist/src/utils/tool.d.ts +0 -18
  205. package/dist/types.cjs.cjs +0 -3
  206. package/dist/types.cjs.cjs.map +0 -1
  207. package/dist/types.cjs.d.ts +0 -1
  208. package/dist/types.esm.js +0 -2
  209. package/dist/types.esm.js.map +0 -1
@@ -0,0 +1,303 @@
1
+ import { assert, error } from "../utils/logger.js";
2
+ import { DEFAULT_SCOPE } from "../constant.js";
3
+ import { addUseIn, directShare, formatShareConfigs, getGlobalShareScope, getRegisteredShare, getTargetSharedOptions, shouldUseTreeShaking } from "../utils/share.js";
4
+ import { optionsToMFContext } from "../utils/context.js";
5
+ import "../utils/index.js";
6
+ import { AsyncHook } from "../utils/hooks/asyncHook.js";
7
+ import { SyncWaterfallHook } from "../utils/hooks/syncWaterfallHook.js";
8
+ import { AsyncWaterfallHook } from "../utils/hooks/asyncWaterfallHooks.js";
9
+ import { PluginSystem } from "../utils/hooks/pluginSystem.js";
10
+ import "../utils/hooks/index.js";
11
+ import { RUNTIME_005, RUNTIME_006, runtimeDescMap } from "@module-federation/error-codes";
12
+
13
+ //#region src/shared/index.ts
14
+ var SharedHandler = class {
15
+ constructor(host) {
16
+ this.hooks = new PluginSystem({
17
+ beforeRegisterShare: new SyncWaterfallHook("beforeRegisterShare"),
18
+ afterResolve: new AsyncWaterfallHook("afterResolve"),
19
+ beforeLoadShare: new AsyncWaterfallHook("beforeLoadShare"),
20
+ loadShare: new AsyncHook(),
21
+ resolveShare: new SyncWaterfallHook("resolveShare"),
22
+ initContainerShareScopeMap: new SyncWaterfallHook("initContainerShareScopeMap")
23
+ });
24
+ this.host = host;
25
+ this.shareScopeMap = {};
26
+ this.initTokens = {};
27
+ this._setGlobalShareScopeMap(host.options);
28
+ }
29
+ registerShared(globalOptions, userOptions) {
30
+ const { newShareInfos, allShareInfos } = formatShareConfigs(globalOptions, userOptions);
31
+ Object.keys(newShareInfos).forEach((sharedKey) => {
32
+ newShareInfos[sharedKey].forEach((sharedVal) => {
33
+ sharedVal.scope.forEach((sc) => {
34
+ this.hooks.lifecycle.beforeRegisterShare.emit({
35
+ origin: this.host,
36
+ pkgName: sharedKey,
37
+ shared: sharedVal
38
+ });
39
+ if (!this.shareScopeMap[sc]?.[sharedKey]) this.setShared({
40
+ pkgName: sharedKey,
41
+ lib: sharedVal.lib,
42
+ get: sharedVal.get,
43
+ loaded: sharedVal.loaded || Boolean(sharedVal.lib),
44
+ shared: sharedVal,
45
+ from: userOptions.name
46
+ });
47
+ });
48
+ });
49
+ });
50
+ return {
51
+ newShareInfos,
52
+ allShareInfos
53
+ };
54
+ }
55
+ async loadShare(pkgName, extraOptions) {
56
+ const { host } = this;
57
+ const shareOptions = getTargetSharedOptions({
58
+ pkgName,
59
+ extraOptions,
60
+ shareInfos: host.options.shared
61
+ });
62
+ if (shareOptions?.scope) await Promise.all(shareOptions.scope.map(async (shareScope) => {
63
+ await Promise.all(this.initializeSharing(shareScope, { strategy: shareOptions.strategy }));
64
+ }));
65
+ const { shareInfo: shareOptionsRes } = await this.hooks.lifecycle.beforeLoadShare.emit({
66
+ pkgName,
67
+ shareInfo: shareOptions,
68
+ shared: host.options.shared,
69
+ origin: host
70
+ });
71
+ assert(shareOptionsRes, `Cannot find shared "${pkgName}" in host "${host.options.name}". Ensure the shared config for "${pkgName}" is declared in the federation plugin options and the host has been initialized before loading shares.`);
72
+ const { shared: registeredShared, useTreesShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
73
+ if (registeredShared) {
74
+ const targetShared = directShare(registeredShared, useTreesShaking);
75
+ if (targetShared.lib) {
76
+ addUseIn(targetShared, host.options.name);
77
+ return targetShared.lib;
78
+ } else if (targetShared.loading && !targetShared.loaded) {
79
+ const factory = await targetShared.loading;
80
+ targetShared.loaded = true;
81
+ if (!targetShared.lib) targetShared.lib = factory;
82
+ addUseIn(targetShared, host.options.name);
83
+ return factory;
84
+ } else {
85
+ const asyncLoadProcess = async () => {
86
+ const factory = await targetShared.get();
87
+ addUseIn(targetShared, host.options.name);
88
+ targetShared.loaded = true;
89
+ targetShared.lib = factory;
90
+ return factory;
91
+ };
92
+ const loading = asyncLoadProcess();
93
+ this.setShared({
94
+ pkgName,
95
+ loaded: false,
96
+ shared: registeredShared,
97
+ from: host.options.name,
98
+ lib: null,
99
+ loading,
100
+ treeShaking: useTreesShaking ? targetShared : void 0
101
+ });
102
+ return loading;
103
+ }
104
+ } else {
105
+ if (extraOptions?.customShareInfo) return false;
106
+ const _useTreeShaking = shouldUseTreeShaking(shareOptionsRes.treeShaking);
107
+ const targetShared = directShare(shareOptionsRes, _useTreeShaking);
108
+ const asyncLoadProcess = async () => {
109
+ const factory = await targetShared.get();
110
+ targetShared.lib = factory;
111
+ targetShared.loaded = true;
112
+ addUseIn(targetShared, host.options.name);
113
+ const { shared: gShared, useTreesShaking: gUseTreeShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
114
+ if (gShared) {
115
+ const targetGShared = directShare(gShared, gUseTreeShaking);
116
+ targetGShared.lib = factory;
117
+ targetGShared.loaded = true;
118
+ gShared.from = shareOptionsRes.from;
119
+ }
120
+ return factory;
121
+ };
122
+ const loading = asyncLoadProcess();
123
+ this.setShared({
124
+ pkgName,
125
+ loaded: false,
126
+ shared: shareOptionsRes,
127
+ from: host.options.name,
128
+ lib: null,
129
+ loading,
130
+ treeShaking: _useTreeShaking ? targetShared : void 0
131
+ });
132
+ return loading;
133
+ }
134
+ }
135
+ /**
136
+ * This function initializes the sharing sequence (executed only once per share scope).
137
+ * It accepts one argument, the name of the share scope.
138
+ * If the share scope does not exist, it creates one.
139
+ */
140
+ initializeSharing(shareScopeName = DEFAULT_SCOPE, extraOptions) {
141
+ const { host } = this;
142
+ const from = extraOptions?.from;
143
+ const strategy = extraOptions?.strategy;
144
+ let initScope = extraOptions?.initScope;
145
+ const promises = [];
146
+ if (from !== "build") {
147
+ const { initTokens } = this;
148
+ if (!initScope) initScope = [];
149
+ let initToken = initTokens[shareScopeName];
150
+ if (!initToken) initToken = initTokens[shareScopeName] = { from: this.host.name };
151
+ if (initScope.indexOf(initToken) >= 0) return promises;
152
+ initScope.push(initToken);
153
+ }
154
+ const shareScope = this.shareScopeMap;
155
+ const hostName = host.options.name;
156
+ if (!shareScope[shareScopeName]) shareScope[shareScopeName] = {};
157
+ const scope = shareScope[shareScopeName];
158
+ const register = (name, shared) => {
159
+ const { version, eager } = shared;
160
+ scope[name] = scope[name] || {};
161
+ const versions = scope[name];
162
+ const activeVersion = versions[version] && directShare(versions[version]);
163
+ const activeVersionEager = Boolean(activeVersion && ("eager" in activeVersion && activeVersion.eager || "shareConfig" in activeVersion && activeVersion.shareConfig?.eager));
164
+ if (!activeVersion || activeVersion.strategy !== "loaded-first" && !activeVersion.loaded && (Boolean(!eager) !== !activeVersionEager ? eager : hostName > versions[version].from)) versions[version] = shared;
165
+ };
166
+ const initRemoteModule = async (key) => {
167
+ const { module } = await host.remoteHandler.getRemoteModuleAndOptions({ id: key });
168
+ let remoteEntryExports = void 0;
169
+ try {
170
+ remoteEntryExports = await module.getEntry();
171
+ } catch (error) {
172
+ remoteEntryExports = await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
173
+ id: key,
174
+ error,
175
+ from: "runtime",
176
+ lifecycle: "beforeLoadShare",
177
+ origin: host
178
+ });
179
+ if (!remoteEntryExports) return;
180
+ } finally {
181
+ if (remoteEntryExports?.init && !module.initing) {
182
+ module.remoteEntryExports = remoteEntryExports;
183
+ await module.init(void 0, void 0, initScope);
184
+ }
185
+ }
186
+ };
187
+ Object.keys(host.options.shared).forEach((shareName) => {
188
+ host.options.shared[shareName].forEach((shared) => {
189
+ if (shared.scope.includes(shareScopeName)) register(shareName, shared);
190
+ });
191
+ });
192
+ if (host.options.shareStrategy === "version-first" || strategy === "version-first") host.options.remotes.forEach((remote) => {
193
+ if (remote.shareScope === shareScopeName) promises.push(initRemoteModule(remote.name));
194
+ });
195
+ return promises;
196
+ }
197
+ loadShareSync(pkgName, extraOptions) {
198
+ const { host } = this;
199
+ const shareOptions = getTargetSharedOptions({
200
+ pkgName,
201
+ extraOptions,
202
+ shareInfos: host.options.shared
203
+ });
204
+ if (shareOptions?.scope) shareOptions.scope.forEach((shareScope) => {
205
+ this.initializeSharing(shareScope, { strategy: shareOptions.strategy });
206
+ });
207
+ const { shared: registeredShared, useTreesShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare) || {};
208
+ if (registeredShared) {
209
+ if (typeof registeredShared.lib === "function") {
210
+ addUseIn(registeredShared, host.options.name);
211
+ if (!registeredShared.loaded) {
212
+ registeredShared.loaded = true;
213
+ if (registeredShared.from === host.options.name) shareOptions.loaded = true;
214
+ }
215
+ return registeredShared.lib;
216
+ }
217
+ if (typeof registeredShared.get === "function") {
218
+ const module = registeredShared.get();
219
+ if (!(module instanceof Promise)) {
220
+ addUseIn(registeredShared, host.options.name);
221
+ this.setShared({
222
+ pkgName,
223
+ loaded: true,
224
+ from: host.options.name,
225
+ lib: module,
226
+ shared: registeredShared
227
+ });
228
+ return module;
229
+ }
230
+ }
231
+ }
232
+ if (shareOptions.lib) {
233
+ if (!shareOptions.loaded) shareOptions.loaded = true;
234
+ return shareOptions.lib;
235
+ }
236
+ if (shareOptions.get) {
237
+ const module = shareOptions.get();
238
+ if (module instanceof Promise) error(extraOptions?.from === "build" ? RUNTIME_005 : RUNTIME_006, runtimeDescMap, {
239
+ hostName: host.options.name,
240
+ sharedPkgName: pkgName
241
+ }, void 0, optionsToMFContext(host.options));
242
+ shareOptions.lib = module;
243
+ this.setShared({
244
+ pkgName,
245
+ loaded: true,
246
+ from: host.options.name,
247
+ lib: shareOptions.lib,
248
+ shared: shareOptions
249
+ });
250
+ return shareOptions.lib;
251
+ }
252
+ error(RUNTIME_006, runtimeDescMap, {
253
+ hostName: host.options.name,
254
+ sharedPkgName: pkgName
255
+ }, void 0, optionsToMFContext(host.options));
256
+ }
257
+ initShareScopeMap(scopeName, shareScope, extraOptions = {}) {
258
+ const { host } = this;
259
+ this.shareScopeMap[scopeName] = shareScope;
260
+ this.hooks.lifecycle.initContainerShareScopeMap.emit({
261
+ shareScope,
262
+ options: host.options,
263
+ origin: host,
264
+ scopeName,
265
+ hostShareScopeMap: extraOptions.hostShareScopeMap
266
+ });
267
+ }
268
+ setShared({ pkgName, shared, from, lib, loading, loaded, get, treeShaking }) {
269
+ const { version, scope = "default", ...shareInfo } = shared;
270
+ const scopes = Array.isArray(scope) ? scope : [scope];
271
+ const mergeAttrs = (shared) => {
272
+ const merge = (s, key, val) => {
273
+ if (val && !s[key]) s[key] = val;
274
+ };
275
+ const targetShared = treeShaking ? shared.treeShaking : shared;
276
+ merge(targetShared, "loaded", loaded);
277
+ merge(targetShared, "loading", loading);
278
+ merge(targetShared, "get", get);
279
+ };
280
+ scopes.forEach((sc) => {
281
+ if (!this.shareScopeMap[sc]) this.shareScopeMap[sc] = {};
282
+ if (!this.shareScopeMap[sc][pkgName]) this.shareScopeMap[sc][pkgName] = {};
283
+ if (!this.shareScopeMap[sc][pkgName][version]) this.shareScopeMap[sc][pkgName][version] = {
284
+ version,
285
+ scope: [sc],
286
+ ...shareInfo,
287
+ lib
288
+ };
289
+ const registeredShared = this.shareScopeMap[sc][pkgName][version];
290
+ mergeAttrs(registeredShared);
291
+ if (from && registeredShared.from !== from) registeredShared.from = from;
292
+ });
293
+ }
294
+ _setGlobalShareScopeMap(hostOptions) {
295
+ const globalShareScopeMap = getGlobalShareScope();
296
+ const identifier = hostOptions.id || hostOptions.name;
297
+ if (identifier && !globalShareScopeMap[identifier]) globalShareScopeMap[identifier] = this.shareScopeMap;
298
+ }
299
+ };
300
+
301
+ //#endregion
302
+ export { SharedHandler };
303
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n RUNTIME_005,\n RUNTIME_006,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n Options,\n ShareScopeMap,\n ShareInfos,\n Shared,\n RemoteEntryExports,\n UserOptions,\n ShareStrategy,\n InitScope,\n InitTokens,\n CallFrom,\n TreeShakingArgs,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport { assert, error, addUniqueItem, optionsToMFContext } from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport { LoadRemoteMatch } from '../remote';\nimport { createRemoteEntryInitOptions } from '../module';\n\nexport class SharedHandler {\n host: ModuleFederation;\n shareScopeMap: ShareScopeMap;\n hooks = new PluginSystem({\n beforeRegisterShare: new SyncWaterfallHook<{\n pkgName: string;\n shared: Shared;\n origin: ModuleFederation;\n }>('beforeRegisterShare'),\n afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n beforeLoadShare: new AsyncWaterfallHook<{\n pkgName: string;\n shareInfo?: Shared;\n shared: Options['shared'];\n origin: ModuleFederation;\n }>('beforeLoadShare'),\n // not used yet\n loadShare: new AsyncHook<[ModuleFederation, string, ShareInfos]>(),\n resolveShare: new SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n }>('resolveShare'),\n // maybe will change, temporarily for internal use only\n initContainerShareScopeMap: new SyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n options: Options;\n origin: ModuleFederation;\n scopeName: string;\n hostShareScopeMap?: ShareScopeMap;\n }>('initContainerShareScopeMap'),\n });\n initTokens: InitTokens;\n constructor(host: ModuleFederation) {\n this.host = host;\n this.shareScopeMap = {};\n this.initTokens = {};\n this._setGlobalShareScopeMap(host.options);\n }\n\n // register shared in shareScopeMap\n registerShared(globalOptions: Options, userOptions: UserOptions) {\n const { newShareInfos, allShareInfos } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n\n const sharedKeys = Object.keys(newShareInfos);\n sharedKeys.forEach((sharedKey) => {\n const sharedVals = newShareInfos[sharedKey];\n sharedVals.forEach((sharedVal) => {\n sharedVal.scope.forEach((sc) => {\n this.hooks.lifecycle.beforeRegisterShare.emit({\n origin: this.host,\n pkgName: sharedKey,\n shared: sharedVal,\n });\n const registeredShared = this.shareScopeMap[sc]?.[sharedKey];\n if (!registeredShared) {\n this.setShared({\n pkgName: sharedKey,\n lib: sharedVal.lib,\n get: sharedVal.get,\n loaded: sharedVal.loaded || Boolean(sharedVal.lib),\n shared: sharedVal,\n from: userOptions.name,\n });\n }\n });\n });\n });\n\n return {\n newShareInfos,\n allShareInfos,\n };\n }\n\n async loadShare<T>(\n pkgName: string,\n extraOptions?: {\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): Promise<false | (() => T | undefined)> {\n const { host } = this;\n // This function performs the following steps:\n // 1. Checks if the currently loaded share already exists, if not, it throws an error\n // 2. Searches globally for a matching share, if found, it uses it directly\n // 3. If not found, it retrieves it from the current share and stores the obtained share globally.\n\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n\n if (shareOptions?.scope) {\n await Promise.all(\n shareOptions.scope.map(async (shareScope) => {\n await Promise.all(\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n }),\n );\n return;\n }),\n );\n }\n const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({\n pkgName,\n shareInfo: shareOptions,\n shared: host.options.shared,\n origin: host,\n });\n\n const { shareInfo: shareOptionsRes } = loadShareRes;\n\n // Assert that shareInfoRes exists, if not, throw an error\n assert(\n shareOptionsRes,\n `Cannot find shared \"${pkgName}\" in host \"${host.options.name}\". Ensure the shared config for \"${pkgName}\" is declared in the federation plugin options and the host has been initialized before loading shares.`,\n );\n\n const { shared: registeredShared, useTreesShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptionsRes,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n const targetShared = directShare(registeredShared, useTreesShaking);\n if (targetShared.lib) {\n addUseIn(targetShared, host.options.name);\n return targetShared.lib as () => T;\n } else if (targetShared.loading && !targetShared.loaded) {\n const factory = await targetShared.loading;\n targetShared.loaded = true;\n if (!targetShared.lib) {\n targetShared.lib = factory;\n }\n addUseIn(targetShared, host.options.name);\n return factory;\n } else {\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n addUseIn(targetShared, host.options.name);\n targetShared.loaded = true;\n targetShared.lib = factory;\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: registeredShared,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: useTreesShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n return loading;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(shareOptionsRes.treeShaking);\n const targetShared = directShare(shareOptionsRes, _useTreeShaking);\n\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n targetShared.lib = factory;\n targetShared.loaded = true;\n addUseIn(targetShared, host.options.name);\n const { shared: gShared, useTreesShaking: gUseTreeShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptionsRes,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n if (gShared) {\n const targetGShared = directShare(gShared, gUseTreeShaking);\n targetGShared.lib = factory;\n targetGShared.loaded = true;\n gShared.from = shareOptionsRes.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: shareOptionsRes,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n return loading;\n }\n }\n\n /**\n * This function initializes the sharing sequence (executed only once per share scope).\n * It accepts one argument, the name of the share scope.\n * If the share scope does not exist, it creates one.\n */\n // eslint-disable-next-line @typescript-eslint/member-ordering\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: ShareStrategy;\n },\n ): Array<Promise<void>> {\n const { host } = this;\n const from = extraOptions?.from;\n const strategy = extraOptions?.strategy;\n let initScope = extraOptions?.initScope;\n const promises: Promise<any>[] = [];\n if (from !== 'build') {\n const { initTokens } = this;\n if (!initScope) initScope = [];\n let initToken = initTokens[shareScopeName];\n if (!initToken)\n initToken = initTokens[shareScopeName] = { from: this.host.name };\n if (initScope.indexOf(initToken) >= 0) return promises;\n initScope.push(initToken);\n }\n\n const shareScope = this.shareScopeMap;\n const hostName = host.options.name;\n // Creates a new share scope if necessary\n if (!shareScope[shareScopeName]) {\n shareScope[shareScopeName] = {};\n }\n // Executes all initialization snippets from all accessible modules\n const scope = shareScope[shareScopeName];\n const register = (name: string, shared: Shared) => {\n const { version, eager } = shared;\n scope[name] = scope[name] || {};\n const versions = scope[name];\n const activeVersion: Shared =\n versions[version] && (directShare(versions[version]) as Shared);\n const activeVersionEager = Boolean(\n activeVersion &&\n (('eager' in activeVersion && activeVersion.eager) ||\n ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n );\n if (\n !activeVersion ||\n (activeVersion.strategy !== 'loaded-first' &&\n !activeVersion.loaded &&\n (Boolean(!eager) !== !activeVersionEager\n ? eager\n : hostName > versions[version].from))\n ) {\n versions[version] = shared;\n }\n };\n\n const initRemoteModule = async (key: string): Promise<void> => {\n const { module } = await host.remoteHandler.getRemoteModuleAndOptions({\n id: key,\n });\n let remoteEntryExports: RemoteEntryExports | undefined = undefined;\n try {\n remoteEntryExports = await module.getEntry();\n } catch (error) {\n remoteEntryExports =\n (await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({\n id: key,\n error,\n from: 'runtime',\n lifecycle: 'beforeLoadShare',\n origin: host,\n })) as RemoteEntryExports;\n if (!remoteEntryExports) {\n return;\n }\n } finally {\n // prevent self load loop: when host load self , the initTokens is not the same\n if (remoteEntryExports?.init && !module.initing) {\n module.remoteEntryExports = remoteEntryExports;\n await module.init(undefined, undefined, initScope);\n }\n }\n };\n Object.keys(host.options.shared).forEach((shareName) => {\n const sharedArr = host.options.shared[shareName];\n sharedArr.forEach((shared) => {\n if (shared.scope.includes(shareScopeName)) {\n register(shareName, shared);\n }\n });\n });\n // TODO: strategy==='version-first' need to be removed in the future\n if (\n host.options.shareStrategy === 'version-first' ||\n strategy === 'version-first'\n ) {\n host.options.remotes.forEach((remote) => {\n if (remote.shareScope === shareScopeName) {\n promises.push(initRemoteModule(remote.name));\n }\n });\n }\n\n return promises;\n }\n\n // The lib function will only be available if the shared set by eager or runtime init is set or the shared is successfully loaded.\n // 1. If the loaded shared already exists globally, then it will be reused\n // 2. If lib exists in local shared, it will be used directly\n // 3. If the local get returns something other than Promise, then it will be used directly\n loadShareSync<T>(\n pkgName: string,\n extraOptions?: {\n from?: 'build' | 'runtime';\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n const { host } = this;\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n\n if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, { strategy: shareOptions.strategy });\n });\n }\n const { shared: registeredShared, useTreesShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptions,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n if (typeof registeredShared.lib === 'function') {\n addUseIn(registeredShared, host.options.name);\n if (!registeredShared.loaded) {\n registeredShared.loaded = true;\n if (registeredShared.from === host.options.name) {\n shareOptions.loaded = true;\n }\n }\n return registeredShared.lib as () => T;\n }\n if (typeof registeredShared.get === 'function') {\n const module = registeredShared.get();\n if (!(module instanceof Promise)) {\n addUseIn(registeredShared, host.options.name);\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: module,\n shared: registeredShared,\n });\n return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\n }\n return shareOptions.lib as () => T;\n }\n\n if (shareOptions.get) {\n const module = shareOptions.get();\n\n if (module instanceof Promise) {\n const errorCode =\n extraOptions?.from === 'build' ? RUNTIME_005 : RUNTIME_006;\n error(\n errorCode,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n shareOptions.lib = module;\n\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: shareOptions.lib,\n shared: shareOptions,\n });\n return shareOptions.lib as () => T;\n }\n\n error(\n RUNTIME_006,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n const { host } = this;\n this.shareScopeMap[scopeName] = shareScope;\n this.hooks.lifecycle.initContainerShareScopeMap.emit({\n shareScope,\n options: host.options,\n origin: host,\n scopeName,\n hostShareScopeMap: extraOptions.hostShareScopeMap,\n });\n }\n\n private setShared({\n pkgName,\n shared,\n from,\n lib,\n loading,\n loaded,\n get,\n treeShaking,\n }: {\n pkgName: string;\n shared: Shared;\n from: string;\n lib: any;\n loaded?: boolean;\n loading?: Shared['loading'];\n get?: Shared['get'];\n treeShaking?: TreeShakingArgs;\n }): void {\n const { version, scope = 'default', ...shareInfo } = shared;\n const scopes: string[] = Array.isArray(scope) ? scope : [scope];\n\n const mergeAttrs = (shared: Shared) => {\n const merge = <K extends keyof TreeShakingArgs>(\n s: TreeShakingArgs,\n key: K,\n val: TreeShakingArgs[K],\n ): void => {\n if (val && !s[key]) {\n s[key] = val;\n }\n };\n const targetShared = (\n treeShaking ? shared.treeShaking! : shared\n ) as TreeShakingArgs;\n merge(targetShared, 'loaded', loaded);\n merge(targetShared, 'loading', loading);\n merge(targetShared, 'get', get);\n };\n scopes.forEach((sc) => {\n if (!this.shareScopeMap[sc]) {\n this.shareScopeMap[sc] = {};\n }\n if (!this.shareScopeMap[sc][pkgName]) {\n this.shareScopeMap[sc][pkgName] = {};\n }\n\n if (!this.shareScopeMap[sc][pkgName][version]) {\n this.shareScopeMap[sc][pkgName][version] = {\n version,\n scope: [sc],\n ...shareInfo,\n lib,\n };\n }\n\n const registeredShared = this.shareScopeMap[sc][pkgName][version];\n mergeAttrs(registeredShared);\n if (from && registeredShared.from !== from) {\n registeredShared.from = from;\n }\n });\n }\n\n private _setGlobalShareScopeMap(hostOptions: Options): void {\n const globalShareScopeMap = getGlobalShareScope();\n const identifier = hostOptions.id || hostOptions.name;\n if (identifier && !globalShareScopeMap[identifier]) {\n globalShareScopeMap[identifier] = this.shareScopeMap;\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import { ModuleFederationRuntimePlugin } from "./plugin.js";
2
+ import { Module, RemoteEntryType, RemoteWithEntry, RemoteWithVersion, TreeShakingStatus } from "@module-federation/sdk";
3
+
4
+ //#region src/type/config.d.ts
5
+ type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
6
+ type PartialOptional<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: T[P] };
7
+ interface RemoteInfoCommon {
8
+ alias?: string;
9
+ shareScope?: string | string[];
10
+ type?: RemoteEntryType;
11
+ entryGlobalName?: string;
12
+ }
13
+ type RemoteInfoOptionalVersion = {
14
+ name: string;
15
+ version?: string;
16
+ } & RemoteInfoCommon;
17
+ type Remote = (RemoteWithEntry | RemoteWithVersion) & RemoteInfoCommon;
18
+ type LoadShareExtraOptions = {
19
+ customShareInfo?: Partial<Shared>;
20
+ resolver?: (sharedOptions: ShareInfos[string]) => Shared;
21
+ };
22
+ interface RemoteInfo {
23
+ alias?: string;
24
+ name: string;
25
+ version?: string;
26
+ buildVersion?: string;
27
+ entry: string;
28
+ type: RemoteEntryType;
29
+ entryGlobalName: string;
30
+ shareScope: string | string[];
31
+ }
32
+ type HostInfo = Pick<Options, 'name' | 'version' | 'remotes' | 'version'>;
33
+ interface SharedConfig {
34
+ singleton?: boolean;
35
+ requiredVersion: false | string;
36
+ eager?: boolean;
37
+ strictVersion?: boolean;
38
+ layer?: string | null;
39
+ }
40
+ type TreeShakingArgs = {
41
+ usedExports?: string[];
42
+ get?: SharedGetter;
43
+ lib?: () => Module;
44
+ status?: TreeShakingStatus;
45
+ mode?: 'server-calc' | 'runtime-infer';
46
+ loading?: null | Promise<any>;
47
+ loaded?: boolean;
48
+ useIn?: Array<string>;
49
+ };
50
+ type SharedBaseArgs = {
51
+ version?: string;
52
+ shareConfig?: SharedConfig;
53
+ scope?: string | Array<string>;
54
+ deps?: Array<string>;
55
+ strategy?: 'version-first' | 'loaded-first';
56
+ loaded?: boolean;
57
+ treeShaking?: TreeShakingArgs;
58
+ };
59
+ type SharedGetter = (() => () => Module) | (() => Promise<() => Module>);
60
+ type ShareArgs = (SharedBaseArgs & {
61
+ get: SharedGetter;
62
+ }) | (SharedBaseArgs & {
63
+ lib: () => Module;
64
+ }) | SharedBaseArgs;
65
+ type ShareStrategy = 'version-first' | 'loaded-first';
66
+ type NoMatchedUsedExportsItem = [from: string, usedExports?: string[]];
67
+ type Shared = {
68
+ version: string;
69
+ get: SharedGetter;
70
+ shareConfig: SharedConfig;
71
+ scope: Array<string>;
72
+ useIn: Array<string>;
73
+ from: string;
74
+ deps: Array<string>;
75
+ lib?: () => Module;
76
+ loaded?: boolean;
77
+ loading?: null | Promise<any>;
78
+ eager?: boolean;
79
+ /**
80
+ * @deprecated set in initOptions.shareStrategy instead
81
+ */
82
+ strategy: ShareStrategy;
83
+ treeShaking?: TreeShakingArgs;
84
+ };
85
+ type ShareScopeMap = {
86
+ [scope: string]: {
87
+ [pkgName: string]: {
88
+ [sharedVersion: string]: Shared;
89
+ };
90
+ };
91
+ };
92
+ type GlobalShareScopeMap = {
93
+ [instanceName: string]: ShareScopeMap;
94
+ };
95
+ type ShareInfos = {
96
+ [pkgName: string]: Shared[];
97
+ };
98
+ interface Options {
99
+ id?: string;
100
+ name: string;
101
+ version?: string;
102
+ remotes: Array<Remote>;
103
+ shared: ShareInfos;
104
+ plugins: Array<ModuleFederationRuntimePlugin>;
105
+ inBrowser: boolean;
106
+ shareStrategy?: ShareStrategy;
107
+ }
108
+ type UserOptions = Omit<Optional<Options, 'plugins'>, 'shared' | 'inBrowser'> & {
109
+ shared?: {
110
+ [pkgName: string]: ShareArgs | ShareArgs[];
111
+ };
112
+ };
113
+ type LoadModuleOptions = {
114
+ version?: string;
115
+ };
116
+ type RemoteEntryInitOptions = {
117
+ version: string;
118
+ shareScopeMap?: ShareScopeMap;
119
+ shareScopeKeys: string | string[];
120
+ };
121
+ type InitTokens = Record<string, Record<string, any>>;
122
+ type InitScope = InitTokens[];
123
+ type CallFrom = 'build' | 'runtime';
124
+ type RemoteEntryExports = {
125
+ get: (id: string) => () => Promise<Module>;
126
+ init: (shareScope: ShareScopeMap[string], initScope?: InitScope, remoteEntryInitOPtions?: RemoteEntryInitOptions) => void | Promise<void>;
127
+ };
128
+ //#endregion
129
+ export { CallFrom, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions };
130
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1,13 @@
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+
3
+ //#region src/type/index.ts
4
+ var type_exports = /* @__PURE__ */ require_runtime.__exportAll({});
5
+
6
+ //#endregion
7
+ Object.defineProperty(exports, 'type_exports', {
8
+ enumerable: true,
9
+ get: function () {
10
+ return type_exports;
11
+ }
12
+ });
13
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/type/index.ts"],"sourcesContent":["export * from './config';\nexport * from './plugin';\nexport * from './preload';\n"],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { ModuleFederationRuntimePlugin } from "./plugin.js";
2
+ import { CallFrom, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions } from "./config.js";
3
+ import { EntryAssets, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, depsPreloadArg } from "./preload.js";
4
+
5
+ //#region src/type/index.d.ts
6
+ declare namespace index_d_exports {
7
+ export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions, depsPreloadArg };
8
+ }
9
+ //#endregion
10
+ export { index_d_exports };
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
+
3
+ //#region src/type/index.ts
4
+ var type_exports = /* @__PURE__ */ __exportAll({});
5
+
6
+ //#endregion
7
+ export { type_exports };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/type/index.ts"],"sourcesContent":["export * from './config';\nexport * from './plugin';\nexport * from './preload';\n"],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { Module } from "../module/index.js";
2
+ import { SnapshotHandler } from "../plugins/snapshot/SnapshotHandler.js";
3
+ import { RemoteHandler } from "../remote/index.js";
4
+ import { SharedHandler } from "../shared/index.js";
5
+ import { ModuleFederation } from "../core.js";
6
+
7
+ //#region src/type/plugin.d.ts
8
+ type CoreLifeCycle = ModuleFederation['hooks']['lifecycle'];
9
+ type CoreLifeCyclePartial = Partial<{ [k in keyof CoreLifeCycle]: Parameters<CoreLifeCycle[k]['on']>[0] }>;
10
+ type SnapshotLifeCycle = SnapshotHandler['hooks']['lifecycle'];
11
+ type SnapshotLifeCycleCyclePartial = Partial<{ [k in keyof SnapshotLifeCycle]: Parameters<SnapshotLifeCycle[k]['on']>[0] }>;
12
+ type ModuleLifeCycle = Module['host']['loaderHook']['lifecycle'];
13
+ type ModuleLifeCycleCyclePartial = Partial<{ [k in keyof ModuleLifeCycle]: Parameters<ModuleLifeCycle[k]['on']>[0] }>;
14
+ type ModuleBridgeLifeCycle = Module['host']['bridgeHook']['lifecycle'];
15
+ type ModuleBridgeLifeCycleCyclePartial = Partial<{ [k in keyof ModuleBridgeLifeCycle]: Parameters<ModuleBridgeLifeCycle[k]['on']>[0] }>;
16
+ type SharedLifeCycle = SharedHandler['hooks']['lifecycle'];
17
+ type SharedLifeCycleCyclePartial = Partial<{ [k in keyof SharedLifeCycle]: Parameters<SharedLifeCycle[k]['on']>[0] }>;
18
+ type RemoteLifeCycle = RemoteHandler['hooks']['lifecycle'];
19
+ type RemoteLifeCycleCyclePartial = Partial<{ [k in keyof RemoteLifeCycle]: Parameters<RemoteLifeCycle[k]['on']>[0] }>;
20
+ type ModuleFederationRuntimePlugin = CoreLifeCyclePartial & SnapshotLifeCycleCyclePartial & SharedLifeCycleCyclePartial & RemoteLifeCycleCyclePartial & ModuleLifeCycleCyclePartial & ModuleBridgeLifeCycleCyclePartial & {
21
+ name: string;
22
+ version?: string;
23
+ apply?: (instance: ModuleFederation) => void;
24
+ };
25
+ //#endregion
26
+ export { ModuleFederationRuntimePlugin };
27
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1,31 @@
1
+ import { Remote, RemoteInfo } from "./config.js";
2
+
3
+ //#region src/type/preload.d.ts
4
+ type depsPreloadArg = Omit<PreloadRemoteArgs, 'depsRemote'>;
5
+ interface PreloadRemoteArgs {
6
+ nameOrAlias: string;
7
+ exposes?: Array<string>;
8
+ resourceCategory?: 'all' | 'sync';
9
+ share?: boolean;
10
+ depsRemote?: boolean | Array<depsPreloadArg>;
11
+ filter?: (assetUrl: string) => boolean;
12
+ prefetchInterface?: boolean;
13
+ }
14
+ type PreloadConfig = PreloadRemoteArgs;
15
+ type PreloadOptions = Array<{
16
+ remote: Remote;
17
+ preloadConfig: PreloadConfig;
18
+ }>;
19
+ type EntryAssets = {
20
+ name: string;
21
+ url: string;
22
+ moduleInfo: RemoteInfo;
23
+ };
24
+ interface PreloadAssets {
25
+ cssAssets: Array<string>;
26
+ jsAssetsWithoutEntry: Array<string>;
27
+ entryAssets: Array<EntryAssets>;
28
+ }
29
+ //#endregion
30
+ export { EntryAssets, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, depsPreloadArg };
31
+ //# sourceMappingURL=preload.d.ts.map
package/dist/types.cjs ADDED
File without changes
package/dist/types.d.ts CHANGED
@@ -1 +1,4 @@
1
- export * from "./src/types";
1
+ import { ModuleFederationRuntimePlugin } from "./type/plugin.js";
2
+ import { CallFrom, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions } from "./type/config.js";
3
+ import { EntryAssets, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, depsPreloadArg } from "./type/preload.js";
4
+ export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions, depsPreloadArg };
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,45 @@
1
+
2
+ //#region src/utils/context.ts
3
+ function remoteToEntry(r) {
4
+ return {
5
+ name: r.name,
6
+ alias: r.alias,
7
+ entry: "entry" in r ? r.entry : void 0,
8
+ version: "version" in r ? r.version : void 0,
9
+ type: r.type,
10
+ entryGlobalName: r.entryGlobalName,
11
+ shareScope: r.shareScope
12
+ };
13
+ }
14
+ /**
15
+ * Build a partial MFContext from runtime Options.
16
+ * Used to enrich diagnostic entries with host context at error sites.
17
+ */
18
+ function optionsToMFContext(options) {
19
+ const shared = {};
20
+ for (const [pkgName, versions] of Object.entries(options.shared)) {
21
+ const first = versions[0];
22
+ if (first) shared[pkgName] = {
23
+ version: first.version,
24
+ singleton: first.shareConfig?.singleton,
25
+ requiredVersion: first.shareConfig?.requiredVersion === false ? false : first.shareConfig?.requiredVersion,
26
+ eager: first.eager,
27
+ strictVersion: first.shareConfig?.strictVersion
28
+ };
29
+ }
30
+ return {
31
+ project: {
32
+ name: options.name,
33
+ mfRole: options.remotes?.length > 0 ? "host" : "unknown"
34
+ },
35
+ mfConfig: {
36
+ name: options.name,
37
+ remotes: options.remotes?.map(remoteToEntry) ?? [],
38
+ shared
39
+ }
40
+ };
41
+ }
42
+
43
+ //#endregion
44
+ exports.optionsToMFContext = optionsToMFContext;
45
+ //# sourceMappingURL=context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.cjs","names":[],"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { MFContext } from '@module-federation/error-codes';\nimport type { Options, Remote } from '../type';\n\nfunction remoteToEntry(\n r: Remote,\n): import('@module-federation/error-codes').MFRemoteEntry {\n return {\n name: r.name,\n alias: r.alias,\n entry: 'entry' in r ? (r as { entry: string }).entry : undefined,\n version: 'version' in r ? (r as { version: string }).version : undefined,\n type: r.type,\n entryGlobalName: r.entryGlobalName,\n shareScope: r.shareScope,\n };\n}\n\n/**\n * Build a partial MFContext from runtime Options.\n * Used to enrich diagnostic entries with host context at error sites.\n */\nexport function optionsToMFContext(options: Options): Partial<MFContext> {\n const shared: MFContext['mfConfig'] extends undefined\n ? never\n : NonNullable<MFContext['mfConfig']>['shared'] = {};\n\n for (const [pkgName, versions] of Object.entries(options.shared)) {\n const first = versions[0];\n if (first) {\n shared[pkgName] = {\n version: first.version,\n singleton: first.shareConfig?.singleton,\n requiredVersion:\n first.shareConfig?.requiredVersion === false\n ? false\n : first.shareConfig?.requiredVersion,\n eager: first.eager,\n strictVersion: first.shareConfig?.strictVersion,\n };\n }\n }\n\n return {\n project: {\n name: options.name,\n mfRole: options.remotes?.length > 0 ? 'host' : 'unknown',\n },\n mfConfig: {\n name: options.name,\n remotes: options.remotes?.map(remoteToEntry) ?? [],\n shared,\n },\n };\n}\n"],"mappings":";;AAGA,SAAS,cACP,GACwD;AACxD,QAAO;EACL,MAAM,EAAE;EACR,OAAO,EAAE;EACT,OAAO,WAAW,IAAK,EAAwB,QAAQ;EACvD,SAAS,aAAa,IAAK,EAA0B,UAAU;EAC/D,MAAM,EAAE;EACR,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf;;;;;;AAOH,SAAgB,mBAAmB,SAAsC;CACvE,MAAM,SAE6C,EAAE;AAErD,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,OAAO,EAAE;EAChE,MAAM,QAAQ,SAAS;AACvB,MAAI,MACF,QAAO,WAAW;GAChB,SAAS,MAAM;GACf,WAAW,MAAM,aAAa;GAC9B,iBACE,MAAM,aAAa,oBAAoB,QACnC,QACA,MAAM,aAAa;GACzB,OAAO,MAAM;GACb,eAAe,MAAM,aAAa;GACnC;;AAIL,QAAO;EACL,SAAS;GACP,MAAM,QAAQ;GACd,QAAQ,QAAQ,SAAS,SAAS,IAAI,SAAS;GAChD;EACD,UAAU;GACR,MAAM,QAAQ;GACd,SAAS,QAAQ,SAAS,IAAI,cAAc,IAAI,EAAE;GAClD;GACD;EACF"}
@@ -0,0 +1 @@
1
+ import { MFContext } from "@module-federation/error-codes";