@macrulez/devtoolz 0.1.0 → 0.2.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.
- package/README.md +197 -2
- package/dist/cli.js +314 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/circular-imports/core.d.ts +15 -0
- package/dist/commands/circular-imports/core.js +95 -0
- package/dist/commands/circular-imports/core.js.map +1 -0
- package/dist/commands/circular-imports/report.d.ts +3 -0
- package/dist/commands/circular-imports/report.js +41 -0
- package/dist/commands/circular-imports/report.js.map +1 -0
- package/dist/commands/circular-imports/run.d.ts +19 -0
- package/dist/commands/circular-imports/run.js +29 -0
- package/dist/commands/circular-imports/run.js.map +1 -0
- package/dist/commands/dead-exports/core.d.ts +1 -1
- package/dist/commands/dead-exports/core.js +2 -2
- package/dist/commands/dead-exports/core.js.map +1 -1
- package/dist/commands/dead-exports/entry.d.ts +0 -1
- package/dist/commands/dead-exports/entry.js +1 -14
- package/dist/commands/dead-exports/entry.js.map +1 -1
- package/dist/commands/dead-exports/run.js +3 -2
- package/dist/commands/dead-exports/run.js.map +1 -1
- package/dist/commands/empty-catch/core.d.ts +8 -0
- package/dist/commands/empty-catch/core.js +61 -0
- package/dist/commands/empty-catch/core.js.map +1 -0
- package/dist/commands/empty-catch/report.d.ts +3 -0
- package/dist/commands/empty-catch/report.js +27 -0
- package/dist/commands/empty-catch/report.js.map +1 -0
- package/dist/commands/empty-catch/run.d.ts +17 -0
- package/dist/commands/empty-catch/run.js +34 -0
- package/dist/commands/empty-catch/run.js.map +1 -0
- package/dist/commands/empty-catch/vue.d.ts +2 -0
- package/dist/commands/empty-catch/vue.js +16 -0
- package/dist/commands/empty-catch/vue.js.map +1 -0
- package/dist/commands/full-check/report.d.ts +3 -0
- package/dist/commands/full-check/report.js +61 -0
- package/dist/commands/full-check/report.js.map +1 -0
- package/dist/commands/full-check/run.d.ts +32 -0
- package/dist/commands/full-check/run.js +251 -0
- package/dist/commands/full-check/run.js.map +1 -0
- package/dist/commands/orphan-tests/core.d.ts +9 -0
- package/dist/commands/orphan-tests/core.js +42 -0
- package/dist/commands/orphan-tests/core.js.map +1 -0
- package/dist/commands/orphan-tests/report.d.ts +3 -0
- package/dist/commands/orphan-tests/report.js +30 -0
- package/dist/commands/orphan-tests/report.js.map +1 -0
- package/dist/commands/orphan-tests/run.d.ts +25 -0
- package/dist/commands/orphan-tests/run.js +55 -0
- package/dist/commands/orphan-tests/run.js.map +1 -0
- package/dist/commands/readme-check/run.js +8 -3
- package/dist/commands/readme-check/run.js.map +1 -1
- package/dist/commands/scripts-check/core.d.ts +18 -0
- package/dist/commands/scripts-check/core.js +121 -0
- package/dist/commands/scripts-check/core.js.map +1 -0
- package/dist/commands/scripts-check/report.d.ts +3 -0
- package/dist/commands/scripts-check/report.js +34 -0
- package/dist/commands/scripts-check/report.js.map +1 -0
- package/dist/commands/scripts-check/run.d.ts +15 -0
- package/dist/commands/scripts-check/run.js +81 -0
- package/dist/commands/scripts-check/run.js.map +1 -0
- package/dist/commands/stale-ts-ignore/check.d.ts +23 -0
- package/dist/commands/stale-ts-ignore/check.js +104 -0
- package/dist/commands/stale-ts-ignore/check.js.map +1 -0
- package/dist/commands/stale-ts-ignore/core.d.ts +11 -0
- package/dist/commands/stale-ts-ignore/core.js +42 -0
- package/dist/commands/stale-ts-ignore/core.js.map +1 -0
- package/dist/commands/stale-ts-ignore/report.d.ts +3 -0
- package/dist/commands/stale-ts-ignore/report.js +30 -0
- package/dist/commands/stale-ts-ignore/report.js.map +1 -0
- package/dist/commands/stale-ts-ignore/run.d.ts +23 -0
- package/dist/commands/stale-ts-ignore/run.js +101 -0
- package/dist/commands/stale-ts-ignore/run.js.map +1 -0
- package/dist/commands/stale-ts-ignore/vue.d.ts +9 -0
- package/dist/commands/stale-ts-ignore/vue.js +16 -0
- package/dist/commands/stale-ts-ignore/vue.js.map +1 -0
- package/dist/commands/strip-comments/core.js +2 -56
- package/dist/commands/strip-comments/core.js.map +1 -1
- package/dist/commands/todo-report/core.d.ts +16 -0
- package/dist/commands/todo-report/core.js +112 -0
- package/dist/commands/todo-report/core.js.map +1 -0
- package/dist/commands/todo-report/report.d.ts +3 -0
- package/dist/commands/todo-report/report.js +31 -0
- package/dist/commands/todo-report/report.js.map +1 -0
- package/dist/commands/todo-report/run.d.ts +22 -0
- package/dist/commands/todo-report/run.js +41 -0
- package/dist/commands/todo-report/run.js.map +1 -0
- package/dist/commands/todo-report/vue.d.ts +2 -0
- package/dist/commands/todo-report/vue.js +71 -0
- package/dist/commands/todo-report/vue.js.map +1 -0
- package/dist/commands/unused-deps/config-files.d.ts +9 -0
- package/dist/commands/unused-deps/config-files.js +64 -0
- package/dist/commands/unused-deps/config-files.js.map +1 -0
- package/dist/commands/unused-deps/core.d.ts +25 -0
- package/dist/commands/unused-deps/core.js +121 -0
- package/dist/commands/unused-deps/core.js.map +1 -0
- package/dist/commands/unused-deps/disk-resolve.d.ts +11 -0
- package/dist/commands/unused-deps/disk-resolve.js +40 -0
- package/dist/commands/unused-deps/disk-resolve.js.map +1 -0
- package/dist/commands/unused-deps/package-name.d.ts +8 -0
- package/dist/commands/unused-deps/package-name.js +20 -0
- package/dist/commands/unused-deps/package-name.js.map +1 -0
- package/dist/commands/unused-deps/report.d.ts +3 -0
- package/dist/commands/unused-deps/report.js +32 -0
- package/dist/commands/unused-deps/report.js.map +1 -0
- package/dist/commands/unused-deps/run.d.ts +18 -0
- package/dist/commands/unused-deps/run.js +68 -0
- package/dist/commands/unused-deps/run.js.map +1 -0
- package/dist/index.d.ts +54 -5
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/escape-regexp.d.ts +1 -0
- package/dist/utils/escape-regexp.js +4 -0
- package/dist/utils/escape-regexp.js.map +1 -0
- package/dist/utils/find-comments.d.ts +10 -0
- package/dist/utils/find-comments.js +62 -0
- package/dist/utils/find-comments.js.map +1 -0
- package/dist/utils/find-package-dir.d.ts +2 -0
- package/dist/utils/find-package-dir.js +15 -0
- package/dist/utils/find-package-dir.js.map +1 -0
- package/dist/utils/line-of.d.ts +2 -0
- package/dist/utils/line-of.js +12 -0
- package/dist/utils/line-of.js.map +1 -0
- package/dist/utils/load-tsconfig.d.ts +20 -0
- package/dist/utils/load-tsconfig.js +33 -0
- package/dist/utils/load-tsconfig.js.map +1 -0
- package/dist/utils/parse-module.d.ts +32 -0
- package/dist/utils/parse-module.js +178 -0
- package/dist/utils/parse-module.js.map +1 -0
- package/dist/utils/resolve-specifier.d.ts +15 -0
- package/dist/utils/resolve-specifier.js +63 -0
- package/dist/utils/resolve-specifier.js.map +1 -0
- package/dist/utils/walk.js +20 -1
- package/dist/utils/walk.js.map +1 -1
- package/dist/utils/workspace.d.ts +14 -0
- package/dist/utils/workspace.js +101 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/empty-catch/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAA0B,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAoBjF,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAA;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU;QACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAA;IAEF,MAAM,QAAQ,GAA4B,EAAE,CAAA;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxC,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;YAClC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjE,KAAK,MAAM,CAAC,IAAI,YAAY;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;IAExE,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,QAAQ;QACR,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACtC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { analyzeEmptyCatch } from './core.js';
|
|
2
|
+
const SCRIPT_RE = /(<script[^>]*>)([\s\S]*?)(<\/script>)/;
|
|
3
|
+
export function analyzeEmptyCatchVue(text, file) {
|
|
4
|
+
const scriptMatch = text.match(SCRIPT_RE);
|
|
5
|
+
if (!scriptMatch)
|
|
6
|
+
return [];
|
|
7
|
+
const [, , body] = scriptMatch;
|
|
8
|
+
const findings = analyzeEmptyCatch(body, file.replace(/\.vue$/, '.ts'));
|
|
9
|
+
// Finding line numbers are relative to the <script> body alone (that's
|
|
10
|
+
// all core.ts ever sees) — offset by however many lines come before it
|
|
11
|
+
// in the real file, so a report against the whole .vue file points at
|
|
12
|
+
// the right line.
|
|
13
|
+
const lineOffset = (text.slice(0, scriptMatch.index).match(/\n/g) ?? []).length;
|
|
14
|
+
return findings.map((f) => ({ ...f, line: f.line + lineOffset }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.js","sourceRoot":"","sources":["../../../src/commands/empty-catch/vue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,WAAW,CAAA;AAErE,MAAM,SAAS,GAAG,uCAAuC,CAAA;AAEzD,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAY;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACzC,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAA;IAE3B,MAAM,CAAC,EAAE,AAAD,EAAG,IAAI,CAAC,GAAG,WAA+C,CAAA;IAClE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAc,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;IAEjF,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,kBAAkB;IAClB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;IAC/E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC,CAAA;AACnE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { banner, isFancyOutputEnabled } from '../../format/vibes.js';
|
|
2
|
+
import { colorize, DIM, GREEN, RED } from '../../format/colors.js';
|
|
3
|
+
function statusFor(result, fancy) {
|
|
4
|
+
if (result.skipped)
|
|
5
|
+
return fancy ? colorize(DIM, '⊘') : '⊘';
|
|
6
|
+
if (result.error)
|
|
7
|
+
return fancy ? colorize(RED, '✖') : '✖';
|
|
8
|
+
if (result.exitCode !== 0)
|
|
9
|
+
return fancy ? colorize(RED, '✖') : '✖';
|
|
10
|
+
return fancy ? colorize(GREEN, '✔') : '✔';
|
|
11
|
+
}
|
|
12
|
+
function noteFor(result) {
|
|
13
|
+
if (result.skipped)
|
|
14
|
+
return 'skipped';
|
|
15
|
+
if (result.error)
|
|
16
|
+
return `error — ${result.error}`;
|
|
17
|
+
if (result.exitCode === 0)
|
|
18
|
+
return 'clean';
|
|
19
|
+
return `${result.findingsCount} found`;
|
|
20
|
+
}
|
|
21
|
+
export function renderFullCheckReport(report, options = {}) {
|
|
22
|
+
if (report.error) {
|
|
23
|
+
const lines = [];
|
|
24
|
+
if (!options.quiet && !options.plain)
|
|
25
|
+
lines.push(banner(), '');
|
|
26
|
+
lines.push(`Could not run full-check: ${report.error}`);
|
|
27
|
+
return lines.join('\n');
|
|
28
|
+
}
|
|
29
|
+
const fancy = isFancyOutputEnabled(options);
|
|
30
|
+
const clean = report.results.filter((r) => !r.skipped && !r.error && r.exitCode === 0).length;
|
|
31
|
+
const withFindings = report.results.filter((r) => !r.skipped && !r.error && r.exitCode !== 0).length;
|
|
32
|
+
const errored = report.results.filter((r) => r.error).length;
|
|
33
|
+
const skipped = report.results.filter((r) => r.skipped).length;
|
|
34
|
+
const isFullyClean = withFindings === 0 && errored === 0;
|
|
35
|
+
if (options.quiet && isFullyClean)
|
|
36
|
+
return '';
|
|
37
|
+
const lines = [];
|
|
38
|
+
if (!options.quiet && !options.plain)
|
|
39
|
+
lines.push(banner(), '');
|
|
40
|
+
const nameWidth = Math.max(...report.results.map((r) => r.command.length));
|
|
41
|
+
for (const result of report.results) {
|
|
42
|
+
const status = statusFor(result, fancy);
|
|
43
|
+
const name = result.command.padEnd(nameWidth);
|
|
44
|
+
const note = noteFor(result);
|
|
45
|
+
const styledNote = fancy && (result.skipped || (!result.error && result.exitCode === 0))
|
|
46
|
+
? colorize(DIM, note)
|
|
47
|
+
: note;
|
|
48
|
+
lines.push(`${status} ${name} ${styledNote}`);
|
|
49
|
+
}
|
|
50
|
+
lines.push('');
|
|
51
|
+
const parts = [`${clean} clean`];
|
|
52
|
+
if (withFindings > 0)
|
|
53
|
+
parts.push(`${withFindings} found something`);
|
|
54
|
+
if (errored > 0)
|
|
55
|
+
parts.push(`${errored} errored`);
|
|
56
|
+
if (skipped > 0)
|
|
57
|
+
parts.push(`${skipped} skipped`);
|
|
58
|
+
lines.push(`${parts.join(', ')} — see \`devtoolz <command> --help\` for full detail on any of them.`);
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/full-check/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type FullCheckCommandName = 'strip-comments' | 'console-strip' | 'dead-exports' | 'case-check' | 'exports-doctor' | 'readme-check' | 'unused-deps' | 'circular-imports' | 'empty-catch' | 'todo-report' | 'scripts-check' | 'orphan-tests' | 'stale-ts-ignore';
|
|
2
|
+
export declare const FULL_CHECK_COMMAND_NAMES: readonly FullCheckCommandName[];
|
|
3
|
+
/** `stale-ts-ignore` is the only command a bare `full-check` run should ever warn about — see cli.ts's interactive prompt. */
|
|
4
|
+
export declare const SLOW_FULL_CHECK_COMMAND: FullCheckCommandName;
|
|
5
|
+
export interface FullCheckCommandResult {
|
|
6
|
+
command: FullCheckCommandName;
|
|
7
|
+
skipped: boolean;
|
|
8
|
+
findingsCount: number;
|
|
9
|
+
exitCode: number;
|
|
10
|
+
error: string | null;
|
|
11
|
+
/** the command's own real report — `StripCommentsReport`, `DeadExportsReport`, etc.; `null` when skipped */
|
|
12
|
+
report: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface FullCheckRunOptions {
|
|
15
|
+
/** directory every command scans/reads from — same one for all thirteen, deliberately (see unused-deps' own [dir]-only design for why one shared root matters) */
|
|
16
|
+
dir: string;
|
|
17
|
+
/** command names to skip entirely, e.g. ['stale-ts-ignore'] */
|
|
18
|
+
skip?: string[];
|
|
19
|
+
/** called right before each non-skipped command starts */
|
|
20
|
+
onCommandStart?: (command: FullCheckCommandName) => void;
|
|
21
|
+
/** called right after each command finishes (or is skipped) */
|
|
22
|
+
onCommandDone?: (result: FullCheckCommandResult) => void;
|
|
23
|
+
/** forwarded only to stale-ts-ignore — its own "this can take a while" notice */
|
|
24
|
+
onProgress?: (message: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface FullCheckReport {
|
|
27
|
+
results: FullCheckCommandResult[];
|
|
28
|
+
/** an unknown name in `skip` — a different kind of problem than any single command's own result */
|
|
29
|
+
error: string | null;
|
|
30
|
+
exitCode: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function runFullCheck(options: FullCheckRunOptions): FullCheckReport;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { runStripComments } from '../strip-comments/run.js';
|
|
3
|
+
import { runConsoleStrip } from '../console-strip/run.js';
|
|
4
|
+
import { runDeadExports } from '../dead-exports/run.js';
|
|
5
|
+
import { runCaseCheck } from '../case-check/run.js';
|
|
6
|
+
import { runExportsDoctor } from '../exports-doctor/run.js';
|
|
7
|
+
import { runReadmeCheck } from '../readme-check/run.js';
|
|
8
|
+
import { runUnusedDeps } from '../unused-deps/run.js';
|
|
9
|
+
import { runCircularImports } from '../circular-imports/run.js';
|
|
10
|
+
import { runEmptyCatch } from '../empty-catch/run.js';
|
|
11
|
+
import { runTodoReport } from '../todo-report/run.js';
|
|
12
|
+
import { runScriptsCheck } from '../scripts-check/run.js';
|
|
13
|
+
import { runOrphanTests } from '../orphan-tests/run.js';
|
|
14
|
+
import { runStaleTsIgnore } from '../stale-ts-ignore/run.js';
|
|
15
|
+
// One entry per command, in the same order `devtoolz --help` lists them —
|
|
16
|
+
// `stale-ts-ignore` deliberately last: it's the only one that can be slow
|
|
17
|
+
// (a real whole-project typecheck, run twice), so every cheap command's
|
|
18
|
+
// result is already in hand before the wait, instead of first.
|
|
19
|
+
//
|
|
20
|
+
// Every one of these calls is intentionally diagnostic-only: the three
|
|
21
|
+
// commands that CAN write to disk (`strip-comments`/`console-strip`/
|
|
22
|
+
// `case-check`) never get `yes`/`fix` here — `dryRun: true` is set anyway,
|
|
23
|
+
// as a second, explicit guarantee on top of simply never passing `yes`,
|
|
24
|
+
// not because it's load-bearing on its own.
|
|
25
|
+
const COMMANDS = [
|
|
26
|
+
{
|
|
27
|
+
name: 'strip-comments',
|
|
28
|
+
run: (dir) => {
|
|
29
|
+
const report = runStripComments({ paths: ['.'], cwd: dir, dryRun: true });
|
|
30
|
+
return {
|
|
31
|
+
report,
|
|
32
|
+
exitCode: report.exitCode,
|
|
33
|
+
error: null,
|
|
34
|
+
// `changes.length` alone would be a FILE count — every other
|
|
35
|
+
// command's `findingsCount` is an INDIVIDUAL-item count (dead
|
|
36
|
+
// exports, empty catches, ...), so summing each file's own
|
|
37
|
+
// `count` keeps this one comparable in the summary table instead
|
|
38
|
+
// of silently mixing units.
|
|
39
|
+
findingsCount: report.changes.reduce((sum, c) => sum + c.count, 0),
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'console-strip',
|
|
45
|
+
run: (dir) => {
|
|
46
|
+
const report = runConsoleStrip({ paths: ['.'], cwd: dir, dryRun: true });
|
|
47
|
+
return {
|
|
48
|
+
report,
|
|
49
|
+
exitCode: report.exitCode,
|
|
50
|
+
error: null,
|
|
51
|
+
// Same reasoning as strip-comments above, plus `skipped` — those
|
|
52
|
+
// are individual calls too (left in place, flagged for a manual
|
|
53
|
+
// look), not files, so they add directly rather than needing
|
|
54
|
+
// their own per-file expansion.
|
|
55
|
+
findingsCount: report.changes.reduce((sum, c) => sum + c.count, 0) + report.skipped.length,
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'dead-exports',
|
|
61
|
+
run: (dir) => {
|
|
62
|
+
const report = runDeadExports({ paths: ['.'], cwd: dir });
|
|
63
|
+
return {
|
|
64
|
+
report,
|
|
65
|
+
exitCode: report.exitCode,
|
|
66
|
+
error: null,
|
|
67
|
+
findingsCount: report.findings.length,
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'case-check',
|
|
73
|
+
run: (dir) => {
|
|
74
|
+
const report = runCaseCheck({ paths: ['.'], cwd: dir, dryRun: true });
|
|
75
|
+
return {
|
|
76
|
+
report,
|
|
77
|
+
exitCode: report.exitCode,
|
|
78
|
+
error: null,
|
|
79
|
+
findingsCount: report.findings.length,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'exports-doctor',
|
|
85
|
+
run: (dir) => {
|
|
86
|
+
const report = runExportsDoctor({ dir });
|
|
87
|
+
return {
|
|
88
|
+
report,
|
|
89
|
+
exitCode: report.exitCode,
|
|
90
|
+
error: report.error,
|
|
91
|
+
findingsCount: report.findings.length,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'readme-check',
|
|
97
|
+
run: (dir) => {
|
|
98
|
+
const report = runReadmeCheck({ dir });
|
|
99
|
+
return {
|
|
100
|
+
report,
|
|
101
|
+
exitCode: report.exitCode,
|
|
102
|
+
error: report.error,
|
|
103
|
+
findingsCount: report.findings.length,
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'unused-deps',
|
|
109
|
+
run: (dir) => {
|
|
110
|
+
const report = runUnusedDeps({ dir });
|
|
111
|
+
return {
|
|
112
|
+
report,
|
|
113
|
+
exitCode: report.exitCode,
|
|
114
|
+
error: report.error,
|
|
115
|
+
findingsCount: report.findings.length,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'circular-imports',
|
|
121
|
+
run: (dir) => {
|
|
122
|
+
const report = runCircularImports({ paths: ['.'], cwd: dir });
|
|
123
|
+
return {
|
|
124
|
+
report,
|
|
125
|
+
exitCode: report.exitCode,
|
|
126
|
+
error: null,
|
|
127
|
+
findingsCount: report.findings.length,
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'empty-catch',
|
|
133
|
+
run: (dir) => {
|
|
134
|
+
const report = runEmptyCatch({ paths: ['.'], cwd: dir });
|
|
135
|
+
return {
|
|
136
|
+
report,
|
|
137
|
+
exitCode: report.exitCode,
|
|
138
|
+
error: null,
|
|
139
|
+
findingsCount: report.findings.length,
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'todo-report',
|
|
145
|
+
run: (dir) => {
|
|
146
|
+
const report = runTodoReport({ paths: ['.'], cwd: dir });
|
|
147
|
+
return {
|
|
148
|
+
report,
|
|
149
|
+
exitCode: report.exitCode,
|
|
150
|
+
error: null,
|
|
151
|
+
findingsCount: report.findings.length,
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'scripts-check',
|
|
157
|
+
run: (dir) => {
|
|
158
|
+
const report = runScriptsCheck({ dir });
|
|
159
|
+
return {
|
|
160
|
+
report,
|
|
161
|
+
exitCode: report.exitCode,
|
|
162
|
+
error: report.error,
|
|
163
|
+
findingsCount: report.findings.length,
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'orphan-tests',
|
|
169
|
+
run: (dir) => {
|
|
170
|
+
const report = runOrphanTests({ paths: ['.'], cwd: dir });
|
|
171
|
+
return {
|
|
172
|
+
report,
|
|
173
|
+
exitCode: report.exitCode,
|
|
174
|
+
error: report.error,
|
|
175
|
+
findingsCount: report.findings.length,
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'stale-ts-ignore',
|
|
181
|
+
run: (dir, onProgress) => {
|
|
182
|
+
const report = runStaleTsIgnore({ dir, ...(onProgress ? { onProgress } : {}) });
|
|
183
|
+
return {
|
|
184
|
+
report,
|
|
185
|
+
exitCode: report.exitCode,
|
|
186
|
+
error: report.error,
|
|
187
|
+
findingsCount: report.findings.length,
|
|
188
|
+
};
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
export const FULL_CHECK_COMMAND_NAMES = COMMANDS.map((c) => c.name);
|
|
193
|
+
/** `stale-ts-ignore` is the only command a bare `full-check` run should ever warn about — see cli.ts's interactive prompt. */
|
|
194
|
+
export const SLOW_FULL_CHECK_COMMAND = 'stale-ts-ignore';
|
|
195
|
+
export function runFullCheck(options) {
|
|
196
|
+
const dir = resolve(options.dir);
|
|
197
|
+
const skip = new Set(options.skip ?? []);
|
|
198
|
+
const unknown = [...skip].filter((name) => !FULL_CHECK_COMMAND_NAMES.includes(name));
|
|
199
|
+
if (unknown.length > 0) {
|
|
200
|
+
return {
|
|
201
|
+
results: [],
|
|
202
|
+
error: `unknown command name(s) for --skip: ${unknown.join(', ')} — valid names: ${FULL_CHECK_COMMAND_NAMES.join(', ')}`,
|
|
203
|
+
exitCode: 1,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const results = [];
|
|
207
|
+
for (const entry of COMMANDS) {
|
|
208
|
+
if (skip.has(entry.name)) {
|
|
209
|
+
const result = {
|
|
210
|
+
command: entry.name,
|
|
211
|
+
skipped: true,
|
|
212
|
+
findingsCount: 0,
|
|
213
|
+
exitCode: 0,
|
|
214
|
+
error: null,
|
|
215
|
+
report: null,
|
|
216
|
+
};
|
|
217
|
+
results.push(result);
|
|
218
|
+
options.onCommandDone?.(result);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
options.onCommandStart?.(entry.name);
|
|
222
|
+
let outcome;
|
|
223
|
+
try {
|
|
224
|
+
outcome = entry.run(dir, options.onProgress);
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
outcome = {
|
|
228
|
+
report: null,
|
|
229
|
+
exitCode: 1,
|
|
230
|
+
error: err instanceof Error ? err.message : String(err),
|
|
231
|
+
findingsCount: 0,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const result = {
|
|
235
|
+
command: entry.name,
|
|
236
|
+
skipped: false,
|
|
237
|
+
findingsCount: outcome.findingsCount,
|
|
238
|
+
exitCode: outcome.exitCode,
|
|
239
|
+
error: outcome.error,
|
|
240
|
+
report: outcome.report,
|
|
241
|
+
};
|
|
242
|
+
results.push(result);
|
|
243
|
+
options.onCommandDone?.(result);
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
results,
|
|
247
|
+
error: null,
|
|
248
|
+
exitCode: results.some((r) => r.exitCode !== 0) ? 1 : 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/full-check/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface OrphanTestFinding {
|
|
2
|
+
file: string;
|
|
3
|
+
triedExtensions: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function parseTestFile(fileName: string, testSuffixes: string[]): {
|
|
6
|
+
base: string;
|
|
7
|
+
} | null;
|
|
8
|
+
export declare function hasMatchingSource(sourceBaseAbsPath: string, sourceExtensions: string[]): boolean;
|
|
9
|
+
export declare function candidateSourceDirs(testFileDir: string): string[];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, extname } from 'node:path';
|
|
3
|
+
// A test file's own name, stripped of its test suffix AND extension —
|
|
4
|
+
// `Foo.test.ts` with suffixes `['.test', '.spec']` becomes `Foo`. A file
|
|
5
|
+
// whose name doesn't end in any configured suffix isn't a test file this
|
|
6
|
+
// command recognizes at all (a plain `.ts` file that happened to get
|
|
7
|
+
// walked alongside real test files) and is silently skipped, not flagged.
|
|
8
|
+
export function parseTestFile(fileName, testSuffixes) {
|
|
9
|
+
const ext = extname(fileName);
|
|
10
|
+
if (!ext)
|
|
11
|
+
return null;
|
|
12
|
+
const withoutExt = fileName.slice(0, fileName.length - ext.length);
|
|
13
|
+
for (const suffix of testSuffixes) {
|
|
14
|
+
if (withoutExt.endsWith(suffix)) {
|
|
15
|
+
return { base: withoutExt.slice(0, withoutExt.length - suffix.length) };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function hasMatchingSource(sourceBaseAbsPath, sourceExtensions) {
|
|
21
|
+
return sourceExtensions.some((ext) => existsSync(`${sourceBaseAbsPath}${ext}`));
|
|
22
|
+
}
|
|
23
|
+
// Real dogfooding against this very workspace's own packages found that
|
|
24
|
+
// strict same-directory co-location (`Foo.test.ts` next to `Foo.ts`) is
|
|
25
|
+
// the MINORITY case — most instead put the test one level down, in a
|
|
26
|
+
// `__tests__`/`tests` sibling of the real source directory
|
|
27
|
+
// (`src/adapters/__tests__/http.test.ts` next to `src/adapters/http.ts`).
|
|
28
|
+
// Treating that as a second co-located candidate — not a `--source-dir`/
|
|
29
|
+
// `--test-dir` mirror, since it's still ONE tree, just with tests one
|
|
30
|
+
// level deeper — turns the default mode from "barely applicable to real
|
|
31
|
+
// projects" into the common case it should be, without a new flag: this
|
|
32
|
+
// container-name list is stable convention, not a per-project setting.
|
|
33
|
+
const TEST_CONTAINER_DIR_NAMES = new Set(['__tests__', 'tests', 'test', 'spec', 'specs']);
|
|
34
|
+
export function candidateSourceDirs(testFileDir) {
|
|
35
|
+
const dirs = [testFileDir];
|
|
36
|
+
const parent = dirname(testFileDir);
|
|
37
|
+
if (TEST_CONTAINER_DIR_NAMES.has(basename(testFileDir)) && parent !== testFileDir) {
|
|
38
|
+
dirs.push(parent);
|
|
39
|
+
}
|
|
40
|
+
return dirs;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/commands/orphan-tests/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOtD,sEAAsE;AACtE,yEAAyE;AACzE,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,YAAsB;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IAClE,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;QACzE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,iBAAyB,EAAE,gBAA0B;IACrF,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,iBAAiB,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;AACjF,CAAC;AAED,wEAAwE;AACxE,wEAAwE;AACxE,qEAAqE;AACrE,2DAA2D;AAC3D,0EAA0E;AAC1E,yEAAyE;AACzE,sEAAsE;AACtE,wEAAwE;AACxE,wEAAwE;AACxE,uEAAuE;AACvE,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAEzF,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACnC,IAAI,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { banner, cleanCelebration } from '../../format/vibes.js';
|
|
2
|
+
import { formatFindingsRows } from '../../format/findings-list.js';
|
|
3
|
+
export function renderOrphanTestsReport(report, options = {}) {
|
|
4
|
+
if (report.error) {
|
|
5
|
+
const lines = [];
|
|
6
|
+
if (!options.quiet && !options.plain)
|
|
7
|
+
lines.push(banner(), '');
|
|
8
|
+
lines.push(`Could not run orphan-tests: ${report.error}`);
|
|
9
|
+
return lines.join('\n');
|
|
10
|
+
}
|
|
11
|
+
const isClean = report.findings.length === 0;
|
|
12
|
+
if (options.quiet && isClean)
|
|
13
|
+
return '';
|
|
14
|
+
const lines = [];
|
|
15
|
+
if (!options.quiet && !options.plain)
|
|
16
|
+
lines.push(banner(), '');
|
|
17
|
+
lines.push(`Scanned ${report.filesScanned} file${report.filesScanned === 1 ? '' : 's'}.`, '');
|
|
18
|
+
if (isClean) {
|
|
19
|
+
lines.push(cleanCelebration(options));
|
|
20
|
+
return lines.join('\n');
|
|
21
|
+
}
|
|
22
|
+
lines.push(`${report.findings.length} orphan test${report.findings.length === 1 ? '' : 's'} found:`);
|
|
23
|
+
lines.push(...formatFindingsRows(report.findings.map((f) => ({
|
|
24
|
+
location: f.file,
|
|
25
|
+
name: 'orphan',
|
|
26
|
+
tag: `no matching source found (tried ${f.triedExtensions.join(', ')})`,
|
|
27
|
+
})), options));
|
|
28
|
+
return lines.join('\n');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/orphan-tests/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,uBAAuB,CACrC,MAAyB,EACzB,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,+BAA+B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACzD,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,CACR,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CACzF,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,QAAQ;QACd,GAAG,EAAE,mCAAmC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KACxE,CAAC,CAAC,EACH,OAAO,CACR,CACF,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type OrphanTestFinding } from './core.js';
|
|
2
|
+
export interface OrphanTestsRunOptions {
|
|
3
|
+
paths: string[];
|
|
4
|
+
cwd: string;
|
|
5
|
+
/** which files to consider as POSSIBLE test files while walking — default: .ts,.tsx,.js,.jsx,.mjs,.cjs */
|
|
6
|
+
extensions?: string[];
|
|
7
|
+
ignoreGlobs?: string[];
|
|
8
|
+
respectGitignore?: boolean;
|
|
9
|
+
/** suffix(es) that mark a file as a test file — default: ['.test', '.spec'] */
|
|
10
|
+
testSuffixes?: string[];
|
|
11
|
+
/** extensions tried for a matching source file — default: .ts,.tsx,.js,.jsx,.mjs,.cjs,.vue */
|
|
12
|
+
sourceExtensions?: string[];
|
|
13
|
+
/** mirrored layout: source root, relative to `cwd` — must be given together with `testDir` */
|
|
14
|
+
sourceDir?: string;
|
|
15
|
+
/** mirrored layout: test root, relative to `cwd` — must be given together with `sourceDir` */
|
|
16
|
+
testDir?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface OrphanTestsReport {
|
|
19
|
+
filesScanned: number;
|
|
20
|
+
findings: OrphanTestFinding[];
|
|
21
|
+
/** --source-dir/--test-dir given without its pair — a different kind of problem than any single finding */
|
|
22
|
+
error: string | null;
|
|
23
|
+
exitCode: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function runOrphanTests(options: OrphanTestsRunOptions): OrphanTestsReport;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
2
|
+
import { walk } from '../../utils/walk.js';
|
|
3
|
+
import { parseTestFile, hasMatchingSource, candidateSourceDirs, } from './core.js';
|
|
4
|
+
const DEFAULT_TEST_SUFFIXES = ['.test', '.spec'];
|
|
5
|
+
const DEFAULT_SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.vue'];
|
|
6
|
+
const DEFAULT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
7
|
+
export function runOrphanTests(options) {
|
|
8
|
+
const cwd = resolve(options.cwd);
|
|
9
|
+
const testSuffixes = options.testSuffixes ?? DEFAULT_TEST_SUFFIXES;
|
|
10
|
+
const sourceExtensions = options.sourceExtensions ?? DEFAULT_SOURCE_EXTENSIONS;
|
|
11
|
+
const extensions = options.extensions ?? DEFAULT_EXTENSIONS;
|
|
12
|
+
if (Boolean(options.sourceDir) !== Boolean(options.testDir)) {
|
|
13
|
+
return {
|
|
14
|
+
filesScanned: 0,
|
|
15
|
+
findings: [],
|
|
16
|
+
error: '--source-dir and --test-dir must be given together',
|
|
17
|
+
exitCode: 1,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const mirrored = Boolean(options.sourceDir && options.testDir);
|
|
21
|
+
const walkRoots = mirrored ? [options.testDir] : options.paths;
|
|
22
|
+
const testFiles = walk(walkRoots, {
|
|
23
|
+
cwd,
|
|
24
|
+
extensions,
|
|
25
|
+
ignoreGlobs: options.ignoreGlobs ?? [],
|
|
26
|
+
...(options.respectGitignore !== undefined
|
|
27
|
+
? { respectGitignore: options.respectGitignore }
|
|
28
|
+
: {}),
|
|
29
|
+
});
|
|
30
|
+
const testDirAbs = mirrored ? resolve(cwd, options.testDir) : null;
|
|
31
|
+
const sourceDirAbs = mirrored ? resolve(cwd, options.sourceDir) : null;
|
|
32
|
+
const findings = [];
|
|
33
|
+
for (const absFile of testFiles) {
|
|
34
|
+
const parsed = parseTestFile(basename(absFile), testSuffixes);
|
|
35
|
+
if (!parsed)
|
|
36
|
+
continue;
|
|
37
|
+
const found = mirrored && testDirAbs && sourceDirAbs
|
|
38
|
+
? hasMatchingSource(join(sourceDirAbs, relative(testDirAbs, dirname(absFile)), parsed.base), sourceExtensions)
|
|
39
|
+
: candidateSourceDirs(dirname(absFile)).some((dir) => hasMatchingSource(join(dir, parsed.base), sourceExtensions));
|
|
40
|
+
if (found)
|
|
41
|
+
continue;
|
|
42
|
+
findings.push({
|
|
43
|
+
file: relative(cwd, absFile).split('\\').join('/'),
|
|
44
|
+
triedExtensions: sourceExtensions,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
findings.sort((a, b) => a.file.localeCompare(b.file));
|
|
48
|
+
return {
|
|
49
|
+
filesScanned: testFiles.length,
|
|
50
|
+
findings,
|
|
51
|
+
error: null,
|
|
52
|
+
exitCode: findings.length > 0 ? 1 : 0,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/orphan-tests/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,WAAW,CAAA;AAElB,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAChD,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AACxF,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AA2BzE,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAA;IAClE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,yBAAyB,CAAA;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAA;IAE3D,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO;YACL,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,oDAAoD;YAC3D,QAAQ,EAAE,CAAC;SACZ,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAA;IAExE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAChC,GAAG;QACH,UAAU;QACV,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5E,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEhF,MAAM,QAAQ,GAAwB,EAAE,CAAA;IACxC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,MAAM,KAAK,GACT,QAAQ,IAAI,UAAU,IAAI,YAAY;YACpC,CAAC,CAAC,iBAAiB,CACf,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EACvE,gBAAgB,CACjB;YACH,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACjD,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAC5D,CAAA;QAEP,IAAI,KAAK;YAAE,SAAQ;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAClD,eAAe,EAAE,gBAAgB;SAClC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAErD,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,MAAM;QAC9B,QAAQ;QACR,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACtC,CAAA;AACH,CAAC"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { checkMarkdownFile } from './core.js';
|
|
4
|
-
import {
|
|
4
|
+
import { loadTsconfig } from '../../utils/load-tsconfig.js';
|
|
5
5
|
import { DEFAULT_LANGS } from './lang.js';
|
|
6
6
|
export function runReadmeCheck(options) {
|
|
7
7
|
const packageDir = resolve(options.dir);
|
|
8
8
|
const targetFiles = options.files && options.files.length > 0 ? options.files : ['README.md'];
|
|
9
9
|
const langs = options.langs && options.langs.length > 0 ? options.langs : DEFAULT_LANGS;
|
|
10
|
-
const loaded =
|
|
10
|
+
const loaded = loadTsconfig(packageDir, options.tsconfig);
|
|
11
11
|
if ('error' in loaded) {
|
|
12
|
-
return {
|
|
12
|
+
return {
|
|
13
|
+
fileResults: [],
|
|
14
|
+
findings: [],
|
|
15
|
+
error: `${loaded.error} — nothing to typecheck README code blocks against`,
|
|
16
|
+
exitCode: 1,
|
|
17
|
+
};
|
|
13
18
|
}
|
|
14
19
|
const fileResults = [];
|
|
15
20
|
for (const relFile of targetFiles) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/readme-check/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAuD,MAAM,WAAW,CAAA;AAClG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/readme-check/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAuD,MAAM,WAAW,CAAA;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAqBzC,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAA;IAEvF,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO;YACL,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,oDAAoD;YAC1E,QAAQ,EAAE,CAAC;SACZ,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAA4B,EAAE,CAAA;IAC/C,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QAC5C,IAAI,QAAgB,CAAA;QACpB,IAAI,CAAC;YACH,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,kBAAkB,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACvF,QAAQ,EAAE,CAAC;aACZ,CAAA;QACH,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACvD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtF,CAAC"}
|