Project Init

This commit is contained in:
Muluhabt
2026-05-29 15:23:46 +03:00
commit 2fbc557aac
67387 changed files with 6063341 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
//#region src/utils/context.ts
function remoteToEntry(r) {
return {
name: r.name,
alias: r.alias,
entry: "entry" in r ? r.entry : void 0,
version: "version" in r ? r.version : void 0,
type: r.type,
entryGlobalName: r.entryGlobalName,
shareScope: r.shareScope
};
}
/**
* Build a partial MFContext from runtime Options.
* Used to enrich diagnostic entries with host context at error sites.
*/
function optionsToMFContext(options) {
const shared = {};
for (const [pkgName, versions] of Object.entries(options.shared)) {
const first = versions[0];
if (first) shared[pkgName] = {
version: first.version,
singleton: first.shareConfig?.singleton,
requiredVersion: first.shareConfig?.requiredVersion === false ? false : first.shareConfig?.requiredVersion,
eager: first.eager,
strictVersion: first.shareConfig?.strictVersion
};
}
return {
project: {
name: options.name,
mfRole: options.remotes?.length > 0 ? "host" : "unknown"
},
mfConfig: {
name: options.name,
remotes: options.remotes?.map(remoteToEntry) ?? [],
shared
}
};
}
//#endregion
exports.optionsToMFContext = optionsToMFContext;
//# sourceMappingURL=context.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"context.cjs","names":[],"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { MFContext } from '@module-federation/error-codes';\nimport type { Options, Remote } from '../type';\n\nfunction remoteToEntry(\n r: Remote,\n): import('@module-federation/error-codes').MFRemoteEntry {\n return {\n name: r.name,\n alias: r.alias,\n entry: 'entry' in r ? (r as { entry: string }).entry : undefined,\n version: 'version' in r ? (r as { version: string }).version : undefined,\n type: r.type,\n entryGlobalName: r.entryGlobalName,\n shareScope: r.shareScope,\n };\n}\n\n/**\n * Build a partial MFContext from runtime Options.\n * Used to enrich diagnostic entries with host context at error sites.\n */\nexport function optionsToMFContext(options: Options): Partial<MFContext> {\n const shared: MFContext['mfConfig'] extends undefined\n ? never\n : NonNullable<MFContext['mfConfig']>['shared'] = {};\n\n for (const [pkgName, versions] of Object.entries(options.shared)) {\n const first = versions[0];\n if (first) {\n shared[pkgName] = {\n version: first.version,\n singleton: first.shareConfig?.singleton,\n requiredVersion:\n first.shareConfig?.requiredVersion === false\n ? false\n : first.shareConfig?.requiredVersion,\n eager: first.eager,\n strictVersion: first.shareConfig?.strictVersion,\n };\n }\n }\n\n return {\n project: {\n name: options.name,\n mfRole: options.remotes?.length > 0 ? 'host' : 'unknown',\n },\n mfConfig: {\n name: options.name,\n remotes: options.remotes?.map(remoteToEntry) ?? [],\n shared,\n },\n };\n}\n"],"mappings":";;AAGA,SAAS,cACP,GACwD;AACxD,QAAO;EACL,MAAM,EAAE;EACR,OAAO,EAAE;EACT,OAAO,WAAW,IAAK,EAAwB,QAAQ;EACvD,SAAS,aAAa,IAAK,EAA0B,UAAU;EAC/D,MAAM,EAAE;EACR,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf;;;;;;AAOH,SAAgB,mBAAmB,SAAsC;CACvE,MAAM,SAE6C,EAAE;AAErD,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,OAAO,EAAE;EAChE,MAAM,QAAQ,SAAS;AACvB,MAAI,MACF,QAAO,WAAW;GAChB,SAAS,MAAM;GACf,WAAW,MAAM,aAAa;GAC9B,iBACE,MAAM,aAAa,oBAAoB,QACnC,QACA,MAAM,aAAa;GACzB,OAAO,MAAM;GACb,eAAe,MAAM,aAAa;GACnC;;AAIL,QAAO;EACL,SAAS;GACP,MAAM,QAAQ;GACd,QAAQ,QAAQ,SAAS,SAAS,IAAI,SAAS;GAChD;EACD,UAAU;GACR,MAAM,QAAQ;GACd,SAAS,QAAQ,SAAS,IAAI,cAAc,IAAI,EAAE;GAClD;GACD;EACF"}

View File

@@ -0,0 +1 @@
import { MFContext } from "@module-federation/error-codes";

View File

@@ -0,0 +1,44 @@
//#region src/utils/context.ts
function remoteToEntry(r) {
return {
name: r.name,
alias: r.alias,
entry: "entry" in r ? r.entry : void 0,
version: "version" in r ? r.version : void 0,
type: r.type,
entryGlobalName: r.entryGlobalName,
shareScope: r.shareScope
};
}
/**
* Build a partial MFContext from runtime Options.
* Used to enrich diagnostic entries with host context at error sites.
*/
function optionsToMFContext(options) {
const shared = {};
for (const [pkgName, versions] of Object.entries(options.shared)) {
const first = versions[0];
if (first) shared[pkgName] = {
version: first.version,
singleton: first.shareConfig?.singleton,
requiredVersion: first.shareConfig?.requiredVersion === false ? false : first.shareConfig?.requiredVersion,
eager: first.eager,
strictVersion: first.shareConfig?.strictVersion
};
}
return {
project: {
name: options.name,
mfRole: options.remotes?.length > 0 ? "host" : "unknown"
},
mfConfig: {
name: options.name,
remotes: options.remotes?.map(remoteToEntry) ?? [],
shared
}
};
}
//#endregion
export { optionsToMFContext };
//# sourceMappingURL=context.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"context.js","names":[],"sources":["../../src/utils/context.ts"],"sourcesContent":["import type { MFContext } from '@module-federation/error-codes';\nimport type { Options, Remote } from '../type';\n\nfunction remoteToEntry(\n r: Remote,\n): import('@module-federation/error-codes').MFRemoteEntry {\n return {\n name: r.name,\n alias: r.alias,\n entry: 'entry' in r ? (r as { entry: string }).entry : undefined,\n version: 'version' in r ? (r as { version: string }).version : undefined,\n type: r.type,\n entryGlobalName: r.entryGlobalName,\n shareScope: r.shareScope,\n };\n}\n\n/**\n * Build a partial MFContext from runtime Options.\n * Used to enrich diagnostic entries with host context at error sites.\n */\nexport function optionsToMFContext(options: Options): Partial<MFContext> {\n const shared: MFContext['mfConfig'] extends undefined\n ? never\n : NonNullable<MFContext['mfConfig']>['shared'] = {};\n\n for (const [pkgName, versions] of Object.entries(options.shared)) {\n const first = versions[0];\n if (first) {\n shared[pkgName] = {\n version: first.version,\n singleton: first.shareConfig?.singleton,\n requiredVersion:\n first.shareConfig?.requiredVersion === false\n ? false\n : first.shareConfig?.requiredVersion,\n eager: first.eager,\n strictVersion: first.shareConfig?.strictVersion,\n };\n }\n }\n\n return {\n project: {\n name: options.name,\n mfRole: options.remotes?.length > 0 ? 'host' : 'unknown',\n },\n mfConfig: {\n name: options.name,\n remotes: options.remotes?.map(remoteToEntry) ?? [],\n shared,\n },\n };\n}\n"],"mappings":";AAGA,SAAS,cACP,GACwD;AACxD,QAAO;EACL,MAAM,EAAE;EACR,OAAO,EAAE;EACT,OAAO,WAAW,IAAK,EAAwB,QAAQ;EACvD,SAAS,aAAa,IAAK,EAA0B,UAAU;EAC/D,MAAM,EAAE;EACR,iBAAiB,EAAE;EACnB,YAAY,EAAE;EACf;;;;;;AAOH,SAAgB,mBAAmB,SAAsC;CACvE,MAAM,SAE6C,EAAE;AAErD,MAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,OAAO,EAAE;EAChE,MAAM,QAAQ,SAAS;AACvB,MAAI,MACF,QAAO,WAAW;GAChB,SAAS,MAAM;GACf,WAAW,MAAM,aAAa;GAC9B,iBACE,MAAM,aAAa,oBAAoB,QACnC,QACA,MAAM,aAAa;GACzB,OAAO,MAAM;GACb,eAAe,MAAM,aAAa;GACnC;;AAIL,QAAO;EACL,SAAS;GACP,MAAM,QAAQ;GACd,QAAQ,QAAQ,SAAS,SAAS,IAAI,SAAS;GAChD;EACD,UAAU;GACR,MAAM,QAAQ;GACd,SAAS,QAAQ,SAAS,IAAI,cAAc,IAAI,EAAE;GAClD;GACD;EACF"}

View File

@@ -0,0 +1,10 @@
let _module_federation_sdk = require("@module-federation/sdk");
//#region src/utils/env.ts
function getBuilderId() {
return typeof FEDERATION_BUILD_IDENTIFIER !== "undefined" ? FEDERATION_BUILD_IDENTIFIER : "";
}
//#endregion
exports.getBuilderId = getBuilderId;
//# sourceMappingURL=env.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"env.cjs","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export {\n isBrowserEnv,\n isBrowserEnvValue,\n isDebugMode,\n} from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAUA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}

View File

@@ -0,0 +1 @@
export { };

View File

@@ -0,0 +1,10 @@
import "@module-federation/sdk";
//#region src/utils/env.ts
function getBuilderId() {
return typeof FEDERATION_BUILD_IDENTIFIER !== "undefined" ? FEDERATION_BUILD_IDENTIFIER : "";
}
//#endregion
export { getBuilderId };
//# sourceMappingURL=env.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"env.js","names":[],"sources":["../../src/utils/env.ts"],"sourcesContent":["export {\n isBrowserEnv,\n isBrowserEnvValue,\n isDebugMode,\n} from '@module-federation/sdk';\n\nexport function isDevelopmentMode(): boolean {\n return true;\n}\n\nexport function getBuilderId(): string {\n //@ts-ignore\n return typeof FEDERATION_BUILD_IDENTIFIER !== 'undefined'\n ? //@ts-ignore\n FEDERATION_BUILD_IDENTIFIER\n : '';\n}\n"],"mappings":";;;AAUA,SAAgB,eAAuB;AAErC,QAAO,OAAO,gCAAgC,cAE1C,8BACA"}

View File

@@ -0,0 +1,26 @@
const require_syncHook = require('./syncHook.cjs');
//#region src/utils/hooks/asyncHook.ts
var AsyncHook = class extends require_syncHook.SyncHook {
emit(...data) {
let result;
const ls = Array.from(this.listeners);
if (ls.length > 0) {
let i = 0;
const call = (prev) => {
if (prev === false) return false;
else if (i < ls.length) return Promise.resolve(ls[i++].apply(null, data)).then((result) => {
if (result === void 0 || data.length === 1 && result === data[0]) return call(prev);
return call(result);
});
else return prev;
};
result = call();
}
return Promise.resolve(result);
}
};
//#endregion
exports.AsyncHook = AsyncHook;
//# sourceMappingURL=asyncHook.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"asyncHook.cjs","names":["SyncHook"],"sources":["../../../src/utils/hooks/asyncHook.ts"],"sourcesContent":["import { ArgsType, SyncHook } from './syncHook';\n\ntype CallbackReturnType = void | false | Promise<void | false>;\n\nexport class AsyncHook<\n T,\n ExternalEmitReturnType = CallbackReturnType,\n> extends SyncHook<T, ExternalEmitReturnType> {\n override emit(\n ...data: ArgsType<T>\n ): Promise<void | false | ExternalEmitReturnType> {\n let result;\n const ls = Array.from(this.listeners);\n if (ls.length > 0) {\n let i = 0;\n const call = (prev?: unknown): unknown => {\n if (prev === false) {\n return false; // Abort process\n } else if (i < ls.length) {\n return Promise.resolve(ls[i++].apply(null, data)).then((result) => {\n if (\n result === undefined ||\n (data.length === 1 && result === data[0])\n ) {\n return call(prev);\n }\n return call(result);\n });\n } else {\n return prev;\n }\n };\n result = call();\n }\n return Promise.resolve(result) as Promise<\n void | false | ExternalEmitReturnType\n >;\n }\n}\n"],"mappings":";;;AAIA,IAAa,YAAb,cAGUA,0BAAoC;CAC5C,AAAS,KACP,GAAG,MAC6C;EAChD,IAAI;EACJ,MAAM,KAAK,MAAM,KAAK,KAAK,UAAU;AACrC,MAAI,GAAG,SAAS,GAAG;GACjB,IAAI,IAAI;GACR,MAAM,QAAQ,SAA4B;AACxC,QAAI,SAAS,MACX,QAAO;aACE,IAAI,GAAG,OAChB,QAAO,QAAQ,QAAQ,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,WAAW;AACjE,SACE,WAAW,UACV,KAAK,WAAW,KAAK,WAAW,KAAK,GAEtC,QAAO,KAAK,KAAK;AAEnB,YAAO,KAAK,OAAO;MACnB;QAEF,QAAO;;AAGX,YAAS,MAAM;;AAEjB,SAAO,QAAQ,QAAQ,OAAO"}

View File

@@ -0,0 +1,10 @@
import { ArgsType, SyncHook } from "./syncHook.js";
//#region src/utils/hooks/asyncHook.d.ts
type CallbackReturnType = void | false | Promise<void | false>;
declare class AsyncHook<T, ExternalEmitReturnType = CallbackReturnType> extends SyncHook<T, ExternalEmitReturnType> {
emit(...data: ArgsType<T>): Promise<void | false | ExternalEmitReturnType>;
}
//#endregion
export { AsyncHook };
//# sourceMappingURL=asyncHook.d.ts.map

View File

@@ -0,0 +1,26 @@
import { SyncHook } from "./syncHook.js";
//#region src/utils/hooks/asyncHook.ts
var AsyncHook = class extends SyncHook {
emit(...data) {
let result;
const ls = Array.from(this.listeners);
if (ls.length > 0) {
let i = 0;
const call = (prev) => {
if (prev === false) return false;
else if (i < ls.length) return Promise.resolve(ls[i++].apply(null, data)).then((result) => {
if (result === void 0 || data.length === 1 && result === data[0]) return call(prev);
return call(result);
});
else return prev;
};
result = call();
}
return Promise.resolve(result);
}
};
//#endregion
export { AsyncHook };
//# sourceMappingURL=asyncHook.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"asyncHook.js","names":[],"sources":["../../../src/utils/hooks/asyncHook.ts"],"sourcesContent":["import { ArgsType, SyncHook } from './syncHook';\n\ntype CallbackReturnType = void | false | Promise<void | false>;\n\nexport class AsyncHook<\n T,\n ExternalEmitReturnType = CallbackReturnType,\n> extends SyncHook<T, ExternalEmitReturnType> {\n override emit(\n ...data: ArgsType<T>\n ): Promise<void | false | ExternalEmitReturnType> {\n let result;\n const ls = Array.from(this.listeners);\n if (ls.length > 0) {\n let i = 0;\n const call = (prev?: unknown): unknown => {\n if (prev === false) {\n return false; // Abort process\n } else if (i < ls.length) {\n return Promise.resolve(ls[i++].apply(null, data)).then((result) => {\n if (\n result === undefined ||\n (data.length === 1 && result === data[0])\n ) {\n return call(prev);\n }\n return call(result);\n });\n } else {\n return prev;\n }\n };\n result = call();\n }\n return Promise.resolve(result) as Promise<\n void | false | ExternalEmitReturnType\n >;\n }\n}\n"],"mappings":";;;AAIA,IAAa,YAAb,cAGU,SAAoC;CAC5C,AAAS,KACP,GAAG,MAC6C;EAChD,IAAI;EACJ,MAAM,KAAK,MAAM,KAAK,KAAK,UAAU;AACrC,MAAI,GAAG,SAAS,GAAG;GACjB,IAAI,IAAI;GACR,MAAM,QAAQ,SAA4B;AACxC,QAAI,SAAS,MACX,QAAO;aACE,IAAI,GAAG,OAChB,QAAO,QAAQ,QAAQ,GAAG,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,WAAW;AACjE,SACE,WAAW,UACV,KAAK,WAAW,KAAK,WAAW,KAAK,GAEtC,QAAO,KAAK,KAAK;AAEnB,YAAO,KAAK,OAAO;MACnB;QAEF,QAAO;;AAGX,YAAS,MAAM;;AAEjB,SAAO,QAAQ,QAAQ,OAAO"}

View File

@@ -0,0 +1,44 @@
const require_logger = require('../logger.cjs');
const require_tool = require('../tool.cjs');
const require_syncHook = require('./syncHook.cjs');
const require_syncWaterfallHook = require('./syncWaterfallHook.cjs');
//#region src/utils/hooks/asyncWaterfallHooks.ts
var AsyncWaterfallHook = class extends require_syncHook.SyncHook {
constructor(type) {
super();
this.onerror = require_logger.error;
this.type = type;
}
emit(data) {
if (!require_tool.isObject(data)) require_logger.error(`The response data for the "${this.type}" hook must be an object.`);
const ls = Array.from(this.listeners);
if (ls.length > 0) {
let i = 0;
const processError = (e) => {
require_logger.warn(e);
this.onerror(e);
return data;
};
const call = (prevData) => {
if (prevData !== void 0 && require_syncWaterfallHook.checkReturnData(data, prevData)) data = prevData;
else if (prevData !== void 0) {
this.onerror(`A plugin returned an incorrect value for the "${this.type}" type.`);
return data;
}
if (i < ls.length) try {
return Promise.resolve(ls[i++](data)).then(call, processError);
} catch (e) {
return processError(e);
}
return data;
};
return Promise.resolve(call(data));
}
return Promise.resolve(data);
}
};
//#endregion
exports.AsyncWaterfallHook = AsyncWaterfallHook;
//# sourceMappingURL=asyncWaterfallHooks.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"asyncWaterfallHooks.cjs","names":["SyncHook","error","isObject","checkReturnData"],"sources":["../../../src/utils/hooks/asyncWaterfallHooks.ts"],"sourcesContent":["import { error, warn } from '../logger';\nimport { isObject } from '../tool';\nimport { SyncHook } from './syncHook';\nimport { checkReturnData } from './syncWaterfallHook';\n\ntype CallbackReturnType<T> = T | void | Promise<T | void>;\n\nexport class AsyncWaterfallHook<T extends object> extends SyncHook<\n [T],\n CallbackReturnType<T>\n> {\n onerror: (errMsg: string | Error | unknown) => void = error;\n constructor(type: string) {\n super();\n this.type = type;\n }\n\n override emit(data: T): Promise<T> {\n if (!isObject(data)) {\n error(`The response data for the \"${this.type}\" hook must be an object.`);\n }\n const ls = Array.from(this.listeners);\n\n if (ls.length > 0) {\n let i = 0;\n const processError = (e: unknown): T => {\n warn(e);\n this.onerror(e);\n return data;\n };\n\n const call = (prevData?: T | Awaited<T> | void): T | Promise<T> => {\n if (prevData !== undefined && checkReturnData(data, prevData)) {\n data = prevData as T;\n } else if (prevData !== undefined) {\n this.onerror(\n `A plugin returned an incorrect value for the \"${this.type}\" type.`,\n );\n return data;\n }\n if (i < ls.length) {\n try {\n return Promise.resolve(ls[i++](data)).then(call, processError);\n } catch (e) {\n return processError(e);\n }\n }\n return data;\n };\n return Promise.resolve(call(data));\n }\n return Promise.resolve(data);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,qBAAb,cAA0DA,0BAGxD;CAEA,YAAY,MAAc;AACxB,SAAO;iBAF6CC;AAGpD,OAAK,OAAO;;CAGd,AAAS,KAAK,MAAqB;AACjC,MAAI,CAACC,sBAAS,KAAK,CACjB,sBAAM,8BAA8B,KAAK,KAAK,2BAA2B;EAE3E,MAAM,KAAK,MAAM,KAAK,KAAK,UAAU;AAErC,MAAI,GAAG,SAAS,GAAG;GACjB,IAAI,IAAI;GACR,MAAM,gBAAgB,MAAkB;AACtC,wBAAK,EAAE;AACP,SAAK,QAAQ,EAAE;AACf,WAAO;;GAGT,MAAM,QAAQ,aAAqD;AACjE,QAAI,aAAa,UAAaC,0CAAgB,MAAM,SAAS,CAC3D,QAAO;aACE,aAAa,QAAW;AACjC,UAAK,QACH,iDAAiD,KAAK,KAAK,SAC5D;AACD,YAAO;;AAET,QAAI,IAAI,GAAG,OACT,KAAI;AACF,YAAO,QAAQ,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,KAAK,MAAM,aAAa;aACvD,GAAG;AACV,YAAO,aAAa,EAAE;;AAG1B,WAAO;;AAET,UAAO,QAAQ,QAAQ,KAAK,KAAK,CAAC;;AAEpC,SAAO,QAAQ,QAAQ,KAAK"}

View File

@@ -0,0 +1,12 @@
import { SyncHook } from "./syncHook.js";
//#region src/utils/hooks/asyncWaterfallHooks.d.ts
type CallbackReturnType<T> = T | void | Promise<T | void>;
declare class AsyncWaterfallHook<T extends object> extends SyncHook<[T], CallbackReturnType<T>> {
onerror: (errMsg: string | Error | unknown) => void;
constructor(type: string);
emit(data: T): Promise<T>;
}
//#endregion
export { AsyncWaterfallHook };
//# sourceMappingURL=asyncWaterfallHooks.d.ts.map

View File

@@ -0,0 +1,44 @@
import { error, warn } from "../logger.js";
import { isObject } from "../tool.js";
import { SyncHook } from "./syncHook.js";
import { checkReturnData } from "./syncWaterfallHook.js";
//#region src/utils/hooks/asyncWaterfallHooks.ts
var AsyncWaterfallHook = class extends SyncHook {
constructor(type) {
super();
this.onerror = error;
this.type = type;
}
emit(data) {
if (!isObject(data)) error(`The response data for the "${this.type}" hook must be an object.`);
const ls = Array.from(this.listeners);
if (ls.length > 0) {
let i = 0;
const processError = (e) => {
warn(e);
this.onerror(e);
return data;
};
const call = (prevData) => {
if (prevData !== void 0 && checkReturnData(data, prevData)) data = prevData;
else if (prevData !== void 0) {
this.onerror(`A plugin returned an incorrect value for the "${this.type}" type.`);
return data;
}
if (i < ls.length) try {
return Promise.resolve(ls[i++](data)).then(call, processError);
} catch (e) {
return processError(e);
}
return data;
};
return Promise.resolve(call(data));
}
return Promise.resolve(data);
}
};
//#endregion
export { AsyncWaterfallHook };
//# sourceMappingURL=asyncWaterfallHooks.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"asyncWaterfallHooks.js","names":[],"sources":["../../../src/utils/hooks/asyncWaterfallHooks.ts"],"sourcesContent":["import { error, warn } from '../logger';\nimport { isObject } from '../tool';\nimport { SyncHook } from './syncHook';\nimport { checkReturnData } from './syncWaterfallHook';\n\ntype CallbackReturnType<T> = T | void | Promise<T | void>;\n\nexport class AsyncWaterfallHook<T extends object> extends SyncHook<\n [T],\n CallbackReturnType<T>\n> {\n onerror: (errMsg: string | Error | unknown) => void = error;\n constructor(type: string) {\n super();\n this.type = type;\n }\n\n override emit(data: T): Promise<T> {\n if (!isObject(data)) {\n error(`The response data for the \"${this.type}\" hook must be an object.`);\n }\n const ls = Array.from(this.listeners);\n\n if (ls.length > 0) {\n let i = 0;\n const processError = (e: unknown): T => {\n warn(e);\n this.onerror(e);\n return data;\n };\n\n const call = (prevData?: T | Awaited<T> | void): T | Promise<T> => {\n if (prevData !== undefined && checkReturnData(data, prevData)) {\n data = prevData as T;\n } else if (prevData !== undefined) {\n this.onerror(\n `A plugin returned an incorrect value for the \"${this.type}\" type.`,\n );\n return data;\n }\n if (i < ls.length) {\n try {\n return Promise.resolve(ls[i++](data)).then(call, processError);\n } catch (e) {\n return processError(e);\n }\n }\n return data;\n };\n return Promise.resolve(call(data));\n }\n return Promise.resolve(data);\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,qBAAb,cAA0D,SAGxD;CAEA,YAAY,MAAc;AACxB,SAAO;iBAF6C;AAGpD,OAAK,OAAO;;CAGd,AAAS,KAAK,MAAqB;AACjC,MAAI,CAAC,SAAS,KAAK,CACjB,OAAM,8BAA8B,KAAK,KAAK,2BAA2B;EAE3E,MAAM,KAAK,MAAM,KAAK,KAAK,UAAU;AAErC,MAAI,GAAG,SAAS,GAAG;GACjB,IAAI,IAAI;GACR,MAAM,gBAAgB,MAAkB;AACtC,SAAK,EAAE;AACP,SAAK,QAAQ,EAAE;AACf,WAAO;;GAGT,MAAM,QAAQ,aAAqD;AACjE,QAAI,aAAa,UAAa,gBAAgB,MAAM,SAAS,CAC3D,QAAO;aACE,aAAa,QAAW;AACjC,UAAK,QACH,iDAAiD,KAAK,KAAK,SAC5D;AACD,YAAO;;AAET,QAAI,IAAI,GAAG,OACT,KAAI;AACF,YAAO,QAAQ,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,KAAK,MAAM,aAAa;aACvD,GAAG;AACV,YAAO,aAAa,EAAE;;AAG1B,WAAO;;AAET,UAAO,QAAQ,QAAQ,KAAK,KAAK,CAAC;;AAEpC,SAAO,QAAQ,QAAQ,KAAK"}

View File

@@ -0,0 +1,5 @@
const require_syncHook = require('./syncHook.cjs');
const require_asyncHook = require('./asyncHook.cjs');
const require_syncWaterfallHook = require('./syncWaterfallHook.cjs');
const require_asyncWaterfallHooks = require('./asyncWaterfallHooks.cjs');
const require_pluginSystem = require('./pluginSystem.cjs');

View File

@@ -0,0 +1,5 @@
import { SyncHook } from "./syncHook.js";
import { AsyncHook } from "./asyncHook.js";
import { SyncWaterfallHook } from "./syncWaterfallHook.js";
import { AsyncWaterfallHook } from "./asyncWaterfallHooks.js";
import { Plugin, PluginSystem } from "./pluginSystem.js";

View File

@@ -0,0 +1,7 @@
import { SyncHook } from "./syncHook.js";
import { AsyncHook } from "./asyncHook.js";
import { SyncWaterfallHook } from "./syncWaterfallHook.js";
import { AsyncWaterfallHook } from "./asyncWaterfallHooks.js";
import { PluginSystem } from "./pluginSystem.js";
export { };

View File

@@ -0,0 +1,37 @@
const require_logger = require('../logger.cjs');
const require_tool = require('../tool.cjs');
require('../index.cjs');
//#region src/utils/hooks/pluginSystem.ts
var PluginSystem = class {
constructor(lifecycle) {
this.registerPlugins = {};
this.lifecycle = lifecycle;
this.lifecycleKeys = Object.keys(lifecycle);
}
applyPlugin(plugin, instance) {
require_logger.assert(require_tool.isPlainObject(plugin), "Plugin configuration is invalid.");
const pluginName = plugin.name;
require_logger.assert(pluginName, "A name must be provided by the plugin.");
if (!this.registerPlugins[pluginName]) {
this.registerPlugins[pluginName] = plugin;
plugin.apply?.(instance);
Object.keys(this.lifecycle).forEach((key) => {
const pluginLife = plugin[key];
if (pluginLife) this.lifecycle[key].on(pluginLife);
});
}
}
removePlugin(pluginName) {
require_logger.assert(pluginName, "A name is required.");
const plugin = this.registerPlugins[pluginName];
require_logger.assert(plugin, `The plugin "${pluginName}" is not registered.`);
Object.keys(plugin).forEach((key) => {
if (key !== "name") this.lifecycle[key].remove(plugin[key]);
});
}
};
//#endregion
exports.PluginSystem = PluginSystem;
//# sourceMappingURL=pluginSystem.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"pluginSystem.cjs","names":["isPlainObject"],"sources":["../../../src/utils/hooks/pluginSystem.ts"],"sourcesContent":["import type { ModuleFederation } from '../../core';\nimport { assert, isPlainObject } from '../../utils';\n\nexport type Plugin<T extends Record<string, any>> = {\n [k in keyof T]?: Parameters<T[k]['on']>[0];\n} & {\n name: string;\n version?: string;\n apply?: (instance: ModuleFederation) => void;\n};\n\nexport class PluginSystem<T extends Record<string, any>> {\n lifecycle: T;\n lifecycleKeys: Array<keyof T>;\n registerPlugins: Record<string, Plugin<T>> = {};\n\n constructor(lifecycle: T) {\n this.lifecycle = lifecycle;\n this.lifecycleKeys = Object.keys(lifecycle);\n }\n\n applyPlugin(plugin: Plugin<T>, instance: ModuleFederation): void {\n assert(isPlainObject(plugin), 'Plugin configuration is invalid.');\n // The plugin's name is mandatory and must be unique\n const pluginName = plugin.name;\n assert(pluginName, 'A name must be provided by the plugin.');\n\n if (!this.registerPlugins[pluginName]) {\n this.registerPlugins[pluginName] = plugin;\n plugin.apply?.(instance);\n\n Object.keys(this.lifecycle).forEach((key) => {\n const pluginLife = plugin[key as string];\n if (pluginLife) {\n this.lifecycle[key].on(pluginLife);\n }\n });\n }\n }\n\n removePlugin(pluginName: string): void {\n assert(pluginName, 'A name is required.');\n const plugin = this.registerPlugins[pluginName];\n assert(plugin, `The plugin \"${pluginName}\" is not registered.`);\n\n Object.keys(plugin).forEach((key) => {\n if (key !== 'name') {\n this.lifecycle[key].remove(plugin[key as string]);\n }\n });\n }\n}\n"],"mappings":";;;;;AAWA,IAAa,eAAb,MAAyD;CAKvD,YAAY,WAAc;yBAFmB,EAAE;AAG7C,OAAK,YAAY;AACjB,OAAK,gBAAgB,OAAO,KAAK,UAAU;;CAG7C,YAAY,QAAmB,UAAkC;AAC/D,wBAAOA,2BAAc,OAAO,EAAE,mCAAmC;EAEjE,MAAM,aAAa,OAAO;AAC1B,wBAAO,YAAY,yCAAyC;AAE5D,MAAI,CAAC,KAAK,gBAAgB,aAAa;AACrC,QAAK,gBAAgB,cAAc;AACnC,UAAO,QAAQ,SAAS;AAExB,UAAO,KAAK,KAAK,UAAU,CAAC,SAAS,QAAQ;IAC3C,MAAM,aAAa,OAAO;AAC1B,QAAI,WACF,MAAK,UAAU,KAAK,GAAG,WAAW;KAEpC;;;CAIN,aAAa,YAA0B;AACrC,wBAAO,YAAY,sBAAsB;EACzC,MAAM,SAAS,KAAK,gBAAgB;AACpC,wBAAO,QAAQ,eAAe,WAAW,sBAAsB;AAE/D,SAAO,KAAK,OAAO,CAAC,SAAS,QAAQ;AACnC,OAAI,QAAQ,OACV,MAAK,UAAU,KAAK,OAAO,OAAO,KAAe;IAEnD"}

View File

@@ -0,0 +1,19 @@
import { ModuleFederation } from "../../core.js";
//#region src/utils/hooks/pluginSystem.d.ts
type Plugin<T extends Record<string, any>> = { [k in keyof T]?: Parameters<T[k]['on']>[0] } & {
name: string;
version?: string;
apply?: (instance: ModuleFederation) => void;
};
declare class PluginSystem<T extends Record<string, any>> {
lifecycle: T;
lifecycleKeys: Array<keyof T>;
registerPlugins: Record<string, Plugin<T>>;
constructor(lifecycle: T);
applyPlugin(plugin: Plugin<T>, instance: ModuleFederation): void;
removePlugin(pluginName: string): void;
}
//#endregion
export { PluginSystem };
//# sourceMappingURL=pluginSystem.d.ts.map

View File

@@ -0,0 +1,37 @@
import { assert } from "../logger.js";
import { isPlainObject } from "../tool.js";
import "../index.js";
//#region src/utils/hooks/pluginSystem.ts
var PluginSystem = class {
constructor(lifecycle) {
this.registerPlugins = {};
this.lifecycle = lifecycle;
this.lifecycleKeys = Object.keys(lifecycle);
}
applyPlugin(plugin, instance) {
assert(isPlainObject(plugin), "Plugin configuration is invalid.");
const pluginName = plugin.name;
assert(pluginName, "A name must be provided by the plugin.");
if (!this.registerPlugins[pluginName]) {
this.registerPlugins[pluginName] = plugin;
plugin.apply?.(instance);
Object.keys(this.lifecycle).forEach((key) => {
const pluginLife = plugin[key];
if (pluginLife) this.lifecycle[key].on(pluginLife);
});
}
}
removePlugin(pluginName) {
assert(pluginName, "A name is required.");
const plugin = this.registerPlugins[pluginName];
assert(plugin, `The plugin "${pluginName}" is not registered.`);
Object.keys(plugin).forEach((key) => {
if (key !== "name") this.lifecycle[key].remove(plugin[key]);
});
}
};
//#endregion
export { PluginSystem };
//# sourceMappingURL=pluginSystem.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"pluginSystem.js","names":[],"sources":["../../../src/utils/hooks/pluginSystem.ts"],"sourcesContent":["import type { ModuleFederation } from '../../core';\nimport { assert, isPlainObject } from '../../utils';\n\nexport type Plugin<T extends Record<string, any>> = {\n [k in keyof T]?: Parameters<T[k]['on']>[0];\n} & {\n name: string;\n version?: string;\n apply?: (instance: ModuleFederation) => void;\n};\n\nexport class PluginSystem<T extends Record<string, any>> {\n lifecycle: T;\n lifecycleKeys: Array<keyof T>;\n registerPlugins: Record<string, Plugin<T>> = {};\n\n constructor(lifecycle: T) {\n this.lifecycle = lifecycle;\n this.lifecycleKeys = Object.keys(lifecycle);\n }\n\n applyPlugin(plugin: Plugin<T>, instance: ModuleFederation): void {\n assert(isPlainObject(plugin), 'Plugin configuration is invalid.');\n // The plugin's name is mandatory and must be unique\n const pluginName = plugin.name;\n assert(pluginName, 'A name must be provided by the plugin.');\n\n if (!this.registerPlugins[pluginName]) {\n this.registerPlugins[pluginName] = plugin;\n plugin.apply?.(instance);\n\n Object.keys(this.lifecycle).forEach((key) => {\n const pluginLife = plugin[key as string];\n if (pluginLife) {\n this.lifecycle[key].on(pluginLife);\n }\n });\n }\n }\n\n removePlugin(pluginName: string): void {\n assert(pluginName, 'A name is required.');\n const plugin = this.registerPlugins[pluginName];\n assert(plugin, `The plugin \"${pluginName}\" is not registered.`);\n\n Object.keys(plugin).forEach((key) => {\n if (key !== 'name') {\n this.lifecycle[key].remove(plugin[key as string]);\n }\n });\n }\n}\n"],"mappings":";;;;;AAWA,IAAa,eAAb,MAAyD;CAKvD,YAAY,WAAc;yBAFmB,EAAE;AAG7C,OAAK,YAAY;AACjB,OAAK,gBAAgB,OAAO,KAAK,UAAU;;CAG7C,YAAY,QAAmB,UAAkC;AAC/D,SAAO,cAAc,OAAO,EAAE,mCAAmC;EAEjE,MAAM,aAAa,OAAO;AAC1B,SAAO,YAAY,yCAAyC;AAE5D,MAAI,CAAC,KAAK,gBAAgB,aAAa;AACrC,QAAK,gBAAgB,cAAc;AACnC,UAAO,QAAQ,SAAS;AAExB,UAAO,KAAK,KAAK,UAAU,CAAC,SAAS,QAAQ;IAC3C,MAAM,aAAa,OAAO;AAC1B,QAAI,WACF,MAAK,UAAU,KAAK,GAAG,WAAW;KAEpC;;;CAIN,aAAa,YAA0B;AACrC,SAAO,YAAY,sBAAsB;EACzC,MAAM,SAAS,KAAK,gBAAgB;AACpC,SAAO,QAAQ,eAAe,WAAW,sBAAsB;AAE/D,SAAO,KAAK,OAAO,CAAC,SAAS,QAAQ;AACnC,OAAI,QAAQ,OACV,MAAK,UAAU,KAAK,OAAO,OAAO,KAAe;IAEnD"}

View File

@@ -0,0 +1,37 @@
//#region src/utils/hooks/syncHook.ts
var SyncHook = class {
constructor(type) {
this.type = "";
this.listeners = /* @__PURE__ */ new Set();
if (type) this.type = type;
}
on(fn) {
if (typeof fn === "function") this.listeners.add(fn);
}
once(fn) {
const self = this;
this.on(function wrapper(...args) {
self.remove(wrapper);
return fn.apply(null, args);
});
}
emit(...data) {
let result;
if (this.listeners.size > 0) this.listeners.forEach((fn) => {
const nextResult = fn(...data);
if (nextResult !== void 0) result = nextResult;
});
return result;
}
remove(fn) {
this.listeners.delete(fn);
}
removeAll() {
this.listeners.clear();
}
};
//#endregion
exports.SyncHook = SyncHook;
//# sourceMappingURL=syncHook.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"syncHook.cjs","names":[],"sources":["../../../src/utils/hooks/syncHook.ts"],"sourcesContent":["export type Callback<T, K> = (...args: ArgsType<T>) => K;\nexport type ArgsType<T> = T extends Array<any> ? T : Array<any>;\n\nexport class SyncHook<T, K> {\n type = '';\n listeners = new Set<Callback<T, K>>();\n\n constructor(type?: string) {\n if (type) {\n this.type = type;\n }\n }\n\n on(fn: Callback<T, K>): void {\n if (typeof fn === 'function') {\n this.listeners.add(fn);\n }\n }\n\n once(fn: Callback<T, K>): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n this.on(function wrapper(...args) {\n self.remove(wrapper);\n // eslint-disable-next-line prefer-spread\n return fn.apply(null, args);\n });\n }\n\n emit(...data: ArgsType<T>): void | K | Promise<any> {\n let result;\n if (this.listeners.size > 0) {\n // eslint-disable-next-line prefer-spread\n this.listeners.forEach((fn) => {\n const nextResult = fn(...data);\n if (nextResult !== undefined) {\n result = nextResult;\n }\n });\n }\n return result;\n }\n\n remove(fn: Callback<T, K>): void {\n this.listeners.delete(fn);\n }\n\n removeAll(): void {\n this.listeners.clear();\n }\n}\n"],"mappings":";;AAGA,IAAa,WAAb,MAA4B;CAI1B,YAAY,MAAe;cAHpB;mCACK,IAAI,KAAqB;AAGnC,MAAI,KACF,MAAK,OAAO;;CAIhB,GAAG,IAA0B;AAC3B,MAAI,OAAO,OAAO,WAChB,MAAK,UAAU,IAAI,GAAG;;CAI1B,KAAK,IAA0B;EAE7B,MAAM,OAAO;AACb,OAAK,GAAG,SAAS,QAAQ,GAAG,MAAM;AAChC,QAAK,OAAO,QAAQ;AAEpB,UAAO,GAAG,MAAM,MAAM,KAAK;IAC3B;;CAGJ,KAAK,GAAG,MAA4C;EAClD,IAAI;AACJ,MAAI,KAAK,UAAU,OAAO,EAExB,MAAK,UAAU,SAAS,OAAO;GAC7B,MAAM,aAAa,GAAG,GAAG,KAAK;AAC9B,OAAI,eAAe,OACjB,UAAS;IAEX;AAEJ,SAAO;;CAGT,OAAO,IAA0B;AAC/B,OAAK,UAAU,OAAO,GAAG;;CAG3B,YAAkB;AAChB,OAAK,UAAU,OAAO"}

View File

@@ -0,0 +1,16 @@
//#region src/utils/hooks/syncHook.d.ts
type Callback<T, K> = (...args: ArgsType<T>) => K;
type ArgsType<T> = T extends Array<any> ? T : Array<any>;
declare class SyncHook<T, K> {
type: string;
listeners: Set<Callback<T, K>>;
constructor(type?: string);
on(fn: Callback<T, K>): void;
once(fn: Callback<T, K>): void;
emit(...data: ArgsType<T>): void | K | Promise<any>;
remove(fn: Callback<T, K>): void;
removeAll(): void;
}
//#endregion
export { ArgsType, SyncHook };
//# sourceMappingURL=syncHook.d.ts.map

View File

@@ -0,0 +1,36 @@
//#region src/utils/hooks/syncHook.ts
var SyncHook = class {
constructor(type) {
this.type = "";
this.listeners = /* @__PURE__ */ new Set();
if (type) this.type = type;
}
on(fn) {
if (typeof fn === "function") this.listeners.add(fn);
}
once(fn) {
const self = this;
this.on(function wrapper(...args) {
self.remove(wrapper);
return fn.apply(null, args);
});
}
emit(...data) {
let result;
if (this.listeners.size > 0) this.listeners.forEach((fn) => {
const nextResult = fn(...data);
if (nextResult !== void 0) result = nextResult;
});
return result;
}
remove(fn) {
this.listeners.delete(fn);
}
removeAll() {
this.listeners.clear();
}
};
//#endregion
export { SyncHook };
//# sourceMappingURL=syncHook.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"syncHook.js","names":[],"sources":["../../../src/utils/hooks/syncHook.ts"],"sourcesContent":["export type Callback<T, K> = (...args: ArgsType<T>) => K;\nexport type ArgsType<T> = T extends Array<any> ? T : Array<any>;\n\nexport class SyncHook<T, K> {\n type = '';\n listeners = new Set<Callback<T, K>>();\n\n constructor(type?: string) {\n if (type) {\n this.type = type;\n }\n }\n\n on(fn: Callback<T, K>): void {\n if (typeof fn === 'function') {\n this.listeners.add(fn);\n }\n }\n\n once(fn: Callback<T, K>): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n this.on(function wrapper(...args) {\n self.remove(wrapper);\n // eslint-disable-next-line prefer-spread\n return fn.apply(null, args);\n });\n }\n\n emit(...data: ArgsType<T>): void | K | Promise<any> {\n let result;\n if (this.listeners.size > 0) {\n // eslint-disable-next-line prefer-spread\n this.listeners.forEach((fn) => {\n const nextResult = fn(...data);\n if (nextResult !== undefined) {\n result = nextResult;\n }\n });\n }\n return result;\n }\n\n remove(fn: Callback<T, K>): void {\n this.listeners.delete(fn);\n }\n\n removeAll(): void {\n this.listeners.clear();\n }\n}\n"],"mappings":";AAGA,IAAa,WAAb,MAA4B;CAI1B,YAAY,MAAe;cAHpB;mCACK,IAAI,KAAqB;AAGnC,MAAI,KACF,MAAK,OAAO;;CAIhB,GAAG,IAA0B;AAC3B,MAAI,OAAO,OAAO,WAChB,MAAK,UAAU,IAAI,GAAG;;CAI1B,KAAK,IAA0B;EAE7B,MAAM,OAAO;AACb,OAAK,GAAG,SAAS,QAAQ,GAAG,MAAM;AAChC,QAAK,OAAO,QAAQ;AAEpB,UAAO,GAAG,MAAM,MAAM,KAAK;IAC3B;;CAGJ,KAAK,GAAG,MAA4C;EAClD,IAAI;AACJ,MAAI,KAAK,UAAU,OAAO,EAExB,MAAK,UAAU,SAAS,OAAO;GAC7B,MAAM,aAAa,GAAG,GAAG,KAAK;AAC9B,OAAI,eAAe,OACjB,UAAS;IAEX;AAEJ,SAAO;;CAGT,OAAO,IAA0B;AAC/B,OAAK,UAAU,OAAO,GAAG;;CAG3B,YAAkB;AAChB,OAAK,UAAU,OAAO"}

View File

@@ -0,0 +1,40 @@
const require_logger = require('../logger.cjs');
const require_tool = require('../tool.cjs');
const require_syncHook = require('./syncHook.cjs');
//#region src/utils/hooks/syncWaterfallHook.ts
function checkReturnData(originalData, returnedData) {
if (!require_tool.isObject(returnedData)) return false;
if (originalData !== returnedData) {
for (const key in originalData) if (!(key in returnedData)) return false;
}
return true;
}
var SyncWaterfallHook = class extends require_syncHook.SyncHook {
constructor(type) {
super();
this.onerror = require_logger.error;
this.type = type;
}
emit(data) {
if (!require_tool.isObject(data)) require_logger.error(`The data for the "${this.type}" hook should be an object.`);
for (const fn of this.listeners) try {
const tempData = fn(data);
if (tempData === void 0) continue;
if (checkReturnData(data, tempData)) data = tempData;
else {
this.onerror(`A plugin returned an unacceptable value for the "${this.type}" type.`);
break;
}
} catch (e) {
require_logger.warn(e);
this.onerror(e);
}
return data;
}
};
//#endregion
exports.SyncWaterfallHook = SyncWaterfallHook;
exports.checkReturnData = checkReturnData;
//# sourceMappingURL=syncWaterfallHook.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"syncWaterfallHook.cjs","names":["isObject","SyncHook","error"],"sources":["../../../src/utils/hooks/syncWaterfallHook.ts"],"sourcesContent":["import { error, warn } from '../logger';\nimport { isObject } from '../tool';\nimport { SyncHook } from './syncHook';\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function checkReturnData(originalData: any, returnedData: any): boolean {\n if (!isObject(returnedData)) {\n return false;\n }\n if (originalData !== returnedData) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in originalData) {\n if (!(key in returnedData)) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport class SyncWaterfallHook<T extends Record<string, any>> extends SyncHook<\n [T],\n T | void\n> {\n onerror: (errMsg: string | Error | unknown) => void = error;\n\n constructor(type: string) {\n super();\n this.type = type;\n }\n\n override emit(data: T): T {\n if (!isObject(data)) {\n error(`The data for the \"${this.type}\" hook should be an object.`);\n }\n for (const fn of this.listeners) {\n try {\n const tempData = fn(data);\n if (tempData === undefined) {\n continue;\n }\n if (checkReturnData(data, tempData)) {\n data = tempData;\n } else {\n this.onerror(\n `A plugin returned an unacceptable value for the \"${this.type}\" type.`,\n );\n break;\n }\n } catch (e) {\n warn(e);\n this.onerror(e);\n }\n }\n return data;\n }\n}\n"],"mappings":";;;;;AAKA,SAAgB,gBAAgB,cAAmB,cAA4B;AAC7E,KAAI,CAACA,sBAAS,aAAa,CACzB,QAAO;AAET,KAAI,iBAAiB,cAEnB;OAAK,MAAM,OAAO,aAChB,KAAI,EAAE,OAAO,cACX,QAAO;;AAIb,QAAO;;AAGT,IAAa,oBAAb,cAAsEC,0BAGpE;CAGA,YAAY,MAAc;AACxB,SAAO;iBAH6CC;AAIpD,OAAK,OAAO;;CAGd,AAAS,KAAK,MAAY;AACxB,MAAI,CAACF,sBAAS,KAAK,CACjB,sBAAM,qBAAqB,KAAK,KAAK,6BAA6B;AAEpE,OAAK,MAAM,MAAM,KAAK,UACpB,KAAI;GACF,MAAM,WAAW,GAAG,KAAK;AACzB,OAAI,aAAa,OACf;AAEF,OAAI,gBAAgB,MAAM,SAAS,CACjC,QAAO;QACF;AACL,SAAK,QACH,oDAAoD,KAAK,KAAK,SAC/D;AACD;;WAEK,GAAG;AACV,uBAAK,EAAE;AACP,QAAK,QAAQ,EAAE;;AAGnB,SAAO"}

View File

@@ -0,0 +1,11 @@
import { SyncHook } from "./syncHook.js";
//#region src/utils/hooks/syncWaterfallHook.d.ts
declare class SyncWaterfallHook<T extends Record<string, any>> extends SyncHook<[T], T | void> {
onerror: (errMsg: string | Error | unknown) => void;
constructor(type: string);
emit(data: T): T;
}
//#endregion
export { SyncWaterfallHook };
//# sourceMappingURL=syncWaterfallHook.d.ts.map

View File

@@ -0,0 +1,39 @@
import { error, warn } from "../logger.js";
import { isObject } from "../tool.js";
import { SyncHook } from "./syncHook.js";
//#region src/utils/hooks/syncWaterfallHook.ts
function checkReturnData(originalData, returnedData) {
if (!isObject(returnedData)) return false;
if (originalData !== returnedData) {
for (const key in originalData) if (!(key in returnedData)) return false;
}
return true;
}
var SyncWaterfallHook = class extends SyncHook {
constructor(type) {
super();
this.onerror = error;
this.type = type;
}
emit(data) {
if (!isObject(data)) error(`The data for the "${this.type}" hook should be an object.`);
for (const fn of this.listeners) try {
const tempData = fn(data);
if (tempData === void 0) continue;
if (checkReturnData(data, tempData)) data = tempData;
else {
this.onerror(`A plugin returned an unacceptable value for the "${this.type}" type.`);
break;
}
} catch (e) {
warn(e);
this.onerror(e);
}
return data;
}
};
//#endregion
export { SyncWaterfallHook, checkReturnData };
//# sourceMappingURL=syncWaterfallHook.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"syncWaterfallHook.js","names":[],"sources":["../../../src/utils/hooks/syncWaterfallHook.ts"],"sourcesContent":["import { error, warn } from '../logger';\nimport { isObject } from '../tool';\nimport { SyncHook } from './syncHook';\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function checkReturnData(originalData: any, returnedData: any): boolean {\n if (!isObject(returnedData)) {\n return false;\n }\n if (originalData !== returnedData) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in originalData) {\n if (!(key in returnedData)) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport class SyncWaterfallHook<T extends Record<string, any>> extends SyncHook<\n [T],\n T | void\n> {\n onerror: (errMsg: string | Error | unknown) => void = error;\n\n constructor(type: string) {\n super();\n this.type = type;\n }\n\n override emit(data: T): T {\n if (!isObject(data)) {\n error(`The data for the \"${this.type}\" hook should be an object.`);\n }\n for (const fn of this.listeners) {\n try {\n const tempData = fn(data);\n if (tempData === undefined) {\n continue;\n }\n if (checkReturnData(data, tempData)) {\n data = tempData;\n } else {\n this.onerror(\n `A plugin returned an unacceptable value for the \"${this.type}\" type.`,\n );\n break;\n }\n } catch (e) {\n warn(e);\n this.onerror(e);\n }\n }\n return data;\n }\n}\n"],"mappings":";;;;;AAKA,SAAgB,gBAAgB,cAAmB,cAA4B;AAC7E,KAAI,CAAC,SAAS,aAAa,CACzB,QAAO;AAET,KAAI,iBAAiB,cAEnB;OAAK,MAAM,OAAO,aAChB,KAAI,EAAE,OAAO,cACX,QAAO;;AAIb,QAAO;;AAGT,IAAa,oBAAb,cAAsE,SAGpE;CAGA,YAAY,MAAc;AACxB,SAAO;iBAH6C;AAIpD,OAAK,OAAO;;CAGd,AAAS,KAAK,MAAY;AACxB,MAAI,CAAC,SAAS,KAAK,CACjB,OAAM,qBAAqB,KAAK,KAAK,6BAA6B;AAEpE,OAAK,MAAM,MAAM,KAAK,UACpB,KAAI;GACF,MAAM,WAAW,GAAG,KAAK;AACzB,OAAI,aAAa,OACf;AAEF,OAAI,gBAAgB,MAAM,SAAS,CACjC,QAAO;QACF;AACL,SAAK,QACH,oDAAoD,KAAK,KAAK,SAC/D;AACD;;WAEK,GAAG;AACV,QAAK,EAAE;AACP,QAAK,QAAQ,EAAE;;AAGnB,SAAO"}

View File

@@ -0,0 +1,8 @@
const require_logger = require('./logger.cjs');
const require_tool = require('./tool.cjs');
const require_env = require('./env.cjs');
const require_manifest = require('./manifest.cjs');
const require_plugin = require('./plugin.cjs');
const require_load = require('./load.cjs');
const require_context = require('./context.cjs');
let _module_federation_sdk = require("@module-federation/sdk");

View File

@@ -0,0 +1,4 @@
import { isStaticResourcesEqual, safeWrapper } from "./tool.js";
import { matchRemoteWithNameAndExpose } from "./manifest.js";
import { assert, error } from "./logger.js";
import { getRemoteEntry, getRemoteInfo } from "./load.js";

View File

@@ -0,0 +1,9 @@
import { assert, error, logger, warn } from "./logger.js";
import { addUniqueItem, arrayOptions, getFMId, getRemoteEntryInfoFromSnapshot, isObject, isPlainObject, isPureRemoteEntry, isRemoteInfoWithEntry, isStaticResourcesEqual, objectToString, processModuleAlias, safeWrapper } from "./tool.js";
import { getBuilderId } from "./env.js";
import { composeRemoteRequestId, matchRemote, matchRemoteWithNameAndExpose } from "./manifest.js";
import { registerPlugins } from "./plugin.js";
import { getRemoteEntry, getRemoteEntryUniqueKey, getRemoteInfo } from "./load.js";
import { optionsToMFContext } from "./context.js";
export { };

View File

@@ -0,0 +1,214 @@
const require_logger = require('./logger.cjs');
const require_global = require('../global.cjs');
const require_constant = require('../constant.cjs');
let _module_federation_sdk = require("@module-federation/sdk");
let _module_federation_error_codes = require("@module-federation/error-codes");
//#region src/utils/load.ts
const importCallback = ".then(callbacks[0]).catch(callbacks[1])";
async function loadEsmEntry({ entry, remoteEntryExports }) {
return new Promise((resolve, reject) => {
try {
if (!remoteEntryExports) if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== "undefined") new Function("callbacks", `import("${entry}")${importCallback}`)([resolve, reject]);
else import(
/* webpackIgnore: true */
/* @vite-ignore */
entry
).then(resolve).catch(reject);
else resolve(remoteEntryExports);
} catch (e) {
require_logger.error(`Failed to load ESM entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
}
});
}
async function loadSystemJsEntry({ entry, remoteEntryExports }) {
return new Promise((resolve, reject) => {
try {
if (!remoteEntryExports) if (typeof __system_context__ === "undefined") System.import(entry).then(resolve).catch(reject);
else new Function("callbacks", `System.import("${entry}")${importCallback}`)([resolve, reject]);
else resolve(remoteEntryExports);
} catch (e) {
require_logger.error(`Failed to load SystemJS entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
}
});
}
function handleRemoteEntryLoaded(name, globalName, entry) {
const { remoteEntryKey, entryExports } = require_global.getRemoteEntryExports(name, globalName);
if (!entryExports) require_logger.error(_module_federation_error_codes.RUNTIME_001, _module_federation_error_codes.runtimeDescMap, {
remoteName: name,
remoteEntryUrl: entry,
remoteEntryKey
});
return entryExports;
}
async function loadEntryScript({ name, globalName, entry, remoteInfo, loaderHook, getEntryUrl, resourceContext }) {
const { entryExports: remoteEntryExports } = require_global.getRemoteEntryExports(name, globalName);
if (remoteEntryExports) return remoteEntryExports;
const url = getEntryUrl ? getEntryUrl(entry) : entry;
return (0, _module_federation_sdk.loadScript)(url, {
attrs: {},
createScriptHook: (url, attrs) => {
const res = loaderHook.lifecycle.createScript.emit({
url,
attrs,
remoteInfo,
resourceContext: resourceContext ? {
...resourceContext,
url
} : void 0
});
if (!res) return;
if (res instanceof HTMLScriptElement) return res;
if ("script" in res || "timeout" in res) return res;
}
}).then(() => {
return handleRemoteEntryLoaded(name, globalName, entry);
}, (loadError) => {
const originalMsg = loadError instanceof Error ? loadError.message : String(loadError);
require_logger.error(_module_federation_error_codes.RUNTIME_008, _module_federation_error_codes.runtimeDescMap, {
remoteName: name,
resourceUrl: url
}, originalMsg);
});
}
async function loadEntryDom({ remoteInfo, remoteEntryExports, loaderHook, getEntryUrl, resourceContext }) {
const { entry, entryGlobalName: globalName, name, type } = remoteInfo;
switch (type) {
case "esm":
case "module": return loadEsmEntry({
entry,
remoteEntryExports
});
case "system": return loadSystemJsEntry({
entry,
remoteEntryExports
});
default: return loadEntryScript({
entry,
globalName,
name,
remoteInfo,
loaderHook,
getEntryUrl,
resourceContext
});
}
}
async function loadEntryNode({ remoteInfo, loaderHook, resourceContext }) {
const { entry, entryGlobalName: globalName, name, type } = remoteInfo;
const { entryExports: remoteEntryExports } = require_global.getRemoteEntryExports(name, globalName);
if (remoteEntryExports) return remoteEntryExports;
return (0, _module_federation_sdk.loadScriptNode)(entry, {
attrs: {
name,
globalName,
type
},
loaderHook: { createScriptHook: (url, attrs = {}) => {
const res = loaderHook.lifecycle.createScript.emit({
url,
attrs,
remoteInfo,
resourceContext: resourceContext ? {
...resourceContext,
url
} : void 0
});
if (!res) return;
if ("url" in res) return res;
} }
}).then(() => {
return handleRemoteEntryLoaded(name, globalName, entry);
}).catch((e) => {
require_logger.error(`Failed to load Node.js entry for remote "${name}" from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
});
}
function getRemoteEntryUniqueKey(remoteInfo) {
const { entry, name } = remoteInfo;
return (0, _module_federation_sdk.composeKeyWithSeparator)(name, entry);
}
async function getRemoteEntry(params) {
const { origin, remoteEntryExports, remoteInfo, getEntryUrl, resourceContext, _inErrorHandling = false } = params;
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
if (remoteEntryExports) return remoteEntryExports;
if (!require_global.globalLoading[uniqueKey]) {
const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;
const loaderHook = origin.loaderHook;
require_global.globalLoading[uniqueKey] = loadEntryHook.emit({
origin,
loaderHook,
remoteInfo,
remoteEntryExports
}).then((res) => {
if (res) return res;
return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : _module_federation_sdk.isBrowserEnvValue) ? loadEntryDom({
remoteInfo,
remoteEntryExports,
loaderHook,
getEntryUrl,
resourceContext
}) : loadEntryNode({
remoteInfo,
loaderHook,
resourceContext
});
}).then(async (res) => {
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
remoteEntryExports: res
});
return res;
}).catch(async (err) => {
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
const isScriptExecutionError = err instanceof Error && err.message.includes("ScriptExecutionError");
if (err instanceof Error && err.message.includes(_module_federation_error_codes.RUNTIME_008) && !isScriptExecutionError && !_inErrorHandling) {
const wrappedGetRemoteEntry = (params) => {
return getRemoteEntry({
...params,
_inErrorHandling: true
});
};
const RemoteEntryExports = await origin.loaderHook.lifecycle.loadEntryError.emit({
getRemoteEntry: wrappedGetRemoteEntry,
origin,
remoteInfo,
remoteEntryExports,
globalLoading: require_global.globalLoading,
uniqueKey
});
if (RemoteEntryExports) {
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
remoteEntryExports: RemoteEntryExports,
recovered: true
});
return RemoteEntryExports;
}
}
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
error: err
});
throw err;
});
}
return require_global.globalLoading[uniqueKey];
}
function getRemoteInfo(remote) {
return {
...remote,
entry: "entry" in remote ? remote.entry : "",
type: remote.type || require_constant.DEFAULT_REMOTE_TYPE,
entryGlobalName: remote.entryGlobalName || remote.name,
shareScope: remote.shareScope || require_constant.DEFAULT_SCOPE
};
}
//#endregion
exports.getRemoteEntry = getRemoteEntry;
exports.getRemoteEntryUniqueKey = getRemoteEntryUniqueKey;
exports.getRemoteInfo = getRemoteInfo;
//# sourceMappingURL=load.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,16 @@
import { ModuleFederation } from "../core.js";
import { Remote, RemoteEntryExports, RemoteInfo } from "../type/config.js";
import { ResourceLoadContext } from "../type/preload.js";
//#region src/utils/load.d.ts
declare function getRemoteEntry(params: {
origin: ModuleFederation;
remoteInfo: RemoteInfo;
remoteEntryExports?: RemoteEntryExports | undefined;
getEntryUrl?: (url: string) => string;
_inErrorHandling?: boolean;
resourceContext?: ResourceLoadContext;
}): Promise<RemoteEntryExports | false | void>;
declare function getRemoteInfo(remote: Remote): RemoteInfo;
//#endregion
export { getRemoteEntry, getRemoteInfo };
//# sourceMappingURL=load.d.ts.map

View File

@@ -0,0 +1,212 @@
import { error } from "./logger.js";
import { getRemoteEntryExports, globalLoading } from "../global.js";
import { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from "../constant.js";
import { composeKeyWithSeparator, isBrowserEnvValue, loadScript, loadScriptNode } from "@module-federation/sdk";
import { RUNTIME_001, RUNTIME_008, runtimeDescMap } from "@module-federation/error-codes";
//#region src/utils/load.ts
const importCallback = ".then(callbacks[0]).catch(callbacks[1])";
async function loadEsmEntry({ entry, remoteEntryExports }) {
return new Promise((resolve, reject) => {
try {
if (!remoteEntryExports) if (typeof FEDERATION_ALLOW_NEW_FUNCTION !== "undefined") new Function("callbacks", `import("${entry}")${importCallback}`)([resolve, reject]);
else import(
/* webpackIgnore: true */
/* @vite-ignore */
entry
).then(resolve).catch(reject);
else resolve(remoteEntryExports);
} catch (e) {
error(`Failed to load ESM entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
}
});
}
async function loadSystemJsEntry({ entry, remoteEntryExports }) {
return new Promise((resolve, reject) => {
try {
if (!remoteEntryExports) if (typeof __system_context__ === "undefined") System.import(entry).then(resolve).catch(reject);
else new Function("callbacks", `System.import("${entry}")${importCallback}`)([resolve, reject]);
else resolve(remoteEntryExports);
} catch (e) {
error(`Failed to load SystemJS entry from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
}
});
}
function handleRemoteEntryLoaded(name, globalName, entry) {
const { remoteEntryKey, entryExports } = getRemoteEntryExports(name, globalName);
if (!entryExports) error(RUNTIME_001, runtimeDescMap, {
remoteName: name,
remoteEntryUrl: entry,
remoteEntryKey
});
return entryExports;
}
async function loadEntryScript({ name, globalName, entry, remoteInfo, loaderHook, getEntryUrl, resourceContext }) {
const { entryExports: remoteEntryExports } = getRemoteEntryExports(name, globalName);
if (remoteEntryExports) return remoteEntryExports;
const url = getEntryUrl ? getEntryUrl(entry) : entry;
return loadScript(url, {
attrs: {},
createScriptHook: (url, attrs) => {
const res = loaderHook.lifecycle.createScript.emit({
url,
attrs,
remoteInfo,
resourceContext: resourceContext ? {
...resourceContext,
url
} : void 0
});
if (!res) return;
if (res instanceof HTMLScriptElement) return res;
if ("script" in res || "timeout" in res) return res;
}
}).then(() => {
return handleRemoteEntryLoaded(name, globalName, entry);
}, (loadError) => {
const originalMsg = loadError instanceof Error ? loadError.message : String(loadError);
error(RUNTIME_008, runtimeDescMap, {
remoteName: name,
resourceUrl: url
}, originalMsg);
});
}
async function loadEntryDom({ remoteInfo, remoteEntryExports, loaderHook, getEntryUrl, resourceContext }) {
const { entry, entryGlobalName: globalName, name, type } = remoteInfo;
switch (type) {
case "esm":
case "module": return loadEsmEntry({
entry,
remoteEntryExports
});
case "system": return loadSystemJsEntry({
entry,
remoteEntryExports
});
default: return loadEntryScript({
entry,
globalName,
name,
remoteInfo,
loaderHook,
getEntryUrl,
resourceContext
});
}
}
async function loadEntryNode({ remoteInfo, loaderHook, resourceContext }) {
const { entry, entryGlobalName: globalName, name, type } = remoteInfo;
const { entryExports: remoteEntryExports } = getRemoteEntryExports(name, globalName);
if (remoteEntryExports) return remoteEntryExports;
return loadScriptNode(entry, {
attrs: {
name,
globalName,
type
},
loaderHook: { createScriptHook: (url, attrs = {}) => {
const res = loaderHook.lifecycle.createScript.emit({
url,
attrs,
remoteInfo,
resourceContext: resourceContext ? {
...resourceContext,
url
} : void 0
});
if (!res) return;
if ("url" in res) return res;
} }
}).then(() => {
return handleRemoteEntryLoaded(name, globalName, entry);
}).catch((e) => {
error(`Failed to load Node.js entry for remote "${name}" from "${entry}". ${e instanceof Error ? e.message : String(e)}`);
});
}
function getRemoteEntryUniqueKey(remoteInfo) {
const { entry, name } = remoteInfo;
return composeKeyWithSeparator(name, entry);
}
async function getRemoteEntry(params) {
const { origin, remoteEntryExports, remoteInfo, getEntryUrl, resourceContext, _inErrorHandling = false } = params;
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
if (remoteEntryExports) return remoteEntryExports;
if (!globalLoading[uniqueKey]) {
const loadEntryHook = origin.remoteHandler.hooks.lifecycle.loadEntry;
const loaderHook = origin.loaderHook;
globalLoading[uniqueKey] = loadEntryHook.emit({
origin,
loaderHook,
remoteInfo,
remoteEntryExports
}).then((res) => {
if (res) return res;
return (typeof ENV_TARGET !== "undefined" ? ENV_TARGET === "web" : isBrowserEnvValue) ? loadEntryDom({
remoteInfo,
remoteEntryExports,
loaderHook,
getEntryUrl,
resourceContext
}) : loadEntryNode({
remoteInfo,
loaderHook,
resourceContext
});
}).then(async (res) => {
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
remoteEntryExports: res
});
return res;
}).catch(async (err) => {
const uniqueKey = getRemoteEntryUniqueKey(remoteInfo);
const isScriptExecutionError = err instanceof Error && err.message.includes("ScriptExecutionError");
if (err instanceof Error && err.message.includes(RUNTIME_008) && !isScriptExecutionError && !_inErrorHandling) {
const wrappedGetRemoteEntry = (params) => {
return getRemoteEntry({
...params,
_inErrorHandling: true
});
};
const RemoteEntryExports = await origin.loaderHook.lifecycle.loadEntryError.emit({
getRemoteEntry: wrappedGetRemoteEntry,
origin,
remoteInfo,
remoteEntryExports,
globalLoading,
uniqueKey
});
if (RemoteEntryExports) {
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
remoteEntryExports: RemoteEntryExports,
recovered: true
});
return RemoteEntryExports;
}
}
await origin.loaderHook.lifecycle.afterLoadEntry.emit({
origin,
remoteInfo,
error: err
});
throw err;
});
}
return globalLoading[uniqueKey];
}
function getRemoteInfo(remote) {
return {
...remote,
entry: "entry" in remote ? remote.entry : "",
type: remote.type || DEFAULT_REMOTE_TYPE,
entryGlobalName: remote.entryGlobalName || remote.name,
shareScope: remote.shareScope || DEFAULT_SCOPE
};
}
//#endregion
export { getRemoteEntry, getRemoteEntryUniqueKey, getRemoteInfo };
//# sourceMappingURL=load.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
let _module_federation_sdk = require("@module-federation/sdk");
let _module_federation_error_codes_browser = require("@module-federation/error-codes/browser");
//#region src/utils/logger.ts
const LOG_CATEGORY = "[ Federation Runtime ]";
const logger = (0, _module_federation_sdk.createLogger)(LOG_CATEGORY);
function assert(condition, msgOrCode, descMap, args, context) {
if (!condition) if (descMap !== void 0) error(msgOrCode, descMap, args, void 0, context);
else error(msgOrCode);
}
function error(msgOrCode, descMap, args, originalErrorMsg, context) {
if (descMap !== void 0) return (0, _module_federation_error_codes_browser.logAndReport)(msgOrCode, descMap, args ?? {}, (msg) => {
throw new Error(`${LOG_CATEGORY}: ${msg}`);
}, originalErrorMsg, context);
const msg = msgOrCode;
if (msg instanceof Error) {
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
throw msg;
}
throw new Error(`${LOG_CATEGORY}: ${msg}`);
}
function warn(msg) {
if (msg instanceof Error) {
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
logger.warn(msg);
} else logger.warn(msg);
}
//#endregion
exports.assert = assert;
exports.error = error;
exports.logger = logger;
exports.warn = warn;
//# sourceMappingURL=logger.cjs.map

View File

@@ -0,0 +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"}

View File

@@ -0,0 +1,10 @@
import { MFContext } from "@module-federation/error-codes";
//#region src/utils/logger.d.ts
declare function assert(condition: any, msg: string): asserts condition;
declare function assert(condition: any, code: string, descMap: Record<string, string>, args?: Record<string, unknown>, context?: Partial<MFContext>): asserts condition;
declare function error(msg: string | Error | unknown): never;
declare function error(code: string, descMap: Record<string, string>, args?: Record<string, unknown>, originalErrorMsg?: string, context?: Partial<MFContext>): never;
//#endregion
export { assert, error };
//# sourceMappingURL=logger.d.ts.map

View File

@@ -0,0 +1,31 @@
import { createLogger } from "@module-federation/sdk";
import { logAndReport } from "@module-federation/error-codes/browser";
//#region src/utils/logger.ts
const LOG_CATEGORY = "[ Federation Runtime ]";
const logger = createLogger(LOG_CATEGORY);
function assert(condition, msgOrCode, descMap, args, context) {
if (!condition) if (descMap !== void 0) error(msgOrCode, descMap, args, void 0, context);
else error(msgOrCode);
}
function error(msgOrCode, descMap, args, originalErrorMsg, context) {
if (descMap !== void 0) return logAndReport(msgOrCode, descMap, args ?? {}, (msg) => {
throw new Error(`${LOG_CATEGORY}: ${msg}`);
}, originalErrorMsg, context);
const msg = msgOrCode;
if (msg instanceof Error) {
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
throw msg;
}
throw new Error(`${LOG_CATEGORY}: ${msg}`);
}
function warn$1(msg) {
if (msg instanceof Error) {
if (!msg.message.startsWith(LOG_CATEGORY)) msg.message = `${LOG_CATEGORY}: ${msg.message}`;
logger.warn(msg);
} else logger.warn(msg);
}
//#endregion
export { assert, error, logger, warn$1 as warn };
//# sourceMappingURL=logger.js.map

View File

@@ -0,0 +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"}

View File

@@ -0,0 +1,56 @@
//#region src/utils/manifest.ts
function composeRemoteRequestId(remoteName, expose) {
if (!expose || expose === ".") return remoteName;
return `${remoteName}/${expose.replace(/^\.\//, "")}`;
}
function matchRemoteWithNameAndExpose(remotes, id) {
for (const remote of remotes) {
const isNameMatched = id.startsWith(remote.name);
let expose = id.replace(remote.name, "");
if (isNameMatched) {
if (expose.startsWith("/")) {
const pkgNameOrAlias = remote.name;
expose = `.${expose}`;
return {
pkgNameOrAlias,
expose,
remote
};
} else if (expose === "") return {
pkgNameOrAlias: remote.name,
expose: ".",
remote
};
}
const isAliasMatched = remote.alias && id.startsWith(remote.alias);
let exposeWithAlias = remote.alias && id.replace(remote.alias, "");
if (remote.alias && isAliasMatched) {
if (exposeWithAlias && exposeWithAlias.startsWith("/")) {
const pkgNameOrAlias = remote.alias;
exposeWithAlias = `.${exposeWithAlias}`;
return {
pkgNameOrAlias,
expose: exposeWithAlias,
remote
};
} else if (exposeWithAlias === "") return {
pkgNameOrAlias: remote.alias,
expose: ".",
remote
};
}
}
}
function matchRemote(remotes, nameOrAlias) {
for (const remote of remotes) {
if (nameOrAlias === remote.name) return remote;
if (remote.alias && nameOrAlias === remote.alias) return remote;
}
}
//#endregion
exports.composeRemoteRequestId = composeRemoteRequestId;
exports.matchRemote = matchRemote;
exports.matchRemoteWithNameAndExpose = matchRemoteWithNameAndExpose;
//# sourceMappingURL=manifest.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"manifest.cjs","names":[],"sources":["../../src/utils/manifest.ts"],"sourcesContent":["import { Remote } from '../type';\n\nexport function composeRemoteRequestId(\n remoteName: string,\n expose?: string,\n): string {\n if (!expose || expose === '.') {\n return remoteName;\n }\n\n return `${remoteName}/${expose.replace(/^\\.\\//, '')}`;\n}\n\n// Function to match a remote with its name and expose\n// id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n// id: alias(app1) + expose(button) = app1/button\n// id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\nexport function matchRemoteWithNameAndExpose(\n remotes: Array<Remote>,\n id: string,\n):\n | {\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n }\n | undefined {\n for (const remote of remotes) {\n // match pkgName\n const isNameMatched = id.startsWith(remote.name);\n let expose = id.replace(remote.name, '');\n if (isNameMatched) {\n if (expose.startsWith('/')) {\n const pkgNameOrAlias = remote.name;\n expose = `.${expose}`;\n return {\n pkgNameOrAlias,\n expose,\n remote,\n };\n } else if (expose === '') {\n return {\n pkgNameOrAlias: remote.name,\n expose: '.',\n remote,\n };\n }\n }\n\n // match alias\n const isAliasMatched = remote.alias && id.startsWith(remote.alias);\n let exposeWithAlias = remote.alias && id.replace(remote.alias, '');\n if (remote.alias && isAliasMatched) {\n if (exposeWithAlias && exposeWithAlias.startsWith('/')) {\n const pkgNameOrAlias = remote.alias;\n exposeWithAlias = `.${exposeWithAlias}`;\n return {\n pkgNameOrAlias,\n expose: exposeWithAlias,\n remote,\n };\n } else if (exposeWithAlias === '') {\n return {\n pkgNameOrAlias: remote.alias,\n expose: '.',\n remote,\n };\n }\n }\n }\n\n return;\n}\n\n// Function to match a remote with its name or alias\nexport function matchRemote(\n remotes: Array<Remote>,\n nameOrAlias: string,\n): Remote | undefined {\n for (const remote of remotes) {\n const isNameMatched = nameOrAlias === remote.name;\n if (isNameMatched) {\n return remote;\n }\n\n const isAliasMatched = remote.alias && nameOrAlias === remote.alias;\n if (isAliasMatched) {\n return remote;\n }\n }\n return;\n}\n"],"mappings":";;AAEA,SAAgB,uBACd,YACA,QACQ;AACR,KAAI,CAAC,UAAU,WAAW,IACxB,QAAO;AAGT,QAAO,GAAG,WAAW,GAAG,OAAO,QAAQ,SAAS,GAAG;;AAOrD,SAAgB,6BACd,SACA,IAOY;AACZ,MAAK,MAAM,UAAU,SAAS;EAE5B,MAAM,gBAAgB,GAAG,WAAW,OAAO,KAAK;EAChD,IAAI,SAAS,GAAG,QAAQ,OAAO,MAAM,GAAG;AACxC,MAAI,eACF;OAAI,OAAO,WAAW,IAAI,EAAE;IAC1B,MAAM,iBAAiB,OAAO;AAC9B,aAAS,IAAI;AACb,WAAO;KACL;KACA;KACA;KACD;cACQ,WAAW,GACpB,QAAO;IACL,gBAAgB,OAAO;IACvB,QAAQ;IACR;IACD;;EAKL,MAAM,iBAAiB,OAAO,SAAS,GAAG,WAAW,OAAO,MAAM;EAClE,IAAI,kBAAkB,OAAO,SAAS,GAAG,QAAQ,OAAO,OAAO,GAAG;AAClE,MAAI,OAAO,SAAS,gBAClB;OAAI,mBAAmB,gBAAgB,WAAW,IAAI,EAAE;IACtD,MAAM,iBAAiB,OAAO;AAC9B,sBAAkB,IAAI;AACtB,WAAO;KACL;KACA,QAAQ;KACR;KACD;cACQ,oBAAoB,GAC7B,QAAO;IACL,gBAAgB,OAAO;IACvB,QAAQ;IACR;IACD;;;;AAST,SAAgB,YACd,SACA,aACoB;AACpB,MAAK,MAAM,UAAU,SAAS;AAE5B,MADsB,gBAAgB,OAAO,KAE3C,QAAO;AAIT,MADuB,OAAO,SAAS,gBAAgB,OAAO,MAE5D,QAAO"}

View File

@@ -0,0 +1,10 @@
import { Remote } from "../type/config.js";
//#region src/utils/manifest.d.ts
declare function matchRemoteWithNameAndExpose(remotes: Array<Remote>, id: string): {
pkgNameOrAlias: string;
expose: string;
remote: Remote;
} | undefined;
//#endregion
export { matchRemoteWithNameAndExpose };
//# sourceMappingURL=manifest.d.ts.map

View File

@@ -0,0 +1,53 @@
//#region src/utils/manifest.ts
function composeRemoteRequestId(remoteName, expose) {
if (!expose || expose === ".") return remoteName;
return `${remoteName}/${expose.replace(/^\.\//, "")}`;
}
function matchRemoteWithNameAndExpose(remotes, id) {
for (const remote of remotes) {
const isNameMatched = id.startsWith(remote.name);
let expose = id.replace(remote.name, "");
if (isNameMatched) {
if (expose.startsWith("/")) {
const pkgNameOrAlias = remote.name;
expose = `.${expose}`;
return {
pkgNameOrAlias,
expose,
remote
};
} else if (expose === "") return {
pkgNameOrAlias: remote.name,
expose: ".",
remote
};
}
const isAliasMatched = remote.alias && id.startsWith(remote.alias);
let exposeWithAlias = remote.alias && id.replace(remote.alias, "");
if (remote.alias && isAliasMatched) {
if (exposeWithAlias && exposeWithAlias.startsWith("/")) {
const pkgNameOrAlias = remote.alias;
exposeWithAlias = `.${exposeWithAlias}`;
return {
pkgNameOrAlias,
expose: exposeWithAlias,
remote
};
} else if (exposeWithAlias === "") return {
pkgNameOrAlias: remote.alias,
expose: ".",
remote
};
}
}
}
function matchRemote(remotes, nameOrAlias) {
for (const remote of remotes) {
if (nameOrAlias === remote.name) return remote;
if (remote.alias && nameOrAlias === remote.alias) return remote;
}
}
//#endregion
export { composeRemoteRequestId, matchRemote, matchRemoteWithNameAndExpose };
//# sourceMappingURL=manifest.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"manifest.js","names":[],"sources":["../../src/utils/manifest.ts"],"sourcesContent":["import { Remote } from '../type';\n\nexport function composeRemoteRequestId(\n remoteName: string,\n expose?: string,\n): string {\n if (!expose || expose === '.') {\n return remoteName;\n }\n\n return `${remoteName}/${expose.replace(/^\\.\\//, '')}`;\n}\n\n// Function to match a remote with its name and expose\n// id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n// id: alias(app1) + expose(button) = app1/button\n// id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\nexport function matchRemoteWithNameAndExpose(\n remotes: Array<Remote>,\n id: string,\n):\n | {\n pkgNameOrAlias: string;\n expose: string;\n remote: Remote;\n }\n | undefined {\n for (const remote of remotes) {\n // match pkgName\n const isNameMatched = id.startsWith(remote.name);\n let expose = id.replace(remote.name, '');\n if (isNameMatched) {\n if (expose.startsWith('/')) {\n const pkgNameOrAlias = remote.name;\n expose = `.${expose}`;\n return {\n pkgNameOrAlias,\n expose,\n remote,\n };\n } else if (expose === '') {\n return {\n pkgNameOrAlias: remote.name,\n expose: '.',\n remote,\n };\n }\n }\n\n // match alias\n const isAliasMatched = remote.alias && id.startsWith(remote.alias);\n let exposeWithAlias = remote.alias && id.replace(remote.alias, '');\n if (remote.alias && isAliasMatched) {\n if (exposeWithAlias && exposeWithAlias.startsWith('/')) {\n const pkgNameOrAlias = remote.alias;\n exposeWithAlias = `.${exposeWithAlias}`;\n return {\n pkgNameOrAlias,\n expose: exposeWithAlias,\n remote,\n };\n } else if (exposeWithAlias === '') {\n return {\n pkgNameOrAlias: remote.alias,\n expose: '.',\n remote,\n };\n }\n }\n }\n\n return;\n}\n\n// Function to match a remote with its name or alias\nexport function matchRemote(\n remotes: Array<Remote>,\n nameOrAlias: string,\n): Remote | undefined {\n for (const remote of remotes) {\n const isNameMatched = nameOrAlias === remote.name;\n if (isNameMatched) {\n return remote;\n }\n\n const isAliasMatched = remote.alias && nameOrAlias === remote.alias;\n if (isAliasMatched) {\n return remote;\n }\n }\n return;\n}\n"],"mappings":";AAEA,SAAgB,uBACd,YACA,QACQ;AACR,KAAI,CAAC,UAAU,WAAW,IACxB,QAAO;AAGT,QAAO,GAAG,WAAW,GAAG,OAAO,QAAQ,SAAS,GAAG;;AAOrD,SAAgB,6BACd,SACA,IAOY;AACZ,MAAK,MAAM,UAAU,SAAS;EAE5B,MAAM,gBAAgB,GAAG,WAAW,OAAO,KAAK;EAChD,IAAI,SAAS,GAAG,QAAQ,OAAO,MAAM,GAAG;AACxC,MAAI,eACF;OAAI,OAAO,WAAW,IAAI,EAAE;IAC1B,MAAM,iBAAiB,OAAO;AAC9B,aAAS,IAAI;AACb,WAAO;KACL;KACA;KACA;KACD;cACQ,WAAW,GACpB,QAAO;IACL,gBAAgB,OAAO;IACvB,QAAQ;IACR;IACD;;EAKL,MAAM,iBAAiB,OAAO,SAAS,GAAG,WAAW,OAAO,MAAM;EAClE,IAAI,kBAAkB,OAAO,SAAS,GAAG,QAAQ,OAAO,OAAO,GAAG;AAClE,MAAI,OAAO,SAAS,gBAClB;OAAI,mBAAmB,gBAAgB,WAAW,IAAI,EAAE;IACtD,MAAM,iBAAiB,OAAO;AAC9B,sBAAkB,IAAI;AACtB,WAAO;KACL;KACA,QAAQ;KACR;KACD;cACQ,oBAAoB,GAC7B,QAAO;IACL,gBAAgB,OAAO;IACvB,QAAQ;IACR;IACD;;;;AAST,SAAgB,YACd,SACA,aACoB;AACpB,MAAK,MAAM,UAAU,SAAS;AAE5B,MADsB,gBAAgB,OAAO,KAE3C,QAAO;AAIT,MADuB,OAAO,SAAS,gBAAgB,OAAO,MAE5D,QAAO"}

View File

@@ -0,0 +1,27 @@
const require_global = require('../global.cjs');
//#region src/utils/plugin.ts
function registerPlugins(plugins, instance) {
const globalPlugins = require_global.getGlobalHostPlugins();
const hookInstances = [
instance.hooks,
instance.remoteHandler.hooks,
instance.sharedHandler.hooks,
instance.snapshotHandler.hooks,
instance.loaderHook,
instance.bridgeHook
];
if (globalPlugins.length > 0) globalPlugins.forEach((plugin) => {
if (plugins?.find((item) => item.name !== plugin.name)) plugins.push(plugin);
});
if (plugins && plugins.length > 0) plugins.forEach((plugin) => {
hookInstances.forEach((hookInstance) => {
hookInstance.applyPlugin(plugin, instance);
});
});
return plugins;
}
//#endregion
exports.registerPlugins = registerPlugins;
//# sourceMappingURL=plugin.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"plugin.cjs","names":["getGlobalHostPlugins"],"sources":["../../src/utils/plugin.ts"],"sourcesContent":["import { ModuleFederation } from '../core';\nimport { UserOptions } from '../type';\nimport { getGlobalHostPlugins } from '../global';\n\nexport function registerPlugins(\n plugins: UserOptions['plugins'],\n instance: ModuleFederation,\n) {\n const globalPlugins = getGlobalHostPlugins();\n const hookInstances = [\n instance.hooks,\n instance.remoteHandler.hooks,\n instance.sharedHandler.hooks,\n instance.snapshotHandler.hooks,\n instance.loaderHook,\n instance.bridgeHook,\n ];\n // Incorporate global plugins\n if (globalPlugins.length > 0) {\n globalPlugins.forEach((plugin) => {\n if (plugins?.find((item) => item.name !== plugin.name)) {\n plugins.push(plugin);\n }\n });\n }\n\n if (plugins && plugins.length > 0) {\n plugins.forEach((plugin) => {\n hookInstances.forEach((hookInstance) => {\n hookInstance.applyPlugin(plugin, instance);\n });\n });\n }\n return plugins;\n}\n"],"mappings":";;;AAIA,SAAgB,gBACd,SACA,UACA;CACA,MAAM,gBAAgBA,qCAAsB;CAC5C,MAAM,gBAAgB;EACpB,SAAS;EACT,SAAS,cAAc;EACvB,SAAS,cAAc;EACvB,SAAS,gBAAgB;EACzB,SAAS;EACT,SAAS;EACV;AAED,KAAI,cAAc,SAAS,EACzB,eAAc,SAAS,WAAW;AAChC,MAAI,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO,KAAK,CACpD,SAAQ,KAAK,OAAO;GAEtB;AAGJ,KAAI,WAAW,QAAQ,SAAS,EAC9B,SAAQ,SAAS,WAAW;AAC1B,gBAAc,SAAS,iBAAiB;AACtC,gBAAa,YAAY,QAAQ,SAAS;IAC1C;GACF;AAEJ,QAAO"}

View File

@@ -0,0 +1 @@
export { };

View File

@@ -0,0 +1,27 @@
import { getGlobalHostPlugins } from "../global.js";
//#region src/utils/plugin.ts
function registerPlugins(plugins, instance) {
const globalPlugins = getGlobalHostPlugins();
const hookInstances = [
instance.hooks,
instance.remoteHandler.hooks,
instance.sharedHandler.hooks,
instance.snapshotHandler.hooks,
instance.loaderHook,
instance.bridgeHook
];
if (globalPlugins.length > 0) globalPlugins.forEach((plugin) => {
if (plugins?.find((item) => item.name !== plugin.name)) plugins.push(plugin);
});
if (plugins && plugins.length > 0) plugins.forEach((plugin) => {
hookInstances.forEach((hookInstance) => {
hookInstance.applyPlugin(plugin, instance);
});
});
return plugins;
}
//#endregion
export { registerPlugins };
//# sourceMappingURL=plugin.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"plugin.js","names":[],"sources":["../../src/utils/plugin.ts"],"sourcesContent":["import { ModuleFederation } from '../core';\nimport { UserOptions } from '../type';\nimport { getGlobalHostPlugins } from '../global';\n\nexport function registerPlugins(\n plugins: UserOptions['plugins'],\n instance: ModuleFederation,\n) {\n const globalPlugins = getGlobalHostPlugins();\n const hookInstances = [\n instance.hooks,\n instance.remoteHandler.hooks,\n instance.sharedHandler.hooks,\n instance.snapshotHandler.hooks,\n instance.loaderHook,\n instance.bridgeHook,\n ];\n // Incorporate global plugins\n if (globalPlugins.length > 0) {\n globalPlugins.forEach((plugin) => {\n if (plugins?.find((item) => item.name !== plugin.name)) {\n plugins.push(plugin);\n }\n });\n }\n\n if (plugins && plugins.length > 0) {\n plugins.forEach((plugin) => {\n hookInstances.forEach((hookInstance) => {\n hookInstance.applyPlugin(plugin, instance);\n });\n });\n }\n return plugins;\n}\n"],"mappings":";;;AAIA,SAAgB,gBACd,SACA,UACA;CACA,MAAM,gBAAgB,sBAAsB;CAC5C,MAAM,gBAAgB;EACpB,SAAS;EACT,SAAS,cAAc;EACvB,SAAS,cAAc;EACvB,SAAS,gBAAgB;EACzB,SAAS;EACT,SAAS;EACV;AAED,KAAI,cAAc,SAAS,EACzB,eAAc,SAAS,WAAW;AAChC,MAAI,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO,KAAK,CACpD,SAAQ,KAAK,OAAO;GAEtB;AAGJ,KAAI,WAAW,QAAQ,SAAS,EAC9B,SAAQ,SAAS,WAAW;AAC1B,gBAAc,SAAS,iBAAiB;AACtC,gBAAa,YAAY,QAAQ,SAAS;IAC1C;GACF;AAEJ,QAAO"}

View File

@@ -0,0 +1,212 @@
const require_logger = require('./logger.cjs');
const require_manifest = require('./manifest.cjs');
const require_load = require('./load.cjs');
let _module_federation_sdk = require("@module-federation/sdk");
//#region src/utils/preload.ts
function defaultPreloadArgs(preloadConfig) {
return {
resourceCategory: "sync",
share: true,
depsRemote: true,
...preloadConfig
};
}
function formatPreloadArgs(remotes, preloadArgs) {
return preloadArgs.map((args) => {
const remoteInfo = require_manifest.matchRemote(remotes, args.nameOrAlias);
require_logger.assert(remoteInfo, `Unable to preload ${args.nameOrAlias} as it is not included in ${!remoteInfo && (0, _module_federation_sdk.safeToString)({
remoteInfo,
remotes
})}`);
return {
remote: remoteInfo,
preloadConfig: defaultPreloadArgs(args)
};
});
}
function normalizePreloadExposes(exposes) {
if (!exposes) return [];
return exposes.map((expose) => {
if (expose === ".") return expose;
if (expose.startsWith("./")) return expose.replace("./", "");
return expose;
});
}
function isTimeoutError(error) {
if (!(error instanceof Error)) return false;
return error.message.includes("timed out") || error.name.includes("Timeout");
}
function createAssetResult(context, url, status, error) {
return {
url,
status,
resourceType: context.resourceType,
initiator: context.initiator,
id: context.id,
error
};
}
async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
const url = entryRemoteInfo.entry;
if (cachedRemote?.remoteEntryExports) return createAssetResult(context, url, "cached");
try {
if (!await require_load.getRemoteEntry({
origin: host,
remoteInfo: entryRemoteInfo,
remoteEntryExports: cachedRemote?.remoteEntryExports,
resourceContext: {
...context,
url
}
})) throw new Error(`Failed to load remoteEntry "${url}".`);
return createAssetResult(context, url, "success");
} catch (error) {
return createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error);
}
}
function waitForLinkPreload({ host, remoteInfo, url, attrs, context, needDeleteLink }) {
return new Promise((resolve) => {
const { link, needAttach } = (0, _module_federation_sdk.createLink)({
url,
cb: () => {
resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
},
onErrorCallback: (error) => {
resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
},
attrs,
createLinkHook: (hookUrl, hookAttrs) => {
const res = host.loaderHook.lifecycle.createLink.emit({
url: hookUrl,
attrs: hookAttrs,
remoteInfo,
resourceContext: {
...context,
url: hookUrl
}
});
if (res instanceof HTMLLinkElement) return res;
return res;
},
needDeleteLink
});
needAttach && document.head.appendChild(link);
});
}
function waitForScriptPreload({ host, remoteInfo, url, attrs, context }) {
return new Promise((resolve) => {
const { script, needAttach } = (0, _module_federation_sdk.createScript)({
url,
cb: () => {
resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
},
onErrorCallback: (error) => {
resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
},
attrs,
createScriptHook: (hookUrl, hookAttrs) => {
const res = host.loaderHook.lifecycle.createScript.emit({
url: hookUrl,
attrs: hookAttrs,
remoteInfo,
resourceContext: {
...context,
url: hookUrl
}
});
if (res instanceof HTMLScriptElement) return res;
return res;
},
needDeleteScript: true
});
needAttach && document.head.appendChild(script);
});
}
function createResourceContext(baseContext, resourceType) {
return {
...baseContext,
resourceType
};
}
function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
initiator: "preloadRemote",
id: remoteInfo.name
}) {
const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
const results = [];
if (host.options.inBrowser) {
entryAssets.forEach((asset) => {
const { moduleInfo: entryRemoteInfo } = asset;
results.push(waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, createResourceContext(baseContext, "remoteEntry")));
});
if (useLinkPreload) {
const defaultAttrs = {
rel: "preload",
as: "style"
};
cssAssets.forEach((cssUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: cssUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "css")
}));
});
} else {
const defaultAttrs = {
rel: "stylesheet",
type: "text/css"
};
cssAssets.forEach((cssUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: cssUrl,
attrs: defaultAttrs,
needDeleteLink: false,
context: createResourceContext(baseContext, "css")
}));
});
}
if (useLinkPreload) {
const defaultAttrs = {
rel: "preload",
as: "script"
};
jsAssetsWithoutEntry.forEach((jsUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: jsUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "js")
}));
});
} else {
const defaultAttrs = {
fetchpriority: "high",
type: remoteInfo?.type === "module" ? "module" : "text/javascript"
};
jsAssetsWithoutEntry.forEach((jsUrl) => {
results.push(waitForScriptPreload({
host,
remoteInfo,
url: jsUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "js")
}));
});
}
}
return Promise.all(results);
}
//#endregion
exports.defaultPreloadArgs = defaultPreloadArgs;
exports.formatPreloadArgs = formatPreloadArgs;
exports.normalizePreloadExposes = normalizePreloadExposes;
exports.preloadAssets = preloadAssets;
//# sourceMappingURL=preload.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
import { ModuleFederation } from "../core.js";
import { RemoteInfo } from "../type/config.js";
import { PreloadAssetResult, PreloadAssets, ResourceLoadContext } from "../type/preload.js";
//#region src/utils/preload.d.ts
declare function preloadAssets(remoteInfo: RemoteInfo, host: ModuleFederation, assets: PreloadAssets, useLinkPreload?: boolean, baseContext?: Omit<ResourceLoadContext, 'resourceType'>): Promise<PreloadAssetResult[]>;
//#endregion
export { preloadAssets };
//# sourceMappingURL=preload.d.ts.map

View File

@@ -0,0 +1,209 @@
import { assert } from "./logger.js";
import { matchRemote } from "./manifest.js";
import { getRemoteEntry } from "./load.js";
import { createLink, createScript, safeToString } from "@module-federation/sdk";
//#region src/utils/preload.ts
function defaultPreloadArgs(preloadConfig) {
return {
resourceCategory: "sync",
share: true,
depsRemote: true,
...preloadConfig
};
}
function formatPreloadArgs(remotes, preloadArgs) {
return preloadArgs.map((args) => {
const remoteInfo = matchRemote(remotes, args.nameOrAlias);
assert(remoteInfo, `Unable to preload ${args.nameOrAlias} as it is not included in ${!remoteInfo && safeToString({
remoteInfo,
remotes
})}`);
return {
remote: remoteInfo,
preloadConfig: defaultPreloadArgs(args)
};
});
}
function normalizePreloadExposes(exposes) {
if (!exposes) return [];
return exposes.map((expose) => {
if (expose === ".") return expose;
if (expose.startsWith("./")) return expose.replace("./", "");
return expose;
});
}
function isTimeoutError(error) {
if (!(error instanceof Error)) return false;
return error.message.includes("timed out") || error.name.includes("Timeout");
}
function createAssetResult(context, url, status, error) {
return {
url,
status,
resourceType: context.resourceType,
initiator: context.initiator,
id: context.id,
error
};
}
async function waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, context) {
const cachedRemote = host.moduleCache.get(entryRemoteInfo.name);
const url = entryRemoteInfo.entry;
if (cachedRemote?.remoteEntryExports) return createAssetResult(context, url, "cached");
try {
if (!await getRemoteEntry({
origin: host,
remoteInfo: entryRemoteInfo,
remoteEntryExports: cachedRemote?.remoteEntryExports,
resourceContext: {
...context,
url
}
})) throw new Error(`Failed to load remoteEntry "${url}".`);
return createAssetResult(context, url, "success");
} catch (error) {
return createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error);
}
}
function waitForLinkPreload({ host, remoteInfo, url, attrs, context, needDeleteLink }) {
return new Promise((resolve) => {
const { link, needAttach } = createLink({
url,
cb: () => {
resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
},
onErrorCallback: (error) => {
resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
},
attrs,
createLinkHook: (hookUrl, hookAttrs) => {
const res = host.loaderHook.lifecycle.createLink.emit({
url: hookUrl,
attrs: hookAttrs,
remoteInfo,
resourceContext: {
...context,
url: hookUrl
}
});
if (res instanceof HTMLLinkElement) return res;
return res;
},
needDeleteLink
});
needAttach && document.head.appendChild(link);
});
}
function waitForScriptPreload({ host, remoteInfo, url, attrs, context }) {
return new Promise((resolve) => {
const { script, needAttach } = createScript({
url,
cb: () => {
resolve(createAssetResult(context, url, needAttach ? "success" : "cached"));
},
onErrorCallback: (error) => {
resolve(createAssetResult(context, url, isTimeoutError(error) ? "timeout" : "error", error));
},
attrs,
createScriptHook: (hookUrl, hookAttrs) => {
const res = host.loaderHook.lifecycle.createScript.emit({
url: hookUrl,
attrs: hookAttrs,
remoteInfo,
resourceContext: {
...context,
url: hookUrl
}
});
if (res instanceof HTMLScriptElement) return res;
return res;
},
needDeleteScript: true
});
needAttach && document.head.appendChild(script);
});
}
function createResourceContext(baseContext, resourceType) {
return {
...baseContext,
resourceType
};
}
function preloadAssets(remoteInfo, host, assets, useLinkPreload = true, baseContext = {
initiator: "preloadRemote",
id: remoteInfo.name
}) {
const { cssAssets, jsAssetsWithoutEntry, entryAssets } = assets;
const results = [];
if (host.options.inBrowser) {
entryAssets.forEach((asset) => {
const { moduleInfo: entryRemoteInfo } = asset;
results.push(waitForRemoteEntryPreload(host, remoteInfo, entryRemoteInfo, createResourceContext(baseContext, "remoteEntry")));
});
if (useLinkPreload) {
const defaultAttrs = {
rel: "preload",
as: "style"
};
cssAssets.forEach((cssUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: cssUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "css")
}));
});
} else {
const defaultAttrs = {
rel: "stylesheet",
type: "text/css"
};
cssAssets.forEach((cssUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: cssUrl,
attrs: defaultAttrs,
needDeleteLink: false,
context: createResourceContext(baseContext, "css")
}));
});
}
if (useLinkPreload) {
const defaultAttrs = {
rel: "preload",
as: "script"
};
jsAssetsWithoutEntry.forEach((jsUrl) => {
results.push(waitForLinkPreload({
host,
remoteInfo,
url: jsUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "js")
}));
});
} else {
const defaultAttrs = {
fetchpriority: "high",
type: remoteInfo?.type === "module" ? "module" : "text/javascript"
};
jsAssetsWithoutEntry.forEach((jsUrl) => {
results.push(waitForScriptPreload({
host,
remoteInfo,
url: jsUrl,
attrs: defaultAttrs,
context: createResourceContext(baseContext, "js")
}));
});
}
}
return Promise.all(results);
}
//#endregion
export { defaultPreloadArgs, formatPreloadArgs, normalizePreloadExposes, preloadAssets };
//# sourceMappingURL=preload.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,48 @@
//#region src/utils/semver/compare.ts
function compareAtom(rangeAtom, versionAtom) {
rangeAtom = Number(rangeAtom) || rangeAtom;
versionAtom = Number(versionAtom) || versionAtom;
if (rangeAtom > versionAtom) return 1;
if (rangeAtom === versionAtom) return 0;
return -1;
}
function comparePreRelease(rangeAtom, versionAtom) {
const { preRelease: rangePreRelease } = rangeAtom;
const { preRelease: versionPreRelease } = versionAtom;
if (rangePreRelease === void 0 && Boolean(versionPreRelease)) return 1;
if (Boolean(rangePreRelease) && versionPreRelease === void 0) return -1;
if (rangePreRelease === void 0 && versionPreRelease === void 0) return 0;
for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
const rangeElement = rangePreRelease[i];
const versionElement = versionPreRelease[i];
if (rangeElement === versionElement) continue;
if (rangeElement === void 0 && versionElement === void 0) return 0;
if (!rangeElement) return 1;
if (!versionElement) return -1;
return compareAtom(rangeElement, versionElement);
}
return 0;
}
function compareVersion(rangeAtom, versionAtom) {
return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom);
}
function eq(rangeAtom, versionAtom) {
return rangeAtom.version === versionAtom.version;
}
function compare(rangeAtom, versionAtom) {
switch (rangeAtom.operator) {
case "":
case "=": return eq(rangeAtom, versionAtom);
case ">": return compareVersion(rangeAtom, versionAtom) < 0;
case ">=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
case "<": return compareVersion(rangeAtom, versionAtom) > 0;
case "<=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
case void 0: return true;
default: return false;
}
}
//#endregion
exports.compare = compare;
//# sourceMappingURL=compare.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"compare.cjs","names":[],"sources":["../../../src/utils/semver/compare.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nexport interface CompareAtom {\n operator: string;\n version: string;\n major: string;\n minor: string;\n patch: string;\n preRelease?: string[];\n}\n\nfunction compareAtom(\n rangeAtom: string | number,\n versionAtom: string | number,\n): number {\n rangeAtom = Number(rangeAtom) || rangeAtom;\n versionAtom = Number(versionAtom) || versionAtom;\n\n if (rangeAtom > versionAtom) {\n return 1;\n }\n\n if (rangeAtom === versionAtom) {\n return 0;\n }\n\n return -1;\n}\n\nfunction comparePreRelease(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n const { preRelease: rangePreRelease } = rangeAtom;\n const { preRelease: versionPreRelease } = versionAtom;\n\n if (rangePreRelease === undefined && Boolean(versionPreRelease)) {\n return 1;\n }\n\n if (Boolean(rangePreRelease) && versionPreRelease === undefined) {\n return -1;\n }\n\n if (rangePreRelease === undefined && versionPreRelease === undefined) {\n return 0;\n }\n\n for (let i = 0, n = rangePreRelease!.length; i <= n; i++) {\n const rangeElement = rangePreRelease![i];\n const versionElement = versionPreRelease![i];\n\n if (rangeElement === versionElement) {\n continue;\n }\n\n if (rangeElement === undefined && versionElement === undefined) {\n return 0;\n }\n\n if (!rangeElement) {\n return 1;\n }\n\n if (!versionElement) {\n return -1;\n }\n\n return compareAtom(rangeElement, versionElement);\n }\n\n return 0;\n}\n\nfunction compareVersion(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n return (\n compareAtom(rangeAtom.major, versionAtom.major) ||\n compareAtom(rangeAtom.minor, versionAtom.minor) ||\n compareAtom(rangeAtom.patch, versionAtom.patch) ||\n comparePreRelease(rangeAtom, versionAtom)\n );\n}\n\nfunction eq(rangeAtom: CompareAtom, versionAtom: CompareAtom): boolean {\n return rangeAtom.version === versionAtom.version;\n}\n\nexport function compare(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): boolean {\n switch (rangeAtom.operator) {\n case '':\n case '=':\n return eq(rangeAtom, versionAtom);\n case '>':\n return compareVersion(rangeAtom, versionAtom) < 0;\n case '>=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0\n );\n case '<':\n return compareVersion(rangeAtom, versionAtom) > 0;\n case '<=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0\n );\n case undefined: {\n // mean * or x -> all versions\n return true;\n }\n default:\n return false;\n }\n}\n"],"mappings":";;AAkBA,SAAS,YACP,WACA,aACQ;AACR,aAAY,OAAO,UAAU,IAAI;AACjC,eAAc,OAAO,YAAY,IAAI;AAErC,KAAI,YAAY,YACd,QAAO;AAGT,KAAI,cAAc,YAChB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,WACA,aACQ;CACR,MAAM,EAAE,YAAY,oBAAoB;CACxC,MAAM,EAAE,YAAY,sBAAsB;AAE1C,KAAI,oBAAoB,UAAa,QAAQ,kBAAkB,CAC7D,QAAO;AAGT,KAAI,QAAQ,gBAAgB,IAAI,sBAAsB,OACpD,QAAO;AAGT,KAAI,oBAAoB,UAAa,sBAAsB,OACzD,QAAO;AAGT,MAAK,IAAI,IAAI,GAAG,IAAI,gBAAiB,QAAQ,KAAK,GAAG,KAAK;EACxD,MAAM,eAAe,gBAAiB;EACtC,MAAM,iBAAiB,kBAAmB;AAE1C,MAAI,iBAAiB,eACnB;AAGF,MAAI,iBAAiB,UAAa,mBAAmB,OACnD,QAAO;AAGT,MAAI,CAAC,aACH,QAAO;AAGT,MAAI,CAAC,eACH,QAAO;AAGT,SAAO,YAAY,cAAc,eAAe;;AAGlD,QAAO;;AAGT,SAAS,eACP,WACA,aACQ;AACR,QACE,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,kBAAkB,WAAW,YAAY;;AAI7C,SAAS,GAAG,WAAwB,aAAmC;AACrE,QAAO,UAAU,YAAY,YAAY;;AAG3C,SAAgB,QACd,WACA,aACS;AACT,SAAQ,UAAU,UAAlB;EACE,KAAK;EACL,KAAK,IACH,QAAO,GAAG,WAAW,YAAY;EACnC,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,OAEH,QAAO;EAET,QACE,QAAO"}

View File

@@ -0,0 +1,47 @@
//#region src/utils/semver/compare.ts
function compareAtom(rangeAtom, versionAtom) {
rangeAtom = Number(rangeAtom) || rangeAtom;
versionAtom = Number(versionAtom) || versionAtom;
if (rangeAtom > versionAtom) return 1;
if (rangeAtom === versionAtom) return 0;
return -1;
}
function comparePreRelease(rangeAtom, versionAtom) {
const { preRelease: rangePreRelease } = rangeAtom;
const { preRelease: versionPreRelease } = versionAtom;
if (rangePreRelease === void 0 && Boolean(versionPreRelease)) return 1;
if (Boolean(rangePreRelease) && versionPreRelease === void 0) return -1;
if (rangePreRelease === void 0 && versionPreRelease === void 0) return 0;
for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
const rangeElement = rangePreRelease[i];
const versionElement = versionPreRelease[i];
if (rangeElement === versionElement) continue;
if (rangeElement === void 0 && versionElement === void 0) return 0;
if (!rangeElement) return 1;
if (!versionElement) return -1;
return compareAtom(rangeElement, versionElement);
}
return 0;
}
function compareVersion(rangeAtom, versionAtom) {
return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom);
}
function eq(rangeAtom, versionAtom) {
return rangeAtom.version === versionAtom.version;
}
function compare(rangeAtom, versionAtom) {
switch (rangeAtom.operator) {
case "":
case "=": return eq(rangeAtom, versionAtom);
case ">": return compareVersion(rangeAtom, versionAtom) < 0;
case ">=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
case "<": return compareVersion(rangeAtom, versionAtom) > 0;
case "<=": return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
case void 0: return true;
default: return false;
}
}
//#endregion
export { compare };
//# sourceMappingURL=compare.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"compare.js","names":[],"sources":["../../../src/utils/semver/compare.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nexport interface CompareAtom {\n operator: string;\n version: string;\n major: string;\n minor: string;\n patch: string;\n preRelease?: string[];\n}\n\nfunction compareAtom(\n rangeAtom: string | number,\n versionAtom: string | number,\n): number {\n rangeAtom = Number(rangeAtom) || rangeAtom;\n versionAtom = Number(versionAtom) || versionAtom;\n\n if (rangeAtom > versionAtom) {\n return 1;\n }\n\n if (rangeAtom === versionAtom) {\n return 0;\n }\n\n return -1;\n}\n\nfunction comparePreRelease(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n const { preRelease: rangePreRelease } = rangeAtom;\n const { preRelease: versionPreRelease } = versionAtom;\n\n if (rangePreRelease === undefined && Boolean(versionPreRelease)) {\n return 1;\n }\n\n if (Boolean(rangePreRelease) && versionPreRelease === undefined) {\n return -1;\n }\n\n if (rangePreRelease === undefined && versionPreRelease === undefined) {\n return 0;\n }\n\n for (let i = 0, n = rangePreRelease!.length; i <= n; i++) {\n const rangeElement = rangePreRelease![i];\n const versionElement = versionPreRelease![i];\n\n if (rangeElement === versionElement) {\n continue;\n }\n\n if (rangeElement === undefined && versionElement === undefined) {\n return 0;\n }\n\n if (!rangeElement) {\n return 1;\n }\n\n if (!versionElement) {\n return -1;\n }\n\n return compareAtom(rangeElement, versionElement);\n }\n\n return 0;\n}\n\nfunction compareVersion(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): number {\n return (\n compareAtom(rangeAtom.major, versionAtom.major) ||\n compareAtom(rangeAtom.minor, versionAtom.minor) ||\n compareAtom(rangeAtom.patch, versionAtom.patch) ||\n comparePreRelease(rangeAtom, versionAtom)\n );\n}\n\nfunction eq(rangeAtom: CompareAtom, versionAtom: CompareAtom): boolean {\n return rangeAtom.version === versionAtom.version;\n}\n\nexport function compare(\n rangeAtom: CompareAtom,\n versionAtom: CompareAtom,\n): boolean {\n switch (rangeAtom.operator) {\n case '':\n case '=':\n return eq(rangeAtom, versionAtom);\n case '>':\n return compareVersion(rangeAtom, versionAtom) < 0;\n case '>=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0\n );\n case '<':\n return compareVersion(rangeAtom, versionAtom) > 0;\n case '<=':\n return (\n eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0\n );\n case undefined: {\n // mean * or x -> all versions\n return true;\n }\n default:\n return false;\n }\n}\n"],"mappings":";AAkBA,SAAS,YACP,WACA,aACQ;AACR,aAAY,OAAO,UAAU,IAAI;AACjC,eAAc,OAAO,YAAY,IAAI;AAErC,KAAI,YAAY,YACd,QAAO;AAGT,KAAI,cAAc,YAChB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,WACA,aACQ;CACR,MAAM,EAAE,YAAY,oBAAoB;CACxC,MAAM,EAAE,YAAY,sBAAsB;AAE1C,KAAI,oBAAoB,UAAa,QAAQ,kBAAkB,CAC7D,QAAO;AAGT,KAAI,QAAQ,gBAAgB,IAAI,sBAAsB,OACpD,QAAO;AAGT,KAAI,oBAAoB,UAAa,sBAAsB,OACzD,QAAO;AAGT,MAAK,IAAI,IAAI,GAAG,IAAI,gBAAiB,QAAQ,KAAK,GAAG,KAAK;EACxD,MAAM,eAAe,gBAAiB;EACtC,MAAM,iBAAiB,kBAAmB;AAE1C,MAAI,iBAAiB,eACnB;AAGF,MAAI,iBAAiB,UAAa,mBAAmB,OACnD,QAAO;AAGT,MAAI,CAAC,aACH,QAAO;AAGT,MAAI,CAAC,eACH,QAAO;AAGT,SAAO,YAAY,cAAc,eAAe;;AAGlD,QAAO;;AAGT,SAAS,eACP,WACA,aACQ;AACR,QACE,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,YAAY,UAAU,OAAO,YAAY,MAAM,IAC/C,kBAAkB,WAAW,YAAY;;AAI7C,SAAS,GAAG,WAAwB,aAAmC;AACrE,QAAO,UAAU,YAAY,YAAY;;AAG3C,SAAgB,QACd,WACA,aACS;AACT,SAAQ,UAAU,UAAlB;EACE,KAAK;EACL,KAAK,IACH,QAAO,GAAG,WAAW,YAAY;EACnC,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,IACH,QAAO,eAAe,WAAW,YAAY,GAAG;EAClD,KAAK,KACH,QACE,GAAG,WAAW,YAAY,IAAI,eAAe,WAAW,YAAY,GAAG;EAE3E,KAAK,OAEH,QAAO;EAET,QACE,QAAO"}

View File

@@ -0,0 +1,41 @@
//#region src/utils/semver/constants.ts
const buildIdentifier = "[0-9A-Za-z-]+";
const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`;
const numericIdentifier = "0|[1-9]\\d*";
const numericIdentifierLoose = "[0-9]+";
const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*";
const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`;
const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`;
const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`;
const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`;
const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`;
const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`;
const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`;
const loosePlain = `[v=\\s]*${`(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`}${preReleaseLoose}?${build}?`;
const gtlt = "((?:<|>)?=?)";
const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`;
const loneTilde = "(?:~>?)";
const tildeTrim = `(\\s*)${loneTilde}\\s+`;
const loneCaret = "(?:\\^)";
const caretTrim = `(\\s*)${loneCaret}\\s+`;
const star = "(<|>)?=?\\s*\\*";
const caret = `^${loneCaret}${xRangePlain}$`;
const fullPlain = `v?${`(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`}${preRelease}?${build}?`;
const tilde = `^${loneTilde}${xRangePlain}$`;
const xRange = `^${gtlt}\\s*${xRangePlain}$`;
const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`;
const gte0 = "^\\s*>=\\s*0.0.0\\s*$";
//#endregion
exports.caret = caret;
exports.caretTrim = caretTrim;
exports.comparator = comparator;
exports.comparatorTrim = comparatorTrim;
exports.gte0 = gte0;
exports.hyphenRange = hyphenRange;
exports.star = star;
exports.tilde = tilde;
exports.tildeTrim = tildeTrim;
exports.xRange = xRange;
//# sourceMappingURL=constants.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"constants.cjs","names":[],"sources":["../../../src/utils/semver/constants.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// those constants are based on https://www.rubydoc.info/gems/semantic_range/3.0.0/SemanticRange#BUILDIDENTIFIER-constant\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nconst buildIdentifier = '[0-9A-Za-z-]+';\nconst build = `(?:\\\\+(${buildIdentifier}(?:\\\\.${buildIdentifier})*))`;\nconst numericIdentifier = '0|[1-9]\\\\d*';\nconst numericIdentifierLoose = '[0-9]+';\nconst nonNumericIdentifier = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*';\nconst preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`;\nconst preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\\\.${preReleaseIdentifierLoose})*))`;\nconst preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`;\nconst preRelease = `(?:-(${preReleaseIdentifier}(?:\\\\.${preReleaseIdentifier})*))`;\nconst xRangeIdentifier = `${numericIdentifier}|x|X|\\\\*`;\nconst xRangePlain = `[v=\\\\s]*(${xRangeIdentifier})(?:\\\\.(${xRangeIdentifier})(?:\\\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`;\nexport const hyphenRange = `^\\\\s*(${xRangePlain})\\\\s+-\\\\s+(${xRangePlain})\\\\s*$`;\nconst mainVersionLoose = `(${numericIdentifierLoose})\\\\.(${numericIdentifierLoose})\\\\.(${numericIdentifierLoose})`;\nconst loosePlain = `[v=\\\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`;\nconst gtlt = '((?:<|>)?=?)';\nexport const comparatorTrim = `(\\\\s*)${gtlt}\\\\s*(${loosePlain}|${xRangePlain})`;\nconst loneTilde = '(?:~>?)';\nexport const tildeTrim = `(\\\\s*)${loneTilde}\\\\s+`;\nconst loneCaret = '(?:\\\\^)';\nexport const caretTrim = `(\\\\s*)${loneCaret}\\\\s+`;\nexport const star = '(<|>)?=?\\\\s*\\\\*';\nexport const caret = `^${loneCaret}${xRangePlain}$`;\nconst mainVersion = `(${numericIdentifier})\\\\.(${numericIdentifier})\\\\.(${numericIdentifier})`;\nconst fullPlain = `v?${mainVersion}${preRelease}?${build}?`;\nexport const tilde = `^${loneTilde}${xRangePlain}$`;\nexport const xRange = `^${gtlt}\\\\s*${xRangePlain}$`;\nexport const comparator = `^${gtlt}\\\\s*(${fullPlain})$|^$`;\n// copy from semver package\nexport const gte0 = '^\\\\s*>=\\\\s*0.0.0\\\\s*$';\n"],"mappings":";;AAUA,MAAM,kBAAkB;AACxB,MAAM,QAAQ,UAAU,gBAAgB,QAAQ,gBAAgB;AAChE,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B,MAAM,uBAAuB,GAAG,qBAAqB;AACvF,MAAM,kBAAkB,SAAS,0BAA0B,QAAQ,0BAA0B;AAC7F,MAAM,uBAAuB,MAAM,kBAAkB,GAAG,qBAAqB;AAC7E,MAAM,aAAa,QAAQ,qBAAqB,QAAQ,qBAAqB;AAC7E,MAAM,mBAAmB,GAAG,kBAAkB;AAC9C,MAAM,cAAc,YAAY,iBAAiB,UAAU,iBAAiB,UAAU,iBAAiB,MAAM,WAAW,IAAI,MAAM;AAClI,MAAa,cAAc,SAAS,YAAY,aAAa,YAAY;AAEzE,MAAM,aAAa,WADM,IAAI,uBAAuB,OAAO,uBAAuB,OAAO,uBAAuB,KAC/D,gBAAgB,GAAG,MAAM;AAC1E,MAAM,OAAO;AACb,MAAa,iBAAiB,SAAS,KAAK,OAAO,WAAW,GAAG,YAAY;AAC7E,MAAM,YAAY;AAClB,MAAa,YAAY,SAAS,UAAU;AAC5C,MAAM,YAAY;AAClB,MAAa,YAAY,SAAS,UAAU;AAC5C,MAAa,OAAO;AACpB,MAAa,QAAQ,IAAI,YAAY,YAAY;AAEjD,MAAM,YAAY,KADE,IAAI,kBAAkB,OAAO,kBAAkB,OAAO,kBAAkB,KACvD,WAAW,GAAG,MAAM;AACzD,MAAa,QAAQ,IAAI,YAAY,YAAY;AACjD,MAAa,SAAS,IAAI,KAAK,MAAM,YAAY;AACjD,MAAa,aAAa,IAAI,KAAK,OAAO,UAAU;AAEpD,MAAa,OAAO"}

View File

@@ -0,0 +1,31 @@
//#region src/utils/semver/constants.ts
const buildIdentifier = "[0-9A-Za-z-]+";
const build = `(?:\\+(${buildIdentifier}(?:\\.${buildIdentifier})*))`;
const numericIdentifier = "0|[1-9]\\d*";
const numericIdentifierLoose = "[0-9]+";
const nonNumericIdentifier = "\\d*[a-zA-Z-][a-zA-Z0-9-]*";
const preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`;
const preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\.${preReleaseIdentifierLoose})*))`;
const preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`;
const preRelease = `(?:-(${preReleaseIdentifier}(?:\\.${preReleaseIdentifier})*))`;
const xRangeIdentifier = `${numericIdentifier}|x|X|\\*`;
const xRangePlain = `[v=\\s]*(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`;
const hyphenRange = `^\\s*(${xRangePlain})\\s+-\\s+(${xRangePlain})\\s*$`;
const loosePlain = `[v=\\s]*${`(${numericIdentifierLoose})\\.(${numericIdentifierLoose})\\.(${numericIdentifierLoose})`}${preReleaseLoose}?${build}?`;
const gtlt = "((?:<|>)?=?)";
const comparatorTrim = `(\\s*)${gtlt}\\s*(${loosePlain}|${xRangePlain})`;
const loneTilde = "(?:~>?)";
const tildeTrim = `(\\s*)${loneTilde}\\s+`;
const loneCaret = "(?:\\^)";
const caretTrim = `(\\s*)${loneCaret}\\s+`;
const star = "(<|>)?=?\\s*\\*";
const caret = `^${loneCaret}${xRangePlain}$`;
const fullPlain = `v?${`(${numericIdentifier})\\.(${numericIdentifier})\\.(${numericIdentifier})`}${preRelease}?${build}?`;
const tilde = `^${loneTilde}${xRangePlain}$`;
const xRange = `^${gtlt}\\s*${xRangePlain}$`;
const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`;
const gte0 = "^\\s*>=\\s*0.0.0\\s*$";
//#endregion
export { caret, caretTrim, comparator, comparatorTrim, gte0, hyphenRange, star, tilde, tildeTrim, xRange };
//# sourceMappingURL=constants.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"constants.js","names":[],"sources":["../../../src/utils/semver/constants.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// those constants are based on https://www.rubydoc.info/gems/semantic_range/3.0.0/SemanticRange#BUILDIDENTIFIER-constant\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nconst buildIdentifier = '[0-9A-Za-z-]+';\nconst build = `(?:\\\\+(${buildIdentifier}(?:\\\\.${buildIdentifier})*))`;\nconst numericIdentifier = '0|[1-9]\\\\d*';\nconst numericIdentifierLoose = '[0-9]+';\nconst nonNumericIdentifier = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*';\nconst preReleaseIdentifierLoose = `(?:${numericIdentifierLoose}|${nonNumericIdentifier})`;\nconst preReleaseLoose = `(?:-?(${preReleaseIdentifierLoose}(?:\\\\.${preReleaseIdentifierLoose})*))`;\nconst preReleaseIdentifier = `(?:${numericIdentifier}|${nonNumericIdentifier})`;\nconst preRelease = `(?:-(${preReleaseIdentifier}(?:\\\\.${preReleaseIdentifier})*))`;\nconst xRangeIdentifier = `${numericIdentifier}|x|X|\\\\*`;\nconst xRangePlain = `[v=\\\\s]*(${xRangeIdentifier})(?:\\\\.(${xRangeIdentifier})(?:\\\\.(${xRangeIdentifier})(?:${preRelease})?${build}?)?)?`;\nexport const hyphenRange = `^\\\\s*(${xRangePlain})\\\\s+-\\\\s+(${xRangePlain})\\\\s*$`;\nconst mainVersionLoose = `(${numericIdentifierLoose})\\\\.(${numericIdentifierLoose})\\\\.(${numericIdentifierLoose})`;\nconst loosePlain = `[v=\\\\s]*${mainVersionLoose}${preReleaseLoose}?${build}?`;\nconst gtlt = '((?:<|>)?=?)';\nexport const comparatorTrim = `(\\\\s*)${gtlt}\\\\s*(${loosePlain}|${xRangePlain})`;\nconst loneTilde = '(?:~>?)';\nexport const tildeTrim = `(\\\\s*)${loneTilde}\\\\s+`;\nconst loneCaret = '(?:\\\\^)';\nexport const caretTrim = `(\\\\s*)${loneCaret}\\\\s+`;\nexport const star = '(<|>)?=?\\\\s*\\\\*';\nexport const caret = `^${loneCaret}${xRangePlain}$`;\nconst mainVersion = `(${numericIdentifier})\\\\.(${numericIdentifier})\\\\.(${numericIdentifier})`;\nconst fullPlain = `v?${mainVersion}${preRelease}?${build}?`;\nexport const tilde = `^${loneTilde}${xRangePlain}$`;\nexport const xRange = `^${gtlt}\\\\s*${xRangePlain}$`;\nexport const comparator = `^${gtlt}\\\\s*(${fullPlain})$|^$`;\n// copy from semver package\nexport const gte0 = '^\\\\s*>=\\\\s*0.0.0\\\\s*$';\n"],"mappings":";AAUA,MAAM,kBAAkB;AACxB,MAAM,QAAQ,UAAU,gBAAgB,QAAQ,gBAAgB;AAChE,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;AAC/B,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B,MAAM,uBAAuB,GAAG,qBAAqB;AACvF,MAAM,kBAAkB,SAAS,0BAA0B,QAAQ,0BAA0B;AAC7F,MAAM,uBAAuB,MAAM,kBAAkB,GAAG,qBAAqB;AAC7E,MAAM,aAAa,QAAQ,qBAAqB,QAAQ,qBAAqB;AAC7E,MAAM,mBAAmB,GAAG,kBAAkB;AAC9C,MAAM,cAAc,YAAY,iBAAiB,UAAU,iBAAiB,UAAU,iBAAiB,MAAM,WAAW,IAAI,MAAM;AAClI,MAAa,cAAc,SAAS,YAAY,aAAa,YAAY;AAEzE,MAAM,aAAa,WADM,IAAI,uBAAuB,OAAO,uBAAuB,OAAO,uBAAuB,KAC/D,gBAAgB,GAAG,MAAM;AAC1E,MAAM,OAAO;AACb,MAAa,iBAAiB,SAAS,KAAK,OAAO,WAAW,GAAG,YAAY;AAC7E,MAAM,YAAY;AAClB,MAAa,YAAY,SAAS,UAAU;AAC5C,MAAM,YAAY;AAClB,MAAa,YAAY,SAAS,UAAU;AAC5C,MAAa,OAAO;AACpB,MAAa,QAAQ,IAAI,YAAY,YAAY;AAEjD,MAAM,YAAY,KADE,IAAI,kBAAkB,OAAO,kBAAkB,OAAO,kBAAkB,KACvD,WAAW,GAAG,MAAM;AACzD,MAAa,QAAQ,IAAI,YAAY,YAAY;AACjD,MAAa,SAAS,IAAI,KAAK,MAAM,YAAY;AACjD,MAAa,aAAa,IAAI,KAAK,OAAO,UAAU;AAEpD,MAAa,OAAO"}

View File

@@ -0,0 +1,68 @@
const require_utils = require('./utils.cjs');
const require_parser = require('./parser.cjs');
const require_compare = require('./compare.cjs');
//#region src/utils/semver/index.ts
function parseComparatorString(range) {
return require_utils.pipe(require_parser.parseCarets, require_parser.parseTildes, require_parser.parseXRanges, require_parser.parseStar)(range);
}
function parseRange(range) {
return require_utils.pipe(require_parser.parseHyphen, require_parser.parseComparatorTrim, require_parser.parseTildeTrim, require_parser.parseCaretTrim)(range.trim()).split(/\s+/).join(" ");
}
function satisfy(version, range) {
if (!version) return false;
const extractedVersion = require_utils.extractComparator(version);
if (!extractedVersion) return false;
const [, versionOperator, , versionMajor, versionMinor, versionPatch, versionPreRelease] = extractedVersion;
const versionAtom = {
operator: versionOperator,
version: require_utils.combineVersion(versionMajor, versionMinor, versionPatch, versionPreRelease),
major: versionMajor,
minor: versionMinor,
patch: versionPatch,
preRelease: versionPreRelease?.split(".")
};
const orRanges = range.split("||");
for (const orRange of orRanges) {
const trimmedOrRange = orRange.trim();
if (!trimmedOrRange) return true;
if (trimmedOrRange === "*" || trimmedOrRange === "x") return true;
try {
const parsedSubRange = parseRange(trimmedOrRange);
if (!parsedSubRange.trim()) return true;
const parsedComparatorString = parsedSubRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" ");
if (!parsedComparatorString.trim()) return true;
const comparators = parsedComparatorString.split(/\s+/).map((comparator) => require_parser.parseGTE0(comparator)).filter(Boolean);
if (comparators.length === 0) continue;
let subRangeSatisfied = true;
for (const comparator of comparators) {
const extractedComparator = require_utils.extractComparator(comparator);
if (!extractedComparator) {
subRangeSatisfied = false;
break;
}
const [, rangeOperator, , rangeMajor, rangeMinor, rangePatch, rangePreRelease] = extractedComparator;
if (!require_compare.compare({
operator: rangeOperator,
version: require_utils.combineVersion(rangeMajor, rangeMinor, rangePatch, rangePreRelease),
major: rangeMajor,
minor: rangeMinor,
patch: rangePatch,
preRelease: rangePreRelease?.split(".")
}, versionAtom)) {
subRangeSatisfied = false;
break;
}
}
if (subRangeSatisfied) return true;
} catch (e) {
console.error(`[semver] Error processing range part "${trimmedOrRange}":`, e);
continue;
}
}
return false;
}
//#endregion
exports.satisfy = satisfy;
//# sourceMappingURL=index.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
//#region src/utils/semver/index.d.ts
declare function satisfy(version: string, range: string): boolean;
//#endregion
export { satisfy };
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1,68 @@
import { combineVersion, extractComparator, pipe } from "./utils.js";
import { parseCaretTrim, parseCarets, parseComparatorTrim, parseGTE0, parseHyphen, parseStar, parseTildeTrim, parseTildes, parseXRanges } from "./parser.js";
import { compare } from "./compare.js";
//#region src/utils/semver/index.ts
function parseComparatorString(range) {
return pipe(parseCarets, parseTildes, parseXRanges, parseStar)(range);
}
function parseRange(range) {
return pipe(parseHyphen, parseComparatorTrim, parseTildeTrim, parseCaretTrim)(range.trim()).split(/\s+/).join(" ");
}
function satisfy(version, range) {
if (!version) return false;
const extractedVersion = extractComparator(version);
if (!extractedVersion) return false;
const [, versionOperator, , versionMajor, versionMinor, versionPatch, versionPreRelease] = extractedVersion;
const versionAtom = {
operator: versionOperator,
version: combineVersion(versionMajor, versionMinor, versionPatch, versionPreRelease),
major: versionMajor,
minor: versionMinor,
patch: versionPatch,
preRelease: versionPreRelease?.split(".")
};
const orRanges = range.split("||");
for (const orRange of orRanges) {
const trimmedOrRange = orRange.trim();
if (!trimmedOrRange) return true;
if (trimmedOrRange === "*" || trimmedOrRange === "x") return true;
try {
const parsedSubRange = parseRange(trimmedOrRange);
if (!parsedSubRange.trim()) return true;
const parsedComparatorString = parsedSubRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" ");
if (!parsedComparatorString.trim()) return true;
const comparators = parsedComparatorString.split(/\s+/).map((comparator) => parseGTE0(comparator)).filter(Boolean);
if (comparators.length === 0) continue;
let subRangeSatisfied = true;
for (const comparator of comparators) {
const extractedComparator = extractComparator(comparator);
if (!extractedComparator) {
subRangeSatisfied = false;
break;
}
const [, rangeOperator, , rangeMajor, rangeMinor, rangePatch, rangePreRelease] = extractedComparator;
if (!compare({
operator: rangeOperator,
version: combineVersion(rangeMajor, rangeMinor, rangePatch, rangePreRelease),
major: rangeMajor,
minor: rangeMinor,
patch: rangePatch,
preRelease: rangePreRelease?.split(".")
}, versionAtom)) {
subRangeSatisfied = false;
break;
}
}
if (subRangeSatisfied) return true;
} catch (e) {
console.error(`[semver] Error processing range part "${trimmedOrRange}":`, e);
continue;
}
}
return false;
}
//#endregion
export { satisfy };
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,104 @@
const require_constants = require('./constants.cjs');
const require_utils = require('./utils.cjs');
//#region src/utils/semver/parser.ts
function parseHyphen(range) {
return range.replace(require_utils.parseRegex(require_constants.hyphenRange), (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => {
if (require_utils.isXVersion(fromMajor)) from = "";
else if (require_utils.isXVersion(fromMinor)) from = `>=${fromMajor}.0.0`;
else if (require_utils.isXVersion(fromPatch)) from = `>=${fromMajor}.${fromMinor}.0`;
else from = `>=${from}`;
if (require_utils.isXVersion(toMajor)) to = "";
else if (require_utils.isXVersion(toMinor)) to = `<${Number(toMajor) + 1}.0.0-0`;
else if (require_utils.isXVersion(toPatch)) to = `<${toMajor}.${Number(toMinor) + 1}.0-0`;
else if (toPreRelease) to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`;
else to = `<=${to}`;
return `${from} ${to}`.trim();
});
}
function parseComparatorTrim(range) {
return range.replace(require_utils.parseRegex(require_constants.comparatorTrim), "$1$2$3");
}
function parseTildeTrim(range) {
return range.replace(require_utils.parseRegex(require_constants.tildeTrim), "$1~");
}
function parseCaretTrim(range) {
return range.replace(require_utils.parseRegex(require_constants.caretTrim), "$1^");
}
function parseCarets(range) {
return range.trim().split(/\s+/).map((rangeVersion) => rangeVersion.replace(require_utils.parseRegex(require_constants.caret), (_, major, minor, patch, preRelease) => {
if (require_utils.isXVersion(major)) return "";
else if (require_utils.isXVersion(minor)) return `>=${major}.0.0 <${Number(major) + 1}.0.0-0`;
else if (require_utils.isXVersion(patch)) if (major === "0") return `>=${major}.${minor}.0 <${major}.${Number(minor) + 1}.0-0`;
else return `>=${major}.${minor}.0 <${Number(major) + 1}.0.0-0`;
else if (preRelease) if (major === "0") if (minor === "0") return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${minor}.${Number(patch) + 1}-0`;
else return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${Number(minor) + 1}.0-0`;
else return `>=${major}.${minor}.${patch}-${preRelease} <${Number(major) + 1}.0.0-0`;
else {
if (major === "0") if (minor === "0") return `>=${major}.${minor}.${patch} <${major}.${minor}.${Number(patch) + 1}-0`;
else return `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0`;
return `>=${major}.${minor}.${patch} <${Number(major) + 1}.0.0-0`;
}
})).join(" ");
}
function parseTildes(range) {
return range.trim().split(/\s+/).map((rangeVersion) => rangeVersion.replace(require_utils.parseRegex(require_constants.tilde), (_, major, minor, patch, preRelease) => {
if (require_utils.isXVersion(major)) return "";
else if (require_utils.isXVersion(minor)) return `>=${major}.0.0 <${Number(major) + 1}.0.0-0`;
else if (require_utils.isXVersion(patch)) return `>=${major}.${minor}.0 <${major}.${Number(minor) + 1}.0-0`;
else if (preRelease) return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${Number(minor) + 1}.0-0`;
return `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0`;
})).join(" ");
}
function parseXRanges(range) {
return range.split(/\s+/).map((rangeVersion) => rangeVersion.trim().replace(require_utils.parseRegex(require_constants.xRange), (ret, gtlt, major, minor, patch, preRelease) => {
const isXMajor = require_utils.isXVersion(major);
const isXMinor = isXMajor || require_utils.isXVersion(minor);
const isXPatch = isXMinor || require_utils.isXVersion(patch);
if (gtlt === "=" && isXPatch) gtlt = "";
preRelease = "";
if (isXMajor) if (gtlt === ">" || gtlt === "<") return "<0.0.0-0";
else return "*";
else if (gtlt && isXPatch) {
if (isXMinor) minor = 0;
patch = 0;
if (gtlt === ">") {
gtlt = ">=";
if (isXMinor) {
major = Number(major) + 1;
minor = 0;
patch = 0;
} else {
minor = Number(minor) + 1;
patch = 0;
}
} else if (gtlt === "<=") {
gtlt = "<";
if (isXMinor) major = Number(major) + 1;
else minor = Number(minor) + 1;
}
if (gtlt === "<") preRelease = "-0";
return `${gtlt + major}.${minor}.${patch}${preRelease}`;
} else if (isXMinor) return `>=${major}.0.0${preRelease} <${Number(major) + 1}.0.0-0`;
else if (isXPatch) return `>=${major}.${minor}.0${preRelease} <${major}.${Number(minor) + 1}.0-0`;
return ret;
})).join(" ");
}
function parseStar(range) {
return range.trim().replace(require_utils.parseRegex(require_constants.star), "");
}
function parseGTE0(comparatorString) {
return comparatorString.trim().replace(require_utils.parseRegex(require_constants.gte0), "");
}
//#endregion
exports.parseCaretTrim = parseCaretTrim;
exports.parseCarets = parseCarets;
exports.parseComparatorTrim = parseComparatorTrim;
exports.parseGTE0 = parseGTE0;
exports.parseHyphen = parseHyphen;
exports.parseStar = parseStar;
exports.parseTildeTrim = parseTildeTrim;
exports.parseTildes = parseTildes;
exports.parseXRanges = parseXRanges;
//# sourceMappingURL=parser.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,96 @@
import { caret, caretTrim, comparatorTrim, gte0, hyphenRange, star, tilde, tildeTrim, xRange } from "./constants.js";
import { isXVersion, parseRegex } from "./utils.js";
//#region src/utils/semver/parser.ts
function parseHyphen(range) {
return range.replace(parseRegex(hyphenRange), (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => {
if (isXVersion(fromMajor)) from = "";
else if (isXVersion(fromMinor)) from = `>=${fromMajor}.0.0`;
else if (isXVersion(fromPatch)) from = `>=${fromMajor}.${fromMinor}.0`;
else from = `>=${from}`;
if (isXVersion(toMajor)) to = "";
else if (isXVersion(toMinor)) to = `<${Number(toMajor) + 1}.0.0-0`;
else if (isXVersion(toPatch)) to = `<${toMajor}.${Number(toMinor) + 1}.0-0`;
else if (toPreRelease) to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`;
else to = `<=${to}`;
return `${from} ${to}`.trim();
});
}
function parseComparatorTrim(range) {
return range.replace(parseRegex(comparatorTrim), "$1$2$3");
}
function parseTildeTrim(range) {
return range.replace(parseRegex(tildeTrim), "$1~");
}
function parseCaretTrim(range) {
return range.replace(parseRegex(caretTrim), "$1^");
}
function parseCarets(range) {
return range.trim().split(/\s+/).map((rangeVersion) => rangeVersion.replace(parseRegex(caret), (_, major, minor, patch, preRelease) => {
if (isXVersion(major)) return "";
else if (isXVersion(minor)) return `>=${major}.0.0 <${Number(major) + 1}.0.0-0`;
else if (isXVersion(patch)) if (major === "0") return `>=${major}.${minor}.0 <${major}.${Number(minor) + 1}.0-0`;
else return `>=${major}.${minor}.0 <${Number(major) + 1}.0.0-0`;
else if (preRelease) if (major === "0") if (minor === "0") return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${minor}.${Number(patch) + 1}-0`;
else return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${Number(minor) + 1}.0-0`;
else return `>=${major}.${minor}.${patch}-${preRelease} <${Number(major) + 1}.0.0-0`;
else {
if (major === "0") if (minor === "0") return `>=${major}.${minor}.${patch} <${major}.${minor}.${Number(patch) + 1}-0`;
else return `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0`;
return `>=${major}.${minor}.${patch} <${Number(major) + 1}.0.0-0`;
}
})).join(" ");
}
function parseTildes(range) {
return range.trim().split(/\s+/).map((rangeVersion) => rangeVersion.replace(parseRegex(tilde), (_, major, minor, patch, preRelease) => {
if (isXVersion(major)) return "";
else if (isXVersion(minor)) return `>=${major}.0.0 <${Number(major) + 1}.0.0-0`;
else if (isXVersion(patch)) return `>=${major}.${minor}.0 <${major}.${Number(minor) + 1}.0-0`;
else if (preRelease) return `>=${major}.${minor}.${patch}-${preRelease} <${major}.${Number(minor) + 1}.0-0`;
return `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0`;
})).join(" ");
}
function parseXRanges(range) {
return range.split(/\s+/).map((rangeVersion) => rangeVersion.trim().replace(parseRegex(xRange), (ret, gtlt, major, minor, patch, preRelease) => {
const isXMajor = isXVersion(major);
const isXMinor = isXMajor || isXVersion(minor);
const isXPatch = isXMinor || isXVersion(patch);
if (gtlt === "=" && isXPatch) gtlt = "";
preRelease = "";
if (isXMajor) if (gtlt === ">" || gtlt === "<") return "<0.0.0-0";
else return "*";
else if (gtlt && isXPatch) {
if (isXMinor) minor = 0;
patch = 0;
if (gtlt === ">") {
gtlt = ">=";
if (isXMinor) {
major = Number(major) + 1;
minor = 0;
patch = 0;
} else {
minor = Number(minor) + 1;
patch = 0;
}
} else if (gtlt === "<=") {
gtlt = "<";
if (isXMinor) major = Number(major) + 1;
else minor = Number(minor) + 1;
}
if (gtlt === "<") preRelease = "-0";
return `${gtlt + major}.${minor}.${patch}${preRelease}`;
} else if (isXMinor) return `>=${major}.0.0${preRelease} <${Number(major) + 1}.0.0-0`;
else if (isXPatch) return `>=${major}.${minor}.0${preRelease} <${major}.${Number(minor) + 1}.0-0`;
return ret;
})).join(" ");
}
function parseStar(range) {
return range.trim().replace(parseRegex(star), "");
}
function parseGTE0(comparatorString) {
return comparatorString.trim().replace(parseRegex(gte0), "");
}
//#endregion
export { parseCaretTrim, parseCarets, parseComparatorTrim, parseGTE0, parseHyphen, parseStar, parseTildeTrim, parseTildes, parseXRanges };
//# sourceMappingURL=parser.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,28 @@
const require_constants = require('./constants.cjs');
//#region src/utils/semver/utils.ts
function parseRegex(source) {
return new RegExp(source);
}
function isXVersion(version) {
return !version || version.toLowerCase() === "x" || version === "*";
}
function pipe(...fns) {
return (x) => fns.reduce((v, f) => f(v), x);
}
function extractComparator(comparatorString) {
return comparatorString.match(parseRegex(require_constants.comparator));
}
function combineVersion(major, minor, patch, preRelease) {
const mainVersion = `${major}.${minor}.${patch}`;
if (preRelease) return `${mainVersion}-${preRelease}`;
return mainVersion;
}
//#endregion
exports.combineVersion = combineVersion;
exports.extractComparator = extractComparator;
exports.isXVersion = isXVersion;
exports.parseRegex = parseRegex;
exports.pipe = pipe;
//# sourceMappingURL=utils.cjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.cjs","names":["comparator"],"sources":["../../../src/utils/semver/utils.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nimport { comparator } from './constants';\n\nexport function parseRegex(source: string): RegExp {\n return new RegExp(source);\n}\n\nexport function isXVersion(version: string): boolean {\n return !version || version.toLowerCase() === 'x' || version === '*';\n}\n\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6, R7>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n f6: (a: R5) => R6,\n f7: (a: R6) => R7,\n): (...args: TArgs) => R7;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n f6: (a: R5) => R6,\n): (...args: TArgs) => R6;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n): (...args: TArgs) => R5;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n): (...args: TArgs) => R4;\nexport function pipe<TArgs extends any[], R1, R2, R3>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n): (...args: TArgs) => R3;\nexport function pipe<TArgs extends any[], R1, R2>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n): (...args: TArgs) => R2;\nexport function pipe<TArgs extends any[], R1>(\n f1: (...args: TArgs) => R1,\n): (...args: TArgs) => R1;\nexport function pipe(...fns: ((params: any) => any)[]) {\n return (x: unknown): any => fns.reduce((v, f) => f(v), x);\n}\n\nexport function extractComparator(\n comparatorString: string,\n): RegExpMatchArray | null {\n return comparatorString.match(parseRegex(comparator));\n}\n\nexport function combineVersion(\n major: string,\n minor: string,\n patch: string,\n preRelease: string,\n): string {\n const mainVersion = `${major}.${minor}.${patch}`;\n\n if (preRelease) {\n return `${mainVersion}-${preRelease}`;\n }\n\n return mainVersion;\n}\n"],"mappings":";;;AAWA,SAAgB,WAAW,QAAwB;AACjD,QAAO,IAAI,OAAO,OAAO;;AAG3B,SAAgB,WAAW,SAA0B;AACnD,QAAO,CAAC,WAAW,QAAQ,aAAa,KAAK,OAAO,YAAY;;AA6ClE,SAAgB,KAAK,GAAG,KAA+B;AACrD,SAAQ,MAAoB,IAAI,QAAQ,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE;;AAG3D,SAAgB,kBACd,kBACyB;AACzB,QAAO,iBAAiB,MAAM,WAAWA,6BAAW,CAAC;;AAGvD,SAAgB,eACd,OACA,OACA,OACA,YACQ;CACR,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG;AAEzC,KAAI,WACF,QAAO,GAAG,YAAY,GAAG;AAG3B,QAAO"}

View File

@@ -0,0 +1,24 @@
import { comparator } from "./constants.js";
//#region src/utils/semver/utils.ts
function parseRegex(source) {
return new RegExp(source);
}
function isXVersion(version) {
return !version || version.toLowerCase() === "x" || version === "*";
}
function pipe(...fns) {
return (x) => fns.reduce((v, f) => f(v), x);
}
function extractComparator(comparatorString) {
return comparatorString.match(parseRegex(comparator));
}
function combineVersion(major, minor, patch, preRelease) {
const mainVersion = `${major}.${minor}.${patch}`;
if (preRelease) return `${mainVersion}-${preRelease}`;
return mainVersion;
}
//#endregion
export { combineVersion, extractComparator, isXVersion, parseRegex, pipe };
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.js","names":[],"sources":["../../../src/utils/semver/utils.ts"],"sourcesContent":["// fork from https://github.com/originjs/vite-plugin-federation/blob/v1.1.12/packages/lib/src/utils/semver/index.ts\n// Copyright (c)\n// vite-plugin-federation is licensed under Mulan PSL v2.\n// You can use this software according to the terms and conditions of the Mulan PSL v2.\n// You may obtain a copy of Mulan PSL v2 at:\n// http://license.coscl.org.cn/MulanPSL2\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.\n// See the Mulan PSL v2 for more details.\n\nimport { comparator } from './constants';\n\nexport function parseRegex(source: string): RegExp {\n return new RegExp(source);\n}\n\nexport function isXVersion(version: string): boolean {\n return !version || version.toLowerCase() === 'x' || version === '*';\n}\n\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6, R7>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n f6: (a: R5) => R6,\n f7: (a: R6) => R7,\n): (...args: TArgs) => R7;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5, R6>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n f6: (a: R5) => R6,\n): (...args: TArgs) => R6;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4, R5>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n f5: (a: R4) => R5,\n): (...args: TArgs) => R5;\nexport function pipe<TArgs extends any[], R1, R2, R3, R4>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n f4: (a: R3) => R4,\n): (...args: TArgs) => R4;\nexport function pipe<TArgs extends any[], R1, R2, R3>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n f3: (a: R2) => R3,\n): (...args: TArgs) => R3;\nexport function pipe<TArgs extends any[], R1, R2>(\n f1: (...args: TArgs) => R1,\n f2: (a: R1) => R2,\n): (...args: TArgs) => R2;\nexport function pipe<TArgs extends any[], R1>(\n f1: (...args: TArgs) => R1,\n): (...args: TArgs) => R1;\nexport function pipe(...fns: ((params: any) => any)[]) {\n return (x: unknown): any => fns.reduce((v, f) => f(v), x);\n}\n\nexport function extractComparator(\n comparatorString: string,\n): RegExpMatchArray | null {\n return comparatorString.match(parseRegex(comparator));\n}\n\nexport function combineVersion(\n major: string,\n minor: string,\n patch: string,\n preRelease: string,\n): string {\n const mainVersion = `${major}.${minor}.${patch}`;\n\n if (preRelease) {\n return `${mainVersion}-${preRelease}`;\n }\n\n return mainVersion;\n}\n"],"mappings":";;;AAWA,SAAgB,WAAW,QAAwB;AACjD,QAAO,IAAI,OAAO,OAAO;;AAG3B,SAAgB,WAAW,SAA0B;AACnD,QAAO,CAAC,WAAW,QAAQ,aAAa,KAAK,OAAO,YAAY;;AA6ClE,SAAgB,KAAK,GAAG,KAA+B;AACrD,SAAQ,MAAoB,IAAI,QAAQ,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE;;AAG3D,SAAgB,kBACd,kBACyB;AACzB,QAAO,iBAAiB,MAAM,WAAW,WAAW,CAAC;;AAGvD,SAAgB,eACd,OACA,OACA,OACA,YACQ;CACR,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG;AAEzC,KAAI,WACF,QAAO,GAAG,YAAY,GAAG;AAG3B,QAAO"}

View File

@@ -0,0 +1,284 @@
const require_logger = require('./logger.cjs');
const require_tool = require('./tool.cjs');
const require_global = require('../global.cjs');
const require_constant = require('../constant.cjs');
const require_index = require('./semver/index.cjs');
let _module_federation_sdk = require("@module-federation/sdk");
//#region src/utils/share.ts
function formatShare(shareArgs, from, name, shareStrategy) {
let get;
if ("get" in shareArgs) get = shareArgs.get;
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
else get = () => Promise.resolve(() => {
require_logger.error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
});
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.`);
return {
deps: [],
useIn: [],
from,
loading: null,
...shareArgs,
shareConfig: {
requiredVersion: `^${shareArgs.version}`,
singleton: false,
eager: false,
strictVersion: false,
...shareArgs.shareConfig
},
get,
loaded: shareArgs?.loaded || "lib" in shareArgs ? true : void 0,
version: shareArgs.version ?? "0",
scope: Array.isArray(shareArgs.scope) ? shareArgs.scope : [shareArgs.scope ?? "default"],
strategy: (shareArgs.strategy ?? shareStrategy) || "version-first",
treeShaking: shareArgs.treeShaking ? {
...shareArgs.treeShaking,
mode: shareArgs.treeShaking.mode ?? "server-calc",
status: shareArgs.treeShaking.status ?? _module_federation_sdk.TreeShakingStatus.UNKNOWN,
useIn: []
} : void 0
};
}
function formatShareConfigs(prevOptions, newOptions) {
const shareArgs = newOptions.shared || {};
const from = newOptions.name;
const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {
const arrayShareArgs = require_tool.arrayOptions(shareArgs[pkgName]);
res[pkgName] = res[pkgName] || [];
arrayShareArgs.forEach((shareConfig) => {
res[pkgName].push(formatShare(shareConfig, from, pkgName, newOptions.shareStrategy));
});
return res;
}, {});
const allShareInfos = { ...prevOptions.shared };
Object.keys(newShareInfos).forEach((shareKey) => {
if (!allShareInfos[shareKey]) allShareInfos[shareKey] = newShareInfos[shareKey];
else newShareInfos[shareKey].forEach((newUserSharedOptions) => {
if (!allShareInfos[shareKey].find((sharedVal) => sharedVal.version === newUserSharedOptions.version)) allShareInfos[shareKey].push(newUserSharedOptions);
});
});
return {
allShareInfos,
newShareInfos
};
}
function shouldUseTreeShaking(treeShaking, usedExports) {
if (!treeShaking) return false;
const { status, mode } = treeShaking;
if (status === _module_federation_sdk.TreeShakingStatus.NO_USE) return false;
if (status === _module_federation_sdk.TreeShakingStatus.CALCULATED) return true;
if (mode === "runtime-infer") {
if (!usedExports) return true;
return isMatchUsedExports(treeShaking, usedExports);
}
return false;
}
/**
* compare version a and b, return true if a is less than b
*/
function versionLt(a, b) {
const transformInvalidVersion = (version) => {
if (!Number.isNaN(Number(version))) {
const splitArr = version.split(".");
let validVersion = version;
for (let i = 0; i < 3 - splitArr.length; i++) validVersion += ".0";
return validVersion;
}
return version;
};
if (require_index.satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) return true;
else return false;
}
const findVersion = (shareVersionMap, cb) => {
const callback = cb || function(prev, cur) {
return versionLt(prev, cur);
};
return Object.keys(shareVersionMap).reduce((prev, cur) => {
if (!prev) return cur;
if (callback(prev, cur)) return cur;
if (prev === "0") return cur;
return prev;
}, 0);
};
const isLoaded = (shared) => {
return Boolean(shared.loaded) || typeof shared.lib === "function";
};
const isLoading = (shared) => {
return Boolean(shared.loading);
};
const isMatchUsedExports = (treeShaking, usedExports) => {
if (!treeShaking || !usedExports) return false;
const { usedExports: treeShakingUsedExports } = treeShaking;
if (!treeShakingUsedExports) return false;
if (usedExports.every((e) => treeShakingUsedExports.includes(e))) return true;
return false;
};
function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName, treeShaking) {
const versions = shareScopeMap[scope][pkgName];
let version = "";
let useTreesShaking = shouldUseTreeShaking(treeShaking);
const callback = function(prev, cur) {
if (useTreesShaking) {
if (!versions[prev].treeShaking) return true;
if (!versions[cur].treeShaking) return false;
return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);
}
return !isLoaded(versions[prev]) && versionLt(prev, cur);
};
if (useTreesShaking) {
version = findVersion(shareScopeMap[scope][pkgName], callback);
if (version) return {
version,
useTreesShaking
};
useTreesShaking = false;
}
return {
version: findVersion(shareScopeMap[scope][pkgName], callback),
useTreesShaking
};
}
const isLoadingOrLoaded = (shared) => {
return isLoaded(shared) || isLoading(shared);
};
function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName, treeShaking) {
const versions = shareScopeMap[scope][pkgName];
let version = "";
let useTreesShaking = shouldUseTreeShaking(treeShaking);
const callback = function(prev, cur) {
if (useTreesShaking) {
if (!versions[prev].treeShaking) return true;
if (!versions[cur].treeShaking) return false;
if (isLoadingOrLoaded(versions[cur].treeShaking)) if (isLoadingOrLoaded(versions[prev].treeShaking)) return Boolean(versionLt(prev, cur));
else return true;
if (isLoadingOrLoaded(versions[prev].treeShaking)) return false;
}
if (isLoadingOrLoaded(versions[cur])) if (isLoadingOrLoaded(versions[prev])) return Boolean(versionLt(prev, cur));
else return true;
if (isLoadingOrLoaded(versions[prev])) return false;
return versionLt(prev, cur);
};
if (useTreesShaking) {
version = findVersion(shareScopeMap[scope][pkgName], callback);
if (version) return {
version,
useTreesShaking
};
useTreesShaking = false;
}
return {
version: findVersion(shareScopeMap[scope][pkgName], callback),
useTreesShaking
};
}
function getFindShareFunction(strategy) {
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
return findSingletonVersionOrderByVersion;
}
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
if (!localShareScopeMap) return;
const { shareConfig, scope = require_constant.DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
const scopes = Array.isArray(scope) ? scope : [scope];
for (const sc of scopes) if (shareConfig && localShareScopeMap[sc] && localShareScopeMap[sc][pkgName]) {
const { requiredVersion } = shareConfig;
const { version: maxOrSingletonVersion, useTreesShaking } = getFindShareFunction(strategy)(localShareScopeMap, sc, pkgName, treeShaking);
const defaultResolver = () => {
const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];
if (shareConfig.singleton) {
if (typeof requiredVersion === "string" && !require_index.satisfy(maxOrSingletonVersion, requiredVersion)) {
const msg = `Version ${maxOrSingletonVersion} from ${maxOrSingletonVersion && shared.from} of shared singleton module ${pkgName} does not satisfy the requirement of ${shareInfo.from} which needs ${requiredVersion})`;
if (shareConfig.strictVersion) require_logger.error(msg);
else require_logger.warn(msg);
}
return {
shared,
useTreesShaking
};
} else {
if (requiredVersion === false || requiredVersion === "*") return {
shared,
useTreesShaking
};
if (require_index.satisfy(maxOrSingletonVersion, requiredVersion)) return {
shared,
useTreesShaking
};
const _usedTreeShaking = shouldUseTreeShaking(treeShaking);
if (_usedTreeShaking) for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) {
if (!shouldUseTreeShaking(versionValue.treeShaking, treeShaking?.usedExports)) continue;
if (require_index.satisfy(versionKey, requiredVersion)) return {
shared: versionValue,
useTreesShaking: _usedTreeShaking
};
}
for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) if (require_index.satisfy(versionKey, requiredVersion)) return {
shared: versionValue,
useTreesShaking: false
};
}
};
const params = {
shareScopeMap: localShareScopeMap,
scope: sc,
pkgName,
version: maxOrSingletonVersion,
GlobalFederation: require_global.Global.__FEDERATION__,
shareInfo,
resolver: defaultResolver
};
return (resolveShare.emit(params) || params).resolver();
}
}
function getGlobalShareScope() {
return require_global.Global.__FEDERATION__.__SHARE__;
}
function getTargetSharedOptions(options) {
const { pkgName, extraOptions, shareInfos } = options;
const defaultResolver = (sharedOptions) => {
if (!sharedOptions) return;
const shareVersionMap = {};
sharedOptions.forEach((shared) => {
shareVersionMap[shared.version] = shared;
});
const callback = function(prev, cur) {
return !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur);
};
return shareVersionMap[findVersion(shareVersionMap, callback)];
};
const resolver = extraOptions?.resolver ?? defaultResolver;
const isPlainObject = (val) => {
return val !== null && typeof val === "object" && !Array.isArray(val);
};
const merge = (...sources) => {
const out = {};
for (const src of sources) {
if (!src) continue;
for (const [key, value] of Object.entries(src)) {
const prev = out[key];
if (isPlainObject(prev) && isPlainObject(value)) out[key] = merge(prev, value);
else if (value !== void 0) out[key] = value;
}
}
return out;
};
return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);
}
const addUseIn = (shared, from) => {
if (!shared.useIn) shared.useIn = [];
require_tool.addUniqueItem(shared.useIn, from);
};
function directShare(shared, useTreesShaking) {
if (useTreesShaking && shared.treeShaking) return shared.treeShaking;
return shared;
}
//#endregion
exports.addUseIn = addUseIn;
exports.directShare = directShare;
exports.formatShareConfigs = formatShareConfigs;
exports.getGlobalShareScope = getGlobalShareScope;
exports.getRegisteredShare = getRegisteredShare;
exports.getTargetSharedOptions = getTargetSharedOptions;
exports.shouldUseTreeShaking = shouldUseTreeShaking;
//# sourceMappingURL=share.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
import { SyncWaterfallHook } from "./hooks/syncWaterfallHook.js";
import { Federation } from "../global.js";
import { GlobalShareScopeMap, ShareScopeMap, Shared } from "../type/config.js";
//#region src/utils/share.d.ts
declare function getRegisteredShare(localShareScopeMap: ShareScopeMap, pkgName: string, shareInfo: Shared, resolveShare: SyncWaterfallHook<{
shareScopeMap: ShareScopeMap;
scope: string;
pkgName: string;
version: string;
shareInfo: Shared;
GlobalFederation: Federation;
resolver: () => {
shared: Shared;
useTreesShaking: boolean;
} | undefined;
}>): {
shared: Shared;
useTreesShaking: boolean;
} | void;
declare function getGlobalShareScope(): GlobalShareScopeMap;
//#endregion
export { getGlobalShareScope, getRegisteredShare };
//# sourceMappingURL=share.d.ts.map

View File

@@ -0,0 +1,278 @@
import { error, warn as warn$1 } from "./logger.js";
import { addUniqueItem, arrayOptions } from "./tool.js";
import { Global } from "../global.js";
import { DEFAULT_SCOPE } from "../constant.js";
import { satisfy } from "./semver/index.js";
import { TreeShakingStatus } from "@module-federation/sdk";
//#region src/utils/share.ts
function formatShare(shareArgs, from, name, shareStrategy) {
let get;
if ("get" in shareArgs) get = shareArgs.get;
else if ("lib" in shareArgs) get = () => Promise.resolve(shareArgs.lib);
else get = () => Promise.resolve(() => {
error(`Cannot get shared "${name}" from "${from}": neither "get" nor "lib" is provided in the share config.`);
});
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.`);
return {
deps: [],
useIn: [],
from,
loading: null,
...shareArgs,
shareConfig: {
requiredVersion: `^${shareArgs.version}`,
singleton: false,
eager: false,
strictVersion: false,
...shareArgs.shareConfig
},
get,
loaded: shareArgs?.loaded || "lib" in shareArgs ? true : void 0,
version: shareArgs.version ?? "0",
scope: Array.isArray(shareArgs.scope) ? shareArgs.scope : [shareArgs.scope ?? "default"],
strategy: (shareArgs.strategy ?? shareStrategy) || "version-first",
treeShaking: shareArgs.treeShaking ? {
...shareArgs.treeShaking,
mode: shareArgs.treeShaking.mode ?? "server-calc",
status: shareArgs.treeShaking.status ?? TreeShakingStatus.UNKNOWN,
useIn: []
} : void 0
};
}
function formatShareConfigs(prevOptions, newOptions) {
const shareArgs = newOptions.shared || {};
const from = newOptions.name;
const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => {
const arrayShareArgs = arrayOptions(shareArgs[pkgName]);
res[pkgName] = res[pkgName] || [];
arrayShareArgs.forEach((shareConfig) => {
res[pkgName].push(formatShare(shareConfig, from, pkgName, newOptions.shareStrategy));
});
return res;
}, {});
const allShareInfos = { ...prevOptions.shared };
Object.keys(newShareInfos).forEach((shareKey) => {
if (!allShareInfos[shareKey]) allShareInfos[shareKey] = newShareInfos[shareKey];
else newShareInfos[shareKey].forEach((newUserSharedOptions) => {
if (!allShareInfos[shareKey].find((sharedVal) => sharedVal.version === newUserSharedOptions.version)) allShareInfos[shareKey].push(newUserSharedOptions);
});
});
return {
allShareInfos,
newShareInfos
};
}
function shouldUseTreeShaking(treeShaking, usedExports) {
if (!treeShaking) return false;
const { status, mode } = treeShaking;
if (status === TreeShakingStatus.NO_USE) return false;
if (status === TreeShakingStatus.CALCULATED) return true;
if (mode === "runtime-infer") {
if (!usedExports) return true;
return isMatchUsedExports(treeShaking, usedExports);
}
return false;
}
/**
* compare version a and b, return true if a is less than b
*/
function versionLt(a, b) {
const transformInvalidVersion = (version) => {
if (!Number.isNaN(Number(version))) {
const splitArr = version.split(".");
let validVersion = version;
for (let i = 0; i < 3 - splitArr.length; i++) validVersion += ".0";
return validVersion;
}
return version;
};
if (satisfy(transformInvalidVersion(a), `<=${transformInvalidVersion(b)}`)) return true;
else return false;
}
const findVersion = (shareVersionMap, cb) => {
const callback = cb || function(prev, cur) {
return versionLt(prev, cur);
};
return Object.keys(shareVersionMap).reduce((prev, cur) => {
if (!prev) return cur;
if (callback(prev, cur)) return cur;
if (prev === "0") return cur;
return prev;
}, 0);
};
const isLoaded = (shared) => {
return Boolean(shared.loaded) || typeof shared.lib === "function";
};
const isLoading = (shared) => {
return Boolean(shared.loading);
};
const isMatchUsedExports = (treeShaking, usedExports) => {
if (!treeShaking || !usedExports) return false;
const { usedExports: treeShakingUsedExports } = treeShaking;
if (!treeShakingUsedExports) return false;
if (usedExports.every((e) => treeShakingUsedExports.includes(e))) return true;
return false;
};
function findSingletonVersionOrderByVersion(shareScopeMap, scope, pkgName, treeShaking) {
const versions = shareScopeMap[scope][pkgName];
let version = "";
let useTreesShaking = shouldUseTreeShaking(treeShaking);
const callback = function(prev, cur) {
if (useTreesShaking) {
if (!versions[prev].treeShaking) return true;
if (!versions[cur].treeShaking) return false;
return !isLoaded(versions[prev].treeShaking) && versionLt(prev, cur);
}
return !isLoaded(versions[prev]) && versionLt(prev, cur);
};
if (useTreesShaking) {
version = findVersion(shareScopeMap[scope][pkgName], callback);
if (version) return {
version,
useTreesShaking
};
useTreesShaking = false;
}
return {
version: findVersion(shareScopeMap[scope][pkgName], callback),
useTreesShaking
};
}
const isLoadingOrLoaded = (shared) => {
return isLoaded(shared) || isLoading(shared);
};
function findSingletonVersionOrderByLoaded(shareScopeMap, scope, pkgName, treeShaking) {
const versions = shareScopeMap[scope][pkgName];
let version = "";
let useTreesShaking = shouldUseTreeShaking(treeShaking);
const callback = function(prev, cur) {
if (useTreesShaking) {
if (!versions[prev].treeShaking) return true;
if (!versions[cur].treeShaking) return false;
if (isLoadingOrLoaded(versions[cur].treeShaking)) if (isLoadingOrLoaded(versions[prev].treeShaking)) return Boolean(versionLt(prev, cur));
else return true;
if (isLoadingOrLoaded(versions[prev].treeShaking)) return false;
}
if (isLoadingOrLoaded(versions[cur])) if (isLoadingOrLoaded(versions[prev])) return Boolean(versionLt(prev, cur));
else return true;
if (isLoadingOrLoaded(versions[prev])) return false;
return versionLt(prev, cur);
};
if (useTreesShaking) {
version = findVersion(shareScopeMap[scope][pkgName], callback);
if (version) return {
version,
useTreesShaking
};
useTreesShaking = false;
}
return {
version: findVersion(shareScopeMap[scope][pkgName], callback),
useTreesShaking
};
}
function getFindShareFunction(strategy) {
if (strategy === "loaded-first") return findSingletonVersionOrderByLoaded;
return findSingletonVersionOrderByVersion;
}
function getRegisteredShare(localShareScopeMap, pkgName, shareInfo, resolveShare) {
if (!localShareScopeMap) return;
const { shareConfig, scope = DEFAULT_SCOPE, strategy, treeShaking } = shareInfo;
const scopes = Array.isArray(scope) ? scope : [scope];
for (const sc of scopes) if (shareConfig && localShareScopeMap[sc] && localShareScopeMap[sc][pkgName]) {
const { requiredVersion } = shareConfig;
const { version: maxOrSingletonVersion, useTreesShaking } = getFindShareFunction(strategy)(localShareScopeMap, sc, pkgName, treeShaking);
const defaultResolver = () => {
const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion];
if (shareConfig.singleton) {
if (typeof requiredVersion === "string" && !satisfy(maxOrSingletonVersion, requiredVersion)) {
const msg = `Version ${maxOrSingletonVersion} from ${maxOrSingletonVersion && shared.from} of shared singleton module ${pkgName} does not satisfy the requirement of ${shareInfo.from} which needs ${requiredVersion})`;
if (shareConfig.strictVersion) error(msg);
else warn$1(msg);
}
return {
shared,
useTreesShaking
};
} else {
if (requiredVersion === false || requiredVersion === "*") return {
shared,
useTreesShaking
};
if (satisfy(maxOrSingletonVersion, requiredVersion)) return {
shared,
useTreesShaking
};
const _usedTreeShaking = shouldUseTreeShaking(treeShaking);
if (_usedTreeShaking) for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) {
if (!shouldUseTreeShaking(versionValue.treeShaking, treeShaking?.usedExports)) continue;
if (satisfy(versionKey, requiredVersion)) return {
shared: versionValue,
useTreesShaking: _usedTreeShaking
};
}
for (const [versionKey, versionValue] of Object.entries(localShareScopeMap[sc][pkgName])) if (satisfy(versionKey, requiredVersion)) return {
shared: versionValue,
useTreesShaking: false
};
}
};
const params = {
shareScopeMap: localShareScopeMap,
scope: sc,
pkgName,
version: maxOrSingletonVersion,
GlobalFederation: Global.__FEDERATION__,
shareInfo,
resolver: defaultResolver
};
return (resolveShare.emit(params) || params).resolver();
}
}
function getGlobalShareScope() {
return Global.__FEDERATION__.__SHARE__;
}
function getTargetSharedOptions(options) {
const { pkgName, extraOptions, shareInfos } = options;
const defaultResolver = (sharedOptions) => {
if (!sharedOptions) return;
const shareVersionMap = {};
sharedOptions.forEach((shared) => {
shareVersionMap[shared.version] = shared;
});
const callback = function(prev, cur) {
return !isLoaded(shareVersionMap[prev]) && versionLt(prev, cur);
};
return shareVersionMap[findVersion(shareVersionMap, callback)];
};
const resolver = extraOptions?.resolver ?? defaultResolver;
const isPlainObject = (val) => {
return val !== null && typeof val === "object" && !Array.isArray(val);
};
const merge = (...sources) => {
const out = {};
for (const src of sources) {
if (!src) continue;
for (const [key, value] of Object.entries(src)) {
const prev = out[key];
if (isPlainObject(prev) && isPlainObject(value)) out[key] = merge(prev, value);
else if (value !== void 0) out[key] = value;
}
}
return out;
};
return merge(resolver(shareInfos[pkgName]), extraOptions?.customShareInfo);
}
const addUseIn = (shared, from) => {
if (!shared.useIn) shared.useIn = [];
addUniqueItem(shared.useIn, from);
};
function directShare(shared, useTreesShaking) {
if (useTreesShaking && shared.treeShaking) return shared.treeShaking;
return shared;
}
//#endregion
export { addUseIn, directShare, formatShareConfigs, getGlobalShareScope, getRegisteredShare, getTargetSharedOptions, shouldUseTreeShaking };
//# sourceMappingURL=share.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,82 @@
const require_logger = require('./logger.cjs');
let _module_federation_sdk = require("@module-federation/sdk");
//#region src/utils/tool.ts
function addUniqueItem(arr, item) {
if (arr.findIndex((name) => name === item) === -1) arr.push(item);
return arr;
}
function getFMId(remoteInfo) {
if ("version" in remoteInfo && remoteInfo.version) return `${remoteInfo.name}:${remoteInfo.version}`;
else if ("entry" in remoteInfo && remoteInfo.entry) return `${remoteInfo.name}:${remoteInfo.entry}`;
else return `${remoteInfo.name}`;
}
function isRemoteInfoWithEntry(remote) {
return typeof remote.entry !== "undefined";
}
function isPureRemoteEntry(remote) {
return !remote.entry.includes(".json");
}
async function safeWrapper(callback, disableWarn) {
try {
return await callback();
} catch (e) {
!disableWarn && require_logger.warn(e);
return;
}
}
function isObject(val) {
return val && typeof val === "object";
}
const objectToString = Object.prototype.toString;
function isPlainObject(val) {
return objectToString.call(val) === "[object Object]";
}
function isStaticResourcesEqual(url1, url2) {
const REG_EXP = /^(https?:)?\/\//i;
return url1.replace(REG_EXP, "").replace(/\/$/, "") === url2.replace(REG_EXP, "").replace(/\/$/, "");
}
function arrayOptions(options) {
return Array.isArray(options) ? options : [options];
}
function getRemoteEntryInfoFromSnapshot(snapshot) {
const defaultRemoteEntryInfo = {
url: "",
type: "global",
globalName: ""
};
if (_module_federation_sdk.isBrowserEnvValue || (0, _module_federation_sdk.isReactNativeEnv)() || !("ssrRemoteEntry" in snapshot)) return "remoteEntry" in snapshot ? {
url: snapshot.remoteEntry,
type: snapshot.remoteEntryType,
globalName: snapshot.globalName
} : defaultRemoteEntryInfo;
if ("ssrRemoteEntry" in snapshot) return {
url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,
type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,
globalName: snapshot.globalName
};
return defaultRemoteEntryInfo;
}
const processModuleAlias = (name, subPath) => {
let moduleName;
if (name.endsWith("/")) moduleName = name.slice(0, -1);
else moduleName = name;
if (subPath.startsWith(".")) subPath = subPath.slice(1);
moduleName = moduleName + subPath;
return moduleName;
};
//#endregion
exports.addUniqueItem = addUniqueItem;
exports.arrayOptions = arrayOptions;
exports.getFMId = getFMId;
exports.getRemoteEntryInfoFromSnapshot = getRemoteEntryInfoFromSnapshot;
exports.isObject = isObject;
exports.isPlainObject = isPlainObject;
exports.isPureRemoteEntry = isPureRemoteEntry;
exports.isRemoteInfoWithEntry = isRemoteInfoWithEntry;
exports.isStaticResourcesEqual = isStaticResourcesEqual;
exports.objectToString = objectToString;
exports.processModuleAlias = processModuleAlias;
exports.safeWrapper = safeWrapper;
//# sourceMappingURL=tool.cjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
import { ModuleInfo, RemoteEntryType, RemoteWithEntry } from "@module-federation/sdk";
//#region src/utils/tool.d.ts
declare function safeWrapper<T extends (...args: Array<any>) => any>(callback: T, disableWarn?: boolean): Promise<ReturnType<T> | undefined>;
declare function isStaticResourcesEqual(url1: string, url2: string): boolean;
//#endregion
export { isStaticResourcesEqual, safeWrapper };
//# sourceMappingURL=tool.d.ts.map

View File

@@ -0,0 +1,71 @@
import { warn as warn$1 } from "./logger.js";
import { isBrowserEnvValue, isReactNativeEnv } from "@module-federation/sdk";
//#region src/utils/tool.ts
function addUniqueItem(arr, item) {
if (arr.findIndex((name) => name === item) === -1) arr.push(item);
return arr;
}
function getFMId(remoteInfo) {
if ("version" in remoteInfo && remoteInfo.version) return `${remoteInfo.name}:${remoteInfo.version}`;
else if ("entry" in remoteInfo && remoteInfo.entry) return `${remoteInfo.name}:${remoteInfo.entry}`;
else return `${remoteInfo.name}`;
}
function isRemoteInfoWithEntry(remote) {
return typeof remote.entry !== "undefined";
}
function isPureRemoteEntry(remote) {
return !remote.entry.includes(".json");
}
async function safeWrapper(callback, disableWarn) {
try {
return await callback();
} catch (e) {
!disableWarn && warn$1(e);
return;
}
}
function isObject(val) {
return val && typeof val === "object";
}
const objectToString = Object.prototype.toString;
function isPlainObject(val) {
return objectToString.call(val) === "[object Object]";
}
function isStaticResourcesEqual(url1, url2) {
const REG_EXP = /^(https?:)?\/\//i;
return url1.replace(REG_EXP, "").replace(/\/$/, "") === url2.replace(REG_EXP, "").replace(/\/$/, "");
}
function arrayOptions(options) {
return Array.isArray(options) ? options : [options];
}
function getRemoteEntryInfoFromSnapshot(snapshot) {
const defaultRemoteEntryInfo = {
url: "",
type: "global",
globalName: ""
};
if (isBrowserEnvValue || isReactNativeEnv() || !("ssrRemoteEntry" in snapshot)) return "remoteEntry" in snapshot ? {
url: snapshot.remoteEntry,
type: snapshot.remoteEntryType,
globalName: snapshot.globalName
} : defaultRemoteEntryInfo;
if ("ssrRemoteEntry" in snapshot) return {
url: snapshot.ssrRemoteEntry || defaultRemoteEntryInfo.url,
type: snapshot.ssrRemoteEntryType || defaultRemoteEntryInfo.type,
globalName: snapshot.globalName
};
return defaultRemoteEntryInfo;
}
const processModuleAlias = (name, subPath) => {
let moduleName;
if (name.endsWith("/")) moduleName = name.slice(0, -1);
else moduleName = name;
if (subPath.startsWith(".")) subPath = subPath.slice(1);
moduleName = moduleName + subPath;
return moduleName;
};
//#endregion
export { addUniqueItem, arrayOptions, getFMId, getRemoteEntryInfoFromSnapshot, isObject, isPlainObject, isPureRemoteEntry, isRemoteInfoWithEntry, isStaticResourcesEqual, objectToString, processModuleAlias, safeWrapper };
//# sourceMappingURL=tool.js.map

File diff suppressed because one or more lines are too long