UNPKG

@lobehub/ui

Version:

Lobe UI is an open-source UI component library for building AIGC web apps

87 lines (86 loc) 2.76 kB
import { readFileSync, readdirSync, statSync } from "node:fs"; import path from "node:path"; //#region src/static-css/scan.ts const DEFAULT_EXTENSIONS = [ "ts", "tsx", "js", "jsx", "mjs", "mts", "cjs", "cts" ]; const DEFAULT_EXCLUDE = [ /node_modules/, /\.test\./, /\.spec\./, /\.d\.[cm]?ts$/, /__tests__/ ]; const NAMED_IMPORT_RE = /import\s+(type\s+)?((?:[\w$]+\s*,\s*)?\{[^}]*\}|[\w$]+|\*\s+as\s+[\w$]+)\s+from\s+['"]antd['"]/g; const DEEP_IMPORT_RE = /from\s+['"]antd\/(?:es|lib)\/([\w-]+)/g; const LOBE_UI_RE = /from\s+['"]@lobehub\/ui(?:['"]|\/)/; const kebabToPascal = (name) => name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(""); const parseImportClause = (clause, components) => { const braceStart = clause.indexOf("{"); const wildcard = (braceStart === -1 ? clause : clause.slice(0, braceStart)).trim().length > 0; if (braceStart === -1) return wildcard; const inner = clause.slice(braceStart + 1, clause.lastIndexOf("}")); for (const rawSpecifier of inner.split(",")) { const specifier = rawSpecifier.trim(); if (!specifier || specifier.startsWith("type ")) continue; const name = specifier.split(/\s+as\s+/)[0].trim(); if (/^[A-Za-z_$][\w$]*$/.test(name)) components.add(name); } return wildcard; }; const listFiles = (root, extensions, exclude) => { let entries; try { entries = readdirSync(root, { recursive: true }); } catch { return []; } return entries.map((entry) => path.join(root, entry)).filter((path) => { if (exclude.some((pattern) => pattern.test(path))) return false; const extension = path.split(".").pop(); if (!extension || !extensions.has(extension)) return false; try { return statSync(path).isFile(); } catch { return false; } }); }; const scanAntdUsage = (options = {}) => { const { cwd = process.cwd(), roots = ["src"], extensions = DEFAULT_EXTENSIONS, exclude = DEFAULT_EXCLUDE } = options; const components = /* @__PURE__ */ new Set(); let importsLobeUi = false; let wildcard = false; let scannedFiles = 0; for (const root of roots) for (const file of listFiles(path.resolve(cwd, root), new Set(extensions), exclude)) { let source; try { source = readFileSync(file, "utf8"); } catch { continue; } scannedFiles += 1; if (!importsLobeUi && LOBE_UI_RE.test(source)) importsLobeUi = true; for (const match of source.matchAll(NAMED_IMPORT_RE)) { if (match[1]) continue; if (parseImportClause(match[2], components)) wildcard = true; } for (const match of source.matchAll(DEEP_IMPORT_RE)) components.add(kebabToPascal(match[1])); } return { components: [...components].sort(), importsLobeUi, scannedFiles, wildcard }; }; //#endregion export { scanAntdUsage }; //# sourceMappingURL=scan.mjs.map