@macrulez/devtoolz 0.4.0 → 0.4.2

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 (107) hide show
  1. package/README.md +19 -1
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/image-batch/cli.js +4 -5
  5. package/dist/commands/image-batch/cli.js.map +1 -1
  6. package/dist/commands/image-batch/config.d.ts +3 -2
  7. package/dist/commands/image-batch/config.js +6 -20
  8. package/dist/commands/image-batch/config.js.map +1 -1
  9. package/dist/commands/image-batch/manage-cli.js +81 -4
  10. package/dist/commands/image-batch/manage-cli.js.map +1 -1
  11. package/dist/commands/image-batch/manage.d.ts +3 -2
  12. package/dist/commands/image-batch/manage.js +55 -14
  13. package/dist/commands/image-batch/manage.js.map +1 -1
  14. package/dist/commands/image-batch/run.d.ts +7 -3
  15. package/dist/commands/image-batch/run.js +11 -1
  16. package/dist/commands/image-batch/run.js.map +1 -1
  17. package/dist/commands/image-batch/sharpen-ask.d.ts +6 -0
  18. package/dist/commands/image-batch/sharpen-ask.js +53 -0
  19. package/dist/commands/image-batch/sharpen-ask.js.map +1 -0
  20. package/dist/commands/image-batch/sharpen-manage.d.ts +26 -0
  21. package/dist/commands/image-batch/sharpen-manage.js +238 -0
  22. package/dist/commands/image-batch/sharpen-manage.js.map +1 -0
  23. package/dist/commands/image-batch/sharpen-presets.d.ts +24 -0
  24. package/dist/commands/image-batch/sharpen-presets.js +145 -0
  25. package/dist/commands/image-batch/sharpen-presets.js.map +1 -0
  26. package/dist/commands/image-batch/sharpen.d.ts +33 -3
  27. package/dist/commands/image-batch/sharpen.js +141 -14
  28. package/dist/commands/image-batch/sharpen.js.map +1 -1
  29. package/dist/commands/image-hash/sharp-loader.d.ts +3 -0
  30. package/dist/commands/image-hash/sharp-loader.js.map +1 -1
  31. package/dist/commands/ui/cli.d.ts +2 -0
  32. package/dist/commands/ui/cli.js +78 -0
  33. package/dist/commands/ui/cli.js.map +1 -0
  34. package/dist/commands/ui/fs-routes.d.ts +7 -0
  35. package/dist/commands/ui/fs-routes.js +135 -0
  36. package/dist/commands/ui/fs-routes.js.map +1 -0
  37. package/dist/commands/ui/http.d.ts +41 -0
  38. package/dist/commands/ui/http.js +81 -0
  39. package/dist/commands/ui/http.js.map +1 -0
  40. package/dist/commands/ui/jobs.d.ts +15 -0
  41. package/dist/commands/ui/jobs.js +73 -0
  42. package/dist/commands/ui/jobs.js.map +1 -0
  43. package/dist/commands/ui/modules/checks.d.ts +28 -0
  44. package/dist/commands/ui/modules/checks.js +556 -0
  45. package/dist/commands/ui/modules/checks.js.map +1 -0
  46. package/dist/commands/ui/modules/cleanup.d.ts +2 -0
  47. package/dist/commands/ui/modules/cleanup.js +305 -0
  48. package/dist/commands/ui/modules/cleanup.js.map +1 -0
  49. package/dist/commands/ui/modules/image-batch-backups.d.ts +2 -0
  50. package/dist/commands/ui/modules/image-batch-backups.js +116 -0
  51. package/dist/commands/ui/modules/image-batch-backups.js.map +1 -0
  52. package/dist/commands/ui/modules/image-batch-manage.d.ts +2 -0
  53. package/dist/commands/ui/modules/image-batch-manage.js +245 -0
  54. package/dist/commands/ui/modules/image-batch-manage.js.map +1 -0
  55. package/dist/commands/ui/modules/image-batch.d.ts +2 -0
  56. package/dist/commands/ui/modules/image-batch.js +225 -0
  57. package/dist/commands/ui/modules/image-batch.js.map +1 -0
  58. package/dist/commands/ui/modules/image-hash.d.ts +2 -0
  59. package/dist/commands/ui/modules/image-hash.js +158 -0
  60. package/dist/commands/ui/modules/image-hash.js.map +1 -0
  61. package/dist/commands/ui/modules/index.d.ts +2 -0
  62. package/dist/commands/ui/modules/index.js +11 -0
  63. package/dist/commands/ui/modules/index.js.map +1 -0
  64. package/dist/commands/ui/open-browser.d.ts +1 -0
  65. package/dist/commands/ui/open-browser.js +18 -0
  66. package/dist/commands/ui/open-browser.js.map +1 -0
  67. package/dist/commands/ui/scan.d.ts +20 -0
  68. package/dist/commands/ui/scan.js +57 -0
  69. package/dist/commands/ui/scan.js.map +1 -0
  70. package/dist/commands/ui/server.d.ts +18 -0
  71. package/dist/commands/ui/server.js +196 -0
  72. package/dist/commands/ui/server.js.map +1 -0
  73. package/dist/ui/assets/ChecksPage-MLWSelKP.js +1 -0
  74. package/dist/ui/assets/ChecksPage-pbC0Txsh.css +1 -0
  75. package/dist/ui/assets/CleanupPage-B2ZTFOpP.js +4 -0
  76. package/dist/ui/assets/CleanupPage-k7sTI4iz.css +1 -0
  77. package/dist/ui/assets/FolderBrowser-BX3-y8sM.js +1 -0
  78. package/dist/ui/assets/FolderBrowser-DRh-WZPz.css +1 -0
  79. package/dist/ui/assets/ImageBatchPage-CvsCvu1q.js +4 -0
  80. package/dist/ui/assets/ImageBatchPage-DiK8ODUc.css +1 -0
  81. package/dist/ui/assets/ImageHashPage-Bbhxvjj0.js +1 -0
  82. package/dist/ui/assets/ImageHashPage-CUXnoJEA.css +1 -0
  83. package/dist/ui/assets/SourcePicker-C3qFDUoL.css +1 -0
  84. package/dist/ui/assets/SourcePicker-CVgtCk78.js +1 -0
  85. package/dist/ui/assets/UiSegmented-Q_ter8VK.css +1 -0
  86. package/dist/ui/assets/UiSegmented-YV1YATxM.js +1 -0
  87. package/dist/ui/assets/core-DVezgdzc.js +12 -0
  88. package/dist/ui/assets/css-Z72CF80r.js +1 -0
  89. package/dist/ui/assets/engine-javascript-CNmxVhbB.js +141 -0
  90. package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
  91. package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
  92. package/dist/ui/assets/highlight-CsAszz7F.js +2 -0
  93. package/dist/ui/assets/html-BlS82ilI.js +1 -0
  94. package/dist/ui/assets/index-BzfkjuG8.css +1 -0
  95. package/dist/ui/assets/index-pDKL0Y31.js +3 -0
  96. package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
  97. package/dist/ui/assets/json-Cp-IABpG.js +1 -0
  98. package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
  99. package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
  100. package/dist/ui/assets/scss-Cw6XMfVs.js +1 -0
  101. package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
  102. package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
  103. package/dist/ui/assets/useCopy-vCfkPGWW.js +1 -0
  104. package/dist/ui/assets/vue-CwSeJimo.js +1 -0
  105. package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
  106. package/dist/ui/index.html +17 -0
  107. package/package.json +17 -4
@@ -0,0 +1,556 @@
1
+ import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
2
+ import { extname, isAbsolute, relative, resolve, sep } from 'node:path';
3
+ import { runCaseCheck } from '../../case-check/run.js';
4
+ import { runCircularImports } from '../../circular-imports/run.js';
5
+ import { runDeadExports } from '../../dead-exports/run.js';
6
+ import { runEmptyCatch } from '../../empty-catch/run.js';
7
+ import { runExportsDoctor } from '../../exports-doctor/run.js';
8
+ import { runOrphanTests } from '../../orphan-tests/run.js';
9
+ import { runReadmeCheck } from '../../readme-check/run.js';
10
+ import { runScriptsCheck } from '../../scripts-check/run.js';
11
+ import { runStaleTsIgnore } from '../../stale-ts-ignore/run.js';
12
+ import { runTodoReport } from '../../todo-report/run.js';
13
+ import { runUnusedDeps } from '../../unused-deps/run.js';
14
+ import { resolveUserPath } from '../fs-routes.js';
15
+ import { HttpError, asObject, sendJson, } from '../http.js';
16
+ import { startJob } from '../jobs.js';
17
+ const COMMON_OPTIONS = [
18
+ {
19
+ key: 'ignore',
20
+ label: 'Ignore',
21
+ type: 'list',
22
+ default: '',
23
+ help: 'Extra patterns to skip, one per line (gitignore syntax).',
24
+ },
25
+ ];
26
+ function relativeTo(cwd, file) {
27
+ const abs = isAbsolute(file) ? file : resolve(cwd, file);
28
+ const rel = relative(cwd, abs);
29
+ return (rel === '' || rel.startsWith('..') ? abs : rel).split(sep).join('/');
30
+ }
31
+ function plural(count, word, many = `${word}s`) {
32
+ return `${count} ${count === 1 ? word : many}`;
33
+ }
34
+ const CHECKS = [
35
+ {
36
+ id: 'dead-exports',
37
+ title: 'Dead exports',
38
+ description: 'Exports nothing imports: code you can delete or stop exporting.',
39
+ group: 'code',
40
+ options: [
41
+ {
42
+ key: 'strict',
43
+ label: 'Include public entry points',
44
+ type: 'boolean',
45
+ default: false,
46
+ help: 'Also flag exports of the package’s public API, not just internal files.',
47
+ },
48
+ ...COMMON_OPTIONS,
49
+ ],
50
+ run: ({ cwd, flag, list }) => {
51
+ const report = runDeadExports({
52
+ paths: ['.'],
53
+ cwd,
54
+ strict: flag('strict'),
55
+ ignoreGlobs: list('ignore'),
56
+ });
57
+ return {
58
+ summary: `${plural(report.findings.length, 'unused export')} in ${plural(report.filesScanned, 'file')}`,
59
+ filesScanned: report.filesScanned,
60
+ exitCode: report.exitCode,
61
+ findings: report.findings.map((finding) => ({
62
+ file: relativeTo(cwd, finding.file),
63
+ line: finding.line,
64
+ severity: 'warning',
65
+ code: finding.isDefault ? 'default export' : finding.isType ? 'type export' : 'export',
66
+ message: `${finding.isDefault ? 'The default export' : `\`${finding.name}\``} is never imported.`,
67
+ hint: finding.isType
68
+ ? 'A type nobody uses: delete it or stop exporting it.'
69
+ : 'Delete it, or remove the export keyword if it is used inside the file.',
70
+ })),
71
+ ...(report.hasUnresolvableDynamicImports
72
+ ? {
73
+ notes: [
74
+ 'Some dynamic imports could not be resolved, so a few findings may be false positives.',
75
+ ],
76
+ }
77
+ : {}),
78
+ };
79
+ },
80
+ },
81
+ {
82
+ id: 'unused-deps',
83
+ title: 'Unused dependencies',
84
+ description: 'Packages declared in package.json that nothing imports, and imports package.json never declared.',
85
+ group: 'dependencies',
86
+ options: [
87
+ {
88
+ key: 'strict',
89
+ label: 'Include implicit packages',
90
+ type: 'boolean',
91
+ default: false,
92
+ help: 'Also check packages that are usually used without being imported (types, test coverage).',
93
+ },
94
+ {
95
+ key: 'ignorePackages',
96
+ label: 'Ignore packages',
97
+ type: 'list',
98
+ default: '',
99
+ help: 'Package names to leave out, one per line.',
100
+ },
101
+ ...COMMON_OPTIONS,
102
+ ],
103
+ run: ({ cwd, flag, list }) => {
104
+ const report = runUnusedDeps({
105
+ dir: cwd,
106
+ strict: flag('strict'),
107
+ ignorePackages: list('ignorePackages'),
108
+ ignoreGlobs: list('ignore'),
109
+ });
110
+ return {
111
+ summary: report.error
112
+ ? 'Could not read package.json'
113
+ : `${plural(report.findings.length, 'problem')} in ${plural(report.filesScanned, 'file')}`,
114
+ filesScanned: report.filesScanned,
115
+ exitCode: report.exitCode,
116
+ ...(report.error ? { error: report.error } : {}),
117
+ findings: report.findings.map((finding) => ({
118
+ file: 'package.json',
119
+ severity: finding.kind === 'phantom' ? 'error' : 'warning',
120
+ code: finding.kind === 'phantom' ? 'undeclared' : 'unused',
121
+ message: finding.kind === 'phantom'
122
+ ? `\`${finding.name}\` is imported but not listed in package.json.`
123
+ : `\`${finding.name}\` is listed${finding.section ? ` in ${finding.section}` : ''} but nothing imports it.`,
124
+ hint: finding.kind === 'phantom'
125
+ ? `It only works now because it resolves from ${finding.resolvedFrom ?? 'another package'}. Add it to package.json.`
126
+ : 'Remove it from package.json if nothing else (a config file, a script) needs it.',
127
+ })),
128
+ };
129
+ },
130
+ },
131
+ {
132
+ id: 'empty-catch',
133
+ title: 'Empty catch blocks',
134
+ description: 'catch blocks that swallow errors silently or only log them.',
135
+ group: 'code',
136
+ options: COMMON_OPTIONS,
137
+ run: ({ cwd, list }) => {
138
+ const report = runEmptyCatch({ paths: ['.'], cwd, ignoreGlobs: list('ignore') });
139
+ return {
140
+ summary: `${plural(report.findings.length, 'catch block')} in ${plural(report.filesScanned, 'file')}`,
141
+ filesScanned: report.filesScanned,
142
+ exitCode: report.exitCode,
143
+ findings: report.findings.map((finding) => ({
144
+ file: relativeTo(cwd, finding.file),
145
+ line: finding.line,
146
+ column: finding.column,
147
+ severity: finding.kind === 'empty' ? 'error' : 'warning',
148
+ code: finding.kind,
149
+ message: finding.kind === 'empty'
150
+ ? 'This catch block is empty: the error disappears without a trace.'
151
+ : 'This catch block only logs the error to the console.',
152
+ hint: 'Handle the error, rethrow it, or add a comment that says why ignoring it is safe.',
153
+ })),
154
+ };
155
+ },
156
+ },
157
+ {
158
+ id: 'orphan-tests',
159
+ title: 'Orphan tests',
160
+ description: 'Test files whose source file no longer exists.',
161
+ group: 'code',
162
+ options: COMMON_OPTIONS,
163
+ run: ({ cwd, list }) => {
164
+ const report = runOrphanTests({ paths: ['.'], cwd, ignoreGlobs: list('ignore') });
165
+ return {
166
+ summary: `${plural(report.findings.length, 'orphan test')} among ${plural(report.filesScanned, 'file')}`,
167
+ filesScanned: report.filesScanned,
168
+ exitCode: report.exitCode,
169
+ ...(report.error ? { error: report.error } : {}),
170
+ findings: report.findings.map((finding) => ({
171
+ file: relativeTo(cwd, finding.file),
172
+ severity: 'warning',
173
+ code: 'orphan',
174
+ message: 'No source file belongs to this test.',
175
+ hint: `Looked for a matching file with: ${finding.triedExtensions.join(', ')}. Delete the test or restore the source.`,
176
+ })),
177
+ };
178
+ },
179
+ },
180
+ {
181
+ id: 'case-check',
182
+ title: 'Import case',
183
+ description: 'Imports whose letter case differs from the file on disk: they work on Windows and macOS and break on Linux.',
184
+ group: 'code',
185
+ options: COMMON_OPTIONS,
186
+ run: ({ cwd, list }) => {
187
+ const report = runCaseCheck({ paths: ['.'], cwd, ignoreGlobs: list('ignore') });
188
+ return {
189
+ summary: `${plural(report.findings.length, 'import')} with the wrong case in ${plural(report.filesScanned, 'file')}`,
190
+ filesScanned: report.filesScanned,
191
+ exitCode: report.exitCode,
192
+ findings: report.findings.map((finding) => ({
193
+ file: relativeTo(cwd, finding.file),
194
+ line: finding.line,
195
+ column: finding.column,
196
+ severity: 'error',
197
+ code: finding.isAlias ? 'alias' : 'case',
198
+ message: `"${finding.specifier}" should be "${finding.correctedSpecifier}".`,
199
+ hint: 'Rename the import to match the file name exactly, or Linux CI will fail to find it.',
200
+ })),
201
+ };
202
+ },
203
+ },
204
+ {
205
+ id: 'circular-imports',
206
+ title: 'Circular imports',
207
+ description: 'Files that import each other in a loop.',
208
+ group: 'code',
209
+ options: [
210
+ {
211
+ key: 'includeTypes',
212
+ label: 'Include type-only cycles',
213
+ type: 'boolean',
214
+ default: false,
215
+ help: 'Cycles made only of "import type" are harmless at runtime.',
216
+ },
217
+ ...COMMON_OPTIONS,
218
+ ],
219
+ run: ({ cwd, flag, list }) => {
220
+ const report = runCircularImports({
221
+ paths: ['.'],
222
+ cwd,
223
+ includeTypes: flag('includeTypes'),
224
+ ignoreGlobs: list('ignore'),
225
+ });
226
+ return {
227
+ summary: `${plural(report.findings.length, 'cycle')} in ${plural(report.filesScanned, 'file')}`,
228
+ filesScanned: report.filesScanned,
229
+ exitCode: report.exitCode,
230
+ findings: report.findings.map((finding) => {
231
+ const files = finding.files.map((file) => relativeTo(cwd, file));
232
+ return {
233
+ file: files[0],
234
+ severity: finding.typeOnly ? 'info' : 'error',
235
+ code: finding.typeOnly ? 'type-only' : 'cycle',
236
+ message: [...files, files[0]].join(' → '),
237
+ hint: finding.typeOnly
238
+ ? 'Only types are involved, so this is harmless at runtime.'
239
+ : 'Move the shared code into a third file that both can import.',
240
+ files,
241
+ };
242
+ }),
243
+ };
244
+ },
245
+ },
246
+ {
247
+ id: 'todo-report',
248
+ title: 'TODO comments',
249
+ description: 'TODO, FIXME and HACK notes left in comments.',
250
+ group: 'code',
251
+ options: [
252
+ {
253
+ key: 'tags',
254
+ label: 'Tags',
255
+ type: 'list',
256
+ default: 'TODO\nFIXME\nHACK',
257
+ help: 'The words to look for, one per line.',
258
+ },
259
+ ...COMMON_OPTIONS,
260
+ ],
261
+ run: ({ cwd, list }) => {
262
+ const tags = list('tags');
263
+ const report = runTodoReport({
264
+ paths: ['.'],
265
+ cwd,
266
+ ...(tags.length ? { tags } : {}),
267
+ ignoreGlobs: list('ignore'),
268
+ });
269
+ return {
270
+ summary: `${plural(report.findings.length, 'note')} in ${plural(report.filesScanned, 'file')}`,
271
+ filesScanned: report.filesScanned,
272
+ exitCode: 0,
273
+ findings: report.findings.map((finding) => ({
274
+ file: relativeTo(cwd, finding.file),
275
+ line: finding.line,
276
+ column: finding.column,
277
+ severity: finding.tag === 'FIXME' ? 'warning' : 'info',
278
+ code: finding.tag,
279
+ message: finding.text.trim() || finding.tag,
280
+ })),
281
+ };
282
+ },
283
+ },
284
+ {
285
+ id: 'stale-ts-ignore',
286
+ title: 'Stale @ts-ignore',
287
+ description: '@ts-ignore comments that no longer hide an error. This one type-checks the project, so it takes a while.',
288
+ group: 'code',
289
+ slow: true,
290
+ options: COMMON_OPTIONS,
291
+ run: ({ cwd, list }) => {
292
+ const report = runStaleTsIgnore({ dir: cwd, ignoreGlobs: list('ignore') });
293
+ return {
294
+ summary: report.error
295
+ ? 'Could not type-check the project'
296
+ : `${plural(report.findings.length, 'stale directive')} among ${plural(report.directivesChecked, 'directive')}`,
297
+ exitCode: report.exitCode,
298
+ ...(report.error ? { error: report.error } : {}),
299
+ findings: report.findings.map((finding) => ({
300
+ file: relativeTo(cwd, finding.file),
301
+ line: finding.line,
302
+ severity: 'warning',
303
+ code: 'stale',
304
+ message: 'This @ts-ignore hides nothing: the error it was added for is gone.',
305
+ hint: 'Delete the comment.',
306
+ })),
307
+ };
308
+ },
309
+ },
310
+ {
311
+ id: 'exports-doctor',
312
+ title: 'package.json exports',
313
+ description: 'main, module, types, bin and exports entries that point to files that are missing or have the wrong case.',
314
+ group: 'dependencies',
315
+ options: [],
316
+ run: ({ cwd }) => {
317
+ const report = runExportsDoctor({ dir: cwd });
318
+ const messages = {
319
+ missing: 'points to a file that does not exist.',
320
+ 'case-mismatch': 'differs in letter case from the file on disk.',
321
+ 'missing-shebang': 'is a bin file without a #! line at the top.',
322
+ 'types-missing': 'has no types declared for this entry.',
323
+ };
324
+ return {
325
+ summary: report.error
326
+ ? 'Could not read package.json'
327
+ : `${plural(report.findings.length, 'problem')}${report.packageName ? ` in ${report.packageName}` : ''}`,
328
+ exitCode: report.exitCode,
329
+ ...(report.error ? { error: report.error } : {}),
330
+ findings: report.findings.map((finding) => ({
331
+ file: 'package.json',
332
+ severity: finding.kind === 'types-missing' ? 'warning' : 'error',
333
+ code: finding.kind,
334
+ message: `\`${finding.location}\` (${finding.path}) ${messages[finding.kind] ?? 'has a problem.'}`,
335
+ ...(finding.realPath ? { hint: `On disk it is spelled ${finding.realPath}.` } : {}),
336
+ })),
337
+ };
338
+ },
339
+ },
340
+ {
341
+ id: 'readme-check',
342
+ title: 'README code samples',
343
+ description: 'TypeScript code blocks in the README that no longer type-check.',
344
+ group: 'docs',
345
+ options: [
346
+ {
347
+ key: 'files',
348
+ label: 'Markdown files',
349
+ type: 'list',
350
+ default: 'README.md',
351
+ help: 'Files to check, one per line, relative to the project.',
352
+ },
353
+ ],
354
+ run: ({ cwd, list }) => {
355
+ const files = list('files');
356
+ const report = runReadmeCheck({ dir: cwd, ...(files.length ? { files } : {}) });
357
+ const blocks = report.fileResults.reduce((sum, file) => sum + file.blocksChecked, 0);
358
+ return {
359
+ summary: report.error
360
+ ? 'Could not check the README'
361
+ : `${plural(report.findings.length, 'problem')} in ${plural(blocks, 'code block')}`,
362
+ exitCode: report.exitCode,
363
+ ...(report.error ? { error: report.error } : {}),
364
+ findings: report.findings.map((finding) => ({
365
+ file: relativeTo(cwd, finding.file),
366
+ line: finding.line,
367
+ column: finding.column,
368
+ severity: 'error',
369
+ code: finding.lang,
370
+ message: finding.message,
371
+ })),
372
+ };
373
+ },
374
+ },
375
+ {
376
+ id: 'scripts-check',
377
+ title: 'npm scripts in the docs',
378
+ description: 'Docs and CI mention scripts that do not exist, or scripts nobody documents.',
379
+ group: 'docs',
380
+ options: [
381
+ {
382
+ key: 'files',
383
+ label: 'Docs to read',
384
+ type: 'list',
385
+ default: 'README.md',
386
+ help: 'Files to check, one per line, relative to the project.',
387
+ },
388
+ ],
389
+ run: ({ cwd, list }) => {
390
+ const files = list('files');
391
+ const report = runScriptsCheck({ dir: cwd, ...(files.length ? { files } : {}) });
392
+ return {
393
+ summary: report.error
394
+ ? 'Could not read package.json'
395
+ : `${plural(report.findings.length, 'mismatch', 'mismatches')} across ${plural(report.sourcesScanned.length, 'file')}`,
396
+ exitCode: report.exitCode,
397
+ ...(report.error ? { error: report.error } : {}),
398
+ findings: report.findings.map((finding) => ({
399
+ file: relativeTo(cwd, finding.file),
400
+ line: finding.line,
401
+ severity: finding.kind === 'missing' ? 'error' : 'info',
402
+ code: finding.kind,
403
+ message: finding.kind === 'missing'
404
+ ? `The docs mention \`${finding.name}\`, but package.json has no such script.`
405
+ : `The script \`${finding.name}\` is not mentioned anywhere in the docs or CI.`,
406
+ })),
407
+ };
408
+ },
409
+ },
410
+ ];
411
+ function inputFrom(cwd, options) {
412
+ return {
413
+ cwd,
414
+ flag: (key) => options[key] === true,
415
+ list: (key) => {
416
+ const value = options[key];
417
+ const text = typeof value === 'string' ? value : '';
418
+ return text
419
+ .split(/\r?\n|,/)
420
+ .map((part) => part.trim())
421
+ .filter(Boolean);
422
+ },
423
+ };
424
+ }
425
+ function projectOf(ctx, value) {
426
+ const dir = resolveUserPath(typeof value === 'string' ? value : null, ctx.server.cwd);
427
+ if (!statSync(dir, { throwIfNoEntry: false })?.isDirectory()) {
428
+ throw new HttpError(404, `${dir} is not a folder`);
429
+ }
430
+ return dir;
431
+ }
432
+ function findCheck(id) {
433
+ const found = CHECKS.find((check) => check.id === id);
434
+ if (!found)
435
+ throw new HttpError(404, `no check named "${id}"`);
436
+ return found;
437
+ }
438
+ async function startCheck(ctx) {
439
+ const check = findCheck(ctx.params.id);
440
+ const body = asObject(await ctx.readBody());
441
+ const cwd = projectOf(ctx, body.project);
442
+ const options = body.options === undefined ? {} : asObject(body.options, 'options');
443
+ const id = startJob(async () => {
444
+ const started = Date.now();
445
+ const outcome = check.run(inputFrom(cwd, options));
446
+ return { ...outcome, project: cwd, check: check.id, tookMs: Date.now() - started };
447
+ });
448
+ sendJson(ctx.res, 202, { jobId: id });
449
+ }
450
+ function defaultsOf(check) {
451
+ return Object.fromEntries(check.options.map((option) => [option.key, option.default]));
452
+ }
453
+ async function startAll(ctx) {
454
+ const body = asObject(await ctx.readBody());
455
+ const cwd = projectOf(ctx, body.project);
456
+ const includeSlow = body.includeSlow === true;
457
+ const chosen = CHECKS.filter((check) => includeSlow || !check.slow);
458
+ const skipped = CHECKS.filter((check) => !chosen.includes(check)).map((check) => check.id);
459
+ const id = startJob(async (progress) => {
460
+ const started = Date.now();
461
+ const outcomes = {};
462
+ for (const [index, check] of chosen.entries()) {
463
+ progress({ done: index, total: chosen.length, current: check.title });
464
+ await new Promise((resolveTick) => setImmediate(resolveTick));
465
+ const begun = Date.now();
466
+ let outcome;
467
+ try {
468
+ outcome = check.run(inputFrom(cwd, defaultsOf(check)));
469
+ }
470
+ catch (error) {
471
+ outcome = {
472
+ summary: 'The check could not run',
473
+ findings: [],
474
+ error: error instanceof Error ? error.message : String(error),
475
+ exitCode: 1,
476
+ };
477
+ }
478
+ outcomes[check.id] = { ...outcome, project: cwd, check: check.id, tookMs: Date.now() - begun };
479
+ }
480
+ progress({ done: chosen.length, total: chosen.length, current: '' });
481
+ return { project: cwd, outcomes, skipped, tookMs: Date.now() - started };
482
+ });
483
+ sendJson(ctx.res, 202, { jobId: id });
484
+ }
485
+ const SOURCE_LANGS = {
486
+ '.ts': 'ts',
487
+ '.tsx': 'tsx',
488
+ '.mts': 'ts',
489
+ '.cts': 'ts',
490
+ '.js': 'js',
491
+ '.jsx': 'jsx',
492
+ '.mjs': 'js',
493
+ '.cjs': 'js',
494
+ '.vue': 'vue',
495
+ '.json': 'json',
496
+ '.css': 'css',
497
+ '.scss': 'scss',
498
+ '.html': 'html',
499
+ '.md': 'md',
500
+ '.yml': 'yaml',
501
+ '.yaml': 'yaml',
502
+ };
503
+ const MAX_SOURCE_BYTES = 1024 * 1024;
504
+ function readSource(ctx) {
505
+ const project = projectOf(ctx, ctx.url.searchParams.get('project'));
506
+ const raw = ctx.url.searchParams.get('path');
507
+ if (!raw)
508
+ throw new HttpError(400, 'give a file path');
509
+ const abs = resolve(project, raw);
510
+ const real = existsSync(abs) ? realpathSync(abs) : abs;
511
+ const root = realpathSync(project);
512
+ if (real !== root && !real.startsWith(root + sep)) {
513
+ throw new HttpError(403, 'the file is outside the project folder');
514
+ }
515
+ const lang = SOURCE_LANGS[extname(abs).toLowerCase()] ?? 'text';
516
+ const stat = statSync(abs, { throwIfNoEntry: false });
517
+ if (!stat?.isFile())
518
+ throw new HttpError(404, 'no such file');
519
+ if (stat.size > MAX_SOURCE_BYTES)
520
+ throw new HttpError(413, 'this file is too large to show');
521
+ const text = readFileSync(abs, 'utf8');
522
+ sendJson(ctx.res, 200, {
523
+ path: relative(project, abs).split(sep).join('/'),
524
+ abs,
525
+ lang,
526
+ lines: text.split(/\r\n|\r|\n/).length,
527
+ text,
528
+ });
529
+ }
530
+ const routes = [
531
+ {
532
+ method: 'GET',
533
+ path: '/api/checks',
534
+ handler: ({ res }) => {
535
+ sendJson(res, 200, CHECKS.map(({ id, title, description, group, options, slow }) => ({
536
+ id,
537
+ title,
538
+ description,
539
+ group,
540
+ options,
541
+ slow: slow === true,
542
+ })));
543
+ },
544
+ },
545
+ { method: 'POST', path: '/api/checks/all/run', handler: startAll },
546
+ { method: 'POST', path: '/api/checks/:id/run', handler: startCheck },
547
+ { method: 'GET', path: '/api/source', handler: readSource },
548
+ ];
549
+ export const checksModule = {
550
+ id: 'checks',
551
+ title: 'Code checks',
552
+ description: 'Find dead code, unused dependencies and other problems in a project.',
553
+ status: 'available',
554
+ routes,
555
+ };
556
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../../src/commands/ui/modules/checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type UiModule } from '../http.js';
2
+ export declare const cleanupModule: UiModule;