Files
platforms/frontend/platform_admin/scripts/check-authorized-login-landing.mjs

128 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 功能:校验非 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');