@module-federation/runtime-core 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +19 -0
  2. package/dist/_virtual/_rolldown/runtime.js +18 -0
  3. package/dist/constant.cjs +9 -0
  4. package/dist/constant.cjs.map +1 -0
  5. package/dist/constant.js +7 -0
  6. package/dist/constant.js.map +1 -0
  7. package/dist/core.cjs +153 -0
  8. package/dist/core.cjs.map +1 -0
  9. package/dist/core.d.ts +129 -0
  10. package/dist/core.js +153 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/global.cjs +160 -0
  13. package/dist/global.cjs.map +1 -0
  14. package/dist/global.d.ts +45 -0
  15. package/dist/global.js +142 -0
  16. package/dist/global.js.map +1 -0
  17. package/dist/helpers.cjs +44 -0
  18. package/dist/helpers.cjs.map +1 -0
  19. package/dist/helpers.d.ts +30 -0
  20. package/dist/helpers.js +44 -0
  21. package/dist/helpers.js.map +1 -0
  22. package/dist/index.cjs +60 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +29 -1
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/module/index.cjs +129 -0
  28. package/dist/module/index.cjs.map +1 -0
  29. package/dist/module/index.d.ts +31 -0
  30. package/dist/module/index.js +129 -0
  31. package/dist/module/index.js.map +1 -0
  32. package/dist/plugins/generate-preload-assets.cjs +182 -0
  33. package/dist/plugins/generate-preload-assets.cjs.map +1 -0
  34. package/dist/plugins/generate-preload-assets.js +182 -0
  35. package/dist/plugins/generate-preload-assets.js.map +1 -0
  36. package/dist/plugins/snapshot/SnapshotHandler.cjs +190 -0
  37. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
  38. package/dist/plugins/snapshot/SnapshotHandler.d.ts +66 -0
  39. package/dist/plugins/snapshot/SnapshotHandler.js +189 -0
  40. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
  41. package/dist/plugins/snapshot/index.cjs +63 -0
  42. package/dist/plugins/snapshot/index.cjs.map +1 -0
  43. package/dist/plugins/snapshot/index.js +62 -0
  44. package/dist/plugins/snapshot/index.js.map +1 -0
  45. package/dist/remote/index.cjs +304 -0
  46. package/dist/remote/index.cjs.map +1 -0
  47. package/dist/remote/index.d.ts +119 -0
  48. package/dist/remote/index.js +304 -0
  49. package/dist/remote/index.js.map +1 -0
  50. package/dist/shared/index.cjs +303 -0
  51. package/dist/shared/index.cjs.map +1 -0
  52. package/dist/shared/index.d.ts +82 -0
  53. package/dist/shared/index.js +303 -0
  54. package/dist/shared/index.js.map +1 -0
  55. package/dist/type/config.d.ts +130 -0
  56. package/dist/type/index.cjs +13 -0
  57. package/dist/type/index.cjs.map +1 -0
  58. package/dist/type/index.d.ts +11 -0
  59. package/dist/type/index.js +8 -0
  60. package/dist/type/index.js.map +1 -0
  61. package/dist/type/plugin.d.ts +27 -0
  62. package/dist/type/preload.d.ts +31 -0
  63. package/dist/types.cjs +0 -0
  64. package/dist/types.d.ts +4 -1
  65. package/dist/types.js +1 -0
  66. package/dist/utils/context.cjs +45 -0
  67. package/dist/utils/context.cjs.map +1 -0
  68. package/dist/utils/context.d.ts +1 -0
  69. package/dist/utils/context.js +44 -0
  70. package/dist/utils/context.js.map +1 -0
  71. package/dist/utils/env.cjs +10 -0
  72. package/dist/utils/env.cjs.map +1 -0
  73. package/dist/utils/env.d.ts +1 -0
  74. package/dist/utils/env.js +10 -0
  75. package/dist/utils/env.js.map +1 -0
  76. package/dist/utils/hooks/asyncHook.cjs +23 -0
  77. package/dist/utils/hooks/asyncHook.cjs.map +1 -0
  78. package/dist/utils/hooks/asyncHook.d.ts +10 -0
  79. package/dist/utils/hooks/asyncHook.js +23 -0
  80. package/dist/utils/hooks/asyncHook.js.map +1 -0
  81. package/dist/utils/hooks/asyncWaterfallHooks.cjs +42 -0
  82. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
  83. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
  84. package/dist/utils/hooks/asyncWaterfallHooks.js +42 -0
  85. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
  86. package/dist/utils/hooks/index.cjs +5 -0
  87. package/dist/utils/hooks/index.d.ts +5 -0
  88. package/dist/utils/hooks/index.js +7 -0
  89. package/dist/utils/hooks/pluginSystem.cjs +37 -0
  90. package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
  91. package/dist/utils/hooks/pluginSystem.d.ts +19 -0
  92. package/dist/utils/hooks/pluginSystem.js +37 -0
  93. package/dist/utils/hooks/pluginSystem.js.map +1 -0
  94. package/dist/utils/hooks/syncHook.cjs +36 -0
  95. package/dist/utils/hooks/syncHook.cjs.map +1 -0
  96. package/dist/utils/hooks/syncHook.d.ts +16 -0
  97. package/dist/utils/hooks/syncHook.js +35 -0
  98. package/dist/utils/hooks/syncHook.js.map +1 -0
  99. package/dist/utils/hooks/syncWaterfallHook.cjs +39 -0
  100. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
  101. package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
  102. package/dist/utils/hooks/syncWaterfallHook.js +38 -0
  103. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
  104. package/dist/utils/index.cjs +8 -0
  105. package/dist/utils/index.d.ts +4 -0
  106. package/dist/utils/index.js +9 -0
  107. package/dist/utils/load.cjs +179 -0
  108. package/dist/utils/load.cjs.map +1 -0
  109. package/dist/utils/load.d.ts +14 -0
  110. package/dist/utils/load.js +177 -0
  111. package/dist/utils/load.js.map +1 -0
  112. package/dist/utils/logger.cjs +34 -0
  113. package/dist/utils/logger.cjs.map +1 -0
  114. package/dist/utils/logger.d.ts +10 -0
  115. package/dist/utils/logger.js +31 -0
  116. package/dist/utils/logger.js.map +1 -0
  117. package/dist/utils/manifest.cjs +51 -0
  118. package/dist/utils/manifest.cjs.map +1 -0
  119. package/dist/utils/manifest.d.ts +10 -0
  120. package/dist/utils/manifest.js +49 -0
  121. package/dist/utils/manifest.js.map +1 -0
  122. package/dist/utils/plugin.cjs +27 -0
  123. package/dist/utils/plugin.cjs.map +1 -0
  124. package/dist/utils/plugin.d.ts +1 -0
  125. package/dist/utils/plugin.js +27 -0
  126. package/dist/utils/plugin.js.map +1 -0
  127. package/dist/utils/preload.cjs +146 -0
  128. package/dist/utils/preload.cjs.map +1 -0
  129. package/dist/utils/preload.d.ts +8 -0
  130. package/dist/utils/preload.js +143 -0
  131. package/dist/utils/preload.js.map +1 -0
  132. package/dist/utils/semver/compare.cjs +48 -0
  133. package/dist/utils/semver/compare.cjs.map +1 -0
  134. package/dist/utils/semver/compare.js +47 -0
  135. package/dist/utils/semver/compare.js.map +1 -0
  136. package/dist/utils/semver/constants.cjs +41 -0
  137. package/dist/utils/semver/constants.cjs.map +1 -0
  138. package/dist/utils/semver/constants.js +31 -0
  139. package/dist/utils/semver/constants.js.map +1 -0
  140. package/dist/utils/semver/index.cjs +68 -0
  141. package/dist/utils/semver/index.cjs.map +1 -0
  142. package/dist/utils/semver/index.d.ts +5 -0
  143. package/dist/utils/semver/index.js +68 -0
  144. package/dist/utils/semver/index.js.map +1 -0
  145. package/dist/utils/semver/parser.cjs +104 -0
  146. package/dist/utils/semver/parser.cjs.map +1 -0
  147. package/dist/utils/semver/parser.js +96 -0
  148. package/dist/utils/semver/parser.js.map +1 -0
  149. package/dist/utils/semver/utils.cjs +28 -0
  150. package/dist/utils/semver/utils.cjs.map +1 -0
  151. package/dist/utils/semver/utils.js +24 -0
  152. package/dist/utils/semver/utils.js.map +1 -0
  153. package/dist/utils/share.cjs +284 -0
  154. package/dist/utils/share.cjs.map +1 -0
  155. package/dist/utils/share.d.ts +23 -0
  156. package/dist/utils/share.js +278 -0
  157. package/dist/utils/share.js.map +1 -0
  158. package/dist/utils/tool.cjs +82 -0
  159. package/dist/utils/tool.cjs.map +1 -0
  160. package/dist/utils/tool.d.ts +8 -0
  161. package/dist/utils/tool.js +71 -0
  162. package/dist/utils/tool.js.map +1 -0
  163. package/package.json +16 -9
  164. package/dist/index.cjs.cjs +0 -3442
  165. package/dist/index.cjs.cjs.map +0 -1
  166. package/dist/index.cjs.d.ts +0 -1
  167. package/dist/index.esm.js +0 -3418
  168. package/dist/index.esm.js.map +0 -1
  169. package/dist/src/constant.d.ts +0 -2
  170. package/dist/src/core.d.ts +0 -119
  171. package/dist/src/global.d.ts +0 -42
  172. package/dist/src/helpers.d.ts +0 -38
  173. package/dist/src/index.d.ts +0 -14
  174. package/dist/src/module/index.d.ts +0 -25
  175. package/dist/src/plugins/generate-preload-assets.d.ts +0 -8
  176. package/dist/src/plugins/snapshot/SnapshotHandler.d.ts +0 -60
  177. package/dist/src/plugins/snapshot/index.d.ts +0 -5
  178. package/dist/src/remote/index.d.ts +0 -109
  179. package/dist/src/shared/index.d.ts +0 -75
  180. package/dist/src/type/config.d.ts +0 -128
  181. package/dist/src/type/index.d.ts +0 -3
  182. package/dist/src/type/plugin.d.ts +0 -35
  183. package/dist/src/type/preload.d.ts +0 -26
  184. package/dist/src/types.d.ts +0 -1
  185. package/dist/src/utils/env.d.ts +0 -3
  186. package/dist/src/utils/hooks/asyncHook.d.ts +0 -6
  187. package/dist/src/utils/hooks/asyncWaterfallHooks.d.ts +0 -10
  188. package/dist/src/utils/hooks/index.d.ts +0 -6
  189. package/dist/src/utils/hooks/pluginSystem.d.ts +0 -16
  190. package/dist/src/utils/hooks/syncHook.d.ts +0 -12
  191. package/dist/src/utils/hooks/syncWaterfallHook.d.ts +0 -9
  192. package/dist/src/utils/index.d.ts +0 -6
  193. package/dist/src/utils/load.d.ts +0 -11
  194. package/dist/src/utils/logger.d.ts +0 -6
  195. package/dist/src/utils/manifest.d.ts +0 -7
  196. package/dist/src/utils/plugin.d.ts +0 -3
  197. package/dist/src/utils/preload.d.ts +0 -6
  198. package/dist/src/utils/semver/compare.d.ts +0 -9
  199. package/dist/src/utils/semver/constants.d.ts +0 -10
  200. package/dist/src/utils/semver/index.d.ts +0 -2
  201. package/dist/src/utils/semver/parser.d.ts +0 -9
  202. package/dist/src/utils/semver/utils.d.ts +0 -11
  203. package/dist/src/utils/share.d.ts +0 -45
  204. package/dist/src/utils/tool.d.ts +0 -18
  205. package/dist/types.cjs.cjs +0 -3
  206. package/dist/types.cjs.cjs.map +0 -1
  207. package/dist/types.cjs.d.ts +0 -1
  208. package/dist/types.esm.js +0 -2
  209. package/dist/types.esm.js.map +0 -1
@@ -0,0 +1,182 @@
1
+ import { arrayOptions, getFMId, getRemoteEntryInfoFromSnapshot, isPureRemoteEntry, isRemoteInfoWithEntry } from "../utils/tool.js";
2
+ import { getInfoWithoutType, getPreloaded, setPreloaded } from "../global.js";
3
+ import { getRegisteredShare } from "../utils/share.js";
4
+ import "../utils/index.js";
5
+ import { defaultPreloadArgs, normalizePreloadExposes } from "../utils/preload.js";
6
+ import { assignRemoteInfo } from "./snapshot/index.js";
7
+ import { getResourceUrl, isBrowserEnvValue, isManifestProvider } from "@module-federation/sdk";
8
+
9
+ //#region src/plugins/generate-preload-assets.ts
10
+ function splitId(id) {
11
+ const splitInfo = id.split(":");
12
+ if (splitInfo.length === 1) return {
13
+ name: splitInfo[0],
14
+ version: void 0
15
+ };
16
+ else if (splitInfo.length === 2) return {
17
+ name: splitInfo[0],
18
+ version: splitInfo[1]
19
+ };
20
+ else return {
21
+ name: splitInfo[1],
22
+ version: splitInfo[2]
23
+ };
24
+ }
25
+ function traverseModuleInfo(globalSnapshot, remoteInfo, traverse, isRoot, memo = {}, remoteSnapshot) {
26
+ const { value: snapshotValue } = getInfoWithoutType(globalSnapshot, getFMId(remoteInfo));
27
+ const effectiveRemoteSnapshot = remoteSnapshot || snapshotValue;
28
+ if (effectiveRemoteSnapshot && !isManifestProvider(effectiveRemoteSnapshot)) {
29
+ traverse(effectiveRemoteSnapshot, remoteInfo, isRoot);
30
+ if (effectiveRemoteSnapshot.remotesInfo) {
31
+ const remoteKeys = Object.keys(effectiveRemoteSnapshot.remotesInfo);
32
+ for (const key of remoteKeys) {
33
+ if (memo[key]) continue;
34
+ memo[key] = true;
35
+ const subRemoteInfo = splitId(key);
36
+ const remoteValue = effectiveRemoteSnapshot.remotesInfo[key];
37
+ traverseModuleInfo(globalSnapshot, {
38
+ name: subRemoteInfo.name,
39
+ version: remoteValue.matchedVersion
40
+ }, traverse, false, memo, void 0);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ const isExisted = (type, url) => {
46
+ return document.querySelector(`${type}[${type === "link" ? "href" : "src"}="${url}"]`);
47
+ };
48
+ function generatePreloadAssets(origin, preloadOptions, remote, globalSnapshot, remoteSnapshot) {
49
+ const cssAssets = [];
50
+ const jsAssets = [];
51
+ const entryAssets = [];
52
+ const loadedSharedJsAssets = /* @__PURE__ */ new Set();
53
+ const loadedSharedCssAssets = /* @__PURE__ */ new Set();
54
+ const { options } = origin;
55
+ const { preloadConfig: rootPreloadConfig } = preloadOptions;
56
+ const { depsRemote } = rootPreloadConfig;
57
+ traverseModuleInfo(globalSnapshot, remote, (moduleInfoSnapshot, remoteInfo, isRoot) => {
58
+ let preloadConfig;
59
+ if (isRoot) preloadConfig = rootPreloadConfig;
60
+ else if (Array.isArray(depsRemote)) {
61
+ const findPreloadConfig = depsRemote.find((remoteConfig) => {
62
+ if (remoteConfig.nameOrAlias === remoteInfo.name || remoteConfig.nameOrAlias === remoteInfo.alias) return true;
63
+ return false;
64
+ });
65
+ if (!findPreloadConfig) return;
66
+ preloadConfig = defaultPreloadArgs(findPreloadConfig);
67
+ } else if (depsRemote === true) preloadConfig = rootPreloadConfig;
68
+ else return;
69
+ const remoteEntryUrl = getResourceUrl(moduleInfoSnapshot, getRemoteEntryInfoFromSnapshot(moduleInfoSnapshot).url);
70
+ if (remoteEntryUrl) entryAssets.push({
71
+ name: remoteInfo.name,
72
+ moduleInfo: {
73
+ name: remoteInfo.name,
74
+ entry: remoteEntryUrl,
75
+ type: "remoteEntryType" in moduleInfoSnapshot ? moduleInfoSnapshot.remoteEntryType : "global",
76
+ entryGlobalName: "globalName" in moduleInfoSnapshot ? moduleInfoSnapshot.globalName : remoteInfo.name,
77
+ shareScope: "",
78
+ version: "version" in moduleInfoSnapshot ? moduleInfoSnapshot.version : void 0
79
+ },
80
+ url: remoteEntryUrl
81
+ });
82
+ let moduleAssetsInfo = "modules" in moduleInfoSnapshot ? moduleInfoSnapshot.modules : [];
83
+ const normalizedPreloadExposes = normalizePreloadExposes(preloadConfig.exposes);
84
+ if (normalizedPreloadExposes.length && "modules" in moduleInfoSnapshot) moduleAssetsInfo = moduleInfoSnapshot?.modules?.reduce((assets, moduleAssetInfo) => {
85
+ if (normalizedPreloadExposes?.indexOf(moduleAssetInfo.moduleName) !== -1) assets.push(moduleAssetInfo);
86
+ return assets;
87
+ }, []);
88
+ function handleAssets(assets) {
89
+ const assetsRes = assets.map((asset) => getResourceUrl(moduleInfoSnapshot, asset));
90
+ if (preloadConfig.filter) return assetsRes.filter(preloadConfig.filter);
91
+ return assetsRes;
92
+ }
93
+ if (moduleAssetsInfo) {
94
+ const assetsLength = moduleAssetsInfo.length;
95
+ for (let index = 0; index < assetsLength; index++) {
96
+ const assetsInfo = moduleAssetsInfo[index];
97
+ const exposeFullPath = `${remoteInfo.name}/${assetsInfo.moduleName}`;
98
+ origin.remoteHandler.hooks.lifecycle.handlePreloadModule.emit({
99
+ id: assetsInfo.moduleName === "." ? remoteInfo.name : exposeFullPath,
100
+ name: remoteInfo.name,
101
+ remoteSnapshot: moduleInfoSnapshot,
102
+ preloadConfig,
103
+ remote: remoteInfo,
104
+ origin
105
+ });
106
+ if (getPreloaded(exposeFullPath)) continue;
107
+ if (preloadConfig.resourceCategory === "all") {
108
+ cssAssets.push(...handleAssets(assetsInfo.assets.css.async));
109
+ cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));
110
+ jsAssets.push(...handleAssets(assetsInfo.assets.js.async));
111
+ jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));
112
+ } else if (preloadConfig.resourceCategory === "sync") {
113
+ cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));
114
+ jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));
115
+ }
116
+ setPreloaded(exposeFullPath);
117
+ }
118
+ }
119
+ }, true, {}, remoteSnapshot);
120
+ if (remoteSnapshot.shared && remoteSnapshot.shared.length > 0) {
121
+ const collectSharedAssets = (shareInfo, snapshotShared) => {
122
+ const { shared: registeredShared } = getRegisteredShare(origin.shareScopeMap, snapshotShared.sharedName, shareInfo, origin.sharedHandler.hooks.lifecycle.resolveShare) || {};
123
+ if (registeredShared && typeof registeredShared.lib === "function") {
124
+ snapshotShared.assets.js.sync.forEach((asset) => {
125
+ loadedSharedJsAssets.add(asset);
126
+ });
127
+ snapshotShared.assets.css.sync.forEach((asset) => {
128
+ loadedSharedCssAssets.add(asset);
129
+ });
130
+ }
131
+ };
132
+ remoteSnapshot.shared.forEach((shared) => {
133
+ const shareInfos = options.shared?.[shared.sharedName];
134
+ if (!shareInfos) return;
135
+ const sharedOptions = shared.version ? shareInfos.find((s) => s.version === shared.version) : shareInfos;
136
+ if (!sharedOptions) return;
137
+ arrayOptions(sharedOptions).forEach((s) => {
138
+ collectSharedAssets(s, shared);
139
+ });
140
+ });
141
+ }
142
+ const needPreloadJsAssets = jsAssets.filter((asset) => !loadedSharedJsAssets.has(asset) && !isExisted("script", asset));
143
+ return {
144
+ cssAssets: cssAssets.filter((asset) => !loadedSharedCssAssets.has(asset) && !isExisted("link", asset)),
145
+ jsAssetsWithoutEntry: needPreloadJsAssets,
146
+ entryAssets: entryAssets.filter((entry) => !isExisted("script", entry.url))
147
+ };
148
+ }
149
+ const generatePreloadAssetsPlugin = function() {
150
+ return {
151
+ name: "generate-preload-assets-plugin",
152
+ async generatePreloadAssets(args) {
153
+ const { origin, preloadOptions, remoteInfo, remote, globalSnapshot, remoteSnapshot } = args;
154
+ if (!isBrowserEnvValue) return {
155
+ cssAssets: [],
156
+ jsAssetsWithoutEntry: [],
157
+ entryAssets: []
158
+ };
159
+ if (isRemoteInfoWithEntry(remote) && isPureRemoteEntry(remote)) return {
160
+ cssAssets: [],
161
+ jsAssetsWithoutEntry: [],
162
+ entryAssets: [{
163
+ name: remote.name,
164
+ url: remote.entry,
165
+ moduleInfo: {
166
+ name: remoteInfo.name,
167
+ entry: remote.entry,
168
+ type: remoteInfo.type || "global",
169
+ entryGlobalName: "",
170
+ shareScope: ""
171
+ }
172
+ }]
173
+ };
174
+ assignRemoteInfo(remoteInfo, remoteSnapshot);
175
+ return generatePreloadAssets(origin, preloadOptions, remoteInfo, globalSnapshot, remoteSnapshot);
176
+ }
177
+ };
178
+ };
179
+
180
+ //#endregion
181
+ export { generatePreloadAssetsPlugin };
182
+ //# sourceMappingURL=generate-preload-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-preload-assets.js","names":[],"sources":["../../src/plugins/generate-preload-assets.ts"],"sourcesContent":["import {\n GlobalModuleInfo,\n ModuleInfo,\n ProviderModuleInfo,\n isManifestProvider,\n getResourceUrl,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport {\n EntryAssets,\n ModuleFederationRuntimePlugin,\n PreloadAssets,\n PreloadConfig,\n PreloadOptions,\n RemoteInfoOptionalVersion,\n Shared,\n Remote,\n} from '../type';\nimport { assignRemoteInfo } from './snapshot';\nimport { getInfoWithoutType, getPreloaded, setPreloaded } from '../global';\nimport { ModuleFederation } from '../core';\nimport { defaultPreloadArgs, normalizePreloadExposes } from '../utils/preload';\nimport { getRegisteredShare } from '../utils/share';\nimport {\n arrayOptions,\n getFMId,\n getRemoteEntryInfoFromSnapshot,\n isPureRemoteEntry,\n isRemoteInfoWithEntry,\n} from '../utils';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __INIT_VMOK_DEPLOY_GLOBAL_DATA__: boolean | undefined;\n}\n\n// name\n// name:version\nfunction splitId(id: string): {\n name: string;\n version: string | undefined;\n} {\n const splitInfo = id.split(':');\n if (splitInfo.length === 1) {\n return {\n name: splitInfo[0],\n version: undefined,\n };\n } else if (splitInfo.length === 2) {\n return {\n name: splitInfo[0],\n version: splitInfo[1],\n };\n } else {\n return {\n name: splitInfo[1],\n version: splitInfo[2],\n };\n }\n}\n\n// Traverse all nodes in moduleInfo and traverse the entire snapshot\nfunction traverseModuleInfo(\n globalSnapshot: GlobalModuleInfo,\n remoteInfo: RemoteInfoOptionalVersion,\n traverse: (\n snapshotInfo: ModuleInfo,\n remoteInfo: RemoteInfoOptionalVersion,\n isRoot: boolean,\n ) => void,\n isRoot: boolean,\n memo: Record<string, boolean> = {},\n remoteSnapshot?: ModuleInfo,\n): void {\n const id = getFMId(remoteInfo);\n const { value: snapshotValue } = getInfoWithoutType(globalSnapshot, id);\n const effectiveRemoteSnapshot = remoteSnapshot || snapshotValue;\n if (effectiveRemoteSnapshot && !isManifestProvider(effectiveRemoteSnapshot)) {\n traverse(effectiveRemoteSnapshot, remoteInfo, isRoot);\n if (effectiveRemoteSnapshot.remotesInfo) {\n const remoteKeys = Object.keys(effectiveRemoteSnapshot.remotesInfo);\n for (const key of remoteKeys) {\n if (memo[key]) {\n continue;\n }\n memo[key] = true;\n const subRemoteInfo = splitId(key);\n const remoteValue = effectiveRemoteSnapshot.remotesInfo[key];\n traverseModuleInfo(\n globalSnapshot,\n {\n name: subRemoteInfo.name,\n version: remoteValue.matchedVersion,\n },\n traverse,\n false,\n memo,\n undefined,\n );\n }\n }\n }\n}\n\nconst isExisted = (type: 'link' | 'script', url: string) => {\n return document.querySelector(\n `${type}[${type === 'link' ? 'href' : 'src'}=\"${url}\"]`,\n );\n};\n\n// eslint-disable-next-line max-lines-per-function\nexport function generatePreloadAssets(\n origin: ModuleFederation,\n preloadOptions: PreloadOptions[number],\n remote: RemoteInfoOptionalVersion,\n globalSnapshot: GlobalModuleInfo,\n remoteSnapshot: ModuleInfo,\n): PreloadAssets {\n const cssAssets: Array<string> = [];\n const jsAssets: Array<string> = [];\n const entryAssets: Array<EntryAssets> = [];\n const loadedSharedJsAssets = new Set();\n const loadedSharedCssAssets = new Set();\n const { options } = origin;\n\n const { preloadConfig: rootPreloadConfig } = preloadOptions;\n const { depsRemote } = rootPreloadConfig;\n const memo = {};\n traverseModuleInfo(\n globalSnapshot,\n remote,\n (moduleInfoSnapshot: ModuleInfo, remoteInfo, isRoot) => {\n let preloadConfig: PreloadConfig;\n if (isRoot) {\n preloadConfig = rootPreloadConfig;\n } else {\n if (Array.isArray(depsRemote)) {\n // eslint-disable-next-line array-callback-return\n const findPreloadConfig = depsRemote.find((remoteConfig) => {\n if (\n remoteConfig.nameOrAlias === remoteInfo.name ||\n remoteConfig.nameOrAlias === remoteInfo.alias\n ) {\n return true;\n }\n return false;\n });\n if (!findPreloadConfig) {\n return;\n }\n preloadConfig = defaultPreloadArgs(findPreloadConfig);\n } else if (depsRemote === true) {\n preloadConfig = rootPreloadConfig;\n } else {\n return;\n }\n }\n\n const remoteEntryUrl = getResourceUrl(\n moduleInfoSnapshot,\n getRemoteEntryInfoFromSnapshot(moduleInfoSnapshot).url,\n );\n\n if (remoteEntryUrl) {\n entryAssets.push({\n name: remoteInfo.name,\n moduleInfo: {\n name: remoteInfo.name,\n entry: remoteEntryUrl,\n type:\n 'remoteEntryType' in moduleInfoSnapshot\n ? moduleInfoSnapshot.remoteEntryType\n : 'global',\n entryGlobalName:\n 'globalName' in moduleInfoSnapshot\n ? moduleInfoSnapshot.globalName\n : remoteInfo.name,\n shareScope: '',\n version:\n 'version' in moduleInfoSnapshot\n ? moduleInfoSnapshot.version\n : undefined,\n },\n url: remoteEntryUrl,\n });\n }\n\n let moduleAssetsInfo: NonNullable<ProviderModuleInfo['modules']> =\n 'modules' in moduleInfoSnapshot ? moduleInfoSnapshot.modules : [];\n const normalizedPreloadExposes = normalizePreloadExposes(\n preloadConfig.exposes,\n );\n if (normalizedPreloadExposes.length && 'modules' in moduleInfoSnapshot) {\n moduleAssetsInfo = moduleInfoSnapshot?.modules?.reduce(\n (assets, moduleAssetInfo) => {\n if (\n normalizedPreloadExposes?.indexOf(moduleAssetInfo.moduleName) !==\n -1\n ) {\n assets.push(moduleAssetInfo);\n }\n return assets;\n },\n [] as NonNullable<(typeof moduleInfoSnapshot)['modules']>,\n );\n }\n\n function handleAssets(assets: string[]): string[] {\n const assetsRes = assets.map((asset) =>\n getResourceUrl(moduleInfoSnapshot, asset),\n );\n if (preloadConfig.filter) {\n return assetsRes.filter(preloadConfig.filter);\n }\n return assetsRes;\n }\n\n if (moduleAssetsInfo) {\n const assetsLength = moduleAssetsInfo.length;\n for (let index = 0; index < assetsLength; index++) {\n const assetsInfo = moduleAssetsInfo[index];\n const exposeFullPath = `${remoteInfo.name}/${assetsInfo.moduleName}`;\n origin.remoteHandler.hooks.lifecycle.handlePreloadModule.emit({\n id:\n assetsInfo.moduleName === '.' ? remoteInfo.name : exposeFullPath,\n name: remoteInfo.name,\n remoteSnapshot: moduleInfoSnapshot,\n preloadConfig,\n remote: remoteInfo as Remote,\n origin,\n });\n const preloaded = getPreloaded(exposeFullPath);\n if (preloaded) {\n continue;\n }\n\n if (preloadConfig.resourceCategory === 'all') {\n cssAssets.push(...handleAssets(assetsInfo.assets.css.async));\n cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));\n jsAssets.push(...handleAssets(assetsInfo.assets.js.async));\n jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));\n } else if (preloadConfig.resourceCategory === 'sync') {\n cssAssets.push(...handleAssets(assetsInfo.assets.css.sync));\n jsAssets.push(...handleAssets(assetsInfo.assets.js.sync));\n }\n\n setPreloaded(exposeFullPath);\n }\n }\n },\n true,\n memo,\n remoteSnapshot,\n );\n\n if (remoteSnapshot.shared && remoteSnapshot.shared.length > 0) {\n const collectSharedAssets = (\n shareInfo: Shared,\n snapshotShared: ModuleInfo['shared'][0],\n ) => {\n const { shared: registeredShared } =\n getRegisteredShare(\n origin.shareScopeMap,\n snapshotShared.sharedName,\n shareInfo,\n origin.sharedHandler.hooks.lifecycle.resolveShare,\n ) || {};\n // If the global share does not exist, or the lib function does not exist, it means that the shared has not been loaded yet and can be preloaded.\n\n if (registeredShared && typeof registeredShared.lib === 'function') {\n snapshotShared.assets.js.sync.forEach((asset) => {\n loadedSharedJsAssets.add(asset);\n });\n snapshotShared.assets.css.sync.forEach((asset) => {\n loadedSharedCssAssets.add(asset);\n });\n }\n };\n remoteSnapshot.shared.forEach((shared) => {\n const shareInfos = options.shared?.[shared.sharedName];\n if (!shareInfos) {\n return;\n }\n // if no version, preload all shared\n const sharedOptions = shared.version\n ? shareInfos.find((s) => s.version === shared.version)\n : shareInfos;\n\n if (!sharedOptions) {\n return;\n }\n const arrayShareInfo = arrayOptions(sharedOptions);\n arrayShareInfo.forEach((s) => {\n collectSharedAssets(s, shared);\n });\n });\n }\n\n const needPreloadJsAssets = jsAssets.filter(\n (asset) => !loadedSharedJsAssets.has(asset) && !isExisted('script', asset),\n );\n const needPreloadCssAssets = cssAssets.filter(\n (asset) => !loadedSharedCssAssets.has(asset) && !isExisted('link', asset),\n );\n\n return {\n cssAssets: needPreloadCssAssets,\n jsAssetsWithoutEntry: needPreloadJsAssets,\n entryAssets: entryAssets.filter((entry) => !isExisted('script', entry.url)),\n };\n}\n\nexport const generatePreloadAssetsPlugin: () => ModuleFederationRuntimePlugin =\n function () {\n return {\n name: 'generate-preload-assets-plugin',\n async generatePreloadAssets(args) {\n const {\n origin,\n preloadOptions,\n remoteInfo,\n remote,\n globalSnapshot,\n remoteSnapshot,\n } = args;\n if (!isBrowserEnvValue) {\n return {\n cssAssets: [],\n jsAssetsWithoutEntry: [],\n entryAssets: [],\n };\n }\n\n if (isRemoteInfoWithEntry(remote) && isPureRemoteEntry(remote)) {\n return {\n cssAssets: [],\n jsAssetsWithoutEntry: [],\n entryAssets: [\n {\n name: remote.name,\n url: remote.entry,\n moduleInfo: {\n name: remoteInfo.name,\n entry: remote.entry,\n type: remoteInfo.type || 'global',\n entryGlobalName: '',\n shareScope: '',\n },\n },\n ],\n };\n }\n\n assignRemoteInfo(remoteInfo, remoteSnapshot);\n\n const assets = generatePreloadAssets(\n origin,\n preloadOptions,\n remoteInfo,\n globalSnapshot,\n remoteSnapshot,\n );\n\n return assets;\n },\n };\n };\n"],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ const require_logger = require('../../utils/logger.cjs');
2
+ const require_tool = require('../../utils/tool.cjs');
3
+ const require_global = require('../../global.cjs');
4
+ const require_context = require('../../utils/context.cjs');
5
+ require('../../utils/index.cjs');
6
+ const require_asyncHook = require('../../utils/hooks/asyncHook.cjs');
7
+ const require_asyncWaterfallHooks = require('../../utils/hooks/asyncWaterfallHooks.cjs');
8
+ const require_pluginSystem = require('../../utils/hooks/pluginSystem.cjs');
9
+ require('../../utils/hooks/index.cjs');
10
+ let _module_federation_sdk = require("@module-federation/sdk");
11
+ let _module_federation_error_codes = require("@module-federation/error-codes");
12
+
13
+ //#region src/plugins/snapshot/SnapshotHandler.ts
14
+ function getGlobalRemoteInfo(moduleInfo, origin) {
15
+ const hostGlobalSnapshot = require_global.getGlobalSnapshotInfoByModuleInfo({
16
+ name: origin.name,
17
+ version: origin.options.version
18
+ });
19
+ const globalRemoteInfo = hostGlobalSnapshot && "remotesInfo" in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && require_global.getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;
20
+ if (globalRemoteInfo && globalRemoteInfo.matchedVersion) return {
21
+ hostGlobalSnapshot,
22
+ globalSnapshot: require_global.getGlobalSnapshot(),
23
+ remoteSnapshot: require_global.getGlobalSnapshotInfoByModuleInfo({
24
+ name: moduleInfo.name,
25
+ version: globalRemoteInfo.matchedVersion
26
+ })
27
+ };
28
+ return {
29
+ hostGlobalSnapshot: void 0,
30
+ globalSnapshot: require_global.getGlobalSnapshot(),
31
+ remoteSnapshot: require_global.getGlobalSnapshotInfoByModuleInfo({
32
+ name: moduleInfo.name,
33
+ version: "version" in moduleInfo ? moduleInfo.version : void 0
34
+ })
35
+ };
36
+ }
37
+ var SnapshotHandler = class {
38
+ constructor(HostInstance) {
39
+ this.loadingHostSnapshot = null;
40
+ this.manifestCache = /* @__PURE__ */ new Map();
41
+ this.hooks = new require_pluginSystem.PluginSystem({
42
+ beforeLoadRemoteSnapshot: new require_asyncHook.AsyncHook("beforeLoadRemoteSnapshot"),
43
+ loadSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("loadGlobalSnapshot"),
44
+ loadRemoteSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("loadRemoteSnapshot"),
45
+ afterLoadSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("afterLoadSnapshot")
46
+ });
47
+ this.manifestLoading = require_global.Global.__FEDERATION__.__MANIFEST_LOADING__;
48
+ this.HostInstance = HostInstance;
49
+ this.loaderHook = HostInstance.loaderHook;
50
+ }
51
+ async loadRemoteSnapshotInfo({ moduleInfo, id, expose }) {
52
+ const { options } = this.HostInstance;
53
+ await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({
54
+ options,
55
+ moduleInfo
56
+ });
57
+ let hostSnapshot = require_global.getGlobalSnapshotInfoByModuleInfo({
58
+ name: this.HostInstance.options.name,
59
+ version: this.HostInstance.options.version
60
+ });
61
+ if (!hostSnapshot) {
62
+ hostSnapshot = {
63
+ version: this.HostInstance.options.version || "",
64
+ remoteEntry: "",
65
+ remotesInfo: {}
66
+ };
67
+ require_global.addGlobalSnapshot({ [this.HostInstance.options.name]: hostSnapshot });
68
+ }
69
+ if (hostSnapshot && "remotesInfo" in hostSnapshot && !require_global.getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name).value) {
70
+ if ("version" in moduleInfo || "entry" in moduleInfo) hostSnapshot.remotesInfo = {
71
+ ...hostSnapshot?.remotesInfo,
72
+ [moduleInfo.name]: { matchedVersion: "version" in moduleInfo ? moduleInfo.version : moduleInfo.entry }
73
+ };
74
+ }
75
+ const { hostGlobalSnapshot, remoteSnapshot, globalSnapshot } = this.getGlobalRemoteInfo(moduleInfo);
76
+ const { remoteSnapshot: globalRemoteSnapshot, globalSnapshot: globalSnapshotRes } = await this.hooks.lifecycle.loadSnapshot.emit({
77
+ options,
78
+ moduleInfo,
79
+ hostGlobalSnapshot,
80
+ remoteSnapshot,
81
+ globalSnapshot
82
+ });
83
+ let mSnapshot;
84
+ let gSnapshot;
85
+ if (globalRemoteSnapshot) if ((0, _module_federation_sdk.isManifestProvider)(globalRemoteSnapshot)) {
86
+ const remoteEntry = _module_federation_sdk.isBrowserEnvValue ? globalRemoteSnapshot.remoteEntry : globalRemoteSnapshot.ssrRemoteEntry || globalRemoteSnapshot.remoteEntry || "";
87
+ const moduleSnapshot = await this.getManifestJson(remoteEntry, moduleInfo, {});
88
+ const globalSnapshotRes = require_global.setGlobalSnapshotInfoByModuleInfo({
89
+ ...moduleInfo,
90
+ entry: remoteEntry
91
+ }, moduleSnapshot);
92
+ mSnapshot = moduleSnapshot;
93
+ gSnapshot = globalSnapshotRes;
94
+ } else {
95
+ const { remoteSnapshot: remoteSnapshotRes } = await this.hooks.lifecycle.loadRemoteSnapshot.emit({
96
+ options: this.HostInstance.options,
97
+ moduleInfo,
98
+ remoteSnapshot: globalRemoteSnapshot,
99
+ from: "global"
100
+ });
101
+ mSnapshot = remoteSnapshotRes;
102
+ gSnapshot = globalSnapshotRes;
103
+ }
104
+ else if (require_tool.isRemoteInfoWithEntry(moduleInfo)) {
105
+ const moduleSnapshot = await this.getManifestJson(moduleInfo.entry, moduleInfo, {});
106
+ const globalSnapshotRes = require_global.setGlobalSnapshotInfoByModuleInfo(moduleInfo, moduleSnapshot);
107
+ const { remoteSnapshot: remoteSnapshotRes } = await this.hooks.lifecycle.loadRemoteSnapshot.emit({
108
+ options: this.HostInstance.options,
109
+ moduleInfo,
110
+ remoteSnapshot: moduleSnapshot,
111
+ from: "global"
112
+ });
113
+ mSnapshot = remoteSnapshotRes;
114
+ gSnapshot = globalSnapshotRes;
115
+ } else require_logger.error(_module_federation_error_codes.RUNTIME_007, _module_federation_error_codes.runtimeDescMap, {
116
+ remoteName: moduleInfo.name,
117
+ remoteVersion: moduleInfo.version,
118
+ hostName: this.HostInstance.options.name,
119
+ globalSnapshot: JSON.stringify(globalSnapshotRes)
120
+ }, void 0, require_context.optionsToMFContext(this.HostInstance.options));
121
+ await this.hooks.lifecycle.afterLoadSnapshot.emit({
122
+ id,
123
+ host: this.HostInstance,
124
+ options,
125
+ moduleInfo,
126
+ remoteSnapshot: mSnapshot
127
+ });
128
+ return {
129
+ remoteSnapshot: mSnapshot,
130
+ globalSnapshot: gSnapshot
131
+ };
132
+ }
133
+ getGlobalRemoteInfo(moduleInfo) {
134
+ return getGlobalRemoteInfo(moduleInfo, this.HostInstance);
135
+ }
136
+ async getManifestJson(manifestUrl, moduleInfo, extraOptions) {
137
+ const getManifest = async () => {
138
+ let manifestJson = this.manifestCache.get(manifestUrl);
139
+ if (manifestJson) return manifestJson;
140
+ try {
141
+ let res = await this.loaderHook.lifecycle.fetch.emit(manifestUrl, {});
142
+ if (!res || !(res instanceof Response)) res = await fetch(manifestUrl, {});
143
+ manifestJson = await res.json();
144
+ } catch (err) {
145
+ manifestJson = await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
146
+ id: manifestUrl,
147
+ error: err,
148
+ from: "runtime",
149
+ lifecycle: "afterResolve",
150
+ origin: this.HostInstance
151
+ });
152
+ if (!manifestJson) {
153
+ delete this.manifestLoading[manifestUrl];
154
+ require_logger.error(_module_federation_error_codes.RUNTIME_003, _module_federation_error_codes.runtimeDescMap, {
155
+ manifestUrl,
156
+ moduleName: moduleInfo.name,
157
+ hostName: this.HostInstance.options.name
158
+ }, `${err}`, require_context.optionsToMFContext(this.HostInstance.options));
159
+ }
160
+ }
161
+ require_logger.assert(manifestJson.metaData && manifestJson.exposes && manifestJson.shared, `"${manifestUrl}" is not a valid federation manifest for remote "${moduleInfo.name}". Missing required fields: ${[
162
+ !manifestJson.metaData && "metaData",
163
+ !manifestJson.exposes && "exposes",
164
+ !manifestJson.shared && "shared"
165
+ ].filter(Boolean).join(", ")}.`);
166
+ this.manifestCache.set(manifestUrl, manifestJson);
167
+ return manifestJson;
168
+ };
169
+ const asyncLoadProcess = async () => {
170
+ const manifestJson = await getManifest();
171
+ const remoteSnapshot = (0, _module_federation_sdk.generateSnapshotFromManifest)(manifestJson, { version: manifestUrl });
172
+ const { remoteSnapshot: remoteSnapshotRes } = await this.hooks.lifecycle.loadRemoteSnapshot.emit({
173
+ options: this.HostInstance.options,
174
+ moduleInfo,
175
+ manifestJson,
176
+ remoteSnapshot,
177
+ manifestUrl,
178
+ from: "manifest"
179
+ });
180
+ return remoteSnapshotRes;
181
+ };
182
+ if (!this.manifestLoading[manifestUrl]) this.manifestLoading[manifestUrl] = asyncLoadProcess().then((res) => res);
183
+ return this.manifestLoading[manifestUrl];
184
+ }
185
+ };
186
+
187
+ //#endregion
188
+ exports.SnapshotHandler = SnapshotHandler;
189
+ exports.getGlobalRemoteInfo = getGlobalRemoteInfo;
190
+ //# sourceMappingURL=SnapshotHandler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnapshotHandler.cjs","names":["getGlobalSnapshotInfoByModuleInfo","getInfoWithoutType","getGlobalSnapshot","PluginSystem","AsyncHook","AsyncWaterfallHook","Global","isBrowserEnvValue","setGlobalSnapshotInfoByModuleInfo","isRemoteInfoWithEntry","RUNTIME_007","runtimeDescMap","optionsToMFContext","RUNTIME_003"],"sources":["../../../src/plugins/snapshot/SnapshotHandler.ts"],"sourcesContent":["import {\n GlobalModuleInfo,\n Manifest,\n ModuleInfo,\n generateSnapshotFromManifest,\n isManifestProvider,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport {\n RUNTIME_003,\n RUNTIME_007,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Options, Remote } from '../../type';\nimport { isRemoteInfoWithEntry, error, optionsToMFContext } from '../../utils';\nimport {\n getGlobalSnapshot,\n setGlobalSnapshotInfoByModuleInfo,\n Global,\n addGlobalSnapshot,\n getGlobalSnapshotInfoByModuleInfo,\n getInfoWithoutType,\n} from '../../global';\nimport { PluginSystem, AsyncHook, AsyncWaterfallHook } from '../../utils/hooks';\nimport { ModuleFederation } from '../../core';\nimport { assert } from '../../utils/logger';\n\nexport function getGlobalRemoteInfo(\n moduleInfo: Remote,\n origin: ModuleFederation,\n): {\n hostGlobalSnapshot: ModuleInfo | undefined;\n globalSnapshot: ReturnType<typeof getGlobalSnapshot>;\n remoteSnapshot: GlobalModuleInfo[string] | undefined;\n} {\n const hostGlobalSnapshot = getGlobalSnapshotInfoByModuleInfo({\n name: origin.name,\n version: origin.options.version,\n });\n\n // get remote detail info from global\n const globalRemoteInfo =\n hostGlobalSnapshot &&\n 'remotesInfo' in hostGlobalSnapshot &&\n hostGlobalSnapshot.remotesInfo &&\n getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;\n\n if (globalRemoteInfo && globalRemoteInfo.matchedVersion) {\n return {\n hostGlobalSnapshot,\n globalSnapshot: getGlobalSnapshot(),\n remoteSnapshot: getGlobalSnapshotInfoByModuleInfo({\n name: moduleInfo.name,\n version: globalRemoteInfo.matchedVersion,\n }),\n };\n }\n\n return {\n hostGlobalSnapshot: undefined,\n globalSnapshot: getGlobalSnapshot(),\n remoteSnapshot: getGlobalSnapshotInfoByModuleInfo({\n name: moduleInfo.name,\n version: 'version' in moduleInfo ? moduleInfo.version : undefined,\n }),\n };\n}\n\nexport class SnapshotHandler {\n loadingHostSnapshot: Promise<GlobalModuleInfo | void> | null = null;\n HostInstance: ModuleFederation;\n manifestCache: Map<string, Manifest> = new Map();\n hooks = new PluginSystem({\n beforeLoadRemoteSnapshot: new AsyncHook<\n [\n {\n options: Options;\n moduleInfo: Remote;\n },\n ],\n void\n >('beforeLoadRemoteSnapshot'),\n loadSnapshot: new AsyncWaterfallHook<{\n options: Options;\n moduleInfo: Remote;\n hostGlobalSnapshot: GlobalModuleInfo[string] | undefined;\n globalSnapshot: ReturnType<typeof getGlobalSnapshot>;\n remoteSnapshot?: GlobalModuleInfo[string] | undefined;\n }>('loadGlobalSnapshot'),\n loadRemoteSnapshot: new AsyncWaterfallHook<{\n options: Options;\n moduleInfo: Remote;\n manifestJson?: Manifest;\n manifestUrl?: string;\n remoteSnapshot: ModuleInfo;\n from: 'global' | 'manifest';\n }>('loadRemoteSnapshot'),\n afterLoadSnapshot: new AsyncWaterfallHook<{\n id?: string;\n host: ModuleFederation;\n options: Options;\n moduleInfo: Remote;\n remoteSnapshot: ModuleInfo;\n }>('afterLoadSnapshot'),\n });\n loaderHook: ModuleFederation['loaderHook'];\n manifestLoading: Record<string, Promise<ModuleInfo>> =\n Global.__FEDERATION__.__MANIFEST_LOADING__;\n\n constructor(HostInstance: ModuleFederation) {\n this.HostInstance = HostInstance;\n this.loaderHook = HostInstance.loaderHook;\n }\n\n // eslint-disable-next-line max-lines-per-function\n async loadRemoteSnapshotInfo({\n moduleInfo,\n id,\n expose,\n }: {\n moduleInfo: Remote;\n id?: string;\n expose?: string;\n }):\n | Promise<{\n remoteSnapshot: ModuleInfo;\n globalSnapshot: GlobalModuleInfo;\n }>\n | never {\n const { options } = this.HostInstance;\n\n await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({\n options,\n moduleInfo,\n });\n\n let hostSnapshot = getGlobalSnapshotInfoByModuleInfo({\n name: this.HostInstance.options.name,\n version: this.HostInstance.options.version,\n });\n\n if (!hostSnapshot) {\n hostSnapshot = {\n version: this.HostInstance.options.version || '',\n remoteEntry: '',\n remotesInfo: {},\n };\n addGlobalSnapshot({\n [this.HostInstance.options.name]: hostSnapshot,\n });\n }\n\n // In dynamic loadRemote scenarios, incomplete remotesInfo delivery may occur. In such cases, the remotesInfo in the host needs to be completed in the snapshot at runtime.\n // This ensures the snapshot's integrity and helps the chrome plugin correctly identify all producer modules, ensuring that proxyable producer modules will not be missing.\n if (\n hostSnapshot &&\n 'remotesInfo' in hostSnapshot &&\n !getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name).value\n ) {\n if ('version' in moduleInfo || 'entry' in moduleInfo) {\n hostSnapshot.remotesInfo = {\n ...hostSnapshot?.remotesInfo,\n [moduleInfo.name]: {\n matchedVersion:\n 'version' in moduleInfo ? moduleInfo.version : moduleInfo.entry,\n },\n };\n }\n }\n\n const { hostGlobalSnapshot, remoteSnapshot, globalSnapshot } =\n this.getGlobalRemoteInfo(moduleInfo);\n const {\n remoteSnapshot: globalRemoteSnapshot,\n globalSnapshot: globalSnapshotRes,\n } = await this.hooks.lifecycle.loadSnapshot.emit({\n options,\n moduleInfo,\n hostGlobalSnapshot,\n remoteSnapshot,\n globalSnapshot,\n });\n\n let mSnapshot;\n let gSnapshot;\n // global snapshot includes manifest or module info includes manifest\n if (globalRemoteSnapshot) {\n if (isManifestProvider(globalRemoteSnapshot)) {\n const remoteEntry = isBrowserEnvValue\n ? globalRemoteSnapshot.remoteEntry\n : globalRemoteSnapshot.ssrRemoteEntry ||\n globalRemoteSnapshot.remoteEntry ||\n '';\n const moduleSnapshot = await this.getManifestJson(\n remoteEntry,\n moduleInfo,\n {},\n );\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(\n {\n ...moduleInfo,\n // The global remote may be overridden\n // Therefore, set the snapshot key to the global address of the actual request\n entry: remoteEntry,\n },\n moduleSnapshot,\n );\n mSnapshot = moduleSnapshot;\n gSnapshot = globalSnapshotRes;\n } else {\n const { remoteSnapshot: remoteSnapshotRes } =\n await this.hooks.lifecycle.loadRemoteSnapshot.emit({\n options: this.HostInstance.options,\n moduleInfo,\n remoteSnapshot: globalRemoteSnapshot,\n from: 'global',\n });\n mSnapshot = remoteSnapshotRes;\n gSnapshot = globalSnapshotRes;\n }\n } else {\n if (isRemoteInfoWithEntry(moduleInfo)) {\n // get from manifest.json and merge remote info from remote server\n const moduleSnapshot = await this.getManifestJson(\n moduleInfo.entry,\n moduleInfo,\n {},\n );\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(\n moduleInfo,\n moduleSnapshot,\n );\n const { remoteSnapshot: remoteSnapshotRes } =\n await this.hooks.lifecycle.loadRemoteSnapshot.emit({\n options: this.HostInstance.options,\n moduleInfo,\n remoteSnapshot: moduleSnapshot,\n from: 'global',\n });\n\n mSnapshot = remoteSnapshotRes;\n gSnapshot = globalSnapshotRes;\n } else {\n error(\n RUNTIME_007,\n runtimeDescMap,\n {\n remoteName: moduleInfo.name,\n remoteVersion: moduleInfo.version,\n hostName: this.HostInstance.options.name,\n globalSnapshot: JSON.stringify(globalSnapshotRes),\n },\n undefined,\n optionsToMFContext(this.HostInstance.options),\n );\n }\n }\n\n await this.hooks.lifecycle.afterLoadSnapshot.emit({\n id,\n host: this.HostInstance,\n options,\n moduleInfo,\n remoteSnapshot: mSnapshot,\n });\n\n return {\n remoteSnapshot: mSnapshot,\n globalSnapshot: gSnapshot,\n };\n }\n\n getGlobalRemoteInfo(moduleInfo: Remote): {\n hostGlobalSnapshot: ModuleInfo | undefined;\n globalSnapshot: ReturnType<typeof getGlobalSnapshot>;\n remoteSnapshot: GlobalModuleInfo[string] | undefined;\n } {\n return getGlobalRemoteInfo(moduleInfo, this.HostInstance);\n }\n\n private async getManifestJson(\n manifestUrl: string,\n moduleInfo: Remote,\n extraOptions: Record<string, any>,\n ): Promise<ModuleInfo> {\n const getManifest = async (): Promise<Manifest> => {\n let manifestJson: Manifest | undefined =\n this.manifestCache.get(manifestUrl);\n if (manifestJson) {\n return manifestJson;\n }\n try {\n let res = await this.loaderHook.lifecycle.fetch.emit(manifestUrl, {});\n if (!res || !(res instanceof Response)) {\n res = await fetch(manifestUrl, {});\n }\n manifestJson = (await res.json()) as Manifest;\n } catch (err) {\n manifestJson =\n (await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit(\n {\n id: manifestUrl,\n error: err,\n from: 'runtime',\n lifecycle: 'afterResolve',\n origin: this.HostInstance,\n },\n )) as Manifest | undefined;\n\n if (!manifestJson) {\n delete this.manifestLoading[manifestUrl];\n error(\n RUNTIME_003,\n runtimeDescMap,\n {\n manifestUrl,\n moduleName: moduleInfo.name,\n hostName: this.HostInstance.options.name,\n },\n `${err}`,\n optionsToMFContext(this.HostInstance.options),\n );\n }\n }\n\n assert(\n manifestJson.metaData && manifestJson.exposes && manifestJson.shared,\n `\"${manifestUrl}\" is not a valid federation manifest for remote \"${moduleInfo.name}\". Missing required fields: ${[!manifestJson.metaData && 'metaData', !manifestJson.exposes && 'exposes', !manifestJson.shared && 'shared'].filter(Boolean).join(', ')}.`,\n );\n this.manifestCache.set(manifestUrl, manifestJson);\n return manifestJson;\n };\n\n const asyncLoadProcess = async () => {\n const manifestJson = await getManifest();\n const remoteSnapshot = generateSnapshotFromManifest(manifestJson, {\n version: manifestUrl,\n });\n\n const { remoteSnapshot: remoteSnapshotRes } =\n await this.hooks.lifecycle.loadRemoteSnapshot.emit({\n options: this.HostInstance.options,\n moduleInfo,\n manifestJson,\n remoteSnapshot,\n manifestUrl,\n from: 'manifest',\n });\n return remoteSnapshotRes;\n };\n\n if (!this.manifestLoading[manifestUrl]) {\n this.manifestLoading[manifestUrl] = asyncLoadProcess().then((res) => res);\n }\n return this.manifestLoading[manifestUrl];\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { AsyncHook } from "../../utils/hooks/asyncHook.js";
2
+ import { AsyncWaterfallHook } from "../../utils/hooks/asyncWaterfallHooks.js";
3
+ import { PluginSystem } from "../../utils/hooks/pluginSystem.js";
4
+ import { getGlobalSnapshot } from "../../global.js";
5
+ import { ModuleFederation } from "../../core.js";
6
+ import { Options, Remote } from "../../type/config.js";
7
+ import { GlobalModuleInfo, Manifest, ModuleInfo } from "@module-federation/sdk";
8
+
9
+ //#region src/plugins/snapshot/SnapshotHandler.d.ts
10
+ declare class SnapshotHandler {
11
+ loadingHostSnapshot: Promise<GlobalModuleInfo | void> | null;
12
+ HostInstance: ModuleFederation;
13
+ manifestCache: Map<string, Manifest>;
14
+ hooks: PluginSystem<{
15
+ beforeLoadRemoteSnapshot: AsyncHook<[{
16
+ options: Options;
17
+ moduleInfo: Remote;
18
+ }], void>;
19
+ loadSnapshot: AsyncWaterfallHook<{
20
+ options: Options;
21
+ moduleInfo: Remote;
22
+ hostGlobalSnapshot: GlobalModuleInfo[string] | undefined;
23
+ globalSnapshot: ReturnType<typeof getGlobalSnapshot>;
24
+ remoteSnapshot?: GlobalModuleInfo[string] | undefined;
25
+ }>;
26
+ loadRemoteSnapshot: AsyncWaterfallHook<{
27
+ options: Options;
28
+ moduleInfo: Remote;
29
+ manifestJson?: Manifest;
30
+ manifestUrl?: string;
31
+ remoteSnapshot: ModuleInfo;
32
+ from: "global" | "manifest";
33
+ }>;
34
+ afterLoadSnapshot: AsyncWaterfallHook<{
35
+ id?: string;
36
+ host: ModuleFederation;
37
+ options: Options;
38
+ moduleInfo: Remote;
39
+ remoteSnapshot: ModuleInfo;
40
+ }>;
41
+ }>;
42
+ loaderHook: ModuleFederation['loaderHook'];
43
+ manifestLoading: Record<string, Promise<ModuleInfo>>;
44
+ constructor(HostInstance: ModuleFederation);
45
+ loadRemoteSnapshotInfo({
46
+ moduleInfo,
47
+ id,
48
+ expose
49
+ }: {
50
+ moduleInfo: Remote;
51
+ id?: string;
52
+ expose?: string;
53
+ }): Promise<{
54
+ remoteSnapshot: ModuleInfo;
55
+ globalSnapshot: GlobalModuleInfo;
56
+ }> | never;
57
+ getGlobalRemoteInfo(moduleInfo: Remote): {
58
+ hostGlobalSnapshot: ModuleInfo | undefined;
59
+ globalSnapshot: ReturnType<typeof getGlobalSnapshot>;
60
+ remoteSnapshot: GlobalModuleInfo[string] | undefined;
61
+ };
62
+ private getManifestJson;
63
+ }
64
+ //#endregion
65
+ export { SnapshotHandler };
66
+ //# sourceMappingURL=SnapshotHandler.d.ts.map