command-check.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. Object.keys(depsCounter)
  11. .sort()
  12. .map((pkg) => {
  13. const versions = depsCounter[pkg];
  14. const versionMap = Object.keys(versions).sort();
  15. const versionsLength = versionMap.length;
  16. if (versionsLength === 1) {
  17. const count = versions[versionMap[0]].length;
  18. single.push(`${p.green('✔')} ${pkg}@${versionMap[0]} (${count})`);
  19. return;
  20. }
  21. const versionCount: { version: string; count: number }[] = [];
  22. for (const version of versionMap) {
  23. versionCount.push({ version, count: versions[version].length });
  24. }
  25. versionCount.sort((a, b) => b.count - a.count);
  26. multiple.push(`${p.yellow('⚠')} ${pkg} has ${versionsLength} versions:`);
  27. for (const { count, version } of versionCount) {
  28. multiple.push(` - ${p.bold(version)} (${count})`);
  29. }
  30. });
  31. for (const string of [...single.sort(), ...multiple]) {
  32. console.log(string);
  33. }
  34. }