mirror of
https://github.com/Tria-plc/emaui.git
synced 2026-08-27 01:22:49 +00:00
116 lines
4.5 KiB
JavaScript
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
|