办学质量监测教学评价系统
shenrongliang
2025-06-13 11d86cc6c26bb4f709e407acadf4805c2024e79f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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 };