index.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import type { CAC } from 'cac';
  2. import { getPackages } from '@vben/node-utils';
  3. import depcheck from 'depcheck';
  4. async function runDepcheck() {
  5. const { packages } = await getPackages();
  6. await Promise.all(
  7. packages.map(async (pkg) => {
  8. if (
  9. [
  10. '@vben/backend-mock',
  11. '@vben/commitlint-config',
  12. '@vben/eslint-config',
  13. '@vben/lint-staged-config',
  14. '@vben/node-utils',
  15. '@vben/prettier-config',
  16. '@vben/stylelint-config',
  17. '@vben/tailwind-config',
  18. '@vben/tsconfig',
  19. '@vben/vite-config',
  20. '@vben/vite-config',
  21. '@vben/vsh',
  22. ].includes(pkg.packageJson.name)
  23. ) {
  24. return;
  25. }
  26. const unused = await depcheck(pkg.dir, {
  27. ignoreMatches: [
  28. 'vite',
  29. 'vitest',
  30. 'unbuild',
  31. '@vben/tsconfig',
  32. '@vben/vite-config',
  33. '@vben/tailwind-config',
  34. '@types/*',
  35. '@vben-core/design',
  36. ],
  37. ignorePatterns: ['dist', 'node_modules', 'public'],
  38. });
  39. // 删除file:前缀的依赖提示,该依赖是本地依赖
  40. Reflect.deleteProperty(unused.missing, 'file:');
  41. Object.keys(unused.missing).forEach((key) => {
  42. unused.missing[key] = unused.missing[key].filter(
  43. (item: string) => !item.startsWith('/'),
  44. );
  45. if (unused.missing[key].length === 0) {
  46. Reflect.deleteProperty(unused.missing, key);
  47. }
  48. });
  49. if (
  50. Object.keys(unused.missing).length === 0 &&
  51. unused.dependencies.length === 0 &&
  52. unused.devDependencies.length === 0
  53. ) {
  54. return;
  55. }
  56. console.error(
  57. '\n',
  58. pkg.packageJson.name,
  59. '\n missing:',
  60. unused.missing,
  61. '\n dependencies:',
  62. unused.dependencies,
  63. '\n devDependencies:',
  64. unused.devDependencies,
  65. );
  66. }),
  67. );
  68. }
  69. function defineDepcheckCommand(cac: CAC) {
  70. cac
  71. .command('check-dep')
  72. .usage(`Analysis of project circular dependencies.`)
  73. .action(async () => {
  74. await runDepcheck();
  75. });
  76. }
  77. export { defineDepcheckCommand };