@module-federation/runtime-core 0.0.0-perf-devtools-20260107043700 → 0.0.0-perf-website-code-usage-20260914033703

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 (221) hide show
  1. package/README.md +1 -1
  2. package/dist/_virtual/_rolldown/runtime.cjs +19 -0
  3. package/dist/_virtual/_rolldown/runtime.js +18 -0
  4. package/dist/constant.cjs +9 -0
  5. package/dist/constant.cjs.map +1 -0
  6. package/dist/constant.js +7 -0
  7. package/dist/constant.js.map +1 -0
  8. package/dist/core.cjs +150 -0
  9. package/dist/core.cjs.map +1 -0
  10. package/dist/core.d.ts +199 -0
  11. package/dist/core.js +150 -0
  12. package/dist/core.js.map +1 -0
  13. package/dist/global.cjs +175 -0
  14. package/dist/global.cjs.map +1 -0
  15. package/dist/global.d.ts +46 -0
  16. package/dist/global.js +155 -0
  17. package/dist/global.js.map +1 -0
  18. package/dist/helpers.cjs +44 -0
  19. package/dist/helpers.cjs.map +1 -0
  20. package/dist/helpers.d.ts +30 -0
  21. package/dist/helpers.js +44 -0
  22. package/dist/helpers.js.map +1 -0
  23. package/dist/index.cjs +62 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.ts +30 -1
  26. package/dist/index.js +22 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/module/index.cjs +268 -0
  29. package/dist/module/index.cjs.map +1 -0
  30. package/dist/module/index.d.ts +33 -0
  31. package/dist/module/index.js +268 -0
  32. package/dist/module/index.js.map +1 -0
  33. package/dist/plugins/generate-preload-assets.cjs +182 -0
  34. package/dist/plugins/generate-preload-assets.cjs.map +1 -0
  35. package/dist/plugins/generate-preload-assets.js +182 -0
  36. package/dist/plugins/generate-preload-assets.js.map +1 -0
  37. package/dist/plugins/snapshot/SnapshotHandler.cjs +258 -0
  38. package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
  39. package/dist/plugins/snapshot/SnapshotHandler.d.ts +92 -0
  40. package/dist/plugins/snapshot/SnapshotHandler.js +257 -0
  41. package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
  42. package/dist/plugins/snapshot/disabled.cjs +13 -0
  43. package/dist/plugins/snapshot/disabled.cjs.map +1 -0
  44. package/dist/plugins/snapshot/disabled.js +13 -0
  45. package/dist/plugins/snapshot/disabled.js.map +1 -0
  46. package/dist/plugins/snapshot/index.cjs +77 -0
  47. package/dist/plugins/snapshot/index.cjs.map +1 -0
  48. package/dist/plugins/snapshot/index.js +76 -0
  49. package/dist/plugins/snapshot/index.js.map +1 -0
  50. package/dist/remote/disabled.cjs +38 -0
  51. package/dist/remote/disabled.cjs.map +1 -0
  52. package/dist/remote/disabled.js +37 -0
  53. package/dist/remote/disabled.js.map +1 -0
  54. package/dist/remote/index.cjs +458 -0
  55. package/dist/remote/index.cjs.map +1 -0
  56. package/dist/remote/index.d.ts +147 -0
  57. package/dist/remote/index.js +458 -0
  58. package/dist/remote/index.js.map +1 -0
  59. package/dist/shared/disabled.cjs +33 -0
  60. package/dist/shared/disabled.cjs.map +1 -0
  61. package/dist/shared/disabled.js +33 -0
  62. package/dist/shared/disabled.js.map +1 -0
  63. package/dist/shared/index.cjs +477 -0
  64. package/dist/shared/index.cjs.map +1 -0
  65. package/dist/shared/index.d.ts +113 -0
  66. package/dist/shared/index.js +477 -0
  67. package/dist/shared/index.js.map +1 -0
  68. package/dist/type/config.d.ts +138 -0
  69. package/dist/type/index.cjs +13 -0
  70. package/dist/type/index.cjs.map +1 -0
  71. package/dist/type/index.d.ts +11 -0
  72. package/dist/type/index.js +8 -0
  73. package/dist/type/index.js.map +1 -0
  74. package/dist/type/plugin.d.ts +28 -0
  75. package/dist/type/preload.d.ts +60 -0
  76. package/dist/types.cjs +0 -0
  77. package/dist/types.d.ts +4 -1
  78. package/dist/types.js +1 -0
  79. package/dist/utils/context.cjs +45 -0
  80. package/dist/utils/context.cjs.map +1 -0
  81. package/dist/utils/context.d.ts +1 -0
  82. package/dist/utils/context.js +44 -0
  83. package/dist/utils/context.js.map +1 -0
  84. package/dist/utils/env.cjs +10 -0
  85. package/dist/utils/env.cjs.map +1 -0
  86. package/dist/utils/env.d.ts +1 -0
  87. package/dist/utils/env.js +10 -0
  88. package/dist/utils/env.js.map +1 -0
  89. package/dist/utils/hooks/asyncHook.cjs +26 -0
  90. package/dist/utils/hooks/asyncHook.cjs.map +1 -0
  91. package/dist/utils/hooks/asyncHook.d.ts +10 -0
  92. package/dist/utils/hooks/asyncHook.js +26 -0
  93. package/dist/utils/hooks/asyncHook.js.map +1 -0
  94. package/dist/utils/hooks/asyncWaterfallHooks.cjs +44 -0
  95. package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
  96. package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
  97. package/dist/utils/hooks/asyncWaterfallHooks.js +44 -0
  98. package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
  99. package/dist/utils/hooks/index.cjs +5 -0
  100. package/dist/utils/hooks/index.js +7 -0
  101. package/dist/utils/hooks/pluginSystem.cjs +38 -0
  102. package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
  103. package/dist/utils/hooks/pluginSystem.d.ts +16 -0
  104. package/dist/utils/hooks/pluginSystem.js +38 -0
  105. package/dist/utils/hooks/pluginSystem.js.map +1 -0
  106. package/dist/utils/hooks/syncHook.cjs +37 -0
  107. package/dist/utils/hooks/syncHook.cjs.map +1 -0
  108. package/dist/utils/hooks/syncHook.d.ts +16 -0
  109. package/dist/utils/hooks/syncHook.js +36 -0
  110. package/dist/utils/hooks/syncHook.js.map +1 -0
  111. package/dist/utils/hooks/syncWaterfallHook.cjs +40 -0
  112. package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
  113. package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
  114. package/dist/utils/hooks/syncWaterfallHook.js +39 -0
  115. package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
  116. package/dist/utils/index.cjs +8 -0
  117. package/dist/utils/index.d.ts +4 -0
  118. package/dist/utils/index.js +9 -0
  119. package/dist/utils/load.cjs +280 -0
  120. package/dist/utils/load.cjs.map +1 -0
  121. package/dist/utils/load.d.ts +16 -0
  122. package/dist/utils/load.js +277 -0
  123. package/dist/utils/load.js.map +1 -0
  124. package/dist/utils/logger.cjs +34 -0
  125. package/dist/utils/logger.cjs.map +1 -0
  126. package/dist/utils/logger.d.ts +10 -0
  127. package/dist/utils/logger.js +31 -0
  128. package/dist/utils/logger.js.map +1 -0
  129. package/dist/utils/manifest.cjs +56 -0
  130. package/dist/utils/manifest.cjs.map +1 -0
  131. package/dist/utils/manifest.d.ts +10 -0
  132. package/dist/utils/manifest.js +53 -0
  133. package/dist/utils/manifest.js.map +1 -0
  134. package/dist/utils/plugin.cjs +50 -0
  135. package/dist/utils/plugin.cjs.map +1 -0
  136. package/dist/utils/plugin.d.ts +1 -0
  137. package/dist/utils/plugin.js +50 -0
  138. package/dist/utils/plugin.js.map +1 -0
  139. package/dist/utils/preload.cjs +221 -0
  140. package/dist/utils/preload.cjs.map +1 -0
  141. package/dist/utils/preload.d.ts +8 -0
  142. package/dist/utils/preload.js +218 -0
  143. package/dist/utils/preload.js.map +1 -0
  144. package/dist/utils/semver/compare.cjs +48 -0
  145. package/dist/utils/semver/compare.cjs.map +1 -0
  146. package/dist/utils/semver/compare.js +47 -0
  147. package/dist/utils/semver/compare.js.map +1 -0
  148. package/dist/utils/semver/constants.cjs +41 -0
  149. package/dist/utils/semver/constants.cjs.map +1 -0
  150. package/dist/utils/semver/constants.js +31 -0
  151. package/dist/utils/semver/constants.js.map +1 -0
  152. package/dist/utils/semver/index.cjs +68 -0
  153. package/dist/utils/semver/index.cjs.map +1 -0
  154. package/dist/utils/semver/index.d.ts +5 -0
  155. package/dist/utils/semver/index.js +68 -0
  156. package/dist/utils/semver/index.js.map +1 -0
  157. package/dist/utils/semver/parser.cjs +104 -0
  158. package/dist/utils/semver/parser.cjs.map +1 -0
  159. package/dist/utils/semver/parser.js +96 -0
  160. package/dist/utils/semver/parser.js.map +1 -0
  161. package/dist/utils/semver/utils.cjs +28 -0
  162. package/dist/utils/semver/utils.cjs.map +1 -0
  163. package/dist/utils/semver/utils.js +24 -0
  164. package/dist/utils/semver/utils.js.map +1 -0
  165. package/dist/utils/share.cjs +285 -0
  166. package/dist/utils/share.cjs.map +1 -0
  167. package/dist/utils/share.d.ts +24 -0
  168. package/dist/utils/share.js +279 -0
  169. package/dist/utils/share.js.map +1 -0
  170. package/dist/utils/tool.cjs +82 -0
  171. package/dist/utils/tool.cjs.map +1 -0
  172. package/dist/utils/tool.d.ts +8 -0
  173. package/dist/utils/tool.js +71 -0
  174. package/dist/utils/tool.js.map +1 -0
  175. package/package.json +16 -9
  176. package/dist/index.cjs.cjs +0 -3226
  177. package/dist/index.cjs.cjs.map +0 -1
  178. package/dist/index.cjs.d.ts +0 -1
  179. package/dist/index.esm.js +0 -3202
  180. package/dist/index.esm.js.map +0 -1
  181. package/dist/src/constant.d.ts +0 -2
  182. package/dist/src/core.d.ts +0 -115
  183. package/dist/src/global.d.ts +0 -42
  184. package/dist/src/helpers.d.ts +0 -38
  185. package/dist/src/index.d.ts +0 -14
  186. package/dist/src/module/index.d.ts +0 -22
  187. package/dist/src/plugins/generate-preload-assets.d.ts +0 -8
  188. package/dist/src/plugins/snapshot/SnapshotHandler.d.ts +0 -60
  189. package/dist/src/plugins/snapshot/index.d.ts +0 -5
  190. package/dist/src/remote/index.d.ts +0 -109
  191. package/dist/src/shared/index.d.ts +0 -66
  192. package/dist/src/type/config.d.ts +0 -115
  193. package/dist/src/type/index.d.ts +0 -3
  194. package/dist/src/type/plugin.d.ts +0 -35
  195. package/dist/src/type/preload.d.ts +0 -26
  196. package/dist/src/types.d.ts +0 -1
  197. package/dist/src/utils/env.d.ts +0 -3
  198. package/dist/src/utils/hooks/asyncHook.d.ts +0 -6
  199. package/dist/src/utils/hooks/asyncWaterfallHooks.d.ts +0 -10
  200. package/dist/src/utils/hooks/index.d.ts +0 -6
  201. package/dist/src/utils/hooks/pluginSystem.d.ts +0 -16
  202. package/dist/src/utils/hooks/syncHook.d.ts +0 -12
  203. package/dist/src/utils/hooks/syncWaterfallHook.d.ts +0 -9
  204. package/dist/src/utils/index.d.ts +0 -6
  205. package/dist/src/utils/load.d.ts +0 -11
  206. package/dist/src/utils/logger.d.ts +0 -6
  207. package/dist/src/utils/manifest.d.ts +0 -7
  208. package/dist/src/utils/plugin.d.ts +0 -3
  209. package/dist/src/utils/preload.d.ts +0 -6
  210. package/dist/src/utils/semver/compare.d.ts +0 -9
  211. package/dist/src/utils/semver/constants.d.ts +0 -10
  212. package/dist/src/utils/semver/index.d.ts +0 -2
  213. package/dist/src/utils/semver/parser.d.ts +0 -9
  214. package/dist/src/utils/semver/utils.d.ts +0 -11
  215. package/dist/src/utils/share.d.ts +0 -27
  216. package/dist/src/utils/tool.d.ts +0 -18
  217. package/dist/types.cjs.cjs +0 -3
  218. package/dist/types.cjs.cjs.map +0 -1
  219. package/dist/types.cjs.d.ts +0 -1
  220. package/dist/types.esm.js +0 -2
  221. package/dist/types.esm.js.map +0 -1
@@ -0,0 +1,50 @@
1
+ import { assert } from "./logger.js";
2
+ import { isPlainObject } from "./tool.js";
3
+ import { getGlobalHostPlugins } from "../global.js";
4
+
5
+ //#region src/utils/plugin.ts
6
+ function getPluginsToRegister(plugins) {
7
+ const pluginsByName = /* @__PURE__ */ new Map();
8
+ [...plugins || [], ...getGlobalHostPlugins()].forEach((plugin) => {
9
+ if (!plugin) return;
10
+ assert(isPlainObject(plugin), "Plugin configuration is invalid.");
11
+ assert(plugin.name, "A name must be provided by the plugin.");
12
+ if (!pluginsByName.has(plugin.name)) pluginsByName.set(plugin.name, plugin);
13
+ });
14
+ return Array.from(pluginsByName.values());
15
+ }
16
+ function getInstancePlugin(plugin, instanceHooks) {
17
+ if (instanceHooks === void 0) return plugin;
18
+ return {
19
+ ...instanceHooks,
20
+ name: plugin.name,
21
+ version: plugin.version
22
+ };
23
+ }
24
+ function registerPlugins(plugins, instance) {
25
+ const registeredPlugins = /* @__PURE__ */ new Map();
26
+ instance.options.plugins.forEach((plugin) => {
27
+ if (plugin) registeredPlugins.set(plugin.name, plugin);
28
+ });
29
+ const hookInstances = [
30
+ instance.hooks,
31
+ instance.remoteHandler.hooks,
32
+ instance.sharedHandler.hooks,
33
+ instance.snapshotHandler.hooks,
34
+ instance.loaderHook,
35
+ instance.bridgeHook
36
+ ];
37
+ getPluginsToRegister(plugins).forEach((plugin) => {
38
+ registeredPlugins.set(plugin.name, plugin);
39
+ if (instance.hooks.registerPlugins[plugin.name]) return;
40
+ const instancePlugin = getInstancePlugin(plugin, plugin.apply?.(instance));
41
+ hookInstances.forEach((hookInstance) => {
42
+ hookInstance.applyPlugin(instancePlugin);
43
+ });
44
+ });
45
+ return Array.from(registeredPlugins.values());
46
+ }
47
+
48
+ //#endregion
49
+ export { registerPlugins };
50
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../src/utils/plugin.ts"],"sourcesContent":["import { ModuleFederation } from '../core';\nimport {\n ModuleFederationRuntimePlugin,\n RuntimePluginHooks,\n UserOptions,\n} from '../type';\nimport { getGlobalHostPlugins } from '../global';\nimport { assert } from './logger';\nimport { isPlainObject } from './tool';\n\nfunction getPluginsToRegister(\n plugins: UserOptions['plugins'],\n): Array<ModuleFederationRuntimePlugin> {\n const pluginsByName = new Map<string, ModuleFederationRuntimePlugin>();\n\n [...(plugins || []), ...getGlobalHostPlugins()].forEach((plugin) => {\n if (!plugin) {\n return;\n }\n\n assert(isPlainObject(plugin), 'Plugin configuration is invalid.');\n assert(plugin.name, 'A name must be provided by the plugin.');\n\n if (!pluginsByName.has(plugin.name)) {\n pluginsByName.set(plugin.name, plugin);\n }\n });\n\n return Array.from(pluginsByName.values());\n}\n\nfunction getInstancePlugin(\n plugin: ModuleFederationRuntimePlugin,\n instanceHooks: void | RuntimePluginHooks,\n): ModuleFederationRuntimePlugin {\n if (instanceHooks === undefined) {\n return plugin;\n }\n\n return {\n ...instanceHooks,\n name: plugin.name,\n version: plugin.version,\n };\n}\n\nexport function registerPlugins(\n plugins: UserOptions['plugins'],\n instance: ModuleFederation,\n) {\n const registeredPlugins = new Map<string, ModuleFederationRuntimePlugin>();\n instance.options.plugins.forEach((plugin) => {\n if (plugin) {\n registeredPlugins.set(plugin.name, plugin);\n }\n });\n const hookInstances = [\n instance.hooks,\n instance.remoteHandler.hooks,\n instance.sharedHandler.hooks,\n instance.snapshotHandler.hooks,\n instance.loaderHook,\n instance.bridgeHook,\n ];\n\n getPluginsToRegister(plugins).forEach((plugin) => {\n registeredPlugins.set(plugin.name, plugin);\n\n if (instance.hooks.registerPlugins[plugin.name]) {\n return;\n }\n\n const instancePlugin = getInstancePlugin(plugin, plugin.apply?.(instance));\n hookInstances.forEach((hookInstance) => {\n hookInstance.applyPlugin(instancePlugin);\n });\n });\n\n return Array.from(registeredPlugins.values());\n}\n"],"mappings":";;;;;AAUA,SAAS,qBACP,SACsC;CACtC,MAAM,gCAAgB,IAAI,KAA4C;AAEtE,EAAC,GAAI,WAAW,EAAE,EAAG,GAAG,sBAAsB,CAAC,CAAC,SAAS,WAAW;AAClE,MAAI,CAAC,OACH;AAGF,SAAO,cAAc,OAAO,EAAE,mCAAmC;AACjE,SAAO,OAAO,MAAM,yCAAyC;AAE7D,MAAI,CAAC,cAAc,IAAI,OAAO,KAAK,CACjC,eAAc,IAAI,OAAO,MAAM,OAAO;GAExC;AAEF,QAAO,MAAM,KAAK,cAAc,QAAQ,CAAC;;AAG3C,SAAS,kBACP,QACA,eAC+B;AAC/B,KAAI,kBAAkB,OACpB,QAAO;AAGT,QAAO;EACL,GAAG;EACH,MAAM,OAAO;EACb,SAAS,OAAO;EACjB;;AAGH,SAAgB,gBACd,SACA,UACA;CACA,MAAM,oCAAoB,IAAI,KAA4C;AAC1E,UAAS,QAAQ,QAAQ,SAAS,WAAW;AAC3C,MAAI,OACF,mBAAkB,IAAI,OAAO,MAAM,OAAO;GAE5C;CACF,MAAM,gBAAgB;EACpB,SAAS;EACT,SAAS,cAAc;EACvB,SAAS,cAAc;EACvB,SAAS,gBAAgB;EACzB,SAAS;EACT,SAAS;EACV;AAED,sBAAqB,QAAQ,CAAC,SAAS,WAAW;AAChD,oBAAkB,IAAI,OAAO,MAAM,OAAO;AAE1C,MAAI,SAAS,MAAM,gBAAgB,OAAO,MACxC;EAGF,MAAM,iBAAiB,kBAAkB,QAAQ,OAAO,QAAQ,SAAS,CAAC;AAC1E,gBAAc,SAAS,iBAAiB;AACtC,gBAAa,YAAY,eAAe;IACxC;GACF;AAEF,QAAO,MAAM,KAAK,kBAAkB,QAAQ,CAAC"}
@@ -0,0 +1,221 @@
1
+ const require_logger = require('./logger.cjs');
2
+ const require_global = require('../global.cjs');
3
+ const require_manifest = require('./manifest.cjs');
4
+ const require_load = require('./load.cjs');
5
+ let _module_federation_sdk = require("@module-federation/sdk");
6
+
7
+ //#region src/utils/preload.ts
8
+ function defaultPreloadArgs(preloadConfig) {
9
+ return {
10
+ resourceCategory: "sync",
11
+ share: true,
12
+ depsRemote: true,
13
+ recordPreloadedAssets: true,
14
+ ...preloadConfig
15
+ };
16
+ }
17
+ function formatPreloadArgs(remotes, preloadArgs) {
18
+ return preloadArgs.map((args) => {
19
+ const remoteInfo = require_manifest.matchRemote(remotes, args.nameOrAlias);
20
+ require_logger.assert(remoteInfo, `Unable to preload ${args.nameOrAlias} as it is not included in ${!remoteInfo && (0, _module_federation_sdk.safeToString)({
21
+ remoteInfo,
22
+ remotes
23
+ })}`);
24
+ return {
25
+ remote: remoteInfo,
26
+ preloadConfig: defaultPreloadArgs(args)
27
+ };
28
+ });
29
+ }
30
+ function normalizePreloadExposes(exposes) {
31
+ if (!exposes) return [];
32
+ return exposes.map((expose) => {
33
+ if (expose === ".") return expose;
34
+ if (expose.startsWith("./")) return expose.replace("./", "");
35
+ return expose;
36
+ });
37
+ }
38
+ function isTimeoutError(error) {
39
+ if (!(error instanceof Error)) return false;
40
+ return error.message.includes("timed out") || error.name.includes("Timeout");
41
+ }
42
+ function createAssetResult(context, url, status, error) {
43
+ return {
44
+ url,
45
+ status,
46
+ resourceType: context.resourceType,
47
+ initiator: context.initiator,
48
+ id: context.id,
49
+ error
50
+ };
51
+ }
52
+ function preloadAssetOnce(context, url, recordPreloadedAssets, preload) {
53
+ if (!recordPreloadedAssets) return preload();
54
+ if (require_global.getPreloadedAsset(url)) return Promise.resolve(createAssetResult(context, url, "cached"));
55
+ require_global.setPreloadedAsset(url);
56
+ return preload();
57
+ }
58
+ async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
59
+ const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
60
+ const url = entryRemoteInfo.entry;
61
+ if (cachedRemote?.remoteEntryExports) return createAssetResult(context, url, "cached");
62
+ try {
63
+ if (!await require_load.getRemoteEntry({
64
+ origin: host,
65
+ remoteInfo: entryRemoteInfo,
66
+ remoteEntryExports: cachedRemote?.remoteEntryExports,
67
+ resourceContext: {
68
+ ...context,
69
+ url
70
+ }
71
+ })) throw new Error(`Failed to load remoteEntry "${url}".`);
72
+ return createAssetResult(context, url, "success");
73
+ } catch (error) {
74
+ return createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error);
75
+ }
76
+ }
77
+ function waitForLinkPreload({ host, remoteInfo, url, attrs, context, needDeleteLink }) {
78
+ return new Promise((resolve) => {
79
+ const { link, needAttach } = (0, _module_federation_sdk.createLink)({
80
+ url,
81
+ cb: () => {
82
+ resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
83
+ },
84
+ onErrorCallback: (error) => {
85
+ resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
86
+ },
87
+ attrs,
88
+ createLinkHook: (hookUrl, hookAttrs) => {
89
+ const res = host.loaderHook.lifecycle.createLink.emit({
90
+ url: hookUrl,
91
+ attrs: hookAttrs,
92
+ remoteInfo,
93
+ resourceContext: {
94
+ ...context,
95
+ url: hookUrl
96
+ }
97
+ });
98
+ if (res instanceof HTMLLinkElement) return res;
99
+ return res;
100
+ },
101
+ needDeleteLink
102
+ });
103
+ needAttach && document.head.appendChild(link);
104
+ });
105
+ }
106
+ function waitForScriptPreload({ host, remoteInfo, url, attrs, context }) {
107
+ return new Promise((resolve) => {
108
+ const { script, needAttach } = (0, _module_federation_sdk.createScript)({
109
+ url,
110
+ cb: () => {
111
+ resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
112
+ },
113
+ onErrorCallback: (error) => {
114
+ resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
115
+ },
116
+ attrs,
117
+ createScriptHook: (hookUrl, hookAttrs) => {
118
+ const res = host.loaderHook.lifecycle.createScript.emit({
119
+ url: hookUrl,
120
+ attrs: hookAttrs,
121
+ remoteInfo,
122
+ resourceContext: {
123
+ ...context,
124
+ url: hookUrl
125
+ }
126
+ });
127
+ if (res instanceof HTMLScriptElement) return res;
128
+ return res;
129
+ },
130
+ needDeleteScript: true
131
+ });
132
+ needAttach && document.head.appendChild(script);
133
+ });
134
+ }
135
+ function createResourceContext(baseContext, resourceType) {
136
+ return {
137
+ ...baseContext,
138
+ resourceType
139
+ };
140
+ }
141
+ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
142
+ initiator: "preloadRemote",
143
+ id: remoteInfo.name
144
+ }, recordPreloadedAssets = true) {
145
+ const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
146
+ const results = [];
147
+ if (host.options.inBrowser) {
148
+ entryAssets.forEach((asset) => {
149
+ const { moduleInfo: entryRemoteInfo } = asset;
150
+ results.push(waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, createResourceContext(baseContext, "remoteEntry")));
151
+ });
152
+ if (useLinkPreload) {
153
+ const defaultAttrs = {
154
+ rel: "preload",
155
+ as: "style"
156
+ };
157
+ cssAssets.forEach((cssUrl) => {
158
+ const context = createResourceContext(baseContext, "css");
159
+ results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
160
+ host,
161
+ remoteInfo,
162
+ url: cssUrl,
163
+ attrs: defaultAttrs,
164
+ context
165
+ })));
166
+ });
167
+ } else {
168
+ const defaultAttrs = {
169
+ rel: "stylesheet",
170
+ type: "text/css"
171
+ };
172
+ cssAssets.forEach((cssUrl) => {
173
+ const context = createResourceContext(baseContext, "css");
174
+ results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
175
+ host,
176
+ remoteInfo,
177
+ url: cssUrl,
178
+ attrs: defaultAttrs,
179
+ needDeleteLink: false,
180
+ context
181
+ })));
182
+ });
183
+ }
184
+ let preloadJsAsset = waitForScriptPreload;
185
+ let defaultAttrs = {
186
+ fetchpriority: "high",
187
+ type: "text/javascript"
188
+ };
189
+ if (useLinkPreload) {
190
+ preloadJsAsset = waitForLinkPreload;
191
+ defaultAttrs = {
192
+ rel: "preload",
193
+ as: "script"
194
+ };
195
+ } else if (require_load.isEsmRemoteType(remoteInfo.type)) {
196
+ preloadJsAsset = waitForLinkPreload;
197
+ defaultAttrs = {
198
+ rel: "modulepreload",
199
+ fetchpriority: "high"
200
+ };
201
+ }
202
+ jsAssetsWithoutEntry.forEach((jsUrl) => {
203
+ const context = createResourceContext(baseContext, "js");
204
+ results.push(preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () => preloadJsAsset({
205
+ host,
206
+ remoteInfo,
207
+ url: jsUrl,
208
+ attrs: defaultAttrs,
209
+ context
210
+ })));
211
+ });
212
+ }
213
+ return Promise.all(results);
214
+ }
215
+
216
+ //#endregion
217
+ exports.defaultPreloadArgs = defaultPreloadArgs;
218
+ exports.formatPreloadArgs = formatPreloadArgs;
219
+ exports.normalizePreloadExposes = normalizePreloadExposes;
220
+ exports.preloadAssets = preloadAssets;
221
+ //# sourceMappingURL=preload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.cjs","names":["matchRemote","getPreloadedAsset","getRemoteEntry","isEsmRemoteType"],"sources":["../../src/utils/preload.ts"],"sourcesContent":["import { createLink, createScript, safeToString } from '@module-federation/sdk';\nimport {\n PreloadAssets,\n PreloadAssetResult,\n PreloadConfig,\n PreloadOptions,\n PreloadRemoteArgs,\n Remote,\n RemoteInfo,\n ResourceLoadContext,\n ResourceLoadType,\n depsPreloadArg,\n} from '../type';\nimport { matchRemote } from './manifest';\nimport { assert } from './logger';\nimport { ModuleFederation } from '../core';\nimport { getRemoteEntry, isEsmRemoteType } from './load';\nimport { getPreloadedAsset, setPreloadedAsset } from '../global';\n\nexport function defaultPreloadArgs(\n preloadConfig: PreloadRemoteArgs | depsPreloadArg,\n): PreloadConfig {\n return {\n resourceCategory: 'sync',\n share: true,\n depsRemote: true,\n recordPreloadedAssets: true,\n ...preloadConfig,\n } as PreloadConfig;\n}\n\nexport function formatPreloadArgs(\n remotes: Array<Remote>,\n preloadArgs: Array<PreloadRemoteArgs>,\n): PreloadOptions {\n return preloadArgs.map((args) => {\n const remoteInfo = matchRemote(remotes, args.nameOrAlias);\n assert(\n remoteInfo,\n `Unable to preload ${args.nameOrAlias} as it is not included in ${\n !remoteInfo &&\n safeToString({\n remoteInfo,\n remotes,\n })\n }`,\n );\n return {\n remote: remoteInfo,\n preloadConfig: defaultPreloadArgs(args),\n };\n });\n}\n\nexport function normalizePreloadExposes(exposes?: string[]): string[] {\n if (!exposes) {\n return [];\n }\n\n return exposes.map((expose) => {\n if (expose === '.') {\n return expose;\n }\n if (expose.startsWith('./')) {\n return expose.replace('./', '');\n }\n return expose;\n });\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n return error.message.includes('timed out') || error.name.includes('Timeout');\n}\n\nfunction createAssetResult(\n context: ResourceLoadContext,\n url: string,\n status: PreloadAssetResult['status'],\n error?: unknown,\n): PreloadAssetResult {\n return {\n url,\n status,\n resourceType: context.resourceType,\n initiator: context.initiator,\n id: context.id,\n error,\n };\n}\n\nfunction preloadAssetOnce(\n context: ResourceLoadContext,\n url: string,\n recordPreloadedAssets: boolean,\n preload: () => Promise<PreloadAssetResult>,\n): Promise<PreloadAssetResult> {\n if (!recordPreloadedAssets) {\n return preload();\n }\n\n if (getPreloadedAsset(url)) {\n return Promise.resolve(createAssetResult(context, url, 'cached'));\n }\n\n setPreloadedAsset(url);\n return preload();\n}\n\nasync function waitForRemoteEntryPreload(\n host: ModuleFederation,\n remoteInfo: RemoteInfo,\n entryRemoteInfo: RemoteInfo,\n context: ResourceLoadContext,\n): Promise<PreloadAssetResult> {\n const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);\n const url = entryRemoteInfo.entry;\n if (cachedRemote?.remoteEntryExports) {\n return createAssetResult(context, url, 'cached');\n }\n\n try {\n const remoteEntryExports = await getRemoteEntry({\n origin: host,\n remoteInfo: entryRemoteInfo,\n remoteEntryExports: cachedRemote?.remoteEntryExports,\n resourceContext: {\n ...context,\n url,\n },\n });\n if (!remoteEntryExports) {\n throw new Error(`Failed to load remoteEntry \"${url}\".`);\n }\n return createAssetResult(context, url, 'success');\n } catch (error) {\n return createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n );\n }\n}\n\nfunction waitForLinkPreload({\n host,\n remoteInfo,\n url,\n attrs,\n context,\n needDeleteLink,\n}: {\n host: ModuleFederation;\n remoteInfo: RemoteInfo;\n url: string;\n attrs: Record<string, string>;\n context: ResourceLoadContext;\n needDeleteLink?: boolean;\n}): Promise<PreloadAssetResult> {\n return new Promise((resolve) => {\n const { link, needAttach } = createLink({\n url,\n cb: () => {\n resolve(\n createAssetResult(context, url, needAttach ? 'success' : 'cached'),\n );\n },\n onErrorCallback: (error) => {\n resolve(\n createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n ),\n );\n },\n attrs,\n createLinkHook: (hookUrl, hookAttrs) => {\n const res = host.loaderHook.lifecycle.createLink.emit({\n url: hookUrl,\n attrs: hookAttrs,\n remoteInfo,\n resourceContext: {\n ...context,\n url: hookUrl,\n },\n });\n if (res instanceof HTMLLinkElement) {\n return res;\n }\n return res;\n },\n needDeleteLink,\n });\n\n needAttach && document.head.appendChild(link);\n });\n}\n\nfunction waitForScriptPreload({\n host,\n remoteInfo,\n url,\n attrs,\n context,\n}: {\n host: ModuleFederation;\n remoteInfo: RemoteInfo;\n url: string;\n attrs: Record<string, string>;\n context: ResourceLoadContext;\n}): Promise<PreloadAssetResult> {\n return new Promise((resolve) => {\n const { script, needAttach } = createScript({\n url,\n cb: () => {\n resolve(\n createAssetResult(context, url, needAttach ? 'success' : 'cached'),\n );\n },\n onErrorCallback: (error) => {\n resolve(\n createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n ),\n );\n },\n attrs,\n createScriptHook: (hookUrl: string, hookAttrs: any) => {\n const res = host.loaderHook.lifecycle.createScript.emit({\n url: hookUrl,\n attrs: hookAttrs,\n remoteInfo,\n resourceContext: {\n ...context,\n url: hookUrl,\n },\n });\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n return res;\n },\n needDeleteScript: true,\n });\n\n needAttach && document.head.appendChild(script);\n });\n}\n\nfunction createResourceContext(\n baseContext: Omit<ResourceLoadContext, 'resourceType'>,\n resourceType: ResourceLoadType,\n): ResourceLoadContext {\n return {\n ...baseContext,\n resourceType,\n };\n}\n\nexport function preloadAssets(\n remoteInfo: RemoteInfo,\n host: ModuleFederation,\n assets: PreloadAssets,\n // It is used to distinguish preload from load remote parallel loading\n useLinkPreload = true,\n baseContext: Omit<ResourceLoadContext, 'resourceType'> = {\n initiator: 'preloadRemote',\n id: remoteInfo.name,\n },\n recordPreloadedAssets = true,\n): Promise<PreloadAssetResult[]> {\n const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;\n const results: Array<Promise<PreloadAssetResult>> = [];\n\n if (host.options.inBrowser) {\n entryAssets.forEach((asset) => {\n const { moduleInfo: entryRemoteInfo } = asset;\n results.push(\n waitForRemoteEntryPreload(\n host,\n remoteInfo,\n entryRemoteInfo,\n createResourceContext(baseContext, 'remoteEntry'),\n ),\n );\n });\n\n if (useLinkPreload) {\n const defaultAttrs = {\n rel: 'preload',\n as: 'style',\n };\n cssAssets.forEach((cssUrl) => {\n const context = createResourceContext(baseContext, 'css');\n results.push(\n preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () =>\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n context,\n }),\n ),\n );\n });\n } else {\n const defaultAttrs = {\n rel: 'stylesheet',\n type: 'text/css',\n };\n cssAssets.forEach((cssUrl) => {\n const context = createResourceContext(baseContext, 'css');\n results.push(\n preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () =>\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n needDeleteLink: false,\n context,\n }),\n ),\n );\n });\n }\n\n let preloadJsAsset = waitForScriptPreload;\n let defaultAttrs: Record<string, string> = {\n fetchpriority: 'high',\n type: 'text/javascript',\n };\n\n if (useLinkPreload) {\n preloadJsAsset = waitForLinkPreload;\n defaultAttrs = {\n rel: 'preload',\n as: 'script',\n };\n } else if (isEsmRemoteType(remoteInfo.type)) {\n preloadJsAsset = waitForLinkPreload;\n defaultAttrs = {\n rel: 'modulepreload',\n fetchpriority: 'high',\n };\n }\n\n jsAssetsWithoutEntry.forEach((jsUrl) => {\n const context = createResourceContext(baseContext, 'js');\n results.push(\n preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () =>\n preloadJsAsset({\n host,\n remoteInfo,\n url: jsUrl,\n attrs: defaultAttrs,\n context,\n }),\n ),\n );\n });\n }\n\n return Promise.all(results);\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ModuleFederation } from "../core.js";
2
+ import { RemoteInfo } from "../type/config.js";
3
+ import { PreloadAssetResult, PreloadAssets, ResourceLoadContext } from "../type/preload.js";
4
+ //#region src/utils/preload.d.ts
5
+ declare function preloadAssets(remoteInfo: RemoteInfo, host: ModuleFederation, assets: PreloadAssets, useLinkPreload?: boolean, baseContext?: Omit<ResourceLoadContext, 'resourceType'>, recordPreloadedAssets?: boolean): Promise<PreloadAssetResult[]>;
6
+ //#endregion
7
+ export { preloadAssets };
8
+ //# sourceMappingURL=preload.d.ts.map
@@ -0,0 +1,218 @@
1
+ import { assert } from "./logger.js";
2
+ import { getPreloadedAsset, setPreloadedAsset } from "../global.js";
3
+ import { matchRemote } from "./manifest.js";
4
+ import { getRemoteEntry, isEsmRemoteType } from "./load.js";
5
+ import { createLink, createScript, safeToString } from "@module-federation/sdk";
6
+
7
+ //#region src/utils/preload.ts
8
+ function defaultPreloadArgs(preloadConfig) {
9
+ return {
10
+ resourceCategory: "sync",
11
+ share: true,
12
+ depsRemote: true,
13
+ recordPreloadedAssets: true,
14
+ ...preloadConfig
15
+ };
16
+ }
17
+ function formatPreloadArgs(remotes, preloadArgs) {
18
+ return preloadArgs.map((args) => {
19
+ const remoteInfo = matchRemote(remotes, args.nameOrAlias);
20
+ assert(remoteInfo, `Unable to preload ${args.nameOrAlias} as it is not included in ${!remoteInfo && safeToString({
21
+ remoteInfo,
22
+ remotes
23
+ })}`);
24
+ return {
25
+ remote: remoteInfo,
26
+ preloadConfig: defaultPreloadArgs(args)
27
+ };
28
+ });
29
+ }
30
+ function normalizePreloadExposes(exposes) {
31
+ if (!exposes) return [];
32
+ return exposes.map((expose) => {
33
+ if (expose === ".") return expose;
34
+ if (expose.startsWith("./")) return expose.replace("./", "");
35
+ return expose;
36
+ });
37
+ }
38
+ function isTimeoutError(error) {
39
+ if (!(error instanceof Error)) return false;
40
+ return error.message.includes("timed out") || error.name.includes("Timeout");
41
+ }
42
+ function createAssetResult(context, url, status, error) {
43
+ return {
44
+ url,
45
+ status,
46
+ resourceType: context.resourceType,
47
+ initiator: context.initiator,
48
+ id: context.id,
49
+ error
50
+ };
51
+ }
52
+ function preloadAssetOnce(context, url, recordPreloadedAssets, preload) {
53
+ if (!recordPreloadedAssets) return preload();
54
+ if (getPreloadedAsset(url)) return Promise.resolve(createAssetResult(context, url, "cached"));
55
+ setPreloadedAsset(url);
56
+ return preload();
57
+ }
58
+ async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
59
+ const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
60
+ const url = entryRemoteInfo.entry;
61
+ if (cachedRemote?.remoteEntryExports) return createAssetResult(context, url, "cached");
62
+ try {
63
+ if (!await getRemoteEntry({
64
+ origin: host,
65
+ remoteInfo: entryRemoteInfo,
66
+ remoteEntryExports: cachedRemote?.remoteEntryExports,
67
+ resourceContext: {
68
+ ...context,
69
+ url
70
+ }
71
+ })) throw new Error(`Failed to load remoteEntry "${url}".`);
72
+ return createAssetResult(context, url, "success");
73
+ } catch (error) {
74
+ return createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error);
75
+ }
76
+ }
77
+ function waitForLinkPreload({ host, remoteInfo, url, attrs, context, needDeleteLink }) {
78
+ return new Promise((resolve) => {
79
+ const { link, needAttach } = createLink({
80
+ url,
81
+ cb: () => {
82
+ resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
83
+ },
84
+ onErrorCallback: (error) => {
85
+ resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
86
+ },
87
+ attrs,
88
+ createLinkHook: (hookUrl, hookAttrs) => {
89
+ const res = host.loaderHook.lifecycle.createLink.emit({
90
+ url: hookUrl,
91
+ attrs: hookAttrs,
92
+ remoteInfo,
93
+ resourceContext: {
94
+ ...context,
95
+ url: hookUrl
96
+ }
97
+ });
98
+ if (res instanceof HTMLLinkElement) return res;
99
+ return res;
100
+ },
101
+ needDeleteLink
102
+ });
103
+ needAttach && document.head.appendChild(link);
104
+ });
105
+ }
106
+ function waitForScriptPreload({ host, remoteInfo, url, attrs, context }) {
107
+ return new Promise((resolve) => {
108
+ const { script, needAttach } = createScript({
109
+ url,
110
+ cb: () => {
111
+ resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
112
+ },
113
+ onErrorCallback: (error) => {
114
+ resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
115
+ },
116
+ attrs,
117
+ createScriptHook: (hookUrl, hookAttrs) => {
118
+ const res = host.loaderHook.lifecycle.createScript.emit({
119
+ url: hookUrl,
120
+ attrs: hookAttrs,
121
+ remoteInfo,
122
+ resourceContext: {
123
+ ...context,
124
+ url: hookUrl
125
+ }
126
+ });
127
+ if (res instanceof HTMLScriptElement) return res;
128
+ return res;
129
+ },
130
+ needDeleteScript: true
131
+ });
132
+ needAttach && document.head.appendChild(script);
133
+ });
134
+ }
135
+ function createResourceContext(baseContext, resourceType) {
136
+ return {
137
+ ...baseContext,
138
+ resourceType
139
+ };
140
+ }
141
+ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
142
+ initiator: "preloadRemote",
143
+ id: remoteInfo.name
144
+ }, recordPreloadedAssets = true) {
145
+ const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
146
+ const results = [];
147
+ if (host.options.inBrowser) {
148
+ entryAssets.forEach((asset) => {
149
+ const { moduleInfo: entryRemoteInfo } = asset;
150
+ results.push(waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, createResourceContext(baseContext, "remoteEntry")));
151
+ });
152
+ if (useLinkPreload) {
153
+ const defaultAttrs = {
154
+ rel: "preload",
155
+ as: "style"
156
+ };
157
+ cssAssets.forEach((cssUrl) => {
158
+ const context = createResourceContext(baseContext, "css");
159
+ results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
160
+ host,
161
+ remoteInfo,
162
+ url: cssUrl,
163
+ attrs: defaultAttrs,
164
+ context
165
+ })));
166
+ });
167
+ } else {
168
+ const defaultAttrs = {
169
+ rel: "stylesheet",
170
+ type: "text/css"
171
+ };
172
+ cssAssets.forEach((cssUrl) => {
173
+ const context = createResourceContext(baseContext, "css");
174
+ results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
175
+ host,
176
+ remoteInfo,
177
+ url: cssUrl,
178
+ attrs: defaultAttrs,
179
+ needDeleteLink: false,
180
+ context
181
+ })));
182
+ });
183
+ }
184
+ let preloadJsAsset = waitForScriptPreload;
185
+ let defaultAttrs = {
186
+ fetchpriority: "high",
187
+ type: "text/javascript"
188
+ };
189
+ if (useLinkPreload) {
190
+ preloadJsAsset = waitForLinkPreload;
191
+ defaultAttrs = {
192
+ rel: "preload",
193
+ as: "script"
194
+ };
195
+ } else if (isEsmRemoteType(remoteInfo.type)) {
196
+ preloadJsAsset = waitForLinkPreload;
197
+ defaultAttrs = {
198
+ rel: "modulepreload",
199
+ fetchpriority: "high"
200
+ };
201
+ }
202
+ jsAssetsWithoutEntry.forEach((jsUrl) => {
203
+ const context = createResourceContext(baseContext, "js");
204
+ results.push(preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () => preloadJsAsset({
205
+ host,
206
+ remoteInfo,
207
+ url: jsUrl,
208
+ attrs: defaultAttrs,
209
+ context
210
+ })));
211
+ });
212
+ }
213
+ return Promise.all(results);
214
+ }
215
+
216
+ //#endregion
217
+ export { defaultPreloadArgs, formatPreloadArgs, normalizePreloadExposes, preloadAssets };
218
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preload.js","names":[],"sources":["../../src/utils/preload.ts"],"sourcesContent":["import { createLink, createScript, safeToString } from '@module-federation/sdk';\nimport {\n PreloadAssets,\n PreloadAssetResult,\n PreloadConfig,\n PreloadOptions,\n PreloadRemoteArgs,\n Remote,\n RemoteInfo,\n ResourceLoadContext,\n ResourceLoadType,\n depsPreloadArg,\n} from '../type';\nimport { matchRemote } from './manifest';\nimport { assert } from './logger';\nimport { ModuleFederation } from '../core';\nimport { getRemoteEntry, isEsmRemoteType } from './load';\nimport { getPreloadedAsset, setPreloadedAsset } from '../global';\n\nexport function defaultPreloadArgs(\n preloadConfig: PreloadRemoteArgs | depsPreloadArg,\n): PreloadConfig {\n return {\n resourceCategory: 'sync',\n share: true,\n depsRemote: true,\n recordPreloadedAssets: true,\n ...preloadConfig,\n } as PreloadConfig;\n}\n\nexport function formatPreloadArgs(\n remotes: Array<Remote>,\n preloadArgs: Array<PreloadRemoteArgs>,\n): PreloadOptions {\n return preloadArgs.map((args) => {\n const remoteInfo = matchRemote(remotes, args.nameOrAlias);\n assert(\n remoteInfo,\n `Unable to preload ${args.nameOrAlias} as it is not included in ${\n !remoteInfo &&\n safeToString({\n remoteInfo,\n remotes,\n })\n }`,\n );\n return {\n remote: remoteInfo,\n preloadConfig: defaultPreloadArgs(args),\n };\n });\n}\n\nexport function normalizePreloadExposes(exposes?: string[]): string[] {\n if (!exposes) {\n return [];\n }\n\n return exposes.map((expose) => {\n if (expose === '.') {\n return expose;\n }\n if (expose.startsWith('./')) {\n return expose.replace('./', '');\n }\n return expose;\n });\n}\n\nfunction isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n return error.message.includes('timed out') || error.name.includes('Timeout');\n}\n\nfunction createAssetResult(\n context: ResourceLoadContext,\n url: string,\n status: PreloadAssetResult['status'],\n error?: unknown,\n): PreloadAssetResult {\n return {\n url,\n status,\n resourceType: context.resourceType,\n initiator: context.initiator,\n id: context.id,\n error,\n };\n}\n\nfunction preloadAssetOnce(\n context: ResourceLoadContext,\n url: string,\n recordPreloadedAssets: boolean,\n preload: () => Promise<PreloadAssetResult>,\n): Promise<PreloadAssetResult> {\n if (!recordPreloadedAssets) {\n return preload();\n }\n\n if (getPreloadedAsset(url)) {\n return Promise.resolve(createAssetResult(context, url, 'cached'));\n }\n\n setPreloadedAsset(url);\n return preload();\n}\n\nasync function waitForRemoteEntryPreload(\n host: ModuleFederation,\n remoteInfo: RemoteInfo,\n entryRemoteInfo: RemoteInfo,\n context: ResourceLoadContext,\n): Promise<PreloadAssetResult> {\n const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);\n const url = entryRemoteInfo.entry;\n if (cachedRemote?.remoteEntryExports) {\n return createAssetResult(context, url, 'cached');\n }\n\n try {\n const remoteEntryExports = await getRemoteEntry({\n origin: host,\n remoteInfo: entryRemoteInfo,\n remoteEntryExports: cachedRemote?.remoteEntryExports,\n resourceContext: {\n ...context,\n url,\n },\n });\n if (!remoteEntryExports) {\n throw new Error(`Failed to load remoteEntry \"${url}\".`);\n }\n return createAssetResult(context, url, 'success');\n } catch (error) {\n return createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n );\n }\n}\n\nfunction waitForLinkPreload({\n host,\n remoteInfo,\n url,\n attrs,\n context,\n needDeleteLink,\n}: {\n host: ModuleFederation;\n remoteInfo: RemoteInfo;\n url: string;\n attrs: Record<string, string>;\n context: ResourceLoadContext;\n needDeleteLink?: boolean;\n}): Promise<PreloadAssetResult> {\n return new Promise((resolve) => {\n const { link, needAttach } = createLink({\n url,\n cb: () => {\n resolve(\n createAssetResult(context, url, needAttach ? 'success' : 'cached'),\n );\n },\n onErrorCallback: (error) => {\n resolve(\n createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n ),\n );\n },\n attrs,\n createLinkHook: (hookUrl, hookAttrs) => {\n const res = host.loaderHook.lifecycle.createLink.emit({\n url: hookUrl,\n attrs: hookAttrs,\n remoteInfo,\n resourceContext: {\n ...context,\n url: hookUrl,\n },\n });\n if (res instanceof HTMLLinkElement) {\n return res;\n }\n return res;\n },\n needDeleteLink,\n });\n\n needAttach && document.head.appendChild(link);\n });\n}\n\nfunction waitForScriptPreload({\n host,\n remoteInfo,\n url,\n attrs,\n context,\n}: {\n host: ModuleFederation;\n remoteInfo: RemoteInfo;\n url: string;\n attrs: Record<string, string>;\n context: ResourceLoadContext;\n}): Promise<PreloadAssetResult> {\n return new Promise((resolve) => {\n const { script, needAttach } = createScript({\n url,\n cb: () => {\n resolve(\n createAssetResult(context, url, needAttach ? 'success' : 'cached'),\n );\n },\n onErrorCallback: (error) => {\n resolve(\n createAssetResult(\n context,\n url,\n isTimeoutError(error) ? 'timeout' : 'error',\n error,\n ),\n );\n },\n attrs,\n createScriptHook: (hookUrl: string, hookAttrs: any) => {\n const res = host.loaderHook.lifecycle.createScript.emit({\n url: hookUrl,\n attrs: hookAttrs,\n remoteInfo,\n resourceContext: {\n ...context,\n url: hookUrl,\n },\n });\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n return res;\n },\n needDeleteScript: true,\n });\n\n needAttach && document.head.appendChild(script);\n });\n}\n\nfunction createResourceContext(\n baseContext: Omit<ResourceLoadContext, 'resourceType'>,\n resourceType: ResourceLoadType,\n): ResourceLoadContext {\n return {\n ...baseContext,\n resourceType,\n };\n}\n\nexport function preloadAssets(\n remoteInfo: RemoteInfo,\n host: ModuleFederation,\n assets: PreloadAssets,\n // It is used to distinguish preload from load remote parallel loading\n useLinkPreload = true,\n baseContext: Omit<ResourceLoadContext, 'resourceType'> = {\n initiator: 'preloadRemote',\n id: remoteInfo.name,\n },\n recordPreloadedAssets = true,\n): Promise<PreloadAssetResult[]> {\n const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;\n const results: Array<Promise<PreloadAssetResult>> = [];\n\n if (host.options.inBrowser) {\n entryAssets.forEach((asset) => {\n const { moduleInfo: entryRemoteInfo } = asset;\n results.push(\n waitForRemoteEntryPreload(\n host,\n remoteInfo,\n entryRemoteInfo,\n createResourceContext(baseContext, 'remoteEntry'),\n ),\n );\n });\n\n if (useLinkPreload) {\n const defaultAttrs = {\n rel: 'preload',\n as: 'style',\n };\n cssAssets.forEach((cssUrl) => {\n const context = createResourceContext(baseContext, 'css');\n results.push(\n preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () =>\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n context,\n }),\n ),\n );\n });\n } else {\n const defaultAttrs = {\n rel: 'stylesheet',\n type: 'text/css',\n };\n cssAssets.forEach((cssUrl) => {\n const context = createResourceContext(baseContext, 'css');\n results.push(\n preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () =>\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n needDeleteLink: false,\n context,\n }),\n ),\n );\n });\n }\n\n let preloadJsAsset = waitForScriptPreload;\n let defaultAttrs: Record<string, string> = {\n fetchpriority: 'high',\n type: 'text/javascript',\n };\n\n if (useLinkPreload) {\n preloadJsAsset = waitForLinkPreload;\n defaultAttrs = {\n rel: 'preload',\n as: 'script',\n };\n } else if (isEsmRemoteType(remoteInfo.type)) {\n preloadJsAsset = waitForLinkPreload;\n defaultAttrs = {\n rel: 'modulepreload',\n fetchpriority: 'high',\n };\n }\n\n jsAssetsWithoutEntry.forEach((jsUrl) => {\n const context = createResourceContext(baseContext, 'js');\n results.push(\n preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () =>\n preloadJsAsset({\n host,\n remoteInfo,\n url: jsUrl,\n attrs: defaultAttrs,\n context,\n }),\n ),\n );\n });\n }\n\n return Promise.all(results);\n}\n"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+
2
+ //#region src/utils/semver/compare.ts
3
+ function compareAtom(rangeAtom, versionAtom) {
4
+ rangeAtom = Number(rangeAtom) || rangeAtom;
5
+ versionAtom = Number(versionAtom) || versionAtom;
6
+ if (rangeAtom > versionAtom) return 1;
7
+ if (rangeAtom === versionAtom) return 0;
8
+ return -1;
9
+ }
10
+ function comparePreRelease(rangeAtom, versionAtom) {
11
+ const { preRelease: rangePreRelease } = rangeAtom;
12
+ const { preRelease: versionPreRelease } = versionAtom;
13
+ if (rangePreRelease === void 0 && Boolean(versionPreRelease)) return 1;
14
+ if (Boolean(rangePreRelease) && versionPreRelease === void 0) return -1;
15
+ if (rangePreRelease === void 0 && versionPreRelease === void 0) return 0;
16
+ for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
17
+ const rangeElement = rangePreRelease[i];
18
+ const versionElement = versionPreRelease[i];
19
+ if (rangeElement === versionElement) continue;
20
+ if (rangeElement === void 0 && versionElement === void 0) return 0;
21
+ if (!rangeElement) return 1;
22
+ if (!versionElement) return -1;
23
+ return compareAtom(rangeElement, versionElement);
24
+ }
25
+ return 0;
26
+ }
27
+ function compareVersion(rangeAtom, versionAtom) {
28
+ return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom);
29
+ }
30
+ function eq(rangeAtom, versionAtom) {
31
+ return rangeAtom.version === versionAtom.version;
32
+ }
33
+ function compare(rangeAtom, versionAtom) {
34
+ switch (rangeAtom.operator) {
35
+ case "":
36
+ case "=": return eq(rangeAtom, versionAtom);
37
+ case ">": return compareVersion(rangeAtom, versionAtom) < 0;
38
+ case ">=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
39
+ case "<": return compareVersion(rangeAtom, versionAtom) > 0;
40
+ case "<=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
41
+ case void 0: return true;
42
+ default: return false;
43
+ }
44
+ }
45
+
46
+ //#endregion
47
+ exports.compare = compare;
48
+ //# sourceMappingURL=compare.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.cjs","names":[],"sources":["../../../src/utils/semver/compare.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nexport interface CompareAtom {\n operator: string;\n version: string;\n major: string;\n minor: string;\n patch: string;\n preRelease?: string[];\n}\n\nfunction compareAtom(\n rangeAtom: string | number,\n versionAtom: string | number,\n): number {\n rangeAtom = Number(rangeAtom) || rangeAtom;\n versionAtom = Number(versionAtom) || versionAtom;\n\n if (rangeAtom > versionAtom) {\n return 1;\n }\n\n if (rangeAtom === versionAtom) {\n return 0;\n }\n\n return -1;\n}\n\nfunction comparePreRelease(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n const { preRelease: rangePreRelease } = rangeAtom;\n const { preRelease: versionPreRelease } = versionAtom;\n\n if (rangePreRelease === undefined && Boolean(versionPreRelease)) {\n return 1;\n }\n\n if (Boolean(rangePreRelease) && versionPreRelease === undefined) {\n return -1;\n }\n\n if (rangePreRelease === undefined && versionPreRelease === undefined) {\n return 0;\n }\n\n for (let i = 0, n = rangePreRelease!.length; i <= n; i++) {\n const rangeElement = rangePreRelease![i];\n const versionElement = versionPreRelease![i];\n\n if (rangeElement === versionElement) {\n continue;\n }\n\n if (rangeElement === undefined && versionElement === undefined) {\n return 0;\n }\n\n if (!rangeElement) {\n return 1;\n }\n\n if (!versionElement) {\n return -1;\n }\n\n return compareAtom(rangeElement, versionElement);\n }\n\n return 0;\n}\n\nfunction compareVersion(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n return (\n compareAtom(rangeAtom.major, versionAtom.major) ||\n compareAtom(rangeAtom.minor, versionAtom.minor) ||\n compareAtom(rangeAtom.patch, versionAtom.patch) ||\n comparePreRelease(rangeAtom, versionAtom)\n );\n}\n\nfunction eq(rangeAtom: CompareAtom, versionAtom: CompareAtom): boolean {\n return rangeAtom.version === versionAtom.version;\n}\n\nexport function compare(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): boolean {\n switch (rangeAtom.operator) {\n case '':\n case '=':\n return eq(rangeAtom, versionAtom);\n case '>':\n return compareVersion(rangeAtom, versionAtom) < 0;\n case '>=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0\n );\n case '<':\n return compareVersion(rangeAtom, versionAtom) > 0;\n case '<=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0\n );\n case undefined: {\n // mean * or x -> all versions\n return true;\n }\n default:\n return false;\n }\n}\n"],"mappings":";;AAkBA,SAAS,YACP,WACA,aACQ;AACR,aAAY,OAAO,UAAU,IAAI;AACjC,eAAc,OAAO,YAAY,IAAI;AAErC,KAAI,YAAY,YACd,QAAO;AAGT,KAAI,cAAc,YAChB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,WACA,aACQ;CACR,MAAM,EAAE,YAAY,oBAAoB;CACxC,MAAM,EAAE,YAAY,sBAAsB;AAE1C,KAAI,oBAAoB,UAAa,QAAQ,kBAAkB,CAC7D,QAAO;AAGT,KAAI,QAAQ,gBAAgB,IAAI,sBAAsB,OACpD,QAAO;AAGT,KAAI,oBAAoB,UAAa,sBAAsB,OACzD,QAAO;AAGT,MAAK,IAAI,IAAI,GAAG,IAAI,gBAAiB,QAAQ,KAAK,GAAG,KAAK;EACxD,MAAM,eAAe,gBAAiB;EACtC,MAAM,iBAAiB,kBAAmB;AAE1C,MAAI,iBAAiB,eACnB;AAGF,MAAI,iBAAiB,UAAa,mBAAmB,OACnD,QAAO;AAGT,MAAI,CAAC,aACH,QAAO;AAGT,MAAI,CAAC,eACH,QAAO;AAGT,SAAO,YAAY,cAAc,eAAe;;AAGlD,QAAO;;AAGT,SAAS,eACP,WACA,aACQ;AACR,QACE,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,kBAAkB,WAAW,YAAY;;AAI7C,SAAS,GAAG,WAAwB,aAAmC;AACrE,QAAO,UAAU,YAAY,YAAY;;AAG3C,SAAgB,QACd,WACA,aACS;AACT,SAAQ,UAAU,UAAlB;EACE,KAAK;EACL,KAAK,IACH,QAAO,GAAG,WAAW,YAAY;EACnC,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,OAEH,QAAO;EAET,QACE,QAAO"}