@cplieger/deadset-ts 8.0.0-dev.1 → 8.0.0-dev.11
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 +1 -1
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/analysis.js +181 -341
- package/dist/src/augmentations.js +106 -13
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/build-scripts.js +425 -0
- package/dist/src/component-layer.js +4 -2
- package/dist/src/components.js +2 -3
- package/dist/src/config.js +6 -82
- package/dist/src/configuration-files.js +28 -176
- package/dist/src/configured-declarations.js +15 -20
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +3 -30
- package/dist/src/contextual-uses.js +56 -9
- package/dist/src/contract/config.generated.js +558 -0
- package/dist/src/contract/contract.generated.js +1244 -0
- package/dist/src/contract/report.generated.js +862 -0
- package/dist/src/convention-rows.js +73 -3
- package/dist/src/conventions.js +36 -66
- package/dist/src/dependencies.js +103 -40
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +4 -6
- package/dist/src/entry-point-gaps.js +2 -8
- package/dist/src/entry-points.js +11 -27
- package/dist/src/enum-group.js +3 -10
- package/dist/src/erased-stores.js +4 -6
- package/dist/src/exempt-classes.js +1 -63
- package/dist/src/exempt.js +21 -40
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +2 -25
- package/dist/src/findings/completion.js +139 -72
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +5 -5
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +13 -10
- package/dist/src/findings/non-code-artifacts.js +7 -8
- package/dist/src/findings/reads-and-writes.js +16 -13
- package/dist/src/findings/self-check.js +10 -12
- package/dist/src/findings/unused-declarations.js +41 -32
- package/dist/src/findings/visibility-narrowing.js +19 -16
- package/dist/src/findings-pass.js +8 -15
- package/dist/src/framework-lifecycle.js +7 -7
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +72 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/generated-file.js +7 -4
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/graph.js +5 -3
- package/dist/src/html-entries.js +6 -33
- package/dist/src/in-operands.js +2 -1
- package/dist/src/index.js +1 -1
- package/dist/src/injection-container.js +1 -1
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory.js +2 -21
- package/dist/src/javascript-file.js +33 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +4 -6
- package/dist/src/kinds.js +3 -366
- package/dist/src/load/classify.js +270 -0
- package/dist/src/load/diagnostics.js +80 -0
- package/dist/src/load/discover.js +277 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +115 -0
- package/dist/src/load/synthesize.js +140 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +23 -65
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/manifest.js +49 -54
- package/dist/src/matrix.js +76 -4
- package/dist/src/mdx-entries.js +3 -26
- package/dist/src/outside-tests.js +1 -1
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +26 -15
- package/dist/src/position.js +2 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +1 -0
- package/dist/src/ref.js +1 -0
- package/dist/src/references.js +48 -30
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +245 -729
- package/dist/src/roots.js +273 -87
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/serialization-contract.js +595 -21
- package/dist/src/session.js +34 -29
- package/dist/src/source-files.js +1 -1
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +3 -2
- package/dist/src/suppress.js +33 -51
- package/dist/src/sweep.js +7 -9
- package/dist/src/symbol-keys.js +3 -5
- package/dist/src/template-field.js +9 -19
- package/dist/src/test-support.js +8 -11
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +54 -0
- package/dist/src/text/shell.js +159 -0
- package/dist/src/text/yaml.js +393 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/unseen-loads.js +100 -0
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/verbs/analyze.js +166 -126
- package/dist/src/verbs/describe.js +9 -16
- package/dist/src/verbs/explain.js +10 -7
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +4 -2
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/dist/src/workflow-steps.js +62 -64
- package/jsr.json +1 -1
- package/package.json +5 -4
- package/src/analysis.ts +245 -502
- package/src/augmentations.ts +135 -17
- package/src/automatic-types.ts +11 -29
- package/src/build-scripts.ts +543 -0
- package/src/component-layer.ts +4 -2
- package/src/components.ts +2 -4
- package/src/config.ts +31 -302
- package/src/configuration-files.ts +34 -179
- package/src/configured-declarations.ts +18 -23
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +6 -57
- package/src/contextual-uses.ts +64 -12
- package/src/contract/config.generated.ts +818 -0
- package/src/contract/contract.generated.ts +1308 -0
- package/src/contract/report.generated.ts +1237 -0
- package/src/convention-rows.ts +85 -3
- package/src/conventions.ts +46 -84
- package/src/dependencies.ts +118 -46
- package/src/edges.ts +41 -140
- package/src/element-access.ts +4 -7
- package/src/entry-point-gaps.ts +3 -9
- package/src/entry-points.ts +12 -38
- package/src/enum-group.ts +2 -11
- package/src/erased-stores.ts +3 -7
- package/src/exempt-classes.ts +1 -75
- package/src/exempt.ts +36 -50
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +9 -24
- package/src/finding.ts +14 -9
- package/src/findings/boundary.ts +2 -0
- package/src/findings/completion.ts +181 -84
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +8 -9
- package/src/findings/emitters.ts +7 -7
- package/src/findings/interfaces.ts +4 -6
- package/src/findings/intra-function.ts +13 -11
- package/src/findings/non-code-artifacts.ts +9 -11
- package/src/findings/reads-and-writes.ts +20 -16
- package/src/findings/self-check.ts +11 -17
- package/src/findings/unused-declarations.ts +45 -32
- package/src/findings/visibility-narrowing.ts +20 -17
- package/src/findings-pass.ts +10 -19
- package/src/framework-lifecycle.ts +7 -7
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +92 -0
- package/src/fs/tree.ts +110 -0
- package/src/generated-file.ts +7 -4
- package/src/git-ignore.ts +50 -26
- package/src/graph.ts +5 -3
- package/src/host.ts +12 -5
- package/src/html-entries.ts +6 -33
- package/src/in-operands.ts +2 -1
- package/src/index.ts +1 -1
- package/src/injection-container.ts +1 -1
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory.ts +2 -20
- package/src/javascript-file.ts +37 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +3 -7
- package/src/kinds.ts +5 -413
- package/src/load/classify.ts +397 -0
- package/src/load/diagnostics.ts +144 -0
- package/src/load/discover.ts +455 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +188 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/plan.ts +504 -0
- package/src/load/specifiers.ts +168 -0
- package/src/load/synthesize.ts +211 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +33 -76
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/manifest.ts +81 -75
- package/src/matrix.ts +122 -4
- package/src/mdx-entries.ts +3 -26
- package/src/outside-tests.ts +1 -1
- package/src/partial.ts +3 -2
- package/src/paths.ts +27 -15
- package/src/position.ts +2 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +11 -0
- package/src/ref.ts +1 -0
- package/src/references.ts +52 -31
- package/src/report-schema.ts +68 -0
- package/src/report.ts +101 -224
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +283 -1114
- package/src/roots.ts +339 -104
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/serialization-contract.ts +763 -22
- package/src/session.ts +70 -54
- package/src/source-files.ts +1 -1
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +2 -2
- package/src/suppress.ts +43 -58
- package/src/sweep.ts +23 -9
- package/src/symbol-keys.ts +2 -5
- package/src/template-field.ts +15 -25
- package/src/test-support.ts +17 -13
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.inputs.json +1522 -0
- package/src/text/named-files.ts +68 -0
- package/src/text/shell.ts +161 -0
- package/src/text/yaml.ts +423 -0
- package/src/type-errors.ts +18 -288
- package/src/unseen-loads.ts +134 -0
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/verbs/analyze.ts +224 -162
- package/src/verbs/describe.ts +14 -15
- package/src/verbs/explain.ts +10 -11
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +4 -2
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/src/workflow-steps.ts +74 -64
- package/dist/src/base-url.js +0 -18
- package/dist/src/discover.js +0 -468
- package/dist/src/glob.js +0 -65
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/test-joins.js +0 -101
- package/dist/src/version.js +0 -7
- package/src/base-url.ts +0 -24
- package/src/discover.ts +0 -653
- package/src/glob.ts +0 -67
- package/src/pnpm-workspace.ts +0 -135
- package/src/setup-failure.ts +0 -39
- package/src/test-joins.ts +0 -120
- package/src/version.ts +0 -7
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
1
2
|
import { printConfig } from "../print.js";
|
|
2
3
|
import { resolve } from "../resolve.js";
|
|
3
|
-
import {
|
|
4
|
+
import {} from "./verb.js";
|
|
4
5
|
/** Writes the resolved configuration with the source of every setting. */
|
|
5
6
|
export const printConfigVerb = ({ out, inputs }) => {
|
|
6
7
|
const { config, provenance } = resolve(inputs());
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
1
2
|
import { runProjects } from "../analysis.js";
|
|
2
3
|
import { partialNotes } from "../partial.js";
|
|
3
4
|
import { resolvePath } from "../paths.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePartial } from "../resolve.js";
|
|
6
|
+
import {} from "./verb.js";
|
|
7
|
+
import { diagnose } from "../product.js";
|
|
6
8
|
/**
|
|
7
9
|
* Writes the name of every project one run analyzes, one per line: the identifier the
|
|
8
10
|
* build matrix declares for it, or, where discovery derived the project, its
|
|
@@ -11,7 +13,7 @@ import { EXIT_CLEAN } from "./verb.js";
|
|
|
11
13
|
* instead, and one that fails the analysis fails this command the same way.
|
|
12
14
|
*/
|
|
13
15
|
export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient }) => {
|
|
14
|
-
const config =
|
|
16
|
+
const config = resolvePartial(inputs());
|
|
15
17
|
const scoped = scope();
|
|
16
18
|
const answer = runProjects(openClient(config), host, scoped, config);
|
|
17
19
|
for (const id of answer.configurations) {
|
|
@@ -22,7 +24,7 @@ export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient })
|
|
|
22
24
|
unanswered: answer.unanswered,
|
|
23
25
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
24
26
|
})) {
|
|
25
|
-
err
|
|
27
|
+
diagnose(err, note);
|
|
26
28
|
}
|
|
27
29
|
return EXIT_CLEAN;
|
|
28
30
|
};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
1
2
|
import { runSweep } from "../analysis.js";
|
|
2
3
|
import { retainedLines } from "../exempt.js";
|
|
3
4
|
import { partialNotes } from "../partial.js";
|
|
4
5
|
import { resolvePath } from "../paths.js";
|
|
5
6
|
import { resolve } from "../resolve.js";
|
|
6
|
-
import {
|
|
7
|
+
import {} from "./verb.js";
|
|
8
|
+
import { diagnose } from "../product.js";
|
|
7
9
|
/**
|
|
8
10
|
* Writes every declaration an exemption held back in the production sweep a report is
|
|
9
11
|
* built from, one per line, and nothing where no exemption held one back. One fact
|
|
@@ -26,7 +28,7 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
|
|
|
26
28
|
unanswered: swept.unanswered,
|
|
27
29
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
28
30
|
})) {
|
|
29
|
-
err
|
|
31
|
+
diagnose(err, note);
|
|
30
32
|
}
|
|
31
33
|
return EXIT_CLEAN;
|
|
32
34
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN, EXIT_FINDINGS } from "../contract/contract.generated.js";
|
|
1
2
|
import { runRoots } from "../analysis.js";
|
|
2
3
|
import { partialNotes } from "../partial.js";
|
|
3
4
|
import { resolvePath } from "../paths.js";
|
|
4
5
|
import { resolve } from "../resolve.js";
|
|
5
|
-
import {
|
|
6
|
+
import {} from "./verb.js";
|
|
7
|
+
import { diagnose } from "../product.js";
|
|
6
8
|
/**
|
|
7
9
|
* One root as a line: the declaration's reference, why it is a root, and the string
|
|
8
10
|
* that named it, separated by tabs. A run of several configurations adds the ones
|
|
@@ -39,7 +41,7 @@ export const printRootsVerb = ({ out, err, host, inputs, scope, openClient }) =>
|
|
|
39
41
|
unanswered: answer.unanswered,
|
|
40
42
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
41
43
|
})) {
|
|
42
|
-
err
|
|
44
|
+
diagnose(err, note);
|
|
43
45
|
}
|
|
44
46
|
return answer.findings.length > 0 ? EXIT_FINDINGS : EXIT_CLEAN;
|
|
45
47
|
};
|
package/dist/src/verbs/verb.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import { CONTRACT_VERSION } from "../
|
|
2
|
-
import {
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
2
|
+
import { productFault } from "../failure.js";
|
|
3
|
+
import {} from "./verb.js";
|
|
4
|
+
import { message, PRODUCT } from "../product.js";
|
|
5
|
+
/** The version the host reports for this analyzer; one it cannot read is a fault of the analyzer. */
|
|
6
|
+
export function ownVersion(host) {
|
|
7
|
+
try {
|
|
8
|
+
return host.analyzerVersion();
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
throw productFault(`cannot read its own version: ${message(error)}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
3
14
|
/** Writes the version the host reports and the Contract version this analyzer implements. */
|
|
4
15
|
export const versionVerb = ({ out, host }) => {
|
|
5
|
-
out.write(
|
|
16
|
+
out.write(`${PRODUCT} ${ownVersion(host)}\ncontract ${CONTRACT_VERSION}\n`);
|
|
6
17
|
return EXIT_CLEAN;
|
|
7
18
|
};
|
|
@@ -3,42 +3,33 @@
|
|
|
3
3
|
* path from the target root. A workflow or hook file is read as text, line by line, with no
|
|
4
4
|
* YAML parsed.
|
|
5
5
|
*/
|
|
6
|
-
import { scriptTokens } from "./manifest.js";
|
|
7
6
|
import { joinPath, relativePath, resolvePath } from "./paths.js";
|
|
7
|
+
import { filesIn } from "./fs/tree.js";
|
|
8
|
+
import { commandsOf, scriptTokens, unquoted, withoutComment } from "./text/shell.js";
|
|
8
9
|
const WORKFLOWS = ".github/workflows";
|
|
9
10
|
/** A line holding a run command: indentation and one sequence marker before `run:`. */
|
|
10
11
|
const RUN_LINE = /^(\s*(?:- )?)run:(.*)$/u;
|
|
11
12
|
/** The directories whose every file is a git hook script, run as the shell runs it. */
|
|
12
13
|
const HOOK_DIRS = [".husky", ".githooks"];
|
|
14
|
+
/** A line setting the directory a workflow step, or each step a `defaults.run` covers, runs in. */
|
|
15
|
+
const WORKING_DIRECTORY = /^(\s*(?:- )?)working-directory:(.*)$/u;
|
|
16
|
+
const LEFTHOOK_FILES = ["lefthook.yml", "lefthook.yaml", ".lefthook.yml"];
|
|
17
|
+
/** A line setting the directory a lefthook command runs in. */
|
|
18
|
+
const LEFTHOOK_ROOT = /^(\s*(?:- )?)root:(.*)$/u;
|
|
13
19
|
/** The hook manager files whose commands are written under a key, with that key. */
|
|
14
20
|
const HOOK_MANAGERS = [
|
|
15
21
|
[".pre-commit-config.yaml", /^(\s*(?:- )?)entry:(.*)$/u],
|
|
16
|
-
[
|
|
17
|
-
["lefthook.yaml", RUN_LINE],
|
|
18
|
-
[".lefthook.yml", RUN_LINE],
|
|
22
|
+
...LEFTHOOK_FILES.map((name) => [name, RUN_LINE]),
|
|
19
23
|
];
|
|
20
24
|
/** The names GNU make reads a makefile under, in the order it tries them. */
|
|
21
25
|
const MAKEFILES = ["GNUmakefile", "makefile", "Makefile"];
|
|
22
|
-
/** The operators that end one shell command of a recipe line. */
|
|
23
|
-
const COMMAND_SEPARATORS = /&&|\|\||;|\|/u;
|
|
24
26
|
const BLOCK_SCALAR = /^[|>][+-]?$/u;
|
|
25
|
-
const QUOTED = /^(["'])(.*)\1$/su;
|
|
26
27
|
/** A token holding one of these is computed or a pattern, so it names no file. */
|
|
27
28
|
const COMPUTED = /[${*?[]/u;
|
|
28
29
|
const INDENT = /^\s*/u;
|
|
29
|
-
/** The files directly in one directory whose name `accepts`, in name order. */
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
entries = host.readDirectory(dir);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return [];
|
|
37
|
-
}
|
|
38
|
-
return entries
|
|
39
|
-
.filter((entry) => !entry.directory && accepts(entry.name))
|
|
40
|
-
.map((entry) => joinPath(dir, entry.name))
|
|
41
|
-
.sort();
|
|
30
|
+
/** The files directly in one directory whose name `accepts`, by path in name order. */
|
|
31
|
+
function pathsIn(host, dir, accepts) {
|
|
32
|
+
return filesIn(host, dir, accepts).map((name) => joinPath(dir, name));
|
|
42
33
|
}
|
|
43
34
|
function readText(host, path) {
|
|
44
35
|
try {
|
|
@@ -48,7 +39,7 @@ function readText(host, path) {
|
|
|
48
39
|
return undefined;
|
|
49
40
|
}
|
|
50
41
|
}
|
|
51
|
-
/** Every
|
|
42
|
+
/** Every line one workflow file's `run:` steps hold, or every line of the values written under `key`. */
|
|
52
43
|
export function runCommands(text, key = RUN_LINE) {
|
|
53
44
|
const lines = text.split(/\r?\n/u);
|
|
54
45
|
const found = [];
|
|
@@ -58,7 +49,7 @@ export function runCommands(text, key = RUN_LINE) {
|
|
|
58
49
|
continue;
|
|
59
50
|
}
|
|
60
51
|
const column = (match[1] ?? "").length;
|
|
61
|
-
const value = (match[2] ?? "").trim()
|
|
52
|
+
const value = unquoted((match[2] ?? "").trim());
|
|
62
53
|
if (!BLOCK_SCALAR.test(value)) {
|
|
63
54
|
found.push(value);
|
|
64
55
|
continue;
|
|
@@ -74,24 +65,32 @@ export function runCommands(text, key = RUN_LINE) {
|
|
|
74
65
|
return found;
|
|
75
66
|
}
|
|
76
67
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* own, so a `cd` moves the directory of the later commands of its line alone.
|
|
68
|
+
* The commands of the recipe lines of the target root's makefile, each line's in order: a
|
|
69
|
+
* recipe line is one that starts with a tab, joined with the lines a trailing `\`
|
|
70
|
+
* continues it onto.
|
|
81
71
|
*/
|
|
82
|
-
function
|
|
72
|
+
function recipeLines(host, root) {
|
|
83
73
|
const path = MAKEFILES.map((name) => joinPath(root, name)).find((candidate) => host.kindOf(candidate) === "file");
|
|
84
74
|
const text = path === undefined ? undefined : readText(host, path);
|
|
85
75
|
if (text === undefined) {
|
|
86
76
|
return [];
|
|
87
77
|
}
|
|
78
|
+
return text
|
|
79
|
+
.replace(/\\\r?\n/gu, " ")
|
|
80
|
+
.split(/\r?\n/u)
|
|
81
|
+
.filter((line) => line.startsWith("\t"))
|
|
82
|
+
.map((line) => commandsOf(withoutComment(line.slice(1).replace(/^[@+-]+/u, ""))));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Every token the recipe lines of the target root's makefile hold, each with the directory
|
|
86
|
+
* below the root it is read against: make runs each line in a shell of its own, so a `cd`
|
|
87
|
+
* moves the directory of the later commands of its line alone.
|
|
88
|
+
*/
|
|
89
|
+
function recipeTokens(host, root) {
|
|
88
90
|
const found = [];
|
|
89
|
-
for (const line of
|
|
90
|
-
if (!line.startsWith("\t")) {
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
91
|
+
for (const line of recipeLines(host, root)) {
|
|
93
92
|
let dir = root;
|
|
94
|
-
for (const command of
|
|
93
|
+
for (const command of line) {
|
|
95
94
|
const tokens = scriptTokens(command);
|
|
96
95
|
const [first, target, ...rest] = tokens;
|
|
97
96
|
if (first === "cd" && target !== undefined && rest.length === 0 && !COMPUTED.test(target)) {
|
|
@@ -105,55 +104,54 @@ function recipeTokens(host, root) {
|
|
|
105
104
|
}
|
|
106
105
|
return found;
|
|
107
106
|
}
|
|
108
|
-
/** One shell line up to its comment: a `#` that starts a word outside quotes. */
|
|
109
|
-
function withoutComment(line) {
|
|
110
|
-
let quote = "";
|
|
111
|
-
for (let at = 0; at < line.length; at += 1) {
|
|
112
|
-
const char = line[at];
|
|
113
|
-
if (quote !== "") {
|
|
114
|
-
if (char === quote) {
|
|
115
|
-
quote = "";
|
|
116
|
-
}
|
|
117
|
-
else if (char === "\\" && quote === '"') {
|
|
118
|
-
at += 1;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else if (char === "'" || char === '"') {
|
|
122
|
-
quote = char;
|
|
123
|
-
}
|
|
124
|
-
else if (char === "\\") {
|
|
125
|
-
at += 1;
|
|
126
|
-
}
|
|
127
|
-
else if (char === "#" && (at === 0 || /\s/u.test(line[at - 1] ?? ""))) {
|
|
128
|
-
return line.slice(0, at);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return line;
|
|
132
|
-
}
|
|
133
107
|
/**
|
|
134
|
-
* Every
|
|
108
|
+
* Every command the target root's workflow steps, git hooks and makefile run: the `run:`
|
|
135
109
|
* steps of the workflow files in `.github/workflows`, every line of each file in `.husky`
|
|
136
110
|
* and `.githooks`, the `entry:` commands of `.pre-commit-config.yaml`, the `run:` commands
|
|
137
111
|
* of a lefthook file and the makefile's recipe lines.
|
|
138
112
|
*/
|
|
113
|
+
export function workflowCommands(host, targetRoot) {
|
|
114
|
+
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
115
|
+
return [...stepCommands(host, root), ...recipeLines(host, root).flat()];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Every directory the target root's workflow steps and lefthook commands are set to run in, as
|
|
119
|
+
* written: each `working-directory` of a workflow file and each `root` of a lefthook file.
|
|
120
|
+
*/
|
|
121
|
+
export function commandDirectories(host, targetRoot) {
|
|
122
|
+
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
123
|
+
return [
|
|
124
|
+
...workflowFiles(host, root).flatMap((path) => runCommands(readText(host, path) ?? "", WORKING_DIRECTORY)),
|
|
125
|
+
...LEFTHOOK_FILES.flatMap((name) => runCommands(readText(host, joinPath(root, name)) ?? "", LEFTHOOK_ROOT)),
|
|
126
|
+
];
|
|
127
|
+
}
|
|
128
|
+
/** The workflow files in `.github/workflows` at one root, by path in name order. */
|
|
129
|
+
function workflowFiles(host, root) {
|
|
130
|
+
return pathsIn(host, joinPath(root, WORKFLOWS), (name) => /\.ya?ml$/u.test(name));
|
|
131
|
+
}
|
|
132
|
+
/** Every token the commands {@link workflowCommands} reads hold. */
|
|
139
133
|
export function workflowTokens(host, targetRoot) {
|
|
140
134
|
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
135
|
+
return [
|
|
136
|
+
...stepCommands(host, root).flatMap((command) => scriptTokens(command)),
|
|
137
|
+
...recipeTokens(host, root).map(({ token }) => token),
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
/** The commands of the workflow steps, git hooks and hook managers at one root. */
|
|
141
|
+
function stepCommands(host, root) {
|
|
141
142
|
const commands = [];
|
|
142
|
-
for (const path of
|
|
143
|
+
for (const path of workflowFiles(host, root)) {
|
|
143
144
|
commands.push(...runCommands(readText(host, path) ?? ""));
|
|
144
145
|
}
|
|
145
146
|
for (const dir of HOOK_DIRS) {
|
|
146
|
-
for (const path of
|
|
147
|
+
for (const path of pathsIn(host, joinPath(root, dir), () => true)) {
|
|
147
148
|
commands.push(...(readText(host, path) ?? "").split(/\r?\n/u).map(withoutComment));
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
151
|
for (const [name, key] of HOOK_MANAGERS) {
|
|
151
152
|
commands.push(...runCommands(readText(host, joinPath(root, name)) ?? "", key));
|
|
152
153
|
}
|
|
153
|
-
return
|
|
154
|
-
...commands.flatMap((command) => scriptTokens(command)),
|
|
155
|
-
...recipeTokens(host, root).map(({ token }) => token),
|
|
156
|
-
];
|
|
154
|
+
return commands;
|
|
157
155
|
}
|
|
158
156
|
/**
|
|
159
157
|
* The own files the target root's workflow steps and git hooks name, as
|
package/jsr.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cplieger/deadset-ts",
|
|
3
|
-
"version": "8.0.0-dev.
|
|
3
|
+
"version": "8.0.0-dev.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Deterministic dead-code analysis for TypeScript, class and type members included",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "tsc -p tsconfig.build.json",
|
|
22
|
+
"gen": "node scripts/gen-contract.ts",
|
|
22
23
|
"prepack": "npm run build",
|
|
23
24
|
"typecheck": "tsc -p tsconfig.json",
|
|
24
25
|
"typecheck:tests": "tsc -p tsconfig.test.json",
|
|
@@ -30,7 +31,7 @@
|
|
|
30
31
|
"lint:fix": "eslint . --fix && prettier --write ."
|
|
31
32
|
},
|
|
32
33
|
"dependencies": {
|
|
33
|
-
"@typescript/native": "npm:typescript@7.1.0-dev.
|
|
34
|
+
"@typescript/native": "npm:typescript@7.1.0-dev.20261015.1"
|
|
34
35
|
},
|
|
35
36
|
"overrides": {
|
|
36
37
|
"qs": "^6.15.2"
|
|
@@ -45,8 +46,8 @@
|
|
|
45
46
|
"fast-check": "4.10.2",
|
|
46
47
|
"prettier": "3.9.10",
|
|
47
48
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
48
|
-
"typescript-eslint": "8.71.
|
|
49
|
-
"vitest": "5.0.
|
|
49
|
+
"typescript-eslint": "8.71.2",
|
|
50
|
+
"vitest": "5.0.5"
|
|
50
51
|
},
|
|
51
52
|
"publishConfig": {
|
|
52
53
|
"access": "public"
|