@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
package/dist/src/scope.js
CHANGED
|
@@ -1,150 +1,73 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SCOPE_SCHEMA } from "./contract/config.generated.js";
|
|
2
|
+
import { dotted, locatedFault, placeIn, readStrict, StrictJSONError } from "./json-document.js";
|
|
2
3
|
import { dirnamePath, isAbsolutePath, joinPath, resolvePath } from "./paths.js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { MARKERS } from "./load/discover.js";
|
|
5
|
+
import { failureExit } from "./failure.js";
|
|
6
|
+
import { message } from "./product.js";
|
|
7
|
+
import { firstRefusal } from "./schema.js";
|
|
8
|
+
import { UsageError } from "./usage.js";
|
|
7
9
|
/**
|
|
8
10
|
* A scope document above this length is refused rather than decoded. It names one
|
|
9
11
|
* target and its consumers, so a larger file is not one.
|
|
10
12
|
*/
|
|
11
13
|
const MAX_DOCUMENT_LENGTH = 1 << 20;
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
+
* The bytes read of a scope document. A UTF-16 unit decodes from at most three bytes,
|
|
16
|
+
* so a document past the bound is past it within these.
|
|
15
17
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
this.name = "ScopeError";
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const MODULE = {
|
|
23
|
-
kind: "section",
|
|
24
|
-
members: { id: { kind: "leaf" }, role: { kind: "leaf" }, path: { kind: "leaf" } },
|
|
25
|
-
};
|
|
26
|
-
/** The closed key list of the scope document, compared as bytes. */
|
|
27
|
-
const SCOPE_ROOT = {
|
|
28
|
-
kind: "section",
|
|
29
|
-
members: {
|
|
30
|
-
target: MODULE,
|
|
31
|
-
workspace: { kind: "leaf" },
|
|
32
|
-
consumers: { kind: "list", members: MODULE.members ?? {} },
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
function isRecord(value) {
|
|
36
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* One string member, or undefined where the document omits it. A member the
|
|
40
|
-
* document writes is a string holding at least one character, so `null` and `""`
|
|
41
|
-
* are refused rather than read as absent.
|
|
42
|
-
*/
|
|
43
|
-
function stringMember(parent, name, at) {
|
|
44
|
-
if (!Object.hasOwn(parent, name)) {
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
const value = parent[name];
|
|
48
|
-
if (typeof value !== "string") {
|
|
49
|
-
throw new ScopeError(`scope: ${at === "" ? name : `${at}.${name}`} is not a string`);
|
|
50
|
-
}
|
|
51
|
-
if (value === "") {
|
|
52
|
-
throw new ScopeError(`scope: ${at === "" ? name : `${at}.${name}`} names nothing`);
|
|
53
|
-
}
|
|
54
|
-
return value;
|
|
55
|
-
}
|
|
56
|
-
function readModule(value, at, role, documentDir) {
|
|
57
|
-
if (!isRecord(value)) {
|
|
58
|
-
throw new ScopeError(`scope: ${at} is not an object`);
|
|
59
|
-
}
|
|
60
|
-
const declared = stringMember(value, "role", at);
|
|
61
|
-
if (declared !== undefined && declared !== role) {
|
|
62
|
-
throw new ScopeError(`scope: ${at}.role is ${JSON.stringify(declared)}, want ${JSON.stringify(role)}`);
|
|
63
|
-
}
|
|
64
|
-
const path = stringMember(value, "path", at);
|
|
65
|
-
if (path === undefined) {
|
|
66
|
-
throw new ScopeError(`scope: ${at}.path names nothing`);
|
|
67
|
-
}
|
|
68
|
-
return {
|
|
69
|
-
id: stringMember(value, "id", at) ?? "",
|
|
70
|
-
path: isAbsolutePath(path) ? path : joinPath(documentDir, path),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Walks the document's text against the closed key list, refusing a key the list
|
|
75
|
-
* does not declare, compared as bytes, and a key one object writes twice, which a
|
|
76
|
-
* parse cannot report because it keeps the last value.
|
|
77
|
-
*/
|
|
78
|
-
function checkKeys(text, file) {
|
|
79
|
-
try {
|
|
80
|
-
checkDocument(text, SCOPE_ROOT, `scope: ${file}`);
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
if (error instanceof ConfigError) {
|
|
84
|
-
// The configuration's refusal names the nearest configuration key, which a
|
|
85
|
-
// scope document does not have.
|
|
86
|
-
throw new ScopeError(error.kind === "unimplemented-key"
|
|
87
|
-
? `scope: ${file}: ${error.key} is not a declared key`
|
|
88
|
-
: error.message);
|
|
89
|
-
}
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
18
|
+
const MAX_DOCUMENT_BYTES = 3 * (MAX_DOCUMENT_LENGTH + 1);
|
|
19
|
+
function refusal(file, place, reason) {
|
|
20
|
+
return new UsageError(`scope: ${file}: ${place === "" ? "" : `${place}: `}${reason}`);
|
|
92
21
|
}
|
|
93
22
|
/**
|
|
94
|
-
* Decodes the scope document at `file
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* resolves
|
|
98
|
-
*
|
|
99
|
-
* The `workspace` key the format declares is checked and carries nothing here: it
|
|
100
|
-
* names the file a Go consumer resolves the target through, and a TypeScript
|
|
101
|
-
* project resolves one through its own compiler configuration.
|
|
23
|
+
* Decodes the scope document at `file`, held to the Contract's scope schema, a relative
|
|
24
|
+
* path resolved against the document's own directory. A document that cannot be read or is
|
|
25
|
+
* refused is a usage error, as any document the invocation names. `workspace` is read by Go consumers
|
|
26
|
+
* alone: a TypeScript project resolves the target through its own compiler configuration.
|
|
102
27
|
*/
|
|
103
28
|
export function readScope(host, file) {
|
|
104
29
|
const absolute = resolvePath(host.workingDirectory(), file);
|
|
105
30
|
let text;
|
|
106
31
|
try {
|
|
107
|
-
text = host.readFile(absolute);
|
|
32
|
+
text = host.readFile(absolute, MAX_DOCUMENT_BYTES);
|
|
108
33
|
}
|
|
109
34
|
catch (error) {
|
|
110
|
-
throw new
|
|
35
|
+
throw new UsageError(`scope: ${file}: ${message(error)}`);
|
|
111
36
|
}
|
|
112
37
|
if (text.length > MAX_DOCUMENT_LENGTH) {
|
|
113
|
-
throw new
|
|
38
|
+
throw new UsageError(`scope: ${file} is longer than ${String(MAX_DOCUMENT_LENGTH)} characters`);
|
|
114
39
|
}
|
|
115
40
|
let value;
|
|
116
41
|
try {
|
|
117
|
-
value =
|
|
42
|
+
value = readStrict(text).value;
|
|
118
43
|
}
|
|
119
44
|
catch (error) {
|
|
120
|
-
|
|
45
|
+
if (!(error instanceof StrictJSONError)) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
throw refusal(file, dotted(error.place), locatedFault(text, error));
|
|
121
49
|
}
|
|
122
|
-
|
|
123
|
-
|
|
50
|
+
const refused = firstRefusal(SCOPE_SCHEMA, value);
|
|
51
|
+
if (refused !== undefined) {
|
|
52
|
+
throw refusal(file, dotted(placeIn(value, refused.pointer, refused.member)), refused.reason);
|
|
124
53
|
}
|
|
125
|
-
|
|
126
|
-
stringMember(value, "workspace", "");
|
|
54
|
+
const declared = value;
|
|
127
55
|
const documentDir = dirnamePath(absolute);
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (!Array.isArray(listed)) {
|
|
134
|
-
throw new ScopeError(`scope: ${file}: consumers is not an array`);
|
|
135
|
-
}
|
|
136
|
-
const consumers = listed.map((entry, index) => readModule(entry, `consumers[${String(index)}]`, ROLE_CONSUMER, documentDir));
|
|
137
|
-
return { target, consumers };
|
|
56
|
+
const moduleOf = (module) => ({
|
|
57
|
+
id: module.id ?? "",
|
|
58
|
+
path: isAbsolutePath(module.path) ? module.path : joinPath(documentDir, module.path),
|
|
59
|
+
});
|
|
60
|
+
return { target: moduleOf(declared.target), consumers: (declared.consumers ?? []).map(moduleOf) };
|
|
138
61
|
}
|
|
139
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* The single-package scope one directory is, when no scope document is given. A target that is
|
|
64
|
+
* no directory holds no program.
|
|
65
|
+
*/
|
|
140
66
|
export function scopeForDir(host, dir) {
|
|
141
67
|
const path = resolvePath(host.workingDirectory(), dir);
|
|
142
68
|
const kind = host.kindOf(path);
|
|
143
|
-
if (kind === "absent") {
|
|
144
|
-
throw new ScopeError(`scope: ${path} does not exist`);
|
|
145
|
-
}
|
|
146
69
|
if (kind !== "directory") {
|
|
147
|
-
throw
|
|
70
|
+
throw failureExit("no-program", `the target ${path} ${kind === "absent" ? "does not exist" : "is not a directory"}, so it holds no compiler configuration, no file named ${MARKERS.join(", ")}: name the directory that holds one`);
|
|
148
71
|
}
|
|
149
72
|
return { target: { id: "", path }, consumers: [] };
|
|
150
73
|
}
|