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
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
3
|
-
import { dirname, join } from 'node:path';
|
|
4
|
-
import { detectTool } from '../detect/tool.js';
|
|
5
|
-
const require = createRequire(import.meta.url);
|
|
6
|
-
const KNIP_BASE_ARGS = ['--reporter', 'json', '--no-exit-code'];
|
|
7
|
-
function bundledKnipDir() {
|
|
8
|
-
const main = require.resolve('knip');
|
|
9
|
-
return join(dirname(main), '..');
|
|
10
|
-
}
|
|
11
|
-
function bundledKnipBin() {
|
|
12
|
-
return join(bundledKnipDir(), 'bin', 'knip.js');
|
|
13
|
-
}
|
|
14
|
-
export function resolveKnipBin(cwd) {
|
|
15
|
-
const detected = detectTool(cwd, 'knip');
|
|
16
|
-
if (detected !== null)
|
|
17
|
-
return { binPath: detected.binPath, isFallback: false };
|
|
18
|
-
return { binPath: bundledKnipBin(), isFallback: true };
|
|
19
|
-
}
|
|
20
|
-
function readMajorFromPackageJson(path) {
|
|
21
|
-
try {
|
|
22
|
-
const pkg = JSON.parse(readFileSync(path, 'utf8'));
|
|
23
|
-
if (typeof pkg.version !== 'string')
|
|
24
|
-
return null;
|
|
25
|
-
const major = Number.parseInt(pkg.version.split('.')[0] ?? '', 10);
|
|
26
|
-
return Number.isFinite(major) ? major : null;
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function consumerKnipMajor(cwd) {
|
|
33
|
-
return readMajorFromPackageJson(join(cwd, 'node_modules', 'knip', 'package.json'));
|
|
34
|
-
}
|
|
35
|
-
function bundledKnipMajor() {
|
|
36
|
-
return readMajorFromPackageJson(join(bundledKnipDir(), 'package.json'));
|
|
37
|
-
}
|
|
38
|
-
function effectiveKnipMajor(resolution, cwd) {
|
|
39
|
-
if (resolution.isFallback)
|
|
40
|
-
return bundledKnipMajor();
|
|
41
|
-
return consumerKnipMajor(cwd);
|
|
42
|
-
}
|
|
43
|
-
export function buildKnipArgs(resolution, cwd) {
|
|
44
|
-
const major = effectiveKnipMajor(resolution, cwd);
|
|
45
|
-
if (major !== null && major >= 6)
|
|
46
|
-
return [...KNIP_BASE_ARGS];
|
|
47
|
-
return [...KNIP_BASE_ARGS, '--include', 'classMembers'];
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=knip-resolve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"knip-resolve.js","sourceRoot":"","sources":["../../src/checks/knip-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAEhE,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA0B,CAAC;QAC5E,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,wBAAwB,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAyB,EAAE,GAAW;IAChE,IAAI,UAAU,CAAC,UAAU;QAAE,OAAO,gBAAgB,EAAE,CAAC;IACrD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAyB,EAAE,GAAW;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,cAAc,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export interface KnipLocation {
|
|
2
|
-
name: string;
|
|
3
|
-
line?: number;
|
|
4
|
-
col?: number;
|
|
5
|
-
}
|
|
6
|
-
export type KnipMemberMap = Record<string, KnipLocation[]>;
|
|
7
|
-
export interface KnipIssue {
|
|
8
|
-
file: string;
|
|
9
|
-
files?: KnipLocation[];
|
|
10
|
-
dependencies?: KnipLocation[];
|
|
11
|
-
devDependencies?: KnipLocation[];
|
|
12
|
-
optionalPeerDependencies?: KnipLocation[];
|
|
13
|
-
unlisted?: KnipLocation[];
|
|
14
|
-
binaries?: KnipLocation[];
|
|
15
|
-
unresolved?: KnipLocation[];
|
|
16
|
-
exports?: KnipLocation[];
|
|
17
|
-
nsExports?: KnipLocation[];
|
|
18
|
-
types?: KnipLocation[];
|
|
19
|
-
nsTypes?: KnipLocation[];
|
|
20
|
-
duplicates?: KnipLocation[][];
|
|
21
|
-
enumMembers?: KnipMemberMap;
|
|
22
|
-
classMembers?: KnipMemberMap;
|
|
23
|
-
namespaceMembers?: KnipMemberMap;
|
|
24
|
-
catalog?: KnipLocation[];
|
|
25
|
-
}
|
|
26
|
-
export interface KnipReport {
|
|
27
|
-
files?: string[];
|
|
28
|
-
issues?: KnipIssue[];
|
|
29
|
-
}
|
|
30
|
-
export declare const LOCATION_KEYS: (keyof KnipIssue)[];
|
|
31
|
-
export declare const MEMBER_KEYS: (keyof KnipIssue)[];
|
|
32
|
-
export declare const KNOWN_KEYS: Set<string>;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export const LOCATION_KEYS = [
|
|
2
|
-
'files',
|
|
3
|
-
'dependencies',
|
|
4
|
-
'devDependencies',
|
|
5
|
-
'optionalPeerDependencies',
|
|
6
|
-
'unlisted',
|
|
7
|
-
'binaries',
|
|
8
|
-
'unresolved',
|
|
9
|
-
'exports',
|
|
10
|
-
'nsExports',
|
|
11
|
-
'types',
|
|
12
|
-
'nsTypes',
|
|
13
|
-
'catalog',
|
|
14
|
-
];
|
|
15
|
-
export const MEMBER_KEYS = ['enumMembers', 'classMembers', 'namespaceMembers'];
|
|
16
|
-
const STRUCTURAL_KEYS = new Set(['file']);
|
|
17
|
-
const SPECIAL_KEYS = new Set(['duplicates']);
|
|
18
|
-
export const KNOWN_KEYS = new Set([
|
|
19
|
-
...STRUCTURAL_KEYS,
|
|
20
|
-
...SPECIAL_KEYS,
|
|
21
|
-
...LOCATION_KEYS,
|
|
22
|
-
...MEMBER_KEYS,
|
|
23
|
-
]);
|
|
24
|
-
//# sourceMappingURL=knip-schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"knip-schema.js","sourceRoot":"","sources":["../../src/checks/knip-schema.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,OAAO;IACP,cAAc;IACd,iBAAiB;IACjB,0BAA0B;IAC1B,UAAU;IACV,UAAU;IACV,YAAY;IACZ,SAAS;IACT,WAAW;IACX,OAAO;IACP,SAAS;IACT,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAwB,CAAC,aAAa,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAEpG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,YAAY,CAAC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;IACxC,GAAG,eAAe;IAClB,GAAG,YAAY;IACf,GAAI,aAA0B;IAC9B,GAAI,WAAwB;CAC7B,CAAC,CAAC"}
|
package/dist/checks/knip-wrap.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { hasPackageJsonKey } from '../detect/package-json.js';
|
|
4
|
-
import { absolutize, emptyOutcome, firstLine, noticesFor } from '../wrap/notices.js';
|
|
5
|
-
import { isSpawnSkip, parseJsonStdout, skipOutcome, spawnWrapped } from '../wrap/run.js';
|
|
6
|
-
import { KNIP_SMELL_MAP } from '../config/tool-smells.js';
|
|
7
|
-
import { buildKnipArgs, consumerKnipMajor, resolveKnipBin } from './knip-resolve.js';
|
|
8
|
-
import { KNOWN_KEYS, LOCATION_KEYS, MEMBER_KEYS, } from './knip-schema.js';
|
|
9
|
-
export { buildKnipArgs, consumerKnipMajor, resolveKnipBin };
|
|
10
|
-
const KNIP_CONFIG_FILES = ['knip.json', 'knip.jsonc', 'knip.ts', 'knip.js'];
|
|
11
|
-
function exitFailureWarning(cwd, code, stderr) {
|
|
12
|
-
const detail = firstLine(stderr);
|
|
13
|
-
const suffix = detail.length > 0 ? `: ${detail}` : '';
|
|
14
|
-
return `habit-hooks: knip skipped in ${cwd} (exit ${code})${suffix}`;
|
|
15
|
-
}
|
|
16
|
-
function knipSmell(issueType) {
|
|
17
|
-
return KNIP_SMELL_MAP[issueType] ?? issueType;
|
|
18
|
-
}
|
|
19
|
-
function buildViolation(args) {
|
|
20
|
-
const { ruleId, source, file, message, loc } = args;
|
|
21
|
-
return { ruleId, source, file, line: loc.line ?? 1, column: loc.col, message };
|
|
22
|
-
}
|
|
23
|
-
function locationToViolation(ctx, loc) {
|
|
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 });
|
|
27
|
-
}
|
|
28
|
-
function memberToViolation(ctx, owner, loc) {
|
|
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 });
|
|
33
|
-
}
|
|
34
|
-
function flattenMemberMap(ctx, members) {
|
|
35
|
-
return Object.entries(members).flatMap(([owner, list]) => list.map((loc) => memberToViolation(ctx, owner, loc)));
|
|
36
|
-
}
|
|
37
|
-
function buildIssueContext(cwd, issue, key) {
|
|
38
|
-
return { cwd, issueType: key, issueFile: issue.file };
|
|
39
|
-
}
|
|
40
|
-
function locationsForKey(issue, key, cwd) {
|
|
41
|
-
const value = issue[key];
|
|
42
|
-
if (!Array.isArray(value) || value.length === 0)
|
|
43
|
-
return [];
|
|
44
|
-
const ctx = buildIssueContext(cwd, issue, key);
|
|
45
|
-
return value.map((loc) => locationToViolation(ctx, loc));
|
|
46
|
-
}
|
|
47
|
-
function membersForKey(issue, key, cwd) {
|
|
48
|
-
const value = issue[key];
|
|
49
|
-
if (value === undefined || value === null || Array.isArray(value))
|
|
50
|
-
return [];
|
|
51
|
-
return flattenMemberMap(buildIssueContext(cwd, issue, key), value);
|
|
52
|
-
}
|
|
53
|
-
function warnDuplicatesIfPresent(issue, cwd) {
|
|
54
|
-
if (issue.duplicates === undefined || issue.duplicates.length === 0)
|
|
55
|
-
return;
|
|
56
|
-
const file = absolutize(cwd, issue.file);
|
|
57
|
-
process.stderr.write(`habit-hooks: knip duplicates issue ignored in ${file} (not yet supported)\n`);
|
|
58
|
-
}
|
|
59
|
-
function isPopulated(value) {
|
|
60
|
-
if (value === undefined || value === null)
|
|
61
|
-
return false;
|
|
62
|
-
if (Array.isArray(value))
|
|
63
|
-
return value.length > 0;
|
|
64
|
-
if (typeof value === 'object')
|
|
65
|
-
return Object.keys(value).length > 0;
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
function unknownKeyToViolation(cwd, issue, key) {
|
|
69
|
-
const ruleId = knipSmell(key);
|
|
70
|
-
const source = `knip:${key}`;
|
|
71
|
-
const file = absolutize(cwd, issue.file);
|
|
72
|
-
const message = 'unrecognised knip issue type';
|
|
73
|
-
return { ruleId, source, file, line: 1, message };
|
|
74
|
-
}
|
|
75
|
-
function unknownKeysForIssue(issue, cwd) {
|
|
76
|
-
const record = issue;
|
|
77
|
-
return Object.keys(record)
|
|
78
|
-
.filter((k) => !KNOWN_KEYS.has(k) && isPopulated(record[k]))
|
|
79
|
-
.map((k) => unknownKeyToViolation(cwd, issue, k));
|
|
80
|
-
}
|
|
81
|
-
function issueToViolations(issue, cwd) {
|
|
82
|
-
warnDuplicatesIfPresent(issue, cwd);
|
|
83
|
-
const fromLocations = LOCATION_KEYS.flatMap((k) => locationsForKey(issue, k, cwd));
|
|
84
|
-
const fromMembers = MEMBER_KEYS.flatMap((k) => membersForKey(issue, k, cwd));
|
|
85
|
-
const fromUnknown = unknownKeysForIssue(issue, cwd);
|
|
86
|
-
return [...fromLocations, ...fromMembers, ...fromUnknown];
|
|
87
|
-
}
|
|
88
|
-
function fileEntryToViolation(cwd, file) {
|
|
89
|
-
const source = 'knip:files';
|
|
90
|
-
return { ruleId: knipSmell('files'), source, file: absolutize(cwd, file), line: 1, message: file };
|
|
91
|
-
}
|
|
92
|
-
function reportToViolations(report, cwd) {
|
|
93
|
-
const filesViolations = (report.files ?? []).map((f) => fileEntryToViolation(cwd, f));
|
|
94
|
-
const issuesViolations = (report.issues ?? []).flatMap((i) => issueToViolations(i, cwd));
|
|
95
|
-
return [...filesViolations, ...issuesViolations];
|
|
96
|
-
}
|
|
97
|
-
function hasPackageJson(cwd) {
|
|
98
|
-
return existsSync(join(cwd, 'package.json'));
|
|
99
|
-
}
|
|
100
|
-
function hasKnipConfig(cwd) {
|
|
101
|
-
if (KNIP_CONFIG_FILES.some((name) => existsSync(join(cwd, name))))
|
|
102
|
-
return true;
|
|
103
|
-
return hasPackageJsonKey(cwd, 'knip');
|
|
104
|
-
}
|
|
105
|
-
async function runKnip(resolution, cwd, notices) {
|
|
106
|
-
const result = await spawnWrapped({ tool: 'knip', resolution, cwd, args: buildKnipArgs(resolution, cwd) });
|
|
107
|
-
if (isSpawnSkip(result))
|
|
108
|
-
return skipOutcome(result, notices);
|
|
109
|
-
const report = parseJsonStdout(result.stdout, '{');
|
|
110
|
-
if (report === null)
|
|
111
|
-
return emptyOutcome([...notices, exitFailureWarning(cwd, result.exitCode, result.stderr)]);
|
|
112
|
-
return { violations: reportToViolations(report, cwd), stderr: notices };
|
|
113
|
-
}
|
|
114
|
-
function noPackageJsonOutcome(cwd, notices) {
|
|
115
|
-
return emptyOutcome([...notices, `habit-hooks: knip skipped in ${cwd} (no package.json)`]);
|
|
116
|
-
}
|
|
117
|
-
function noConfigOutcome(cwd, notices) {
|
|
118
|
-
return emptyOutcome([...notices, `habit-hooks: knip skipped in ${cwd} (no knip config)`]);
|
|
119
|
-
}
|
|
120
|
-
export const knipWrap = {
|
|
121
|
-
id: 'knip',
|
|
122
|
-
async run(files, _rules, cwd) {
|
|
123
|
-
const runCwd = cwd ?? process.cwd();
|
|
124
|
-
if (files.length === 0)
|
|
125
|
-
return { violations: [], stderr: [] };
|
|
126
|
-
const resolution = resolveKnipBin(runCwd);
|
|
127
|
-
const notices = noticesFor('knip', resolution, runCwd);
|
|
128
|
-
if (!hasPackageJson(runCwd))
|
|
129
|
-
return noPackageJsonOutcome(runCwd, notices);
|
|
130
|
-
if (!hasKnipConfig(runCwd))
|
|
131
|
-
return noConfigOutcome(runCwd, notices);
|
|
132
|
-
return runKnip(resolution, runCwd, notices);
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
//# sourceMappingURL=knip-wrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"knip-wrap.js","sourceRoot":"","sources":["../../src/checks/knip-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { baselineForget, baselineGenerate, baselinePrune, baselineSnooze, baselineStatus, } from '../baseline/commands.js';
|
|
2
|
-
import { emit } from './emit.js';
|
|
3
|
-
async function runAction(action) {
|
|
4
|
-
try {
|
|
5
|
-
emit(await action());
|
|
6
|
-
}
|
|
7
|
-
catch (error) {
|
|
8
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
9
|
-
process.stderr.write(`habit-hooks: ${message}\n`);
|
|
10
|
-
process.exitCode = 2;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function attachGenerate(baseline) {
|
|
14
|
-
baseline
|
|
15
|
-
.command('generate')
|
|
16
|
-
.description('record currently-violating files as snoozed')
|
|
17
|
-
.action(async () => {
|
|
18
|
-
await runAction(() => baselineGenerate(process.cwd()));
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
function attachStatus(baseline) {
|
|
22
|
-
baseline
|
|
23
|
-
.command('status')
|
|
24
|
-
.description('list snoozed files and their freshness')
|
|
25
|
-
.action(async () => {
|
|
26
|
-
await runAction(() => baselineStatus(process.cwd()));
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
function attachSnooze(baseline) {
|
|
30
|
-
baseline
|
|
31
|
-
.command('snooze <files...>')
|
|
32
|
-
.description('snooze the given tracked files')
|
|
33
|
-
.action(async (files) => {
|
|
34
|
-
await runAction(() => baselineSnooze(process.cwd(), files));
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
function attachForget(baseline) {
|
|
38
|
-
baseline
|
|
39
|
-
.command('forget <files...>')
|
|
40
|
-
.description('remove baseline entries for the given files')
|
|
41
|
-
.action(async (files) => {
|
|
42
|
-
await runAction(() => baselineForget(process.cwd(), files));
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
function attachPrune(baseline) {
|
|
46
|
-
baseline
|
|
47
|
-
.command('prune')
|
|
48
|
-
.description('remove stale entries (missing files or resolved violations)')
|
|
49
|
-
.action(async () => {
|
|
50
|
-
await runAction(() => baselinePrune(process.cwd()));
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
export function registerBaselineCommands(program) {
|
|
54
|
-
const baseline = program.command('baseline').description('manage the snooze baseline');
|
|
55
|
-
attachGenerate(baseline);
|
|
56
|
-
attachStatus(baseline);
|
|
57
|
-
attachSnooze(baseline);
|
|
58
|
-
attachForget(baseline);
|
|
59
|
-
attachPrune(baseline);
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=baseline-commands.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"baseline-commands.js","sourceRoot":"","sources":["../../src/cli/baseline-commands.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,GAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,KAAK,UAAU,SAAS,CAAC,MAAoD;IAC3E,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAiB;IACvC,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,QAAiB;IACrC,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,QAAiB;IACrC,QAAQ;SACL,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;QAChC,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,QAAiB;IACrC,QAAQ;SACL,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;QAChC,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,WAAW,CAAC,QAAiB;IACpC,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;IACvF,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,WAAW,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC"}
|
package/dist/cli/emit.d.ts
DELETED
package/dist/cli/emit.js
DELETED
package/dist/cli/emit.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/cli/emit.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,IAAI,CAAC,MAAqB;IACxC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACrC,CAAC"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { detectToolStates, toolsForLanguage } from './detect.js';
|
|
4
|
-
import { installCommandsFor } from './install-commands.js';
|
|
5
|
-
import { describeKey, JSCPD_RECOMMENDATION } from './recommendations.js';
|
|
6
|
-
// `--accept-recommendations` only auto-applies the safe, mechanical fixes:
|
|
7
|
-
// running install commands and additively merging keys into our own
|
|
8
|
-
// `.jscpd.json`. We deliberately never edit user-owned ruff.toml / pyproject.toml
|
|
9
|
-
// thresholds or eslint flat config — safe in-place TOML/JS editing needs a real
|
|
10
|
-
// parser, so those stay reported as manual steps even with the flag.
|
|
11
|
-
const HEADER = 'Applying recommendations:\n';
|
|
12
|
-
function missingTools(ctx, matrix) {
|
|
13
|
-
return toolsForLanguage(ctx.language).filter((tool) => !matrix[tool].installed);
|
|
14
|
-
}
|
|
15
|
-
async function runInstall(ctx, command, runCommand) {
|
|
16
|
-
ctx.lines.out.push(` Running: ${command}\n`);
|
|
17
|
-
const result = await runCommand(command, ctx.cwd);
|
|
18
|
-
if (result.ok)
|
|
19
|
-
ctx.lines.out.push(' ✓ installed\n');
|
|
20
|
-
else
|
|
21
|
-
ctx.lines.out.push(` ✗ failed: ${result.output}\n`);
|
|
22
|
-
}
|
|
23
|
-
async function installMissingTools(ctx, matrix, runCommand) {
|
|
24
|
-
const commands = installCommandsFor(ctx.cwd, missingTools(ctx, matrix));
|
|
25
|
-
for (const command of commands)
|
|
26
|
-
await runInstall(ctx, command, runCommand);
|
|
27
|
-
}
|
|
28
|
-
function jscpdPath(cwd) {
|
|
29
|
-
return join(cwd, '.jscpd.json');
|
|
30
|
-
}
|
|
31
|
-
function withAddedKeys(config, keys) {
|
|
32
|
-
const merged = { ...config };
|
|
33
|
-
for (const key of keys)
|
|
34
|
-
merged[key] = describeKey(JSCPD_RECOMMENDATION, key).value;
|
|
35
|
-
return merged;
|
|
36
|
-
}
|
|
37
|
-
function readJscpd(path) {
|
|
38
|
-
try {
|
|
39
|
-
return JSON.parse(readFileSync(path, 'utf8'));
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function mergeJscpdConfig(ctx) {
|
|
46
|
-
if (!toolsForLanguage(ctx.language).includes('jscpd'))
|
|
47
|
-
return;
|
|
48
|
-
const path = jscpdPath(ctx.cwd);
|
|
49
|
-
if (!existsSync(path))
|
|
50
|
-
return;
|
|
51
|
-
const missing = JSCPD_RECOMMENDATION.missingKeys(ctx.cwd);
|
|
52
|
-
const config = readJscpd(path);
|
|
53
|
-
if (missing.length === 0 || config === null)
|
|
54
|
-
return;
|
|
55
|
-
writeFileSync(path, `${JSON.stringify(withAddedKeys(config, missing), null, 2)}\n`);
|
|
56
|
-
ctx.lines.out.push(` Updated .jscpd.json (added: ${missing.join(', ')})\n`);
|
|
57
|
-
}
|
|
58
|
-
function jscpdHasMissingKeys(ctx) {
|
|
59
|
-
if (!toolsForLanguage(ctx.language).includes('jscpd'))
|
|
60
|
-
return false;
|
|
61
|
-
if (!existsSync(jscpdPath(ctx.cwd)))
|
|
62
|
-
return false;
|
|
63
|
-
return JSCPD_RECOMMENDATION.missingKeys(ctx.cwd).length > 0;
|
|
64
|
-
}
|
|
65
|
-
function hasWork(ctx, matrix) {
|
|
66
|
-
return missingTools(ctx, matrix).length > 0 || jscpdHasMissingKeys(ctx);
|
|
67
|
-
}
|
|
68
|
-
export async function applyRecommendations(ctx, runCommand) {
|
|
69
|
-
const matrix = detectToolStates(ctx.cwd);
|
|
70
|
-
if (!hasWork(ctx, matrix))
|
|
71
|
-
return;
|
|
72
|
-
ctx.lines.out.push(`\n${HEADER}`);
|
|
73
|
-
await installMissingTools(ctx, matrix, runCommand);
|
|
74
|
-
mergeJscpdConfig(ctx);
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=apply-recommendations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apply-recommendations.js","sourceRoot":"","sources":["../../../src/cli/init/apply-recommendations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { runTool } from '../../wrap/shell.js';
|
|
2
|
-
const FAILURE_TAIL_LINES = 3;
|
|
3
|
-
function lastLines(text, count) {
|
|
4
|
-
const lines = text.trim().split('\n');
|
|
5
|
-
return lines.slice(-count).join('\n').trim();
|
|
6
|
-
}
|
|
7
|
-
function combinedOutput(stdout, stderr) {
|
|
8
|
-
return `${stdout}${stderr}`.trim();
|
|
9
|
-
}
|
|
10
|
-
// Our generated commands are simple (e.g. `pip install ruff deptry`,
|
|
11
|
-
// `npm install --save-dev jscpd`), so a whitespace split into bin + args is safe.
|
|
12
|
-
export const runCommandWithShell = async (command, cwd) => {
|
|
13
|
-
const [bin, ...args] = command.trim().split(/\s+/);
|
|
14
|
-
if (bin === undefined)
|
|
15
|
-
return { ok: false, output: 'empty command' };
|
|
16
|
-
const result = await runTool({ bin, args, cwd });
|
|
17
|
-
const ok = result.exitCode === 0;
|
|
18
|
-
if (ok)
|
|
19
|
-
return { ok, output: combinedOutput(result.stdout, result.stderr) };
|
|
20
|
-
return { ok, output: lastLines(combinedOutput(result.stdout, result.stderr), FAILURE_TAIL_LINES) };
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=command-runner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../../src/cli/init/command-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAS9C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,MAAc;IACpD,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,qEAAqE;AACrE,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAkB,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;IACvE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IACjC,IAAI,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5E,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,EAAE,CAAC;AACrG,CAAC,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { ToolName, ToolState } from './detect.js';
|
|
2
|
-
import type { Language } from '../../config/schema.js';
|
|
3
|
-
interface ReportInput {
|
|
4
|
-
cwd: string;
|
|
5
|
-
language: Language;
|
|
6
|
-
tools: ToolName[];
|
|
7
|
-
matrix: Record<ToolName, ToolState>;
|
|
8
|
-
advertiseAcceptFlag?: boolean;
|
|
9
|
-
}
|
|
10
|
-
export declare function completionReport(input: ReportInput): string;
|
|
11
|
-
export {};
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { installCommandsFor } from './install-commands.js';
|
|
4
|
-
import { JSCPD_RECOMMENDATION, RUFF_RECOMMENDATION, describeKey, } from './recommendations.js';
|
|
5
|
-
const ADVERT_LINE = 'To install missing tools and apply recommended settings automatically, ' +
|
|
6
|
-
're-run with `--accept-recommendations`.\n';
|
|
7
|
-
const COMPLETE_LINE = '✅ Setup complete.\n';
|
|
8
|
-
const INCOMPLETE_HEADER = '⚠️ Setup incomplete — to finish:\n';
|
|
9
|
-
function missingToolItems(input) {
|
|
10
|
-
const missing = input.tools.filter((t) => !input.matrix[t].installed);
|
|
11
|
-
if (missing.length === 0)
|
|
12
|
-
return [];
|
|
13
|
-
const commands = installCommandsFor(input.cwd, missing);
|
|
14
|
-
return [{ heading: `Install ${missing.join(', ')}:`, details: commands }];
|
|
15
|
-
}
|
|
16
|
-
function deptryConfigItems(input) {
|
|
17
|
-
if (!input.tools.includes('deptry'))
|
|
18
|
-
return [];
|
|
19
|
-
if (existsSync(join(input.cwd, 'pyproject.toml')))
|
|
20
|
-
return [];
|
|
21
|
-
return [
|
|
22
|
-
{ heading: 'Create a pyproject.toml that declares your dependencies (deptry reads it).', details: [] },
|
|
23
|
-
];
|
|
24
|
-
}
|
|
25
|
-
function ruffEditDetail(recommendation, key) {
|
|
26
|
-
const detail = describeKey(recommendation, key);
|
|
27
|
-
return `set \`${key} = ${detail.value}\` (${detail.description}) in ruff.toml or pyproject.toml [tool.ruff.lint.*]`;
|
|
28
|
-
}
|
|
29
|
-
function ruffRecommendationItems(input) {
|
|
30
|
-
if (!input.tools.includes('ruff'))
|
|
31
|
-
return [];
|
|
32
|
-
const missing = RUFF_RECOMMENDATION.missingKeys(input.cwd);
|
|
33
|
-
if (missing.length === 0)
|
|
34
|
-
return [];
|
|
35
|
-
const details = missing.map((k) => ruffEditDetail(RUFF_RECOMMENDATION, k));
|
|
36
|
-
return [{ heading: 'ruff is missing recommended thresholds:', details }];
|
|
37
|
-
}
|
|
38
|
-
function jscpdEditDetail(key) {
|
|
39
|
-
const detail = describeKey(JSCPD_RECOMMENDATION, key);
|
|
40
|
-
return `add \`"${key}": ${detail.value}\` (${detail.description}) to .jscpd.json`;
|
|
41
|
-
}
|
|
42
|
-
function jscpdRecommendationItems(input) {
|
|
43
|
-
if (!input.tools.includes('jscpd'))
|
|
44
|
-
return [];
|
|
45
|
-
const missing = JSCPD_RECOMMENDATION.missingKeys(input.cwd);
|
|
46
|
-
if (missing.length === 0)
|
|
47
|
-
return [];
|
|
48
|
-
return [{ heading: '.jscpd.json is missing recommended keys:', details: missing.map(jscpdEditDetail) }];
|
|
49
|
-
}
|
|
50
|
-
function hardGapItems(input) {
|
|
51
|
-
return [
|
|
52
|
-
...missingToolItems(input),
|
|
53
|
-
...deptryConfigItems(input),
|
|
54
|
-
...ruffRecommendationItems(input),
|
|
55
|
-
...jscpdRecommendationItems(input),
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
// eslint is advisory-only: its flat `.js` config can't be cheaply parsed, so we
|
|
59
|
-
// can't verify its thresholds — surfacing it as a hard gap would make every
|
|
60
|
-
// configured project read "incomplete". We note it without flipping the status.
|
|
61
|
-
function eslintAdvisoryLine(input) {
|
|
62
|
-
if (!input.tools.includes('eslint') || !input.matrix.eslint.configured)
|
|
63
|
-
return null;
|
|
64
|
-
return 'Note: eslint config may be missing the bundled thresholds — review it against the habit-hooks defaults.';
|
|
65
|
-
}
|
|
66
|
-
function renderItem(item) {
|
|
67
|
-
const heading = ` - ${item.heading}`;
|
|
68
|
-
const details = item.details.map((d) => ` ${d}`);
|
|
69
|
-
return [heading, ...details].join('\n');
|
|
70
|
-
}
|
|
71
|
-
function withAdvisory(body, advisory) {
|
|
72
|
-
if (advisory === null)
|
|
73
|
-
return body;
|
|
74
|
-
return `${body}${advisory}\n`;
|
|
75
|
-
}
|
|
76
|
-
function jscpdKeysMissing(input) {
|
|
77
|
-
if (!input.tools.includes('jscpd'))
|
|
78
|
-
return false;
|
|
79
|
-
return JSCPD_RECOMMENDATION.missingKeys(input.cwd).length > 0;
|
|
80
|
-
}
|
|
81
|
-
function hasAutoApplicableWork(input) {
|
|
82
|
-
const toolMissing = input.tools.some((t) => !input.matrix[t].installed);
|
|
83
|
-
return toolMissing || jscpdKeysMissing(input);
|
|
84
|
-
}
|
|
85
|
-
function withAdvert(body, input) {
|
|
86
|
-
if (input.advertiseAcceptFlag !== true || !hasAutoApplicableWork(input))
|
|
87
|
-
return body;
|
|
88
|
-
return `${body}${ADVERT_LINE}`;
|
|
89
|
-
}
|
|
90
|
-
export function completionReport(input) {
|
|
91
|
-
const items = hardGapItems(input);
|
|
92
|
-
const advisory = eslintAdvisoryLine(input);
|
|
93
|
-
if (items.length === 0)
|
|
94
|
-
return withAdvert(withAdvisory(`\n${COMPLETE_LINE}`, advisory), input);
|
|
95
|
-
const gaps = `\n${INCOMPLETE_HEADER}${items.map(renderItem).join('\n')}\n`;
|
|
96
|
-
return withAdvert(withAdvisory(gaps, advisory), input);
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=completion-report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"completion-report.js","sourceRoot":"","sources":["../../../src/cli/init/completion-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,GAEZ,MAAM,sBAAsB,CAAC;AAY9B,MAAM,WAAW,GACf,yEAAyE;IACzE,2CAA2C,CAAC;AAO9C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,iBAAiB,GAAG,qCAAqC,CAAC;AAEhE,SAAS,gBAAgB,CAAC,KAAkB;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,OAAO;QACL,EAAE,OAAO,EAAE,4EAA4E,EAAE,OAAO,EAAE,EAAE,EAAE;KACvG,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,cAA8B,EAAE,GAAW;IACjE,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAChD,OAAO,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,WAAW,qDAAqD,CAAC;AACtH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAkB;IACjD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,WAAW,kBAAkB,CAAC;AACpF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAkB;IAClD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,EAAE,0CAA0C,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,OAAO;QACL,GAAG,gBAAgB,CAAC,KAAK,CAAC;QAC1B,GAAG,iBAAiB,CAAC,KAAK,CAAC;QAC3B,GAAG,uBAAuB,CAAC,KAAK,CAAC;QACjC,GAAG,wBAAwB,CAAC,KAAK,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,SAAS,kBAAkB,CAAC,KAAkB;IAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,yGAAyG,CAAC;AACnH,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB;IAClC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,QAAuB;IACzD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,GAAG,IAAI,GAAG,QAAQ,IAAI,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB;IAC1C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAkB;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxE,OAAO,WAAW,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAkB;IAClD,IAAI,KAAK,CAAC,mBAAmB,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,aAAa,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,KAAK,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3E,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/cli/init/ctx.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ScaffoldResult } from './scaffold-config.js';
|
|
2
|
-
import type { Lines } from './reporters.js';
|
|
3
|
-
import type { Language } from '../../config/schema.js';
|
|
4
|
-
export interface Ctx {
|
|
5
|
-
cwd: string;
|
|
6
|
-
lines: Lines;
|
|
7
|
-
dryRun: boolean;
|
|
8
|
-
language: Language;
|
|
9
|
-
acceptRecommendations: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function noteScaffold(ctx: Ctx, result: ScaffoldResult, label: string): void;
|
|
12
|
-
export declare function dryRunPath(ctx: Ctx, filename: string, label: string): void;
|
package/dist/cli/init/ctx.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
export function noteScaffold(ctx, result, label) {
|
|
4
|
-
if (result.created)
|
|
5
|
-
ctx.lines.out.push(`wrote ${result.path}\n`);
|
|
6
|
-
else
|
|
7
|
-
ctx.lines.out.push(`${label} already present at ${result.path}\n`);
|
|
8
|
-
}
|
|
9
|
-
export function dryRunPath(ctx, filename, label) {
|
|
10
|
-
const path = join(ctx.cwd, filename);
|
|
11
|
-
if (existsSync(path))
|
|
12
|
-
ctx.lines.out.push(`${label} already present at ${path}\n`);
|
|
13
|
-
else
|
|
14
|
-
ctx.lines.out.push(`[dry-run] would write ${path}\n`);
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=ctx.js.map
|