48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import assert from "node:assert/strict";
|
||
import { readFileSync } from "node:fs";
|
||
import { resolve } from "node:path";
|
||
|
||
const appVuePath = resolve("frontend/src/App.vue");
|
||
const source = readFileSync(appVuePath, "utf8");
|
||
|
||
const navStart = source.indexOf("const navStages = [");
|
||
const navEnd = source.indexOf("\n];", navStart);
|
||
|
||
assert.notEqual(navStart, -1, "未找到 navStages 菜单配置");
|
||
assert.notEqual(navEnd, -1, "未找到 navStages 结束位置");
|
||
|
||
const navSource = source.slice(navStart, navEnd);
|
||
const iconEntries = [];
|
||
const entryPattern = /label:\s*"([^"]+)"[\s\S]*?iconPaths:\s*\[([\s\S]*?)\]/g;
|
||
|
||
let match;
|
||
while ((match = entryPattern.exec(navSource))) {
|
||
const [, label, iconSource] = match;
|
||
const paths = [...iconSource.matchAll(/"([^"]+)"/g)].map((pathMatch) => pathMatch[1].trim());
|
||
if (paths.length) {
|
||
iconEntries.push({
|
||
label,
|
||
signature: paths.join("|")
|
||
});
|
||
}
|
||
}
|
||
|
||
assert.ok(iconEntries.length > 0, "未解析到任何侧边栏图标配置");
|
||
|
||
const labelsBySignature = new Map();
|
||
for (const entry of iconEntries) {
|
||
const labels = labelsBySignature.get(entry.signature) || [];
|
||
labels.push(entry.label);
|
||
labelsBySignature.set(entry.signature, labels);
|
||
}
|
||
|
||
const duplicates = [...labelsBySignature.values()].filter((labels) => labels.length > 1);
|
||
|
||
assert.deepEqual(
|
||
duplicates,
|
||
[],
|
||
`侧边栏存在重复图标:${duplicates.map((labels) => labels.join(" / ")).join(";")}`
|
||
);
|
||
|
||
console.log(`侧边栏图标唯一性检查通过,共检查 ${iconEntries.length} 个菜单图标。`);
|