@module-federation/runtime-core 2.0.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.cjs +19 -0
- package/dist/_virtual/_rolldown/runtime.js +18 -0
- package/dist/constant.cjs +9 -0
- package/dist/constant.cjs.map +1 -0
- package/dist/constant.js +7 -0
- package/dist/constant.js.map +1 -0
- package/dist/core.cjs +153 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +129 -0
- package/dist/core.js +153 -0
- package/dist/core.js.map +1 -0
- package/dist/global.cjs +160 -0
- package/dist/global.cjs.map +1 -0
- package/dist/global.d.ts +45 -0
- package/dist/global.js +142 -0
- package/dist/global.js.map +1 -0
- package/dist/helpers.cjs +44 -0
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.ts +30 -0
- package/dist/helpers.js +44 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.cjs +60 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +29 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/module/index.cjs +129 -0
- package/dist/module/index.cjs.map +1 -0
- package/dist/module/index.d.ts +31 -0
- package/dist/module/index.js +129 -0
- package/dist/module/index.js.map +1 -0
- package/dist/plugins/generate-preload-assets.cjs +182 -0
- package/dist/plugins/generate-preload-assets.cjs.map +1 -0
- package/dist/plugins/generate-preload-assets.js +182 -0
- package/dist/plugins/generate-preload-assets.js.map +1 -0
- package/dist/plugins/snapshot/SnapshotHandler.cjs +190 -0
- package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -0
- package/dist/plugins/snapshot/SnapshotHandler.d.ts +66 -0
- package/dist/plugins/snapshot/SnapshotHandler.js +189 -0
- package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -0
- package/dist/plugins/snapshot/index.cjs +63 -0
- package/dist/plugins/snapshot/index.cjs.map +1 -0
- package/dist/plugins/snapshot/index.js +62 -0
- package/dist/plugins/snapshot/index.js.map +1 -0
- package/dist/remote/index.cjs +304 -0
- package/dist/remote/index.cjs.map +1 -0
- package/dist/remote/index.d.ts +119 -0
- package/dist/remote/index.js +304 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/shared/index.cjs +303 -0
- package/dist/shared/index.cjs.map +1 -0
- package/dist/shared/index.d.ts +82 -0
- package/dist/shared/index.js +303 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/type/config.d.ts +130 -0
- package/dist/type/index.cjs +13 -0
- package/dist/type/index.cjs.map +1 -0
- package/dist/type/index.d.ts +11 -0
- package/dist/type/index.js +8 -0
- package/dist/type/index.js.map +1 -0
- package/dist/type/plugin.d.ts +27 -0
- package/dist/type/preload.d.ts +31 -0
- package/dist/types.cjs +0 -0
- package/dist/types.d.ts +4 -1
- package/dist/types.js +1 -0
- package/dist/utils/context.cjs +45 -0
- package/dist/utils/context.cjs.map +1 -0
- package/dist/utils/context.d.ts +1 -0
- package/dist/utils/context.js +44 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/env.cjs +10 -0
- package/dist/utils/env.cjs.map +1 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.js +10 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/hooks/asyncHook.cjs +23 -0
- package/dist/utils/hooks/asyncHook.cjs.map +1 -0
- package/dist/utils/hooks/asyncHook.d.ts +10 -0
- package/dist/utils/hooks/asyncHook.js +23 -0
- package/dist/utils/hooks/asyncHook.js.map +1 -0
- package/dist/utils/hooks/asyncWaterfallHooks.cjs +42 -0
- package/dist/utils/hooks/asyncWaterfallHooks.cjs.map +1 -0
- package/dist/utils/hooks/asyncWaterfallHooks.d.ts +12 -0
- package/dist/utils/hooks/asyncWaterfallHooks.js +42 -0
- package/dist/utils/hooks/asyncWaterfallHooks.js.map +1 -0
- package/dist/utils/hooks/index.cjs +5 -0
- package/dist/utils/hooks/index.d.ts +5 -0
- package/dist/utils/hooks/index.js +7 -0
- package/dist/utils/hooks/pluginSystem.cjs +37 -0
- package/dist/utils/hooks/pluginSystem.cjs.map +1 -0
- package/dist/utils/hooks/pluginSystem.d.ts +19 -0
- package/dist/utils/hooks/pluginSystem.js +37 -0
- package/dist/utils/hooks/pluginSystem.js.map +1 -0
- package/dist/utils/hooks/syncHook.cjs +36 -0
- package/dist/utils/hooks/syncHook.cjs.map +1 -0
- package/dist/utils/hooks/syncHook.d.ts +16 -0
- package/dist/utils/hooks/syncHook.js +35 -0
- package/dist/utils/hooks/syncHook.js.map +1 -0
- package/dist/utils/hooks/syncWaterfallHook.cjs +39 -0
- package/dist/utils/hooks/syncWaterfallHook.cjs.map +1 -0
- package/dist/utils/hooks/syncWaterfallHook.d.ts +11 -0
- package/dist/utils/hooks/syncWaterfallHook.js +38 -0
- package/dist/utils/hooks/syncWaterfallHook.js.map +1 -0
- package/dist/utils/index.cjs +8 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/load.cjs +179 -0
- package/dist/utils/load.cjs.map +1 -0
- package/dist/utils/load.d.ts +14 -0
- package/dist/utils/load.js +177 -0
- package/dist/utils/load.js.map +1 -0
- package/dist/utils/logger.cjs +34 -0
- package/dist/utils/logger.cjs.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/manifest.cjs +51 -0
- package/dist/utils/manifest.cjs.map +1 -0
- package/dist/utils/manifest.d.ts +10 -0
- package/dist/utils/manifest.js +49 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/plugin.cjs +27 -0
- package/dist/utils/plugin.cjs.map +1 -0
- package/dist/utils/plugin.d.ts +1 -0
- package/dist/utils/plugin.js +27 -0
- package/dist/utils/plugin.js.map +1 -0
- package/dist/utils/preload.cjs +146 -0
- package/dist/utils/preload.cjs.map +1 -0
- package/dist/utils/preload.d.ts +8 -0
- package/dist/utils/preload.js +143 -0
- package/dist/utils/preload.js.map +1 -0
- package/dist/utils/semver/compare.cjs +48 -0
- package/dist/utils/semver/compare.cjs.map +1 -0
- package/dist/utils/semver/compare.js +47 -0
- package/dist/utils/semver/compare.js.map +1 -0
- package/dist/utils/semver/constants.cjs +41 -0
- package/dist/utils/semver/constants.cjs.map +1 -0
- package/dist/utils/semver/constants.js +31 -0
- package/dist/utils/semver/constants.js.map +1 -0
- package/dist/utils/semver/index.cjs +68 -0
- package/dist/utils/semver/index.cjs.map +1 -0
- package/dist/utils/semver/index.d.ts +5 -0
- package/dist/utils/semver/index.js +68 -0
- package/dist/utils/semver/index.js.map +1 -0
- package/dist/utils/semver/parser.cjs +104 -0
- package/dist/utils/semver/parser.cjs.map +1 -0
- package/dist/utils/semver/parser.js +96 -0
- package/dist/utils/semver/parser.js.map +1 -0
- package/dist/utils/semver/utils.cjs +28 -0
- package/dist/utils/semver/utils.cjs.map +1 -0
- package/dist/utils/semver/utils.js +24 -0
- package/dist/utils/semver/utils.js.map +1 -0
- package/dist/utils/share.cjs +284 -0
- package/dist/utils/share.cjs.map +1 -0
- package/dist/utils/share.d.ts +23 -0
- package/dist/utils/share.js +278 -0
- package/dist/utils/share.js.map +1 -0
- package/dist/utils/tool.cjs +82 -0
- package/dist/utils/tool.cjs.map +1 -0
- package/dist/utils/tool.d.ts +8 -0
- package/dist/utils/tool.js +71 -0
- package/dist/utils/tool.js.map +1 -0
- package/package.json +16 -9
- package/dist/index.cjs.cjs +0 -3442
- package/dist/index.cjs.cjs.map +0 -1
- package/dist/index.cjs.d.ts +0 -1
- package/dist/index.esm.js +0 -3418
- package/dist/index.esm.js.map +0 -1
- package/dist/src/constant.d.ts +0 -2
- package/dist/src/core.d.ts +0 -119
- package/dist/src/global.d.ts +0 -42
- package/dist/src/helpers.d.ts +0 -38
- package/dist/src/index.d.ts +0 -14
- package/dist/src/module/index.d.ts +0 -25
- package/dist/src/plugins/generate-preload-assets.d.ts +0 -8
- package/dist/src/plugins/snapshot/SnapshotHandler.d.ts +0 -60
- package/dist/src/plugins/snapshot/index.d.ts +0 -5
- package/dist/src/remote/index.d.ts +0 -109
- package/dist/src/shared/index.d.ts +0 -75
- package/dist/src/type/config.d.ts +0 -128
- package/dist/src/type/index.d.ts +0 -3
- package/dist/src/type/plugin.d.ts +0 -35
- package/dist/src/type/preload.d.ts +0 -26
- package/dist/src/types.d.ts +0 -1
- package/dist/src/utils/env.d.ts +0 -3
- package/dist/src/utils/hooks/asyncHook.d.ts +0 -6
- package/dist/src/utils/hooks/asyncWaterfallHooks.d.ts +0 -10
- package/dist/src/utils/hooks/index.d.ts +0 -6
- package/dist/src/utils/hooks/pluginSystem.d.ts +0 -16
- package/dist/src/utils/hooks/syncHook.d.ts +0 -12
- package/dist/src/utils/hooks/syncWaterfallHook.d.ts +0 -9
- package/dist/src/utils/index.d.ts +0 -6
- package/dist/src/utils/load.d.ts +0 -11
- package/dist/src/utils/logger.d.ts +0 -6
- package/dist/src/utils/manifest.d.ts +0 -7
- package/dist/src/utils/plugin.d.ts +0 -3
- package/dist/src/utils/preload.d.ts +0 -6
- package/dist/src/utils/semver/compare.d.ts +0 -9
- package/dist/src/utils/semver/constants.d.ts +0 -10
- package/dist/src/utils/semver/index.d.ts +0 -2
- package/dist/src/utils/semver/parser.d.ts +0 -9
- package/dist/src/utils/semver/utils.d.ts +0 -11
- package/dist/src/utils/share.d.ts +0 -45
- package/dist/src/utils/tool.d.ts +0 -18
- package/dist/types.cjs.cjs +0 -3
- package/dist/types.cjs.cjs.map +0 -1
- package/dist/types.cjs.d.ts +0 -1
- package/dist/types.esm.js +0 -2
- package/dist/types.esm.js.map +0 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
const require_logger = require('./logger.cjs');
|
|
2
|
+
const require_tool = require('./tool.cjs');
|
|
3
|
+
const require_global = require('../global.cjs');
|
|
4
|
+
const require_constant = require('../constant.cjs');
|
|
5
|
+
const require_index = require('./semver/index.cjs');
|
|
6
|
+
let _module_federation_sdk = require("@module-federation/sdk");
|
|
7
|
+
|
|
8
|
+
//#region src/utils/share.ts
|
|
9
|
+
function formatShare(shareArgs, from, name, shareStrategy) {
|
|
10
|
+
let get;
|
|
11
|
+
if ("get" in shareArgs) get = shareArgs.get;
|
|
12
|
+
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
|
|
13
|
+
else get = () => Promise.resolve(() => {
|
|
14
|
+
require_logger.error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
|
|
15
|
+
});
|
|
16
|
+
if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) require_logger.error(`Invalid shared config for "${name}" from "${from}": cannot use both "eager: true" and "treeShaking.mode" simultaneously. Choose one strategy.`);
|
|
17
|
+
return {
|
|
18
|
+
deps: [],
|
|
19
|
+
useIn: [],
|
|
20
|
+
from,
|
|
21
|
+
loading: null,
|
|
22
|
+
...shareArgs,
|
|
23
|
+
shareConfig: {
|
|
24
|
+
requiredVersion: `^${shareArgs.version}`,
|
|
25
|
+
singleton: false,
|
|
26
|
+
eager: false,
|
|
27
|
+
strictVersion: false,
|
|
28
|
+
...shareArgs.shareConfig
|
|
29
|
+
},
|
|
30
|
+
get,
|
|
31
|
+
loaded: shareArgs?.loaded || "lib" in shareArgs ? true : void 0,
|
|
32
|
+
version: shareArgs.version ?? "0",
|
|
33
|
+
scope: Array.isArray(shareArgs.scope) ? shareArgs.scope : [shareArgs.scope ?? "default"],
|
|
34
|
+
strategy: (shareArgs.strategy ?? shareStrategy) || "version-first",
|
|
35
|
+
treeShaking: shareArgs.treeShaking ? {
|
|
36
|
+
...shareArgs.treeShaking,
|
|
37
|
+
mode: shareArgs.treeShaking.mode ?? "server-calc",
|
|
38
|
+
status: shareArgs.treeShaking.status ?? _module_federation_sdk.TreeShakingStatus.UNKNOWN,
|
|
39
|
+
useIn: []
|
|
40
|
+
} : void 0
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function formatShareConfigs(prevOptions, newOptions) {
|
|
44
|
+
const shareArgs = newOptions.shared || {};
|
|
45
|
+
const from = newOptions.name;
|
|
46
|
+
const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {
|
|
47
|
+
const arrayShareArgs = require_tool.arrayOptions(shareArgs[pkgName]);
|
|
48
|
+
res[pkgName] = res[pkgName] || [];
|
|
49
|
+
arrayShareArgs.forEach((shareConfig) => {
|
|
50
|
+
res[pkgName].push(formatShare(shareConfig, from, pkgName, newOptions.shareStrategy));
|
|
51
|
+
});
|
|
52
|
+
return res;
|
|
53
|
+
}, {});
|
|
54
|
+
const allShareInfos = { ...prevOptions.shared };
|
|
55
|
+
Object.keys(newShareInfos).forEach((shareKey) => {
|
|
56
|
+
if (!allShareInfos[shareKey]) allShareInfos[shareKey] = newShareInfos[shareKey];
|
|
57
|
+
else newShareInfos[shareKey].forEach((newUserSharedOptions) => {
|
|
58
|
+
if (!allShareInfos[shareKey].find((sharedVal) => sharedVal.version === newUserSharedOptions.version)) allShareInfos[shareKey].push(newUserSharedOptions);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
allShareInfos,
|
|
63
|
+
newShareInfos
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function shouldUseTreeShaking(treeShaking, usedExports) {
|
|
67
|
+
if (!treeShaking) return false;
|
|
68
|
+
const { status, mode } = treeShaking;
|
|
69
|
+
if (status === _module_federation_sdk.TreeShakingStatus.NO_USE) return false;
|
|
70
|
+
if (status === _module_federation_sdk.TreeShakingStatus.CALCULATED) return true;
|
|
71
|
+
if (mode === "runtime-infer") {
|
|
72
|
+
if (!usedExports) return true;
|
|
73
|
+
return isMatchUsedExports(treeShaking, usedExports);
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* compare version a and b, return true if a is less than b
|
|
79
|
+
*/
|
|
80
|
+
function versionLt(a, b) {
|
|
81
|
+
const transformInvalidVersion = (version) => {
|
|
82
|
+
if (!Number.isNaN(Number(version))) {
|
|
83
|
+
const splitArr = version.split(".");
|
|
84
|
+
let validVersion = version;
|
|
85
|
+
for (let i = 0; i < 3 - splitArr.length; i++) validVersion += ".0";
|
|
86
|
+
return validVersion;
|
|
87
|
+
}
|
|
88
|
+
return version;
|
|
89
|
+
};
|
|
90
|
+
if (require_index.satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) return true;
|
|
91
|
+
else return false;
|
|
92
|
+
}
|
|
93
|
+
const findVersion = (shareVersionMap, cb) => {
|
|
94
|
+
const callback = cb || function(prev, cur) {
|
|
95
|
+
return versionLt(prev, cur);
|
|
96
|
+
};
|
|
97
|
+
return Object.keys(shareVersionMap).reduce((prev, cur) => {
|
|
98
|
+
if (!prev) return cur;
|
|
99
|
+
if (callback(prev, cur)) return cur;
|
|
100
|
+
if (prev === "0") return cur;
|
|
101
|
+
return prev;
|
|
102
|
+
}, 0);
|
|
103
|
+
};
|
|
104
|
+
const isLoaded = (shared) => {
|
|
105
|
+
return Boolean(shared.loaded) || typeof shared.lib === "function";
|
|
106
|
+
};
|
|
107
|
+
const isLoading = (shared) => {
|
|
108
|
+
return Boolean(shared.loading);
|
|
109
|
+
};
|
|
110
|
+
const isMatchUsedExports = (treeShaking, usedExports) => {
|
|
111
|
+
if (!treeShaking || !usedExports) return false;
|
|
112
|
+
const { usedExports: treeShakingUsedExports } = treeShaking;
|
|
113
|
+
if (!treeShakingUsedExports) return false;
|
|
114
|
+
if (usedExports.every((e) => treeShakingUsedExports.includes(e))) return true;
|
|
115
|
+
return false;
|
|
116
|
+
};
|
|
117
|
+
function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName, treeShaking) {
|
|
118
|
+
const versions = shareScopeMap[scope][pkgName];
|
|
119
|
+
let version = "";
|
|
120
|
+
let useTreesShaking = shouldUseTreeShaking(treeShaking);
|
|
121
|
+
const callback = function(prev, cur) {
|
|
122
|
+
if (useTreesShaking) {
|
|
123
|
+
if (!versions[prev].treeShaking) return true;
|
|
124
|
+
if (!versions[cur].treeShaking) return false;
|
|
125
|
+
return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);
|
|
126
|
+
}
|
|
127
|
+
return !isLoaded(versions[prev]) && versionLt(prev, cur);
|
|
128
|
+
};
|
|
129
|
+
if (useTreesShaking) {
|
|
130
|
+
version = findVersion(shareScopeMap[scope][pkgName], callback);
|
|
131
|
+
if (version) return {
|
|
132
|
+
version,
|
|
133
|
+
useTreesShaking
|
|
134
|
+
};
|
|
135
|
+
useTreesShaking = false;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
version: findVersion(shareScopeMap[scope][pkgName], callback),
|
|
139
|
+
useTreesShaking
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const isLoadingOrLoaded = (shared) => {
|
|
143
|
+
return isLoaded(shared) || isLoading(shared);
|
|
144
|
+
};
|
|
145
|
+
function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName, treeShaking) {
|
|
146
|
+
const versions = shareScopeMap[scope][pkgName];
|
|
147
|
+
let version = "";
|
|
148
|
+
let useTreesShaking = shouldUseTreeShaking(treeShaking);
|
|
149
|
+
const callback = function(prev, cur) {
|
|
150
|
+
if (useTreesShaking) {
|
|
151
|
+
if (!versions[prev].treeShaking) return true;
|
|
152
|
+
if (!versions[cur].treeShaking) return false;
|
|
153
|
+
if (isLoadingOrLoaded(versions[cur].treeShaking)) if (isLoadingOrLoaded(versions[prev].treeShaking)) return Boolean(versionLt(prev, cur));
|
|
154
|
+
else return true;
|
|
155
|
+
if (isLoadingOrLoaded(versions[prev].treeShaking)) return false;
|
|
156
|
+
}
|
|
157
|
+
if (isLoadingOrLoaded(versions[cur])) if (isLoadingOrLoaded(versions[prev])) return Boolean(versionLt(prev, cur));
|
|
158
|
+
else return true;
|
|
159
|
+
if (isLoadingOrLoaded(versions[prev])) return false;
|
|
160
|
+
return versionLt(prev, cur);
|
|
161
|
+
};
|
|
162
|
+
if (useTreesShaking) {
|
|
163
|
+
version = findVersion(shareScopeMap[scope][pkgName], callback);
|
|
164
|
+
if (version) return {
|
|
165
|
+
version,
|
|
166
|
+
useTreesShaking
|
|
167
|
+
};
|
|
168
|
+
useTreesShaking = false;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
version: findVersion(shareScopeMap[scope][pkgName], callback),
|
|
172
|
+
useTreesShaking
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function getFindShareFunction(strategy) {
|
|
176
|
+
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
|
|
177
|
+
return findSingletonVersionOrderByVersion;
|
|
178
|
+
}
|
|
179
|
+
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
|
|
180
|
+
if (!localShareScopeMap) return;
|
|
181
|
+
const { shareConfig, scope = require_constant.DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
|
|
182
|
+
const scopes = Array.isArray(scope) ? scope : [scope];
|
|
183
|
+
for (const sc of scopes) if (shareConfig && localShareScopeMap[sc] && localShareScopeMap[sc][pkgName]) {
|
|
184
|
+
const { requiredVersion } = shareConfig;
|
|
185
|
+
const { version: maxOrSingletonVersion, useTreesShaking } = getFindShareFunction(strategy)(localShareScopeMap, sc, pkgName, treeShaking);
|
|
186
|
+
const defaultResolver = () => {
|
|
187
|
+
const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];
|
|
188
|
+
if (shareConfig.singleton) {
|
|
189
|
+
if (typeof requiredVersion === "string" && !require_index.satisfy(maxOrSingletonVersion, requiredVersion)) {
|
|
190
|
+
const msg = `Version ${maxOrSingletonVersion} from ${maxOrSingletonVersion && shared.from} of shared singleton module ${pkgName} does not satisfy the requirement of ${shareInfo.from} which needs ${requiredVersion})`;
|
|
191
|
+
if (shareConfig.strictVersion) require_logger.error(msg);
|
|
192
|
+
else require_logger.warn(msg);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
shared,
|
|
196
|
+
useTreesShaking
|
|
197
|
+
};
|
|
198
|
+
} else {
|
|
199
|
+
if (requiredVersion === false || requiredVersion === "*") return {
|
|
200
|
+
shared,
|
|
201
|
+
useTreesShaking
|
|
202
|
+
};
|
|
203
|
+
if (require_index.satisfy(maxOrSingletonVersion, requiredVersion)) return {
|
|
204
|
+
shared,
|
|
205
|
+
useTreesShaking
|
|
206
|
+
};
|
|
207
|
+
const _usedTreeShaking = shouldUseTreeShaking(treeShaking);
|
|
208
|
+
if (_usedTreeShaking) for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) {
|
|
209
|
+
if (!shouldUseTreeShaking(versionValue.treeShaking, treeShaking?.usedExports)) continue;
|
|
210
|
+
if (require_index.satisfy(versionKey, requiredVersion)) return {
|
|
211
|
+
shared: versionValue,
|
|
212
|
+
useTreesShaking: _usedTreeShaking
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) if (require_index.satisfy(versionKey, requiredVersion)) return {
|
|
216
|
+
shared: versionValue,
|
|
217
|
+
useTreesShaking: false
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const params = {
|
|
222
|
+
shareScopeMap: localShareScopeMap,
|
|
223
|
+
scope: sc,
|
|
224
|
+
pkgName,
|
|
225
|
+
version: maxOrSingletonVersion,
|
|
226
|
+
GlobalFederation: require_global.Global.__FEDERATION__,
|
|
227
|
+
shareInfo,
|
|
228
|
+
resolver: defaultResolver
|
|
229
|
+
};
|
|
230
|
+
return (resolveShare.emit(params) || params).resolver();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function getGlobalShareScope() {
|
|
234
|
+
return require_global.Global.__FEDERATION__.__SHARE__;
|
|
235
|
+
}
|
|
236
|
+
function getTargetSharedOptions(options) {
|
|
237
|
+
const { pkgName, extraOptions, shareInfos } = options;
|
|
238
|
+
const defaultResolver = (sharedOptions) => {
|
|
239
|
+
if (!sharedOptions) return;
|
|
240
|
+
const shareVersionMap = {};
|
|
241
|
+
sharedOptions.forEach((shared) => {
|
|
242
|
+
shareVersionMap[shared.version] = shared;
|
|
243
|
+
});
|
|
244
|
+
const callback = function(prev, cur) {
|
|
245
|
+
return !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur);
|
|
246
|
+
};
|
|
247
|
+
return shareVersionMap[findVersion(shareVersionMap, callback)];
|
|
248
|
+
};
|
|
249
|
+
const resolver = extraOptions?.resolver ?? defaultResolver;
|
|
250
|
+
const isPlainObject = (val) => {
|
|
251
|
+
return val !== null && typeof val === "object" && !Array.isArray(val);
|
|
252
|
+
};
|
|
253
|
+
const merge = (...sources) => {
|
|
254
|
+
const out = {};
|
|
255
|
+
for (const src of sources) {
|
|
256
|
+
if (!src) continue;
|
|
257
|
+
for (const [key, value] of Object.entries(src)) {
|
|
258
|
+
const prev = out[key];
|
|
259
|
+
if (isPlainObject(prev) && isPlainObject(value)) out[key] = merge(prev, value);
|
|
260
|
+
else if (value !== void 0) out[key] = value;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
};
|
|
265
|
+
return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);
|
|
266
|
+
}
|
|
267
|
+
const addUseIn = (shared, from) => {
|
|
268
|
+
if (!shared.useIn) shared.useIn = [];
|
|
269
|
+
require_tool.addUniqueItem(shared.useIn, from);
|
|
270
|
+
};
|
|
271
|
+
function directShare(shared, useTreesShaking) {
|
|
272
|
+
if (useTreesShaking && shared.treeShaking) return shared.treeShaking;
|
|
273
|
+
return shared;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
//#endregion
|
|
277
|
+
exports.addUseIn = addUseIn;
|
|
278
|
+
exports.directShare = directShare;
|
|
279
|
+
exports.formatShareConfigs = formatShareConfigs;
|
|
280
|
+
exports.getGlobalShareScope = getGlobalShareScope;
|
|
281
|
+
exports.getRegisteredShare = getRegisteredShare;
|
|
282
|
+
exports.getTargetSharedOptions = getTargetSharedOptions;
|
|
283
|
+
exports.shouldUseTreeShaking = shouldUseTreeShaking;
|
|
284
|
+
//# sourceMappingURL=share.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SyncWaterfallHook } from "./hooks/syncWaterfallHook.js";
|
|
2
|
+
import { Federation } from "../global.js";
|
|
3
|
+
import { GlobalShareScopeMap, ShareScopeMap, Shared } from "../type/config.js";
|
|
4
|
+
//#region src/utils/share.d.ts
|
|
5
|
+
declare function getRegisteredShare(localShareScopeMap: ShareScopeMap, pkgName: string, shareInfo: Shared, resolveShare: SyncWaterfallHook<{
|
|
6
|
+
shareScopeMap: ShareScopeMap;
|
|
7
|
+
scope: string;
|
|
8
|
+
pkgName: string;
|
|
9
|
+
version: string;
|
|
10
|
+
shareInfo: Shared;
|
|
11
|
+
GlobalFederation: Federation;
|
|
12
|
+
resolver: () => {
|
|
13
|
+
shared: Shared;
|
|
14
|
+
useTreesShaking: boolean;
|
|
15
|
+
} | undefined;
|
|
16
|
+
}>): {
|
|
17
|
+
shared: Shared;
|
|
18
|
+
useTreesShaking: boolean;
|
|
19
|
+
} | void;
|
|
20
|
+
declare function getGlobalShareScope(): GlobalShareScopeMap;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getGlobalShareScope, getRegisteredShare };
|
|
23
|
+
//# sourceMappingURL=share.d.ts.map
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { error, warn as warn$1 } from "./logger.js";
|
|
2
|
+
import { addUniqueItem, arrayOptions } from "./tool.js";
|
|
3
|
+
import { Global } from "../global.js";
|
|
4
|
+
import { DEFAULT_SCOPE } from "../constant.js";
|
|
5
|
+
import { satisfy } from "./semver/index.js";
|
|
6
|
+
import { TreeShakingStatus } from "@module-federation/sdk";
|
|
7
|
+
|
|
8
|
+
//#region src/utils/share.ts
|
|
9
|
+
function formatShare(shareArgs, from, name, shareStrategy) {
|
|
10
|
+
let get;
|
|
11
|
+
if ("get" in shareArgs) get = shareArgs.get;
|
|
12
|
+
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
|
|
13
|
+
else get = () => Promise.resolve(() => {
|
|
14
|
+
error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
|
|
15
|
+
});
|
|
16
|
+
if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) error(`Invalid shared config for "${name}" from "${from}": cannot use both "eager: true" and "treeShaking.mode" simultaneously. Choose one strategy.`);
|
|
17
|
+
return {
|
|
18
|
+
deps: [],
|
|
19
|
+
useIn: [],
|
|
20
|
+
from,
|
|
21
|
+
loading: null,
|
|
22
|
+
...shareArgs,
|
|
23
|
+
shareConfig: {
|
|
24
|
+
requiredVersion: `^${shareArgs.version}`,
|
|
25
|
+
singleton: false,
|
|
26
|
+
eager: false,
|
|
27
|
+
strictVersion: false,
|
|
28
|
+
...shareArgs.shareConfig
|
|
29
|
+
},
|
|
30
|
+
get,
|
|
31
|
+
loaded: shareArgs?.loaded || "lib" in shareArgs ? true : void 0,
|
|
32
|
+
version: shareArgs.version ?? "0",
|
|
33
|
+
scope: Array.isArray(shareArgs.scope) ? shareArgs.scope : [shareArgs.scope ?? "default"],
|
|
34
|
+
strategy: (shareArgs.strategy ?? shareStrategy) || "version-first",
|
|
35
|
+
treeShaking: shareArgs.treeShaking ? {
|
|
36
|
+
...shareArgs.treeShaking,
|
|
37
|
+
mode: shareArgs.treeShaking.mode ?? "server-calc",
|
|
38
|
+
status: shareArgs.treeShaking.status ?? TreeShakingStatus.UNKNOWN,
|
|
39
|
+
useIn: []
|
|
40
|
+
} : void 0
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function formatShareConfigs(prevOptions, newOptions) {
|
|
44
|
+
const shareArgs = newOptions.shared || {};
|
|
45
|
+
const from = newOptions.name;
|
|
46
|
+
const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {
|
|
47
|
+
const arrayShareArgs = arrayOptions(shareArgs[pkgName]);
|
|
48
|
+
res[pkgName] = res[pkgName] || [];
|
|
49
|
+
arrayShareArgs.forEach((shareConfig) => {
|
|
50
|
+
res[pkgName].push(formatShare(shareConfig, from, pkgName, newOptions.shareStrategy));
|
|
51
|
+
});
|
|
52
|
+
return res;
|
|
53
|
+
}, {});
|
|
54
|
+
const allShareInfos = { ...prevOptions.shared };
|
|
55
|
+
Object.keys(newShareInfos).forEach((shareKey) => {
|
|
56
|
+
if (!allShareInfos[shareKey]) allShareInfos[shareKey] = newShareInfos[shareKey];
|
|
57
|
+
else newShareInfos[shareKey].forEach((newUserSharedOptions) => {
|
|
58
|
+
if (!allShareInfos[shareKey].find((sharedVal) => sharedVal.version === newUserSharedOptions.version)) allShareInfos[shareKey].push(newUserSharedOptions);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
allShareInfos,
|
|
63
|
+
newShareInfos
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function shouldUseTreeShaking(treeShaking, usedExports) {
|
|
67
|
+
if (!treeShaking) return false;
|
|
68
|
+
const { status, mode } = treeShaking;
|
|
69
|
+
if (status === TreeShakingStatus.NO_USE) return false;
|
|
70
|
+
if (status === TreeShakingStatus.CALCULATED) return true;
|
|
71
|
+
if (mode === "runtime-infer") {
|
|
72
|
+
if (!usedExports) return true;
|
|
73
|
+
return isMatchUsedExports(treeShaking, usedExports);
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* compare version a and b, return true if a is less than b
|
|
79
|
+
*/
|
|
80
|
+
function versionLt(a, b) {
|
|
81
|
+
const transformInvalidVersion = (version) => {
|
|
82
|
+
if (!Number.isNaN(Number(version))) {
|
|
83
|
+
const splitArr = version.split(".");
|
|
84
|
+
let validVersion = version;
|
|
85
|
+
for (let i = 0; i < 3 - splitArr.length; i++) validVersion += ".0";
|
|
86
|
+
return validVersion;
|
|
87
|
+
}
|
|
88
|
+
return version;
|
|
89
|
+
};
|
|
90
|
+
if (satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) return true;
|
|
91
|
+
else return false;
|
|
92
|
+
}
|
|
93
|
+
const findVersion = (shareVersionMap, cb) => {
|
|
94
|
+
const callback = cb || function(prev, cur) {
|
|
95
|
+
return versionLt(prev, cur);
|
|
96
|
+
};
|
|
97
|
+
return Object.keys(shareVersionMap).reduce((prev, cur) => {
|
|
98
|
+
if (!prev) return cur;
|
|
99
|
+
if (callback(prev, cur)) return cur;
|
|
100
|
+
if (prev === "0") return cur;
|
|
101
|
+
return prev;
|
|
102
|
+
}, 0);
|
|
103
|
+
};
|
|
104
|
+
const isLoaded = (shared) => {
|
|
105
|
+
return Boolean(shared.loaded) || typeof shared.lib === "function";
|
|
106
|
+
};
|
|
107
|
+
const isLoading = (shared) => {
|
|
108
|
+
return Boolean(shared.loading);
|
|
109
|
+
};
|
|
110
|
+
const isMatchUsedExports = (treeShaking, usedExports) => {
|
|
111
|
+
if (!treeShaking || !usedExports) return false;
|
|
112
|
+
const { usedExports: treeShakingUsedExports } = treeShaking;
|
|
113
|
+
if (!treeShakingUsedExports) return false;
|
|
114
|
+
if (usedExports.every((e) => treeShakingUsedExports.includes(e))) return true;
|
|
115
|
+
return false;
|
|
116
|
+
};
|
|
117
|
+
function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName, treeShaking) {
|
|
118
|
+
const versions = shareScopeMap[scope][pkgName];
|
|
119
|
+
let version = "";
|
|
120
|
+
let useTreesShaking = shouldUseTreeShaking(treeShaking);
|
|
121
|
+
const callback = function(prev, cur) {
|
|
122
|
+
if (useTreesShaking) {
|
|
123
|
+
if (!versions[prev].treeShaking) return true;
|
|
124
|
+
if (!versions[cur].treeShaking) return false;
|
|
125
|
+
return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);
|
|
126
|
+
}
|
|
127
|
+
return !isLoaded(versions[prev]) && versionLt(prev, cur);
|
|
128
|
+
};
|
|
129
|
+
if (useTreesShaking) {
|
|
130
|
+
version = findVersion(shareScopeMap[scope][pkgName], callback);
|
|
131
|
+
if (version) return {
|
|
132
|
+
version,
|
|
133
|
+
useTreesShaking
|
|
134
|
+
};
|
|
135
|
+
useTreesShaking = false;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
version: findVersion(shareScopeMap[scope][pkgName], callback),
|
|
139
|
+
useTreesShaking
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const isLoadingOrLoaded = (shared) => {
|
|
143
|
+
return isLoaded(shared) || isLoading(shared);
|
|
144
|
+
};
|
|
145
|
+
function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName, treeShaking) {
|
|
146
|
+
const versions = shareScopeMap[scope][pkgName];
|
|
147
|
+
let version = "";
|
|
148
|
+
let useTreesShaking = shouldUseTreeShaking(treeShaking);
|
|
149
|
+
const callback = function(prev, cur) {
|
|
150
|
+
if (useTreesShaking) {
|
|
151
|
+
if (!versions[prev].treeShaking) return true;
|
|
152
|
+
if (!versions[cur].treeShaking) return false;
|
|
153
|
+
if (isLoadingOrLoaded(versions[cur].treeShaking)) if (isLoadingOrLoaded(versions[prev].treeShaking)) return Boolean(versionLt(prev, cur));
|
|
154
|
+
else return true;
|
|
155
|
+
if (isLoadingOrLoaded(versions[prev].treeShaking)) return false;
|
|
156
|
+
}
|
|
157
|
+
if (isLoadingOrLoaded(versions[cur])) if (isLoadingOrLoaded(versions[prev])) return Boolean(versionLt(prev, cur));
|
|
158
|
+
else return true;
|
|
159
|
+
if (isLoadingOrLoaded(versions[prev])) return false;
|
|
160
|
+
return versionLt(prev, cur);
|
|
161
|
+
};
|
|
162
|
+
if (useTreesShaking) {
|
|
163
|
+
version = findVersion(shareScopeMap[scope][pkgName], callback);
|
|
164
|
+
if (version) return {
|
|
165
|
+
version,
|
|
166
|
+
useTreesShaking
|
|
167
|
+
};
|
|
168
|
+
useTreesShaking = false;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
version: findVersion(shareScopeMap[scope][pkgName], callback),
|
|
172
|
+
useTreesShaking
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function getFindShareFunction(strategy) {
|
|
176
|
+
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
|
|
177
|
+
return findSingletonVersionOrderByVersion;
|
|
178
|
+
}
|
|
179
|
+
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
|
|
180
|
+
if (!localShareScopeMap) return;
|
|
181
|
+
const { shareConfig, scope = DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
|
|
182
|
+
const scopes = Array.isArray(scope) ? scope : [scope];
|
|
183
|
+
for (const sc of scopes) if (shareConfig && localShareScopeMap[sc] && localShareScopeMap[sc][pkgName]) {
|
|
184
|
+
const { requiredVersion } = shareConfig;
|
|
185
|
+
const { version: maxOrSingletonVersion, useTreesShaking } = getFindShareFunction(strategy)(localShareScopeMap, sc, pkgName, treeShaking);
|
|
186
|
+
const defaultResolver = () => {
|
|
187
|
+
const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];
|
|
188
|
+
if (shareConfig.singleton) {
|
|
189
|
+
if (typeof requiredVersion === "string" && !satisfy(maxOrSingletonVersion, requiredVersion)) {
|
|
190
|
+
const msg = `Version ${maxOrSingletonVersion} from ${maxOrSingletonVersion && shared.from} of shared singleton module ${pkgName} does not satisfy the requirement of ${shareInfo.from} which needs ${requiredVersion})`;
|
|
191
|
+
if (shareConfig.strictVersion) error(msg);
|
|
192
|
+
else warn$1(msg);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
shared,
|
|
196
|
+
useTreesShaking
|
|
197
|
+
};
|
|
198
|
+
} else {
|
|
199
|
+
if (requiredVersion === false || requiredVersion === "*") return {
|
|
200
|
+
shared,
|
|
201
|
+
useTreesShaking
|
|
202
|
+
};
|
|
203
|
+
if (satisfy(maxOrSingletonVersion, requiredVersion)) return {
|
|
204
|
+
shared,
|
|
205
|
+
useTreesShaking
|
|
206
|
+
};
|
|
207
|
+
const _usedTreeShaking = shouldUseTreeShaking(treeShaking);
|
|
208
|
+
if (_usedTreeShaking) for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) {
|
|
209
|
+
if (!shouldUseTreeShaking(versionValue.treeShaking, treeShaking?.usedExports)) continue;
|
|
210
|
+
if (satisfy(versionKey, requiredVersion)) return {
|
|
211
|
+
shared: versionValue,
|
|
212
|
+
useTreesShaking: _usedTreeShaking
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) if (satisfy(versionKey, requiredVersion)) return {
|
|
216
|
+
shared: versionValue,
|
|
217
|
+
useTreesShaking: false
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const params = {
|
|
222
|
+
shareScopeMap: localShareScopeMap,
|
|
223
|
+
scope: sc,
|
|
224
|
+
pkgName,
|
|
225
|
+
version: maxOrSingletonVersion,
|
|
226
|
+
GlobalFederation: Global.__FEDERATION__,
|
|
227
|
+
shareInfo,
|
|
228
|
+
resolver: defaultResolver
|
|
229
|
+
};
|
|
230
|
+
return (resolveShare.emit(params) || params).resolver();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function getGlobalShareScope() {
|
|
234
|
+
return Global.__FEDERATION__.__SHARE__;
|
|
235
|
+
}
|
|
236
|
+
function getTargetSharedOptions(options) {
|
|
237
|
+
const { pkgName, extraOptions, shareInfos } = options;
|
|
238
|
+
const defaultResolver = (sharedOptions) => {
|
|
239
|
+
if (!sharedOptions) return;
|
|
240
|
+
const shareVersionMap = {};
|
|
241
|
+
sharedOptions.forEach((shared) => {
|
|
242
|
+
shareVersionMap[shared.version] = shared;
|
|
243
|
+
});
|
|
244
|
+
const callback = function(prev, cur) {
|
|
245
|
+
return !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur);
|
|
246
|
+
};
|
|
247
|
+
return shareVersionMap[findVersion(shareVersionMap, callback)];
|
|
248
|
+
};
|
|
249
|
+
const resolver = extraOptions?.resolver ?? defaultResolver;
|
|
250
|
+
const isPlainObject = (val) => {
|
|
251
|
+
return val !== null && typeof val === "object" && !Array.isArray(val);
|
|
252
|
+
};
|
|
253
|
+
const merge = (...sources) => {
|
|
254
|
+
const out = {};
|
|
255
|
+
for (const src of sources) {
|
|
256
|
+
if (!src) continue;
|
|
257
|
+
for (const [key, value] of Object.entries(src)) {
|
|
258
|
+
const prev = out[key];
|
|
259
|
+
if (isPlainObject(prev) && isPlainObject(value)) out[key] = merge(prev, value);
|
|
260
|
+
else if (value !== void 0) out[key] = value;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
};
|
|
265
|
+
return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);
|
|
266
|
+
}
|
|
267
|
+
const addUseIn = (shared, from) => {
|
|
268
|
+
if (!shared.useIn) shared.useIn = [];
|
|
269
|
+
addUniqueItem(shared.useIn, from);
|
|
270
|
+
};
|
|
271
|
+
function directShare(shared, useTreesShaking) {
|
|
272
|
+
if (useTreesShaking && shared.treeShaking) return shared.treeShaking;
|
|
273
|
+
return shared;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
//#endregion
|
|
277
|
+
export { addUseIn, directShare, formatShareConfigs, getGlobalShareScope, getRegisteredShare, getTargetSharedOptions, shouldUseTreeShaking };
|
|
278
|
+
//# sourceMappingURL=share.js.map
|