UNPKG

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