61 lines
1.6 KiB
JavaScript
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));
|
|
|