library-picturebook-activity/java-frontend/scripts/extract-perms.cjs
2026-04-01 19:30:33 +08:00

61 lines
1.6 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const root = path.resolve(__dirname, "..", "src");
const exts = new Set([".ts", ".vue"]);
const codes = {
v_permission: new Set(),
route_meta_permissions: new Set(),
logic_checks: new Set(),
};
const reVPermission = /v-permission(?:\.[a-zA-Z]+)?\s*=\s*(?:"([^"]+)"|'([^']+)')/g;
const rePermissionCode = /['"`]([a-zA-Z0-9_-]+:[a-zA-Z0-9_:-]+|super_admin)['"`]/g;
const reMetaPermissions = /permissions\s*:\s*\[([^\]]+)\]/g;
const reHasPermission = /has(?:Any)?Permission\(\s*['"`]([a-zA-Z0-9_-]+:[a-zA-Z0-9_:-]+|super_admin)['"`]/g;
function walk(dir) {
for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
const p = path.join(dir, ent.name);
if (ent.isDirectory()) {
walk(p);
continue;
}
if (!exts.has(path.extname(ent.name))) continue;
const s = fs.readFileSync(p, "utf8");
for (const m of s.matchAll(reVPermission)) {
const val = m[1] || m[2] || "";
for (const c of val.matchAll(rePermissionCode)) {
codes.v_permission.add(c[1]);
}
}
for (const m of s.matchAll(reMetaPermissions)) {
const inner = m[1] || "";
for (const c of inner.matchAll(rePermissionCode)) {
codes.route_meta_permissions.add(c[1]);
}
}
for (const m of s.matchAll(reHasPermission)) {
codes.logic_checks.add(m[1]);
}
}
}
walk(root);
const sort = (set) => Array.from(set).sort();
const result = {
v_permission: sort(codes.v_permission),
route_meta_permissions: sort(codes.route_meta_permissions),
logic_checks: sort(codes.logic_checks),
};
console.log(JSON.stringify(result, null, 2));