command-check.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { basename } from 'node:path';
  2. import * as p from 'picocolors';
  3. import { getDepsCount } from './get-deps-count';
  4. import { getRecursiveFileList } from './get-recursive-file-list';
  5. export function commandCheck(path = '.') {
  6. const files = getRecursiveFileList(path).filter((file) => basename(file) === 'package.json');
  7. const depsCounter = getDepsCount(files);
  8. const single: string[] = [];
  9. const multiple: string[] = [];
  10. for (const pkg of Object.keys(depsCounter).sort()) {
  11. const versions = depsCounter[pkg];
  12. const versionMap = Object.keys(versions).sort();
  13. const versionsLength = versionMap.length;
  14. if (versionsLength === 1) {
  15. const count = versions[versionMap[0]].length;
  16. single.push(`${p.green('✔')} ${pkg}@${versionMap[0]} (${count})`);
  17. continue;
  18. }
  19. const versionCount: { version: string; count: number }[] = [];
  20. for (const version of versionMap) {
  21. versionCount.push({ version, count: versions[version].length });
  22. }
  23. versionCount.sort((a, b) => b.count - a.count);
  24. multiple.push(`${p.yellow('⚠')} ${pkg} has ${versionsLength} versions:`);
  25. for (const { count, version } of versionCount) {
  26. multiple.push(` - ${p.bold(version)} (${count})`);
  27. }
  28. }
  29. for (const string of [...single.sort(), ...multiple]) {
  30. console.log(string);
  31. }
  32. }