habit-hooks 0.2.0 → 1.0.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/README.md +17 -226
- package/bin/habit-hooks.js +32 -0
- package/package.json +11 -44
- package/LICENSE.md +0 -21
- package/dist/baseline/auto-prune.d.ts +0 -4
- package/dist/baseline/auto-prune.js +0 -38
- package/dist/baseline/auto-prune.js.map +0 -1
- package/dist/baseline/commands.d.ts +0 -12
- package/dist/baseline/commands.js +0 -125
- package/dist/baseline/commands.js.map +0 -1
- package/dist/baseline/file-hash.d.ts +0 -2
- package/dist/baseline/file-hash.js +0 -25
- package/dist/baseline/file-hash.js.map +0 -1
- package/dist/baseline/filter.d.ts +0 -9
- package/dist/baseline/filter.js +0 -18
- package/dist/baseline/filter.js.map +0 -1
- package/dist/baseline/reap.d.ts +0 -6
- package/dist/baseline/reap.js +0 -22
- package/dist/baseline/reap.js.map +0 -1
- package/dist/baseline/snooze-index.d.ts +0 -5
- package/dist/baseline/snooze-index.js +0 -65
- package/dist/baseline/snooze-index.js.map +0 -1
- package/dist/baseline/store.d.ts +0 -18
- package/dist/baseline/store.js +0 -106
- package/dist/baseline/store.js.map +0 -1
- package/dist/checks/comment-check.d.ts +0 -3
- package/dist/checks/comment-check.js +0 -85
- package/dist/checks/comment-check.js.map +0 -1
- package/dist/checks/eslint-wrap.d.ts +0 -2
- package/dist/checks/eslint-wrap.js +0 -107
- package/dist/checks/eslint-wrap.js.map +0 -1
- package/dist/checks/jscpd-wrap.d.ts +0 -9
- package/dist/checks/jscpd-wrap.js +0 -159
- package/dist/checks/jscpd-wrap.js.map +0 -1
- package/dist/checks/knip-resolve.d.ts +0 -4
- package/dist/checks/knip-resolve.js +0 -49
- package/dist/checks/knip-resolve.js.map +0 -1
- package/dist/checks/knip-schema.d.ts +0 -32
- package/dist/checks/knip-schema.js +0 -24
- package/dist/checks/knip-schema.js.map +0 -1
- package/dist/checks/knip-wrap.d.ts +0 -4
- package/dist/checks/knip-wrap.js +0 -135
- package/dist/checks/knip-wrap.js.map +0 -1
- package/dist/cli/baseline-commands.d.ts +0 -2
- package/dist/cli/baseline-commands.js +0 -61
- package/dist/cli/baseline-commands.js.map +0 -1
- package/dist/cli/emit.d.ts +0 -7
- package/dist/cli/emit.js +0 -8
- package/dist/cli/emit.js.map +0 -1
- package/dist/cli/init/apply-recommendations.d.ts +0 -3
- package/dist/cli/init/apply-recommendations.js +0 -76
- package/dist/cli/init/apply-recommendations.js.map +0 -1
- package/dist/cli/init/command-runner.d.ts +0 -6
- package/dist/cli/init/command-runner.js +0 -22
- package/dist/cli/init/command-runner.js.map +0 -1
- package/dist/cli/init/completion-report.d.ts +0 -11
- package/dist/cli/init/completion-report.js +0 -98
- package/dist/cli/init/completion-report.js.map +0 -1
- package/dist/cli/init/ctx.d.ts +0 -12
- package/dist/cli/init/ctx.js +0 -16
- package/dist/cli/init/ctx.js.map +0 -1
- package/dist/cli/init/detect.d.ts +0 -10
- package/dist/cli/init/detect.js +0 -69
- package/dist/cli/init/detect.js.map +0 -1
- package/dist/cli/init/git-hook.d.ts +0 -7
- package/dist/cli/init/git-hook.js +0 -52
- package/dist/cli/init/git-hook.js.map +0 -1
- package/dist/cli/init/install-commands.d.ts +0 -8
- package/dist/cli/init/install-commands.js +0 -82
- package/dist/cli/init/install-commands.js.map +0 -1
- package/dist/cli/init/package-scripts.d.ts +0 -6
- package/dist/cli/init/package-scripts.js +0 -55
- package/dist/cli/init/package-scripts.js.map +0 -1
- package/dist/cli/init/prompts.d.ts +0 -9
- package/dist/cli/init/prompts.js +0 -33
- package/dist/cli/init/prompts.js.map +0 -1
- package/dist/cli/init/recommendations.d.ts +0 -14
- package/dist/cli/init/recommendations.js +0 -66
- package/dist/cli/init/recommendations.js.map +0 -1
- package/dist/cli/init/report-language.d.ts +0 -1
- package/dist/cli/init/report-language.js +0 -12
- package/dist/cli/init/report-language.js.map +0 -1
- package/dist/cli/init/reporters.d.ts +0 -12
- package/dist/cli/init/reporters.js +0 -44
- package/dist/cli/init/reporters.js.map +0 -1
- package/dist/cli/init/run.d.ts +0 -17
- package/dist/cli/init/run.js +0 -123
- package/dist/cli/init/run.js.map +0 -1
- package/dist/cli/init/scaffold-baseline.d.ts +0 -4
- package/dist/cli/init/scaffold-baseline.js +0 -11
- package/dist/cli/init/scaffold-baseline.js.map +0 -1
- package/dist/cli/init/scaffold-config.d.ts +0 -20
- package/dist/cli/init/scaffold-config.js +0 -59
- package/dist/cli/init/scaffold-config.js.map +0 -1
- package/dist/cli/init/scaffold-eslint-config.d.ts +0 -2
- package/dist/cli/init/scaffold-eslint-config.js +0 -12
- package/dist/cli/init/scaffold-eslint-config.js.map +0 -1
- package/dist/cli/init/scaffold-jscpd-config.d.ts +0 -3
- package/dist/cli/init/scaffold-jscpd-config.js +0 -12
- package/dist/cli/init/scaffold-jscpd-config.js.map +0 -1
- package/dist/cli/init/scaffold-knip-config.d.ts +0 -2
- package/dist/cli/init/scaffold-knip-config.js +0 -12
- package/dist/cli/init/scaffold-knip-config.js.map +0 -1
- package/dist/cli/init/scaffold-ruff-config.d.ts +0 -2
- package/dist/cli/init/scaffold-ruff-config.js +0 -12
- package/dist/cli/init/scaffold-ruff-config.js.map +0 -1
- package/dist/cli/init/skill.d.ts +0 -8
- package/dist/cli/init/skill.js +0 -39
- package/dist/cli/init/skill.js.map +0 -1
- package/dist/cli/init/snippet.d.ts +0 -2
- package/dist/cli/init/snippet.js +0 -31
- package/dist/cli/init/snippet.js.map +0 -1
- package/dist/cli/init/templates/eslint-config.d.ts +0 -2
- package/dist/cli/init/templates/eslint-config.js +0 -45
- package/dist/cli/init/templates/eslint-config.js.map +0 -1
- package/dist/cli/init/templates/jscpd-config.d.ts +0 -3
- package/dist/cli/init/templates/jscpd-config.js +0 -17
- package/dist/cli/init/templates/jscpd-config.js.map +0 -1
- package/dist/cli/init/templates/knip-config.d.ts +0 -2
- package/dist/cli/init/templates/knip-config.js +0 -8
- package/dist/cli/init/templates/knip-config.js.map +0 -1
- package/dist/cli/init/templates/ruff-config.d.ts +0 -2
- package/dist/cli/init/templates/ruff-config.js +0 -16
- package/dist/cli/init/templates/ruff-config.js.map +0 -1
- package/dist/cli/init/tool-steps.d.ts +0 -2
- package/dist/cli/init/tool-steps.js +0 -78
- package/dist/cli/init/tool-steps.js.map +0 -1
- package/dist/cli/init-command.d.ts +0 -2
- package/dist/cli/init-command.js +0 -59
- package/dist/cli/init-command.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -101
- package/dist/cli.js.map +0 -1
- package/dist/config/catalogue-unused.d.ts +0 -2
- package/dist/config/catalogue-unused.js +0 -39
- package/dist/config/catalogue-unused.js.map +0 -1
- package/dist/config/catalogue.d.ts +0 -2
- package/dist/config/catalogue.js +0 -163
- package/dist/config/catalogue.js.map +0 -1
- package/dist/config/defaults.d.ts +0 -4
- package/dist/config/defaults.js +0 -12
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/jiti-loader.d.ts +0 -1
- package/dist/config/jiti-loader.js +0 -13
- package/dist/config/jiti-loader.js.map +0 -1
- package/dist/config/load.d.ts +0 -9
- package/dist/config/load.js +0 -54
- package/dist/config/load.js.map +0 -1
- package/dist/config/merge.d.ts +0 -3
- package/dist/config/merge.js +0 -91
- package/dist/config/merge.js.map +0 -1
- package/dist/config/schema.d.ts +0 -41
- package/dist/config/schema.js +0 -4
- package/dist/config/schema.js.map +0 -1
- package/dist/config/tool-smells.d.ts +0 -14
- package/dist/config/tool-smells.js +0 -69
- package/dist/config/tool-smells.js.map +0 -1
- package/dist/config/validate.d.ts +0 -2
- package/dist/config/validate.js +0 -159
- package/dist/config/validate.js.map +0 -1
- package/dist/detect/package-json.d.ts +0 -1
- package/dist/detect/package-json.js +0 -15
- package/dist/detect/package-json.js.map +0 -1
- package/dist/detect/path.d.ts +0 -1
- package/dist/detect/path.js +0 -14
- package/dist/detect/path.js.map +0 -1
- package/dist/detect/tool.d.ts +0 -10
- package/dist/detect/tool.js +0 -75
- package/dist/detect/tool.js.map +0 -1
- package/dist/discover.d.ts +0 -2
- package/dist/discover.js +0 -14
- package/dist/discover.js.map +0 -1
- package/dist/git/exec.d.ts +0 -8
- package/dist/git/exec.js +0 -48
- package/dist/git/exec.js.map +0 -1
- package/dist/git/resolve-scope.d.ts +0 -15
- package/dist/git/resolve-scope.js +0 -89
- package/dist/git/resolve-scope.js.map +0 -1
- package/dist/git/scope.d.ts +0 -7
- package/dist/git/scope.js +0 -58
- package/dist/git/scope.js.map +0 -1
- package/dist/guide/command.d.ts +0 -6
- package/dist/guide/command.js +0 -20
- package/dist/guide/command.js.map +0 -1
- package/dist/guide/guide.d.ts +0 -11
- package/dist/guide/guide.js +0 -82
- package/dist/guide/guide.js.map +0 -1
- package/dist/guide/render.d.ts +0 -3
- package/dist/guide/render.js +0 -14
- package/dist/guide/render.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/mapper/mapper.d.ts +0 -34
- package/dist/mapper/mapper.js +0 -80
- package/dist/mapper/mapper.js.map +0 -1
- package/dist/prompts/loader.d.ts +0 -6
- package/dist/prompts/loader.js +0 -27
- package/dist/prompts/loader.js.map +0 -1
- package/dist/prompts/packaged-dir.d.ts +0 -1
- package/dist/prompts/packaged-dir.js +0 -10
- package/dist/prompts/packaged-dir.js.map +0 -1
- package/dist/prompts/registry.d.ts +0 -3
- package/dist/prompts/registry.js +0 -43
- package/dist/prompts/registry.js.map +0 -1
- package/dist/rule-files.d.ts +0 -2
- package/dist/rule-files.js +0 -22
- package/dist/rule-files.js.map +0 -1
- package/dist/rules/registry.d.ts +0 -3
- package/dist/rules/registry.js +0 -37
- package/dist/rules/registry.js.map +0 -1
- package/dist/runner.d.ts +0 -15
- package/dist/runner.js +0 -141
- package/dist/runner.js.map +0 -1
- package/dist/sensors/adapter.d.ts +0 -17
- package/dist/sensors/adapter.js +0 -81
- package/dist/sensors/adapter.js.map +0 -1
- package/dist/sensors/deptry-sensor.d.ts +0 -3
- package/dist/sensors/deptry-sensor.js +0 -43
- package/dist/sensors/deptry-sensor.js.map +0 -1
- package/dist/sensors/line-count-sensor.d.ts +0 -3
- package/dist/sensors/line-count-sensor.js +0 -50
- package/dist/sensors/line-count-sensor.js.map +0 -1
- package/dist/sensors/needs-extraction.d.ts +0 -3
- package/dist/sensors/needs-extraction.js +0 -57
- package/dist/sensors/needs-extraction.js.map +0 -1
- package/dist/sensors/preset.d.ts +0 -17
- package/dist/sensors/preset.js +0 -57
- package/dist/sensors/preset.js.map +0 -1
- package/dist/sensors/python-preset.d.ts +0 -7
- package/dist/sensors/python-preset.js +0 -34
- package/dist/sensors/python-preset.js.map +0 -1
- package/dist/sensors/runner.d.ts +0 -12
- package/dist/sensors/runner.js +0 -94
- package/dist/sensors/runner.js.map +0 -1
- package/dist/sensors/types.d.ts +0 -15
- package/dist/sensors/types.js +0 -5
- package/dist/sensors/types.js.map +0 -1
- package/dist/types.d.ts +0 -44
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/wrap/notices.d.ts +0 -19
- package/dist/wrap/notices.js +0 -38
- package/dist/wrap/notices.js.map +0 -1
- package/dist/wrap/resolve.d.ts +0 -5
- package/dist/wrap/resolve.js +0 -9
- package/dist/wrap/resolve.js.map +0 -1
- package/dist/wrap/run.d.ts +0 -17
- package/dist/wrap/run.js +0 -31
- package/dist/wrap/run.js.map +0 -1
- package/dist/wrap/shell.d.ts +0 -15
- package/dist/wrap/shell.js +0 -50
- package/dist/wrap/shell.js.map +0 -1
- package/src/prompts/deep-nesting.md +0 -13
- package/src/prompts/duplicated-code.md +0 -9
- package/src/prompts/high-complexity.md +0 -9
- package/src/prompts/needs-extraction.md +0 -9
- package/src/prompts/non-essential-comment.md +0 -7
- package/src/prompts/non-null-assertion.md +0 -10
- package/src/prompts/oversized-file.md +0 -9
- package/src/prompts/oversized-function.issues.njk +0 -5
- package/src/prompts/oversized-function.md +0 -9
- package/src/prompts/parse-error.md +0 -5
- package/src/prompts/too-many-parameters.md +0 -9
- package/src/prompts/uncoached.md +0 -4
- package/src/skills/habit-hooks-prompting/SKILL.md +0 -37
- package/src/skills/habit-hooks-review/SKILL.md +0 -108
package/dist/baseline/reap.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,65 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snooze-index.js","sourceRoot":"","sources":["../../src/baseline/snooze-index.ts"],"names":[],"mappings":"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"}
|
package/dist/baseline/store.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export declare const BASELINE_FILENAME = ".habit-hooks-baseline.json";
|
|
2
|
-
export declare const BASELINE_VERSION = 2;
|
|
3
|
-
export interface BaselineEntry {
|
|
4
|
-
snoozedAtCommit: string;
|
|
5
|
-
}
|
|
6
|
-
export interface BaselineFile {
|
|
7
|
-
version: 2;
|
|
8
|
-
files: Record<string, BaselineEntry>;
|
|
9
|
-
}
|
|
10
|
-
export declare class BaselineVersionError extends Error {
|
|
11
|
-
constructor(version: number);
|
|
12
|
-
}
|
|
13
|
-
export declare class BaselineParseError extends Error {
|
|
14
|
-
constructor(message: string);
|
|
15
|
-
}
|
|
16
|
-
export declare function loadBaseline(cwd: string): BaselineFile;
|
|
17
|
-
export declare function saveBaseline(cwd: string, baseline: BaselineFile): void;
|
|
18
|
-
export declare function baselineExists(cwd: string): boolean;
|
package/dist/baseline/store.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
export const BASELINE_FILENAME = '.habit-hooks-baseline.json';
|
|
4
|
-
export const BASELINE_VERSION = 2;
|
|
5
|
-
const LEGACY_BASELINE_VERSION = 1;
|
|
6
|
-
export class BaselineVersionError extends Error {
|
|
7
|
-
constructor(version) {
|
|
8
|
-
super(`unsupported baseline version ${String(version)}; expected 1 or 2`);
|
|
9
|
-
this.name = 'BaselineVersionError';
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export class BaselineParseError extends Error {
|
|
13
|
-
constructor(message) {
|
|
14
|
-
super(`failed to parse baseline: ${message}`);
|
|
15
|
-
this.name = 'BaselineParseError';
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
function baselinePath(cwd) {
|
|
19
|
-
return join(cwd, BASELINE_FILENAME);
|
|
20
|
-
}
|
|
21
|
-
function emptyBaseline() {
|
|
22
|
-
return { version: BASELINE_VERSION, files: {} };
|
|
23
|
-
}
|
|
24
|
-
function parseRaw(raw) {
|
|
25
|
-
try {
|
|
26
|
-
return JSON.parse(raw);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
-
throw new BaselineParseError(message);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function isPlainObject(value) {
|
|
34
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
35
|
-
}
|
|
36
|
-
function validateHashField(value, key, field) {
|
|
37
|
-
const hash = value[field];
|
|
38
|
-
if (typeof hash !== 'string' || hash.length === 0) {
|
|
39
|
-
throw new BaselineParseError(`entry for '${key}' is missing '${field}' string`);
|
|
40
|
-
}
|
|
41
|
-
return hash;
|
|
42
|
-
}
|
|
43
|
-
function validateEntry(value, key, field) {
|
|
44
|
-
if (!isPlainObject(value)) {
|
|
45
|
-
throw new BaselineParseError(`entry for '${key}' must be an object`);
|
|
46
|
-
}
|
|
47
|
-
return { snoozedAtCommit: validateHashField(value, key, field) };
|
|
48
|
-
}
|
|
49
|
-
function mapEntries(value, field) {
|
|
50
|
-
const out = {};
|
|
51
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
52
|
-
out[key] = validateEntry(entry, key, field);
|
|
53
|
-
}
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
function validateFiles(value, field) {
|
|
57
|
-
if (!isPlainObject(value))
|
|
58
|
-
throw new BaselineParseError(`'files' must be an object`);
|
|
59
|
-
return mapEntries(value, field);
|
|
60
|
-
}
|
|
61
|
-
function validateVersion(value) {
|
|
62
|
-
if (typeof value !== 'number') {
|
|
63
|
-
throw new BaselineParseError(`'version' must be a number`);
|
|
64
|
-
}
|
|
65
|
-
if (value !== BASELINE_VERSION && value !== LEGACY_BASELINE_VERSION) {
|
|
66
|
-
throw new BaselineVersionError(value);
|
|
67
|
-
}
|
|
68
|
-
return value;
|
|
69
|
-
}
|
|
70
|
-
function fieldForVersion(version) {
|
|
71
|
-
return version === LEGACY_BASELINE_VERSION ? 'snoozedAt' : 'snoozedAtCommit';
|
|
72
|
-
}
|
|
73
|
-
function validateBaseline(value) {
|
|
74
|
-
if (!isPlainObject(value)) {
|
|
75
|
-
throw new BaselineParseError(`root must be an object`);
|
|
76
|
-
}
|
|
77
|
-
const version = validateVersion(value.version);
|
|
78
|
-
const files = validateFiles(value.files, fieldForVersion(version));
|
|
79
|
-
return { version: BASELINE_VERSION, files };
|
|
80
|
-
}
|
|
81
|
-
export function loadBaseline(cwd) {
|
|
82
|
-
const path = baselinePath(cwd);
|
|
83
|
-
if (!existsSync(path))
|
|
84
|
-
return emptyBaseline();
|
|
85
|
-
const raw = readFileSync(path, 'utf8');
|
|
86
|
-
return validateBaseline(parseRaw(raw));
|
|
87
|
-
}
|
|
88
|
-
function sortedEntries(files) {
|
|
89
|
-
const sorted = {};
|
|
90
|
-
for (const key of Object.keys(files).sort()) {
|
|
91
|
-
sorted[key] = files[key];
|
|
92
|
-
}
|
|
93
|
-
return sorted;
|
|
94
|
-
}
|
|
95
|
-
export function saveBaseline(cwd, baseline) {
|
|
96
|
-
const ordered = {
|
|
97
|
-
version: BASELINE_VERSION,
|
|
98
|
-
files: sortedEntries(baseline.files),
|
|
99
|
-
};
|
|
100
|
-
const serialized = `${JSON.stringify(ordered, null, 2)}\n`;
|
|
101
|
-
writeFileSync(baselinePath(cwd), serialized);
|
|
102
|
-
}
|
|
103
|
-
export function baselineExists(cwd) {
|
|
104
|
-
return existsSync(baselinePath(cwd));
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/baseline/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { Project, SyntaxKind } from 'ts-morph';
|
|
2
|
-
import { COMMENT_SMELL } from '../config/tool-smells.js';
|
|
3
|
-
export const DEFAULT_COMMENT_CHECK_THRESHOLDS = {
|
|
4
|
-
maxSingleLineChars: 10,
|
|
5
|
-
maxBlockChars: 15,
|
|
6
|
-
};
|
|
7
|
-
function isExcludedComment(text) {
|
|
8
|
-
return text.includes('eslint-disable');
|
|
9
|
-
}
|
|
10
|
-
function isReportableSingle(text, thresholds) {
|
|
11
|
-
if (!text.startsWith('//'))
|
|
12
|
-
return false;
|
|
13
|
-
if (isExcludedComment(text))
|
|
14
|
-
return false;
|
|
15
|
-
return text.length >= thresholds.maxSingleLineChars;
|
|
16
|
-
}
|
|
17
|
-
function isReportableBlock(text, thresholds) {
|
|
18
|
-
if (!text.startsWith('/*'))
|
|
19
|
-
return false;
|
|
20
|
-
if (isExcludedComment(text))
|
|
21
|
-
return false;
|
|
22
|
-
return text.length >= thresholds.maxBlockChars;
|
|
23
|
-
}
|
|
24
|
-
function truncate(text) {
|
|
25
|
-
const collapsed = text.replace(/\s+/g, ' ').trim();
|
|
26
|
-
return collapsed.length > 50 ? `${collapsed.substring(0, 50)}...` : collapsed;
|
|
27
|
-
}
|
|
28
|
-
function makeViolation(file, comment, kind) {
|
|
29
|
-
return {
|
|
30
|
-
ruleId: COMMENT_SMELL,
|
|
31
|
-
source: 'comment:non-essential',
|
|
32
|
-
file,
|
|
33
|
-
line: comment.getStartLineNumber(),
|
|
34
|
-
message: `${kind}-line comment: "${truncate(comment.getText())}"`,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function classifyBlock(text) {
|
|
38
|
-
return text.startsWith('/**') ? 'JSDoc' : 'block';
|
|
39
|
-
}
|
|
40
|
-
function collectSingles(source, file, thresholds) {
|
|
41
|
-
return source
|
|
42
|
-
.getDescendantsOfKind(SyntaxKind.SingleLineCommentTrivia)
|
|
43
|
-
.filter((c) => isReportableSingle(c.getText().trim(), thresholds))
|
|
44
|
-
.map((c) => makeViolation(file, c, 'single'));
|
|
45
|
-
}
|
|
46
|
-
function collectBlocks(source, file, thresholds) {
|
|
47
|
-
return source
|
|
48
|
-
.getDescendantsOfKind(SyntaxKind.MultiLineCommentTrivia)
|
|
49
|
-
.filter((c) => isReportableBlock(c.getText().trim(), thresholds))
|
|
50
|
-
.map((c) => makeViolation(file, c, classifyBlock(c.getText().trim())));
|
|
51
|
-
}
|
|
52
|
-
function collectJsDoc(source, file, thresholds) {
|
|
53
|
-
return source
|
|
54
|
-
.getDescendantsOfKind(SyntaxKind.JSDoc)
|
|
55
|
-
.filter((c) => isReportableBlock(c.getText().trim(), thresholds))
|
|
56
|
-
.map((c) => makeViolation(file, c, 'JSDoc'));
|
|
57
|
-
}
|
|
58
|
-
function findCommentsInFile(source, thresholds) {
|
|
59
|
-
const file = source.getFilePath();
|
|
60
|
-
return [
|
|
61
|
-
...collectSingles(source, file, thresholds),
|
|
62
|
-
...collectBlocks(source, file, thresholds),
|
|
63
|
-
...collectJsDoc(source, file, thresholds),
|
|
64
|
-
];
|
|
65
|
-
}
|
|
66
|
-
function buildProject(files) {
|
|
67
|
-
const project = new Project({ skipAddingFilesFromTsConfig: true });
|
|
68
|
-
project.addSourceFilesAtPaths(files);
|
|
69
|
-
return project;
|
|
70
|
-
}
|
|
71
|
-
function resolveThresholds(rules) {
|
|
72
|
-
const rule = rules.find((r) => r.id === COMMENT_SMELL);
|
|
73
|
-
return rule?.commentCheck ?? DEFAULT_COMMENT_CHECK_THRESHOLDS;
|
|
74
|
-
}
|
|
75
|
-
export const commentCheck = {
|
|
76
|
-
id: 'comment',
|
|
77
|
-
async run(files, rules) {
|
|
78
|
-
if (files.length === 0)
|
|
79
|
-
return [];
|
|
80
|
-
const thresholds = resolveThresholds(rules);
|
|
81
|
-
const project = buildProject(files);
|
|
82
|
-
return project.getSourceFiles().flatMap((s) => findCommentsInFile(s, thresholds));
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
//# sourceMappingURL=comment-check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comment-check.js","sourceRoot":"","sources":["../../src/checks/comment-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
3
|
-
import { runTool } from '../wrap/shell.js';
|
|
4
|
-
import { detectTool } from '../detect/tool.js';
|
|
5
|
-
import { lookupPrompt } from '../prompts/registry.js';
|
|
6
|
-
import { emptyOutcome, firstLine, isSpawnFailure, noticesFor, spawnFailureOutcome, spawnFailureWarning, } from '../wrap/notices.js';
|
|
7
|
-
import { spawnTarget } from '../wrap/resolve.js';
|
|
8
|
-
import { ESLINT_SMELL_MAP, PARSE_ERROR_SMELL } from '../config/tool-smells.js';
|
|
9
|
-
import { parseJsonStdout } from '../wrap/run.js';
|
|
10
|
-
const require = createRequire(import.meta.url);
|
|
11
|
-
function bundledEslintBin() {
|
|
12
|
-
const main = require.resolve('eslint');
|
|
13
|
-
return join(dirname(main), '..', 'bin', 'eslint.js');
|
|
14
|
-
}
|
|
15
|
-
function resolveEslintBin(cwd) {
|
|
16
|
-
const detected = detectTool(cwd, 'eslint');
|
|
17
|
-
if (detected !== null)
|
|
18
|
-
return { binPath: detected.binPath, isFallback: false };
|
|
19
|
-
return { binPath: bundledEslintBin(), isFallback: true };
|
|
20
|
-
}
|
|
21
|
-
function configWarning(cwd, detail) {
|
|
22
|
-
const suffix = detail.length > 0 ? `: ${detail}` : '';
|
|
23
|
-
return `habit-hooks: eslint skipped in ${cwd} (config error)${suffix}`;
|
|
24
|
-
}
|
|
25
|
-
function tryParseJson(stdout) {
|
|
26
|
-
return parseJsonStdout(stdout, '[');
|
|
27
|
-
}
|
|
28
|
-
function isConfigError(result, parsed) {
|
|
29
|
-
if (parsed !== null)
|
|
30
|
-
return false;
|
|
31
|
-
if (isSpawnFailure(result))
|
|
32
|
-
return false;
|
|
33
|
-
return result.exitCode !== 0 && result.exitCode !== 1;
|
|
34
|
-
}
|
|
35
|
-
function messageToViolation(filePath, m) {
|
|
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 };
|
|
41
|
-
}
|
|
42
|
-
function fatalToViolation(filePath, m) {
|
|
43
|
-
return {
|
|
44
|
-
ruleId: PARSE_ERROR_SMELL,
|
|
45
|
-
source: 'eslint:fatal',
|
|
46
|
-
file: filePath,
|
|
47
|
-
line: m.line,
|
|
48
|
-
column: m.column,
|
|
49
|
-
message: `Fatal parse/config error: ${m.message}`,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function isFatalMessage(m) {
|
|
53
|
-
if (m.ruleId !== null)
|
|
54
|
-
return false;
|
|
55
|
-
if (m.fatal === true)
|
|
56
|
-
return true;
|
|
57
|
-
return m.severity === 2;
|
|
58
|
-
}
|
|
59
|
-
function toViolation(filePath, m) {
|
|
60
|
-
if (isFatalMessage(m))
|
|
61
|
-
return fatalToViolation(filePath, m);
|
|
62
|
-
if (m.ruleId === null)
|
|
63
|
-
return null;
|
|
64
|
-
return messageToViolation(filePath, { ...m, ruleId: m.ruleId });
|
|
65
|
-
}
|
|
66
|
-
function fileResultToViolations(result) {
|
|
67
|
-
return result.messages
|
|
68
|
-
.map((m) => toViolation(result.filePath, m))
|
|
69
|
-
.filter((v) => v !== null);
|
|
70
|
-
}
|
|
71
|
-
function parseEslintJson(stdout) {
|
|
72
|
-
const parsed = tryParseJson(stdout);
|
|
73
|
-
if (parsed === null)
|
|
74
|
-
return [];
|
|
75
|
-
return parsed.flatMap(fileResultToViolations);
|
|
76
|
-
}
|
|
77
|
-
function buildArgs(files) {
|
|
78
|
-
return ['--format', 'json', ...files];
|
|
79
|
-
}
|
|
80
|
-
async function executeEslint(resolution, cwd, files) {
|
|
81
|
-
const target = spawnTarget(resolution.binPath, buildArgs(files));
|
|
82
|
-
return runTool({ bin: target.bin, args: target.args, cwd });
|
|
83
|
-
}
|
|
84
|
-
function failureNotices(cwd, result) {
|
|
85
|
-
const detail = firstLine(result.stderr.length > 0 ? result.stderr : result.stdout);
|
|
86
|
-
return [configWarning(cwd, detail)];
|
|
87
|
-
}
|
|
88
|
-
async function runEslint(resolution, cwd, files) {
|
|
89
|
-
const notices = noticesFor('eslint', resolution, cwd);
|
|
90
|
-
const result = await executeEslint(resolution, cwd, files);
|
|
91
|
-
const parsed = tryParseJson(result.stdout);
|
|
92
|
-
if (isSpawnFailure(result))
|
|
93
|
-
return spawnFailureOutcome(notices, spawnFailureWarning('eslint', cwd, result.warnings));
|
|
94
|
-
if (isConfigError(result, parsed))
|
|
95
|
-
return emptyOutcome([...notices, ...failureNotices(cwd, result)]);
|
|
96
|
-
return { violations: parseEslintJson(result.stdout), stderr: notices };
|
|
97
|
-
}
|
|
98
|
-
export const eslintWrap = {
|
|
99
|
-
id: 'eslint',
|
|
100
|
-
async run(files, _rules, cwd) {
|
|
101
|
-
const runCwd = cwd ?? process.cwd();
|
|
102
|
-
if (files.length === 0)
|
|
103
|
-
return { violations: [], stderr: [] };
|
|
104
|
-
return runEslint(resolveEslintBin(runCwd), runCwd, files);
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
//# sourceMappingURL=eslint-wrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-wrap.js","sourceRoot":"","sources":["../../src/checks/eslint-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { type BinResolution } from '../wrap/notices.js';
|
|
2
|
-
import type { Check, CheckOutcome } from '../types.js';
|
|
3
|
-
export declare function tryBundledJscpdBin(resolver?: () => string): string | null;
|
|
4
|
-
export declare function resolveJscpdBin(cwd: string, fallbackResolver?: () => string): BinResolution | null;
|
|
5
|
-
export declare function runJscpdWrap(files: string[], cwd: string, { resolution, tmpRoot }: {
|
|
6
|
-
resolution: BinResolution | null;
|
|
7
|
-
tmpRoot?: string;
|
|
8
|
-
}): Promise<CheckOutcome>;
|
|
9
|
-
export declare const jscpdWrap: Check;
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
|
-
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { dirname, join } from 'node:path';
|
|
5
|
-
import { detectTool } from '../detect/tool.js';
|
|
6
|
-
import { hasPackageJsonKey } from '../detect/package-json.js';
|
|
7
|
-
import { absolutize, emptyOutcome, firstLine, noticesFor } from '../wrap/notices.js';
|
|
8
|
-
import { isSpawnSkip, skipOutcome, spawnWrapped } from '../wrap/run.js';
|
|
9
|
-
import { JSCPD_SMELL } from '../config/tool-smells.js';
|
|
10
|
-
const require = createRequire(import.meta.url);
|
|
11
|
-
const REPORT_FILENAME = 'jscpd-report.json';
|
|
12
|
-
const JSCPD_CONFIG_FILES = ['.jscpd.json', 'jscpd.json'];
|
|
13
|
-
function findPackageRoot(start) {
|
|
14
|
-
let dir = start;
|
|
15
|
-
while (dir !== dirname(dir)) {
|
|
16
|
-
if (existsSync(join(dir, 'package.json')))
|
|
17
|
-
return dir;
|
|
18
|
-
dir = dirname(dir);
|
|
19
|
-
}
|
|
20
|
-
throw new Error(`Could not find package.json from ${start}`);
|
|
21
|
-
}
|
|
22
|
-
function bundledJscpdBin() {
|
|
23
|
-
const main = require.resolve('jscpd');
|
|
24
|
-
const pkgRoot = findPackageRoot(dirname(main));
|
|
25
|
-
const pkg = JSON.parse(readFileSync(join(pkgRoot, 'package.json'), 'utf8'));
|
|
26
|
-
const binRel = typeof pkg.bin === 'string' ? pkg.bin : pkg.bin?.jscpd ?? 'bin/jscpd';
|
|
27
|
-
return join(pkgRoot, binRel);
|
|
28
|
-
}
|
|
29
|
-
export function tryBundledJscpdBin(resolver = bundledJscpdBin) {
|
|
30
|
-
try {
|
|
31
|
-
return resolver();
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export function resolveJscpdBin(cwd, fallbackResolver = bundledJscpdBin) {
|
|
38
|
-
const detected = detectTool(cwd, 'jscpd');
|
|
39
|
-
if (detected !== null)
|
|
40
|
-
return { binPath: detected.binPath, isFallback: false };
|
|
41
|
-
const fallback = tryBundledJscpdBin(fallbackResolver);
|
|
42
|
-
if (fallback === null)
|
|
43
|
-
return null;
|
|
44
|
-
return { binPath: fallback, isFallback: true };
|
|
45
|
-
}
|
|
46
|
-
function reportMissingWarning(cwd, code, stderr) {
|
|
47
|
-
const detail = firstLine(stderr);
|
|
48
|
-
const suffix = detail.length > 0 ? `: ${detail}` : '';
|
|
49
|
-
return `habit-hooks: jscpd skipped in ${cwd} (exit ${code}, no report)${suffix}`;
|
|
50
|
-
}
|
|
51
|
-
function parseFailureWarning(cwd) {
|
|
52
|
-
return `habit-hooks: jscpd skipped in ${cwd} (unparseable report)`;
|
|
53
|
-
}
|
|
54
|
-
function unresolvedBinWarning(cwd) {
|
|
55
|
-
return `habit-hooks: jscpd skipped in ${cwd} (could not locate bundled bin)`;
|
|
56
|
-
}
|
|
57
|
-
function locationDescription(loc, cwd) {
|
|
58
|
-
return `${absolutize(cwd, loc.name)}:${loc.startLoc.line}-${loc.endLoc.line}`;
|
|
59
|
-
}
|
|
60
|
-
function buildViolation(self, partner, cwd) {
|
|
61
|
-
return {
|
|
62
|
-
ruleId: JSCPD_SMELL,
|
|
63
|
-
source: 'jscpd:duplication',
|
|
64
|
-
file: absolutize(cwd, self.name),
|
|
65
|
-
line: self.startLoc.line,
|
|
66
|
-
column: self.startLoc.column,
|
|
67
|
-
message: `duplicates ${locationDescription(partner, cwd)}`,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
function isInScope(loc, scope, cwd) {
|
|
71
|
-
return scope.has(absolutize(cwd, loc.name));
|
|
72
|
-
}
|
|
73
|
-
function cloneToViolations(clone, scope, cwd) {
|
|
74
|
-
const violations = [];
|
|
75
|
-
if (isInScope(clone.firstFile, scope, cwd)) {
|
|
76
|
-
violations.push(buildViolation(clone.firstFile, clone.secondFile, cwd));
|
|
77
|
-
}
|
|
78
|
-
if (isInScope(clone.secondFile, scope, cwd)) {
|
|
79
|
-
violations.push(buildViolation(clone.secondFile, clone.firstFile, cwd));
|
|
80
|
-
}
|
|
81
|
-
return violations;
|
|
82
|
-
}
|
|
83
|
-
function reportToViolations(report, scope, cwd) {
|
|
84
|
-
return (report.duplicates ?? []).flatMap((c) => cloneToViolations(c, scope, cwd));
|
|
85
|
-
}
|
|
86
|
-
function tryReadReport(reportDir) {
|
|
87
|
-
const path = join(reportDir, REPORT_FILENAME);
|
|
88
|
-
if (!existsSync(path))
|
|
89
|
-
return null;
|
|
90
|
-
try {
|
|
91
|
-
return JSON.parse(readFileSync(path, 'utf8'));
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function buildArgs(reportDir) {
|
|
98
|
-
return ['-r', 'json', '-o', reportDir, '--silent', '--noTips', '-n', '.'];
|
|
99
|
-
}
|
|
100
|
-
function makeReportDir(tmpRoot = tmpdir()) {
|
|
101
|
-
return mkdtempSync(join(tmpRoot, 'hh-jscpd-'));
|
|
102
|
-
}
|
|
103
|
-
function removeReportDir(reportDir) {
|
|
104
|
-
rmSync(reportDir, { recursive: true, force: true });
|
|
105
|
-
}
|
|
106
|
-
function missingReportOutcome(inputs, result) {
|
|
107
|
-
if (result.exitCode !== 0) {
|
|
108
|
-
return emptyOutcome([...inputs.notices, reportMissingWarning(inputs.cwd, result.exitCode, result.stderr)]);
|
|
109
|
-
}
|
|
110
|
-
return emptyOutcome([...inputs.notices, parseFailureWarning(inputs.cwd)]);
|
|
111
|
-
}
|
|
112
|
-
async function runOnce(inputs, reportDir) {
|
|
113
|
-
const { resolution, cwd } = inputs;
|
|
114
|
-
const result = await spawnWrapped({ tool: 'jscpd', resolution, cwd, args: buildArgs(reportDir) });
|
|
115
|
-
if (isSpawnSkip(result))
|
|
116
|
-
return skipOutcome(result, inputs.notices);
|
|
117
|
-
const report = tryReadReport(reportDir);
|
|
118
|
-
if (report === null)
|
|
119
|
-
return missingReportOutcome(inputs, result);
|
|
120
|
-
return { violations: reportToViolations(report, inputs.scope, inputs.cwd), stderr: inputs.notices };
|
|
121
|
-
}
|
|
122
|
-
async function runJscpd(inputs, tmpRoot) {
|
|
123
|
-
const reportDir = makeReportDir(tmpRoot);
|
|
124
|
-
try {
|
|
125
|
-
return await runOnce(inputs, reportDir);
|
|
126
|
-
}
|
|
127
|
-
finally {
|
|
128
|
-
removeReportDir(reportDir);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
function hasJscpdConfig(cwd) {
|
|
132
|
-
if (JSCPD_CONFIG_FILES.some((name) => existsSync(join(cwd, name))))
|
|
133
|
-
return true;
|
|
134
|
-
return hasPackageJsonKey(cwd, 'jscpd');
|
|
135
|
-
}
|
|
136
|
-
function noConfigOutcome(cwd, notices) {
|
|
137
|
-
return emptyOutcome([...notices, `habit-hooks: jscpd skipped in ${cwd} (no jscpd config)`]);
|
|
138
|
-
}
|
|
139
|
-
function noBinOutcome(cwd) {
|
|
140
|
-
return emptyOutcome([unresolvedBinWarning(cwd)]);
|
|
141
|
-
}
|
|
142
|
-
export async function runJscpdWrap(files, cwd, { resolution, tmpRoot }) {
|
|
143
|
-
if (files.length === 0)
|
|
144
|
-
return { violations: [], stderr: [] };
|
|
145
|
-
if (resolution === null)
|
|
146
|
-
return noBinOutcome(cwd);
|
|
147
|
-
const notices = noticesFor('jscpd', resolution, cwd);
|
|
148
|
-
if (!hasJscpdConfig(cwd))
|
|
149
|
-
return noConfigOutcome(cwd, notices);
|
|
150
|
-
return runJscpd({ resolution, cwd, scope: new Set(files), notices }, tmpRoot);
|
|
151
|
-
}
|
|
152
|
-
export const jscpdWrap = {
|
|
153
|
-
id: 'jscpd',
|
|
154
|
-
async run(files, _rules, cwd) {
|
|
155
|
-
const runCwd = cwd ?? process.cwd();
|
|
156
|
-
return runJscpdWrap(files, runCwd, { resolution: resolveJscpdBin(runCwd) });
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
//# sourceMappingURL=jscpd-wrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jscpd-wrap.js","sourceRoot":"","sources":["../../src/checks/jscpd-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type BinResolution } from '../wrap/notices.js';
|
|
2
|
-
export declare function resolveKnipBin(cwd: string): BinResolution;
|
|
3
|
-
export declare function consumerKnipMajor(cwd: string): number | null;
|
|
4
|
-
export declare function buildKnipArgs(resolution: BinResolution, cwd: string): string[];
|