Files

62 lines
1.9 KiB
JavaScript

import { readFileSync } from "fs";
import { globSync } from "glob";
const includePatterns = ["src/**/*.svelte", "src/**/*.css"];
const files = globSync(includePatterns);
const defined = new Set();
const used = new Set();
const usageLocations = [];
files.forEach((file) => {
const content = readFileSync(file, "utf-8");
const lines = content.split("\n");
const defMatches = content.matchAll(/--[\w-]+(?=\s*:)/g);
for (const m of defMatches) {
defined.add(m[0]);
}
lines.forEach((line, idx) => {
const varMatches = line.matchAll(/var\(\s*--[\w-]+\s*\)/g);
for (const match of varMatches) {
const varName = match[0].slice(4, -1).trim();
used.add(varName);
usageLocations.push({
file,
line: idx + 1,
column: match.index + 1,
varName,
});
}
});
});
let hasUndefined = false;
const undefinedErrors = usageLocations.filter((loc) => !defined.has(loc.varName));
undefinedErrors.forEach(({ file, line, column, varName }) => {
console.error(`❌ ${file}:${line}:${column} — не определена CSS-переменная "${varName}"`);
hasUndefined = true;
});
const unused = [...defined].filter((varName) => !used.has(varName));
if (unused.length > 0) {
console.warn("\n⚠️ Объявлены, но нигде не используются:");
unused.forEach((varName) => console.warn(` ${varName}`));
}
if (hasUndefined) {
console.error("\n❌ Найдены неопределённые переменные. Исправьте их.");
process.exit(1);
} else {
if (unused.length === 0) {
console.log("\n✅ Все CSS-переменные определены и используются.");
} else {
console.log("\n✅ Неопределённых переменных нет, но есть неиспользуемые (см. предупреждения).");
}
process.exit(0);
}