UNPKG

iles

Version:

Vite & Vue powered static site generator with partial hydration

56 lines (54 loc) 1.91 kB
// 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 };