Files
emaui/node_modules/@module-federation/sdk/dist/utils.js
2026-05-29 15:23:46 +03:00

116 lines
4.5 KiB
JavaScript

import { EncodedNameTransformMap, MANIFEST_EXT, NameTransformMap, NameTransformSymbol, SEPARATOR } from "./constant.js";
import { getProcessEnv, isBrowserEnv, isReactNativeEnv } from "./env.js";
//#region src/utils.ts
const LOG_CATEGORY = "[ Federation Runtime ]";
const parseEntry = (str, devVerOrUrl, separator = SEPARATOR) => {
const strSplit = str.split(separator);
const devVersionOrUrl = getProcessEnv()["NODE_ENV"] === "development" && devVerOrUrl;
const defaultVersion = "*";
const isEntry = (s) => s.startsWith("http") || s.includes(MANIFEST_EXT);
if (strSplit.length >= 2) {
let [name, ...versionOrEntryArr] = strSplit;
if (str.startsWith(separator)) {
name = strSplit.slice(0, 2).join(separator);
versionOrEntryArr = [devVersionOrUrl || strSplit.slice(2).join(separator)];
}
let versionOrEntry = devVersionOrUrl || versionOrEntryArr.join(separator);
if (isEntry(versionOrEntry)) return {
name,
entry: versionOrEntry
};
else return {
name,
version: versionOrEntry || defaultVersion
};
} else if (strSplit.length === 1) {
const [name] = strSplit;
if (devVersionOrUrl && isEntry(devVersionOrUrl)) return {
name,
entry: devVersionOrUrl
};
return {
name,
version: devVersionOrUrl || defaultVersion
};
} else throw `Invalid entry value: ${str}`;
};
const composeKeyWithSeparator = function(...args) {
if (!args.length) return "";
return args.reduce((sum, cur) => {
if (!cur) return sum;
if (!sum) return cur;
return `${sum}${SEPARATOR}${cur}`;
}, "");
};
const encodeName = function(name, prefix = "", withExt = false) {
try {
const ext = withExt ? ".js" : "";
return `${prefix}${name.replace(new RegExp(`${NameTransformSymbol.AT}`, "g"), NameTransformMap[NameTransformSymbol.AT]).replace(new RegExp(`${NameTransformSymbol.HYPHEN}`, "g"), NameTransformMap[NameTransformSymbol.HYPHEN]).replace(new RegExp(`${NameTransformSymbol.SLASH}`, "g"), NameTransformMap[NameTransformSymbol.SLASH])}${ext}`;
} catch (err) {
throw err;
}
};
const decodeName = function(name, prefix, withExt) {
try {
let decodedName = name;
if (prefix) {
if (!decodedName.startsWith(prefix)) return decodedName;
decodedName = decodedName.replace(new RegExp(prefix, "g"), "");
}
decodedName = decodedName.replace(new RegExp(`${NameTransformMap[NameTransformSymbol.AT]}`, "g"), EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.AT]]).replace(new RegExp(`${NameTransformMap[NameTransformSymbol.SLASH]}`, "g"), EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.SLASH]]).replace(new RegExp(`${NameTransformMap[NameTransformSymbol.HYPHEN]}`, "g"), EncodedNameTransformMap[NameTransformMap[NameTransformSymbol.HYPHEN]]);
if (withExt) decodedName = decodedName.replace(".js", "");
return decodedName;
} catch (err) {
throw err;
}
};
const generateExposeFilename = (exposeName, withExt) => {
if (!exposeName) return "";
let expose = exposeName;
if (expose === ".") expose = "default_export";
if (expose.startsWith("./")) expose = expose.replace("./", "");
return encodeName(expose, "__federation_expose_", withExt);
};
const generateShareFilename = (pkgName, withExt) => {
if (!pkgName) return "";
return encodeName(pkgName, "__federation_shared_", withExt);
};
const getResourceUrl = (module, sourceUrl) => {
if ("getPublicPath" in module) {
let publicPath;
if (!module.getPublicPath.startsWith("function")) publicPath = new Function(module.getPublicPath)();
else publicPath = new Function("return " + module.getPublicPath)()();
return `${publicPath}${sourceUrl}`;
} else if ("publicPath" in module) {
if (!isBrowserEnv() && !isReactNativeEnv() && "ssrPublicPath" in module && typeof module.ssrPublicPath === "string") return `${module.ssrPublicPath}${sourceUrl}`;
return `${module.publicPath}${sourceUrl}`;
} else {
console.warn("Cannot get resource URL. If in debug mode, please ignore.", module, sourceUrl);
return "";
}
};
const assert = (condition, msg) => {
if (!condition) error(msg);
};
const error = (msg) => {
throw new Error(`${LOG_CATEGORY}: ${msg}`);
};
const warn = (msg) => {
console.warn(`${LOG_CATEGORY}: ${msg}`);
};
function safeToString(info) {
try {
return JSON.stringify(info, null, 2);
} catch (e) {
return "";
}
}
const VERSION_PATTERN_REGEXP = /^([\d^=v<>~]|[*xX]$)/;
function isRequiredVersion(str) {
return VERSION_PATTERN_REGEXP.test(str);
}
//#endregion
export { assert, composeKeyWithSeparator, decodeName, encodeName, error, generateExposeFilename, generateShareFilename, getResourceUrl, isRequiredVersion, parseEntry, safeToString, warn };
//# sourceMappingURL=utils.js.map