@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
87 lines (86 loc) • 2.76 kB
JavaScript
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