f
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Deploy Website on push / Rerun on failure (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled

This commit is contained in:
2026-01-10 18:11:29 +08:00
commit 69f3c4ce45
1443 changed files with 125558 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
import type { CAC } from 'cac';
import { extname } from 'node:path';
import { getStagedFiles } from '@vben/node-utils';
import { circularDepsDetect, printCircles } from 'circular-dependency-scanner';
const IGNORE_DIR = [
'dist',
'.turbo',
'output',
'.cache',
'scripts',
'internal',
'packages/effects/request/src/',
'packages/@core/ui-kit/menu-ui/src/',
'packages/@core/ui-kit/popup-ui/src/',
].join(',');
const IGNORE = [`**/{${IGNORE_DIR}}/**`];
interface CommandOptions {
staged: boolean;
verbose: boolean;
}
async function checkCircular({ staged, verbose }: CommandOptions) {
const results = await circularDepsDetect({
absolute: staged,
cwd: process.cwd(),
ignore: IGNORE,
});
if (staged) {
let files = await getStagedFiles();
const allowedExtensions = new Set([
'.cjs',
'.js',
'.jsx',
'.mjs',
'.ts',
'.tsx',
'.vue',
]);
// 过滤文件列表
files = files.filter((file) => allowedExtensions.has(extname(file)));
const circularFiles: string[][] = [];
for (const file of files) {
for (const result of results) {
const resultFiles = result.flat();
if (resultFiles.includes(file)) {
circularFiles.push(result);
}
}
}
verbose && printCircles(circularFiles);
} else {
verbose && printCircles(results);
}
}
function defineCheckCircularCommand(cac: CAC) {
cac
.command('check-circular')
.option(
'--staged',
'Whether it is the staged commit mode, in which mode, if there is a circular dependency, an alarm will be given.',
)
.usage(`Analysis of project circular dependencies.`)
.action(async ({ staged }) => {
await checkCircular({ staged, verbose: true });
});
}
export { defineCheckCircularCommand };