@macrulez/devtoolz 0.4.1 → 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 (85) hide show
  1. package/README.md +13 -0
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/image-batch/run.d.ts +4 -1
  5. package/dist/commands/image-batch/run.js +5 -0
  6. package/dist/commands/image-batch/run.js.map +1 -1
  7. package/dist/commands/image-hash/sharp-loader.d.ts +3 -0
  8. package/dist/commands/image-hash/sharp-loader.js.map +1 -1
  9. package/dist/commands/ui/cli.d.ts +2 -0
  10. package/dist/commands/ui/cli.js +78 -0
  11. package/dist/commands/ui/cli.js.map +1 -0
  12. package/dist/commands/ui/fs-routes.d.ts +7 -0
  13. package/dist/commands/ui/fs-routes.js +135 -0
  14. package/dist/commands/ui/fs-routes.js.map +1 -0
  15. package/dist/commands/ui/http.d.ts +41 -0
  16. package/dist/commands/ui/http.js +81 -0
  17. package/dist/commands/ui/http.js.map +1 -0
  18. package/dist/commands/ui/jobs.d.ts +15 -0
  19. package/dist/commands/ui/jobs.js +73 -0
  20. package/dist/commands/ui/jobs.js.map +1 -0
  21. package/dist/commands/ui/modules/checks.d.ts +28 -0
  22. package/dist/commands/ui/modules/checks.js +556 -0
  23. package/dist/commands/ui/modules/checks.js.map +1 -0
  24. package/dist/commands/ui/modules/cleanup.d.ts +2 -0
  25. package/dist/commands/ui/modules/cleanup.js +305 -0
  26. package/dist/commands/ui/modules/cleanup.js.map +1 -0
  27. package/dist/commands/ui/modules/image-batch-backups.d.ts +2 -0
  28. package/dist/commands/ui/modules/image-batch-backups.js +116 -0
  29. package/dist/commands/ui/modules/image-batch-backups.js.map +1 -0
  30. package/dist/commands/ui/modules/image-batch-manage.d.ts +2 -0
  31. package/dist/commands/ui/modules/image-batch-manage.js +245 -0
  32. package/dist/commands/ui/modules/image-batch-manage.js.map +1 -0
  33. package/dist/commands/ui/modules/image-batch.d.ts +2 -0
  34. package/dist/commands/ui/modules/image-batch.js +225 -0
  35. package/dist/commands/ui/modules/image-batch.js.map +1 -0
  36. package/dist/commands/ui/modules/image-hash.d.ts +2 -0
  37. package/dist/commands/ui/modules/image-hash.js +158 -0
  38. package/dist/commands/ui/modules/image-hash.js.map +1 -0
  39. package/dist/commands/ui/modules/index.d.ts +2 -0
  40. package/dist/commands/ui/modules/index.js +11 -0
  41. package/dist/commands/ui/modules/index.js.map +1 -0
  42. package/dist/commands/ui/open-browser.d.ts +1 -0
  43. package/dist/commands/ui/open-browser.js +18 -0
  44. package/dist/commands/ui/open-browser.js.map +1 -0
  45. package/dist/commands/ui/scan.d.ts +20 -0
  46. package/dist/commands/ui/scan.js +57 -0
  47. package/dist/commands/ui/scan.js.map +1 -0
  48. package/dist/commands/ui/server.d.ts +18 -0
  49. package/dist/commands/ui/server.js +196 -0
  50. package/dist/commands/ui/server.js.map +1 -0
  51. package/dist/ui/assets/ChecksPage-MLWSelKP.js +1 -0
  52. package/dist/ui/assets/ChecksPage-pbC0Txsh.css +1 -0
  53. package/dist/ui/assets/CleanupPage-B2ZTFOpP.js +4 -0
  54. package/dist/ui/assets/CleanupPage-k7sTI4iz.css +1 -0
  55. package/dist/ui/assets/FolderBrowser-BX3-y8sM.js +1 -0
  56. package/dist/ui/assets/FolderBrowser-DRh-WZPz.css +1 -0
  57. package/dist/ui/assets/ImageBatchPage-CvsCvu1q.js +4 -0
  58. package/dist/ui/assets/ImageBatchPage-DiK8ODUc.css +1 -0
  59. package/dist/ui/assets/ImageHashPage-Bbhxvjj0.js +1 -0
  60. package/dist/ui/assets/ImageHashPage-CUXnoJEA.css +1 -0
  61. package/dist/ui/assets/SourcePicker-C3qFDUoL.css +1 -0
  62. package/dist/ui/assets/SourcePicker-CVgtCk78.js +1 -0
  63. package/dist/ui/assets/UiSegmented-Q_ter8VK.css +1 -0
  64. package/dist/ui/assets/UiSegmented-YV1YATxM.js +1 -0
  65. package/dist/ui/assets/core-DVezgdzc.js +12 -0
  66. package/dist/ui/assets/css-Z72CF80r.js +1 -0
  67. package/dist/ui/assets/engine-javascript-CNmxVhbB.js +141 -0
  68. package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
  69. package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
  70. package/dist/ui/assets/highlight-CsAszz7F.js +2 -0
  71. package/dist/ui/assets/html-BlS82ilI.js +1 -0
  72. package/dist/ui/assets/index-BzfkjuG8.css +1 -0
  73. package/dist/ui/assets/index-pDKL0Y31.js +3 -0
  74. package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
  75. package/dist/ui/assets/json-Cp-IABpG.js +1 -0
  76. package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
  77. package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
  78. package/dist/ui/assets/scss-Cw6XMfVs.js +1 -0
  79. package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
  80. package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
  81. package/dist/ui/assets/useCopy-vCfkPGWW.js +1 -0
  82. package/dist/ui/assets/vue-CwSeJimo.js +1 -0
  83. package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
  84. package/dist/ui/index.html +17 -0
  85. 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;