@cplieger/deadset-ts 7.2.0-dev.4 → 8.0.0-dev.10
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 +245 -309
- package/dist/src/augmentations.js +124 -18
- package/dist/src/automatic-types.js +170 -0
- package/dist/src/build-scripts.js +425 -0
- package/dist/src/component-layer.js +4 -2
- package/dist/src/components.js +9 -9
- package/dist/src/config.js +6 -81
- package/dist/src/configuration-files.js +78 -188
- package/dist/src/configured-declarations.js +15 -20
- package/dist/src/conformance-record.js +2 -2
- 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 +146 -1
- package/dist/src/conventions.js +136 -70
- package/dist/src/decorator.js +21 -18
- package/dist/src/dependencies.js +280 -62
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +4 -6
- package/dist/src/entry-point-gaps.js +9 -18
- package/dist/src/entry-points.js +106 -21
- 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 +225 -63
- package/dist/src/findings/dependencies-and-module-machinery.js +72 -27
- package/dist/src/findings/emitters.js +6 -6
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +53 -19
- package/dist/src/findings/non-code-artifacts.js +71 -39
- 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 +57 -28
- package/dist/src/findings/visibility-narrowing.js +40 -18
- 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 +18 -4
- package/dist/src/git-ignore.js +99 -0
- package/dist/src/graph.js +9 -4
- package/dist/src/html-entries.js +6 -33
- package/dist/src/import-bindings.js +97 -0
- package/dist/src/in-operands.js +2 -1
- package/dist/src/index.js +1 -1
- package/dist/src/indexed-access.js +130 -28
- package/dist/src/injection-container.js +1 -1
- package/dist/src/interface-satisfaction.js +30 -12
- package/dist/src/intra-function-parts.js +341 -69
- package/dist/src/inventory.js +54 -29
- 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} +88 -61
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +60 -59
- 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 +94 -13
- package/dist/src/mdx-entries.js +174 -0
- package/dist/src/module-declarations.js +9 -13
- package/dist/src/outside-tests.js +1 -1
- package/dist/src/overrides.js +41 -10
- 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 -78
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +1 -0
- package/dist/src/ref.js +11 -0
- package/dist/src/references.js +52 -31
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +59 -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 -727
- package/dist/src/roots.js +374 -116
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -342
- package/dist/src/scope.js +38 -115
- package/dist/src/serialization-contract.js +649 -29
- package/dist/src/session.js +41 -29
- package/dist/src/source-files.js +40 -15
- package/dist/src/suppress-file.js +34 -29
- package/dist/src/suppress-inline.js +21 -4
- package/dist/src/suppress.js +40 -56
- package/dist/src/sweep.js +32 -17
- package/dist/src/symbol-keys.js +105 -6
- package/dist/src/template-field.js +9 -19
- package/dist/src/test-support.js +119 -18
- 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 +27 -221
- package/dist/src/type-parameter-reads.js +172 -0
- 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 +181 -125
- package/dist/src/verbs/describe.js +9 -16
- package/dist/src/verbs/explain.js +14 -9
- 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 +128 -33
- package/jsr.json +1 -1
- package/package.json +5 -4
- package/src/analysis.ts +333 -457
- package/src/augmentations.ts +152 -23
- package/src/automatic-types.ts +228 -0
- package/src/build-scripts.ts +543 -0
- package/src/component-layer.ts +4 -2
- package/src/components.ts +9 -10
- package/src/config.ts +31 -299
- package/src/configuration-files.ts +100 -191
- package/src/configured-declarations.ts +18 -23
- package/src/conformance-record.ts +2 -2
- 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 +186 -1
- package/src/conventions.ts +166 -90
- package/src/decorator.ts +28 -18
- package/src/dependencies.ts +356 -78
- package/src/edges.ts +41 -140
- package/src/element-access.ts +4 -7
- package/src/entry-point-gaps.ts +11 -20
- package/src/entry-points.ts +124 -28
- 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 +24 -9
- package/src/findings/boundary.ts +2 -0
- package/src/findings/completion.ts +297 -77
- package/src/findings/dependencies-and-module-machinery.ts +90 -31
- package/src/findings/emitter.ts +8 -9
- package/src/findings/emitters.ts +8 -8
- package/src/findings/interfaces.ts +4 -6
- package/src/findings/intra-function.ts +64 -20
- package/src/findings/non-code-artifacts.ts +88 -50
- package/src/findings/reads-and-writes.ts +20 -16
- package/src/findings/self-check.ts +11 -17
- package/src/findings/unused-declarations.ts +65 -28
- package/src/findings/visibility-narrowing.ts +51 -19
- 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 +23 -4
- package/src/git-ignore.ts +122 -0
- package/src/graph.ts +11 -3
- package/src/host.ts +17 -14
- package/src/html-entries.ts +6 -33
- package/src/import-bindings.ts +128 -0
- package/src/in-operands.ts +2 -1
- package/src/index.ts +1 -1
- package/src/indexed-access.ts +152 -30
- package/src/injection-container.ts +1 -1
- package/src/interface-satisfaction.ts +33 -13
- package/src/intra-function-parts.ts +449 -85
- package/src/inventory.ts +73 -27
- 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} +127 -80
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +73 -64
- 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 +154 -18
- package/src/mdx-entries.ts +218 -0
- package/src/module-declarations.ts +11 -13
- package/src/outside-tests.ts +1 -1
- package/src/overrides.ts +51 -12
- package/src/partial.ts +3 -2
- package/src/paths.ts +27 -15
- package/src/position.ts +2 -1
- package/src/print.ts +12 -91
- package/src/product.ts +18 -0
- package/src/query.ts +11 -0
- package/src/ref.ts +13 -0
- package/src/references.ts +62 -32
- package/src/report-schema.ts +68 -0
- package/src/report.ts +105 -215
- 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 -1111
- package/src/roots.ts +490 -137
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -387
- package/src/scope.ts +46 -138
- package/src/serialization-contract.ts +818 -26
- package/src/session.ts +77 -54
- package/src/source-files.ts +67 -17
- package/src/suppress-file.ts +36 -34
- package/src/suppress-inline.ts +20 -3
- package/src/suppress.ts +52 -63
- package/src/sweep.ts +53 -18
- package/src/symbol-keys.ts +131 -7
- package/src/template-field.ts +15 -25
- package/src/test-support.ts +155 -18
- 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 +35 -273
- package/src/type-parameter-reads.ts +227 -0
- package/src/unseen-loads.ts +134 -0
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/verbs/analyze.ts +245 -161
- package/src/verbs/describe.ts +14 -15
- package/src/verbs/explain.ts +15 -13
- 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 +149 -34
- package/dist/src/discover.js +0 -347
- 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/discover.ts +0 -510
- 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
package/src/run.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CONFIG_MAX_BYTES, SETTINGS } from "./contract/config.generated.ts";
|
|
2
|
+
import { EXIT_FAILURE, EXIT_USAGE } from "./contract/contract.generated.ts";
|
|
3
|
+
import { REPOSITORY_DOCUMENT, type Document, type Inputs } from "./config.ts";
|
|
4
|
+
import { readTargetDocument } from "./fs/document.ts";
|
|
3
5
|
import type { Host } from "./host.ts";
|
|
4
6
|
import { joinPath, resolvePath } from "./paths.ts";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
+
import { renderDiagnostic } from "./load/diagnostics.ts";
|
|
8
|
+
import { FailureExit, failureLines, productFault } from "./failure.ts";
|
|
9
|
+
import { readScope, scopeForDir, type Scope } from "./scope.ts";
|
|
10
|
+
import { UsageError } from "./usage.ts";
|
|
7
11
|
import { openEngine, type Engine, type EngineOptions } from "./session.ts";
|
|
8
12
|
import { printConfigVerb } from "./verbs/print-config.ts";
|
|
9
13
|
import { printProjectsVerb } from "./verbs/print-projects.ts";
|
|
@@ -12,8 +16,9 @@ import { printRootsVerb } from "./verbs/print-roots.ts";
|
|
|
12
16
|
import { ANALYZE_OPTIONS, analyzeVerb } from "./verbs/analyze.ts";
|
|
13
17
|
import { describeVerb } from "./verbs/describe.ts";
|
|
14
18
|
import { EXPLAIN_OPTIONS, explainVerb } from "./verbs/explain.ts";
|
|
15
|
-
import {
|
|
19
|
+
import { type Verb, type VerbOptions } from "./verbs/verb.ts";
|
|
16
20
|
import { versionVerb } from "./verbs/version.ts";
|
|
21
|
+
import { diagnose, message, PRODUCT } from "./product.ts";
|
|
17
22
|
|
|
18
23
|
/** One output stream of the command line. `process.stdout` and `process.stderr` satisfy it. */
|
|
19
24
|
export interface Writer {
|
|
@@ -36,7 +41,7 @@ const VERBS: readonly {
|
|
|
36
41
|
{ name: "version", run: versionVerb },
|
|
37
42
|
];
|
|
38
43
|
|
|
39
|
-
const USAGE = `usage:
|
|
44
|
+
const USAGE = `usage: ${PRODUCT} <verb> [options]\nverbs: ${VERBS.map((verb) => verb.name).join(", ")}\n`;
|
|
40
45
|
|
|
41
46
|
/**
|
|
42
47
|
* The tokens whose presence in an option's name makes that option a request to
|
|
@@ -46,33 +51,16 @@ const USAGE = `usage: deadset-ts <verb> [options]\nverbs: ${VERBS.map((verb) =>
|
|
|
46
51
|
const SOURCE_EDIT_TOKENS = ["fix", "edit", "delete", "rewrite"] as const;
|
|
47
52
|
|
|
48
53
|
/**
|
|
49
|
-
* Maps an option name to the setting of the Contract's configuration schema it supplies
|
|
50
|
-
*
|
|
51
|
-
* the spelling the setting's provenance names. The name is this command's vocabulary and
|
|
52
|
-
* is never derived from the path: a setting reaches the command line only by an entry,
|
|
53
|
-
* and a path names a key the schema declares.
|
|
54
|
+
* Maps an option name to the setting of the Contract's configuration schema it supplies:
|
|
55
|
+
* the options contract/settings.json names for a setting this analyzer reads.
|
|
54
56
|
*/
|
|
55
|
-
export const SETTING_OPTIONS: ReadonlyMap<string, string> = new Map(
|
|
56
|
-
[
|
|
57
|
-
|
|
58
|
-
["cascade", "reporters.cascade"],
|
|
59
|
-
["max-findings", "reporters.max_findings"],
|
|
60
|
-
["fail-on", "reporters.fail_on"],
|
|
61
|
-
]);
|
|
57
|
+
export const SETTING_OPTIONS: ReadonlyMap<string, string> = new Map(
|
|
58
|
+
SETTINGS.flatMap((row) => (row.option === undefined ? [] : [[row.option, row.key] as const])),
|
|
59
|
+
);
|
|
62
60
|
|
|
63
61
|
/** The options that take a value and are not settings. */
|
|
64
62
|
const PLAIN_OPTIONS: ReadonlySet<string> = new Set(["target", "config", "central", "scope"]);
|
|
65
63
|
|
|
66
|
-
/**
|
|
67
|
-
* The setting options whose value is an integer rather than a string. A value
|
|
68
|
-
* written other than as digits is passed on as the string it is, so resolution
|
|
69
|
-
* refuses it by its type rather than reading `1e2` as 100.
|
|
70
|
-
*/
|
|
71
|
-
const INTEGER_OPTIONS: ReadonlySet<string> = new Set(["max-findings"]);
|
|
72
|
-
|
|
73
|
-
/** An integer as an option writes it: an optional minus sign and digits alone. */
|
|
74
|
-
const INTEGER_TEXT = /^-?[0-9]+$/u;
|
|
75
|
-
|
|
76
64
|
/** One invocation's options, by name: the last value of each, and every value of a repeatable one. */
|
|
77
65
|
interface Options {
|
|
78
66
|
readonly named: ReadonlyMap<string, string>;
|
|
@@ -107,7 +95,7 @@ function readOptions(args: readonly string[], own: VerbOptions): Options {
|
|
|
107
95
|
const repeated = new Map<string, string[]>();
|
|
108
96
|
for (const arg of args) {
|
|
109
97
|
if (!arg.startsWith("-")) {
|
|
110
|
-
throw new
|
|
98
|
+
throw new UsageError(`unexpected argument ${JSON.stringify(arg)}`);
|
|
111
99
|
}
|
|
112
100
|
const [spelled, ...rest] = arg.split("=");
|
|
113
101
|
const name = (spelled ?? "").replace(/^-+/u, "");
|
|
@@ -117,14 +105,10 @@ function readOptions(args: readonly string[], own: VerbOptions): Options {
|
|
|
117
105
|
!own.plain.includes(name) &&
|
|
118
106
|
!own.repeatable.includes(name)
|
|
119
107
|
) {
|
|
120
|
-
throw new
|
|
108
|
+
throw new UsageError(`unknown option ${JSON.stringify(spelled ?? arg)}`);
|
|
121
109
|
}
|
|
122
110
|
if (rest.length === 0) {
|
|
123
|
-
throw new
|
|
124
|
-
"malformed",
|
|
125
|
-
"",
|
|
126
|
-
`option ${JSON.stringify(spelled ?? arg)} takes a value`,
|
|
127
|
-
);
|
|
111
|
+
throw new UsageError(`option ${JSON.stringify(spelled ?? arg)} takes a value`);
|
|
128
112
|
}
|
|
129
113
|
const value = rest.join("=");
|
|
130
114
|
named.set(name, value);
|
|
@@ -133,51 +117,56 @@ function readOptions(args: readonly string[], own: VerbOptions): Options {
|
|
|
133
117
|
return { named, repeated };
|
|
134
118
|
}
|
|
135
119
|
|
|
136
|
-
|
|
120
|
+
/** The document an option names. */
|
|
121
|
+
function documentAt(host: Host, label: string): Document {
|
|
137
122
|
try {
|
|
138
|
-
|
|
123
|
+
const path = resolvePath(host.workingDirectory(), label);
|
|
124
|
+
// A file past the bound reads as one byte more than it, which resolution refuses.
|
|
125
|
+
return { text: host.readFile(path, CONFIG_MAX_BYTES + 1), label };
|
|
139
126
|
} catch (error: unknown) {
|
|
140
|
-
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
throw new ConfigError(
|
|
144
|
-
"malformed",
|
|
145
|
-
"",
|
|
146
|
-
`${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
147
|
-
);
|
|
127
|
+
throw new UsageError(`${label}: ${message(error)}`);
|
|
148
128
|
}
|
|
149
129
|
}
|
|
150
130
|
|
|
151
131
|
/**
|
|
152
|
-
* The configuration
|
|
153
|
-
*
|
|
154
|
-
|
|
132
|
+
* The repository configuration at the target root, none where it is absent. One that
|
|
133
|
+
* cannot be read is a configuration document that cannot be, refused with the usage code.
|
|
134
|
+
*/
|
|
135
|
+
function repositoryAt(host: Host, target: string): Document | undefined {
|
|
136
|
+
const label = joinPath(target, REPOSITORY_DOCUMENT);
|
|
137
|
+
const root = resolvePath(host.workingDirectory(), target);
|
|
138
|
+
const text = readTargetDocument(
|
|
139
|
+
host,
|
|
140
|
+
root,
|
|
141
|
+
REPOSITORY_DOCUMENT,
|
|
142
|
+
label,
|
|
143
|
+
(named, reason) => new UsageError(`${named}: ${reason}`),
|
|
144
|
+
);
|
|
145
|
+
return text === undefined ? undefined : { text, label };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The configuration sources one invocation carries: the repository configuration at
|
|
150
|
+
* the target root or the path an option named, the central configuration, and the
|
|
151
|
+
* text each setting option was given.
|
|
155
152
|
*/
|
|
156
153
|
function inputsOf(host: Host, options: Options): Inputs {
|
|
157
|
-
const target = options.named.get("target") ?? ".";
|
|
158
154
|
const named = options.named.get("config");
|
|
159
|
-
const
|
|
160
|
-
const repository =
|
|
155
|
+
const target = options.named.get("target") ?? ".";
|
|
156
|
+
const repository = named === undefined ? repositoryAt(host, target) : documentAt(host, named);
|
|
161
157
|
const centralLabel = options.named.get("central");
|
|
162
|
-
const central = centralLabel === undefined ? undefined :
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
const flagLabels = new Map<string, string>();
|
|
166
|
-
for (const [name, path] of SETTING_OPTIONS) {
|
|
158
|
+
const central = centralLabel === undefined ? undefined : documentAt(host, centralLabel);
|
|
159
|
+
const flags = new Map<string, string>();
|
|
160
|
+
for (const [name, key] of SETTING_OPTIONS) {
|
|
167
161
|
const value = options.named.get(name);
|
|
168
|
-
if (value
|
|
169
|
-
|
|
162
|
+
if (value !== undefined) {
|
|
163
|
+
flags.set(key, value);
|
|
170
164
|
}
|
|
171
|
-
flat[path] = INTEGER_OPTIONS.has(name) && INTEGER_TEXT.test(value) ? Number(value) : value;
|
|
172
|
-
flagLabels.set(path, `--${name}`);
|
|
173
165
|
}
|
|
174
|
-
const flags = Object.keys(flat).length === 0 ? undefined : JSON.stringify(flat);
|
|
175
|
-
|
|
176
166
|
return {
|
|
177
|
-
|
|
178
|
-
...(repository === undefined ? {} : { repository
|
|
179
|
-
...(central === undefined
|
|
180
|
-
flagLabels,
|
|
167
|
+
flags,
|
|
168
|
+
...(repository === undefined ? {} : { repository }),
|
|
169
|
+
...(central === undefined ? {} : { central }),
|
|
181
170
|
};
|
|
182
171
|
}
|
|
183
172
|
|
|
@@ -195,9 +184,7 @@ function scopeOf(host: Host, options: Options): Scope {
|
|
|
195
184
|
* the exit code: 0 for a completed verb, 1 for a finding that fails the run, 2 for a
|
|
196
185
|
* usage error, a requested source edit or a refused configuration, 3 for a failure that
|
|
197
186
|
* produced no answer. It writes nothing outside `out` and `err` and never exits the
|
|
198
|
-
* process.
|
|
199
|
-
* `openClient` opens the compiler client; a caller that watches what a run reads
|
|
200
|
-
* supplies its own of either.
|
|
187
|
+
* process. A caller that watches what a run reads supplies its own `host` or `openClient`.
|
|
201
188
|
*/
|
|
202
189
|
export function run(
|
|
203
190
|
args: readonly string[],
|
|
@@ -208,9 +195,7 @@ export function run(
|
|
|
208
195
|
): number {
|
|
209
196
|
const editing = sourceEditOption(args);
|
|
210
197
|
if (editing !== undefined) {
|
|
211
|
-
err
|
|
212
|
-
`deadset-ts: ${editing} is not supported: deadset-ts reports and never edits a source file\n`,
|
|
213
|
-
);
|
|
198
|
+
diagnose(err, `${editing} is not supported: ${PRODUCT} reports and never edits a source file`);
|
|
214
199
|
err.write(USAGE);
|
|
215
200
|
return EXIT_USAGE;
|
|
216
201
|
}
|
|
@@ -227,7 +212,7 @@ export function run(
|
|
|
227
212
|
);
|
|
228
213
|
}
|
|
229
214
|
if (name !== undefined) {
|
|
230
|
-
err
|
|
215
|
+
diagnose(err, `unknown verb ${JSON.stringify(name)}`);
|
|
231
216
|
}
|
|
232
217
|
err.write(USAGE);
|
|
233
218
|
return EXIT_USAGE;
|
|
@@ -259,7 +244,7 @@ function invoke(
|
|
|
259
244
|
openClient: (config) => {
|
|
260
245
|
opened = openClient({
|
|
261
246
|
collectTiming: false,
|
|
262
|
-
components: { extensions: config.ts.
|
|
247
|
+
components: { extensions: config.ts.component_extensions, host: streams.host },
|
|
263
248
|
});
|
|
264
249
|
return opened;
|
|
265
250
|
},
|
|
@@ -270,29 +255,28 @@ function invoke(
|
|
|
270
255
|
}
|
|
271
256
|
}
|
|
272
257
|
|
|
273
|
-
/**
|
|
258
|
+
/**
|
|
259
|
+
* Turns one refusal into the exit code the Contract's table gives it. An error no class names
|
|
260
|
+
* is a fault of this analyzer, printed with its stack for the maintainers it asks the user to
|
|
261
|
+
* report it to.
|
|
262
|
+
*/
|
|
274
263
|
function refuse(error: unknown, err: Writer): number {
|
|
275
|
-
if (error instanceof
|
|
276
|
-
err
|
|
264
|
+
if (error instanceof UsageError) {
|
|
265
|
+
diagnose(err, error.message);
|
|
277
266
|
err.write(USAGE);
|
|
278
267
|
return EXIT_USAGE;
|
|
279
268
|
}
|
|
280
|
-
if (error instanceof
|
|
281
|
-
|
|
282
|
-
err.write(`${
|
|
269
|
+
if (!(error instanceof FailureExit)) {
|
|
270
|
+
if (error instanceof Error && error.stack !== undefined) {
|
|
271
|
+
err.write(`${error.stack}\n`);
|
|
283
272
|
}
|
|
284
|
-
|
|
285
|
-
return EXIT_FAILURE;
|
|
273
|
+
return refuse(productFault(`meets an error none of its classes names: ${message(error)}`), err);
|
|
286
274
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
err.write(`${setupLine(failure)}\n`);
|
|
290
|
-
}
|
|
291
|
-
return EXIT_FAILURE;
|
|
275
|
+
for (const diagnostic of error.diagnostics) {
|
|
276
|
+
err.write(`${renderDiagnostic(diagnostic)}\n`);
|
|
292
277
|
}
|
|
293
|
-
|
|
294
|
-
err.write(
|
|
295
|
-
return EXIT_FAILURE;
|
|
278
|
+
for (const line of failureLines(error.failures)) {
|
|
279
|
+
err.write(`${line}\n`);
|
|
296
280
|
}
|
|
297
|
-
|
|
281
|
+
return EXIT_FAILURE;
|
|
298
282
|
}
|