@module-federation/runtime-core 2.8.1 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.cjs +4 -8
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +16 -14
- package/dist/core.js +4 -8
- package/dist/core.js.map +1 -1
- package/dist/global.cjs +17 -2
- package/dist/global.cjs.map +1 -1
- package/dist/global.d.ts +1 -0
- package/dist/global.js +16 -3
- package/dist/global.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/module/index.cjs +11 -9
- package/dist/module/index.cjs.map +1 -1
- package/dist/module/index.d.ts +3 -2
- package/dist/module/index.js +11 -9
- package/dist/module/index.js.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.cjs +48 -5
- package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.d.ts +23 -0
- package/dist/plugins/snapshot/SnapshotHandler.js +48 -5
- package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
- package/dist/plugins/snapshot/index.cjs +31 -21
- package/dist/plugins/snapshot/index.cjs.map +1 -1
- package/dist/plugins/snapshot/index.js +31 -21
- package/dist/plugins/snapshot/index.js.map +1 -1
- package/dist/remote/index.cjs +1 -1
- package/dist/remote/index.cjs.map +1 -1
- package/dist/remote/index.d.ts +1 -0
- package/dist/remote/index.js +1 -1
- package/dist/remote/index.js.map +1 -1
- package/dist/shared/index.cjs +86 -27
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.ts +19 -10
- package/dist/shared/index.js +86 -27
- package/dist/shared/index.js.map +1 -1
- package/dist/type/config.d.ts +9 -1
- package/dist/type/index.d.ts +3 -3
- package/dist/type/plugin.d.ts +4 -3
- package/dist/type/preload.d.ts +7 -1
- package/dist/types.d.ts +3 -3
- package/dist/utils/hooks/pluginSystem.cjs +6 -5
- package/dist/utils/hooks/pluginSystem.cjs.map +1 -1
- package/dist/utils/hooks/pluginSystem.d.ts +2 -5
- package/dist/utils/hooks/pluginSystem.js +6 -5
- package/dist/utils/hooks/pluginSystem.js.map +1 -1
- package/dist/utils/load.cjs +81 -20
- package/dist/utils/load.cjs.map +1 -1
- package/dist/utils/load.js +81 -20
- package/dist/utils/load.js.map +1 -1
- package/dist/utils/plugin.cjs +30 -7
- package/dist/utils/plugin.cjs.map +1 -1
- package/dist/utils/plugin.js +30 -7
- package/dist/utils/plugin.js.map +1 -1
- package/dist/utils/preload.cjs +21 -10
- package/dist/utils/preload.cjs.map +1 -1
- package/dist/utils/preload.d.ts +1 -1
- package/dist/utils/preload.js +21 -10
- package/dist/utils/preload.js.map +1 -1
- package/dist/utils/share.cjs +3 -2
- package/dist/utils/share.cjs.map +1 -1
- package/dist/utils/share.d.ts +3 -2
- package/dist/utils/share.js +3 -2
- package/dist/utils/share.js.map +1 -1
- package/package.json +3 -3
- package/dist/utils/hooks/index.d.ts +0 -5
package/dist/utils/plugin.cjs
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
|
+
const require_logger = require('./logger.cjs');
|
|
2
|
+
const require_tool = require('./tool.cjs');
|
|
1
3
|
const require_global = require('../global.cjs');
|
|
2
4
|
|
|
3
5
|
//#region src/utils/plugin.ts
|
|
6
|
+
function getPluginsToRegister(plugins) {
|
|
7
|
+
const pluginsByName = /* @__PURE__ */ new Map();
|
|
8
|
+
[...plugins || [], ...require_global.getGlobalHostPlugins()].forEach((plugin) => {
|
|
9
|
+
if (!plugin) return;
|
|
10
|
+
require_logger.assert(require_tool.isPlainObject(plugin), "Plugin configuration is invalid.");
|
|
11
|
+
require_logger.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
|
+
}
|
|
4
24
|
function registerPlugins(plugins, instance) {
|
|
5
|
-
const
|
|
25
|
+
const registeredPlugins = /* @__PURE__ */ new Map();
|
|
26
|
+
instance.options.plugins.forEach((plugin) => {
|
|
27
|
+
if (plugin) registeredPlugins.set(plugin.name, plugin);
|
|
28
|
+
});
|
|
6
29
|
const hookInstances = [
|
|
7
30
|
instance.hooks,
|
|
8
31
|
instance.remoteHandler.hooks,
|
|
@@ -11,15 +34,15 @@ function registerPlugins(plugins, instance) {
|
|
|
11
34
|
instance.loaderHook,
|
|
12
35
|
instance.bridgeHook
|
|
13
36
|
];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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));
|
|
18
41
|
hookInstances.forEach((hookInstance) => {
|
|
19
|
-
hookInstance.applyPlugin(
|
|
42
|
+
hookInstance.applyPlugin(instancePlugin);
|
|
20
43
|
});
|
|
21
44
|
});
|
|
22
|
-
return
|
|
45
|
+
return Array.from(registeredPlugins.values());
|
|
23
46
|
}
|
|
24
47
|
|
|
25
48
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","names":["getGlobalHostPlugins"],"sources":["../../src/utils/plugin.ts"],"sourcesContent":["import { ModuleFederation } from '../core';\nimport {
|
|
1
|
+
{"version":3,"file":"plugin.cjs","names":["getGlobalHostPlugins","isPlainObject"],"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,GAAGA,qCAAsB,CAAC,CAAC,SAAS,WAAW;AAClE,MAAI,CAAC,OACH;AAGF,wBAAOC,2BAAc,OAAO,EAAE,mCAAmC;AACjE,wBAAO,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"}
|
package/dist/utils/plugin.js
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
|
+
import { assert } from "./logger.js";
|
|
2
|
+
import { isPlainObject } from "./tool.js";
|
|
1
3
|
import { getGlobalHostPlugins } from "../global.js";
|
|
2
4
|
|
|
3
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
|
+
}
|
|
4
24
|
function registerPlugins(plugins, instance) {
|
|
5
|
-
const
|
|
25
|
+
const registeredPlugins = /* @__PURE__ */ new Map();
|
|
26
|
+
instance.options.plugins.forEach((plugin) => {
|
|
27
|
+
if (plugin) registeredPlugins.set(plugin.name, plugin);
|
|
28
|
+
});
|
|
6
29
|
const hookInstances = [
|
|
7
30
|
instance.hooks,
|
|
8
31
|
instance.remoteHandler.hooks,
|
|
@@ -11,15 +34,15 @@ function registerPlugins(plugins, instance) {
|
|
|
11
34
|
instance.loaderHook,
|
|
12
35
|
instance.bridgeHook
|
|
13
36
|
];
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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));
|
|
18
41
|
hookInstances.forEach((hookInstance) => {
|
|
19
|
-
hookInstance.applyPlugin(
|
|
42
|
+
hookInstance.applyPlugin(instancePlugin);
|
|
20
43
|
});
|
|
21
44
|
});
|
|
22
|
-
return
|
|
45
|
+
return Array.from(registeredPlugins.values());
|
|
23
46
|
}
|
|
24
47
|
|
|
25
48
|
//#endregion
|
package/dist/utils/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":[],"sources":["../../src/utils/plugin.ts"],"sourcesContent":["import { ModuleFederation } from '../core';\nimport {
|
|
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"}
|
package/dist/utils/preload.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_logger = require('./logger.cjs');
|
|
2
|
+
const require_global = require('../global.cjs');
|
|
2
3
|
const require_manifest = require('./manifest.cjs');
|
|
3
4
|
const require_load = require('./load.cjs');
|
|
4
5
|
let _module_federation_sdk = require("@module-federation/sdk");
|
|
@@ -9,6 +10,7 @@ function defaultPreloadArgs(preloadConfig) {
|
|
|
9
10
|
resourceCategory: "sync",
|
|
10
11
|
share: true,
|
|
11
12
|
depsRemote: true,
|
|
13
|
+
recordPreloadedAssets: true,
|
|
12
14
|
...preloadConfig
|
|
13
15
|
};
|
|
14
16
|
}
|
|
@@ -47,6 +49,12 @@ function createAssetResult(context, url, status, error) {
|
|
|
47
49
|
error
|
|
48
50
|
};
|
|
49
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
|
+
}
|
|
50
58
|
async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
|
|
51
59
|
const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
|
|
52
60
|
const url = entryRemoteInfo.entry;
|
|
@@ -133,7 +141,7 @@ function createResourceContext(baseContext, resourceType) {
|
|
|
133
141
|
function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
|
|
134
142
|
initiator: "preloadRemote",
|
|
135
143
|
id: remoteInfo.name
|
|
136
|
-
}) {
|
|
144
|
+
}, recordPreloadedAssets = true) {
|
|
137
145
|
const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
|
|
138
146
|
const results = [];
|
|
139
147
|
if (host.options.inBrowser) {
|
|
@@ -147,13 +155,14 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
147
155
|
as: "style"
|
|
148
156
|
};
|
|
149
157
|
cssAssets.forEach((cssUrl) => {
|
|
150
|
-
|
|
158
|
+
const context = createResourceContext(baseContext, "css");
|
|
159
|
+
results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
|
|
151
160
|
host,
|
|
152
161
|
remoteInfo,
|
|
153
162
|
url: cssUrl,
|
|
154
163
|
attrs: defaultAttrs,
|
|
155
|
-
context
|
|
156
|
-
}));
|
|
164
|
+
context
|
|
165
|
+
})));
|
|
157
166
|
});
|
|
158
167
|
} else {
|
|
159
168
|
const defaultAttrs = {
|
|
@@ -161,14 +170,15 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
161
170
|
type: "text/css"
|
|
162
171
|
};
|
|
163
172
|
cssAssets.forEach((cssUrl) => {
|
|
164
|
-
|
|
173
|
+
const context = createResourceContext(baseContext, "css");
|
|
174
|
+
results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
|
|
165
175
|
host,
|
|
166
176
|
remoteInfo,
|
|
167
177
|
url: cssUrl,
|
|
168
178
|
attrs: defaultAttrs,
|
|
169
179
|
needDeleteLink: false,
|
|
170
|
-
context
|
|
171
|
-
}));
|
|
180
|
+
context
|
|
181
|
+
})));
|
|
172
182
|
});
|
|
173
183
|
}
|
|
174
184
|
let preloadJsAsset = waitForScriptPreload;
|
|
@@ -190,13 +200,14 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
190
200
|
};
|
|
191
201
|
}
|
|
192
202
|
jsAssetsWithoutEntry.forEach((jsUrl) => {
|
|
193
|
-
|
|
203
|
+
const context = createResourceContext(baseContext, "js");
|
|
204
|
+
results.push(preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () => preloadJsAsset({
|
|
194
205
|
host,
|
|
195
206
|
remoteInfo,
|
|
196
207
|
url: jsUrl,
|
|
197
208
|
attrs: defaultAttrs,
|
|
198
|
-
context
|
|
199
|
-
}));
|
|
209
|
+
context
|
|
210
|
+
})));
|
|
200
211
|
});
|
|
201
212
|
}
|
|
202
213
|
return Promise.all(results);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preload.cjs","names":["matchRemote","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';\n\nexport function defaultPreloadArgs(\n preloadConfig: PreloadRemoteArgs | depsPreloadArg,\n): PreloadConfig {\n return {\n resourceCategory: 'sync',\n share: true,\n depsRemote: 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\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): 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 results.push(\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n context: createResourceContext(baseContext, 'css'),\n }),\n );\n });\n } else {\n const defaultAttrs = {\n rel: 'stylesheet',\n type: 'text/css',\n };\n cssAssets.forEach((cssUrl) => {\n results.push(\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n needDeleteLink: false,\n context: createResourceContext(baseContext, 'css'),\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 results.push(\n preloadJsAsset({\n host,\n remoteInfo,\n url: jsUrl,\n attrs: defaultAttrs,\n context: createResourceContext(baseContext, 'js'),\n }),\n );\n });\n }\n\n return Promise.all(results);\n}\n"],"mappings":"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"}
|
|
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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"}
|
package/dist/utils/preload.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { ModuleFederation } from "../core.js";
|
|
|
2
2
|
import { RemoteInfo } from "../type/config.js";
|
|
3
3
|
import { PreloadAssetResult, PreloadAssets, ResourceLoadContext } from "../type/preload.js";
|
|
4
4
|
//#region src/utils/preload.d.ts
|
|
5
|
-
declare function preloadAssets(remoteInfo: RemoteInfo, host: ModuleFederation, assets: PreloadAssets, useLinkPreload?: boolean, baseContext?: Omit<ResourceLoadContext, 'resourceType'
|
|
5
|
+
declare function preloadAssets(remoteInfo: RemoteInfo, host: ModuleFederation, assets: PreloadAssets, useLinkPreload?: boolean, baseContext?: Omit<ResourceLoadContext, 'resourceType'>, recordPreloadedAssets?: boolean): Promise<PreloadAssetResult[]>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { preloadAssets };
|
|
8
8
|
//# sourceMappingURL=preload.d.ts.map
|
package/dist/utils/preload.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assert } from "./logger.js";
|
|
2
|
+
import { getPreloadedAsset, setPreloadedAsset } from "../global.js";
|
|
2
3
|
import { matchRemote } from "./manifest.js";
|
|
3
4
|
import { getRemoteEntry, isEsmRemoteType } from "./load.js";
|
|
4
5
|
import { createLink, createScript, safeToString } from "@module-federation/sdk";
|
|
@@ -9,6 +10,7 @@ function defaultPreloadArgs(preloadConfig) {
|
|
|
9
10
|
resourceCategory: "sync",
|
|
10
11
|
share: true,
|
|
11
12
|
depsRemote: true,
|
|
13
|
+
recordPreloadedAssets: true,
|
|
12
14
|
...preloadConfig
|
|
13
15
|
};
|
|
14
16
|
}
|
|
@@ -47,6 +49,12 @@ function createAssetResult(context, url, status, error) {
|
|
|
47
49
|
error
|
|
48
50
|
};
|
|
49
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
|
+
}
|
|
50
58
|
async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
|
|
51
59
|
const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
|
|
52
60
|
const url = entryRemoteInfo.entry;
|
|
@@ -133,7 +141,7 @@ function createResourceContext(baseContext, resourceType) {
|
|
|
133
141
|
function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
|
|
134
142
|
initiator: "preloadRemote",
|
|
135
143
|
id: remoteInfo.name
|
|
136
|
-
}) {
|
|
144
|
+
}, recordPreloadedAssets = true) {
|
|
137
145
|
const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
|
|
138
146
|
const results = [];
|
|
139
147
|
if (host.options.inBrowser) {
|
|
@@ -147,13 +155,14 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
147
155
|
as: "style"
|
|
148
156
|
};
|
|
149
157
|
cssAssets.forEach((cssUrl) => {
|
|
150
|
-
|
|
158
|
+
const context = createResourceContext(baseContext, "css");
|
|
159
|
+
results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
|
|
151
160
|
host,
|
|
152
161
|
remoteInfo,
|
|
153
162
|
url: cssUrl,
|
|
154
163
|
attrs: defaultAttrs,
|
|
155
|
-
context
|
|
156
|
-
}));
|
|
164
|
+
context
|
|
165
|
+
})));
|
|
157
166
|
});
|
|
158
167
|
} else {
|
|
159
168
|
const defaultAttrs = {
|
|
@@ -161,14 +170,15 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
161
170
|
type: "text/css"
|
|
162
171
|
};
|
|
163
172
|
cssAssets.forEach((cssUrl) => {
|
|
164
|
-
|
|
173
|
+
const context = createResourceContext(baseContext, "css");
|
|
174
|
+
results.push(preloadAssetOnce(context, cssUrl, recordPreloadedAssets, () => waitForLinkPreload({
|
|
165
175
|
host,
|
|
166
176
|
remoteInfo,
|
|
167
177
|
url: cssUrl,
|
|
168
178
|
attrs: defaultAttrs,
|
|
169
179
|
needDeleteLink: false,
|
|
170
|
-
context
|
|
171
|
-
}));
|
|
180
|
+
context
|
|
181
|
+
})));
|
|
172
182
|
});
|
|
173
183
|
}
|
|
174
184
|
let preloadJsAsset = waitForScriptPreload;
|
|
@@ -190,13 +200,14 @@ function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseCont
|
|
|
190
200
|
};
|
|
191
201
|
}
|
|
192
202
|
jsAssetsWithoutEntry.forEach((jsUrl) => {
|
|
193
|
-
|
|
203
|
+
const context = createResourceContext(baseContext, "js");
|
|
204
|
+
results.push(preloadAssetOnce(context, jsUrl, recordPreloadedAssets, () => preloadJsAsset({
|
|
194
205
|
host,
|
|
195
206
|
remoteInfo,
|
|
196
207
|
url: jsUrl,
|
|
197
208
|
attrs: defaultAttrs,
|
|
198
|
-
context
|
|
199
|
-
}));
|
|
209
|
+
context
|
|
210
|
+
})));
|
|
200
211
|
});
|
|
201
212
|
}
|
|
202
213
|
return Promise.all(results);
|
|
@@ -1 +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';\n\nexport function defaultPreloadArgs(\n preloadConfig: PreloadRemoteArgs | depsPreloadArg,\n): PreloadConfig {\n return {\n resourceCategory: 'sync',\n share: true,\n depsRemote: 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\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): 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 results.push(\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n context: createResourceContext(baseContext, 'css'),\n }),\n );\n });\n } else {\n const defaultAttrs = {\n rel: 'stylesheet',\n type: 'text/css',\n };\n cssAssets.forEach((cssUrl) => {\n results.push(\n waitForLinkPreload({\n host,\n remoteInfo,\n url: cssUrl,\n attrs: defaultAttrs,\n needDeleteLink: false,\n context: createResourceContext(baseContext, 'css'),\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 results.push(\n preloadJsAsset({\n host,\n remoteInfo,\n url: jsUrl,\n attrs: defaultAttrs,\n context: createResourceContext(baseContext, 'js'),\n }),\n );\n });\n }\n\n return Promise.all(results);\n}\n"],"mappings":"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"}
|
|
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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"}
|
package/dist/utils/share.cjs
CHANGED
|
@@ -176,7 +176,7 @@ function getFindShareFunction(strategy) {
|
|
|
176
176
|
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
|
|
177
177
|
return findSingletonVersionOrderByVersion;
|
|
178
178
|
}
|
|
179
|
-
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
|
|
179
|
+
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare, loadContext) {
|
|
180
180
|
if (!localShareScopeMap) return;
|
|
181
181
|
const { shareConfig, scope = require_constant.DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
|
|
182
182
|
const scopes = Array.isArray(scope) ? scope : [scope];
|
|
@@ -225,7 +225,8 @@ function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare
|
|
|
225
225
|
version: maxOrSingletonVersion,
|
|
226
226
|
GlobalFederation: require_global.Global.__FEDERATION__,
|
|
227
227
|
shareInfo,
|
|
228
|
-
resolver: defaultResolver
|
|
228
|
+
resolver: defaultResolver,
|
|
229
|
+
loadContext
|
|
229
230
|
};
|
|
230
231
|
return (resolveShare.emit(params) || params).resolver();
|
|
231
232
|
}
|
package/dist/utils/share.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.cjs","names":["TreeShakingStatus","arrayOptions","satisfy","DEFAULT_SCOPE","Global"],"sources":["../../src/utils/share.ts"],"sourcesContent":["import { DEFAULT_SCOPE } from '../constant';\nimport { TreeShakingStatus } from '@module-federation/sdk';\nimport { Global, Federation } from '../global';\nimport {\n GlobalShareScopeMap,\n Shared,\n ShareArgs,\n ShareInfos,\n ShareScopeMap,\n LoadShareExtraOptions,\n UserOptions,\n Options,\n ShareStrategy,\n TreeShakingArgs,\n SharedGetter,\n} from '../type';\nimport { warn, error } from './logger';\nimport { satisfy } from './semver';\nimport { SyncWaterfallHook } from './hooks';\nimport { addUniqueItem, arrayOptions } from './tool';\n\nfunction formatShare(\n shareArgs: ShareArgs,\n from: string,\n name: string,\n shareStrategy?: ShareStrategy,\n): Shared {\n let get: Shared['get'];\n if ('get' in shareArgs) {\n // eslint-disable-next-line prefer-destructuring\n get = shareArgs.get;\n } else if ('lib' in shareArgs) {\n get = () => Promise.resolve(shareArgs.lib);\n } else {\n get = () =>\n Promise.resolve(() => {\n error(\n `Cannot get shared \"${name}\" from \"${from}\": neither \"get\" nor \"lib\" is provided in the share config.`,\n );\n });\n }\n\n if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) {\n error(\n `Invalid shared config for \"${name}\" from \"${from}\": cannot use both \"eager: true\" and \"treeShaking.mode\" simultaneously. Choose one strategy.`,\n );\n }\n\n return {\n deps: [],\n useIn: [],\n from,\n loading: null,\n ...shareArgs,\n shareConfig: {\n requiredVersion: `^${shareArgs.version}`,\n singleton: false,\n eager: false,\n strictVersion: false,\n ...shareArgs.shareConfig,\n },\n get,\n loaded: shareArgs?.loaded || 'lib' in shareArgs ? true : undefined,\n version: shareArgs.version ?? '0',\n scope: Array.isArray(shareArgs.scope)\n ? shareArgs.scope\n : [shareArgs.scope ?? 'default'],\n strategy: (shareArgs.strategy ?? shareStrategy) || 'version-first',\n treeShaking: shareArgs.treeShaking\n ? {\n ...shareArgs.treeShaking,\n mode: shareArgs.treeShaking.mode ?? 'server-calc',\n status: shareArgs.treeShaking.status ?? TreeShakingStatus.UNKNOWN,\n useIn: [],\n }\n : undefined,\n };\n}\n\nexport function formatShareConfigs(\n prevOptions: Options,\n newOptions: UserOptions,\n) {\n const shareArgs = newOptions.shared || {};\n const from = newOptions.name;\n\n const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {\n const arrayShareArgs = arrayOptions(shareArgs[pkgName]);\n res[pkgName] = res[pkgName] || [];\n arrayShareArgs.forEach((shareConfig) => {\n res[pkgName].push(\n formatShare(shareConfig, from, pkgName, newOptions.shareStrategy),\n );\n });\n return res;\n }, {} as ShareInfos);\n\n const allShareInfos = {\n ...prevOptions.shared,\n };\n\n Object.keys(newShareInfos).forEach((shareKey) => {\n if (!allShareInfos[shareKey]) {\n allShareInfos[shareKey] = newShareInfos[shareKey];\n } else {\n newShareInfos[shareKey].forEach((newUserSharedOptions) => {\n const isSameVersion = allShareInfos[shareKey].find(\n (sharedVal) => sharedVal.version === newUserSharedOptions.version,\n );\n if (!isSameVersion) {\n allShareInfos[shareKey].push(newUserSharedOptions);\n }\n });\n }\n });\n return { allShareInfos, newShareInfos };\n}\n\nexport function shouldUseTreeShaking(\n treeShaking?: TreeShakingArgs,\n usedExports?: string[],\n) {\n if (!treeShaking) {\n return false;\n }\n const { status, mode } = treeShaking;\n if (status === TreeShakingStatus.NO_USE) {\n return false;\n }\n\n if (status === TreeShakingStatus.CALCULATED) {\n return true;\n }\n\n if (mode === 'runtime-infer') {\n if (!usedExports) {\n return true;\n }\n return isMatchUsedExports(treeShaking, usedExports);\n }\n\n return false;\n}\n\n/**\n * compare version a and b, return true if a is less than b\n */\nexport function versionLt(a: string, b: string): boolean {\n const transformInvalidVersion = (version: string) => {\n const isNumberVersion = !Number.isNaN(Number(version));\n if (isNumberVersion) {\n const splitArr = version.split('.');\n let validVersion = version;\n for (let i = 0; i < 3 - splitArr.length; i++) {\n validVersion += '.0';\n }\n return validVersion;\n }\n return version;\n };\n if (satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) {\n return true;\n } else {\n return false;\n }\n}\n\nexport const findVersion = (\n shareVersionMap: ShareScopeMap[string][string],\n cb?: (prev: string, cur: string) => boolean,\n): string => {\n const callback =\n cb ||\n function (prev: string, cur: string): boolean {\n return versionLt(prev, cur);\n };\n\n return Object.keys(shareVersionMap).reduce((prev: number | string, cur) => {\n if (!prev) {\n return cur;\n }\n if (callback(prev as string, cur)) {\n return cur;\n }\n\n // default version is '0' https://github.com/webpack/webpack/blob/main/lib/sharing/ProvideSharedModule.js#L136\n if (prev === '0') {\n return cur;\n }\n\n return prev;\n }, 0) as string;\n};\n\nexport const isLoaded = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return Boolean(shared.loaded) || typeof shared.lib === 'function';\n};\n\nconst isLoading = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return Boolean(shared.loading);\n};\n\nconst isMatchUsedExports = (\n treeShaking?: TreeShakingArgs,\n usedExports?: string[],\n) => {\n if (!treeShaking || !usedExports) {\n return false;\n }\n\n const { usedExports: treeShakingUsedExports } = treeShaking;\n\n if (!treeShakingUsedExports) {\n return false;\n }\n\n if (usedExports.every((e) => treeShakingUsedExports.includes(e))) {\n return true;\n }\n\n return false;\n};\n\nfunction findSingletonVersionOrderByVersion(\n shareScopeMap: ShareScopeMap,\n scope: string,\n pkgName: string,\n treeShaking?: TreeShakingArgs,\n): {\n version: string;\n useTreesShaking: boolean;\n} {\n const versions = shareScopeMap[scope][pkgName];\n let version = '';\n let useTreesShaking = shouldUseTreeShaking(treeShaking);\n // return false means use prev version\n const callback = function (prev: string, cur: string): boolean {\n if (useTreesShaking) {\n if (!versions[prev].treeShaking) {\n return true;\n }\n if (!versions[cur].treeShaking) {\n return false;\n }\n return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);\n }\n return !isLoaded(versions[prev]) && versionLt(prev, cur);\n };\n\n if (useTreesShaking) {\n version = findVersion(shareScopeMap[scope][pkgName], callback);\n if (version) {\n return {\n version,\n useTreesShaking,\n };\n }\n useTreesShaking = false;\n }\n\n return {\n version: findVersion(shareScopeMap[scope][pkgName], callback),\n useTreesShaking,\n };\n}\n\nconst isLoadingOrLoaded = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return isLoaded(shared) || isLoading(shared);\n};\n\nfunction findSingletonVersionOrderByLoaded(\n shareScopeMap: ShareScopeMap,\n scope: string,\n pkgName: string,\n treeShaking?: TreeShakingArgs,\n): {\n version: string;\n useTreesShaking: boolean;\n} {\n const versions = shareScopeMap[scope][pkgName];\n let version = '';\n let useTreesShaking = shouldUseTreeShaking(treeShaking);\n\n // return false means use prev version\n const callback = function (prev: string, cur: string): boolean {\n if (useTreesShaking) {\n if (!versions[prev].treeShaking) {\n return true;\n }\n if (!versions[cur].treeShaking) {\n return false;\n }\n if (isLoadingOrLoaded(versions[cur].treeShaking)) {\n if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n return Boolean(versionLt(prev, cur));\n } else {\n return true;\n }\n }\n if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n return false;\n }\n }\n\n if (isLoadingOrLoaded(versions[cur])) {\n if (isLoadingOrLoaded(versions[prev])) {\n return Boolean(versionLt(prev, cur));\n } else {\n return true;\n }\n }\n if (isLoadingOrLoaded(versions[prev])) {\n return false;\n }\n return versionLt(prev, cur);\n };\n\n if (useTreesShaking) {\n version = findVersion(shareScopeMap[scope][pkgName], callback);\n if (version) {\n return {\n version,\n useTreesShaking,\n };\n }\n useTreesShaking = false;\n }\n\n return {\n version: findVersion(shareScopeMap[scope][pkgName], callback),\n useTreesShaking,\n };\n}\n\nfunction getFindShareFunction(strategy: Shared['strategy']) {\n if (strategy === 'loaded-first') {\n return findSingletonVersionOrderByLoaded;\n }\n return findSingletonVersionOrderByVersion;\n}\n\nexport function getRegisteredShare(\n localShareScopeMap: ShareScopeMap,\n pkgName: string,\n shareInfo: Shared,\n resolveShare: SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n }>,\n): { shared: Shared; useTreesShaking: boolean } | void {\n if (!localShareScopeMap) {\n return;\n }\n const {\n shareConfig,\n scope = DEFAULT_SCOPE,\n strategy,\n treeShaking,\n } = shareInfo;\n const scopes = Array.isArray(scope) ? scope : [scope];\n for (const sc of scopes) {\n if (\n shareConfig &&\n localShareScopeMap[sc] &&\n localShareScopeMap[sc][pkgName]\n ) {\n const { requiredVersion } = shareConfig;\n const findShareFunction = getFindShareFunction(strategy);\n const { version: maxOrSingletonVersion, useTreesShaking } =\n findShareFunction(localShareScopeMap, sc, pkgName, treeShaking);\n\n const defaultResolver = () => {\n const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];\n if (shareConfig.singleton) {\n if (\n typeof requiredVersion === 'string' &&\n !satisfy(maxOrSingletonVersion, requiredVersion)\n ) {\n const msg = `Version ${maxOrSingletonVersion} from ${\n maxOrSingletonVersion && shared.from\n } of shared singleton module ${pkgName} does not satisfy the requirement of ${\n shareInfo.from\n } which needs ${requiredVersion})`;\n\n if (shareConfig.strictVersion) {\n error(msg);\n } else {\n warn(msg);\n }\n }\n return {\n shared,\n useTreesShaking,\n };\n } else {\n if (requiredVersion === false || requiredVersion === '*') {\n return {\n shared,\n useTreesShaking,\n };\n }\n if (satisfy(maxOrSingletonVersion, requiredVersion)) {\n return {\n shared,\n useTreesShaking,\n };\n }\n\n const _usedTreeShaking = shouldUseTreeShaking(treeShaking);\n if (_usedTreeShaking) {\n for (const [versionKey, versionValue] of Object.entries(\n localShareScopeMap[sc][pkgName],\n )) {\n if (\n !shouldUseTreeShaking(\n versionValue.treeShaking,\n treeShaking?.usedExports,\n )\n ) {\n continue;\n }\n\n if (satisfy(versionKey, requiredVersion)) {\n return {\n shared: versionValue,\n useTreesShaking: _usedTreeShaking,\n };\n }\n }\n }\n for (const [versionKey, versionValue] of Object.entries(\n localShareScopeMap[sc][pkgName],\n )) {\n if (satisfy(versionKey, requiredVersion)) {\n return {\n shared: versionValue,\n useTreesShaking: false,\n };\n }\n }\n }\n return;\n };\n const params = {\n shareScopeMap: localShareScopeMap,\n scope: sc,\n pkgName,\n version: maxOrSingletonVersion,\n GlobalFederation: Global.__FEDERATION__,\n shareInfo,\n resolver: defaultResolver,\n };\n const resolveShared = resolveShare.emit(params) || params;\n return resolveShared.resolver();\n }\n }\n}\n\nexport function getGlobalShareScope(): GlobalShareScopeMap {\n return Global.__FEDERATION__.__SHARE__;\n}\n\nexport function getTargetSharedOptions(options: {\n pkgName: string;\n extraOptions?: LoadShareExtraOptions;\n shareInfos: ShareInfos;\n}) {\n const { pkgName, extraOptions, shareInfos } = options;\n const defaultResolver = (sharedOptions: ShareInfos[string]) => {\n if (!sharedOptions) {\n return undefined;\n }\n const shareVersionMap: ShareScopeMap[string][string] = {};\n sharedOptions.forEach((shared) => {\n shareVersionMap[shared.version] = shared;\n });\n const callback = function (prev: string, cur: string): boolean {\n return (\n // TODO: consider multiple treeShaking shared scenes\n !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur)\n );\n };\n\n const maxVersion = findVersion(shareVersionMap, callback);\n return shareVersionMap[maxVersion];\n };\n\n const resolver = extraOptions?.resolver ?? defaultResolver;\n const isPlainObject = (val: unknown): val is Record<string, any> => {\n return val !== null && typeof val === 'object' && !Array.isArray(val);\n };\n\n const merge = <T extends Record<string, any>>(\n ...sources: Array<Partial<T> | undefined>\n ): T => {\n const out = {} as T;\n for (const src of sources) {\n if (!src) continue;\n for (const [key, value] of Object.entries(src)) {\n const prev = (out as any)[key];\n if (isPlainObject(prev) && isPlainObject(value)) {\n (out as any)[key] = merge(prev, value);\n } else if (value !== undefined) {\n (out as any)[key] = value;\n }\n }\n }\n return out;\n };\n\n return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);\n}\n\nexport const addUseIn = (\n shared: { useIn?: Array<string> },\n from: string,\n): void => {\n if (!shared.useIn) {\n shared.useIn = [];\n }\n addUniqueItem(shared.useIn, from);\n};\n\nexport function directShare(\n shared: Shared,\n useTreesShaking?: boolean,\n): Shared | TreeShakingArgs {\n if (useTreesShaking && shared.treeShaking) {\n return shared.treeShaking;\n }\n\n return shared;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"share.cjs","names":["TreeShakingStatus","arrayOptions","satisfy","DEFAULT_SCOPE","Global"],"sources":["../../src/utils/share.ts"],"sourcesContent":["import { DEFAULT_SCOPE } from '../constant';\nimport { TreeShakingStatus } from '@module-federation/sdk';\nimport { Global, Federation } from '../global';\nimport {\n GlobalShareScopeMap,\n Shared,\n ShareArgs,\n ShareInfos,\n ShareScopeMap,\n LoadShareExtraOptions,\n UserOptions,\n Options,\n ShareStrategy,\n TreeShakingArgs,\n SharedGetter,\n SharedLoadContext,\n} from '../type';\nimport { warn, error } from './logger';\nimport { satisfy } from './semver';\nimport { SyncWaterfallHook } from './hooks';\nimport { addUniqueItem, arrayOptions } from './tool';\n\nfunction formatShare(\n shareArgs: ShareArgs,\n from: string,\n name: string,\n shareStrategy?: ShareStrategy,\n): Shared {\n let get: Shared['get'];\n if ('get' in shareArgs) {\n // eslint-disable-next-line prefer-destructuring\n get = shareArgs.get;\n } else if ('lib' in shareArgs) {\n get = () => Promise.resolve(shareArgs.lib);\n } else {\n get = () =>\n Promise.resolve(() => {\n error(\n `Cannot get shared \"${name}\" from \"${from}\": neither \"get\" nor \"lib\" is provided in the share config.`,\n );\n });\n }\n\n if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) {\n error(\n `Invalid shared config for \"${name}\" from \"${from}\": cannot use both \"eager: true\" and \"treeShaking.mode\" simultaneously. Choose one strategy.`,\n );\n }\n\n return {\n deps: [],\n useIn: [],\n from,\n loading: null,\n ...shareArgs,\n shareConfig: {\n requiredVersion: `^${shareArgs.version}`,\n singleton: false,\n eager: false,\n strictVersion: false,\n ...shareArgs.shareConfig,\n },\n get,\n loaded: shareArgs?.loaded || 'lib' in shareArgs ? true : undefined,\n version: shareArgs.version ?? '0',\n scope: Array.isArray(shareArgs.scope)\n ? shareArgs.scope\n : [shareArgs.scope ?? 'default'],\n strategy: (shareArgs.strategy ?? shareStrategy) || 'version-first',\n treeShaking: shareArgs.treeShaking\n ? {\n ...shareArgs.treeShaking,\n mode: shareArgs.treeShaking.mode ?? 'server-calc',\n status: shareArgs.treeShaking.status ?? TreeShakingStatus.UNKNOWN,\n useIn: [],\n }\n : undefined,\n };\n}\n\nexport function formatShareConfigs(\n prevOptions: Options,\n newOptions: UserOptions,\n) {\n const shareArgs = newOptions.shared || {};\n const from = newOptions.name;\n\n const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {\n const arrayShareArgs = arrayOptions(shareArgs[pkgName]);\n res[pkgName] = res[pkgName] || [];\n arrayShareArgs.forEach((shareConfig) => {\n res[pkgName].push(\n formatShare(shareConfig, from, pkgName, newOptions.shareStrategy),\n );\n });\n return res;\n }, {} as ShareInfos);\n\n const allShareInfos = {\n ...prevOptions.shared,\n };\n\n Object.keys(newShareInfos).forEach((shareKey) => {\n if (!allShareInfos[shareKey]) {\n allShareInfos[shareKey] = newShareInfos[shareKey];\n } else {\n newShareInfos[shareKey].forEach((newUserSharedOptions) => {\n const isSameVersion = allShareInfos[shareKey].find(\n (sharedVal) => sharedVal.version === newUserSharedOptions.version,\n );\n if (!isSameVersion) {\n allShareInfos[shareKey].push(newUserSharedOptions);\n }\n });\n }\n });\n return { allShareInfos, newShareInfos };\n}\n\nexport function shouldUseTreeShaking(\n treeShaking?: TreeShakingArgs,\n usedExports?: string[],\n) {\n if (!treeShaking) {\n return false;\n }\n const { status, mode } = treeShaking;\n if (status === TreeShakingStatus.NO_USE) {\n return false;\n }\n\n if (status === TreeShakingStatus.CALCULATED) {\n return true;\n }\n\n if (mode === 'runtime-infer') {\n if (!usedExports) {\n return true;\n }\n return isMatchUsedExports(treeShaking, usedExports);\n }\n\n return false;\n}\n\n/**\n * compare version a and b, return true if a is less than b\n */\nexport function versionLt(a: string, b: string): boolean {\n const transformInvalidVersion = (version: string) => {\n const isNumberVersion = !Number.isNaN(Number(version));\n if (isNumberVersion) {\n const splitArr = version.split('.');\n let validVersion = version;\n for (let i = 0; i < 3 - splitArr.length; i++) {\n validVersion += '.0';\n }\n return validVersion;\n }\n return version;\n };\n if (satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) {\n return true;\n } else {\n return false;\n }\n}\n\nexport const findVersion = (\n shareVersionMap: ShareScopeMap[string][string],\n cb?: (prev: string, cur: string) => boolean,\n): string => {\n const callback =\n cb ||\n function (prev: string, cur: string): boolean {\n return versionLt(prev, cur);\n };\n\n return Object.keys(shareVersionMap).reduce((prev: number | string, cur) => {\n if (!prev) {\n return cur;\n }\n if (callback(prev as string, cur)) {\n return cur;\n }\n\n // default version is '0' https://github.com/webpack/webpack/blob/main/lib/sharing/ProvideSharedModule.js#L136\n if (prev === '0') {\n return cur;\n }\n\n return prev;\n }, 0) as string;\n};\n\nexport const isLoaded = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return Boolean(shared.loaded) || typeof shared.lib === 'function';\n};\n\nconst isLoading = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return Boolean(shared.loading);\n};\n\nconst isMatchUsedExports = (\n treeShaking?: TreeShakingArgs,\n usedExports?: string[],\n) => {\n if (!treeShaking || !usedExports) {\n return false;\n }\n\n const { usedExports: treeShakingUsedExports } = treeShaking;\n\n if (!treeShakingUsedExports) {\n return false;\n }\n\n if (usedExports.every((e) => treeShakingUsedExports.includes(e))) {\n return true;\n }\n\n return false;\n};\n\nfunction findSingletonVersionOrderByVersion(\n shareScopeMap: ShareScopeMap,\n scope: string,\n pkgName: string,\n treeShaking?: TreeShakingArgs,\n): {\n version: string;\n useTreesShaking: boolean;\n} {\n const versions = shareScopeMap[scope][pkgName];\n let version = '';\n let useTreesShaking = shouldUseTreeShaking(treeShaking);\n // return false means use prev version\n const callback = function (prev: string, cur: string): boolean {\n if (useTreesShaking) {\n if (!versions[prev].treeShaking) {\n return true;\n }\n if (!versions[cur].treeShaking) {\n return false;\n }\n return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);\n }\n return !isLoaded(versions[prev]) && versionLt(prev, cur);\n };\n\n if (useTreesShaking) {\n version = findVersion(shareScopeMap[scope][pkgName], callback);\n if (version) {\n return {\n version,\n useTreesShaking,\n };\n }\n useTreesShaking = false;\n }\n\n return {\n version: findVersion(shareScopeMap[scope][pkgName], callback),\n useTreesShaking,\n };\n}\n\nconst isLoadingOrLoaded = (shared: {\n loading?: null | Promise<any>;\n loaded?: boolean;\n lib?: () => unknown;\n}) => {\n return isLoaded(shared) || isLoading(shared);\n};\n\nfunction findSingletonVersionOrderByLoaded(\n shareScopeMap: ShareScopeMap,\n scope: string,\n pkgName: string,\n treeShaking?: TreeShakingArgs,\n): {\n version: string;\n useTreesShaking: boolean;\n} {\n const versions = shareScopeMap[scope][pkgName];\n let version = '';\n let useTreesShaking = shouldUseTreeShaking(treeShaking);\n\n // return false means use prev version\n const callback = function (prev: string, cur: string): boolean {\n if (useTreesShaking) {\n if (!versions[prev].treeShaking) {\n return true;\n }\n if (!versions[cur].treeShaking) {\n return false;\n }\n if (isLoadingOrLoaded(versions[cur].treeShaking)) {\n if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n return Boolean(versionLt(prev, cur));\n } else {\n return true;\n }\n }\n if (isLoadingOrLoaded(versions[prev].treeShaking)) {\n return false;\n }\n }\n\n if (isLoadingOrLoaded(versions[cur])) {\n if (isLoadingOrLoaded(versions[prev])) {\n return Boolean(versionLt(prev, cur));\n } else {\n return true;\n }\n }\n if (isLoadingOrLoaded(versions[prev])) {\n return false;\n }\n return versionLt(prev, cur);\n };\n\n if (useTreesShaking) {\n version = findVersion(shareScopeMap[scope][pkgName], callback);\n if (version) {\n return {\n version,\n useTreesShaking,\n };\n }\n useTreesShaking = false;\n }\n\n return {\n version: findVersion(shareScopeMap[scope][pkgName], callback),\n useTreesShaking,\n };\n}\n\nfunction getFindShareFunction(strategy: Shared['strategy']) {\n if (strategy === 'loaded-first') {\n return findSingletonVersionOrderByLoaded;\n }\n return findSingletonVersionOrderByVersion;\n}\n\nexport function getRegisteredShare(\n localShareScopeMap: ShareScopeMap,\n pkgName: string,\n shareInfo: Shared,\n resolveShare: SyncWaterfallHook<{\n shareScopeMap: ShareScopeMap;\n scope: string;\n pkgName: string;\n version: string;\n shareInfo: Shared;\n GlobalFederation: Federation;\n resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n loadContext?: SharedLoadContext;\n }>,\n loadContext?: SharedLoadContext,\n): { shared: Shared; useTreesShaking: boolean } | void {\n if (!localShareScopeMap) {\n return;\n }\n const {\n shareConfig,\n scope = DEFAULT_SCOPE,\n strategy,\n treeShaking,\n } = shareInfo;\n const scopes = Array.isArray(scope) ? scope : [scope];\n\n for (const sc of scopes) {\n if (\n shareConfig &&\n localShareScopeMap[sc] &&\n localShareScopeMap[sc][pkgName]\n ) {\n const { requiredVersion } = shareConfig;\n const findShareFunction = getFindShareFunction(strategy);\n const { version: maxOrSingletonVersion, useTreesShaking } =\n findShareFunction(localShareScopeMap, sc, pkgName, treeShaking);\n\n const defaultResolver = () => {\n const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];\n if (shareConfig.singleton) {\n if (\n typeof requiredVersion === 'string' &&\n !satisfy(maxOrSingletonVersion, requiredVersion)\n ) {\n const msg = `Version ${maxOrSingletonVersion} from ${\n maxOrSingletonVersion && shared.from\n } of shared singleton module ${pkgName} does not satisfy the requirement of ${\n shareInfo.from\n } which needs ${requiredVersion})`;\n\n if (shareConfig.strictVersion) {\n error(msg);\n } else {\n warn(msg);\n }\n }\n return {\n shared,\n useTreesShaking,\n };\n } else {\n if (requiredVersion === false || requiredVersion === '*') {\n return {\n shared,\n useTreesShaking,\n };\n }\n if (satisfy(maxOrSingletonVersion, requiredVersion)) {\n return {\n shared,\n useTreesShaking,\n };\n }\n\n const _usedTreeShaking = shouldUseTreeShaking(treeShaking);\n if (_usedTreeShaking) {\n for (const [versionKey, versionValue] of Object.entries(\n localShareScopeMap[sc][pkgName],\n )) {\n if (\n !shouldUseTreeShaking(\n versionValue.treeShaking,\n treeShaking?.usedExports,\n )\n ) {\n continue;\n }\n\n if (satisfy(versionKey, requiredVersion)) {\n return {\n shared: versionValue,\n useTreesShaking: _usedTreeShaking,\n };\n }\n }\n }\n for (const [versionKey, versionValue] of Object.entries(\n localShareScopeMap[sc][pkgName],\n )) {\n if (satisfy(versionKey, requiredVersion)) {\n return {\n shared: versionValue,\n useTreesShaking: false,\n };\n }\n }\n }\n return;\n };\n const params = {\n shareScopeMap: localShareScopeMap,\n scope: sc,\n pkgName,\n version: maxOrSingletonVersion,\n GlobalFederation: Global.__FEDERATION__,\n shareInfo,\n resolver: defaultResolver,\n loadContext,\n };\n const resolveShared = resolveShare.emit(params) || params;\n return resolveShared.resolver();\n }\n }\n}\n\nexport function getGlobalShareScope(): GlobalShareScopeMap {\n return Global.__FEDERATION__.__SHARE__;\n}\n\nexport function getTargetSharedOptions(options: {\n pkgName: string;\n extraOptions?: LoadShareExtraOptions;\n shareInfos: ShareInfos;\n}) {\n const { pkgName, extraOptions, shareInfos } = options;\n const defaultResolver = (sharedOptions: ShareInfos[string]) => {\n if (!sharedOptions) {\n return undefined;\n }\n const shareVersionMap: ShareScopeMap[string][string] = {};\n sharedOptions.forEach((shared) => {\n shareVersionMap[shared.version] = shared;\n });\n const callback = function (prev: string, cur: string): boolean {\n return (\n // TODO: consider multiple treeShaking shared scenes\n !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur)\n );\n };\n\n const maxVersion = findVersion(shareVersionMap, callback);\n return shareVersionMap[maxVersion];\n };\n\n const resolver = extraOptions?.resolver ?? defaultResolver;\n const isPlainObject = (val: unknown): val is Record<string, any> => {\n return val !== null && typeof val === 'object' && !Array.isArray(val);\n };\n\n const merge = <T extends Record<string, any>>(\n ...sources: Array<Partial<T> | undefined>\n ): T => {\n const out = {} as T;\n for (const src of sources) {\n if (!src) continue;\n for (const [key, value] of Object.entries(src)) {\n const prev = (out as any)[key];\n if (isPlainObject(prev) && isPlainObject(value)) {\n (out as any)[key] = merge(prev, value);\n } else if (value !== undefined) {\n (out as any)[key] = value;\n }\n }\n }\n return out;\n };\n\n return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);\n}\n\nexport const addUseIn = (\n shared: { useIn?: Array<string> },\n from: string,\n): void => {\n if (!shared.useIn) {\n shared.useIn = [];\n }\n addUniqueItem(shared.useIn, from);\n};\n\nexport function directShare(\n shared: Shared,\n useTreesShaking?: boolean,\n): Shared | TreeShakingArgs {\n if (useTreesShaking && shared.treeShaking) {\n return shared.treeShaking;\n }\n\n return shared;\n}\n"],"mappings":"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"}
|
package/dist/utils/share.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SyncWaterfallHook } from "./hooks/syncWaterfallHook.js";
|
|
2
2
|
import { Federation } from "../global.js";
|
|
3
|
-
import { GlobalShareScopeMap, ShareScopeMap, Shared } from "../type/config.js";
|
|
3
|
+
import { GlobalShareScopeMap, ShareScopeMap, Shared, SharedLoadContext } from "../type/config.js";
|
|
4
4
|
//#region src/utils/share.d.ts
|
|
5
5
|
declare function getRegisteredShare(localShareScopeMap: ShareScopeMap, pkgName: string, shareInfo: Shared, resolveShare: SyncWaterfallHook<{
|
|
6
6
|
shareScopeMap: ShareScopeMap;
|
|
@@ -13,7 +13,8 @@ declare function getRegisteredShare(localShareScopeMap: ShareScopeMap, pkgName:
|
|
|
13
13
|
shared: Shared;
|
|
14
14
|
useTreesShaking: boolean;
|
|
15
15
|
} | undefined;
|
|
16
|
-
|
|
16
|
+
loadContext?: SharedLoadContext;
|
|
17
|
+
}>, loadContext?: SharedLoadContext): {
|
|
17
18
|
shared: Shared;
|
|
18
19
|
useTreesShaking: boolean;
|
|
19
20
|
} | void;
|
package/dist/utils/share.js
CHANGED
|
@@ -176,7 +176,7 @@ function getFindShareFunction(strategy) {
|
|
|
176
176
|
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
|
|
177
177
|
return findSingletonVersionOrderByVersion;
|
|
178
178
|
}
|
|
179
|
-
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
|
|
179
|
+
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare, loadContext) {
|
|
180
180
|
if (!localShareScopeMap) return;
|
|
181
181
|
const { shareConfig, scope = DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
|
|
182
182
|
const scopes = Array.isArray(scope) ? scope : [scope];
|
|
@@ -225,7 +225,8 @@ function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare
|
|
|
225
225
|
version: maxOrSingletonVersion,
|
|
226
226
|
GlobalFederation: Global.__FEDERATION__,
|
|
227
227
|
shareInfo,
|
|
228
|
-
resolver: defaultResolver
|
|
228
|
+
resolver: defaultResolver,
|
|
229
|
+
loadContext
|
|
229
230
|
};
|
|
230
231
|
return (resolveShare.emit(params) || params).resolver();
|
|
231
232
|
}
|