@module-federation/runtime-core 2.3.3 → 2.5.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 (68) hide show
  1. package/dist/core.cjs +10 -2
  2. package/dist/core.cjs.map +1 -1
  3. package/dist/core.d.ts +62 -6
  4. package/dist/core.js +10 -2
  5. package/dist/core.js.map +1 -1
  6. package/dist/global.cjs +1 -1
  7. package/dist/global.js +1 -1
  8. package/dist/module/index.cjs +158 -21
  9. package/dist/module/index.cjs.map +1 -1
  10. package/dist/module/index.d.ts +5 -4
  11. package/dist/module/index.js +160 -23
  12. package/dist/module/index.js.map +1 -1
  13. package/dist/plugins/snapshot/SnapshotHandler.cjs +40 -16
  14. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
  15. package/dist/plugins/snapshot/SnapshotHandler.d.ts +5 -2
  16. package/dist/plugins/snapshot/SnapshotHandler.js +42 -18
  17. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
  18. package/dist/plugins/snapshot/index.cjs +6 -2
  19. package/dist/plugins/snapshot/index.cjs.map +1 -1
  20. package/dist/plugins/snapshot/index.js +6 -2
  21. package/dist/plugins/snapshot/index.js.map +1 -1
  22. package/dist/remote/index.cjs +163 -25
  23. package/dist/remote/index.cjs.map +1 -1
  24. package/dist/remote/index.d.ts +30 -4
  25. package/dist/remote/index.js +164 -26
  26. package/dist/remote/index.js.map +1 -1
  27. package/dist/shared/index.cjs +210 -95
  28. package/dist/shared/index.cjs.map +1 -1
  29. package/dist/shared/index.d.ts +22 -0
  30. package/dist/shared/index.js +211 -96
  31. package/dist/shared/index.js.map +1 -1
  32. package/dist/type/index.d.ts +2 -2
  33. package/dist/type/preload.d.ts +25 -2
  34. package/dist/types.d.ts +2 -2
  35. package/dist/utils/hooks/asyncHook.cjs +4 -1
  36. package/dist/utils/hooks/asyncHook.cjs.map +1 -1
  37. package/dist/utils/hooks/asyncHook.js +4 -1
  38. package/dist/utils/hooks/asyncHook.js.map +1 -1
  39. package/dist/utils/hooks/asyncWaterfallHooks.cjs +10 -8
  40. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -1
  41. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +2 -2
  42. package/dist/utils/hooks/asyncWaterfallHooks.js +10 -8
  43. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -1
  44. package/dist/utils/hooks/syncHook.cjs +2 -1
  45. package/dist/utils/hooks/syncHook.cjs.map +1 -1
  46. package/dist/utils/hooks/syncHook.js +2 -1
  47. package/dist/utils/hooks/syncHook.js.map +1 -1
  48. package/dist/utils/hooks/syncWaterfallHook.cjs +1 -0
  49. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -1
  50. package/dist/utils/hooks/syncWaterfallHook.d.ts +1 -1
  51. package/dist/utils/hooks/syncWaterfallHook.js +1 -0
  52. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -1
  53. package/dist/utils/index.js +1 -1
  54. package/dist/utils/load.cjs +42 -10
  55. package/dist/utils/load.cjs.map +1 -1
  56. package/dist/utils/load.d.ts +2 -0
  57. package/dist/utils/load.js +42 -10
  58. package/dist/utils/load.js.map +1 -1
  59. package/dist/utils/manifest.cjs +5 -0
  60. package/dist/utils/manifest.cjs.map +1 -1
  61. package/dist/utils/manifest.js +5 -1
  62. package/dist/utils/manifest.js.map +1 -1
  63. package/dist/utils/preload.cjs +126 -64
  64. package/dist/utils/preload.cjs.map +1 -1
  65. package/dist/utils/preload.d.ts +2 -2
  66. package/dist/utils/preload.js +126 -64
  67. package/dist/utils/preload.js.map +1 -1
  68. package/package.json +3 -3
@@ -3,6 +3,7 @@ const require_constant = require('../constant.cjs');
3
3
  const require_share = require('../utils/share.cjs');
4
4
  const require_context = require('../utils/context.cjs');
5
5
  require('../utils/index.cjs');
6
+ const require_syncHook = require('../utils/hooks/syncHook.cjs');
6
7
  const require_asyncHook = require('../utils/hooks/asyncHook.cjs');
7
8
  const require_syncWaterfallHook = require('../utils/hooks/syncWaterfallHook.cjs');
8
9
  const require_asyncWaterfallHooks = require('../utils/hooks/asyncWaterfallHooks.cjs');
@@ -18,6 +19,8 @@ var SharedHandler = class {
18
19
  afterResolve: new require_asyncWaterfallHooks.AsyncWaterfallHook("afterResolve"),
19
20
  beforeLoadShare: new require_asyncWaterfallHooks.AsyncWaterfallHook("beforeLoadShare"),
20
21
  loadShare: new require_asyncHook.AsyncHook(),
22
+ afterLoadShare: new require_syncHook.SyncHook("afterLoadShare"),
23
+ errorLoadShare: new require_syncHook.SyncHook("errorLoadShare"),
21
24
  resolveShare: new require_syncWaterfallHook.SyncWaterfallHook("resolveShare"),
22
25
  initContainerShareScopeMap: new require_syncWaterfallHook.SyncWaterfallHook("initContainerShareScopeMap")
23
26
  });
@@ -26,6 +29,37 @@ var SharedHandler = class {
26
29
  this.initTokens = {};
27
30
  this._setGlobalShareScopeMap(host.options);
28
31
  }
32
+ emitAfterLoadShare({ lifecycle, pkgName, shareInfo, selectedShared }) {
33
+ try {
34
+ this.hooks.lifecycle.afterLoadShare.emit({
35
+ pkgName,
36
+ shareInfo,
37
+ selectedShared,
38
+ shared: this.host.options.shared,
39
+ shareScopeMap: this.shareScopeMap,
40
+ lifecycle,
41
+ origin: this.host
42
+ });
43
+ } catch (error) {
44
+ require_logger.warn(error);
45
+ }
46
+ }
47
+ emitErrorLoadShare({ lifecycle, pkgName, shareInfo, error, recovered }) {
48
+ try {
49
+ this.hooks.lifecycle.errorLoadShare.emit({
50
+ pkgName,
51
+ shareInfo,
52
+ shared: this.host.options.shared,
53
+ shareScopeMap: this.shareScopeMap,
54
+ lifecycle,
55
+ origin: this.host,
56
+ error,
57
+ recovered
58
+ });
59
+ } catch (hookError) {
60
+ require_logger.warn(hookError);
61
+ }
62
+ }
29
63
  registerShared(globalOptions, userOptions) {
30
64
  const { newShareInfos, allShareInfos } = require_share.formatShareConfigs(globalOptions, userOptions);
31
65
  Object.keys(newShareInfos).forEach((sharedKey) => {
@@ -59,77 +93,123 @@ var SharedHandler = class {
59
93
  extraOptions,
60
94
  shareInfos: host.options.shared
61
95
  });
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
- require_logger.assert(shareOptionsRes, `Cannot find shared "${pkgName}" in host "${host.options.name}". Ensure the shared config for "${pkgName}" is declared in the federation plugin options and the host has been initialized before loading shares.`);
72
- const { shared: registeredShared, useTreesShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
73
- if (registeredShared) {
74
- const targetShared = require_share.directShare(registeredShared, useTreesShaking);
75
- if (targetShared.lib) {
76
- require_share.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
- require_share.addUseIn(targetShared, host.options.name);
83
- return factory;
96
+ let shareOptionsRes = shareOptions;
97
+ try {
98
+ if (shareOptions?.scope) await Promise.all(shareOptions.scope.map(async (shareScope) => {
99
+ await Promise.all(this.initializeSharing(shareScope, { strategy: shareOptions.strategy }));
100
+ }));
101
+ shareOptionsRes = (await this.hooks.lifecycle.beforeLoadShare.emit({
102
+ pkgName,
103
+ shareInfo: shareOptions,
104
+ shared: host.options.shared,
105
+ origin: host
106
+ })).shareInfo;
107
+ require_logger.assert(shareOptionsRes, `Cannot find shared "${pkgName}" in host "${host.options.name}". Ensure the shared config for "${pkgName}" is declared in the federation plugin options and the host has been initialized before loading shares.`);
108
+ const resolvedShareOptions = shareOptionsRes;
109
+ const { shared: registeredShared, useTreesShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
110
+ if (registeredShared) {
111
+ const targetShared = require_share.directShare(registeredShared, useTreesShaking);
112
+ if (targetShared.lib) {
113
+ require_share.addUseIn(targetShared, host.options.name);
114
+ this.emitAfterLoadShare({
115
+ lifecycle: "loadShare",
116
+ pkgName,
117
+ shareInfo: resolvedShareOptions,
118
+ selectedShared: registeredShared
119
+ });
120
+ return targetShared.lib;
121
+ } else if (targetShared.loading && !targetShared.loaded) {
122
+ const factory = await targetShared.loading;
123
+ targetShared.loaded = true;
124
+ if (!targetShared.lib) targetShared.lib = factory;
125
+ require_share.addUseIn(targetShared, host.options.name);
126
+ this.emitAfterLoadShare({
127
+ lifecycle: "loadShare",
128
+ pkgName,
129
+ shareInfo: resolvedShareOptions,
130
+ selectedShared: registeredShared
131
+ });
132
+ return factory;
133
+ } else {
134
+ const asyncLoadProcess = async () => {
135
+ const factory = await targetShared.get();
136
+ require_share.addUseIn(targetShared, host.options.name);
137
+ targetShared.loaded = true;
138
+ targetShared.lib = factory;
139
+ return factory;
140
+ };
141
+ const loading = asyncLoadProcess();
142
+ this.setShared({
143
+ pkgName,
144
+ loaded: false,
145
+ shared: registeredShared,
146
+ from: host.options.name,
147
+ lib: null,
148
+ loading,
149
+ treeShaking: useTreesShaking ? targetShared : void 0
150
+ });
151
+ const factory = await loading;
152
+ this.emitAfterLoadShare({
153
+ lifecycle: "loadShare",
154
+ pkgName,
155
+ shareInfo: resolvedShareOptions,
156
+ selectedShared: registeredShared
157
+ });
158
+ return factory;
159
+ }
84
160
  } else {
161
+ if (extraOptions?.customShareInfo) {
162
+ this.emitErrorLoadShare({
163
+ lifecycle: "loadShare",
164
+ pkgName,
165
+ shareInfo: resolvedShareOptions,
166
+ recovered: true
167
+ });
168
+ return false;
169
+ }
170
+ const _useTreeShaking = require_share.shouldUseTreeShaking(resolvedShareOptions.treeShaking);
171
+ const targetShared = require_share.directShare(resolvedShareOptions, _useTreeShaking);
85
172
  const asyncLoadProcess = async () => {
86
173
  const factory = await targetShared.get();
87
- require_share.addUseIn(targetShared, host.options.name);
88
- targetShared.loaded = true;
89
174
  targetShared.lib = factory;
175
+ targetShared.loaded = true;
176
+ require_share.addUseIn(targetShared, host.options.name);
177
+ const { shared: gShared, useTreesShaking: gUseTreeShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, resolvedShareOptions, this.hooks.lifecycle.resolveShare) || {};
178
+ if (gShared) {
179
+ const targetGShared = require_share.directShare(gShared, gUseTreeShaking);
180
+ targetGShared.lib = factory;
181
+ targetGShared.loaded = true;
182
+ gShared.from = resolvedShareOptions.from;
183
+ }
90
184
  return factory;
91
185
  };
92
186
  const loading = asyncLoadProcess();
93
187
  this.setShared({
94
188
  pkgName,
95
189
  loaded: false,
96
- shared: registeredShared,
190
+ shared: resolvedShareOptions,
97
191
  from: host.options.name,
98
192
  lib: null,
99
193
  loading,
100
- treeShaking: useTreesShaking ? targetShared : void 0
194
+ treeShaking: _useTreeShaking ? targetShared : void 0
195
+ });
196
+ const factory = await loading;
197
+ this.emitAfterLoadShare({
198
+ lifecycle: "loadShare",
199
+ pkgName,
200
+ shareInfo: resolvedShareOptions,
201
+ selectedShared: resolvedShareOptions
101
202
  });
102
- return loading;
103
- }
104
- } else {
105
- if (extraOptions?.customShareInfo) return false;
106
- const _useTreeShaking = require_share.shouldUseTreeShaking(shareOptionsRes.treeShaking);
107
- const targetShared = require_share.directShare(shareOptionsRes, _useTreeShaking);
108
- const asyncLoadProcess = async () => {
109
- const factory = await targetShared.get();
110
- targetShared.lib = factory;
111
- targetShared.loaded = true;
112
- require_share.addUseIn(targetShared, host.options.name);
113
- const { shared: gShared, useTreesShaking: gUseTreeShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
114
- if (gShared) {
115
- const targetGShared = require_share.directShare(gShared, gUseTreeShaking);
116
- targetGShared.lib = factory;
117
- targetGShared.loaded = true;
118
- gShared.from = shareOptionsRes.from;
119
- }
120
203
  return factory;
121
- };
122
- const loading = asyncLoadProcess();
123
- this.setShared({
204
+ }
205
+ } catch (shareError) {
206
+ this.emitErrorLoadShare({
207
+ lifecycle: "loadShare",
124
208
  pkgName,
125
- loaded: false,
126
- shared: shareOptionsRes,
127
- from: host.options.name,
128
- lib: null,
129
- loading,
130
- treeShaking: _useTreeShaking ? targetShared : void 0
209
+ shareInfo: shareOptionsRes,
210
+ error: shareError
131
211
  });
132
- return loading;
212
+ throw shareError;
133
213
  }
134
214
  }
135
215
  /**
@@ -174,6 +254,7 @@ var SharedHandler = class {
174
254
  error,
175
255
  from: "runtime",
176
256
  lifecycle: "beforeLoadShare",
257
+ remote: module.remoteInfo,
177
258
  origin: host
178
259
  });
179
260
  if (!remoteEntryExports) return;
@@ -201,58 +282,92 @@ var SharedHandler = class {
201
282
  extraOptions,
202
283
  shareInfos: host.options.shared
203
284
  });
204
- if (shareOptions?.scope) shareOptions.scope.forEach((shareScope) => {
205
- this.initializeSharing(shareScope, { strategy: shareOptions.strategy });
206
- });
207
- const { shared: registeredShared, useTreesShaking } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare) || {};
208
- if (registeredShared) {
209
- if (typeof registeredShared.lib === "function") {
210
- require_share.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)) {
285
+ try {
286
+ if (shareOptions?.scope) shareOptions.scope.forEach((shareScope) => {
287
+ this.initializeSharing(shareScope, { strategy: shareOptions.strategy });
288
+ });
289
+ const { shared: registeredShared } = require_share.getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare) || {};
290
+ if (registeredShared) {
291
+ if (typeof registeredShared.lib === "function") {
220
292
  require_share.addUseIn(registeredShared, host.options.name);
221
- this.setShared({
293
+ if (!registeredShared.loaded) {
294
+ registeredShared.loaded = true;
295
+ if (registeredShared.from === host.options.name) shareOptions.loaded = true;
296
+ }
297
+ this.emitAfterLoadShare({
298
+ lifecycle: "loadShareSync",
222
299
  pkgName,
223
- loaded: true,
224
- from: host.options.name,
225
- lib: module,
226
- shared: registeredShared
300
+ shareInfo: shareOptions,
301
+ selectedShared: registeredShared
227
302
  });
228
- return module;
303
+ return registeredShared.lib;
304
+ }
305
+ if (typeof registeredShared.get === "function") {
306
+ const module = registeredShared.get();
307
+ if (!(module instanceof Promise)) {
308
+ require_share.addUseIn(registeredShared, host.options.name);
309
+ this.setShared({
310
+ pkgName,
311
+ loaded: true,
312
+ from: host.options.name,
313
+ lib: module,
314
+ shared: registeredShared
315
+ });
316
+ this.emitAfterLoadShare({
317
+ lifecycle: "loadShareSync",
318
+ pkgName,
319
+ shareInfo: shareOptions,
320
+ selectedShared: registeredShared
321
+ });
322
+ return module;
323
+ }
229
324
  }
230
325
  }
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) require_logger.error(extraOptions?.from === "build" ? _module_federation_error_codes.RUNTIME_005 : _module_federation_error_codes.RUNTIME_006, _module_federation_error_codes.runtimeDescMap, {
326
+ if (shareOptions.lib) {
327
+ if (!shareOptions.loaded) shareOptions.loaded = true;
328
+ this.emitAfterLoadShare({
329
+ lifecycle: "loadShareSync",
330
+ pkgName,
331
+ shareInfo: shareOptions,
332
+ selectedShared: shareOptions
333
+ });
334
+ return shareOptions.lib;
335
+ }
336
+ if (shareOptions.get) {
337
+ const module = shareOptions.get();
338
+ if (module instanceof Promise) require_logger.error(extraOptions?.from === "build" ? _module_federation_error_codes.RUNTIME_005 : _module_federation_error_codes.RUNTIME_006, _module_federation_error_codes.runtimeDescMap, {
339
+ hostName: host.options.name,
340
+ sharedPkgName: pkgName
341
+ }, void 0, require_context.optionsToMFContext(host.options));
342
+ shareOptions.lib = module;
343
+ this.setShared({
344
+ pkgName,
345
+ loaded: true,
346
+ from: host.options.name,
347
+ lib: shareOptions.lib,
348
+ shared: shareOptions
349
+ });
350
+ this.emitAfterLoadShare({
351
+ lifecycle: "loadShareSync",
352
+ pkgName,
353
+ shareInfo: shareOptions,
354
+ selectedShared: shareOptions
355
+ });
356
+ return shareOptions.lib;
357
+ }
358
+ require_logger.error(_module_federation_error_codes.RUNTIME_006, _module_federation_error_codes.runtimeDescMap, {
239
359
  hostName: host.options.name,
240
360
  sharedPkgName: pkgName
241
361
  }, void 0, require_context.optionsToMFContext(host.options));
242
- shareOptions.lib = module;
243
- this.setShared({
362
+ } catch (shareError) {
363
+ this.emitErrorLoadShare({
364
+ lifecycle: "loadShareSync",
244
365
  pkgName,
245
- loaded: true,
246
- from: host.options.name,
247
- lib: shareOptions.lib,
248
- shared: shareOptions
366
+ shareInfo: shareOptions,
367
+ error: shareError
249
368
  });
250
- return shareOptions.lib;
369
+ throw shareError;
251
370
  }
252
- require_logger.error(_module_federation_error_codes.RUNTIME_006, _module_federation_error_codes.runtimeDescMap, {
253
- hostName: host.options.name,
254
- sharedPkgName: pkgName
255
- }, void 0, require_context.optionsToMFContext(host.options));
256
371
  }
257
372
  initShareScopeMap(scopeName, shareScope, extraOptions = {}) {
258
373
  const { host } = this;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","formatShareConfigs","getTargetSharedOptions","getRegisteredShare","directShare","shouldUseTreeShaking","DEFAULT_SCOPE","RUNTIME_005","RUNTIME_006","runtimeDescMap","optionsToMFContext","getGlobalShareScope"],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n RUNTIME_005,\n RUNTIME_006,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n Options,\n ShareScopeMap,\n ShareInfos,\n Shared,\n RemoteEntryExports,\n UserOptions,\n ShareStrategy,\n InitScope,\n InitTokens,\n CallFrom,\n TreeShakingArgs,\n} 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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"}
1
+ {"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","formatShareConfigs","getTargetSharedOptions","getRegisteredShare","directShare","shouldUseTreeShaking","DEFAULT_SCOPE","RUNTIME_005","RUNTIME_006","runtimeDescMap","optionsToMFContext","getGlobalShareScope"],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n RUNTIME_005,\n RUNTIME_006,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n Options,\n ShareScopeMap,\n ShareInfos,\n Shared,\n RemoteEntryExports,\n UserOptions,\n ShareStrategy,\n InitScope,\n InitTokens,\n CallFrom,\n TreeShakingArgs,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n PluginSystem,\n AsyncHook,\n AsyncWaterfallHook,\n SyncWaterfallHook,\n SyncHook,\n} from '../utils/hooks';\nimport {\n formatShareConfigs,\n getRegisteredShare,\n getTargetSharedOptions,\n getGlobalShareScope,\n directShare,\n shouldUseTreeShaking,\n addUseIn,\n} from '../utils/share';\nimport {\n assert,\n error,\n addUniqueItem,\n optionsToMFContext,\n warn,\n} from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport { LoadRemoteMatch } from '../remote';\nimport { createRemoteEntryInitOptions } from '../module';\n\nexport class SharedHandler {\n host: ModuleFederation;\n shareScopeMap: ShareScopeMap;\n hooks = new PluginSystem({\n beforeRegisterShare: new SyncWaterfallHook<{\n pkgName: string;\n shared: Shared;\n origin: ModuleFederation;\n }>('beforeRegisterShare'),\n afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n beforeLoadShare: new AsyncWaterfallHook<{\n pkgName: string;\n shareInfo?: Shared;\n shared: Options['shared'];\n origin: ModuleFederation;\n }>('beforeLoadShare'),\n // not used yet\n loadShare: new AsyncHook<[ModuleFederation, string, ShareInfos]>(),\n afterLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n origin: ModuleFederation;\n },\n ],\n void\n >('afterLoadShare'),\n errorLoadShare: new SyncHook<\n [\n {\n pkgName: string;\n shareInfo?: Partial<Shared>;\n shared: Options['shared'];\n shareScopeMap: ShareScopeMap;\n lifecycle: 'loadShare' | 'loadShareSync';\n origin: ModuleFederation;\n error?: unknown;\n recovered?: boolean;\n },\n ],\n void\n >('errorLoadShare'),\n resolveShare: new SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n }>('resolveShare'),\n // maybe will change, temporarily for internal use only\n initContainerShareScopeMap: new SyncWaterfallHook<{\n shareScope: ShareScopeMap[string];\n options: Options;\n origin: ModuleFederation;\n scopeName: string;\n hostShareScopeMap?: ShareScopeMap;\n }>('initContainerShareScopeMap'),\n });\n initTokens: InitTokens;\n constructor(host: ModuleFederation) {\n this.host = host;\n this.shareScopeMap = {};\n this.initTokens = {};\n this._setGlobalShareScopeMap(host.options);\n }\n\n private emitAfterLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n selectedShared,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n }): void {\n try {\n this.hooks.lifecycle.afterLoadShare.emit({\n pkgName,\n shareInfo,\n selectedShared,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n origin: this.host,\n });\n } catch (error) {\n warn(error);\n }\n }\n\n private emitErrorLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n error,\n recovered,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n error?: unknown;\n recovered?: boolean;\n }): void {\n try {\n this.hooks.lifecycle.errorLoadShare.emit({\n pkgName,\n shareInfo,\n shared: this.host.options.shared,\n shareScopeMap: this.shareScopeMap,\n lifecycle,\n origin: this.host,\n error,\n recovered,\n });\n } catch (hookError) {\n warn(hookError);\n }\n }\n\n // register shared in shareScopeMap\n registerShared(globalOptions: Options, userOptions: UserOptions) {\n const { newShareInfos, allShareInfos } = formatShareConfigs(\n globalOptions,\n userOptions,\n );\n\n const sharedKeys = Object.keys(newShareInfos);\n sharedKeys.forEach((sharedKey) => {\n const sharedVals = newShareInfos[sharedKey];\n sharedVals.forEach((sharedVal) => {\n sharedVal.scope.forEach((sc) => {\n this.hooks.lifecycle.beforeRegisterShare.emit({\n origin: this.host,\n pkgName: sharedKey,\n shared: sharedVal,\n });\n const registeredShared = this.shareScopeMap[sc]?.[sharedKey];\n if (!registeredShared) {\n this.setShared({\n pkgName: sharedKey,\n lib: sharedVal.lib,\n get: sharedVal.get,\n loaded: sharedVal.loaded || Boolean(sharedVal.lib),\n shared: sharedVal,\n from: userOptions.name,\n });\n }\n });\n });\n });\n\n return {\n newShareInfos,\n allShareInfos,\n };\n }\n\n async loadShare<T>(\n pkgName: string,\n extraOptions?: {\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): Promise<false | (() => T | undefined)> {\n const { host } = this;\n // This function performs the following steps:\n // 1. Checks if the currently loaded share already exists, if not, it throws an error\n // 2. Searches globally for a matching share, if found, it uses it directly\n // 3. If not found, it retrieves it from the current share and stores the obtained share globally.\n\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n let shareOptionsRes: Shared | undefined = shareOptions;\n\n try {\n if (shareOptions?.scope) {\n await Promise.all(\n shareOptions.scope.map(async (shareScope) => {\n await Promise.all(\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n }),\n );\n return;\n }),\n );\n }\n const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({\n pkgName,\n shareInfo: shareOptions,\n shared: host.options.shared,\n origin: host,\n });\n\n shareOptionsRes = loadShareRes.shareInfo;\n\n // Assert that shareInfoRes exists, if not, throw an error\n assert(\n shareOptionsRes,\n `Cannot find shared \"${pkgName}\" in host \"${host.options.name}\". Ensure the shared config for \"${pkgName}\" is declared in the federation plugin options and the host has been initialized before loading shares.`,\n );\n const resolvedShareOptions = shareOptionsRes;\n\n const { shared: registeredShared, useTreesShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptionsRes,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n const targetShared = directShare(registeredShared, useTreesShaking);\n if (targetShared.lib) {\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return targetShared.lib as () => T;\n } else if (targetShared.loading && !targetShared.loaded) {\n const factory = await targetShared.loading;\n targetShared.loaded = true;\n if (!targetShared.lib) {\n targetShared.lib = factory;\n }\n addUseIn(targetShared, host.options.name);\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return factory;\n } else {\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n addUseIn(targetShared, host.options.name);\n targetShared.loaded = true;\n targetShared.lib = factory;\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: registeredShared,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: useTreesShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: registeredShared,\n });\n return factory;\n }\n } else {\n if (extraOptions?.customShareInfo) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n recovered: true,\n });\n return false;\n }\n const _useTreeShaking = shouldUseTreeShaking(\n resolvedShareOptions.treeShaking,\n );\n const targetShared = directShare(resolvedShareOptions, _useTreeShaking);\n\n const asyncLoadProcess = async () => {\n const factory = await targetShared.get!();\n targetShared.lib = factory;\n targetShared.loaded = true;\n addUseIn(targetShared, host.options.name);\n const { shared: gShared, useTreesShaking: gUseTreeShaking } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n resolvedShareOptions,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n if (gShared) {\n const targetGShared = directShare(gShared, gUseTreeShaking);\n targetGShared.lib = factory;\n targetGShared.loaded = true;\n gShared.from = resolvedShareOptions.from;\n }\n return factory as () => T;\n };\n const loading = asyncLoadProcess();\n this.setShared({\n pkgName,\n loaded: false,\n shared: resolvedShareOptions,\n from: host.options.name,\n lib: null,\n loading,\n treeShaking: _useTreeShaking\n ? (targetShared as TreeShakingArgs)\n : undefined,\n });\n const factory = await loading;\n this.emitAfterLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: resolvedShareOptions,\n selectedShared: resolvedShareOptions,\n });\n return factory;\n }\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: shareOptionsRes,\n error: shareError,\n });\n throw shareError;\n }\n }\n\n /**\n * This function initializes the sharing sequence (executed only once per share scope).\n * It accepts one argument, the name of the share scope.\n * If the share scope does not exist, it creates one.\n */\n // eslint-disable-next-line @typescript-eslint/member-ordering\n initializeSharing(\n shareScopeName = DEFAULT_SCOPE,\n extraOptions?: {\n initScope?: InitScope;\n from?: CallFrom;\n strategy?: ShareStrategy;\n },\n ): Array<Promise<void>> {\n const { host } = this;\n const from = extraOptions?.from;\n const strategy = extraOptions?.strategy;\n let initScope = extraOptions?.initScope;\n const promises: Promise<any>[] = [];\n if (from !== 'build') {\n const { initTokens } = this;\n if (!initScope) initScope = [];\n let initToken = initTokens[shareScopeName];\n if (!initToken)\n initToken = initTokens[shareScopeName] = { from: this.host.name };\n if (initScope.indexOf(initToken) >= 0) return promises;\n initScope.push(initToken);\n }\n\n const shareScope = this.shareScopeMap;\n const hostName = host.options.name;\n // Creates a new share scope if necessary\n if (!shareScope[shareScopeName]) {\n shareScope[shareScopeName] = {};\n }\n // Executes all initialization snippets from all accessible modules\n const scope = shareScope[shareScopeName];\n const register = (name: string, shared: Shared) => {\n const { version, eager } = shared;\n scope[name] = scope[name] || {};\n const versions = scope[name];\n const activeVersion: Shared =\n versions[version] && (directShare(versions[version]) as Shared);\n const activeVersionEager = Boolean(\n activeVersion &&\n (('eager' in activeVersion && activeVersion.eager) ||\n ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n );\n if (\n !activeVersion ||\n (activeVersion.strategy !== 'loaded-first' &&\n !activeVersion.loaded &&\n (Boolean(!eager) !== !activeVersionEager\n ? eager\n : hostName > versions[version].from))\n ) {\n versions[version] = shared;\n }\n };\n\n const initRemoteModule = async (key: string): Promise<void> => {\n const { module } = await host.remoteHandler.getRemoteModuleAndOptions({\n id: key,\n });\n let remoteEntryExports: RemoteEntryExports | undefined = undefined;\n try {\n remoteEntryExports = await module.getEntry();\n } catch (error) {\n remoteEntryExports =\n (await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({\n id: key,\n error,\n from: 'runtime',\n lifecycle: 'beforeLoadShare',\n remote: module.remoteInfo,\n origin: host,\n })) as RemoteEntryExports;\n if (!remoteEntryExports) {\n return;\n }\n } finally {\n // prevent self load loop: when host load self , the initTokens is not the same\n if (remoteEntryExports?.init && !module.initing) {\n module.remoteEntryExports = remoteEntryExports;\n await module.init(undefined, undefined, initScope);\n }\n }\n };\n Object.keys(host.options.shared).forEach((shareName) => {\n const sharedArr = host.options.shared[shareName];\n sharedArr.forEach((shared) => {\n if (shared.scope.includes(shareScopeName)) {\n register(shareName, shared);\n }\n });\n });\n // TODO: strategy==='version-first' need to be removed in the future\n if (\n host.options.shareStrategy === 'version-first' ||\n strategy === 'version-first'\n ) {\n host.options.remotes.forEach((remote) => {\n if (remote.shareScope === shareScopeName) {\n promises.push(initRemoteModule(remote.name));\n }\n });\n }\n\n return promises;\n }\n\n // The lib function will only be available if the shared set by eager or runtime init is set or the shared is successfully loaded.\n // 1. If the loaded shared already exists globally, then it will be reused\n // 2. If lib exists in local shared, it will be used directly\n // 3. If the local get returns something other than Promise, then it will be used directly\n loadShareSync<T>(\n pkgName: string,\n extraOptions?: {\n from?: 'build' | 'runtime';\n customShareInfo?: Partial<Shared>;\n resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n },\n ): () => T | never {\n const { host } = this;\n const shareOptions = getTargetSharedOptions({\n pkgName,\n extraOptions,\n shareInfos: host.options.shared,\n });\n\n try {\n if (shareOptions?.scope) {\n shareOptions.scope.forEach((shareScope) => {\n this.initializeSharing(shareScope, {\n strategy: shareOptions.strategy,\n });\n });\n }\n const { shared: registeredShared } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptions,\n this.hooks.lifecycle.resolveShare,\n ) || {};\n\n if (registeredShared) {\n if (typeof registeredShared.lib === 'function') {\n addUseIn(registeredShared, host.options.name);\n if (!registeredShared.loaded) {\n registeredShared.loaded = true;\n if (registeredShared.from === host.options.name) {\n shareOptions.loaded = true;\n }\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n });\n return registeredShared.lib as () => T;\n }\n if (typeof registeredShared.get === 'function') {\n const module = registeredShared.get();\n if (!(module instanceof Promise)) {\n addUseIn(registeredShared, host.options.name);\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: module,\n shared: registeredShared,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: registeredShared,\n });\n return module;\n }\n }\n }\n\n if (shareOptions.lib) {\n if (!shareOptions.loaded) {\n shareOptions.loaded = true;\n }\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n });\n return shareOptions.lib as () => T;\n }\n\n if (shareOptions.get) {\n const module = shareOptions.get();\n\n if (module instanceof Promise) {\n const errorCode =\n extraOptions?.from === 'build' ? RUNTIME_005 : RUNTIME_006;\n error(\n errorCode,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n }\n\n shareOptions.lib = module;\n\n this.setShared({\n pkgName,\n loaded: true,\n from: host.options.name,\n lib: shareOptions.lib,\n shared: shareOptions,\n });\n this.emitAfterLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n selectedShared: shareOptions,\n });\n return shareOptions.lib as () => T;\n }\n\n error(\n RUNTIME_006,\n runtimeDescMap,\n {\n hostName: host.options.name,\n sharedPkgName: pkgName,\n },\n undefined,\n optionsToMFContext(host.options),\n );\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShareSync',\n pkgName,\n shareInfo: shareOptions,\n error: shareError,\n });\n throw shareError;\n }\n }\n\n initShareScopeMap(\n scopeName: string,\n shareScope: ShareScopeMap[string],\n extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n ): void {\n const { host } = this;\n this.shareScopeMap[scopeName] = shareScope;\n this.hooks.lifecycle.initContainerShareScopeMap.emit({\n shareScope,\n options: host.options,\n origin: host,\n scopeName,\n hostShareScopeMap: extraOptions.hostShareScopeMap,\n });\n }\n\n private setShared({\n pkgName,\n shared,\n from,\n lib,\n loading,\n loaded,\n get,\n treeShaking,\n }: {\n pkgName: string;\n shared: Shared;\n from: string;\n lib: any;\n loaded?: boolean;\n loading?: Shared['loading'];\n get?: Shared['get'];\n treeShaking?: TreeShakingArgs;\n }): void {\n const { version, scope = 'default', ...shareInfo } = shared;\n const scopes: string[] = Array.isArray(scope) ? scope : [scope];\n\n const mergeAttrs = (shared: Shared) => {\n const merge = <K extends keyof TreeShakingArgs>(\n s: TreeShakingArgs,\n key: K,\n val: TreeShakingArgs[K],\n ): void => {\n if (val && !s[key]) {\n s[key] = val;\n }\n };\n const targetShared = (\n treeShaking ? shared.treeShaking! : shared\n ) as TreeShakingArgs;\n merge(targetShared, 'loaded', loaded);\n merge(targetShared, 'loading', loading);\n merge(targetShared, 'get', get);\n };\n scopes.forEach((sc) => {\n if (!this.shareScopeMap[sc]) {\n this.shareScopeMap[sc] = {};\n }\n if (!this.shareScopeMap[sc][pkgName]) {\n this.shareScopeMap[sc][pkgName] = {};\n }\n\n if (!this.shareScopeMap[sc][pkgName][version]) {\n this.shareScopeMap[sc][pkgName][version] = {\n version,\n scope: [sc],\n ...shareInfo,\n lib,\n };\n }\n\n const registeredShared = this.shareScopeMap[sc][pkgName][version];\n mergeAttrs(registeredShared);\n if (from && registeredShared.from !== from) {\n registeredShared.from = from;\n }\n });\n }\n\n private _setGlobalShareScopeMap(hostOptions: Options): void {\n const globalShareScopeMap = getGlobalShareScope();\n const identifier = hostOptions.id || hostOptions.name;\n if (identifier && !globalShareScopeMap[identifier]) {\n globalShareScopeMap[identifier] = this.shareScopeMap;\n }\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { SyncHook } from "../utils/hooks/syncHook.js";
1
2
  import { AsyncHook } from "../utils/hooks/asyncHook.js";
2
3
  import { SyncWaterfallHook } from "../utils/hooks/syncWaterfallHook.js";
3
4
  import { AsyncWaterfallHook } from "../utils/hooks/asyncWaterfallHooks.js";
@@ -24,6 +25,25 @@ declare class SharedHandler {
24
25
  origin: ModuleFederation;
25
26
  }>;
26
27
  loadShare: AsyncHook<[ModuleFederation, string, ShareInfos], false | void | Promise<false | void>>;
28
+ afterLoadShare: SyncHook<[{
29
+ pkgName: string;
30
+ shareInfo?: Partial<Shared>;
31
+ selectedShared?: Partial<Shared>;
32
+ shared: Options["shared"];
33
+ shareScopeMap: ShareScopeMap;
34
+ lifecycle: "loadShare" | "loadShareSync";
35
+ origin: ModuleFederation;
36
+ }], void>;
37
+ errorLoadShare: SyncHook<[{
38
+ pkgName: string;
39
+ shareInfo?: Partial<Shared>;
40
+ shared: Options["shared"];
41
+ shareScopeMap: ShareScopeMap;
42
+ lifecycle: "loadShare" | "loadShareSync";
43
+ origin: ModuleFederation;
44
+ error?: unknown;
45
+ recovered?: boolean;
46
+ }], void>;
27
47
  resolveShare: SyncWaterfallHook<{
28
48
  shareScopeMap: ShareScopeMap;
29
49
  scope: string;
@@ -46,6 +66,8 @@ declare class SharedHandler {
46
66
  }>;
47
67
  initTokens: InitTokens;
48
68
  constructor(host: ModuleFederation);
69
+ private emitAfterLoadShare;
70
+ private emitErrorLoadShare;
49
71
  registerShared(globalOptions: Options, userOptions: UserOptions): {
50
72
  newShareInfos: ShareInfos;
51
73
  allShareInfos: {