@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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The loads of a project's production files whose target the analysis cannot resolve: an
|
|
3
|
+
* `import()` or `require()` call whose path is computed and starts with no relative literal
|
|
4
|
+
* naming a directory below the calling file's. The files such a load runs are roots the
|
|
5
|
+
* analysis does not see, so the configuration's roots are never complete.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
isBinaryExpression,
|
|
10
|
+
isCallExpression,
|
|
11
|
+
isIdentifier,
|
|
12
|
+
isNoSubstitutionTemplateLiteral,
|
|
13
|
+
isStringLiteral,
|
|
14
|
+
isTemplateExpression,
|
|
15
|
+
SyntaxKind,
|
|
16
|
+
type Node,
|
|
17
|
+
} from "@typescript/native/ast";
|
|
18
|
+
import { dirnamePath, relativePath, resolvePath } from "./paths.ts";
|
|
19
|
+
import { renderPosition, type Position } from "./position.ts";
|
|
20
|
+
import { UNANSWERED } from "./query.ts";
|
|
21
|
+
import type { ProjectView } from "./session.ts";
|
|
22
|
+
import { sourceFilesOf } from "./source-files.ts";
|
|
23
|
+
import { unwrapped } from "./unwrap.ts";
|
|
24
|
+
|
|
25
|
+
/** One load the analysis cannot resolve, in the configuration whose production file writes it. */
|
|
26
|
+
export interface UnseenLoad {
|
|
27
|
+
readonly configuration: string;
|
|
28
|
+
/** The position of the call. */
|
|
29
|
+
readonly position: Position;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** The literal text a computed path starts with: a template's head, or a concatenation's first literal. */
|
|
33
|
+
export function leadingLiteral(node: Node): string | undefined {
|
|
34
|
+
const at = unwrapped(node);
|
|
35
|
+
if (isTemplateExpression(at)) {
|
|
36
|
+
return at.head.text;
|
|
37
|
+
}
|
|
38
|
+
if (isBinaryExpression(at) && at.operatorToken.kind === SyntaxKind.PlusToken) {
|
|
39
|
+
const left = unwrapped(at.left);
|
|
40
|
+
return isStringLiteral(left) || isNoSubstitutionTemplateLiteral(left)
|
|
41
|
+
? left.text
|
|
42
|
+
: leadingLiteral(at.left);
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The directory below `dir` a computed load's leading literal names, which the entry
|
|
49
|
+
* rules root every file of, or none where it names a package, `dir` itself or a
|
|
50
|
+
* directory holding it, each of which would name files no rule roots.
|
|
51
|
+
*/
|
|
52
|
+
export function computedLoadDirectory(dir: string, prefix: string): string | undefined {
|
|
53
|
+
if (!(prefix.startsWith("./") || prefix.startsWith("../")) || !prefix.endsWith("/")) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const target = resolvePath(dir, prefix);
|
|
57
|
+
return target === dir || relativePath(target, dir) !== undefined ? undefined : target;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Whether a computed path's leading literal names a package, whose files are none of the target's. */
|
|
61
|
+
function namesPackage(prefix: string | undefined): boolean {
|
|
62
|
+
return (
|
|
63
|
+
prefix !== undefined &&
|
|
64
|
+
prefix !== "" &&
|
|
65
|
+
!prefix.startsWith(".") &&
|
|
66
|
+
!prefix.startsWith("/") &&
|
|
67
|
+
!/^[A-Za-z][A-Za-z\d+.-]*:/u.test(prefix)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Every unresolved load the project's production files write, in file then source order.
|
|
73
|
+
* `testFiles` holds the test files by their path below the target root. A `require` call
|
|
74
|
+
* loads a module only where the name resolves to no declaration of the project's own
|
|
75
|
+
* files: one the project declares is its own function.
|
|
76
|
+
*/
|
|
77
|
+
export function unseenLoadsOf<Brand>(
|
|
78
|
+
project: ProjectView<Brand>,
|
|
79
|
+
configuration: string,
|
|
80
|
+
targetRoot: string,
|
|
81
|
+
testFiles: readonly string[],
|
|
82
|
+
): readonly UnseenLoad[] {
|
|
83
|
+
const tests = new Set(testFiles);
|
|
84
|
+
const sites: { readonly position: Position; readonly require: Node | undefined }[] = [];
|
|
85
|
+
for (const [path, file] of sourceFilesOf(project, targetRoot).byPath) {
|
|
86
|
+
if (tests.has(path) || file.isDeclarationFile) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const dir = dirnamePath(file.fileName);
|
|
90
|
+
const visit = (node: Node): void => {
|
|
91
|
+
if (isCallExpression(node)) {
|
|
92
|
+
const callee = node.expression;
|
|
93
|
+
const required = isIdentifier(callee) && callee.text === "require";
|
|
94
|
+
const [first] = node.arguments;
|
|
95
|
+
const argument = first === undefined ? undefined : unwrapped(first);
|
|
96
|
+
if (
|
|
97
|
+
(callee.kind === SyntaxKind.ImportKeyword || required) &&
|
|
98
|
+
argument !== undefined &&
|
|
99
|
+
!isStringLiteral(argument) &&
|
|
100
|
+
!isNoSubstitutionTemplateLiteral(argument)
|
|
101
|
+
) {
|
|
102
|
+
const prefix = leadingLiteral(argument);
|
|
103
|
+
const seen =
|
|
104
|
+
namesPackage(prefix) ||
|
|
105
|
+
(prefix !== undefined && computedLoadDirectory(dir, prefix) !== undefined);
|
|
106
|
+
if (!seen) {
|
|
107
|
+
sites.push({
|
|
108
|
+
position: renderPosition(file, targetRoot, node.getStart()),
|
|
109
|
+
require: required ? callee : undefined,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
node.forEachChild(visit);
|
|
115
|
+
};
|
|
116
|
+
file.forEachChild(visit);
|
|
117
|
+
}
|
|
118
|
+
const requires = sites.flatMap((site) => (site.require === undefined ? [] : [site.require]));
|
|
119
|
+
const own = project.ownPaths();
|
|
120
|
+
const local = new Set<Node>();
|
|
121
|
+
project.symbolsAt(requires.map((node) => project.handle(node))).forEach((symbol, at) => {
|
|
122
|
+
const node = requires[at];
|
|
123
|
+
if (
|
|
124
|
+
node !== undefined &&
|
|
125
|
+
symbol !== UNANSWERED &&
|
|
126
|
+
symbol?.declarations.some((handle) => own.has(handle.path)) === true
|
|
127
|
+
) {
|
|
128
|
+
local.add(node);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return sites
|
|
132
|
+
.filter((site) => site.require === undefined || !local.has(site.require))
|
|
133
|
+
.map((site) => ({ configuration, position: site.position }));
|
|
134
|
+
}
|
package/src/unwrap.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isAsExpression,
|
|
3
|
+
isNonNullExpression,
|
|
4
|
+
isParenthesizedExpression,
|
|
5
|
+
isSatisfiesExpression,
|
|
6
|
+
type Expression,
|
|
7
|
+
type Node,
|
|
8
|
+
} from "@typescript/native/ast";
|
|
9
|
+
|
|
10
|
+
/** The expression inside every pair of parentheses around `node`. */
|
|
11
|
+
export function parenthesesRemoved<T extends Node>(node: T): T | Expression {
|
|
12
|
+
let at: T | Expression = node;
|
|
13
|
+
while (isParenthesizedExpression(at)) {
|
|
14
|
+
at = at.expression;
|
|
15
|
+
}
|
|
16
|
+
return at;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The expression inside every wrapper around `node` that changes no value it evaluates to:
|
|
21
|
+
* parentheses, `as` and `satisfies` assertions and the non-null assertion.
|
|
22
|
+
*/
|
|
23
|
+
export function unwrapped<T extends Node>(node: T): T | Expression {
|
|
24
|
+
let at: T | Expression = node;
|
|
25
|
+
while (
|
|
26
|
+
isParenthesizedExpression(at) ||
|
|
27
|
+
isAsExpression(at) ||
|
|
28
|
+
isSatisfiesExpression(at) ||
|
|
29
|
+
isNonNullExpression(at)
|
|
30
|
+
) {
|
|
31
|
+
at = at.expression;
|
|
32
|
+
}
|
|
33
|
+
return at;
|
|
34
|
+
}
|
package/src/usage.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A refusal of the invocation: the fix is to the command line or to a document it
|
|
3
|
+
* names, so the run ends with the usage code before any analysis.
|
|
4
|
+
*/
|
|
5
|
+
export class UsageError extends Error {
|
|
6
|
+
constructor(message: string) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "UsageError";
|
|
9
|
+
}
|
|
10
|
+
}
|