habit-hooks 0.1.0-beta.0 → 0.2.0
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/dist/baseline/auto-prune.d.ts +4 -0
- package/dist/baseline/auto-prune.js +38 -0
- package/dist/baseline/auto-prune.js.map +1 -0
- package/dist/baseline/commands.js +3 -9
- package/dist/baseline/commands.js.map +1 -1
- package/dist/baseline/filter.d.ts +2 -1
- package/dist/baseline/filter.js +2 -15
- package/dist/baseline/filter.js.map +1 -1
- package/dist/baseline/reap.d.ts +6 -0
- package/dist/baseline/reap.js +22 -0
- package/dist/baseline/reap.js.map +1 -0
- package/dist/baseline/snooze-index.d.ts +5 -0
- package/dist/baseline/snooze-index.js +65 -0
- package/dist/baseline/snooze-index.js.map +1 -0
- package/dist/checks/comment-check.js +4 -2
- package/dist/checks/comment-check.js.map +1 -1
- package/dist/checks/eslint-wrap.js +10 -7
- package/dist/checks/eslint-wrap.js.map +1 -1
- package/dist/checks/jscpd-wrap.d.ts +4 -1
- package/dist/checks/jscpd-wrap.js +12 -11
- package/dist/checks/jscpd-wrap.js.map +1 -1
- package/dist/checks/knip-wrap.js +20 -12
- package/dist/checks/knip-wrap.js.map +1 -1
- package/dist/cli/init/apply-recommendations.d.ts +3 -0
- package/dist/cli/init/apply-recommendations.js +76 -0
- package/dist/cli/init/apply-recommendations.js.map +1 -0
- package/dist/cli/init/command-runner.d.ts +6 -0
- package/dist/cli/init/command-runner.js +22 -0
- package/dist/cli/init/command-runner.js.map +1 -0
- package/dist/cli/init/completion-report.d.ts +11 -0
- package/dist/cli/init/completion-report.js +98 -0
- package/dist/cli/init/completion-report.js.map +1 -0
- package/dist/cli/init/ctx.d.ts +12 -0
- package/dist/cli/init/ctx.js +16 -0
- package/dist/cli/init/ctx.js.map +1 -0
- package/dist/cli/init/detect.d.ts +2 -0
- package/dist/cli/init/detect.js +55 -6
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/git-hook.d.ts +2 -1
- package/dist/cli/init/git-hook.js +10 -6
- package/dist/cli/init/git-hook.js.map +1 -1
- package/dist/cli/init/install-commands.d.ts +3 -1
- package/dist/cli/init/install-commands.js +27 -0
- package/dist/cli/init/install-commands.js.map +1 -1
- package/dist/cli/init/recommendations.d.ts +14 -0
- package/dist/cli/init/recommendations.js +66 -0
- package/dist/cli/init/recommendations.js.map +1 -0
- package/dist/cli/init/report-language.d.ts +1 -0
- package/dist/cli/init/report-language.js +12 -0
- package/dist/cli/init/report-language.js.map +1 -0
- package/dist/cli/init/reporters.d.ts +1 -0
- package/dist/cli/init/reporters.js +8 -4
- package/dist/cli/init/reporters.js.map +1 -1
- package/dist/cli/init/run.d.ts +5 -0
- package/dist/cli/init/run.js +60 -96
- package/dist/cli/init/run.js.map +1 -1
- package/dist/cli/init/scaffold-config.d.ts +8 -1
- package/dist/cli/init/scaffold-config.js +20 -3
- package/dist/cli/init/scaffold-config.js.map +1 -1
- package/dist/cli/init/scaffold-jscpd-config.d.ts +2 -1
- package/dist/cli/init/scaffold-jscpd-config.js +3 -3
- package/dist/cli/init/scaffold-jscpd-config.js.map +1 -1
- package/dist/cli/init/scaffold-ruff-config.d.ts +2 -0
- package/dist/cli/init/scaffold-ruff-config.js +12 -0
- package/dist/cli/init/scaffold-ruff-config.js.map +1 -0
- package/dist/cli/init/skill.d.ts +2 -1
- package/dist/cli/init/skill.js +18 -15
- package/dist/cli/init/skill.js.map +1 -1
- package/dist/cli/init/snippet.d.ts +2 -1
- package/dist/cli/init/snippet.js +17 -4
- package/dist/cli/init/snippet.js.map +1 -1
- package/dist/cli/init/templates/eslint-config.d.ts +1 -1
- package/dist/cli/init/templates/eslint-config.js +10 -0
- package/dist/cli/init/templates/eslint-config.js.map +1 -1
- package/dist/cli/init/templates/jscpd-config.d.ts +2 -1
- package/dist/cli/init/templates/jscpd-config.js +14 -6
- package/dist/cli/init/templates/jscpd-config.js.map +1 -1
- package/dist/cli/init/templates/ruff-config.d.ts +2 -0
- package/dist/cli/init/templates/ruff-config.js +16 -0
- package/dist/cli/init/templates/ruff-config.js.map +1 -0
- package/dist/cli/init/tool-steps.d.ts +2 -0
- package/dist/cli/init/tool-steps.js +78 -0
- package/dist/cli/init/tool-steps.js.map +1 -0
- package/dist/cli/init-command.js +32 -6
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/catalogue-unused.d.ts +2 -0
- package/dist/config/catalogue-unused.js +39 -0
- package/dist/config/catalogue-unused.js.map +1 -0
- package/dist/config/catalogue.d.ts +2 -0
- package/dist/config/catalogue.js +163 -0
- package/dist/config/catalogue.js.map +1 -0
- package/dist/config/defaults.d.ts +2 -2
- package/dist/config/defaults.js +7 -167
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/load.d.ts +1 -0
- package/dist/config/load.js +1 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/merge.js +1 -0
- package/dist/config/merge.js.map +1 -1
- package/dist/config/schema.d.ts +9 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/tool-smells.d.ts +14 -0
- package/dist/config/tool-smells.js +69 -0
- package/dist/config/tool-smells.js.map +1 -0
- package/dist/config/validate.js +42 -11
- package/dist/config/validate.js.map +1 -1
- package/dist/detect/path.d.ts +1 -0
- package/dist/detect/path.js +14 -0
- package/dist/detect/path.js.map +1 -0
- package/dist/detect/tool.d.ts +2 -2
- package/dist/detect/tool.js +2 -0
- package/dist/detect/tool.js.map +1 -1
- package/dist/discover.d.ts +2 -0
- package/dist/discover.js +14 -0
- package/dist/discover.js.map +1 -0
- package/dist/guide/command.d.ts +6 -0
- package/dist/guide/command.js +20 -0
- package/dist/guide/command.js.map +1 -0
- package/dist/guide/guide.d.ts +11 -0
- package/dist/guide/guide.js +82 -0
- package/dist/guide/guide.js.map +1 -0
- package/dist/guide/render.d.ts +3 -0
- package/dist/guide/render.js +14 -0
- package/dist/guide/render.js.map +1 -0
- package/dist/mapper/mapper.d.ts +34 -0
- package/dist/mapper/mapper.js +80 -0
- package/dist/mapper/mapper.js.map +1 -0
- package/dist/prompts/packaged-dir.js +1 -1
- package/dist/prompts/packaged-dir.js.map +1 -1
- package/dist/prompts/registry.js +1 -26
- package/dist/prompts/registry.js.map +1 -1
- package/dist/rule-files.d.ts +2 -0
- package/dist/rule-files.js +22 -0
- package/dist/rule-files.js.map +1 -0
- package/dist/rules/registry.js +3 -3
- package/dist/rules/registry.js.map +1 -1
- package/dist/runner.d.ts +4 -4
- package/dist/runner.js +95 -105
- package/dist/runner.js.map +1 -1
- package/dist/sensors/adapter.d.ts +17 -0
- package/dist/sensors/adapter.js +81 -0
- package/dist/sensors/adapter.js.map +1 -0
- package/dist/sensors/deptry-sensor.d.ts +3 -0
- package/dist/sensors/deptry-sensor.js +43 -0
- package/dist/sensors/deptry-sensor.js.map +1 -0
- package/dist/sensors/line-count-sensor.d.ts +3 -0
- package/dist/sensors/line-count-sensor.js +50 -0
- package/dist/sensors/line-count-sensor.js.map +1 -0
- package/dist/sensors/needs-extraction.d.ts +3 -0
- package/dist/sensors/needs-extraction.js +57 -0
- package/dist/sensors/needs-extraction.js.map +1 -0
- package/dist/sensors/preset.d.ts +17 -0
- package/dist/sensors/preset.js +57 -0
- package/dist/sensors/preset.js.map +1 -0
- package/dist/sensors/python-preset.d.ts +7 -0
- package/dist/sensors/python-preset.js +34 -0
- package/dist/sensors/python-preset.js.map +1 -0
- package/dist/sensors/runner.d.ts +12 -0
- package/dist/sensors/runner.js +94 -0
- package/dist/sensors/runner.js.map +1 -0
- package/dist/sensors/types.d.ts +15 -0
- package/dist/sensors/types.js +5 -0
- package/dist/sensors/types.js.map +1 -0
- package/dist/types.d.ts +4 -1
- package/dist/wrap/notices.d.ts +6 -0
- package/dist/wrap/notices.js +9 -0
- package/dist/wrap/notices.js.map +1 -1
- package/dist/wrap/run.d.ts +2 -0
- package/dist/wrap/run.js +6 -1
- package/dist/wrap/run.js.map +1 -1
- package/dist/wrap/shell.d.ts +1 -0
- package/dist/wrap/shell.js +8 -2
- package/dist/wrap/shell.js.map +1 -1
- package/package.json +17 -10
- package/src/prompts/deep-nesting.md +13 -0
- package/src/prompts/needs-extraction.md +9 -0
- package/src/prompts/non-null-assertion.md +10 -0
- package/src/prompts/oversized-function.issues.njk +5 -0
- package/src/prompts/parse-error.md +5 -0
- package/src/prompts/uncoached.md +4 -3
- package/src/skills/habit-hooks-prompting/SKILL.md +37 -0
- package/dist/eslint-runner.d.ts +0 -7
- package/dist/eslint-runner.js +0 -34
- package/dist/eslint-runner.js.map +0 -1
- package/dist/reporter.d.ts +0 -7
- package/dist/reporter.js +0 -114
- package/dist/reporter.js.map +0 -1
- package/src/prompts/eslint-boundaries-dependencies.md +0 -9
- package/src/prompts/eslint-eqeqeq.md +0 -3
- package/src/prompts/eslint-fatal.md +0 -7
- package/src/prompts/eslint-no-duplicate-imports.md +0 -1
- package/src/prompts/eslint-no-unused-vars.md +0 -3
- package/src/prompts/eslint-no-var.md +0 -1
- package/src/prompts/eslint-no-warning-comments.md +0 -3
- package/src/prompts/eslint-prefer-const.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-explicit-any.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-inferrable-types.md +0 -3
- package/src/prompts/eslint-typescript-eslint-no-non-null-assertion.md +0 -3
- package/src/prompts/knip-classMembers.md +0 -7
- package/src/prompts/knip-dependencies.md +0 -9
- package/src/prompts/knip-exports.md +0 -9
- package/src/prompts/knip-files.md +0 -9
- package/src/prompts/knip-types.md +0 -9
- /package/src/prompts/{jscpd-duplication.md → duplicated-code.md} +0 -0
- /package/src/prompts/{eslint-complexity.md → high-complexity.md} +0 -0
- /package/src/prompts/{comment-non-essential.md → non-essential-comment.md} +0 -0
- /package/src/prompts/{eslint-max-lines.md → oversized-file.md} +0 -0
- /package/src/prompts/{eslint-max-lines-per-function.md → oversized-function.md} +0 -0
- /package/src/prompts/{eslint-max-params.md → too-many-parameters.md} +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type RunOptions, type RunResult } from '../runner.js';
|
|
2
|
+
export declare function autoPruneFullRepo(cwd: string, configPath?: string): Promise<string[]>;
|
|
3
|
+
export declare function autoPruneNotice(pruned: string[]): string;
|
|
4
|
+
export declare function runWithAutoPrune(cwd: string, options: RunOptions): Promise<RunResult>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { run } from '../runner.js';
|
|
2
|
+
import { loadBaseline, saveBaseline, BASELINE_VERSION } from './store.js';
|
|
3
|
+
import { toRepoRelative } from './filter.js';
|
|
4
|
+
import { reapBaseline } from './reap.js';
|
|
5
|
+
// Auto-prune reaps baseline entries whose smell is actually fixed. It runs a
|
|
6
|
+
// baseline-free full scan so a sensor gated off by the baseline can't make a
|
|
7
|
+
// snoozed file look falsely clean, then shares the reaper with `baseline prune`.
|
|
8
|
+
// configPath must match the one used for the main run so the re-scan sees the
|
|
9
|
+
// same rules — using a different (or default-discovered) config could wrongly
|
|
10
|
+
// mark a still-snoozed file as clean and prune it.
|
|
11
|
+
export async function autoPruneFullRepo(cwd, configPath) {
|
|
12
|
+
const baseline = loadBaseline(cwd);
|
|
13
|
+
if (Object.keys(baseline.files).length === 0)
|
|
14
|
+
return [];
|
|
15
|
+
const scan = await run(cwd, { configPath, scopeFlags: { all: true }, applyBaseline: false });
|
|
16
|
+
const violating = new Set(scan.violations.map((v) => toRepoRelative(cwd, v.file)));
|
|
17
|
+
const { files, pruned } = reapBaseline(cwd, baseline, violating);
|
|
18
|
+
if (pruned.length > 0)
|
|
19
|
+
saveBaseline(cwd, { version: BASELINE_VERSION, files });
|
|
20
|
+
return pruned;
|
|
21
|
+
}
|
|
22
|
+
export function autoPruneNotice(pruned) {
|
|
23
|
+
const entries = pruned.length === 1 ? 'entry' : 'entries';
|
|
24
|
+
return `🧹 Auto-pruned ${String(pruned.length)} fixed baseline ${entries}: ${pruned.join(', ')}\n`;
|
|
25
|
+
}
|
|
26
|
+
// run() is a pure evaluator; auto-prune is the one side effect a full-repo run
|
|
27
|
+
// performs. A scoped run never mutates the baseline (a file can look clean only
|
|
28
|
+
// because its smell is outside the diff), so it is a guaranteed no-op.
|
|
29
|
+
export async function runWithAutoPrune(cwd, options) {
|
|
30
|
+
const result = await run(cwd, options);
|
|
31
|
+
if (result.scopeMode !== 'all')
|
|
32
|
+
return result;
|
|
33
|
+
const pruned = await autoPruneFullRepo(cwd, options.configPath);
|
|
34
|
+
if (pruned.length === 0)
|
|
35
|
+
return result;
|
|
36
|
+
return { ...result, stdout: result.stdout + autoPruneNotice(pruned) };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=auto-prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-prune.js","sourceRoot":"","sources":["../../src/baseline/auto-prune.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAmC,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,6EAA6E;AAC7E,6EAA6E;AAC7E,iFAAiF;AACjF,8EAA8E;AAC9E,8EAA8E;AAC9E,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,UAAmB;IACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,OAAO,kBAAkB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrG,CAAC;AAED,+EAA+E;AAC/E,gFAAgF;AAChF,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAmB;IACrE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -4,6 +4,7 @@ import { run } from '../runner.js';
|
|
|
4
4
|
import { isWorkingTreeCleanFor, lastCommitHash } from './file-hash.js';
|
|
5
5
|
import { BASELINE_VERSION, baselineExists, loadBaseline, saveBaseline, } from './store.js';
|
|
6
6
|
import { toRepoRelative } from './filter.js';
|
|
7
|
+
import { reapBaseline } from './reap.js';
|
|
7
8
|
function ok(stdout = '') {
|
|
8
9
|
return { stdout, stderr: '', exitCode: 0 };
|
|
9
10
|
}
|
|
@@ -87,19 +88,12 @@ export function baselineForget(cwd, paths) {
|
|
|
87
88
|
saveBaseline(cwd, { version: BASELINE_VERSION, files });
|
|
88
89
|
return ok(`baseline forget: removed ${String(removed)} entry/entries\n`);
|
|
89
90
|
}
|
|
90
|
-
function shouldKeepEntry(cwd, relPath, violating) {
|
|
91
|
-
if (!existsSync(join(cwd, relPath)))
|
|
92
|
-
return false;
|
|
93
|
-
return violating.has(relPath);
|
|
94
|
-
}
|
|
95
91
|
export async function baselinePrune(cwd) {
|
|
96
92
|
const baseline = loadBaseline(cwd);
|
|
97
93
|
const violating = new Set(await collectViolatingFiles(cwd));
|
|
98
|
-
const
|
|
99
|
-
const files = Object.fromEntries(kept);
|
|
100
|
-
const removed = Object.keys(baseline.files).length - kept.length;
|
|
94
|
+
const { files, pruned } = reapBaseline(cwd, baseline, violating);
|
|
101
95
|
saveBaseline(cwd, { version: BASELINE_VERSION, files });
|
|
102
|
-
return ok(`baseline prune: removed ${String(
|
|
96
|
+
return ok(`baseline prune: removed ${String(pruned.length)} entry/entries\n`);
|
|
103
97
|
}
|
|
104
98
|
function classifyEntry(cwd, relPath, entry) {
|
|
105
99
|
if (!existsSync(join(cwd, relPath)))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/baseline/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/baseline/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { SnoozeIndex } from './snooze-index.js';
|
|
1
2
|
import type { BaselineFile } from './store.js';
|
|
2
3
|
export declare function toRepoRelative(cwd: string, absPath: string): string;
|
|
3
4
|
interface SnoozePartition {
|
|
4
5
|
active: string[];
|
|
5
6
|
skipped: string[];
|
|
6
7
|
}
|
|
7
|
-
export declare function partitionBySnooze(files: string[], baseline: BaselineFile,
|
|
8
|
+
export declare function partitionBySnooze(files: string[], baseline: BaselineFile, index: SnoozeIndex): SnoozePartition;
|
|
8
9
|
export {};
|
package/dist/baseline/filter.js
CHANGED
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import { relative, sep } from 'node:path';
|
|
2
|
-
import { isWorkingTreeCleanFor, lastCommitHash } from './file-hash.js';
|
|
3
2
|
export function toRepoRelative(cwd, absPath) {
|
|
4
3
|
return relative(cwd, absPath).split(sep).join('/');
|
|
5
4
|
}
|
|
6
|
-
function isSnoozed(relPath, baseline, cwd) {
|
|
7
|
-
const entry = baseline.files[relPath];
|
|
8
|
-
if (entry === undefined)
|
|
9
|
-
return false;
|
|
10
|
-
const currentHash = lastCommitHash(cwd, relPath);
|
|
11
|
-
if (currentHash === null)
|
|
12
|
-
return false;
|
|
13
|
-
if (currentHash !== entry.snoozedAtCommit)
|
|
14
|
-
return false;
|
|
15
|
-
return isWorkingTreeCleanFor(cwd, relPath);
|
|
16
|
-
}
|
|
17
5
|
function assignToPartition(partition, abs, snoozed) {
|
|
18
6
|
if (snoozed)
|
|
19
7
|
partition.skipped.push(abs);
|
|
20
8
|
else
|
|
21
9
|
partition.active.push(abs);
|
|
22
10
|
}
|
|
23
|
-
export function partitionBySnooze(files, baseline,
|
|
11
|
+
export function partitionBySnooze(files, baseline, index) {
|
|
24
12
|
const partition = { active: [], skipped: [] };
|
|
25
13
|
for (const abs of files) {
|
|
26
|
-
|
|
27
|
-
assignToPartition(partition, abs, isSnoozed(rel, baseline, cwd));
|
|
14
|
+
assignToPartition(partition, abs, index.isSnoozed(abs, baseline));
|
|
28
15
|
}
|
|
29
16
|
return partition;
|
|
30
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/baseline/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/baseline/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,OAAe;IACzD,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAOD,SAAS,iBAAiB,CACxB,SAA0B,EAC1B,GAAW,EACX,OAAgB;IAEhB,IAAI,OAAO;QAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QACpC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAe,EACf,QAAsB,EACtB,KAAkB;IAElB,MAAM,SAAS,GAAoB,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC/D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BaselineEntry, BaselineFile } from './store.js';
|
|
2
|
+
export interface ReapResult {
|
|
3
|
+
files: Record<string, BaselineEntry>;
|
|
4
|
+
pruned: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function reapBaseline(cwd: string, baseline: BaselineFile, violating: Set<string>): ReapResult;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
function shouldKeep(cwd, relPath, violating) {
|
|
4
|
+
if (!existsSync(join(cwd, relPath)))
|
|
5
|
+
return false;
|
|
6
|
+
return violating.has(relPath);
|
|
7
|
+
}
|
|
8
|
+
// The one reaper shared by manual `baseline prune` and full-repo auto-prune:
|
|
9
|
+
// drop an entry whose file is gone, or present but no longer in the violating
|
|
10
|
+
// set (the smell was fixed). `violating` must come from a baseline-free scan.
|
|
11
|
+
export function reapBaseline(cwd, baseline, violating) {
|
|
12
|
+
const files = {};
|
|
13
|
+
const pruned = [];
|
|
14
|
+
for (const [rel, entry] of Object.entries(baseline.files)) {
|
|
15
|
+
if (shouldKeep(cwd, rel, violating))
|
|
16
|
+
files[rel] = entry;
|
|
17
|
+
else
|
|
18
|
+
pruned.push(rel);
|
|
19
|
+
}
|
|
20
|
+
return { files, pruned };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=reap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reap.js","sourceRoot":"","sources":["../../src/baseline/reap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,SAAS,UAAU,CAAC,GAAW,EAAE,OAAe,EAAE,SAAsB;IACtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,QAAsB,EAAE,SAAsB;IACtF,MAAM,KAAK,GAAkC,EAAE,CAAC;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;;YACnD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { gitExec, GitError } from '../git/exec.js';
|
|
2
|
+
import { lastCommitHash } from './file-hash.js';
|
|
3
|
+
import { toRepoRelative } from './filter.js';
|
|
4
|
+
// `git status --porcelain -z` record: `XY <path>`, NUL-separated, no path
|
|
5
|
+
// quoting. A rename/copy record is followed by an extra field for the original
|
|
6
|
+
// path; both sides count as dirty. Only the X (index) column ever carries R/C in
|
|
7
|
+
// porcelain v1, so the follow-up-field check inspects record[0] alone. Returns
|
|
8
|
+
// the index of the last field consumed.
|
|
9
|
+
function parseDirtyRecord(records, i, dirty) {
|
|
10
|
+
const record = records[i];
|
|
11
|
+
if (record.length < 4)
|
|
12
|
+
return i;
|
|
13
|
+
dirty.add(record.slice(3));
|
|
14
|
+
if (!/[RC]/.test(record[0]))
|
|
15
|
+
return i;
|
|
16
|
+
if (records[i + 1])
|
|
17
|
+
dirty.add(records[i + 1]);
|
|
18
|
+
return i + 1;
|
|
19
|
+
}
|
|
20
|
+
function computeDirtySet(cwd) {
|
|
21
|
+
let records;
|
|
22
|
+
try {
|
|
23
|
+
records = gitExec(['status', '--porcelain', '-z'], cwd).split('\0');
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
if (err instanceof GitError)
|
|
27
|
+
return null;
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
const dirty = new Set();
|
|
31
|
+
for (let i = 0; i < records.length; i += 1)
|
|
32
|
+
i = parseDirtyRecord(records, i, dirty);
|
|
33
|
+
return dirty;
|
|
34
|
+
}
|
|
35
|
+
class GitSnoozeIndex {
|
|
36
|
+
cwd;
|
|
37
|
+
hashes = new Map();
|
|
38
|
+
dirty;
|
|
39
|
+
constructor(cwd) {
|
|
40
|
+
this.cwd = cwd;
|
|
41
|
+
}
|
|
42
|
+
hashFor(rel) {
|
|
43
|
+
if (!this.hashes.has(rel))
|
|
44
|
+
this.hashes.set(rel, lastCommitHash(this.cwd, rel));
|
|
45
|
+
return this.hashes.get(rel) ?? null;
|
|
46
|
+
}
|
|
47
|
+
isClean(rel) {
|
|
48
|
+
if (this.dirty === undefined)
|
|
49
|
+
this.dirty = computeDirtySet(this.cwd);
|
|
50
|
+
return this.dirty !== null && !this.dirty.has(rel);
|
|
51
|
+
}
|
|
52
|
+
isSnoozed(absPath, baseline) {
|
|
53
|
+
const rel = toRepoRelative(this.cwd, absPath);
|
|
54
|
+
const entry = baseline.files[rel];
|
|
55
|
+
if (entry === undefined)
|
|
56
|
+
return false;
|
|
57
|
+
if (this.hashFor(rel) !== entry.snoozedAtCommit)
|
|
58
|
+
return false;
|
|
59
|
+
return this.isClean(rel);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function createSnoozeIndex(cwd) {
|
|
63
|
+
return new GitSnoozeIndex(cwd);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=snooze-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snooze-index.js","sourceRoot":"","sources":["../../src/baseline/snooze-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Project, SyntaxKind } from 'ts-morph';
|
|
2
|
+
import { COMMENT_SMELL } from '../config/tool-smells.js';
|
|
2
3
|
export const DEFAULT_COMMENT_CHECK_THRESHOLDS = {
|
|
3
4
|
maxSingleLineChars: 10,
|
|
4
5
|
maxBlockChars: 15,
|
|
@@ -26,7 +27,8 @@ function truncate(text) {
|
|
|
26
27
|
}
|
|
27
28
|
function makeViolation(file, comment, kind) {
|
|
28
29
|
return {
|
|
29
|
-
ruleId:
|
|
30
|
+
ruleId: COMMENT_SMELL,
|
|
31
|
+
source: 'comment:non-essential',
|
|
30
32
|
file,
|
|
31
33
|
line: comment.getStartLineNumber(),
|
|
32
34
|
message: `${kind}-line comment: "${truncate(comment.getText())}"`,
|
|
@@ -67,7 +69,7 @@ function buildProject(files) {
|
|
|
67
69
|
return project;
|
|
68
70
|
}
|
|
69
71
|
function resolveThresholds(rules) {
|
|
70
|
-
const rule = rules.find((r) => r.id ===
|
|
72
|
+
const rule = rules.find((r) => r.id === COMMENT_SMELL);
|
|
71
73
|
return rule?.commentCheck ?? DEFAULT_COMMENT_CHECK_THRESHOLDS;
|
|
72
74
|
}
|
|
73
75
|
export const commentCheck = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-check.js","sourceRoot":"","sources":["../../src/checks/comment-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAA8B,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"comment-check.js","sourceRoot":"","sources":["../../src/checks/comment-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ import { dirname, join } from 'node:path';
|
|
|
3
3
|
import { runTool } from '../wrap/shell.js';
|
|
4
4
|
import { detectTool } from '../detect/tool.js';
|
|
5
5
|
import { lookupPrompt } from '../prompts/registry.js';
|
|
6
|
-
import { emptyOutcome, firstLine, isSpawnFailure, noticesFor, spawnFailureWarning, } from '../wrap/notices.js';
|
|
6
|
+
import { emptyOutcome, firstLine, isSpawnFailure, noticesFor, spawnFailureOutcome, spawnFailureWarning, } from '../wrap/notices.js';
|
|
7
7
|
import { spawnTarget } from '../wrap/resolve.js';
|
|
8
|
+
import { ESLINT_SMELL_MAP, PARSE_ERROR_SMELL } from '../config/tool-smells.js';
|
|
8
9
|
import { parseJsonStdout } from '../wrap/run.js';
|
|
9
10
|
const require = createRequire(import.meta.url);
|
|
10
11
|
function bundledEslintBin() {
|
|
@@ -32,14 +33,16 @@ function isConfigError(result, parsed) {
|
|
|
32
33
|
return result.exitCode !== 0 && result.exitCode !== 1;
|
|
33
34
|
}
|
|
34
35
|
function messageToViolation(filePath, m) {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
36
|
+
const smell = ESLINT_SMELL_MAP[m.ruleId] ?? m.ruleId;
|
|
37
|
+
const title = lookupPrompt(smell)?.title ?? m.ruleId;
|
|
38
|
+
const message = `${title}: ${m.message}`;
|
|
39
|
+
const source = `eslint:${m.ruleId}`;
|
|
40
|
+
return { ruleId: smell, source, file: filePath, line: m.line, column: m.column, message };
|
|
39
41
|
}
|
|
40
42
|
function fatalToViolation(filePath, m) {
|
|
41
43
|
return {
|
|
42
|
-
ruleId:
|
|
44
|
+
ruleId: PARSE_ERROR_SMELL,
|
|
45
|
+
source: 'eslint:fatal',
|
|
43
46
|
file: filePath,
|
|
44
47
|
line: m.line,
|
|
45
48
|
column: m.column,
|
|
@@ -87,7 +90,7 @@ async function runEslint(resolution, cwd, files) {
|
|
|
87
90
|
const result = await executeEslint(resolution, cwd, files);
|
|
88
91
|
const parsed = tryParseJson(result.stdout);
|
|
89
92
|
if (isSpawnFailure(result))
|
|
90
|
-
return
|
|
93
|
+
return spawnFailureOutcome(notices, spawnFailureWarning('eslint', cwd, result.warnings));
|
|
91
94
|
if (isConfigError(result, parsed))
|
|
92
95
|
return emptyOutcome([...notices, ...failureNotices(cwd, result)]);
|
|
93
96
|
return { violations: parseEslintJson(result.stdout), stderr: notices };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-wrap.js","sourceRoot":"","sources":["../../src/checks/eslint-wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAoB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAgB/C,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,MAAc;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,OAAO,kCAAkC,GAAG,kBAAkB,MAAM,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,eAAe,CAAqB,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB,EAAE,MAAiC;IAC3E,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,CAAqC;IACjF,MAAM,
|
|
1
|
+
{"version":3,"file":"eslint-wrap.js","sourceRoot":"","sources":["../../src/checks/eslint-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,8 @@ import { type BinResolution } from '../wrap/notices.js';
|
|
|
2
2
|
import type { Check, CheckOutcome } from '../types.js';
|
|
3
3
|
export declare function tryBundledJscpdBin(resolver?: () => string): string | null;
|
|
4
4
|
export declare function resolveJscpdBin(cwd: string, fallbackResolver?: () => string): BinResolution | null;
|
|
5
|
-
export declare function runJscpdWrap(files: string[], cwd: string, resolution
|
|
5
|
+
export declare function runJscpdWrap(files: string[], cwd: string, { resolution, tmpRoot }: {
|
|
6
|
+
resolution: BinResolution | null;
|
|
7
|
+
tmpRoot?: string;
|
|
8
|
+
}): Promise<CheckOutcome>;
|
|
6
9
|
export declare const jscpdWrap: Check;
|
|
@@ -5,9 +5,9 @@ import { dirname, join } from 'node:path';
|
|
|
5
5
|
import { detectTool } from '../detect/tool.js';
|
|
6
6
|
import { hasPackageJsonKey } from '../detect/package-json.js';
|
|
7
7
|
import { absolutize, emptyOutcome, firstLine, noticesFor } from '../wrap/notices.js';
|
|
8
|
-
import { isSpawnSkip, spawnWrapped } from '../wrap/run.js';
|
|
8
|
+
import { isSpawnSkip, skipOutcome, spawnWrapped } from '../wrap/run.js';
|
|
9
|
+
import { JSCPD_SMELL } from '../config/tool-smells.js';
|
|
9
10
|
const require = createRequire(import.meta.url);
|
|
10
|
-
const RULE_ID = 'jscpd:duplication';
|
|
11
11
|
const REPORT_FILENAME = 'jscpd-report.json';
|
|
12
12
|
const JSCPD_CONFIG_FILES = ['.jscpd.json', 'jscpd.json'];
|
|
13
13
|
function findPackageRoot(start) {
|
|
@@ -59,7 +59,8 @@ function locationDescription(loc, cwd) {
|
|
|
59
59
|
}
|
|
60
60
|
function buildViolation(self, partner, cwd) {
|
|
61
61
|
return {
|
|
62
|
-
ruleId:
|
|
62
|
+
ruleId: JSCPD_SMELL,
|
|
63
|
+
source: 'jscpd:duplication',
|
|
63
64
|
file: absolutize(cwd, self.name),
|
|
64
65
|
line: self.startLoc.line,
|
|
65
66
|
column: self.startLoc.column,
|
|
@@ -96,8 +97,8 @@ function tryReadReport(reportDir) {
|
|
|
96
97
|
function buildArgs(reportDir) {
|
|
97
98
|
return ['-r', 'json', '-o', reportDir, '--silent', '--noTips', '-n', '.'];
|
|
98
99
|
}
|
|
99
|
-
function makeReportDir() {
|
|
100
|
-
return mkdtempSync(join(
|
|
100
|
+
function makeReportDir(tmpRoot = tmpdir()) {
|
|
101
|
+
return mkdtempSync(join(tmpRoot, 'hh-jscpd-'));
|
|
101
102
|
}
|
|
102
103
|
function removeReportDir(reportDir) {
|
|
103
104
|
rmSync(reportDir, { recursive: true, force: true });
|
|
@@ -112,14 +113,14 @@ async function runOnce(inputs, reportDir) {
|
|
|
112
113
|
const { resolution, cwd } = inputs;
|
|
113
114
|
const result = await spawnWrapped({ tool: 'jscpd', resolution, cwd, args: buildArgs(reportDir) });
|
|
114
115
|
if (isSpawnSkip(result))
|
|
115
|
-
return
|
|
116
|
+
return skipOutcome(result, inputs.notices);
|
|
116
117
|
const report = tryReadReport(reportDir);
|
|
117
118
|
if (report === null)
|
|
118
119
|
return missingReportOutcome(inputs, result);
|
|
119
120
|
return { violations: reportToViolations(report, inputs.scope, inputs.cwd), stderr: inputs.notices };
|
|
120
121
|
}
|
|
121
|
-
async function runJscpd(inputs) {
|
|
122
|
-
const reportDir = makeReportDir();
|
|
122
|
+
async function runJscpd(inputs, tmpRoot) {
|
|
123
|
+
const reportDir = makeReportDir(tmpRoot);
|
|
123
124
|
try {
|
|
124
125
|
return await runOnce(inputs, reportDir);
|
|
125
126
|
}
|
|
@@ -138,7 +139,7 @@ function noConfigOutcome(cwd, notices) {
|
|
|
138
139
|
function noBinOutcome(cwd) {
|
|
139
140
|
return emptyOutcome([unresolvedBinWarning(cwd)]);
|
|
140
141
|
}
|
|
141
|
-
export async function runJscpdWrap(files, cwd, resolution) {
|
|
142
|
+
export async function runJscpdWrap(files, cwd, { resolution, tmpRoot }) {
|
|
142
143
|
if (files.length === 0)
|
|
143
144
|
return { violations: [], stderr: [] };
|
|
144
145
|
if (resolution === null)
|
|
@@ -146,13 +147,13 @@ export async function runJscpdWrap(files, cwd, resolution) {
|
|
|
146
147
|
const notices = noticesFor('jscpd', resolution, cwd);
|
|
147
148
|
if (!hasJscpdConfig(cwd))
|
|
148
149
|
return noConfigOutcome(cwd, notices);
|
|
149
|
-
return runJscpd({ resolution, cwd, scope: new Set(files), notices });
|
|
150
|
+
return runJscpd({ resolution, cwd, scope: new Set(files), notices }, tmpRoot);
|
|
150
151
|
}
|
|
151
152
|
export const jscpdWrap = {
|
|
152
153
|
id: 'jscpd',
|
|
153
154
|
async run(files, _rules, cwd) {
|
|
154
155
|
const runCwd = cwd ?? process.cwd();
|
|
155
|
-
return runJscpdWrap(files, runCwd, resolveJscpdBin(runCwd));
|
|
156
|
+
return runJscpdWrap(files, runCwd, { resolution: resolveJscpdBin(runCwd) });
|
|
156
157
|
},
|
|
157
158
|
};
|
|
158
159
|
//# sourceMappingURL=jscpd-wrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jscpd-wrap.js","sourceRoot":"","sources":["../../src/checks/jscpd-wrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"jscpd-wrap.js","sourceRoot":"","sources":["../../src/checks/jscpd-wrap.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/knip-wrap.js
CHANGED
|
@@ -2,7 +2,8 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { hasPackageJsonKey } from '../detect/package-json.js';
|
|
4
4
|
import { absolutize, emptyOutcome, firstLine, noticesFor } from '../wrap/notices.js';
|
|
5
|
-
import { isSpawnSkip, parseJsonStdout, spawnWrapped } from '../wrap/run.js';
|
|
5
|
+
import { isSpawnSkip, parseJsonStdout, skipOutcome, spawnWrapped } from '../wrap/run.js';
|
|
6
|
+
import { KNIP_SMELL_MAP } from '../config/tool-smells.js';
|
|
6
7
|
import { buildKnipArgs, consumerKnipMajor, resolveKnipBin } from './knip-resolve.js';
|
|
7
8
|
import { KNOWN_KEYS, LOCATION_KEYS, MEMBER_KEYS, } from './knip-schema.js';
|
|
8
9
|
export { buildKnipArgs, consumerKnipMajor, resolveKnipBin };
|
|
@@ -12,17 +13,23 @@ function exitFailureWarning(cwd, code, stderr) {
|
|
|
12
13
|
const suffix = detail.length > 0 ? `: ${detail}` : '';
|
|
13
14
|
return `habit-hooks: knip skipped in ${cwd} (exit ${code})${suffix}`;
|
|
14
15
|
}
|
|
16
|
+
function knipSmell(issueType) {
|
|
17
|
+
return KNIP_SMELL_MAP[issueType] ?? issueType;
|
|
18
|
+
}
|
|
15
19
|
function buildViolation(args) {
|
|
16
|
-
const { ruleId, file, message, loc } = args;
|
|
17
|
-
return { ruleId, file, line: loc.line ?? 1, column: loc.col, message };
|
|
20
|
+
const { ruleId, source, file, message, loc } = args;
|
|
21
|
+
return { ruleId, source, file, line: loc.line ?? 1, column: loc.col, message };
|
|
18
22
|
}
|
|
19
23
|
function locationToViolation(ctx, loc) {
|
|
20
|
-
const ruleId =
|
|
21
|
-
|
|
24
|
+
const ruleId = knipSmell(ctx.issueType);
|
|
25
|
+
const source = `knip:${ctx.issueType}`;
|
|
26
|
+
return buildViolation({ ruleId, source, file: absolutize(ctx.cwd, ctx.issueFile), message: loc.name, loc });
|
|
22
27
|
}
|
|
23
28
|
function memberToViolation(ctx, owner, loc) {
|
|
24
|
-
const ruleId =
|
|
25
|
-
|
|
29
|
+
const ruleId = knipSmell(ctx.issueType);
|
|
30
|
+
const source = `knip:${ctx.issueType}`;
|
|
31
|
+
const file = absolutize(ctx.cwd, ctx.issueFile);
|
|
32
|
+
return buildViolation({ ruleId, source, file, message: `${owner}.${loc.name}`, loc });
|
|
26
33
|
}
|
|
27
34
|
function flattenMemberMap(ctx, members) {
|
|
28
35
|
return Object.entries(members).flatMap(([owner, list]) => list.map((loc) => memberToViolation(ctx, owner, loc)));
|
|
@@ -59,10 +66,11 @@ function isPopulated(value) {
|
|
|
59
66
|
return true;
|
|
60
67
|
}
|
|
61
68
|
function unknownKeyToViolation(cwd, issue, key) {
|
|
62
|
-
const ruleId =
|
|
69
|
+
const ruleId = knipSmell(key);
|
|
70
|
+
const source = `knip:${key}`;
|
|
63
71
|
const file = absolutize(cwd, issue.file);
|
|
64
72
|
const message = 'unrecognised knip issue type';
|
|
65
|
-
return { ruleId, file, line: 1, message };
|
|
73
|
+
return { ruleId, source, file, line: 1, message };
|
|
66
74
|
}
|
|
67
75
|
function unknownKeysForIssue(issue, cwd) {
|
|
68
76
|
const record = issue;
|
|
@@ -78,8 +86,8 @@ function issueToViolations(issue, cwd) {
|
|
|
78
86
|
return [...fromLocations, ...fromMembers, ...fromUnknown];
|
|
79
87
|
}
|
|
80
88
|
function fileEntryToViolation(cwd, file) {
|
|
81
|
-
const
|
|
82
|
-
return { ruleId, file: absolutize(cwd, file), line: 1, message: file };
|
|
89
|
+
const source = 'knip:files';
|
|
90
|
+
return { ruleId: knipSmell('files'), source, file: absolutize(cwd, file), line: 1, message: file };
|
|
83
91
|
}
|
|
84
92
|
function reportToViolations(report, cwd) {
|
|
85
93
|
const filesViolations = (report.files ?? []).map((f) => fileEntryToViolation(cwd, f));
|
|
@@ -97,7 +105,7 @@ function hasKnipConfig(cwd) {
|
|
|
97
105
|
async function runKnip(resolution, cwd, notices) {
|
|
98
106
|
const result = await spawnWrapped({ tool: 'knip', resolution, cwd, args: buildKnipArgs(resolution, cwd) });
|
|
99
107
|
if (isSpawnSkip(result))
|
|
100
|
-
return
|
|
108
|
+
return skipOutcome(result, notices);
|
|
101
109
|
const report = parseJsonStdout(result.stdout, '{');
|
|
102
110
|
if (report === null)
|
|
103
111
|
return emptyOutcome([...notices, exitFailureWarning(cwd, result.exitCode, result.stderr)]);
|