@gez/core
Version:
A high-performance microfrontend framework supporting Vue, React, Preact, Solid, and Svelte with SSR and Module Federation capabilities.
44 lines (43 loc) • 1.53 kB
JavaScript
import fsp from "node:fs/promises";
import path from "node:path";
import * as esmLexer from "es-module-lexer";
export async function getImportsFromJsCode(code) {
await esmLexer.init;
const [imports] = esmLexer.parse(code);
return imports.filter((item) => item.t === 1 && item.n).map((item) => item.n);
}
export async function getImportsFromJsFile(filepath) {
const source = await fsp.readFile(filepath, "utf-8");
return getImportsFromJsCode(source);
}
export async function getImportPreloadInfo(specifier, importMap, moduleConfig) {
const importInfo = importMap.imports;
if (!importInfo || !(specifier in importInfo)) {
return null;
}
const ans = {};
const needHandles = [[specifier]];
while (needHandles.length) {
const needHandle = [];
for (const specifier2 of needHandles.shift()) {
let filepath = importInfo[specifier2];
const splitRes = filepath.split("/");
if (splitRes[0] === "") splitRes.shift();
const name = splitRes.shift() + "";
const link = moduleConfig.links.find((item) => item.name === name);
if (!link) {
continue;
}
filepath = path.join(link.root, "client", ...splitRes);
const imports = await getImportsFromJsFile(filepath);
imports.forEach((specifier3) => {
if (specifier3 in importInfo && !ans[specifier3]) {
ans[specifier3] = importInfo[specifier3];
needHandle.push(specifier3);
}
});
}
needHandle.length && needHandles.push(needHandle);
}
return ans;
}