iles
Version:
Vite & Vue powered static site generator with partial hydration
56 lines (54 loc) • 1.91 kB
JavaScript
// src/node/plugin/parse.ts
import { init as initESLexer, parse as parseESModules } from "es-module-lexer";
function parseId(id) {
const index = id.indexOf("?");
if (index < 0) return { path: id, query: {} };
const query = Object.fromEntries(new URLSearchParams(id.slice(index)));
return { path: id.slice(0, index), query };
}
async function parseExports(code) {
try {
await initESLexer;
return parseESModules(code)[1].map((spec) => spec.n);
} catch (error) {
console.error(error);
return [];
}
}
async function parseImports(code) {
try {
await initESLexer;
const imports = parseESModules(code)[0];
const importMap = /* @__PURE__ */ Object.create(null);
imports.forEach(({ d: isDynamic, n: from, ss: statementStart, s: importPathStart }) => {
if (isDynamic > -1 || !from) return;
const importFragment = code.substring(statementStart, importPathStart);
parseImportVariables(importFragment).forEach(([name, as = name]) => {
importMap[as] = { name, as, from };
});
});
return importMap;
} catch (error) {
console.error(error);
return {};
}
}
var importStatementRegex = /import\s*(.*?)\s*from['"\s]+$/s;
var importVarRegex = /(?:\{\s*((?:[^,}]+[,\s]*)+)\}|([^,]+))(?:[,\s]*|\s*$)+/sg;
var trim = (s) => s.trim();
function parseImportVariables(partialStatement) {
const variablesStr = partialStatement.match(importStatementRegex)?.[1].trim();
if (!variablesStr) return [];
const variables = Array.from(variablesStr.matchAll(importVarRegex)).flatMap(([, inBrackets, outer]) => {
if (inBrackets) return inBrackets.split(",").map(trim).filter((x) => x);
outer = outer.trim();
return outer.includes(" as ") ? outer : `default as ${outer}`;
});
return variables.map((variable) => variable.split(" as ").map(trim));
}
export {
parseId,
parseExports,
parseImports,
parseImportVariables
};