62 lines
1.9 KiB
JavaScript
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);
|
|
}
|