@esmx/core
Version:
A high-performance microfrontend framework supporting Vue, React, Preact, Solid, and Svelte with SSR and Module Federation capabilities.
43 lines (42 loc) • 1.51 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 = {
// Entry file is also added to the preload list
[specifier]: importInfo[specifier]
};
const needHandles = [specifier];
while (needHandles.length) {
const specifier2 = needHandles.shift();
let filepath = importInfo[specifier2];
const splitRes = filepath.split("/");
if (splitRes[0] === "") splitRes.shift();
const name = splitRes.shift() + "";
const link = moduleConfig.links[name];
if (!link) {
continue;
}
filepath = path.join(link.client, ...splitRes);
const imports = await getImportsFromJsFile(filepath);
for (const specifier3 of imports) {
if (!(specifier3 in importInfo) || specifier3 in ans) continue;
ans[specifier3] = importInfo[specifier3];
needHandles.push(specifier3);
}
}
return Object.fromEntries(Object.entries(ans).reverse());
}