@module-federation/runtime-core 2.1.0 → 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/core.cjs +2 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +0 -3
- package/dist/core.js +3 -3
- package/dist/core.js.map +1 -1
- package/dist/global.cjs +2 -2
- package/dist/global.cjs.map +1 -1
- package/dist/global.d.ts +0 -1
- package/dist/global.js +3 -3
- package/dist/global.js.map +1 -1
- package/dist/helpers.d.ts +0 -2
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/module/index.cjs +3 -2
- package/dist/module/index.cjs.map +1 -1
- package/dist/module/index.d.ts +0 -1
- package/dist/module/index.js +4 -3
- package/dist/module/index.js.map +1 -1
- package/dist/plugins/generate-preload-assets.cjs +2 -2
- package/dist/plugins/generate-preload-assets.cjs.map +1 -1
- package/dist/plugins/generate-preload-assets.js +3 -3
- package/dist/plugins/generate-preload-assets.js.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.cjs +14 -8
- package/dist/plugins/snapshot/SnapshotHandler.cjs.map +1 -1
- package/dist/plugins/snapshot/SnapshotHandler.d.ts +0 -2
- package/dist/plugins/snapshot/SnapshotHandler.js +16 -10
- package/dist/plugins/snapshot/SnapshotHandler.js.map +1 -1
- package/dist/plugins/snapshot/index.cjs +3 -2
- package/dist/plugins/snapshot/index.cjs.map +1 -1
- package/dist/plugins/snapshot/index.js +4 -3
- package/dist/plugins/snapshot/index.js.map +1 -1
- package/dist/remote/index.cjs +5 -4
- package/dist/remote/index.cjs.map +1 -1
- package/dist/remote/index.d.ts +0 -2
- package/dist/remote/index.js +8 -7
- package/dist/remote/index.js.map +1 -1
- package/dist/shared/index.cjs +9 -10
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.ts +0 -3
- package/dist/shared/index.js +11 -12
- package/dist/shared/index.js.map +1 -1
- package/dist/types.d.ts +0 -1
- 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.map +1 -1
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/hooks/pluginSystem.d.ts +1 -1
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/index.d.ts +1 -3
- package/dist/utils/index.js +1 -0
- package/dist/utils/load.cjs +15 -13
- package/dist/utils/load.cjs.map +1 -1
- package/dist/utils/load.d.ts +0 -2
- package/dist/utils/load.js +18 -16
- package/dist/utils/load.js.map +1 -1
- package/dist/utils/logger.cjs +9 -3
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.d.ts +5 -2
- package/dist/utils/logger.js +9 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/manifest.d.ts +0 -2
- package/dist/utils/plugin.d.ts +1 -2
- package/dist/utils/preload.d.ts +0 -2
- package/dist/utils/share.cjs +2 -2
- package/dist/utils/share.cjs.map +1 -1
- package/dist/utils/share.d.ts +0 -3
- package/dist/utils/share.js +2 -2
- package/dist/utils/share.js.map +1 -1
- package/dist/utils/tool.cjs +1 -1
- package/dist/utils/tool.cjs.map +1 -1
- package/dist/utils/tool.d.ts +0 -1
- package/dist/utils/tool.js +2 -2
- package/dist/utils/tool.js.map +1 -1
- package/package.json +10 -3
package/dist/utils/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","names":[],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnv,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport { Remote, RemoteEntryExports, RemoteInfo } from '../type';\nimport { assert } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n getShortErrorMsg,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${entry}\")${importCallback}`)([\n resolve,\n reject,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ entry)\n .then(resolve)\n .catch(reject);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n assert(\n entryExports,\n getShortErrorMsg(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n }),\n );\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n loaderHook,\n getEntryUrl,\n}: {\n name: string;\n globalName: string;\n entry: string;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n assert(\n undefined,\n getShortErrorMsg(RUNTIME_008, runtimeDescMap, {\n remoteName: name,\n resourceUrl: entry,\n }),\n );\n throw e;\n });\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n switch (type) {\n case 'esm':\n case 'module':\n return loadEsmEntry({ entry, remoteEntryExports });\n case 'system':\n return loadSystemJsEntry({ entry, remoteEntryExports });\n default:\n return loadEntryScript({\n entry,\n globalName,\n name,\n loaderHook,\n getEntryUrl,\n });\n }\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n throw e;\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n // Use ENV_TARGET if defined, otherwise fallback to isBrowserEnv, must keep this\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnv();\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n })\n : loadEntryNode({ remoteInfo, loaderHook });\n })\n .catch(async (err) => {\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n const isScriptLoadError =\n err instanceof Error && err.message.includes(RUNTIME_008);\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const RemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo: remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (RemoteEntryExports) {\n return RemoteEntryExports;\n }\n }\n throw err;\n });\n }\n\n return globalLoading[uniqueKey];\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"load.js","names":[],"sources":["../../src/utils/load.ts"],"sourcesContent":["import {\n loadScript,\n loadScriptNode,\n composeKeyWithSeparator,\n isBrowserEnvValue,\n} from '@module-federation/sdk';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { ModuleFederation } from '../core';\nimport { globalLoading, getRemoteEntryExports } from '../global';\nimport { Remote, RemoteEntryExports, RemoteInfo } from '../type';\nimport { assert, error } from './logger';\nimport {\n RUNTIME_001,\n RUNTIME_008,\n runtimeDescMap,\n} from '@module-federation/error-codes';\n\n// Declare the ENV_TARGET constant that will be defined by DefinePlugin\ndeclare const ENV_TARGET: 'web' | 'node';\nconst importCallback = '.then(callbacks[0]).catch(callbacks[1])';\n\nasync function loadEsmEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== 'undefined') {\n new Function('callbacks', `import(\"${entry}\")${importCallback}`)([\n resolve,\n reject,\n ]);\n } else {\n import(/* webpackIgnore: true */ /* @vite-ignore */ entry)\n .then(resolve)\n .catch(reject);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load ESM entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nasync function loadSystemJsEntry({\n entry,\n remoteEntryExports,\n}: {\n entry: string;\n remoteEntryExports: RemoteEntryExports | undefined;\n}): Promise<RemoteEntryExports> {\n return new Promise<RemoteEntryExports>((resolve, reject) => {\n try {\n if (!remoteEntryExports) {\n //@ts-ignore\n if (typeof __system_context__ === 'undefined') {\n //@ts-ignore\n System.import(entry).then(resolve).catch(reject);\n } else {\n new Function(\n 'callbacks',\n `System.import(\"${entry}\")${importCallback}`,\n )([resolve, reject]);\n }\n } else {\n resolve(remoteEntryExports);\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n error(`Failed to load SystemJS entry from \"${entry}\". ${msg}`);\n }\n });\n}\n\nfunction handleRemoteEntryLoaded(\n name: string,\n globalName: string,\n entry: string,\n): RemoteEntryExports {\n const { remoteEntryKey, entryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (!entryExports) {\n error(RUNTIME_001, runtimeDescMap, {\n remoteName: name,\n remoteEntryUrl: entry,\n remoteEntryKey,\n });\n }\n\n return entryExports;\n}\n\nasync function loadEntryScript({\n name,\n globalName,\n entry,\n loaderHook,\n getEntryUrl,\n}: {\n name: string;\n globalName: string;\n entry: string;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}): Promise<RemoteEntryExports> {\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n // if getEntryUrl is passed, use the getEntryUrl to get the entry url\n const url = getEntryUrl ? getEntryUrl(entry) : entry;\n return loadScript(url, {\n attrs: {},\n createScriptHook: (url, attrs) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if (res instanceof HTMLScriptElement) {\n return res;\n }\n\n if ('script' in res || 'timeout' in res) {\n return res;\n }\n\n return;\n },\n }).then(\n () => {\n // loadScript resolved: script was fetched, executed without throwing, and\n // did not trigger a ScriptExecutionError listener. Now verify the global was registered.\n return handleRemoteEntryLoaded(name, globalName, entry);\n },\n (loadError: unknown) => {\n // loadScript rejected — one of three causes, all with descriptive messages:\n // ScriptNetworkError — URL unreachable, 404, CORS, etc.\n // ScriptExecutionError — script fetched OK but IIFE threw during execution\n // timeout — script took too long to load\n // Errors thrown inside handleRemoteEntryLoaded above are NOT caught here.\n const originalMsg =\n loadError instanceof Error ? loadError.message : String(loadError);\n error(\n RUNTIME_008,\n runtimeDescMap,\n {\n remoteName: name,\n resourceUrl: url,\n },\n originalMsg,\n );\n },\n );\n}\nasync function loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n}: {\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports;\n loaderHook: ModuleFederation['loaderHook'];\n getEntryUrl?: (url: string) => string;\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n switch (type) {\n case 'esm':\n case 'module':\n return loadEsmEntry({ entry, remoteEntryExports });\n case 'system':\n return loadSystemJsEntry({ entry, remoteEntryExports });\n default:\n return loadEntryScript({\n entry,\n globalName,\n name,\n loaderHook,\n getEntryUrl,\n });\n }\n}\n\nasync function loadEntryNode({\n remoteInfo,\n loaderHook,\n}: {\n remoteInfo: RemoteInfo;\n loaderHook: ModuleFederation['loaderHook'];\n}) {\n const { entry, entryGlobalName: globalName, name, type } = remoteInfo;\n const { entryExports: remoteEntryExports } = getRemoteEntryExports(\n name,\n globalName,\n );\n\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n return loadScriptNode(entry, {\n attrs: { name, globalName, type },\n loaderHook: {\n createScriptHook: (url: string, attrs: Record<string, any> = {}) => {\n const res = loaderHook.lifecycle.createScript.emit({ url, attrs });\n\n if (!res) return;\n\n if ('url' in res) {\n return res;\n }\n\n return;\n },\n },\n })\n .then(() => {\n return handleRemoteEntryLoaded(name, globalName, entry);\n })\n .catch((e) => {\n const msg = e instanceof Error ? e.message : String(e);\n error(\n `Failed to load Node.js entry for remote \"${name}\" from \"${entry}\". ${msg}`,\n );\n });\n}\n\nexport function getRemoteEntryUniqueKey(remoteInfo: RemoteInfo): string {\n const { entry, name } = remoteInfo;\n return composeKeyWithSeparator(name, entry);\n}\n\nexport async function getRemoteEntry(params: {\n origin: ModuleFederation;\n remoteInfo: RemoteInfo;\n remoteEntryExports?: RemoteEntryExports | undefined;\n getEntryUrl?: (url: string) => string;\n _inErrorHandling?: boolean; // Add flag to prevent recursion\n}): Promise<RemoteEntryExports | false | void> {\n const {\n origin,\n remoteEntryExports,\n remoteInfo,\n getEntryUrl,\n _inErrorHandling = false,\n } = params;\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n if (remoteEntryExports) {\n return remoteEntryExports;\n }\n\n if (!globalLoading[uniqueKey]) {\n const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;\n const loaderHook = origin.loaderHook;\n\n globalLoading[uniqueKey] = loadEntryHook\n .emit({\n loaderHook,\n remoteInfo,\n remoteEntryExports,\n })\n .then((res) => {\n if (res) {\n return res;\n }\n // Use ENV_TARGET if defined, otherwise fallback to isBrowserEnvValue\n const isWebEnvironment =\n typeof ENV_TARGET !== 'undefined'\n ? ENV_TARGET === 'web'\n : isBrowserEnvValue;\n\n return isWebEnvironment\n ? loadEntryDom({\n remoteInfo,\n remoteEntryExports,\n loaderHook,\n getEntryUrl,\n })\n : loadEntryNode({ remoteInfo, loaderHook });\n })\n .catch(async (err) => {\n const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);\n // ScriptExecutionError means the script downloaded fine but its IIFE\n // threw at runtime — retrying would reproduce the same error, so exclude it.\n const isScriptExecutionError =\n err instanceof Error && err.message.includes('ScriptExecutionError');\n const isScriptLoadError =\n err instanceof Error &&\n err.message.includes(RUNTIME_008) &&\n !isScriptExecutionError;\n\n if (isScriptLoadError && !_inErrorHandling) {\n const wrappedGetRemoteEntry = (\n params: Parameters<typeof getRemoteEntry>[0],\n ) => {\n return getRemoteEntry({ ...params, _inErrorHandling: true });\n };\n\n const RemoteEntryExports =\n await origin.loaderHook.lifecycle.loadEntryError.emit({\n getRemoteEntry: wrappedGetRemoteEntry,\n origin,\n remoteInfo: remoteInfo,\n remoteEntryExports,\n globalLoading,\n uniqueKey,\n });\n\n if (RemoteEntryExports) {\n return RemoteEntryExports;\n }\n }\n throw err;\n });\n }\n\n return globalLoading[uniqueKey];\n}\n\nexport function getRemoteInfo(remote: Remote): RemoteInfo {\n return {\n ...remote,\n entry: 'entry' in remote ? remote.entry : '',\n type: remote.type || DEFAULT_REMOTE_TYPE,\n entryGlobalName: remote.entryGlobalName || remote.name,\n shareScope: remote.shareScope || DEFAULT_SCOPE,\n };\n}\n"],"mappings":"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"}
|
package/dist/utils/logger.cjs
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
let _module_federation_sdk = require("@module-federation/sdk");
|
|
2
|
+
let _module_federation_error_codes_browser = require("@module-federation/error-codes/browser");
|
|
2
3
|
|
|
3
4
|
//#region src/utils/logger.ts
|
|
4
5
|
const LOG_CATEGORY = "[ Federation Runtime ]";
|
|
5
6
|
const logger = (0, _module_federation_sdk.createLogger)(LOG_CATEGORY);
|
|
6
|
-
function assert(condition,
|
|
7
|
-
if (!condition) error(
|
|
7
|
+
function assert(condition, msgOrCode, descMap, args, context) {
|
|
8
|
+
if (!condition) if (descMap !== void 0) error(msgOrCode, descMap, args, void 0, context);
|
|
9
|
+
else error(msgOrCode);
|
|
8
10
|
}
|
|
9
|
-
function error(
|
|
11
|
+
function error(msgOrCode, descMap, args, originalErrorMsg, context) {
|
|
12
|
+
if (descMap !== void 0) return (0, _module_federation_error_codes_browser.logAndReport)(msgOrCode, descMap, args ?? {}, (msg) => {
|
|
13
|
+
throw new Error(`${LOG_CATEGORY}: ${msg}`);
|
|
14
|
+
}, originalErrorMsg, context);
|
|
15
|
+
const msg = msgOrCode;
|
|
10
16
|
if (msg instanceof Error) {
|
|
11
17
|
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
|
|
12
18
|
throw msg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.cjs","names":[],"sources":["../../src/utils/logger.ts"],"sourcesContent":["import { createLogger } from '@module-federation/sdk';\n\nconst LOG_CATEGORY = '[ Federation Runtime ]';\n// FIXME: pre-bundle ?\nconst logger = createLogger(LOG_CATEGORY);\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function assert(condition: any, msg: string): asserts condition {\n if (!condition) {\n error(
|
|
1
|
+
{"version":3,"file":"logger.cjs","names":[],"sources":["../../src/utils/logger.ts"],"sourcesContent":["import { createLogger } from '@module-federation/sdk';\nimport type { MFContext } from '@module-federation/error-codes';\nimport { logAndReport } from '@module-federation/error-codes/browser';\n\nconst LOG_CATEGORY = '[ Federation Runtime ]';\n// FIXME: pre-bundle ?\nconst logger = createLogger(LOG_CATEGORY);\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function assert(condition: any, msg: string): asserts condition;\nexport function assert(\n condition: any,\n code: string,\n descMap: Record<string, string>,\n args?: Record<string, unknown>,\n context?: Partial<MFContext>,\n): asserts condition;\nexport function assert(\n condition: any,\n msgOrCode: string,\n descMap?: Record<string, string>,\n args?: Record<string, unknown>,\n context?: Partial<MFContext>,\n): asserts condition {\n if (!condition) {\n if (descMap !== undefined) {\n error(msgOrCode, descMap, args, undefined, context);\n } else {\n error(msgOrCode);\n }\n }\n}\n\nexport function error(msg: string | Error | unknown): never;\nexport function error(\n code: string,\n descMap: Record<string, string>,\n args?: Record<string, unknown>,\n originalErrorMsg?: string,\n context?: Partial<MFContext>,\n): never;\nexport function error(\n msgOrCode: string | Error | unknown,\n descMap?: Record<string, string>,\n args?: Record<string, unknown>,\n originalErrorMsg?: string,\n context?: Partial<MFContext>,\n): never {\n if (descMap !== undefined) {\n return logAndReport(\n msgOrCode as string,\n descMap,\n args ?? {},\n (msg) => {\n throw new Error(`${LOG_CATEGORY}: ${msg}`);\n },\n originalErrorMsg,\n context,\n );\n }\n const msg = msgOrCode;\n if (msg instanceof Error) {\n if (!msg.message.startsWith(LOG_CATEGORY)) {\n msg.message = `${LOG_CATEGORY}: ${msg.message}`;\n }\n throw msg;\n }\n throw new Error(`${LOG_CATEGORY}: ${msg}`);\n}\n\nexport function warn(msg: Parameters<typeof console.warn>[0]): void {\n if (msg instanceof Error) {\n // Check if the message already starts with the log category to avoid duplication\n if (!msg.message.startsWith(LOG_CATEGORY)) {\n msg.message = `${LOG_CATEGORY}: ${msg.message}`;\n }\n logger.warn(msg);\n } else {\n logger.warn(msg);\n }\n}\n\nexport { logger };\n"],"mappings":";;;;AAIA,MAAM,eAAe;AAErB,MAAM,kDAAsB,aAAa;AAWzC,SAAgB,OACd,WACA,WACA,SACA,MACA,SACmB;AACnB,KAAI,CAAC,UACH,KAAI,YAAY,OACd,OAAM,WAAW,SAAS,MAAM,QAAW,QAAQ;KAEnD,OAAM,UAAU;;AAatB,SAAgB,MACd,WACA,SACA,MACA,kBACA,SACO;AACP,KAAI,YAAY,OACd,iEACE,WACA,SACA,QAAQ,EAAE,GACT,QAAQ;AACP,QAAM,IAAI,MAAM,GAAG,aAAa,IAAI,MAAM;IAE5C,kBACA,QACD;CAEH,MAAM,MAAM;AACZ,KAAI,eAAe,OAAO;AACxB,MAAI,CAAC,IAAI,QAAQ,WAAW,aAAa,CACvC,KAAI,UAAU,GAAG,aAAa,IAAI,IAAI;AAExC,QAAM;;AAER,OAAM,IAAI,MAAM,GAAG,aAAa,IAAI,MAAM;;AAG5C,SAAgB,KAAK,KAA+C;AAClE,KAAI,eAAe,OAAO;AAExB,MAAI,CAAC,IAAI,QAAQ,WAAW,aAAa,CACvC,KAAI,UAAU,GAAG,aAAa,IAAI,IAAI;AAExC,SAAO,KAAK,IAAI;OAEhB,QAAO,KAAK,IAAI"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import "@module-federation/
|
|
1
|
+
import { MFContext } from "@module-federation/error-codes";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/logger.d.ts
|
|
4
4
|
declare function assert(condition: any, msg: string): asserts condition;
|
|
5
|
+
declare function assert(condition: any, code: string, descMap: Record<string, string>, args?: Record<string, unknown>, context?: Partial<MFContext>): asserts condition;
|
|
6
|
+
declare function error(msg: string | Error | unknown): never;
|
|
7
|
+
declare function error(code: string, descMap: Record<string, string>, args?: Record<string, unknown>, originalErrorMsg?: string, context?: Partial<MFContext>): never;
|
|
5
8
|
//#endregion
|
|
6
|
-
export { assert };
|
|
9
|
+
export { assert, error };
|
|
7
10
|
//# sourceMappingURL=logger.d.ts.map
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { createLogger } from "@module-federation/sdk";
|
|
2
|
+
import { logAndReport } from "@module-federation/error-codes/browser";
|
|
2
3
|
|
|
3
4
|
//#region src/utils/logger.ts
|
|
4
5
|
const LOG_CATEGORY = "[ Federation Runtime ]";
|
|
5
6
|
const logger = createLogger(LOG_CATEGORY);
|
|
6
|
-
function assert(condition,
|
|
7
|
-
if (!condition) error(
|
|
7
|
+
function assert(condition, msgOrCode, descMap, args, context) {
|
|
8
|
+
if (!condition) if (descMap !== void 0) error(msgOrCode, descMap, args, void 0, context);
|
|
9
|
+
else error(msgOrCode);
|
|
8
10
|
}
|
|
9
|
-
function error(
|
|
11
|
+
function error(msgOrCode, descMap, args, originalErrorMsg, context) {
|
|
12
|
+
if (descMap !== void 0) return logAndReport(msgOrCode, descMap, args ?? {}, (msg) => {
|
|
13
|
+
throw new Error(`${LOG_CATEGORY}: ${msg}`);
|
|
14
|
+
}, originalErrorMsg, context);
|
|
15
|
+
const msg = msgOrCode;
|
|
10
16
|
if (msg instanceof Error) {
|
|
11
17
|
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
|
|
12
18
|
throw msg;
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","names":["warn"],"sources":["../../src/utils/logger.ts"],"sourcesContent":["import { createLogger } from '@module-federation/sdk';\n\nconst LOG_CATEGORY = '[ Federation Runtime ]';\n// FIXME: pre-bundle ?\nconst logger = createLogger(LOG_CATEGORY);\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function assert(condition: any, msg: string): asserts condition {\n if (!condition) {\n error(
|
|
1
|
+
{"version":3,"file":"logger.js","names":["warn"],"sources":["../../src/utils/logger.ts"],"sourcesContent":["import { createLogger } from '@module-federation/sdk';\nimport type { MFContext } from '@module-federation/error-codes';\nimport { logAndReport } from '@module-federation/error-codes/browser';\n\nconst LOG_CATEGORY = '[ Federation Runtime ]';\n// FIXME: pre-bundle ?\nconst logger = createLogger(LOG_CATEGORY);\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function assert(condition: any, msg: string): asserts condition;\nexport function assert(\n condition: any,\n code: string,\n descMap: Record<string, string>,\n args?: Record<string, unknown>,\n context?: Partial<MFContext>,\n): asserts condition;\nexport function assert(\n condition: any,\n msgOrCode: string,\n descMap?: Record<string, string>,\n args?: Record<string, unknown>,\n context?: Partial<MFContext>,\n): asserts condition {\n if (!condition) {\n if (descMap !== undefined) {\n error(msgOrCode, descMap, args, undefined, context);\n } else {\n error(msgOrCode);\n }\n }\n}\n\nexport function error(msg: string | Error | unknown): never;\nexport function error(\n code: string,\n descMap: Record<string, string>,\n args?: Record<string, unknown>,\n originalErrorMsg?: string,\n context?: Partial<MFContext>,\n): never;\nexport function error(\n msgOrCode: string | Error | unknown,\n descMap?: Record<string, string>,\n args?: Record<string, unknown>,\n originalErrorMsg?: string,\n context?: Partial<MFContext>,\n): never {\n if (descMap !== undefined) {\n return logAndReport(\n msgOrCode as string,\n descMap,\n args ?? {},\n (msg) => {\n throw new Error(`${LOG_CATEGORY}: ${msg}`);\n },\n originalErrorMsg,\n context,\n );\n }\n const msg = msgOrCode;\n if (msg instanceof Error) {\n if (!msg.message.startsWith(LOG_CATEGORY)) {\n msg.message = `${LOG_CATEGORY}: ${msg.message}`;\n }\n throw msg;\n }\n throw new Error(`${LOG_CATEGORY}: ${msg}`);\n}\n\nexport function warn(msg: Parameters<typeof console.warn>[0]): void {\n if (msg instanceof Error) {\n // Check if the message already starts with the log category to avoid duplication\n if (!msg.message.startsWith(LOG_CATEGORY)) {\n msg.message = `${LOG_CATEGORY}: ${msg.message}`;\n }\n logger.warn(msg);\n } else {\n logger.warn(msg);\n }\n}\n\nexport { logger };\n"],"mappings":";;;;AAIA,MAAM,eAAe;AAErB,MAAM,SAAS,aAAa,aAAa;AAWzC,SAAgB,OACd,WACA,WACA,SACA,MACA,SACmB;AACnB,KAAI,CAAC,UACH,KAAI,YAAY,OACd,OAAM,WAAW,SAAS,MAAM,QAAW,QAAQ;KAEnD,OAAM,UAAU;;AAatB,SAAgB,MACd,WACA,SACA,MACA,kBACA,SACO;AACP,KAAI,YAAY,OACd,QAAO,aACL,WACA,SACA,QAAQ,EAAE,GACT,QAAQ;AACP,QAAM,IAAI,MAAM,GAAG,aAAa,IAAI,MAAM;IAE5C,kBACA,QACD;CAEH,MAAM,MAAM;AACZ,KAAI,eAAe,OAAO;AACxB,MAAI,CAAC,IAAI,QAAQ,WAAW,aAAa,CACvC,KAAI,UAAU,GAAG,aAAa,IAAI,IAAI;AAExC,QAAM;;AAER,OAAM,IAAI,MAAM,GAAG,aAAa,IAAI,MAAM;;AAG5C,SAAgBA,OAAK,KAA+C;AAClE,KAAI,eAAe,OAAO;AAExB,MAAI,CAAC,IAAI,QAAQ,WAAW,aAAa,CACvC,KAAI,UAAU,GAAG,aAAa,IAAI,IAAI;AAExC,SAAO,KAAK,IAAI;OAEhB,QAAO,KAAK,IAAI"}
|
package/dist/utils/manifest.d.ts
CHANGED
package/dist/utils/plugin.d.ts
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import "../type/index.js";
|
|
1
|
+
export { };
|
package/dist/utils/preload.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { ModuleFederation } from "../core.js";
|
|
2
2
|
import { RemoteInfo } from "../type/config.js";
|
|
3
3
|
import { PreloadAssets } from "../type/preload.js";
|
|
4
|
-
import "../type/index.js";
|
|
5
|
-
|
|
6
4
|
//#region src/utils/preload.d.ts
|
|
7
5
|
declare function preloadAssets(remoteInfo: RemoteInfo, host: ModuleFederation, assets: PreloadAssets, useLinkPreload?: boolean): void;
|
|
8
6
|
//#endregion
|
package/dist/utils/share.cjs
CHANGED
|
@@ -11,9 +11,9 @@ function formatShare(shareArgs, from, name, shareStrategy) {
|
|
|
11
11
|
if ("get" in shareArgs) get = shareArgs.get;
|
|
12
12
|
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
|
|
13
13
|
else get = () => Promise.resolve(() => {
|
|
14
|
-
|
|
14
|
+
require_logger.error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
|
|
15
15
|
});
|
|
16
|
-
if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode)
|
|
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
17
|
return {
|
|
18
18
|
deps: [],
|
|
19
19
|
useIn: [],
|
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 throw new Error(`Can not get shared '${name}'!`);\n });\n }\n\n if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) {\n throw new Error(\n 'Can not set \"eager:true\" and \"treeShaking\" at the same time!',\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} 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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"}
|
package/dist/utils/share.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { SyncWaterfallHook } from "./hooks/syncWaterfallHook.js";
|
|
2
|
-
import "./hooks/index.js";
|
|
3
2
|
import { Federation } from "../global.js";
|
|
4
3
|
import { GlobalShareScopeMap, ShareScopeMap, Shared } from "../type/config.js";
|
|
5
|
-
import "../type/index.js";
|
|
6
|
-
|
|
7
4
|
//#region src/utils/share.d.ts
|
|
8
5
|
declare function getRegisteredShare(localShareScopeMap: ShareScopeMap, pkgName: string, shareInfo: Shared, resolveShare: SyncWaterfallHook<{
|
|
9
6
|
shareScopeMap: ShareScopeMap;
|
package/dist/utils/share.js
CHANGED
|
@@ -11,9 +11,9 @@ function formatShare(shareArgs, from, name, shareStrategy) {
|
|
|
11
11
|
if ("get" in shareArgs) get = shareArgs.get;
|
|
12
12
|
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
|
|
13
13
|
else get = () => Promise.resolve(() => {
|
|
14
|
-
|
|
14
|
+
error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
|
|
15
15
|
});
|
|
16
|
-
if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode)
|
|
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
17
|
return {
|
|
18
18
|
deps: [],
|
|
19
19
|
useIn: [],
|
package/dist/utils/share.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.js","names":[],"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 throw new Error(`Can not get shared '${name}'!`);\n });\n }\n\n if (shareArgs.shareConfig?.eager && shareArgs.treeShaking?.mode) {\n throw new Error(\n 'Can not set \"eager:true\" and \"treeShaking\" at the same time!',\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.js","names":[],"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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"}
|
package/dist/utils/tool.cjs
CHANGED
|
@@ -45,7 +45,7 @@ function getRemoteEntryInfoFromSnapshot(snapshot) {
|
|
|
45
45
|
type: "global",
|
|
46
46
|
globalName: ""
|
|
47
47
|
};
|
|
48
|
-
if (
|
|
48
|
+
if (_module_federation_sdk.isBrowserEnvValue || (0, _module_federation_sdk.isReactNativeEnv)() || !("ssrRemoteEntry" in snapshot)) return "remoteEntry" in snapshot ? {
|
|
49
49
|
url: snapshot.remoteEntry,
|
|
50
50
|
type: snapshot.remoteEntryType,
|
|
51
51
|
globalName: snapshot.globalName
|
package/dist/utils/tool.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.cjs","names":["warn"],"sources":["../../src/utils/tool.ts"],"sourcesContent":["import {\n RemoteWithEntry,\n ModuleInfo,\n RemoteEntryType,\n
|
|
1
|
+
{"version":3,"file":"tool.cjs","names":["warn","isBrowserEnvValue"],"sources":["../../src/utils/tool.ts"],"sourcesContent":["import {\n RemoteWithEntry,\n ModuleInfo,\n RemoteEntryType,\n isBrowserEnvValue,\n isReactNativeEnv,\n} from '@module-federation/sdk';\nimport { Remote, RemoteInfoOptionalVersion } from '../type';\nimport { warn } from './logger';\n\nexport function addUniqueItem(arr: Array<string>, item: string): Array<string> {\n if (arr.findIndex((name) => name === item) === -1) {\n arr.push(item);\n }\n return arr;\n}\n\nexport function getFMId(\n remoteInfo: RemoteInfoOptionalVersion | RemoteWithEntry,\n): string {\n if ('version' in remoteInfo && remoteInfo.version) {\n return `${remoteInfo.name}:${remoteInfo.version}`;\n } else if ('entry' in remoteInfo && remoteInfo.entry) {\n return `${remoteInfo.name}:${remoteInfo.entry}`;\n } else {\n return `${remoteInfo.name}`;\n }\n}\n\nexport function isRemoteInfoWithEntry(\n remote: Remote,\n): remote is RemoteWithEntry {\n return typeof (remote as RemoteWithEntry).entry !== 'undefined';\n}\n\nexport function isPureRemoteEntry(remote: RemoteWithEntry): boolean {\n return !remote.entry.includes('.json');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function safeWrapper<T extends (...args: Array<any>) => any>(\n callback: T,\n disableWarn?: boolean,\n): Promise<ReturnType<T> | undefined> {\n try {\n const res = await callback();\n return res;\n } catch (e) {\n !disableWarn && warn(e);\n return;\n }\n}\n\nexport function isObject(val: any): boolean {\n return val && typeof val === 'object';\n}\n\nexport const objectToString = Object.prototype.toString;\n\nexport function isPlainObject(val: any): val is object {\n return objectToString.call(val) === '[object Object]';\n}\n\nexport function isStaticResourcesEqual(url1: string, url2: string): boolean {\n const REG_EXP = /^(https?:)?\\/\\//i;\n // Transform url1 and url2 into relative paths\n const relativeUrl1 = url1.replace(REG_EXP, '').replace(/\\/$/, '');\n const relativeUrl2 = url2.replace(REG_EXP, '').replace(/\\/$/, '');\n // Check if the relative paths are identical\n return relativeUrl1 === relativeUrl2;\n}\n\nexport function arrayOptions<T>(options: T | Array<T>): Array<T> {\n return Array.isArray(options) ? options : [options];\n}\n\nexport function getRemoteEntryInfoFromSnapshot(snapshot: ModuleInfo): {\n url: string;\n type: RemoteEntryType;\n globalName: string;\n} {\n const defaultRemoteEntryInfo: {\n url: string;\n type: RemoteEntryType;\n globalName: string;\n } = {\n url: '',\n type: 'global',\n globalName: '',\n };\n if (\n isBrowserEnvValue ||\n isReactNativeEnv() ||\n !('ssrRemoteEntry' in snapshot)\n ) {\n return 'remoteEntry' in snapshot\n ? {\n url: snapshot.remoteEntry,\n type: snapshot.remoteEntryType,\n globalName: snapshot.globalName,\n }\n : defaultRemoteEntryInfo;\n }\n if ('ssrRemoteEntry' in snapshot) {\n return {\n url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,\n type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,\n globalName: snapshot.globalName,\n };\n }\n return defaultRemoteEntryInfo;\n}\n\nexport const processModuleAlias = (name: string, subPath: string) => {\n // @host/ ./button -> @host/button\n let moduleName;\n if (name.endsWith('/')) {\n moduleName = name.slice(0, -1);\n } else {\n moduleName = name;\n }\n\n if (subPath.startsWith('.')) {\n subPath = subPath.slice(1);\n }\n moduleName = moduleName + subPath;\n return moduleName;\n};\n"],"mappings":";;;;AAUA,SAAgB,cAAc,KAAoB,MAA6B;AAC7E,KAAI,IAAI,WAAW,SAAS,SAAS,KAAK,KAAK,GAC7C,KAAI,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,QACd,YACQ;AACR,KAAI,aAAa,cAAc,WAAW,QACxC,QAAO,GAAG,WAAW,KAAK,GAAG,WAAW;UAC/B,WAAW,cAAc,WAAW,MAC7C,QAAO,GAAG,WAAW,KAAK,GAAG,WAAW;KAExC,QAAO,GAAG,WAAW;;AAIzB,SAAgB,sBACd,QAC2B;AAC3B,QAAO,OAAQ,OAA2B,UAAU;;AAGtD,SAAgB,kBAAkB,QAAkC;AAClE,QAAO,CAAC,OAAO,MAAM,SAAS,QAAQ;;AAIxC,eAAsB,YACpB,UACA,aACoC;AACpC,KAAI;AAEF,SADY,MAAM,UAAU;UAErB,GAAG;AACV,GAAC,eAAeA,oBAAK,EAAE;AACvB;;;AAIJ,SAAgB,SAAS,KAAmB;AAC1C,QAAO,OAAO,OAAO,QAAQ;;AAG/B,MAAa,iBAAiB,OAAO,UAAU;AAE/C,SAAgB,cAAc,KAAyB;AACrD,QAAO,eAAe,KAAK,IAAI,KAAK;;AAGtC,SAAgB,uBAAuB,MAAc,MAAuB;CAC1E,MAAM,UAAU;AAKhB,QAHqB,KAAK,QAAQ,SAAS,GAAG,CAAC,QAAQ,OAAO,GAAG,KAC5C,KAAK,QAAQ,SAAS,GAAG,CAAC,QAAQ,OAAO,GAAG;;AAKnE,SAAgB,aAAgB,SAAiC;AAC/D,QAAO,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;;AAGrD,SAAgB,+BAA+B,UAI7C;CACA,MAAM,yBAIF;EACF,KAAK;EACL,MAAM;EACN,YAAY;EACb;AACD,KACEC,0FACkB,IAClB,EAAE,oBAAoB,UAEtB,QAAO,iBAAiB,WACpB;EACE,KAAK,SAAS;EACd,MAAM,SAAS;EACf,YAAY,SAAS;EACtB,GACD;AAEN,KAAI,oBAAoB,SACtB,QAAO;EACL,KAAK,SAAS,kBAAkB,uBAAuB;EACvD,MAAM,SAAS,sBAAsB,uBAAuB;EAC5D,YAAY,SAAS;EACtB;AAEH,QAAO;;AAGT,MAAa,sBAAsB,MAAc,YAAoB;CAEnE,IAAI;AACJ,KAAI,KAAK,SAAS,IAAI,CACpB,cAAa,KAAK,MAAM,GAAG,GAAG;KAE9B,cAAa;AAGf,KAAI,QAAQ,WAAW,IAAI,CACzB,WAAU,QAAQ,MAAM,EAAE;AAE5B,cAAa,aAAa;AAC1B,QAAO"}
|
package/dist/utils/tool.d.ts
CHANGED
package/dist/utils/tool.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { warn as warn$1 } from "./logger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isBrowserEnvValue, isReactNativeEnv } from "@module-federation/sdk";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/tool.ts
|
|
5
5
|
function addUniqueItem(arr, item) {
|
|
@@ -45,7 +45,7 @@ function getRemoteEntryInfoFromSnapshot(snapshot) {
|
|
|
45
45
|
type: "global",
|
|
46
46
|
globalName: ""
|
|
47
47
|
};
|
|
48
|
-
if (
|
|
48
|
+
if (isBrowserEnvValue || isReactNativeEnv() || !("ssrRemoteEntry" in snapshot)) return "remoteEntry" in snapshot ? {
|
|
49
49
|
url: snapshot.remoteEntry,
|
|
50
50
|
type: snapshot.remoteEntryType,
|
|
51
51
|
globalName: snapshot.globalName
|
package/dist/utils/tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","names":["warn"],"sources":["../../src/utils/tool.ts"],"sourcesContent":["import {\n RemoteWithEntry,\n ModuleInfo,\n RemoteEntryType,\n
|
|
1
|
+
{"version":3,"file":"tool.js","names":["warn"],"sources":["../../src/utils/tool.ts"],"sourcesContent":["import {\n RemoteWithEntry,\n ModuleInfo,\n RemoteEntryType,\n isBrowserEnvValue,\n isReactNativeEnv,\n} from '@module-federation/sdk';\nimport { Remote, RemoteInfoOptionalVersion } from '../type';\nimport { warn } from './logger';\n\nexport function addUniqueItem(arr: Array<string>, item: string): Array<string> {\n if (arr.findIndex((name) => name === item) === -1) {\n arr.push(item);\n }\n return arr;\n}\n\nexport function getFMId(\n remoteInfo: RemoteInfoOptionalVersion | RemoteWithEntry,\n): string {\n if ('version' in remoteInfo && remoteInfo.version) {\n return `${remoteInfo.name}:${remoteInfo.version}`;\n } else if ('entry' in remoteInfo && remoteInfo.entry) {\n return `${remoteInfo.name}:${remoteInfo.entry}`;\n } else {\n return `${remoteInfo.name}`;\n }\n}\n\nexport function isRemoteInfoWithEntry(\n remote: Remote,\n): remote is RemoteWithEntry {\n return typeof (remote as RemoteWithEntry).entry !== 'undefined';\n}\n\nexport function isPureRemoteEntry(remote: RemoteWithEntry): boolean {\n return !remote.entry.includes('.json');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function safeWrapper<T extends (...args: Array<any>) => any>(\n callback: T,\n disableWarn?: boolean,\n): Promise<ReturnType<T> | undefined> {\n try {\n const res = await callback();\n return res;\n } catch (e) {\n !disableWarn && warn(e);\n return;\n }\n}\n\nexport function isObject(val: any): boolean {\n return val && typeof val === 'object';\n}\n\nexport const objectToString = Object.prototype.toString;\n\nexport function isPlainObject(val: any): val is object {\n return objectToString.call(val) === '[object Object]';\n}\n\nexport function isStaticResourcesEqual(url1: string, url2: string): boolean {\n const REG_EXP = /^(https?:)?\\/\\//i;\n // Transform url1 and url2 into relative paths\n const relativeUrl1 = url1.replace(REG_EXP, '').replace(/\\/$/, '');\n const relativeUrl2 = url2.replace(REG_EXP, '').replace(/\\/$/, '');\n // Check if the relative paths are identical\n return relativeUrl1 === relativeUrl2;\n}\n\nexport function arrayOptions<T>(options: T | Array<T>): Array<T> {\n return Array.isArray(options) ? options : [options];\n}\n\nexport function getRemoteEntryInfoFromSnapshot(snapshot: ModuleInfo): {\n url: string;\n type: RemoteEntryType;\n globalName: string;\n} {\n const defaultRemoteEntryInfo: {\n url: string;\n type: RemoteEntryType;\n globalName: string;\n } = {\n url: '',\n type: 'global',\n globalName: '',\n };\n if (\n isBrowserEnvValue ||\n isReactNativeEnv() ||\n !('ssrRemoteEntry' in snapshot)\n ) {\n return 'remoteEntry' in snapshot\n ? {\n url: snapshot.remoteEntry,\n type: snapshot.remoteEntryType,\n globalName: snapshot.globalName,\n }\n : defaultRemoteEntryInfo;\n }\n if ('ssrRemoteEntry' in snapshot) {\n return {\n url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,\n type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,\n globalName: snapshot.globalName,\n };\n }\n return defaultRemoteEntryInfo;\n}\n\nexport const processModuleAlias = (name: string, subPath: string) => {\n // @host/ ./button -> @host/button\n let moduleName;\n if (name.endsWith('/')) {\n moduleName = name.slice(0, -1);\n } else {\n moduleName = name;\n }\n\n if (subPath.startsWith('.')) {\n subPath = subPath.slice(1);\n }\n moduleName = moduleName + subPath;\n return moduleName;\n};\n"],"mappings":";;;;AAUA,SAAgB,cAAc,KAAoB,MAA6B;AAC7E,KAAI,IAAI,WAAW,SAAS,SAAS,KAAK,KAAK,GAC7C,KAAI,KAAK,KAAK;AAEhB,QAAO;;AAGT,SAAgB,QACd,YACQ;AACR,KAAI,aAAa,cAAc,WAAW,QACxC,QAAO,GAAG,WAAW,KAAK,GAAG,WAAW;UAC/B,WAAW,cAAc,WAAW,MAC7C,QAAO,GAAG,WAAW,KAAK,GAAG,WAAW;KAExC,QAAO,GAAG,WAAW;;AAIzB,SAAgB,sBACd,QAC2B;AAC3B,QAAO,OAAQ,OAA2B,UAAU;;AAGtD,SAAgB,kBAAkB,QAAkC;AAClE,QAAO,CAAC,OAAO,MAAM,SAAS,QAAQ;;AAIxC,eAAsB,YACpB,UACA,aACoC;AACpC,KAAI;AAEF,SADY,MAAM,UAAU;UAErB,GAAG;AACV,GAAC,eAAeA,OAAK,EAAE;AACvB;;;AAIJ,SAAgB,SAAS,KAAmB;AAC1C,QAAO,OAAO,OAAO,QAAQ;;AAG/B,MAAa,iBAAiB,OAAO,UAAU;AAE/C,SAAgB,cAAc,KAAyB;AACrD,QAAO,eAAe,KAAK,IAAI,KAAK;;AAGtC,SAAgB,uBAAuB,MAAc,MAAuB;CAC1E,MAAM,UAAU;AAKhB,QAHqB,KAAK,QAAQ,SAAS,GAAG,CAAC,QAAQ,OAAO,GAAG,KAC5C,KAAK,QAAQ,SAAS,GAAG,CAAC,QAAQ,OAAO,GAAG;;AAKnE,SAAgB,aAAgB,SAAiC;AAC/D,QAAO,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;;AAGrD,SAAgB,+BAA+B,UAI7C;CACA,MAAM,yBAIF;EACF,KAAK;EACL,MAAM;EACN,YAAY;EACb;AACD,KACE,qBACA,kBAAkB,IAClB,EAAE,oBAAoB,UAEtB,QAAO,iBAAiB,WACpB;EACE,KAAK,SAAS;EACd,MAAM,SAAS;EACf,YAAY,SAAS;EACtB,GACD;AAEN,KAAI,oBAAoB,SACtB,QAAO;EACL,KAAK,SAAS,kBAAkB,uBAAuB;EACvD,MAAM,SAAS,sBAAsB,uBAAuB;EAC5D,YAAY,SAAS;EACtB;AAEH,QAAO;;AAGT,MAAa,sBAAsB,MAAc,YAAoB;CAEnE,IAAI;AACJ,KAAI,KAAK,SAAS,IAAI,CACpB,cAAa,KAAK,MAAM,GAAG,GAAG;KAE9B,cAAa;AAGf,KAAI,QAAQ,WAAW,IAAI,CACzB,WAAU,QAAQ,MAAM,EAAE;AAE5B,cAAa,aAAa;AAC1B,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/runtime-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"author": "zhouxiao <codingzx@gmail.com>",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -52,7 +52,14 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@module-federation/
|
|
56
|
-
"@module-federation/
|
|
55
|
+
"@module-federation/sdk": "2.2.0",
|
|
56
|
+
"@module-federation/error-codes": "2.2.0"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsdown --config tsdown.config.ts",
|
|
60
|
+
"lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint --ignore-pattern node_modules \"**/*.ts\" \"package.json\"",
|
|
61
|
+
"build-debug": "RUNTIME_CORE_TSDOWN_MODE=debug tsdown --config tsdown.config.ts",
|
|
62
|
+
"pre-release": "pnpm run test && pnpm run build",
|
|
63
|
+
"test": "vitest run -u -c vitest.config.ts"
|
|
57
64
|
}
|
|
58
65
|
}
|