UNPKG

@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
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; }