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));