@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,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
1
2
|
import { runProjects } from "../analysis.ts";
|
|
2
3
|
import { partialNotes } from "../partial.ts";
|
|
3
4
|
import { resolvePath } from "../paths.ts";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePartial } from "../resolve.ts";
|
|
6
|
+
import { type Verb } from "./verb.ts";
|
|
7
|
+
import { diagnose } from "../product.ts";
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Writes the name of every project one run analyzes, one per line: the identifier the
|
|
@@ -12,7 +14,7 @@ import { EXIT_CLEAN, type Verb } from "./verb.ts";
|
|
|
12
14
|
* instead, and one that fails the analysis fails this command the same way.
|
|
13
15
|
*/
|
|
14
16
|
export const printProjectsVerb: Verb = ({ out, err, host, inputs, scope, openClient }) => {
|
|
15
|
-
const config =
|
|
17
|
+
const config = resolvePartial(inputs());
|
|
16
18
|
const scoped = scope();
|
|
17
19
|
const answer = runProjects(openClient(config), host, scoped, config);
|
|
18
20
|
for (const id of answer.configurations) {
|
|
@@ -23,7 +25,7 @@ export const printProjectsVerb: Verb = ({ out, err, host, inputs, scope, openCli
|
|
|
23
25
|
unanswered: answer.unanswered,
|
|
24
26
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
25
27
|
})) {
|
|
26
|
-
err
|
|
28
|
+
diagnose(err, note);
|
|
27
29
|
}
|
|
28
30
|
return EXIT_CLEAN;
|
|
29
31
|
};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
1
2
|
import { runSweep } from "../analysis.ts";
|
|
2
3
|
import { retainedLines } from "../exempt.ts";
|
|
3
4
|
import { partialNotes } from "../partial.ts";
|
|
4
5
|
import { resolvePath } from "../paths.ts";
|
|
5
6
|
import { resolve } from "../resolve.ts";
|
|
6
|
-
import {
|
|
7
|
+
import { type Verb } from "./verb.ts";
|
|
8
|
+
import { diagnose } from "../product.ts";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Writes every declaration an exemption held back in the production sweep a report is
|
|
@@ -27,7 +29,7 @@ export const printRetainedVerb: Verb = ({ out, err, host, inputs, scope, openCli
|
|
|
27
29
|
unanswered: swept.unanswered,
|
|
28
30
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
29
31
|
})) {
|
|
30
|
-
err
|
|
32
|
+
diagnose(err, note);
|
|
31
33
|
}
|
|
32
34
|
return EXIT_CLEAN;
|
|
33
35
|
};
|
package/src/verbs/print-roots.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN, EXIT_FINDINGS } from "../contract/contract.generated.ts";
|
|
1
2
|
import { runRoots, type RunRoot } from "../analysis.ts";
|
|
2
3
|
import { partialNotes } from "../partial.ts";
|
|
3
4
|
import { resolvePath } from "../paths.ts";
|
|
4
5
|
import { resolve } from "../resolve.ts";
|
|
5
|
-
import {
|
|
6
|
+
import { type Verb } from "./verb.ts";
|
|
7
|
+
import { diagnose } from "../product.ts";
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* One root as a line: the declaration's reference, why it is a root, and the string
|
|
@@ -41,7 +43,7 @@ export const printRootsVerb: Verb = ({ out, err, host, inputs, scope, openClient
|
|
|
41
43
|
unanswered: answer.unanswered,
|
|
42
44
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
43
45
|
})) {
|
|
44
|
-
err
|
|
46
|
+
diagnose(err, note);
|
|
45
47
|
}
|
|
46
48
|
return answer.findings.length > 0 ? EXIT_FINDINGS : EXIT_CLEAN;
|
|
47
49
|
};
|
package/src/verbs/verb.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Inputs, PartialConfig } from "../config.ts";
|
|
2
2
|
import type { Host } from "../host.ts";
|
|
3
3
|
import type { Writer } from "../run.ts";
|
|
4
4
|
import type { Scope } from "../scope.ts";
|
|
5
5
|
import type { Engine } from "../session.ts";
|
|
6
6
|
|
|
7
|
-
/** The exit codes the Contract's exit-code table names. */
|
|
8
|
-
export const EXIT_CLEAN = 0;
|
|
9
|
-
export const EXIT_FINDINGS = 1;
|
|
10
|
-
export const EXIT_USAGE = 2;
|
|
11
|
-
export const EXIT_FAILURE = 3;
|
|
12
|
-
|
|
13
7
|
/**
|
|
14
8
|
* What one verb is handed: the streams it writes, the platform it reads, and the
|
|
15
9
|
* options that follow its name, read only when the verb asks for what they name, so
|
|
@@ -27,7 +21,7 @@ interface Invocation {
|
|
|
27
21
|
* Opens the compiler client for a run under `config`. A client the verb opened is
|
|
28
22
|
* closed if the verb throws.
|
|
29
23
|
*/
|
|
30
|
-
readonly openClient: (config:
|
|
24
|
+
readonly openClient: (config: PartialConfig) => Engine;
|
|
31
25
|
/** The arguments after the verb's name, as written. */
|
|
32
26
|
readonly args: readonly string[];
|
|
33
27
|
/** The last value one of the verb's own options was given, undefined where none was. */
|
package/src/verbs/version.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { CONTRACT_VERSION } from "../
|
|
2
|
-
import {
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
2
|
+
import { productFault } from "../failure.ts";
|
|
3
|
+
import type { Host } from "../host.ts";
|
|
4
|
+
import { type Verb } from "./verb.ts";
|
|
5
|
+
import { message, PRODUCT } from "../product.ts";
|
|
6
|
+
|
|
7
|
+
/** The version the host reports for this analyzer; one it cannot read is a fault of the analyzer. */
|
|
8
|
+
export function ownVersion(host: Host): string {
|
|
9
|
+
try {
|
|
10
|
+
return host.analyzerVersion();
|
|
11
|
+
} catch (error: unknown) {
|
|
12
|
+
throw productFault(`cannot read its own version: ${message(error)}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
3
15
|
|
|
4
16
|
/** Writes the version the host reports and the Contract version this analyzer implements. */
|
|
5
17
|
export const versionVerb: Verb = ({ out, host }) => {
|
|
6
|
-
out.write(
|
|
18
|
+
out.write(`${PRODUCT} ${ownVersion(host)}\ncontract ${CONTRACT_VERSION}\n`);
|
|
7
19
|
return EXIT_CLEAN;
|
|
8
20
|
};
|
package/src/workflow-steps.ts
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
import type { SourceFile } from "@typescript/native/ast";
|
|
8
8
|
import type { Host } from "./host.ts";
|
|
9
|
-
import { scriptTokens } from "./manifest.ts";
|
|
10
9
|
import { joinPath, relativePath, resolvePath } from "./paths.ts";
|
|
11
10
|
import type { SourceFiles } from "./source-files.ts";
|
|
11
|
+
import { filesIn } from "./fs/tree.ts";
|
|
12
|
+
import { commandsOf, scriptTokens, unquoted, withoutComment } from "./text/shell.ts";
|
|
12
13
|
|
|
13
14
|
/** One file a workflow step names. */
|
|
14
15
|
interface WorkflowEntry {
|
|
@@ -25,41 +26,33 @@ const RUN_LINE = /^(\s*(?:- )?)run:(.*)$/u;
|
|
|
25
26
|
/** The directories whose every file is a git hook script, run as the shell runs it. */
|
|
26
27
|
const HOOK_DIRS = [".husky", ".githooks"] as const;
|
|
27
28
|
|
|
29
|
+
/** A line setting the directory a workflow step, or each step a `defaults.run` covers, runs in. */
|
|
30
|
+
const WORKING_DIRECTORY = /^(\s*(?:- )?)working-directory:(.*)$/u;
|
|
31
|
+
|
|
32
|
+
const LEFTHOOK_FILES = ["lefthook.yml", "lefthook.yaml", ".lefthook.yml"] as const;
|
|
33
|
+
|
|
34
|
+
/** A line setting the directory a lefthook command runs in. */
|
|
35
|
+
const LEFTHOOK_ROOT = /^(\s*(?:- )?)root:(.*)$/u;
|
|
36
|
+
|
|
28
37
|
/** The hook manager files whose commands are written under a key, with that key. */
|
|
29
38
|
const HOOK_MANAGERS: readonly (readonly [string, RegExp])[] = [
|
|
30
39
|
[".pre-commit-config.yaml", /^(\s*(?:- )?)entry:(.*)$/u],
|
|
31
|
-
[
|
|
32
|
-
["lefthook.yaml", RUN_LINE],
|
|
33
|
-
[".lefthook.yml", RUN_LINE],
|
|
40
|
+
...LEFTHOOK_FILES.map((name) => [name, RUN_LINE] as const),
|
|
34
41
|
];
|
|
35
42
|
|
|
36
43
|
/** The names GNU make reads a makefile under, in the order it tries them. */
|
|
37
44
|
const MAKEFILES = ["GNUmakefile", "makefile", "Makefile"] as const;
|
|
38
45
|
|
|
39
|
-
/** The operators that end one shell command of a recipe line. */
|
|
40
|
-
const COMMAND_SEPARATORS = /&&|\|\||;|\|/u;
|
|
41
|
-
|
|
42
46
|
const BLOCK_SCALAR = /^[|>][+-]?$/u;
|
|
43
47
|
|
|
44
|
-
const QUOTED = /^(["'])(.*)\1$/su;
|
|
45
|
-
|
|
46
48
|
/** A token holding one of these is computed or a pattern, so it names no file. */
|
|
47
49
|
const COMPUTED = /[${*?[]/u;
|
|
48
50
|
|
|
49
51
|
const INDENT = /^\s*/u;
|
|
50
52
|
|
|
51
|
-
/** The files directly in one directory whose name `accepts`, in name order. */
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
try {
|
|
55
|
-
entries = host.readDirectory(dir);
|
|
56
|
-
} catch {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
return entries
|
|
60
|
-
.filter((entry) => !entry.directory && accepts(entry.name))
|
|
61
|
-
.map((entry) => joinPath(dir, entry.name))
|
|
62
|
-
.sort();
|
|
53
|
+
/** The files directly in one directory whose name `accepts`, by path in name order. */
|
|
54
|
+
function pathsIn(host: Host, dir: string, accepts: (name: string) => boolean): readonly string[] {
|
|
55
|
+
return filesIn(host, dir, accepts).map((name) => joinPath(dir, name));
|
|
63
56
|
}
|
|
64
57
|
|
|
65
58
|
function readText(host: Host, path: string): string | undefined {
|
|
@@ -70,7 +63,7 @@ function readText(host: Host, path: string): string | undefined {
|
|
|
70
63
|
}
|
|
71
64
|
}
|
|
72
65
|
|
|
73
|
-
/** Every
|
|
66
|
+
/** Every line one workflow file's `run:` steps hold, or every line of the values written under `key`. */
|
|
74
67
|
export function runCommands(text: string, key: RegExp = RUN_LINE): readonly string[] {
|
|
75
68
|
const lines = text.split(/\r?\n/u);
|
|
76
69
|
const found: string[] = [];
|
|
@@ -80,7 +73,7 @@ export function runCommands(text: string, key: RegExp = RUN_LINE): readonly stri
|
|
|
80
73
|
continue;
|
|
81
74
|
}
|
|
82
75
|
const column = (match[1] ?? "").length;
|
|
83
|
-
const value = (match[2] ?? "").trim()
|
|
76
|
+
const value = unquoted((match[2] ?? "").trim());
|
|
84
77
|
if (!BLOCK_SCALAR.test(value)) {
|
|
85
78
|
found.push(value);
|
|
86
79
|
continue;
|
|
@@ -97,12 +90,11 @@ export function runCommands(text: string, key: RegExp = RUN_LINE): readonly stri
|
|
|
97
90
|
}
|
|
98
91
|
|
|
99
92
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* own, so a `cd` moves the directory of the later commands of its line alone.
|
|
93
|
+
* The commands of the recipe lines of the target root's makefile, each line's in order: a
|
|
94
|
+
* recipe line is one that starts with a tab, joined with the lines a trailing `\`
|
|
95
|
+
* continues it onto.
|
|
104
96
|
*/
|
|
105
|
-
function
|
|
97
|
+
function recipeLines(host: Host, root: string): readonly (readonly string[])[] {
|
|
106
98
|
const path = MAKEFILES.map((name) => joinPath(root, name)).find(
|
|
107
99
|
(candidate) => host.kindOf(candidate) === "file",
|
|
108
100
|
);
|
|
@@ -110,15 +102,23 @@ function recipeTokens(host: Host, root: string): readonly { token: string; dir:
|
|
|
110
102
|
if (text === undefined) {
|
|
111
103
|
return [];
|
|
112
104
|
}
|
|
105
|
+
return text
|
|
106
|
+
.replace(/\\\r?\n/gu, " ")
|
|
107
|
+
.split(/\r?\n/u)
|
|
108
|
+
.filter((line) => line.startsWith("\t"))
|
|
109
|
+
.map((line) => commandsOf(withoutComment(line.slice(1).replace(/^[@+-]+/u, ""))));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Every token the recipe lines of the target root's makefile hold, each with the directory
|
|
114
|
+
* below the root it is read against: make runs each line in a shell of its own, so a `cd`
|
|
115
|
+
* moves the directory of the later commands of its line alone.
|
|
116
|
+
*/
|
|
117
|
+
function recipeTokens(host: Host, root: string): readonly { token: string; dir: string }[] {
|
|
113
118
|
const found: { token: string; dir: string }[] = [];
|
|
114
|
-
for (const line of
|
|
115
|
-
if (!line.startsWith("\t")) {
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
119
|
+
for (const line of recipeLines(host, root)) {
|
|
118
120
|
let dir = root;
|
|
119
|
-
for (const command of
|
|
120
|
-
COMMAND_SEPARATORS,
|
|
121
|
-
)) {
|
|
121
|
+
for (const command of line) {
|
|
122
122
|
const tokens = scriptTokens(command);
|
|
123
123
|
const [first, target, ...rest] = tokens;
|
|
124
124
|
if (first === "cd" && target !== undefined && rest.length === 0 && !COMPUTED.test(target)) {
|
|
@@ -133,52 +133,62 @@ function recipeTokens(host: Host, root: string): readonly { token: string; dir:
|
|
|
133
133
|
return found;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
/** One shell line up to its comment: a `#` that starts a word outside quotes. */
|
|
137
|
-
function withoutComment(line: string): string {
|
|
138
|
-
let quote = "";
|
|
139
|
-
for (let at = 0; at < line.length; at += 1) {
|
|
140
|
-
const char = line[at];
|
|
141
|
-
if (quote !== "") {
|
|
142
|
-
if (char === quote) {
|
|
143
|
-
quote = "";
|
|
144
|
-
} else if (char === "\\" && quote === '"') {
|
|
145
|
-
at += 1;
|
|
146
|
-
}
|
|
147
|
-
} else if (char === "'" || char === '"') {
|
|
148
|
-
quote = char;
|
|
149
|
-
} else if (char === "\\") {
|
|
150
|
-
at += 1;
|
|
151
|
-
} else if (char === "#" && (at === 0 || /\s/u.test(line[at - 1] ?? ""))) {
|
|
152
|
-
return line.slice(0, at);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return line;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
136
|
/**
|
|
159
|
-
* Every
|
|
137
|
+
* Every command the target root's workflow steps, git hooks and makefile run: the `run:`
|
|
160
138
|
* steps of the workflow files in `.github/workflows`, every line of each file in `.husky`
|
|
161
139
|
* and `.githooks`, the `entry:` commands of `.pre-commit-config.yaml`, the `run:` commands
|
|
162
140
|
* of a lefthook file and the makefile's recipe lines.
|
|
163
141
|
*/
|
|
142
|
+
export function workflowCommands(host: Host, targetRoot: string): readonly string[] {
|
|
143
|
+
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
144
|
+
return [...stepCommands(host, root), ...recipeLines(host, root).flat()];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Every directory the target root's workflow steps and lefthook commands are set to run in, as
|
|
149
|
+
* written: each `working-directory` of a workflow file and each `root` of a lefthook file.
|
|
150
|
+
*/
|
|
151
|
+
export function commandDirectories(host: Host, targetRoot: string): readonly string[] {
|
|
152
|
+
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
153
|
+
return [
|
|
154
|
+
...workflowFiles(host, root).flatMap((path) =>
|
|
155
|
+
runCommands(readText(host, path) ?? "", WORKING_DIRECTORY),
|
|
156
|
+
),
|
|
157
|
+
...LEFTHOOK_FILES.flatMap((name) =>
|
|
158
|
+
runCommands(readText(host, joinPath(root, name)) ?? "", LEFTHOOK_ROOT),
|
|
159
|
+
),
|
|
160
|
+
];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** The workflow files in `.github/workflows` at one root, by path in name order. */
|
|
164
|
+
function workflowFiles(host: Host, root: string): readonly string[] {
|
|
165
|
+
return pathsIn(host, joinPath(root, WORKFLOWS), (name) => /\.ya?ml$/u.test(name));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Every token the commands {@link workflowCommands} reads hold. */
|
|
164
169
|
export function workflowTokens(host: Host, targetRoot: string): readonly string[] {
|
|
165
170
|
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
171
|
+
return [
|
|
172
|
+
...stepCommands(host, root).flatMap((command) => scriptTokens(command)),
|
|
173
|
+
...recipeTokens(host, root).map(({ token }) => token),
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** The commands of the workflow steps, git hooks and hook managers at one root. */
|
|
178
|
+
function stepCommands(host: Host, root: string): readonly string[] {
|
|
166
179
|
const commands: string[] = [];
|
|
167
|
-
for (const path of
|
|
180
|
+
for (const path of workflowFiles(host, root)) {
|
|
168
181
|
commands.push(...runCommands(readText(host, path) ?? ""));
|
|
169
182
|
}
|
|
170
183
|
for (const dir of HOOK_DIRS) {
|
|
171
|
-
for (const path of
|
|
184
|
+
for (const path of pathsIn(host, joinPath(root, dir), () => true)) {
|
|
172
185
|
commands.push(...(readText(host, path) ?? "").split(/\r?\n/u).map(withoutComment));
|
|
173
186
|
}
|
|
174
187
|
}
|
|
175
188
|
for (const [name, key] of HOOK_MANAGERS) {
|
|
176
189
|
commands.push(...runCommands(readText(host, joinPath(root, name)) ?? "", key));
|
|
177
190
|
}
|
|
178
|
-
return
|
|
179
|
-
...commands.flatMap((command) => scriptTokens(command)),
|
|
180
|
-
...recipeTokens(host, root).map(({ token }) => token),
|
|
181
|
-
];
|
|
191
|
+
return commands;
|
|
182
192
|
}
|
|
183
193
|
|
|
184
194
|
/**
|
package/dist/src/base-url.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { resolvePath } from "./paths.js";
|
|
2
|
-
/**
|
|
3
|
-
* The `paths` one configuration's resolved options map under the compilers before version
|
|
4
|
-
* 7, each target absolute: a target is read against the effective `baseUrl`, and a specifier
|
|
5
|
-
* no other pattern maps is looked up below it. Undefined where no `baseUrl` is set, so the
|
|
6
|
-
* options' own `paths` stand. Version 7 reads no `baseUrl`:
|
|
7
|
-
* https://github.com/microsoft/TypeScript/issues/62207
|
|
8
|
-
*/
|
|
9
|
-
export function baseUrlPaths(options) {
|
|
10
|
-
const baseUrl = Reflect.get(options, "baseUrl");
|
|
11
|
-
if (typeof baseUrl !== "string") {
|
|
12
|
-
return undefined;
|
|
13
|
-
}
|
|
14
|
-
return Object.fromEntries(Object.entries({ "*": ["*"], ...options.paths }).map(([key, targets]) => [
|
|
15
|
-
key,
|
|
16
|
-
targets.map((target) => resolvePath(baseUrl, target)),
|
|
17
|
-
]));
|
|
18
|
-
}
|