/** * 功能:校验非 root 账号登录落点、历史地址恢复与零菜单降级行为。 * 版本:v1.0.0 */ import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; import ts from 'typescript'; const currentDirectory = path.dirname(fileURLToPath(import.meta.url)); const root = path.resolve(currentDirectory, '..'); const source = fs.readFileSync( path.join(root, 'src/router/authorized-landing.ts'), 'utf8', ); const compiled = ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.ESNext, target: ts.ScriptTarget.ES2020, }, }).outputText; const landing = await import( `data:text/javascript;base64,${Buffer.from(compiled).toString('base64')}` ); const menuTree = [ { name: 'finance', meta: { menuCode: 'finance' }, children: [ { name: 'finance-hidden', meta: { menuCode: 'finance', hideInMenu: true }, }, { name: 'finance-payments', meta: { menuCode: 'fin_payment' }, }, ], }, ]; assert.deepEqual(landing.findFirstAuthorizedMenuRoute(menuTree), { name: 'finance-payments', }); assert.equal(landing.findFirstAuthorizedMenuRoute([]), null); function fakeRouter(routeByTarget) { return { resolve(target) { return routeByTarget(String(target.name ?? target.path ?? '')); }, }; } const router = fakeRouter((target) => { if (target === 'finance') { return { name: 'finance', meta: { menuCode: 'finance' }, matched: [{ redirect: '/finance/payments', children: [{}] }], }; } return { name: target, meta: { menuCode: target === 'finance-payments' ? 'fin_payment' : 'dashboard_overview', }, matched: [{ children: [] }], }; }); assert.deepEqual( landing.resolveAuthorizedLanding( router, menuTree, 'finance_operator', ['finance', 'fin_payment'], { name: 'finance-payments' }, ), { name: 'finance-payments' }, ); assert.deepEqual( landing.resolveAuthorizedLanding( router, menuTree, 'finance_operator', ['finance', 'fin_payment'], { name: 'dashboard-overview' }, ), { name: 'finance-payments' }, ); assert.deepEqual( landing.resolveAuthorizedLanding( router, menuTree, 'finance_operator', ['finance', 'fin_payment'], { name: 'finance' }, ), { name: 'finance-payments' }, ); assert.deepEqual( landing.resolveAuthorizedLanding(router, [], 'empty_role', [], undefined), { name: 'noPermission' }, ); for (const [relativePath, expected] of [ ['src/router/constants.ts', "{ name: 'noPermission', children: [] }"], ['src/router/routes/base.ts', "path: '/no-permission'"], [ 'src/views/login/components/login-form.vue', 'resolveAuthorizedLanding(', ], [ 'src/views/no-permission/index.vue', '尚未分配菜单权限', ], ]) { const content = fs.readFileSync(path.join(root, relativePath), 'utf8'); assert.ok(content.includes(expected), `${relativePath} 缺少契约:${expected}`); } process.stdout.write('平台账号授权登录落点检查通过\n');