@module-federation/runtime-core 2.8.1 → 2.9.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 (67) hide show
  1. package/dist/core.cjs +4 -8
  2. package/dist/core.cjs.map +1 -1
  3. package/dist/core.d.ts +16 -14
  4. package/dist/core.js +4 -8
  5. package/dist/core.js.map +1 -1
  6. package/dist/global.cjs +17 -2
  7. package/dist/global.cjs.map +1 -1
  8. package/dist/global.d.ts +1 -0
  9. package/dist/global.js +16 -3
  10. package/dist/global.js.map +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/module/index.cjs +11 -9
  15. package/dist/module/index.cjs.map +1 -1
  16. package/dist/module/index.d.ts +3 -2
  17. package/dist/module/index.js +11 -9
  18. package/dist/module/index.js.map +1 -1
  19. package/dist/plugins/snapshot/SnapshotHandler.cjs +48 -5
  20. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
  21. package/dist/plugins/snapshot/SnapshotHandler.d.ts +23 -0
  22. package/dist/plugins/snapshot/SnapshotHandler.js +48 -5
  23. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
  24. package/dist/plugins/snapshot/index.cjs +31 -21
  25. package/dist/plugins/snapshot/index.cjs.map +1 -1
  26. package/dist/plugins/snapshot/index.js +31 -21
  27. package/dist/plugins/snapshot/index.js.map +1 -1
  28. package/dist/remote/index.cjs +1 -1
  29. package/dist/remote/index.cjs.map +1 -1
  30. package/dist/remote/index.d.ts +1 -0
  31. package/dist/remote/index.js +1 -1
  32. package/dist/remote/index.js.map +1 -1
  33. package/dist/shared/index.cjs +86 -27
  34. package/dist/shared/index.cjs.map +1 -1
  35. package/dist/shared/index.d.ts +19 -10
  36. package/dist/shared/index.js +86 -27
  37. package/dist/shared/index.js.map +1 -1
  38. package/dist/type/config.d.ts +9 -1
  39. package/dist/type/index.d.ts +3 -3
  40. package/dist/type/plugin.d.ts +4 -3
  41. package/dist/type/preload.d.ts +7 -1
  42. package/dist/types.d.ts +3 -3
  43. package/dist/utils/hooks/pluginSystem.cjs +6 -5
  44. package/dist/utils/hooks/pluginSystem.cjs.map +1 -1
  45. package/dist/utils/hooks/pluginSystem.d.ts +2 -5
  46. package/dist/utils/hooks/pluginSystem.js +6 -5
  47. package/dist/utils/hooks/pluginSystem.js.map +1 -1
  48. package/dist/utils/load.cjs +81 -20
  49. package/dist/utils/load.cjs.map +1 -1
  50. package/dist/utils/load.js +81 -20
  51. package/dist/utils/load.js.map +1 -1
  52. package/dist/utils/plugin.cjs +30 -7
  53. package/dist/utils/plugin.cjs.map +1 -1
  54. package/dist/utils/plugin.js +30 -7
  55. package/dist/utils/plugin.js.map +1 -1
  56. package/dist/utils/preload.cjs +21 -10
  57. package/dist/utils/preload.cjs.map +1 -1
  58. package/dist/utils/preload.d.ts +1 -1
  59. package/dist/utils/preload.js +21 -10
  60. package/dist/utils/preload.js.map +1 -1
  61. package/dist/utils/share.cjs +3 -2
  62. package/dist/utils/share.cjs.map +1 -1
  63. package/dist/utils/share.d.ts +3 -2
  64. package/dist/utils/share.js +3 -2
  65. package/dist/utils/share.js.map +1 -1
  66. package/package.json +3 -3
  67. package/dist/utils/hooks/index.d.ts +0 -5
@@ -6,7 +6,7 @@ import { PluginSystem } from "../utils/hooks/pluginSystem.js";
6
6
  import { Federation } from "../global.js";
7
7
  import { LoadRemoteMatch } from "../remote/index.js";
8
8
  import { ModuleFederation } from "../core.js";
9
- import { CallFrom, InitScope, InitTokens, Options, ShareInfos, ShareScopeMap, ShareStrategy, Shared, UserOptions } from "../type/config.js";
9
+ import { CallFrom, InitScope, InitTokens, LoadShareExtraOptions, Options, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedLoadContext, SharedLoadTrigger, UserOptions } from "../type/config.js";
10
10
  //#region src/shared/index.d.ts
11
11
  declare class SharedHandler {
12
12
  host: ModuleFederation;
@@ -17,12 +17,23 @@ declare class SharedHandler {
17
17
  shared: Shared;
18
18
  origin: ModuleFederation;
19
19
  }>;
20
+ afterRegisterShare: SyncHook<[{
21
+ pkgName: string;
22
+ scope: string;
23
+ shared: Shared;
24
+ previousShared?: Shared;
25
+ registeredShared?: Shared;
26
+ shareScopeMap: ShareScopeMap;
27
+ trigger: SharedLoadTrigger;
28
+ origin: ModuleFederation;
29
+ }], void>;
20
30
  afterResolve: AsyncWaterfallHook<LoadRemoteMatch>;
21
31
  beforeLoadShare: AsyncWaterfallHook<{
22
32
  pkgName: string;
23
33
  shareInfo?: Shared;
24
34
  shared: Options["shared"];
25
35
  origin: ModuleFederation;
36
+ loadContext?: SharedLoadContext;
26
37
  }>;
27
38
  loadShare: AsyncHook<[ModuleFederation, string, ShareInfos], false | void | Promise<false | void>>;
28
39
  afterLoadShare: SyncHook<[{
@@ -32,6 +43,7 @@ declare class SharedHandler {
32
43
  shared: Options["shared"];
33
44
  shareScopeMap: ShareScopeMap;
34
45
  lifecycle: "loadShare" | "loadShareSync";
46
+ loadContext?: SharedLoadContext;
35
47
  origin: ModuleFederation;
36
48
  }], void>;
37
49
  errorLoadShare: SyncHook<[{
@@ -43,6 +55,7 @@ declare class SharedHandler {
43
55
  origin: ModuleFederation;
44
56
  error?: unknown;
45
57
  recovered?: boolean;
58
+ loadContext?: SharedLoadContext;
46
59
  }], void>;
47
60
  resolveShare: SyncWaterfallHook<{
48
61
  shareScopeMap: ShareScopeMap;
@@ -55,6 +68,7 @@ declare class SharedHandler {
55
68
  shared: Shared;
56
69
  useTreesShaking: boolean;
57
70
  } | undefined;
71
+ loadContext?: SharedLoadContext;
58
72
  }>;
59
73
  initContainerShareScopeMap: SyncWaterfallHook<{
60
74
  shareScope: ShareScopeMap[string];
@@ -66,6 +80,7 @@ declare class SharedHandler {
66
80
  }>;
67
81
  initTokens: InitTokens;
68
82
  constructor(host: ModuleFederation);
83
+ private emitAfterRegisterShare;
69
84
  private emitAfterLoadShare;
70
85
  private emitErrorLoadShare;
71
86
  registerShared(globalOptions: Options, userOptions: UserOptions): {
@@ -74,10 +89,7 @@ declare class SharedHandler {
74
89
  [pkgName: string]: Shared[];
75
90
  };
76
91
  };
77
- loadShare<T>(pkgName: string, extraOptions?: {
78
- customShareInfo?: Partial<Shared>;
79
- resolver?: (sharedOptions: ShareInfos[string]) => Shared;
80
- }): Promise<false | (() => T | undefined)>;
92
+ loadShare<T>(pkgName: string, extraOptions?: LoadShareExtraOptions): Promise<false | (() => T | undefined)>;
81
93
  /**
82
94
  * This function initializes the sharing sequence (executed only once per share scope).
83
95
  * It accepts one argument, the name of the share scope.
@@ -87,12 +99,9 @@ declare class SharedHandler {
87
99
  initScope?: InitScope;
88
100
  from?: CallFrom;
89
101
  strategy?: ShareStrategy;
102
+ context?: SharedLoadContext;
90
103
  }): Array<Promise<void>>;
91
- loadShareSync<T>(pkgName: string, extraOptions?: {
92
- from?: 'build' | 'runtime';
93
- customShareInfo?: Partial<Shared>;
94
- resolver?: (sharedOptions: ShareInfos[string]) => Shared;
95
- }): () => T | never;
104
+ loadShareSync<T>(pkgName: string, extraOptions?: LoadShareExtraOptions): () => T | never;
96
105
  initShareScopeMap(scopeName: string, shareScope: ShareScopeMap[string], extraOptions?: {
97
106
  hostShareScopeMap?: ShareScopeMap;
98
107
  }): void;
@@ -16,6 +16,7 @@ var SharedHandler = class {
16
16
  constructor(host) {
17
17
  this.hooks = new PluginSystem({
18
18
  beforeRegisterShare: new SyncWaterfallHook("beforeRegisterShare"),
19
+ afterRegisterShare: new SyncHook("afterRegisterShare"),
19
20
  afterResolve: new AsyncWaterfallHook("afterResolve"),
20
21
  beforeLoadShare: new AsyncWaterfallHook("beforeLoadShare"),
21
22
  loadShare: new AsyncHook(),
@@ -29,7 +30,15 @@ var SharedHandler = class {
29
30
  this.initTokens = {};
30
31
  this._setGlobalShareScopeMap(host.options);
31
32
  }
32
- emitAfterLoadShare({ lifecycle, pkgName, shareInfo, selectedShared }) {
33
+ emitAfterRegisterShare(pkgName, input) {
34
+ this.hooks.lifecycle.afterRegisterShare.emit({
35
+ pkgName,
36
+ ...input,
37
+ shareScopeMap: this.shareScopeMap,
38
+ origin: this.host
39
+ });
40
+ }
41
+ emitAfterLoadShare({ lifecycle, pkgName, shareInfo, selectedShared, loadContext }) {
33
42
  try {
34
43
  this.hooks.lifecycle.afterLoadShare.emit({
35
44
  pkgName,
@@ -38,13 +47,14 @@ var SharedHandler = class {
38
47
  shared: this.host.options.shared,
39
48
  shareScopeMap: this.shareScopeMap,
40
49
  lifecycle,
50
+ loadContext,
41
51
  origin: this.host
42
52
  });
43
53
  } catch (error) {
44
54
  warn(error);
45
55
  }
46
56
  }
47
- emitErrorLoadShare({ lifecycle, pkgName, shareInfo, error, recovered }) {
57
+ emitErrorLoadShare({ lifecycle, pkgName, shareInfo, error, recovered, loadContext }) {
48
58
  try {
49
59
  this.hooks.lifecycle.errorLoadShare.emit({
50
60
  pkgName,
@@ -54,7 +64,8 @@ var SharedHandler = class {
54
64
  lifecycle,
55
65
  origin: this.host,
56
66
  error,
57
- recovered
67
+ recovered,
68
+ loadContext
58
69
  });
59
70
  } catch (hookError) {
60
71
  warn(hookError);
@@ -70,7 +81,9 @@ var SharedHandler = class {
70
81
  pkgName: sharedKey,
71
82
  shared: sharedVal
72
83
  });
73
- if (!this.shareScopeMap[sc]?.[sharedKey]) this.setShared({
84
+ const registeredShared = this.shareScopeMap[sc]?.[sharedKey];
85
+ const previousAtVersion = registeredShared?.[sharedVal.version];
86
+ if (!registeredShared) this.setShared({
74
87
  pkgName: sharedKey,
75
88
  lib: sharedVal.lib,
76
89
  get: sharedVal.get,
@@ -78,6 +91,13 @@ var SharedHandler = class {
78
91
  shared: sharedVal,
79
92
  from: userOptions.name
80
93
  });
94
+ this.emitAfterRegisterShare(sharedKey, {
95
+ scope: sc,
96
+ shared: sharedVal,
97
+ previousShared: previousAtVersion,
98
+ registeredShared: this.shareScopeMap[sc]?.[sharedKey]?.[sharedVal.version],
99
+ trigger: "runtime"
100
+ });
81
101
  });
82
102
  });
83
103
  });
@@ -88,6 +108,7 @@ var SharedHandler = class {
88
108
  }
89
109
  async loadShare(pkgName, extraOptions) {
90
110
  const { host } = this;
111
+ let loadContext = extraOptions?.context;
91
112
  const shareOptions = getTargetSharedOptions({
92
113
  pkgName,
93
114
  extraOptions,
@@ -96,17 +117,23 @@ var SharedHandler = class {
96
117
  let shareOptionsRes = shareOptions;
97
118
  try {
98
119
  if (shareOptions?.scope) await Promise.all(shareOptions.scope.map(async (shareScope) => {
99
- await Promise.all(this.initializeSharing(shareScope, { strategy: shareOptions.strategy }));
120
+ await Promise.all(this.initializeSharing(shareScope, {
121
+ strategy: shareOptions.strategy,
122
+ context: loadContext
123
+ }));
100
124
  }));
101
- shareOptionsRes = (await this.hooks.lifecycle.beforeLoadShare.emit({
125
+ const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({
102
126
  pkgName,
103
127
  shareInfo: shareOptions,
104
128
  shared: host.options.shared,
105
- origin: host
106
- })).shareInfo;
129
+ origin: host,
130
+ loadContext
131
+ });
132
+ shareOptionsRes = loadShareRes.shareInfo;
133
+ loadContext = loadShareRes.loadContext || loadContext;
107
134
  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
135
  const resolvedShareOptions = shareOptionsRes;
109
- const { shared: registeredShared, useTreesShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare) || {};
136
+ const { shared: registeredShared, useTreesShaking } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptionsRes, this.hooks.lifecycle.resolveShare, loadContext) || {};
110
137
  if (registeredShared) {
111
138
  const targetShared = directShare(registeredShared, useTreesShaking);
112
139
  if (targetShared.lib) {
@@ -115,7 +142,8 @@ var SharedHandler = class {
115
142
  lifecycle: "loadShare",
116
143
  pkgName,
117
144
  shareInfo: resolvedShareOptions,
118
- selectedShared: registeredShared
145
+ selectedShared: registeredShared,
146
+ loadContext
119
147
  });
120
148
  return targetShared.lib;
121
149
  } else if (targetShared.loading && !targetShared.loaded) {
@@ -127,7 +155,8 @@ var SharedHandler = class {
127
155
  lifecycle: "loadShare",
128
156
  pkgName,
129
157
  shareInfo: resolvedShareOptions,
130
- selectedShared: registeredShared
158
+ selectedShared: registeredShared,
159
+ loadContext
131
160
  });
132
161
  return factory;
133
162
  } else {
@@ -153,7 +182,8 @@ var SharedHandler = class {
153
182
  lifecycle: "loadShare",
154
183
  pkgName,
155
184
  shareInfo: resolvedShareOptions,
156
- selectedShared: registeredShared
185
+ selectedShared: registeredShared,
186
+ loadContext
157
187
  });
158
188
  return factory;
159
189
  }
@@ -163,7 +193,8 @@ var SharedHandler = class {
163
193
  lifecycle: "loadShare",
164
194
  pkgName,
165
195
  shareInfo: resolvedShareOptions,
166
- recovered: true
196
+ recovered: true,
197
+ loadContext
167
198
  });
168
199
  return false;
169
200
  }
@@ -174,7 +205,7 @@ var SharedHandler = class {
174
205
  targetShared.lib = factory;
175
206
  targetShared.loaded = true;
176
207
  addUseIn(targetShared, host.options.name);
177
- const { shared: gShared, useTreesShaking: gUseTreeShaking } = getRegisteredShare(this.shareScopeMap, pkgName, resolvedShareOptions, this.hooks.lifecycle.resolveShare) || {};
208
+ const { shared: gShared, useTreesShaking: gUseTreeShaking } = getRegisteredShare(this.shareScopeMap, pkgName, resolvedShareOptions, this.hooks.lifecycle.resolveShare, loadContext) || {};
178
209
  if (gShared) {
179
210
  const targetGShared = directShare(gShared, gUseTreeShaking);
180
211
  targetGShared.lib = factory;
@@ -198,7 +229,8 @@ var SharedHandler = class {
198
229
  lifecycle: "loadShare",
199
230
  pkgName,
200
231
  shareInfo: resolvedShareOptions,
201
- selectedShared: resolvedShareOptions
232
+ selectedShared: resolvedShareOptions,
233
+ loadContext
202
234
  });
203
235
  return factory;
204
236
  }
@@ -207,7 +239,8 @@ var SharedHandler = class {
207
239
  lifecycle: "loadShare",
208
240
  pkgName,
209
241
  shareInfo: shareOptionsRes,
210
- error: shareError
242
+ error: shareError,
243
+ loadContext
211
244
  });
212
245
  throw shareError;
213
246
  }
@@ -221,6 +254,7 @@ var SharedHandler = class {
221
254
  const { host } = this;
222
255
  const from = extraOptions?.from;
223
256
  const strategy = extraOptions?.strategy;
257
+ const trigger = extraOptions?.context?.trigger || from || "runtime";
224
258
  let initScope = extraOptions?.initScope;
225
259
  const promises = [];
226
260
  if (from !== "build") {
@@ -239,15 +273,29 @@ var SharedHandler = class {
239
273
  const { version, eager } = shared;
240
274
  scope[name] = scope[name] || {};
241
275
  const versions = scope[name];
242
- const activeVersion = versions[version] && directShare(versions[version]);
276
+ const existingShared = versions[version];
277
+ const activeVersion = existingShared && directShare(existingShared);
243
278
  const activeVersionEager = Boolean(activeVersion && ("eager" in activeVersion && activeVersion.eager || "shareConfig" in activeVersion && activeVersion.shareConfig?.eager));
244
- if (!activeVersion || activeVersion.strategy !== "loaded-first" && !activeVersion.loaded && (Boolean(!eager) !== !activeVersionEager ? eager : hostName > versions[version].from)) versions[version] = shared;
279
+ if (Boolean(!activeVersion || activeVersion.strategy !== "loaded-first" && !activeVersion.loaded && (Boolean(!eager) !== !activeVersionEager ? eager : hostName > versions[version].from))) versions[version] = shared;
280
+ this.emitAfterRegisterShare(name, {
281
+ scope: shareScopeName,
282
+ shared,
283
+ previousShared: existingShared,
284
+ registeredShared: versions[version],
285
+ trigger
286
+ });
245
287
  };
246
288
  const initRemoteModule = async (key) => {
247
289
  const { module } = await host.remoteHandler.getRemoteModuleAndOptions({ id: key });
248
290
  let remoteEntryExports = void 0;
291
+ const resourceContext = {
292
+ initiator: "loadShare",
293
+ id: key,
294
+ resourceType: "remoteEntry",
295
+ url: module.remoteInfo.entry
296
+ };
249
297
  try {
250
- remoteEntryExports = await module.getEntry();
298
+ remoteEntryExports = await module.getEntry(void 0, resourceContext);
251
299
  } catch (error) {
252
300
  remoteEntryExports = await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
253
301
  id: key,
@@ -261,7 +309,7 @@ var SharedHandler = class {
261
309
  } finally {
262
310
  if (remoteEntryExports?.init && !module.initing) {
263
311
  module.remoteEntryExports = remoteEntryExports;
264
- await module.init(void 0, void 0, initScope);
312
+ await module.init(void 0, void 0, initScope, void 0, resourceContext);
265
313
  }
266
314
  }
267
315
  };
@@ -277,6 +325,7 @@ var SharedHandler = class {
277
325
  }
278
326
  loadShareSync(pkgName, extraOptions) {
279
327
  const { host } = this;
328
+ const loadContext = extraOptions?.context;
280
329
  const shareOptions = getTargetSharedOptions({
281
330
  pkgName,
282
331
  extraOptions,
@@ -284,9 +333,13 @@ var SharedHandler = class {
284
333
  });
285
334
  try {
286
335
  if (shareOptions?.scope) shareOptions.scope.forEach((shareScope) => {
287
- this.initializeSharing(shareScope, { strategy: shareOptions.strategy });
336
+ this.initializeSharing(shareScope, {
337
+ strategy: shareOptions.strategy,
338
+ from: extraOptions?.from,
339
+ context: loadContext
340
+ });
288
341
  });
289
- const { shared: registeredShared } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare) || {};
342
+ const { shared: registeredShared } = getRegisteredShare(this.shareScopeMap, pkgName, shareOptions, this.hooks.lifecycle.resolveShare, loadContext) || {};
290
343
  if (registeredShared) {
291
344
  if (typeof registeredShared.lib === "function") {
292
345
  addUseIn(registeredShared, host.options.name);
@@ -298,7 +351,8 @@ var SharedHandler = class {
298
351
  lifecycle: "loadShareSync",
299
352
  pkgName,
300
353
  shareInfo: shareOptions,
301
- selectedShared: registeredShared
354
+ selectedShared: registeredShared,
355
+ loadContext
302
356
  });
303
357
  return registeredShared.lib;
304
358
  }
@@ -317,7 +371,8 @@ var SharedHandler = class {
317
371
  lifecycle: "loadShareSync",
318
372
  pkgName,
319
373
  shareInfo: shareOptions,
320
- selectedShared: registeredShared
374
+ selectedShared: registeredShared,
375
+ loadContext
321
376
  });
322
377
  return module;
323
378
  }
@@ -329,7 +384,8 @@ var SharedHandler = class {
329
384
  lifecycle: "loadShareSync",
330
385
  pkgName,
331
386
  shareInfo: shareOptions,
332
- selectedShared: shareOptions
387
+ selectedShared: shareOptions,
388
+ loadContext
333
389
  });
334
390
  return shareOptions.lib;
335
391
  }
@@ -351,7 +407,8 @@ var SharedHandler = class {
351
407
  lifecycle: "loadShareSync",
352
408
  pkgName,
353
409
  shareInfo: shareOptions,
354
- selectedShared: shareOptions
410
+ selectedShared: shareOptions,
411
+ loadContext
355
412
  });
356
413
  return shareOptions.lib;
357
414
  }
@@ -364,7 +421,8 @@ var SharedHandler = class {
364
421
  lifecycle: "loadShareSync",
365
422
  pkgName,
366
423
  shareInfo: shareOptions,
367
- error: shareError
424
+ error: shareError,
425
+ loadContext
368
426
  });
369
427
  throw shareError;
370
428
  }
@@ -391,6 +449,7 @@ var SharedHandler = class {
391
449
  merge(targetShared, "loaded", loaded);
392
450
  merge(targetShared, "loading", loading);
393
451
  merge(targetShared, "get", get);
452
+ merge(targetShared, "lib", lib);
394
453
  };
395
454
  scopes.forEach((sc) => {
396
455
  if (!this.shareScopeMap[sc]) this.shareScopeMap[sc] = {};
@@ -1 +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 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 type { 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
+ {"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 LoadShareExtraOptions,\n SharedLoadContext,\n SharedLoadTrigger,\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 type { 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 afterRegisterShare: new SyncHook<\n [\n {\n pkgName: string;\n scope: string;\n shared: Shared;\n previousShared?: Shared;\n registeredShared?: Shared;\n shareScopeMap: ShareScopeMap;\n trigger: SharedLoadTrigger;\n origin: ModuleFederation;\n },\n ],\n void\n >('afterRegisterShare'),\n afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n beforeLoadShare: new AsyncWaterfallHook<{\n pkgName: string;\n shareInfo?: Shared;\n shared: Options['shared'];\n origin: ModuleFederation;\n loadContext?: SharedLoadContext;\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 loadContext?: SharedLoadContext;\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 loadContext?: SharedLoadContext;\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 loadContext?: SharedLoadContext;\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 emitAfterRegisterShare(\n pkgName: string,\n input: {\n scope: string;\n shared: Shared;\n previousShared?: Shared;\n registeredShared?: Shared;\n trigger: SharedLoadTrigger;\n },\n ): void {\n this.hooks.lifecycle.afterRegisterShare.emit({\n pkgName,\n ...input,\n shareScopeMap: this.shareScopeMap,\n origin: this.host,\n });\n }\n\n private emitAfterLoadShare({\n lifecycle,\n pkgName,\n shareInfo,\n selectedShared,\n loadContext,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n selectedShared?: Partial<Shared>;\n loadContext?: SharedLoadContext;\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 loadContext,\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 loadContext,\n }: {\n lifecycle: 'loadShare' | 'loadShareSync';\n pkgName: string;\n shareInfo?: Partial<Shared>;\n error?: unknown;\n recovered?: boolean;\n loadContext?: SharedLoadContext;\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 loadContext,\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 const previousAtVersion = registeredShared?.[sharedVal.version];\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 this.emitAfterRegisterShare(sharedKey, {\n scope: sc,\n shared: sharedVal,\n previousShared: previousAtVersion,\n registeredShared:\n this.shareScopeMap[sc]?.[sharedKey]?.[sharedVal.version],\n trigger: 'runtime',\n });\n });\n });\n });\n\n return {\n newShareInfos,\n allShareInfos,\n };\n }\n\n async loadShare<T>(\n pkgName: string,\n extraOptions?: LoadShareExtraOptions,\n ): Promise<false | (() => T | undefined)> {\n const { host } = this;\n let loadContext = extraOptions?.context;\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 context: loadContext,\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 loadContext,\n });\n\n shareOptionsRes = loadShareRes.shareInfo;\n loadContext = loadShareRes.loadContext || loadContext;\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\n });\n return factory;\n }\n } catch (shareError) {\n this.emitErrorLoadShare({\n lifecycle: 'loadShare',\n pkgName,\n shareInfo: shareOptionsRes,\n error: shareError,\n loadContext,\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 context?: SharedLoadContext;\n },\n ): Array<Promise<void>> {\n const { host } = this;\n const from = extraOptions?.from;\n const strategy = extraOptions?.strategy;\n const trigger: SharedLoadTrigger =\n extraOptions?.context?.trigger || from || 'runtime';\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 existingShared = versions[version];\n const activeVersion: Shared =\n existingShared && (directShare(existingShared) as Shared);\n const activeVersionEager = Boolean(\n activeVersion &&\n (('eager' in activeVersion && activeVersion.eager) ||\n ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n );\n const shouldReplace = Boolean(\n !activeVersion ||\n (activeVersion.strategy !== 'loaded-first' &&\n !activeVersion.loaded &&\n (Boolean(!eager) !== !activeVersionEager\n ? eager\n : hostName > versions[version].from)),\n );\n if (shouldReplace) {\n versions[version] = shared;\n }\n this.emitAfterRegisterShare(name, {\n scope: shareScopeName,\n shared,\n previousShared: existingShared,\n registeredShared: versions[version],\n trigger,\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 const resourceContext = {\n initiator: 'loadShare' as const,\n id: key,\n resourceType: 'remoteEntry' as const,\n url: module.remoteInfo.entry,\n };\n try {\n remoteEntryExports = await module.getEntry(undefined, resourceContext);\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(\n undefined,\n undefined,\n initScope,\n undefined,\n resourceContext,\n );\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?: LoadShareExtraOptions,\n ): () => T | never {\n const { host } = this;\n const loadContext = extraOptions?.context;\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 from: extraOptions?.from,\n context: loadContext,\n });\n });\n }\n const { shared: registeredShared } =\n getRegisteredShare(\n this.shareScopeMap,\n pkgName,\n shareOptions,\n this.hooks.lifecycle.resolveShare,\n loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 loadContext,\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 merge(targetShared, 'lib', lib);\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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"}
@@ -16,9 +16,17 @@ type RemoteInfoOptionalVersion = {
16
16
  } & RemoteInfoCommon;
17
17
  type Remote = (RemoteWithEntry | RemoteWithVersion) & RemoteInfoCommon;
18
18
  type LoadShareExtraOptions = {
19
+ from?: CallFrom;
19
20
  customShareInfo?: Partial<Shared>;
20
21
  resolver?: (sharedOptions: ShareInfos[string]) => Shared;
22
+ context?: SharedLoadContext;
21
23
  };
24
+ type SharedLoadTrigger = CallFrom | 'container-init';
25
+ interface SharedLoadContext {
26
+ trigger?: SharedLoadTrigger;
27
+ moduleId?: string | number;
28
+ chunkId?: string | number;
29
+ }
22
30
  interface RemoteInfo {
23
31
  alias?: string;
24
32
  name: string;
@@ -126,5 +134,5 @@ type RemoteEntryExports = {
126
134
  init: (shareScope: ShareScopeMap[string], initScope?: InitScope, remoteEntryInitOPtions?: RemoteEntryInitOptions) => void | Promise<void>;
127
135
  };
128
136
  //#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 };
137
+ 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, SharedLoadContext, SharedLoadTrigger, TreeShakingArgs, UserOptions };
130
138
  //# sourceMappingURL=config.d.ts.map
@@ -1,10 +1,10 @@
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";
1
+ import { ModuleFederationRuntimePlugin, RuntimePluginHooks } 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, SharedLoadContext, SharedLoadTrigger, TreeShakingArgs, UserOptions } from "./config.js";
3
3
  import { EntryAssets, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, depsPreloadArg } from "./preload.js";
4
4
 
5
5
  //#region src/type/index.d.ts
6
6
  declare namespace index_d_exports {
7
- export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions, depsPreloadArg };
7
+ export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, RuntimePluginHooks, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, SharedLoadContext, SharedLoadTrigger, TreeShakingArgs, UserOptions, depsPreloadArg };
8
8
  }
9
9
  //#endregion
10
10
  export { index_d_exports };
@@ -17,11 +17,12 @@ type SharedLifeCycle = SharedHandler['hooks']['lifecycle'];
17
17
  type SharedLifeCycleCyclePartial = Partial<{ [k in keyof SharedLifeCycle]: Parameters<SharedLifeCycle[k]['on']>[0] }>;
18
18
  type RemoteLifeCycle = RemoteHandler['hooks']['lifecycle'];
19
19
  type RemoteLifeCycleCyclePartial = Partial<{ [k in keyof RemoteLifeCycle]: Parameters<RemoteLifeCycle[k]['on']>[0] }>;
20
- type ModuleFederationRuntimePlugin = CoreLifeCyclePartial & SnapshotLifeCycleCyclePartial & SharedLifeCycleCyclePartial & RemoteLifeCycleCyclePartial & ModuleLifeCycleCyclePartial & ModuleBridgeLifeCycleCyclePartial & {
20
+ type RuntimePluginHooks = CoreLifeCyclePartial & SnapshotLifeCycleCyclePartial & SharedLifeCycleCyclePartial & RemoteLifeCycleCyclePartial & ModuleLifeCycleCyclePartial & ModuleBridgeLifeCycleCyclePartial;
21
+ type ModuleFederationRuntimePlugin = RuntimePluginHooks & {
21
22
  name: string;
22
23
  version?: string;
23
- apply?: (instance: ModuleFederation) => void;
24
+ apply?: (instance: ModuleFederation) => void | RuntimePluginHooks;
24
25
  };
25
26
  //#endregion
26
- export { ModuleFederationRuntimePlugin };
27
+ export { ModuleFederationRuntimePlugin, RuntimePluginHooks };
27
28
  //# sourceMappingURL=plugin.d.ts.map
@@ -9,19 +9,25 @@ interface PreloadRemoteArgs {
9
9
  share?: boolean;
10
10
  depsRemote?: boolean | Array<depsPreloadArg>;
11
11
  filter?: (assetUrl: string) => boolean;
12
+ /**
13
+ * Record preloaded JS and CSS URLs to skip duplicate resource loading.
14
+ * @default true
15
+ */
16
+ recordPreloadedAssets?: boolean;
12
17
  }
13
18
  type PreloadConfig = PreloadRemoteArgs;
14
19
  type PreloadOptions = Array<{
15
20
  remote: Remote;
16
21
  preloadConfig: PreloadConfig;
17
22
  }>;
18
- type ResourceLoadInitiator = 'loadRemote' | 'preloadRemote';
23
+ type ResourceLoadInitiator = 'loadRemote' | 'preloadRemote' | 'loadShare';
19
24
  type ResourceLoadType = 'manifest' | 'remoteEntry' | 'js' | 'css';
20
25
  interface ResourceLoadContext {
21
26
  initiator: ResourceLoadInitiator;
22
27
  id: string;
23
28
  resourceType: ResourceLoadType;
24
29
  url?: string;
30
+ expose?: string;
25
31
  }
26
32
  type PreloadAssetStatus = 'success' | 'error' | 'timeout' | 'cached';
27
33
  interface PreloadAssetResult {
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
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";
1
+ import { ModuleFederationRuntimePlugin, RuntimePluginHooks } 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, SharedLoadContext, SharedLoadTrigger, TreeShakingArgs, UserOptions } from "./type/config.js";
3
3
  import { EntryAssets, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, depsPreloadArg } from "./type/preload.js";
4
- export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, TreeShakingArgs, UserOptions, depsPreloadArg };
4
+ export { CallFrom, EntryAssets, GlobalShareScopeMap, HostInfo, InitScope, InitTokens, LoadModuleOptions, LoadShareExtraOptions, ModuleFederationRuntimePlugin, NoMatchedUsedExportsItem, Optional, Options, PartialOptional, PreloadAssetResult, PreloadAssetStatus, PreloadAssets, PreloadConfig, PreloadOptions, PreloadRemoteArgs, PreloadRemoteResult, Remote, RemoteEntryExports, RemoteEntryInitOptions, RemoteInfo, RemoteInfoCommon, RemoteInfoOptionalVersion, ResourceLoadContext, ResourceLoadInitiator, ResourceLoadType, RuntimePluginHooks, ShareArgs, ShareInfos, ShareScopeMap, ShareStrategy, Shared, SharedConfig, SharedGetter, SharedLoadContext, SharedLoadTrigger, TreeShakingArgs, UserOptions, depsPreloadArg };