@macrulez/devtoolz 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +97 -8
  2. package/dist/cli.js +185 -9
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/case-check/report.js +8 -6
  5. package/dist/commands/case-check/report.js.map +1 -1
  6. package/dist/commands/circular-imports/report.js +11 -12
  7. package/dist/commands/circular-imports/report.js.map +1 -1
  8. package/dist/commands/console-strip/report.js +9 -7
  9. package/dist/commands/console-strip/report.js.map +1 -1
  10. package/dist/commands/dead-exports/report.js +6 -4
  11. package/dist/commands/dead-exports/report.js.map +1 -1
  12. package/dist/commands/empty-catch/report.js +5 -3
  13. package/dist/commands/empty-catch/report.js.map +1 -1
  14. package/dist/commands/exports-doctor/report.js +7 -5
  15. package/dist/commands/exports-doctor/report.js.map +1 -1
  16. package/dist/commands/full-check/report.js +24 -30
  17. package/dist/commands/full-check/report.js.map +1 -1
  18. package/dist/commands/image-hash/cache.d.ts +14 -0
  19. package/dist/commands/image-hash/cache.js +40 -0
  20. package/dist/commands/image-hash/cache.js.map +1 -0
  21. package/dist/commands/image-hash/core.d.ts +56 -0
  22. package/dist/commands/image-hash/core.js +293 -0
  23. package/dist/commands/image-hash/core.js.map +1 -0
  24. package/dist/commands/image-hash/hash.d.ts +19 -0
  25. package/dist/commands/image-hash/hash.js +97 -0
  26. package/dist/commands/image-hash/hash.js.map +1 -0
  27. package/dist/commands/image-hash/report.d.ts +3 -0
  28. package/dist/commands/image-hash/report.js +94 -0
  29. package/dist/commands/image-hash/report.js.map +1 -0
  30. package/dist/commands/image-hash/run.d.ts +60 -0
  31. package/dist/commands/image-hash/run.js +315 -0
  32. package/dist/commands/image-hash/run.js.map +1 -0
  33. package/dist/commands/image-hash/sharp-loader.d.ts +59 -0
  34. package/dist/commands/image-hash/sharp-loader.js +79 -0
  35. package/dist/commands/image-hash/sharp-loader.js.map +1 -0
  36. package/dist/commands/orphan-tests/report.js +7 -5
  37. package/dist/commands/orphan-tests/report.js.map +1 -1
  38. package/dist/commands/readme-check/report.js +7 -5
  39. package/dist/commands/readme-check/report.js.map +1 -1
  40. package/dist/commands/scripts-check/report.js +7 -5
  41. package/dist/commands/scripts-check/report.js.map +1 -1
  42. package/dist/commands/stale-ts-ignore/report.js +7 -5
  43. package/dist/commands/stale-ts-ignore/report.js.map +1 -1
  44. package/dist/commands/strip-comments/report.js +6 -4
  45. package/dist/commands/strip-comments/report.js.map +1 -1
  46. package/dist/commands/todo-report/report.js +7 -5
  47. package/dist/commands/todo-report/report.js.map +1 -1
  48. package/dist/commands/unused-deps/report.js +7 -5
  49. package/dist/commands/unused-deps/report.js.map +1 -1
  50. package/dist/format/colors.d.ts +4 -0
  51. package/dist/format/colors.js +4 -3
  52. package/dist/format/colors.js.map +1 -1
  53. package/dist/format/diff-render.js +2 -2
  54. package/dist/format/diff-render.js.map +1 -1
  55. package/dist/format/file-list.d.ts +1 -9
  56. package/dist/format/file-list.js +5 -16
  57. package/dist/format/file-list.js.map +1 -1
  58. package/dist/format/findings-list.d.ts +1 -8
  59. package/dist/format/findings-list.js +5 -14
  60. package/dist/format/findings-list.js.map +1 -1
  61. package/dist/format/style.d.ts +20 -0
  62. package/dist/format/style.js +36 -0
  63. package/dist/format/style.js.map +1 -0
  64. package/dist/format/table.d.ts +8 -0
  65. package/dist/format/table.js +44 -0
  66. package/dist/format/table.js.map +1 -0
  67. package/dist/format/vibes.d.ts +4 -1
  68. package/dist/format/vibes.js +25 -10
  69. package/dist/format/vibes.js.map +1 -1
  70. package/dist/index.d.ts +4 -0
  71. package/dist/index.js +2 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/utils/walk.d.ts +2 -0
  74. package/dist/utils/walk.js +4 -3
  75. package/dist/utils/walk.js.map +1 -1
  76. package/package.json +4 -1
@@ -1,15 +1,17 @@
1
1
  import { banner, cleanCelebration } from '../../format/vibes.js';
2
2
  import { formatFindingsRows } from '../../format/findings-list.js';
3
+ import { createStyle } from '../../format/style.js';
3
4
  const KIND_TAG = {
4
5
  missing: 'mentioned here, but not in package.json scripts',
5
6
  undocumented: 'in package.json scripts, but not mentioned anywhere checked',
6
7
  };
7
8
  export function renderScriptsCheckReport(report, options = {}) {
9
+ const s = createStyle(options);
8
10
  if (report.error) {
9
11
  const lines = [];
10
12
  if (!options.quiet && !options.plain)
11
- lines.push(banner(), '');
12
- lines.push(`Could not run scripts-check: ${report.error}`);
13
+ lines.push(banner(options), '');
14
+ lines.push(s.error(`Could not run scripts-check: ${report.error}`));
13
15
  return lines.join('\n');
14
16
  }
15
17
  const isClean = report.findings.length === 0;
@@ -17,13 +19,13 @@ export function renderScriptsCheckReport(report, options = {}) {
17
19
  return '';
18
20
  const lines = [];
19
21
  if (!options.quiet && !options.plain)
20
- lines.push(banner(), '');
21
- lines.push(`Checked ${report.sourcesScanned.length} source${report.sourcesScanned.length === 1 ? '' : 's'} against package.json's scripts.`, '');
22
+ lines.push(banner(options), '');
23
+ lines.push(s.info(`Checked ${report.sourcesScanned.length} source${report.sourcesScanned.length === 1 ? '' : 's'} against package.json's scripts.`), '');
22
24
  if (isClean) {
23
25
  lines.push(cleanCelebration(options));
24
26
  return lines.join('\n');
25
27
  }
26
- lines.push(`${report.findings.length} problem${report.findings.length === 1 ? '' : 's'} found:`);
28
+ lines.push(s.problem(`${report.findings.length} problem${report.findings.length === 1 ? '' : 's'} found:`));
27
29
  lines.push(...formatFindingsRows(report.findings.map((f) => ({
28
30
  location: `${f.file}:${f.line}`,
29
31
  name: f.name,
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/scripts-check/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAGlE,MAAM,QAAQ,GAA2B;IACvC,OAAO,EAAE,iDAAiD;IAC1D,YAAY,EAAE,6DAA6D;CAC5E,CAAA;AAED,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,UAAwB,EAAE;IAE1B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,KAAK,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAE9D,KAAK,CAAC,IAAI,CACR,WAAW,MAAM,CAAC,cAAc,CAAC,MAAM,UAAU,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kCAAkC,EAChI,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAChG,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI;KAChC,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/scripts-check/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,QAAQ,GAA2B;IACvC,OAAO,EAAE,iDAAiD;IAC1D,YAAY,EAAE,6DAA6D;CAC5E,CAAA;AAED,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,UAAwB,EAAE;IAE1B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,IAAI,CACJ,WAAW,MAAM,CAAC,cAAc,CAAC,MAAM,UAAU,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kCAAkC,CACjI,EACD,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAChG,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI;KAChC,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { banner, cleanCelebration } from '../../format/vibes.js';
2
2
  import { formatFindingsRows } from '../../format/findings-list.js';
3
+ import { createStyle } from '../../format/style.js';
3
4
  export function renderStaleTsIgnoreReport(report, options = {}) {
5
+ const s = createStyle(options);
4
6
  if (report.error) {
5
7
  const lines = [];
6
8
  if (!options.quiet && !options.plain)
7
- lines.push(banner(), '');
8
- lines.push(`Could not run stale-ts-ignore: ${report.error}`);
9
+ lines.push(banner(options), '');
10
+ lines.push(s.error(`Could not run stale-ts-ignore: ${report.error}`));
9
11
  return lines.join('\n');
10
12
  }
11
13
  const isClean = report.findings.length === 0;
@@ -13,13 +15,13 @@ export function renderStaleTsIgnoreReport(report, options = {}) {
13
15
  return '';
14
16
  const lines = [];
15
17
  if (!options.quiet && !options.plain)
16
- lines.push(banner(), '');
17
- lines.push(`Checked ${report.directivesChecked} @ts-ignore directive${report.directivesChecked === 1 ? '' : 's'}.`, '');
18
+ lines.push(banner(options), '');
19
+ lines.push(s.info(`Checked ${report.directivesChecked} @ts-ignore directive${report.directivesChecked === 1 ? '' : 's'}.`), '');
18
20
  if (isClean) {
19
21
  lines.push(cleanCelebration(options));
20
22
  return lines.join('\n');
21
23
  }
22
- lines.push(`${report.findings.length} stale @ts-ignore${report.findings.length === 1 ? '' : 's'} found:`);
24
+ lines.push(s.problem(`${report.findings.length} stale @ts-ignore${report.findings.length === 1 ? '' : 's'} found:`));
23
25
  lines.push(...formatFindingsRows(report.findings.map((f) => ({
24
26
  location: `${f.file}:${f.line}`,
25
27
  name: '@ts-ignore',
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/stale-ts-ignore/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAGlE,MAAM,UAAU,yBAAyB,CACvC,MAA2B,EAC3B,UAAwB,EAAE;IAE1B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,KAAK,CAAC,IAAI,CAAC,kCAAkC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAE9D,KAAK,CAAC,IAAI,CACR,WAAW,MAAM,CAAC,iBAAiB,wBAAwB,MAAM,CAAC,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EACvG,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,oBAAoB,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAC9F,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,6EAA6E;KACnF,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/stale-ts-ignore/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,UAAU,yBAAyB,CACvC,MAA2B,EAC3B,UAAwB,EAAE;IAE1B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACrE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,IAAI,CACJ,WAAW,MAAM,CAAC,iBAAiB,wBAAwB,MAAM,CAAC,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CACxG,EACD,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,OAAO,CACP,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,oBAAoB,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAC9F,CACF,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;QAC/B,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,6EAA6E;KACnF,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -1,23 +1,25 @@
1
1
  import { banner, cleanCelebration } from '../../format/vibes.js';
2
2
  import { formatFileCountRows } from '../../format/file-list.js';
3
3
  import { renderDiffForHumans } from '../../format/diff-render.js';
4
+ import { createStyle } from '../../format/style.js';
4
5
  export function renderStripCommentsReport(report, options = {}) {
6
+ const s = createStyle(options);
5
7
  if (options.quiet && report.changes.length === 0)
6
8
  return '';
7
9
  const lines = [];
8
10
  if (!options.quiet && !options.plain)
9
- lines.push(banner(), '');
10
- lines.push(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`, '');
11
+ lines.push(banner(options), '');
12
+ lines.push(s.info(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`), '');
11
13
  if (report.changes.length === 0) {
12
14
  lines.push(cleanCelebration(options));
13
15
  return lines.join('\n');
14
16
  }
15
17
  const verb = report.applied ? 'Stripped comments in' : 'Would strip comments in';
16
- lines.push(`${verb} ${report.changes.length} file(s):`);
18
+ lines.push(s.heading(`${verb} ${report.changes.length} file(s):`));
17
19
  lines.push(...formatFileCountRows(report.changes, (n) => `comment${n === 1 ? '' : 's'}`, options));
18
20
  if (!report.applied) {
19
21
  const diffHint = report.changes.some((c) => c.diff) ? '' : ', or --diff to see exactly what';
20
- lines.push('', `(nothing written — pass -y to apply${diffHint}, or --dry-run to keep previewing)`);
22
+ lines.push('', s.hint(`(nothing written — pass -y to apply${diffHint}, or --dry-run to keep previewing)`));
21
23
  }
22
24
  for (const change of report.changes) {
23
25
  if (!change.diff)
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/strip-comments/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAOjE,MAAM,UAAU,yBAAyB,CACvC,MAA2B,EAC3B,UAAyB,EAAE;IAE3B,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE3D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAE9D,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAA;IAE7F,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAElG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iCAAiC,CAAA;QAC5F,KAAK,CAAC,IAAI,CACR,EAAE,EACF,sCAAsC,QAAQ,oCAAoC,CACnF,CAAA;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,SAAQ;QAC1B,MAAM,IAAI,GAAG,UAAU,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/strip-comments/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAOnD,MAAM,UAAU,yBAAyB,CACvC,MAA2B,EAC3B,UAAyB,EAAE;IAE3B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE3D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EACrF,EAAE,CACH,CAAA;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,yBAAyB,CAAA;IAChF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,CAAA;IAClE,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAElG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iCAAiC,CAAA;QAC5F,KAAK,CAAC,IAAI,CACR,EAAE,EACF,CAAC,CAAC,IAAI,CAAC,sCAAsC,QAAQ,oCAAoC,CAAC,CAC3F,CAAA;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,SAAQ;QAC1B,MAAM,IAAI,GAAG,UAAU,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -1,13 +1,15 @@
1
1
  import { banner, cleanCelebration } from '../../format/vibes.js';
2
2
  import { formatFindingsRows } from '../../format/findings-list.js';
3
+ import { createStyle } from '../../format/style.js';
3
4
  export function renderTodoReportReport(report, options = {}) {
5
+ const s = createStyle(options);
4
6
  const isClean = report.findings.length === 0;
5
7
  if (options.quiet && isClean)
6
8
  return '';
7
9
  const lines = [];
8
10
  if (!options.quiet && !options.plain)
9
- lines.push(banner(), '');
10
- lines.push(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`, '');
11
+ lines.push(banner(options), '');
12
+ lines.push(s.info(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`), '');
11
13
  if (isClean) {
12
14
  lines.push(cleanCelebration(options));
13
15
  return lines.join('\n');
@@ -15,7 +17,7 @@ export function renderTodoReportReport(report, options = {}) {
15
17
  const tagSummary = Object.entries(report.countsByTag)
16
18
  .map(([tag, count]) => `${tag}: ${count}`)
17
19
  .join(', ');
18
- lines.push(`${report.findings.length} comment${report.findings.length === 1 ? '' : 's'} found (${tagSummary}):`);
20
+ lines.push(s.problem(`${report.findings.length} comment${report.findings.length === 1 ? '' : 's'} found (${tagSummary}):`));
19
21
  lines.push(...formatFindingsRows(report.findings.map((f) => ({
20
22
  location: `${f.file}:${f.line}:${f.column}`,
21
23
  name: f.tag,
@@ -23,8 +25,8 @@ export function renderTodoReportReport(report, options = {}) {
23
25
  })), options));
24
26
  if (report.max > 0) {
25
27
  lines.push('', report.exitCode === 0
26
- ? `Within the configured limit (--max ${report.max}).`
27
- : `Over the configured limit (--max ${report.max}).`);
28
+ ? s.success(`Within the configured limit (--max ${report.max}).`)
29
+ : s.error(`Over the configured limit (--max ${report.max}).`));
28
30
  }
29
31
  return lines.join('\n');
30
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/todo-report/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAGlE,MAAM,UAAU,sBAAsB,CACpC,MAAwB,EACxB,UAAwB,EAAE;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAE9D,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAA;IAE7F,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,UAAU,IAAI,CACrG,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE;QAC3C,IAAI,EAAE,CAAC,CAAC,GAAG;QACX,GAAG,EAAE,CAAC,CAAC,IAAI;KACZ,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,MAAM,CAAC,QAAQ,KAAK,CAAC;YACnB,CAAC,CAAC,sCAAsC,MAAM,CAAC,GAAG,IAAI;YACtD,CAAC,CAAC,oCAAoC,MAAM,CAAC,GAAG,IAAI,CACvD,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/todo-report/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,UAAU,sBAAsB,CACpC,MAAwB,EACxB,UAAwB,EAAE;IAE1B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EACrF,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,OAAO,CACP,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,UAAU,IAAI,CACrG,CACF,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE;QAC3C,IAAI,EAAE,CAAC,CAAC,GAAG;QACX,GAAG,EAAE,CAAC,CAAC,IAAI;KACZ,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,MAAM,CAAC,QAAQ,KAAK,CAAC;YACnB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,sCAAsC,MAAM,CAAC,GAAG,IAAI,CAAC;YACjE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,oCAAoC,MAAM,CAAC,GAAG,IAAI,CAAC,CAChE,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { banner, cleanCelebration } from '../../format/vibes.js';
2
2
  import { formatFindingsRows } from '../../format/findings-list.js';
3
+ import { createStyle } from '../../format/style.js';
3
4
  export function renderUnusedDepsReport(report, options = {}) {
5
+ const s = createStyle(options);
4
6
  if (report.error) {
5
7
  const lines = [];
6
8
  if (!options.quiet && !options.plain)
7
- lines.push(banner(), '');
8
- lines.push(`Could not run unused-deps: ${report.error}`);
9
+ lines.push(banner(options), '');
10
+ lines.push(s.error(`Could not run unused-deps: ${report.error}`));
9
11
  return lines.join('\n');
10
12
  }
11
13
  const isClean = report.findings.length === 0;
@@ -13,13 +15,13 @@ export function renderUnusedDepsReport(report, options = {}) {
13
15
  return '';
14
16
  const lines = [];
15
17
  if (!options.quiet && !options.plain)
16
- lines.push(banner(), '');
17
- lines.push(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`, '');
18
+ lines.push(banner(options), '');
19
+ lines.push(s.info(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`), '');
18
20
  if (isClean) {
19
21
  lines.push(cleanCelebration(options));
20
22
  return lines.join('\n');
21
23
  }
22
- lines.push(`${report.findings.length} problem${report.findings.length === 1 ? '' : 's'} found:`);
24
+ lines.push(s.problem(`${report.findings.length} problem${report.findings.length === 1 ? '' : 's'} found:`));
23
25
  lines.push(...formatFindingsRows(report.findings.map((f) => ({
24
26
  location: f.kind,
25
27
  name: f.name,
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/unused-deps/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAGlE,MAAM,UAAU,sBAAsB,CACpC,MAAwB,EACxB,UAAwB,EAAE;IAE1B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,KAAK,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACxD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;IAE9D,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAA;IAE7F,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAChG,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,CAAC,CAAC,IAAI;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EACD,CAAC,CAAC,IAAI,KAAK,QAAQ;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,0BAA0B;YACzC,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,iCAAiC;KACvE,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/unused-deps/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,MAAM,UAAU,sBAAsB,CACpC,MAAwB,EACxB,UAAwB,EAAE;IAE1B,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,8BAA8B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAErE,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EACrF,EAAE,CACH,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAChG,CAAA;IACD,KAAK,CAAC,IAAI,CACR,GAAG,kBAAkB,CACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,CAAC,CAAC,IAAI;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,EACD,CAAC,CAAC,IAAI,KAAK,QAAQ;YACjB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,0BAA0B;YACzC,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,iCAAiC;KACvE,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -3,6 +3,10 @@ export declare const BOLD = "\u001B[1m";
3
3
  export declare const DIM = "\u001B[2m";
4
4
  export declare const RED = "\u001B[31m";
5
5
  export declare const GREEN = "\u001B[32m";
6
+ export declare const YELLOW = "\u001B[33m";
7
+ export declare const BLUE = "\u001B[34m";
8
+ export declare const MAGENTA = "\u001B[35m";
6
9
  export declare const CYAN = "\u001B[36m";
7
10
  export declare const WHITE = "\u001B[97m";
11
+ export declare const GRAY = "\u001B[90m";
8
12
  export declare function colorize(color: string, text: string): string;
@@ -1,13 +1,14 @@
1
- // Minimal ANSI palette — no chalk/picocolors dependency for a handful of
2
- // escape codes. Every caller gates these behind `isFancyOutputEnabled()`
3
- // from vibes.ts, never applied unconditionally.
4
1
  export const RESET = '\x1b[0m';
5
2
  export const BOLD = '\x1b[1m';
6
3
  export const DIM = '\x1b[2m';
7
4
  export const RED = '\x1b[31m';
8
5
  export const GREEN = '\x1b[32m';
6
+ export const YELLOW = '\x1b[33m';
7
+ export const BLUE = '\x1b[34m';
8
+ export const MAGENTA = '\x1b[35m';
9
9
  export const CYAN = '\x1b[36m';
10
10
  export const WHITE = '\x1b[97m';
11
+ export const GRAY = '\x1b[90m';
11
12
  export function colorize(color, text) {
12
13
  return `${color}${text}${RESET}`;
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/format/colors.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,gDAAgD;AAChD,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAA;AAC9B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAA;AAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAA;AAC7B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAA;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAA;AAE/B,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAY;IAClD,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;AAClC,CAAC"}
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/format/colors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAA;AAC9B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAA;AAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAA;AAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAA;AAC7B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAA;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAA;AAChC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAA;AACjC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAA;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAE9B,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAY;IAClD,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;AAClC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { isFancyOutputEnabled } from './vibes.js';
1
+ import { isColorEnabled } from './vibes.js';
2
2
  import { BOLD, CYAN, colorize, GREEN, RED } from './colors.js';
3
3
  const RULE_CHAR = '─';
4
4
  const DEFAULT_WIDTH = 70;
@@ -12,7 +12,7 @@ const DEFAULT_WIDTH = 70;
12
12
  // statement count, so it doesn't need re-reading from the list above),
13
13
  // and +/- lines get their usual red/green.
14
14
  export function renderDiffForHumans(file, count, unit, patch, options = {}) {
15
- const fancy = isFancyOutputEnabled(options);
15
+ const fancy = isColorEnabled(options);
16
16
  const lines = patch.split('\n');
17
17
  const firstHunkIndex = lines.findIndex((l) => l.startsWith('@@'));
18
18
  const body = firstHunkIndex === -1 ? lines : lines.slice(firstHunkIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"diff-render.js","sourceRoot":"","sources":["../../src/format/diff-render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAA;AACpE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAE9D,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,aAAa,GAAG,EAAE,CAAA;AAExB,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,2CAA2C;AAC3C,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAAa,EACb,IAAY,EACZ,KAAa,EACb,UAAwB,EAAE;IAE1B,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAE3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAExE,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa,CAAA;IAExF,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAA;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAErE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAChG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9F,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC"}
1
+ {"version":3,"file":"diff-render.js","sourceRoot":"","sources":["../../src/format/diff-render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAE9D,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAM,aAAa,GAAG,EAAE,CAAA;AAExB,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,uEAAuE;AACvE,2CAA2C;AAC3C,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAAa,EACb,IAAY,EACZ,KAAa,EACb,UAAwB,EAAE;IAE1B,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAExE,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa,CAAA;IAExF,MAAM,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAA;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAErE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAChG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9F,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC"}
@@ -1,14 +1,6 @@
1
- import { type VibesOptions } from './vibes.js';
1
+ import type { VibesOptions } from './vibes.js';
2
2
  export interface FileCountEntry {
3
3
  file: string;
4
4
  count: number;
5
5
  }
6
- /**
7
- * Renders a `file count` list as two aligned columns — file path on the
8
- * left (white when fancy output is on), count on the right (dim), no
9
- * parens around it. Padding is computed on the PLAIN text first and only
10
- * wrapped in color codes afterward — padding a string that already has
11
- * ANSI escapes in it counts those invisible bytes toward the width and
12
- * throws the alignment off.
13
- */
14
6
  export declare function formatFileCountRows(entries: FileCountEntry[], unit: (count: number) => string, options?: VibesOptions): string[];
@@ -1,26 +1,15 @@
1
- import { isFancyOutputEnabled } from './vibes.js';
2
- import { colorize, DIM, WHITE } from './colors.js';
3
- /**
4
- * Renders a `file count` list as two aligned columns — file path on the
5
- * left (white when fancy output is on), count on the right (dim), no
6
- * parens around it. Padding is computed on the PLAIN text first and only
7
- * wrapped in color codes afterward — padding a string that already has
8
- * ANSI escapes in it counts those invisible bytes toward the width and
9
- * throws the alignment off.
10
- */
1
+ import { createStyle } from './style.js';
11
2
  export function formatFileCountRows(entries, unit, options = {}) {
12
3
  if (entries.length === 0)
13
4
  return [];
14
- const fancy = isFancyOutputEnabled(options);
5
+ const style = createStyle(options);
15
6
  const fileWidth = Math.max(...entries.map((e) => e.file.length));
16
7
  const countTexts = entries.map((e) => `${e.count} ${unit(e.count)}`);
17
8
  const countWidth = Math.max(...countTexts.map((t) => t.length));
18
9
  return entries.map((entry, i) => {
19
- const filePart = entry.file.padEnd(fileWidth);
20
- const countPart = countTexts[i].padStart(countWidth);
21
- const styledFile = fancy ? colorize(WHITE, filePart) : filePart;
22
- const styledCount = fancy ? colorize(DIM, countPart) : countPart;
23
- return ` ${styledFile} ${styledCount}`;
10
+ const filePart = style.path(entry.file.padEnd(fileWidth));
11
+ const countPart = style.value(countTexts[i].padStart(countWidth));
12
+ return ` ${filePart} ${countPart}`;
24
13
  });
25
14
  }
26
15
  //# sourceMappingURL=file-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-list.js","sourceRoot":"","sources":["../../src/format/file-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAOlD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,IAA+B,EAC/B,UAAwB,EAAE;IAE1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,SAAS,GAAI,UAAU,CAAC,CAAC,CAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAChE,OAAO,KAAK,UAAU,KAAK,WAAW,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"file-list.js","sourceRoot":"","sources":["../../src/format/file-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAOxC,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,IAA+B,EAC/B,UAAwB,EAAE;IAE1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAE/D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAE,UAAU,CAAC,CAAC,CAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;QAC7E,OAAO,KAAK,QAAQ,KAAK,SAAS,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1,14 +1,7 @@
1
- import { type VibesOptions } from './vibes.js';
1
+ import type { VibesOptions } from './vibes.js';
2
2
  export interface FindingRow {
3
- /** e.g. "src/foo.ts:12" */
4
3
  location: string;
5
4
  name: string;
6
- /** e.g. "(type)", "(default)" — empty string for a plain named export */
7
5
  tag: string;
8
6
  }
9
- /**
10
- * Three aligned columns — location (white), symbol name (cyan), trailing
11
- * tag (dim) — same padding-before-color rule as file-list.ts: widths are
12
- * computed on the plain text first, colors wrapped on afterward.
13
- */
14
7
  export declare function formatFindingsRows(entries: FindingRow[], options?: VibesOptions): string[];
@@ -1,23 +1,14 @@
1
- import { isFancyOutputEnabled } from './vibes.js';
2
- import { colorize, CYAN, DIM, WHITE } from './colors.js';
3
- /**
4
- * Three aligned columns — location (white), symbol name (cyan), trailing
5
- * tag (dim) — same padding-before-color rule as file-list.ts: widths are
6
- * computed on the plain text first, colors wrapped on afterward.
7
- */
1
+ import { createStyle } from './style.js';
8
2
  export function formatFindingsRows(entries, options = {}) {
9
3
  if (entries.length === 0)
10
4
  return [];
11
- const fancy = isFancyOutputEnabled(options);
5
+ const style = createStyle(options);
12
6
  const locationWidth = Math.max(...entries.map((e) => e.location.length));
13
7
  const nameWidth = Math.max(...entries.map((e) => e.name.length));
14
8
  return entries.map((entry) => {
15
- const locationPart = entry.location.padEnd(locationWidth);
16
- const namePart = entry.name.padEnd(nameWidth);
17
- const styledLocation = fancy ? colorize(WHITE, locationPart) : locationPart;
18
- const styledName = fancy ? colorize(CYAN, namePart) : namePart;
19
- const styledTag = entry.tag && fancy ? colorize(DIM, entry.tag) : entry.tag;
20
- return ` ${styledLocation} ${styledName} ${styledTag}`.trimEnd();
9
+ const locationPart = style.location(entry.location.padEnd(locationWidth));
10
+ const namePart = style.name(entry.name.padEnd(nameWidth));
11
+ return ` ${locationPart} ${namePart} ${style.tag(entry.tag)}`.trimEnd();
21
12
  });
22
13
  }
23
14
  //# sourceMappingURL=findings-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"findings-list.js","sourceRoot":"","sources":["../../src/format/findings-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAUxD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAqB,EAAE,UAAwB,EAAE;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAEhE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;QAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;QAC3E,OAAO,KAAK,cAAc,KAAK,UAAU,KAAK,SAAS,EAAE,CAAC,OAAO,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"findings-list.js","sourceRoot":"","sources":["../../src/format/findings-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAQxC,MAAM,UAAU,kBAAkB,CAAC,OAAqB,EAAE,UAAwB,EAAE;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAEhE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QACzD,OAAO,KAAK,YAAY,KAAK,QAAQ,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;IAC5E,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type VibesOptions } from './vibes.js';
2
+ export interface Style {
3
+ enabled: boolean;
4
+ info(text: string): string;
5
+ problem(text: string): string;
6
+ heading(text: string): string;
7
+ success(text: string): string;
8
+ warn(text: string): string;
9
+ error(text: string): string;
10
+ hint(text: string): string;
11
+ path(text: string): string;
12
+ location(text: string): string;
13
+ name(text: string): string;
14
+ tag(text: string): string;
15
+ muted(text: string): string;
16
+ accent(text: string): string;
17
+ value(text: string): string;
18
+ bold(text: string): string;
19
+ }
20
+ export declare function createStyle(options?: VibesOptions): Style;
@@ -0,0 +1,36 @@
1
+ import { BOLD, CYAN, DIM, GRAY, GREEN, MAGENTA, RED, WHITE, YELLOW, colorize } from './colors.js';
2
+ import { isColorEnabled } from './vibes.js';
3
+ const FLAG_PATTERN = /(?<![\w-])(--?[a-zA-Z][\w-]*)/g;
4
+ const LOCATION_PATTERN = /^(.*?)((?::\d+)+)(\s*)$/;
5
+ export function createStyle(options = {}) {
6
+ const enabled = isColorEnabled(options);
7
+ const wrap = (color, text) => (enabled && text ? colorize(color, text) : text);
8
+ return {
9
+ enabled,
10
+ info: (text) => wrap(GRAY, text),
11
+ problem: (text) => wrap(BOLD + RED, text),
12
+ heading: (text) => wrap(BOLD + YELLOW, text),
13
+ success: (text) => wrap(BOLD + GREEN, text),
14
+ warn: (text) => wrap(YELLOW, text),
15
+ error: (text) => wrap(RED, text),
16
+ hint: (text) => enabled
17
+ ? colorize(DIM, text).replace(FLAG_PATTERN, (flag) => `\x1b[0m${CYAN}${flag}\x1b[0m${DIM}`)
18
+ : text,
19
+ path: (text) => wrap(CYAN, text),
20
+ location: (text) => {
21
+ if (!enabled)
22
+ return text;
23
+ const match = LOCATION_PATTERN.exec(text);
24
+ if (!match)
25
+ return colorize(CYAN, text);
26
+ return `${colorize(CYAN, match[1])}${colorize(GRAY, match[2])}${match[3]}`;
27
+ },
28
+ name: (text) => wrap(YELLOW, text),
29
+ tag: (text) => wrap(GRAY, text),
30
+ muted: (text) => wrap(DIM, text),
31
+ accent: (text) => wrap(MAGENTA, text),
32
+ value: (text) => wrap(WHITE, text),
33
+ bold: (text) => wrap(BOLD, text),
34
+ };
35
+ }
36
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/format/style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { VibesOptions } from './vibes.js';
2
+ export interface TableColumn {
3
+ header: string;
4
+ align?: 'left' | 'right';
5
+ shrink?: boolean;
6
+ style?: (text: string) => string;
7
+ }
8
+ export declare function renderTable(columns: TableColumn[], rows: string[][], options?: VibesOptions, availableWidth?: number | null): string[];
@@ -0,0 +1,44 @@
1
+ import { createStyle } from './style.js';
2
+ const MIN_SHRUNK_WIDTH = 12;
3
+ function shrinkLeft(text, width) {
4
+ if (text.length <= width)
5
+ return text;
6
+ return `…${text.slice(text.length - (width - 1))}`;
7
+ }
8
+ function fitWidths(widths, columns, available) {
9
+ if (available === null)
10
+ return widths;
11
+ const chrome = widths.length * 3 + 1;
12
+ const total = widths.reduce((sum, w) => sum + w, 0) + chrome;
13
+ const shrinkIndex = columns.findIndex((c) => c.shrink);
14
+ if (total <= available || shrinkIndex === -1)
15
+ return widths;
16
+ const fitted = [...widths];
17
+ const target = widths[shrinkIndex] - (total - available);
18
+ fitted[shrinkIndex] = Math.max(MIN_SHRUNK_WIDTH, target);
19
+ return fitted;
20
+ }
21
+ export function renderTable(columns, rows, options = {}, availableWidth = process.stdout.isTTY ? (process.stdout.columns ?? null) : null) {
22
+ const s = createStyle(options);
23
+ const natural = columns.map((column, i) => Math.max(column.header.length, ...rows.map((row) => (row[i] ?? '').length)));
24
+ const widths = fitWidths(natural, columns, availableWidth);
25
+ const cell = (column, index, raw, header) => {
26
+ const width = widths[index];
27
+ const text = column.shrink ? shrinkLeft(raw, width) : raw;
28
+ const padded = column.align === 'right' ? text.padStart(width) : text.padEnd(width);
29
+ if (header)
30
+ return s.bold(padded);
31
+ return column.style ? column.style(padded) : padded;
32
+ };
33
+ const rule = (left, mid, right) => s.muted(`${left}${widths.map((w) => '─'.repeat(w + 2)).join(mid)}${right}`);
34
+ const bar = s.muted('│');
35
+ const line = (texts, header) => `${bar} ${columns.map((column, i) => cell(column, i, texts[i] ?? '', header)).join(` ${bar} `)} ${bar}`;
36
+ return [
37
+ rule('┌', '┬', '┐'),
38
+ line(columns.map((c) => c.header), true),
39
+ rule('├', '┼', '┤'),
40
+ ...rows.map((row) => line(row, false)),
41
+ rule('└', '┴', '┘'),
42
+ ];
43
+ }
44
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/format/table.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,11 @@ export interface VibesOptions {
3
3
  quiet?: boolean;
4
4
  /** --plain: force plain output even in a real TTY (explicit opt-out) */
5
5
  plain?: boolean;
6
+ /** --color: force colored output even when piped or in CI */
7
+ color?: boolean;
6
8
  }
9
+ export declare function isColorEnabled(options?: VibesOptions): boolean;
7
10
  export declare function isFancyOutputEnabled(options?: VibesOptions): boolean;
8
- export declare function banner(): string;
11
+ export declare function banner(options?: VibesOptions): string;
9
12
  export declare function cleanCelebration(options?: VibesOptions): string;
10
13
  export declare function firstRunAside(options?: VibesOptions): string | null;
@@ -1,9 +1,20 @@
1
- // Centralized pool of the CLI's "personality" moments — see features.md
2
- // "Тон вывода" for the ground rules this exists to enforce: humor only at
3
- // bookending moments (banner, all-clean celebration), never inside the
4
- // actual findings list, and only when there's a real human at a real
5
- // terminal to appreciate it. Every command imports from here instead of
6
- // hardcoding a joke inline, so the tone can be tuned in one place.
1
+ import { BOLD, CYAN, GREEN, colorize } from './colors.js';
2
+ export function isColorEnabled(options = {}) {
3
+ if (options.plain)
4
+ return false;
5
+ if (options.color)
6
+ return true;
7
+ if (process.env.NO_COLOR)
8
+ return false;
9
+ const force = process.env.FORCE_COLOR;
10
+ if (force !== undefined && force !== '')
11
+ return force !== '0' && force !== 'false';
12
+ if (process.env.CI)
13
+ return false;
14
+ if (process.env.TERM === 'dumb')
15
+ return false;
16
+ return Boolean(process.stdout.isTTY);
17
+ }
7
18
  // Fancy output (color, banner, celebration copy) only makes sense for a
8
19
  // human watching a real terminal in real time — auto-off the moment any of
9
20
  // that isn't true, no flag required. `--json`/`--quiet`/`--plain` are
@@ -33,8 +44,9 @@ const BANNERS = [
33
44
  // One compact line, shown once per invocation — never a multi-line ASCII
34
45
  // block. That's reserved for the all-clean celebration below, where it's
35
46
  // actually earned.
36
- export function banner() {
37
- return pick(BANNERS);
47
+ export function banner(options = {}) {
48
+ const text = pick(BANNERS);
49
+ return isColorEnabled(options) ? colorize(BOLD + CYAN, text) : text;
38
50
  }
39
51
  const CLEAN_LINES = [
40
52
  'Nothing to see here. Suspiciously clean, even.',
@@ -54,9 +66,12 @@ const CLEAN_ART = [
54
66
  // something (see features.md: don't joke over a real problem report).
55
67
  export function cleanCelebration(options = {}) {
56
68
  const line = pick(CLEAN_LINES);
69
+ const color = isColorEnabled(options);
70
+ const styledLine = color ? colorize(BOLD + GREEN, line) : line;
57
71
  if (!isFancyOutputEnabled(options))
58
- return line;
59
- return `${line}\n${pick(CLEAN_ART)}`;
72
+ return styledLine;
73
+ const art = pick(CLEAN_ART);
74
+ return `${styledLine}\n${color ? colorize(GREEN, art) : art}`;
60
75
  }
61
76
  const FIRST_RUN_LINES = ["First time here? Let's see what we've got.", 'Taking a look...'];
62
77
  export function firstRunAside(options = {}) {