@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,214 @@
1
+ import { error } from "../../utils/logger.js";
2
+ import { isRemoteInfoWithEntry } from "../../utils/tool.js";
3
+ import { Global, addGlobalSnapshot, getGlobalSnapshot, getGlobalSnapshotInfoByModuleInfo, getInfoWithoutType, setGlobalSnapshotInfoByModuleInfo } from "../../global.js";
4
+ import { getRemoteInfo } from "../../utils/load.js";
5
+ import { optionsToMFContext } from "../../utils/context.js";
6
+ import "../../utils/index.js";
7
+ import { AsyncHook } from "../../utils/hooks/asyncHook.js";
8
+ import { AsyncWaterfallHook } from "../../utils/hooks/asyncWaterfallHooks.js";
9
+ import { PluginSystem } from "../../utils/hooks/pluginSystem.js";
10
+ import "../../utils/hooks/index.js";
11
+ import { generateSnapshotFromManifest, isBrowserEnvValue, isManifestProvider } from "@module-federation/sdk";
12
+ import { RUNTIME_003, RUNTIME_007, RUNTIME_013, runtimeDescMap } from "@module-federation/error-codes";
13
+
14
+ //#region src/plugins/snapshot/SnapshotHandler.ts
15
+ function getGlobalRemoteInfo(moduleInfo, origin) {
16
+ const hostGlobalSnapshot = getGlobalSnapshotInfoByModuleInfo({
17
+ name: origin.name,
18
+ version: origin.options.version
19
+ });
20
+ const globalRemoteInfo = hostGlobalSnapshot && "remotesInfo" in hostGlobalSnapshot && hostGlobalSnapshot.remotesInfo && getInfoWithoutType(hostGlobalSnapshot.remotesInfo, moduleInfo.name).value;
21
+ if (globalRemoteInfo && globalRemoteInfo.matchedVersion) return {
22
+ hostGlobalSnapshot,
23
+ globalSnapshot: getGlobalSnapshot(),
24
+ remoteSnapshot: getGlobalSnapshotInfoByModuleInfo({
25
+ name: moduleInfo.name,
26
+ version: globalRemoteInfo.matchedVersion
27
+ })
28
+ };
29
+ return {
30
+ hostGlobalSnapshot: void 0,
31
+ globalSnapshot: getGlobalSnapshot(),
32
+ remoteSnapshot: 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 PluginSystem({
43
+ beforeLoadRemoteSnapshot: new AsyncHook("beforeLoadRemoteSnapshot"),
44
+ loadSnapshot: new AsyncWaterfallHook("loadGlobalSnapshot"),
45
+ loadRemoteSnapshot: new AsyncWaterfallHook("loadRemoteSnapshot"),
46
+ afterLoadSnapshot: new AsyncWaterfallHook("afterLoadSnapshot")
47
+ });
48
+ this.manifestLoading = 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 = 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
+ addGlobalSnapshot({ [this.HostInstance.options.name]: hostSnapshot });
70
+ }
71
+ if (hostSnapshot && "remotesInfo" in hostSnapshot && !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 (isManifestProvider(globalRemoteSnapshot)) {
88
+ const remoteEntry = 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 = 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 (isRemoteInfoWithEntry(moduleInfo)) {
110
+ const moduleSnapshot = await this.loadManifestSnapshot(moduleInfo.entry, moduleInfo, {}, {
111
+ initiator,
112
+ id: id || moduleInfo.name
113
+ });
114
+ const globalSnapshotRes = setGlobalSnapshotInfoByModuleInfo(moduleInfo, moduleSnapshot);
115
+ mSnapshot = moduleSnapshot;
116
+ gSnapshot = globalSnapshotRes;
117
+ } else error(RUNTIME_007, runtimeDescMap, {
118
+ remoteName: moduleInfo.name,
119
+ remoteVersion: moduleInfo.version,
120
+ hostName: this.HostInstance.options.name,
121
+ globalSnapshot: JSON.stringify(globalSnapshotRes)
122
+ }, void 0, 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 = 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
+ error(RUNTIME_003, runtimeDescMap, {
163
+ manifestUrl,
164
+ moduleName: moduleInfo.name,
165
+ hostName: this.HostInstance.options.name
166
+ }, `${err}`, 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) error(RUNTIME_013, runtimeDescMap, {
183
+ manifestUrl,
184
+ moduleName: moduleInfo.name,
185
+ hostName: this.HostInstance.options.name,
186
+ missingFields: missingRequiredFields.join(",")
187
+ }, void 0, 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 = 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
+ export { SnapshotHandler, getGlobalRemoteInfo };
214
+ //# sourceMappingURL=SnapshotHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnapshotHandler.js","names":[],"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,67 @@
1
+ const require_logger = require('../../utils/logger.cjs');
2
+ const require_tool = require('../../utils/tool.cjs');
3
+ const require_manifest = require('../../utils/manifest.cjs');
4
+ require('../../utils/index.cjs');
5
+ const require_preload = require('../../utils/preload.cjs');
6
+ let _module_federation_sdk = require("@module-federation/sdk");
7
+ let _module_federation_error_codes = require("@module-federation/error-codes");
8
+
9
+ //#region src/plugins/snapshot/index.ts
10
+ function assignRemoteInfo(remoteInfo, remoteSnapshot) {
11
+ const remoteEntryInfo = require_tool.getRemoteEntryInfoFromSnapshot(remoteSnapshot);
12
+ if (!remoteEntryInfo.url) require_logger.error(_module_federation_error_codes.RUNTIME_011, _module_federation_error_codes.runtimeDescMap, { remoteName: remoteInfo.name });
13
+ let entryUrl = (0, _module_federation_sdk.getResourceUrl)(remoteSnapshot, remoteEntryInfo.url);
14
+ if (!_module_federation_sdk.isBrowserEnvValue && !entryUrl.startsWith("http")) entryUrl = `https:${entryUrl}`;
15
+ remoteInfo.type = remoteEntryInfo.type;
16
+ remoteInfo.entryGlobalName = remoteEntryInfo.globalName;
17
+ remoteInfo.entry = entryUrl;
18
+ remoteInfo.version = remoteSnapshot.version;
19
+ remoteInfo.buildVersion = remoteSnapshot.buildVersion;
20
+ }
21
+ function snapshotPlugin() {
22
+ return {
23
+ name: "snapshot-plugin",
24
+ async afterResolve(args) {
25
+ const { remote, pkgNameOrAlias, expose, origin, remoteInfo, id } = args;
26
+ if (!require_tool.isRemoteInfoWithEntry(remote) || !require_tool.isPureRemoteEntry(remote)) {
27
+ const { remoteSnapshot, globalSnapshot } = await origin.snapshotHandler.loadRemoteSnapshotInfo({
28
+ moduleInfo: remote,
29
+ id: require_manifest.composeRemoteRequestId(remote.name, expose)
30
+ });
31
+ assignRemoteInfo(remoteInfo, remoteSnapshot);
32
+ const preloadOptions = {
33
+ remote,
34
+ preloadConfig: {
35
+ nameOrAlias: pkgNameOrAlias,
36
+ exposes: [expose],
37
+ resourceCategory: "sync",
38
+ share: false,
39
+ depsRemote: false
40
+ }
41
+ };
42
+ const assets = await origin.remoteHandler.hooks.lifecycle.generatePreloadAssets.emit({
43
+ origin,
44
+ preloadOptions,
45
+ remoteInfo,
46
+ remote,
47
+ remoteSnapshot,
48
+ globalSnapshot
49
+ });
50
+ if (assets) require_preload.preloadAssets(remoteInfo, origin, assets, false, {
51
+ initiator: "loadRemote",
52
+ id
53
+ }).catch(() => void 0);
54
+ return {
55
+ ...args,
56
+ remoteSnapshot
57
+ };
58
+ }
59
+ return args;
60
+ }
61
+ };
62
+ }
63
+
64
+ //#endregion
65
+ exports.assignRemoteInfo = assignRemoteInfo;
66
+ exports.snapshotPlugin = snapshotPlugin;
67
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["getRemoteEntryInfoFromSnapshot","RUNTIME_011","runtimeDescMap","isBrowserEnvValue","isRemoteInfoWithEntry","isPureRemoteEntry","composeRemoteRequestId"],"sources":["../../../src/plugins/snapshot/index.ts"],"sourcesContent":["import {\n ModuleInfo,\n getResourceUrl,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { ModuleFederationRuntimePlugin } from '../../type/plugin';\nimport { RUNTIME_011, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n error,\n composeRemoteRequestId,\n isPureRemoteEntry,\n isRemoteInfoWithEntry,\n getRemoteEntryInfoFromSnapshot,\n} from '../../utils';\nimport { PreloadOptions, RemoteInfo } from '../../type';\nimport { preloadAssets } from '../../utils/preload';\n\nexport function assignRemoteInfo(\n remoteInfo: RemoteInfo,\n remoteSnapshot: ModuleInfo,\n): void {\n const remoteEntryInfo = getRemoteEntryInfoFromSnapshot(remoteSnapshot);\n if (!remoteEntryInfo.url) {\n error(RUNTIME_011, runtimeDescMap, { remoteName: remoteInfo.name });\n }\n\n let entryUrl = getResourceUrl(remoteSnapshot, remoteEntryInfo.url);\n\n if (!isBrowserEnvValue && !entryUrl.startsWith('http')) {\n entryUrl = `https:${entryUrl}`;\n }\n\n remoteInfo.type = remoteEntryInfo.type;\n remoteInfo.entryGlobalName = remoteEntryInfo.globalName;\n remoteInfo.entry = entryUrl;\n remoteInfo.version = remoteSnapshot.version;\n remoteInfo.buildVersion = remoteSnapshot.buildVersion;\n}\n\nexport function snapshotPlugin(): ModuleFederationRuntimePlugin {\n return {\n name: 'snapshot-plugin',\n async afterResolve(args) {\n const { remote, pkgNameOrAlias, expose, origin, remoteInfo, id } = args;\n\n if (!isRemoteInfoWithEntry(remote) || !isPureRemoteEntry(remote)) {\n const { remoteSnapshot, globalSnapshot } =\n await origin.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: composeRemoteRequestId(remote.name, expose),\n });\n\n assignRemoteInfo(remoteInfo, remoteSnapshot);\n // preloading assets\n const preloadOptions: PreloadOptions[0] = {\n remote,\n preloadConfig: {\n nameOrAlias: pkgNameOrAlias,\n exposes: [expose],\n resourceCategory: 'sync',\n share: false,\n depsRemote: false,\n },\n };\n\n const assets =\n await origin.remoteHandler.hooks.lifecycle.generatePreloadAssets.emit(\n {\n origin,\n preloadOptions,\n remoteInfo,\n remote,\n remoteSnapshot,\n globalSnapshot,\n },\n );\n\n if (assets) {\n preloadAssets(remoteInfo, origin, assets, false, {\n initiator: 'loadRemote',\n id,\n }).catch(() => undefined);\n }\n\n return {\n ...args,\n remoteSnapshot,\n };\n }\n\n return args;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,iBACd,YACA,gBACM;CACN,MAAM,kBAAkBA,4CAA+B,eAAe;AACtE,KAAI,CAAC,gBAAgB,IACnB,sBAAMC,4CAAaC,+CAAgB,EAAE,YAAY,WAAW,MAAM,CAAC;CAGrE,IAAI,sDAA0B,gBAAgB,gBAAgB,IAAI;AAElE,KAAI,CAACC,4CAAqB,CAAC,SAAS,WAAW,OAAO,CACpD,YAAW,SAAS;AAGtB,YAAW,OAAO,gBAAgB;AAClC,YAAW,kBAAkB,gBAAgB;AAC7C,YAAW,QAAQ;AACnB,YAAW,UAAU,eAAe;AACpC,YAAW,eAAe,eAAe;;AAG3C,SAAgB,iBAAgD;AAC9D,QAAO;EACL,MAAM;EACN,MAAM,aAAa,MAAM;GACvB,MAAM,EAAE,QAAQ,gBAAgB,QAAQ,QAAQ,YAAY,OAAO;AAEnE,OAAI,CAACC,mCAAsB,OAAO,IAAI,CAACC,+BAAkB,OAAO,EAAE;IAChE,MAAM,EAAE,gBAAgB,mBACtB,MAAM,OAAO,gBAAgB,uBAAuB;KAClD,YAAY;KACZ,IAAIC,wCAAuB,OAAO,MAAM,OAAO;KAChD,CAAC;AAEJ,qBAAiB,YAAY,eAAe;IAE5C,MAAM,iBAAoC;KACxC;KACA,eAAe;MACb,aAAa;MACb,SAAS,CAAC,OAAO;MACjB,kBAAkB;MAClB,OAAO;MACP,YAAY;MACb;KACF;IAED,MAAM,SACJ,MAAM,OAAO,cAAc,MAAM,UAAU,sBAAsB,KAC/D;KACE;KACA;KACA;KACA;KACA;KACA;KACD,CACF;AAEH,QAAI,OACF,+BAAc,YAAY,QAAQ,QAAQ,OAAO;KAC/C,WAAW;KACX;KACD,CAAC,CAAC,YAAY,OAAU;AAG3B,WAAO;KACL,GAAG;KACH;KACD;;AAGH,UAAO;;EAEV"}
@@ -0,0 +1,66 @@
1
+ import { error } from "../../utils/logger.js";
2
+ import { getRemoteEntryInfoFromSnapshot, isPureRemoteEntry, isRemoteInfoWithEntry } from "../../utils/tool.js";
3
+ import { composeRemoteRequestId } from "../../utils/manifest.js";
4
+ import "../../utils/index.js";
5
+ import { preloadAssets } from "../../utils/preload.js";
6
+ import { getResourceUrl, isBrowserEnvValue } from "@module-federation/sdk";
7
+ import { RUNTIME_011, runtimeDescMap } from "@module-federation/error-codes";
8
+
9
+ //#region src/plugins/snapshot/index.ts
10
+ function assignRemoteInfo(remoteInfo, remoteSnapshot) {
11
+ const remoteEntryInfo = getRemoteEntryInfoFromSnapshot(remoteSnapshot);
12
+ if (!remoteEntryInfo.url) error(RUNTIME_011, runtimeDescMap, { remoteName: remoteInfo.name });
13
+ let entryUrl = getResourceUrl(remoteSnapshot, remoteEntryInfo.url);
14
+ if (!isBrowserEnvValue && !entryUrl.startsWith("http")) entryUrl = `https:${entryUrl}`;
15
+ remoteInfo.type = remoteEntryInfo.type;
16
+ remoteInfo.entryGlobalName = remoteEntryInfo.globalName;
17
+ remoteInfo.entry = entryUrl;
18
+ remoteInfo.version = remoteSnapshot.version;
19
+ remoteInfo.buildVersion = remoteSnapshot.buildVersion;
20
+ }
21
+ function snapshotPlugin() {
22
+ return {
23
+ name: "snapshot-plugin",
24
+ async afterResolve(args) {
25
+ const { remote, pkgNameOrAlias, expose, origin, remoteInfo, id } = args;
26
+ if (!isRemoteInfoWithEntry(remote) || !isPureRemoteEntry(remote)) {
27
+ const { remoteSnapshot, globalSnapshot } = await origin.snapshotHandler.loadRemoteSnapshotInfo({
28
+ moduleInfo: remote,
29
+ id: composeRemoteRequestId(remote.name, expose)
30
+ });
31
+ assignRemoteInfo(remoteInfo, remoteSnapshot);
32
+ const preloadOptions = {
33
+ remote,
34
+ preloadConfig: {
35
+ nameOrAlias: pkgNameOrAlias,
36
+ exposes: [expose],
37
+ resourceCategory: "sync",
38
+ share: false,
39
+ depsRemote: false
40
+ }
41
+ };
42
+ const assets = await origin.remoteHandler.hooks.lifecycle.generatePreloadAssets.emit({
43
+ origin,
44
+ preloadOptions,
45
+ remoteInfo,
46
+ remote,
47
+ remoteSnapshot,
48
+ globalSnapshot
49
+ });
50
+ if (assets) preloadAssets(remoteInfo, origin, assets, false, {
51
+ initiator: "loadRemote",
52
+ id
53
+ }).catch(() => void 0);
54
+ return {
55
+ ...args,
56
+ remoteSnapshot
57
+ };
58
+ }
59
+ return args;
60
+ }
61
+ };
62
+ }
63
+
64
+ //#endregion
65
+ export { assignRemoteInfo, snapshotPlugin };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/snapshot/index.ts"],"sourcesContent":["import {\n ModuleInfo,\n getResourceUrl,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { ModuleFederationRuntimePlugin } from '../../type/plugin';\nimport { RUNTIME_011, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n error,\n composeRemoteRequestId,\n isPureRemoteEntry,\n isRemoteInfoWithEntry,\n getRemoteEntryInfoFromSnapshot,\n} from '../../utils';\nimport { PreloadOptions, RemoteInfo } from '../../type';\nimport { preloadAssets } from '../../utils/preload';\n\nexport function assignRemoteInfo(\n remoteInfo: RemoteInfo,\n remoteSnapshot: ModuleInfo,\n): void {\n const remoteEntryInfo = getRemoteEntryInfoFromSnapshot(remoteSnapshot);\n if (!remoteEntryInfo.url) {\n error(RUNTIME_011, runtimeDescMap, { remoteName: remoteInfo.name });\n }\n\n let entryUrl = getResourceUrl(remoteSnapshot, remoteEntryInfo.url);\n\n if (!isBrowserEnvValue && !entryUrl.startsWith('http')) {\n entryUrl = `https:${entryUrl}`;\n }\n\n remoteInfo.type = remoteEntryInfo.type;\n remoteInfo.entryGlobalName = remoteEntryInfo.globalName;\n remoteInfo.entry = entryUrl;\n remoteInfo.version = remoteSnapshot.version;\n remoteInfo.buildVersion = remoteSnapshot.buildVersion;\n}\n\nexport function snapshotPlugin(): ModuleFederationRuntimePlugin {\n return {\n name: 'snapshot-plugin',\n async afterResolve(args) {\n const { remote, pkgNameOrAlias, expose, origin, remoteInfo, id } = args;\n\n if (!isRemoteInfoWithEntry(remote) || !isPureRemoteEntry(remote)) {\n const { remoteSnapshot, globalSnapshot } =\n await origin.snapshotHandler.loadRemoteSnapshotInfo({\n moduleInfo: remote,\n id: composeRemoteRequestId(remote.name, expose),\n });\n\n assignRemoteInfo(remoteInfo, remoteSnapshot);\n // preloading assets\n const preloadOptions: PreloadOptions[0] = {\n remote,\n preloadConfig: {\n nameOrAlias: pkgNameOrAlias,\n exposes: [expose],\n resourceCategory: 'sync',\n share: false,\n depsRemote: false,\n },\n };\n\n const assets =\n await origin.remoteHandler.hooks.lifecycle.generatePreloadAssets.emit(\n {\n origin,\n preloadOptions,\n remoteInfo,\n remote,\n remoteSnapshot,\n globalSnapshot,\n },\n );\n\n if (assets) {\n preloadAssets(remoteInfo, origin, assets, false, {\n initiator: 'loadRemote',\n id,\n }).catch(() => undefined);\n }\n\n return {\n ...args,\n remoteSnapshot,\n };\n }\n\n return args;\n },\n };\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,iBACd,YACA,gBACM;CACN,MAAM,kBAAkB,+BAA+B,eAAe;AACtE,KAAI,CAAC,gBAAgB,IACnB,OAAM,aAAa,gBAAgB,EAAE,YAAY,WAAW,MAAM,CAAC;CAGrE,IAAI,WAAW,eAAe,gBAAgB,gBAAgB,IAAI;AAElE,KAAI,CAAC,qBAAqB,CAAC,SAAS,WAAW,OAAO,CACpD,YAAW,SAAS;AAGtB,YAAW,OAAO,gBAAgB;AAClC,YAAW,kBAAkB,gBAAgB;AAC7C,YAAW,QAAQ;AACnB,YAAW,UAAU,eAAe;AACpC,YAAW,eAAe,eAAe;;AAG3C,SAAgB,iBAAgD;AAC9D,QAAO;EACL,MAAM;EACN,MAAM,aAAa,MAAM;GACvB,MAAM,EAAE,QAAQ,gBAAgB,QAAQ,QAAQ,YAAY,OAAO;AAEnE,OAAI,CAAC,sBAAsB,OAAO,IAAI,CAAC,kBAAkB,OAAO,EAAE;IAChE,MAAM,EAAE,gBAAgB,mBACtB,MAAM,OAAO,gBAAgB,uBAAuB;KAClD,YAAY;KACZ,IAAI,uBAAuB,OAAO,MAAM,OAAO;KAChD,CAAC;AAEJ,qBAAiB,YAAY,eAAe;IAE5C,MAAM,iBAAoC;KACxC;KACA,eAAe;MACb,aAAa;MACb,SAAS,CAAC,OAAO;MACjB,kBAAkB;MAClB,OAAO;MACP,YAAY;MACb;KACF;IAED,MAAM,SACJ,MAAM,OAAO,cAAc,MAAM,UAAU,sBAAsB,KAC/D;KACE;KACA;KACA;KACA;KACA;KACA;KACD,CACF;AAEH,QAAI,OACF,eAAc,YAAY,QAAQ,QAAQ,OAAO;KAC/C,WAAW;KACX;KACD,CAAC,CAAC,YAAY,OAAU;AAG3B,WAAO;KACL,GAAG;KACH;KACD;;AAGH,UAAO;;EAEV"}