@module-federation/runtime-core 0.0.0-chore-bump-node-22-20260710161714

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 (166) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/_virtual/_rolldown/runtime.cjs +19 -0
  5. package/dist/_virtual/_rolldown/runtime.js +18 -0
  6. package/dist/constant.cjs +9 -0
  7. package/dist/constant.cjs.map +1 -0
  8. package/dist/constant.js +7 -0
  9. package/dist/constant.js.map +1 -0
  10. package/dist/core.cjs +161 -0
  11. package/dist/core.cjs.map +1 -0
  12. package/dist/core.d.ts +197 -0
  13. package/dist/core.js +161 -0
  14. package/dist/core.js.map +1 -0
  15. package/dist/global.cjs +160 -0
  16. package/dist/global.cjs.map +1 -0
  17. package/dist/global.d.ts +45 -0
  18. package/dist/global.js +142 -0
  19. package/dist/global.js.map +1 -0
  20. package/dist/helpers.cjs +44 -0
  21. package/dist/helpers.cjs.map +1 -0
  22. package/dist/helpers.d.ts +30 -0
  23. package/dist/helpers.js +44 -0
  24. package/dist/helpers.js.map +1 -0
  25. package/dist/index.cjs +60 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.ts +29 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/module/index.cjs +266 -0
  31. package/dist/module/index.cjs.map +1 -0
  32. package/dist/module/index.d.ts +32 -0
  33. package/dist/module/index.js +266 -0
  34. package/dist/module/index.js.map +1 -0
  35. package/dist/plugins/generate-preload-assets.cjs +182 -0
  36. package/dist/plugins/generate-preload-assets.cjs.map +1 -0
  37. package/dist/plugins/generate-preload-assets.js +182 -0
  38. package/dist/plugins/generate-preload-assets.js.map +1 -0
  39. package/dist/plugins/snapshot/SnapshotHandler.cjs +215 -0
  40. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
  41. package/dist/plugins/snapshot/SnapshotHandler.d.ts +69 -0
  42. package/dist/plugins/snapshot/SnapshotHandler.js +214 -0
  43. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
  44. package/dist/plugins/snapshot/index.cjs +67 -0
  45. package/dist/plugins/snapshot/index.cjs.map +1 -0
  46. package/dist/plugins/snapshot/index.js +66 -0
  47. package/dist/plugins/snapshot/index.js.map +1 -0
  48. package/dist/remote/index.cjs +445 -0
  49. package/dist/remote/index.cjs.map +1 -0
  50. package/dist/remote/index.d.ts +145 -0
  51. package/dist/remote/index.js +445 -0
  52. package/dist/remote/index.js.map +1 -0
  53. package/dist/shared/index.cjs +418 -0
  54. package/dist/shared/index.cjs.map +1 -0
  55. package/dist/shared/index.d.ts +104 -0
  56. package/dist/shared/index.js +418 -0
  57. package/dist/shared/index.js.map +1 -0
  58. package/dist/type/config.d.ts +130 -0
  59. package/dist/type/index.cjs +13 -0
  60. package/dist/type/index.cjs.map +1 -0
  61. package/dist/type/index.d.ts +11 -0
  62. package/dist/type/index.js +8 -0
  63. package/dist/type/index.js.map +1 -0
  64. package/dist/type/plugin.d.ts +27 -0
  65. package/dist/type/preload.d.ts +54 -0
  66. package/dist/types.cjs +0 -0
  67. package/dist/types.d.ts +4 -0
  68. package/dist/types.js +1 -0
  69. package/dist/utils/context.cjs +45 -0
  70. package/dist/utils/context.cjs.map +1 -0
  71. package/dist/utils/context.d.ts +1 -0
  72. package/dist/utils/context.js +44 -0
  73. package/dist/utils/context.js.map +1 -0
  74. package/dist/utils/env.cjs +10 -0
  75. package/dist/utils/env.cjs.map +1 -0
  76. package/dist/utils/env.d.ts +1 -0
  77. package/dist/utils/env.js +10 -0
  78. package/dist/utils/env.js.map +1 -0
  79. package/dist/utils/hooks/asyncHook.cjs +26 -0
  80. package/dist/utils/hooks/asyncHook.cjs.map +1 -0
  81. package/dist/utils/hooks/asyncHook.d.ts +10 -0
  82. package/dist/utils/hooks/asyncHook.js +26 -0
  83. package/dist/utils/hooks/asyncHook.js.map +1 -0
  84. package/dist/utils/hooks/asyncWaterfallHooks.cjs +44 -0
  85. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
  86. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
  87. package/dist/utils/hooks/asyncWaterfallHooks.js +44 -0
  88. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
  89. package/dist/utils/hooks/index.cjs +5 -0
  90. package/dist/utils/hooks/index.d.ts +5 -0
  91. package/dist/utils/hooks/index.js +7 -0
  92. package/dist/utils/hooks/pluginSystem.cjs +37 -0
  93. package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
  94. package/dist/utils/hooks/pluginSystem.d.ts +19 -0
  95. package/dist/utils/hooks/pluginSystem.js +37 -0
  96. package/dist/utils/hooks/pluginSystem.js.map +1 -0
  97. package/dist/utils/hooks/syncHook.cjs +37 -0
  98. package/dist/utils/hooks/syncHook.cjs.map +1 -0
  99. package/dist/utils/hooks/syncHook.d.ts +16 -0
  100. package/dist/utils/hooks/syncHook.js +36 -0
  101. package/dist/utils/hooks/syncHook.js.map +1 -0
  102. package/dist/utils/hooks/syncWaterfallHook.cjs +40 -0
  103. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
  104. package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
  105. package/dist/utils/hooks/syncWaterfallHook.js +39 -0
  106. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
  107. package/dist/utils/index.cjs +8 -0
  108. package/dist/utils/index.d.ts +4 -0
  109. package/dist/utils/index.js +9 -0
  110. package/dist/utils/load.cjs +214 -0
  111. package/dist/utils/load.cjs.map +1 -0
  112. package/dist/utils/load.d.ts +16 -0
  113. package/dist/utils/load.js +212 -0
  114. package/dist/utils/load.js.map +1 -0
  115. package/dist/utils/logger.cjs +34 -0
  116. package/dist/utils/logger.cjs.map +1 -0
  117. package/dist/utils/logger.d.ts +10 -0
  118. package/dist/utils/logger.js +31 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/dist/utils/manifest.cjs +56 -0
  121. package/dist/utils/manifest.cjs.map +1 -0
  122. package/dist/utils/manifest.d.ts +10 -0
  123. package/dist/utils/manifest.js +53 -0
  124. package/dist/utils/manifest.js.map +1 -0
  125. package/dist/utils/plugin.cjs +27 -0
  126. package/dist/utils/plugin.cjs.map +1 -0
  127. package/dist/utils/plugin.d.ts +1 -0
  128. package/dist/utils/plugin.js +27 -0
  129. package/dist/utils/plugin.js.map +1 -0
  130. package/dist/utils/preload.cjs +212 -0
  131. package/dist/utils/preload.cjs.map +1 -0
  132. package/dist/utils/preload.d.ts +8 -0
  133. package/dist/utils/preload.js +209 -0
  134. package/dist/utils/preload.js.map +1 -0
  135. package/dist/utils/semver/compare.cjs +48 -0
  136. package/dist/utils/semver/compare.cjs.map +1 -0
  137. package/dist/utils/semver/compare.js +47 -0
  138. package/dist/utils/semver/compare.js.map +1 -0
  139. package/dist/utils/semver/constants.cjs +41 -0
  140. package/dist/utils/semver/constants.cjs.map +1 -0
  141. package/dist/utils/semver/constants.js +31 -0
  142. package/dist/utils/semver/constants.js.map +1 -0
  143. package/dist/utils/semver/index.cjs +68 -0
  144. package/dist/utils/semver/index.cjs.map +1 -0
  145. package/dist/utils/semver/index.d.ts +5 -0
  146. package/dist/utils/semver/index.js +68 -0
  147. package/dist/utils/semver/index.js.map +1 -0
  148. package/dist/utils/semver/parser.cjs +104 -0
  149. package/dist/utils/semver/parser.cjs.map +1 -0
  150. package/dist/utils/semver/parser.js +96 -0
  151. package/dist/utils/semver/parser.js.map +1 -0
  152. package/dist/utils/semver/utils.cjs +28 -0
  153. package/dist/utils/semver/utils.cjs.map +1 -0
  154. package/dist/utils/semver/utils.js +24 -0
  155. package/dist/utils/semver/utils.js.map +1 -0
  156. package/dist/utils/share.cjs +284 -0
  157. package/dist/utils/share.cjs.map +1 -0
  158. package/dist/utils/share.d.ts +23 -0
  159. package/dist/utils/share.js +278 -0
  160. package/dist/utils/share.js.map +1 -0
  161. package/dist/utils/tool.cjs +82 -0
  162. package/dist/utils/tool.cjs.map +1 -0
  163. package/dist/utils/tool.d.ts +8 -0
  164. package/dist/utils/tool.js +71 -0
  165. package/dist/utils/tool.js.map +1 -0
  166. package/package.json +65 -0
@@ -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,215 @@
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_load = require('../../utils/load.cjs');
5
+ const require_context = require('../../utils/context.cjs');
6
+ require('../../utils/index.cjs');
7
+ const require_asyncHook = require('../../utils/hooks/asyncHook.cjs');
8
+ const require_asyncWaterfallHooks = require('../../utils/hooks/asyncWaterfallHooks.cjs');
9
+ const require_pluginSystem = require('../../utils/hooks/pluginSystem.cjs');
10
+ require('../../utils/hooks/index.cjs');
11
+ let _module_federation_sdk = require("@module-federation/sdk");
12
+ let _module_federation_error_codes = require("@module-federation/error-codes");
13
+
14
+ //#region src/plugins/snapshot/SnapshotHandler.ts
15
+ function getGlobalRemoteInfo(moduleInfo, origin) {
16
+ const hostGlobalSnapshot = require_global.getGlobalSnapshotInfoByModuleInfo({
17
+ name: origin.name,
18
+ version: origin.options.version
19
+ });
20
+ const globalRemoteInfo = hostGlobalSnapshot && "remotesInfo" in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && require_global.getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;
21
+ if (globalRemoteInfo && globalRemoteInfo.matchedVersion) return {
22
+ hostGlobalSnapshot,
23
+ globalSnapshot: require_global.getGlobalSnapshot(),
24
+ remoteSnapshot: require_global.getGlobalSnapshotInfoByModuleInfo({
25
+ name: moduleInfo.name,
26
+ version: globalRemoteInfo.matchedVersion
27
+ })
28
+ };
29
+ return {
30
+ hostGlobalSnapshot: void 0,
31
+ globalSnapshot: require_global.getGlobalSnapshot(),
32
+ remoteSnapshot: require_global.getGlobalSnapshotInfoByModuleInfo({
33
+ name: moduleInfo.name,
34
+ version: "version" in moduleInfo ? moduleInfo.version : void 0
35
+ })
36
+ };
37
+ }
38
+ var SnapshotHandler = class {
39
+ constructor(HostInstance) {
40
+ this.loadingHostSnapshot = null;
41
+ this.manifestCache = /* @__PURE__ */ new Map();
42
+ this.hooks = new require_pluginSystem.PluginSystem({
43
+ beforeLoadRemoteSnapshot: new require_asyncHook.AsyncHook("beforeLoadRemoteSnapshot"),
44
+ loadSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("loadGlobalSnapshot"),
45
+ loadRemoteSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("loadRemoteSnapshot"),
46
+ afterLoadSnapshot: new require_asyncWaterfallHooks.AsyncWaterfallHook("afterLoadSnapshot")
47
+ });
48
+ this.manifestLoading = require_global.Global.__FEDERATION__.__MANIFEST_LOADING__;
49
+ this.HostInstance = HostInstance;
50
+ this.loaderHook = HostInstance.loaderHook;
51
+ }
52
+ async loadRemoteSnapshotInfo({ moduleInfo, id, initiator = "loadRemote" }) {
53
+ const { options } = this.HostInstance;
54
+ await this.hooks.lifecycle.beforeLoadRemoteSnapshot.emit({
55
+ options,
56
+ moduleInfo,
57
+ origin: this.HostInstance
58
+ });
59
+ let hostSnapshot = require_global.getGlobalSnapshotInfoByModuleInfo({
60
+ name: this.HostInstance.options.name,
61
+ version: this.HostInstance.options.version
62
+ });
63
+ if (!hostSnapshot) {
64
+ hostSnapshot = {
65
+ version: this.HostInstance.options.version || "",
66
+ remoteEntry: "",
67
+ remotesInfo: {}
68
+ };
69
+ require_global.addGlobalSnapshot({ [this.HostInstance.options.name]: hostSnapshot });
70
+ }
71
+ if (hostSnapshot && "remotesInfo" in hostSnapshot && !require_global.getInfoWithoutType(hostSnapshot.remotesInfo, moduleInfo.name).value) {
72
+ if ("version" in moduleInfo || "entry" in moduleInfo) hostSnapshot.remotesInfo = {
73
+ ...hostSnapshot?.remotesInfo,
74
+ [moduleInfo.name]: { matchedVersion: "version" in moduleInfo ? moduleInfo.version : moduleInfo.entry }
75
+ };
76
+ }
77
+ const { hostGlobalSnapshot, remoteSnapshot, globalSnapshot } = this.getGlobalRemoteInfo(moduleInfo);
78
+ const { remoteSnapshot: globalRemoteSnapshot, globalSnapshot: globalSnapshotRes } = await this.hooks.lifecycle.loadSnapshot.emit({
79
+ options,
80
+ moduleInfo,
81
+ hostGlobalSnapshot,
82
+ remoteSnapshot,
83
+ globalSnapshot
84
+ });
85
+ let mSnapshot;
86
+ let gSnapshot;
87
+ if (globalRemoteSnapshot) if ((0, _module_federation_sdk.isManifestProvider)(globalRemoteSnapshot)) {
88
+ const remoteEntry = _module_federation_sdk.isBrowserEnvValue ? globalRemoteSnapshot.remoteEntry : globalRemoteSnapshot.ssrRemoteEntry || globalRemoteSnapshot.remoteEntry || "";
89
+ const moduleSnapshot = await this.loadManifestSnapshot(remoteEntry, moduleInfo, {}, {
90
+ initiator,
91
+ id: id || moduleInfo.name
92
+ });
93
+ const globalSnapshotRes = require_global.setGlobalSnapshotInfoByModuleInfo({
94
+ ...moduleInfo,
95
+ entry: remoteEntry
96
+ }, moduleSnapshot);
97
+ mSnapshot = moduleSnapshot;
98
+ gSnapshot = globalSnapshotRes;
99
+ } else {
100
+ const { remoteSnapshot: remoteSnapshotRes } = await this.hooks.lifecycle.loadRemoteSnapshot.emit({
101
+ options: this.HostInstance.options,
102
+ moduleInfo,
103
+ remoteSnapshot: globalRemoteSnapshot,
104
+ from: "global"
105
+ });
106
+ mSnapshot = remoteSnapshotRes;
107
+ gSnapshot = globalSnapshotRes;
108
+ }
109
+ else if (require_tool.isRemoteInfoWithEntry(moduleInfo)) {
110
+ const moduleSnapshot = await this.loadManifestSnapshot(moduleInfo.entry, moduleInfo, {}, {
111
+ initiator,
112
+ id: id || moduleInfo.name
113
+ });
114
+ const globalSnapshotRes = require_global.setGlobalSnapshotInfoByModuleInfo(moduleInfo, moduleSnapshot);
115
+ mSnapshot = moduleSnapshot;
116
+ gSnapshot = globalSnapshotRes;
117
+ } else require_logger.error(_module_federation_error_codes.RUNTIME_007, _module_federation_error_codes.runtimeDescMap, {
118
+ remoteName: moduleInfo.name,
119
+ remoteVersion: moduleInfo.version,
120
+ hostName: this.HostInstance.options.name,
121
+ globalSnapshot: JSON.stringify(globalSnapshotRes)
122
+ }, void 0, require_context.optionsToMFContext(this.HostInstance.options));
123
+ await this.hooks.lifecycle.afterLoadSnapshot.emit({
124
+ id,
125
+ host: this.HostInstance,
126
+ options,
127
+ moduleInfo,
128
+ remoteSnapshot: mSnapshot
129
+ });
130
+ return {
131
+ remoteSnapshot: mSnapshot,
132
+ globalSnapshot: gSnapshot
133
+ };
134
+ }
135
+ getGlobalRemoteInfo(moduleInfo) {
136
+ return getGlobalRemoteInfo(moduleInfo, this.HostInstance);
137
+ }
138
+ async getManifestJson(manifestUrl, moduleInfo, extraOptions, resourceOptions) {
139
+ const getManifest = async () => {
140
+ const remoteInfo = require_load.getRemoteInfo(moduleInfo);
141
+ let manifestJson = this.manifestCache.get(manifestUrl);
142
+ if (manifestJson) return manifestJson;
143
+ try {
144
+ let res = await this.loaderHook.lifecycle.fetch.emit(manifestUrl, {}, remoteInfo, resourceOptions ? {
145
+ ...resourceOptions,
146
+ url: manifestUrl,
147
+ resourceType: "manifest"
148
+ } : void 0);
149
+ if (!res || !(res instanceof Response)) res = await fetch(manifestUrl, {});
150
+ manifestJson = await res.json();
151
+ } catch (err) {
152
+ manifestJson = await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
153
+ id: manifestUrl,
154
+ error: err,
155
+ from: "runtime",
156
+ lifecycle: "afterResolve",
157
+ remote: remoteInfo,
158
+ origin: this.HostInstance
159
+ });
160
+ if (!manifestJson) {
161
+ delete this.manifestLoading[manifestUrl];
162
+ require_logger.error(_module_federation_error_codes.RUNTIME_003, _module_federation_error_codes.runtimeDescMap, {
163
+ manifestUrl,
164
+ moduleName: moduleInfo.name,
165
+ hostName: this.HostInstance.options.name
166
+ }, `${err}`, require_context.optionsToMFContext(this.HostInstance.options));
167
+ }
168
+ }
169
+ const missingRequiredFields = [
170
+ !manifestJson.metaData && "metaData",
171
+ !manifestJson.exposes && "exposes",
172
+ !manifestJson.shared && "shared"
173
+ ].filter(Boolean);
174
+ if (missingRequiredFields.length > 0) await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({
175
+ id: manifestUrl,
176
+ error: /* @__PURE__ */ new Error(`"${manifestUrl}" is not a valid federation manifest for remote "${moduleInfo.name}". Missing required fields: ${missingRequiredFields.join(", ")}.`),
177
+ from: "runtime",
178
+ lifecycle: "afterResolve",
179
+ remote: remoteInfo,
180
+ origin: this.HostInstance
181
+ });
182
+ if (missingRequiredFields.length > 0) require_logger.error(_module_federation_error_codes.RUNTIME_013, _module_federation_error_codes.runtimeDescMap, {
183
+ manifestUrl,
184
+ moduleName: moduleInfo.name,
185
+ hostName: this.HostInstance.options.name,
186
+ missingFields: missingRequiredFields.join(",")
187
+ }, void 0, require_context.optionsToMFContext(this.HostInstance.options));
188
+ this.manifestCache.set(manifestUrl, manifestJson);
189
+ return manifestJson;
190
+ };
191
+ return getManifest();
192
+ }
193
+ async loadManifestSnapshot(manifestUrl, moduleInfo, extraOptions, resourceOptions) {
194
+ const asyncLoadProcess = async () => {
195
+ const manifestJson = await this.getManifestJson(manifestUrl, moduleInfo, extraOptions, resourceOptions);
196
+ const remoteSnapshot = (0, _module_federation_sdk.generateSnapshotFromManifest)(manifestJson, { version: manifestUrl });
197
+ const { remoteSnapshot: remoteSnapshotRes } = await this.hooks.lifecycle.loadRemoteSnapshot.emit({
198
+ options: this.HostInstance.options,
199
+ moduleInfo,
200
+ manifestJson,
201
+ remoteSnapshot,
202
+ manifestUrl,
203
+ from: "manifest"
204
+ });
205
+ return remoteSnapshotRes;
206
+ };
207
+ if (!this.manifestLoading[manifestUrl]) this.manifestLoading[manifestUrl] = asyncLoadProcess().then((res) => res);
208
+ return this.manifestLoading[manifestUrl];
209
+ }
210
+ };
211
+
212
+ //#endregion
213
+ exports.SnapshotHandler = SnapshotHandler;
214
+ exports.getGlobalRemoteInfo = getGlobalRemoteInfo;
215
+ //# 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","getRemoteInfo","RUNTIME_003","RUNTIME_013"],"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 RUNTIME_013,\n runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Options, Remote, ResourceLoadInitiator } from '../../type';\nimport {\n isRemoteInfoWithEntry,\n error,\n optionsToMFContext,\n getRemoteInfo,\n} 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';\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 origin: ModuleFederation;\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 initiator = 'loadRemote',\n }: {\n moduleInfo: Remote;\n id?: string;\n initiator?: ResourceLoadInitiator;\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 origin: this.HostInstance,\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.loadManifestSnapshot(\n remoteEntry,\n moduleInfo,\n {},\n {\n initiator,\n id: id || moduleInfo.name,\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.loadManifestSnapshot(\n moduleInfo.entry,\n moduleInfo,\n {},\n {\n initiator,\n id: id || moduleInfo.name,\n },\n );\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(\n moduleInfo,\n moduleSnapshot,\n );\n mSnapshot = moduleSnapshot;\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 resourceOptions?: {\n initiator: ResourceLoadInitiator;\n id: string;\n },\n ): Promise<Manifest> {\n const getManifest = async (): Promise<Manifest> => {\n const remoteInfo = getRemoteInfo(moduleInfo);\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(\n manifestUrl,\n {},\n remoteInfo,\n resourceOptions\n ? {\n ...resourceOptions,\n url: manifestUrl,\n resourceType: 'manifest',\n }\n : undefined,\n );\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 remote: remoteInfo,\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 const missingRequiredFields = [\n !manifestJson.metaData && 'metaData',\n !manifestJson.exposes && 'exposes',\n !manifestJson.shared && 'shared',\n ].filter(Boolean);\n if (missingRequiredFields.length > 0) {\n await this.HostInstance.remoteHandler.hooks.lifecycle.errorLoadRemote.emit(\n {\n id: manifestUrl,\n error: new Error(\n `\"${manifestUrl}\" is not a valid federation manifest for remote \"${moduleInfo.name}\". Missing required fields: ${missingRequiredFields.join(', ')}.`,\n ),\n from: 'runtime',\n lifecycle: 'afterResolve',\n remote: remoteInfo,\n origin: this.HostInstance,\n },\n );\n }\n\n if (missingRequiredFields.length > 0) {\n error(\n RUNTIME_013,\n runtimeDescMap,\n {\n manifestUrl,\n moduleName: moduleInfo.name,\n hostName: this.HostInstance.options.name,\n missingFields: missingRequiredFields.join(','),\n },\n undefined,\n optionsToMFContext(this.HostInstance.options),\n );\n }\n this.manifestCache.set(manifestUrl, manifestJson);\n return manifestJson;\n };\n\n return getManifest();\n }\n\n private async loadManifestSnapshot(\n manifestUrl: string,\n moduleInfo: Remote,\n extraOptions: Record<string, any>,\n resourceOptions?: {\n initiator: ResourceLoadInitiator;\n id: string;\n },\n ): Promise<ModuleInfo> {\n const asyncLoadProcess = async () => {\n const manifestJson = await this.getManifestJson(\n manifestUrl,\n moduleInfo,\n extraOptions,\n resourceOptions,\n );\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,69 @@
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 { ResourceLoadInitiator } from "../../type/preload.js";
8
+ import { GlobalModuleInfo, Manifest, ModuleInfo } from "@module-federation/sdk";
9
+
10
+ //#region src/plugins/snapshot/SnapshotHandler.d.ts
11
+ declare class SnapshotHandler {
12
+ loadingHostSnapshot: Promise<GlobalModuleInfo | void> | null;
13
+ HostInstance: ModuleFederation;
14
+ manifestCache: Map<string, Manifest>;
15
+ hooks: PluginSystem<{
16
+ beforeLoadRemoteSnapshot: AsyncHook<[{
17
+ options: Options;
18
+ moduleInfo: Remote;
19
+ origin: ModuleFederation;
20
+ }], void>;
21
+ loadSnapshot: AsyncWaterfallHook<{
22
+ options: Options;
23
+ moduleInfo: Remote;
24
+ hostGlobalSnapshot: GlobalModuleInfo[string] | undefined;
25
+ globalSnapshot: ReturnType<typeof getGlobalSnapshot>;
26
+ remoteSnapshot?: GlobalModuleInfo[string] | undefined;
27
+ }>;
28
+ loadRemoteSnapshot: AsyncWaterfallHook<{
29
+ options: Options;
30
+ moduleInfo: Remote;
31
+ manifestJson?: Manifest;
32
+ manifestUrl?: string;
33
+ remoteSnapshot: ModuleInfo;
34
+ from: "global" | "manifest";
35
+ }>;
36
+ afterLoadSnapshot: AsyncWaterfallHook<{
37
+ id?: string;
38
+ host: ModuleFederation;
39
+ options: Options;
40
+ moduleInfo: Remote;
41
+ remoteSnapshot: ModuleInfo;
42
+ }>;
43
+ }>;
44
+ loaderHook: ModuleFederation['loaderHook'];
45
+ manifestLoading: Record<string, Promise<ModuleInfo>>;
46
+ constructor(HostInstance: ModuleFederation);
47
+ loadRemoteSnapshotInfo({
48
+ moduleInfo,
49
+ id,
50
+ initiator
51
+ }: {
52
+ moduleInfo: Remote;
53
+ id?: string;
54
+ initiator?: ResourceLoadInitiator;
55
+ }): Promise<{
56
+ remoteSnapshot: ModuleInfo;
57
+ globalSnapshot: GlobalModuleInfo;
58
+ }> | never;
59
+ getGlobalRemoteInfo(moduleInfo: Remote): {
60
+ hostGlobalSnapshot: ModuleInfo | undefined;
61
+ globalSnapshot: ReturnType<typeof getGlobalSnapshot>;
62
+ remoteSnapshot: GlobalModuleInfo[string] | undefined;
63
+ };
64
+ private getManifestJson;
65
+ private loadManifestSnapshot;
66
+ }
67
+ //#endregion
68
+ export { SnapshotHandler };
69
+ //# sourceMappingURL=SnapshotHandler.d.ts.map