@cplieger/deadset-ts 8.0.0-dev.15 → 8.0.0-dev.17
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/dist/src/alias-chain.js +0 -5
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +94 -54
- package/dist/src/augmentations.js +23 -24
- package/dist/src/bindings.js +382 -0
- package/dist/src/calls.js +25 -8
- package/dist/src/commands/read.js +6 -7
- package/dist/src/commands/tools.js +5 -9
- package/dist/src/component-files.js +3 -2
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +9 -10
- package/dist/src/contextual-uses.js +1 -17
- package/dist/src/contract/config.generated.js +5 -2
- package/dist/src/contract/contract.generated.js +119 -2
- package/dist/src/contract/report.generated.js +6 -2
- package/dist/src/dependencies.js +98 -71
- package/dist/src/destructuring.js +1 -19
- package/dist/src/element-access.js +179 -164
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +22 -64
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +120 -27
- package/dist/src/entries/conventions.js +739 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +9 -12
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +3 -3
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +684 -0
- package/dist/src/{workflow-steps.js → entries/workflow-steps.js} +18 -8
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/findings/completion.js +40 -4
- package/dist/src/findings/emitters.js +5 -8
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +2 -2
- package/dist/src/findings/self-check.js +36 -20
- package/dist/src/findings-pass.js +5 -6
- package/dist/src/framework-lifecycle.js +42 -15
- package/dist/src/fs/manifest.js +15 -20
- package/dist/src/generated-file.js +172 -29
- package/dist/src/graph.js +14 -8
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index.js +1 -1
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +1 -1
- package/dist/src/interface-satisfaction.js +1 -1
- package/dist/src/inventory/commonjs.js +62 -17
- package/dist/src/inventory/enumerate.js +2 -1
- package/dist/src/javascript-file.js +26 -11
- package/dist/src/keyof-comparisons.js +124 -103
- package/dist/src/load/classify.js +28 -9
- package/dist/src/load/diagnostics.js +8 -1
- package/dist/src/load/discover.js +15 -7
- package/dist/src/load/expected-module.js +2 -2
- package/dist/src/load/plan.js +2 -2
- package/dist/src/load/specifiers.js +2 -4
- package/dist/src/load/synthesize.js +10 -5
- package/dist/src/load/workspace-manifests.js +1 -1
- package/dist/src/load/workspace-resolution.js +2 -2
- package/dist/src/matrix.js +12 -17
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/paths.js +56 -1
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +151 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +111 -1116
- package/dist/src/resolve.js +1 -1
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +7 -4
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +5 -8
- package/dist/src/{manifest.js → roots/manifest.js} +4 -4
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +489 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/serialization-contract.js +9 -4
- package/dist/src/source-files.js +5 -9
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress.js +30 -32
- package/dist/src/sweep.js +25 -13
- package/dist/src/symbol-keys.js +89 -83
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/verbs/analyze.js +15 -3
- package/dist/src/verbs/describe.js +5 -3
- package/dist/src/verbs/explain.js +50 -28
- package/dist/src/verbs/print-retained.js +2 -2
- package/jsr.json +1 -1
- package/package.json +3 -3
- package/src/alias-chain.ts +0 -7
- package/src/amd.ts +130 -0
- package/src/analysis.ts +156 -70
- package/src/augmentations.ts +41 -27
- package/src/automatic-types.ts +1 -1
- package/src/bindings.ts +460 -0
- package/src/calls.ts +25 -7
- package/src/commands/read.ts +6 -8
- package/src/commands/tools.ts +5 -11
- package/src/component-files.ts +4 -2
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +12 -11
- package/src/contextual-uses.ts +2 -22
- package/src/contract/config.generated.ts +5 -2
- package/src/contract/contract.generated.ts +138 -2
- package/src/contract/report.generated.ts +6 -2
- package/src/dependencies.ts +117 -71
- package/src/destructuring.ts +1 -31
- package/src/element-access.ts +188 -182
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +33 -82
- package/src/{convention-rows.ts → entries/convention-rows.ts} +167 -28
- package/src/{conventions.ts → entries/conventions.ts} +349 -523
- package/src/{html-entries.ts → entries/html-entries.ts} +19 -18
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +5 -5
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +868 -0
- package/src/{workflow-steps.ts → entries/workflow-steps.ts} +29 -11
- package/src/exempt.ts +3 -2
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/file-facts.ts +1 -1
- package/src/findings/boundary.ts +2 -0
- package/src/findings/completion.ts +43 -4
- package/src/findings/emitter.ts +1 -1
- package/src/findings/emitters.ts +14 -10
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +3 -3
- package/src/findings/self-check.ts +41 -22
- package/src/findings/visibility-narrowing.ts +1 -1
- package/src/findings-pass.ts +5 -12
- package/src/framework-lifecycle.ts +43 -15
- package/src/fs/manifest.ts +25 -21
- package/src/generated-file.ts +240 -36
- package/src/graph.ts +27 -11
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index.ts +1 -1
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +1 -1
- package/src/interface-satisfaction.ts +1 -1
- package/src/inventory/commonjs.ts +102 -17
- package/src/inventory/enumerate.ts +2 -1
- package/src/javascript-file.ts +29 -12
- package/src/keyof-comparisons.ts +131 -116
- package/src/load/classify.ts +49 -13
- package/src/load/diagnostics.ts +11 -1
- package/src/load/discover.ts +27 -11
- package/src/load/expected-module.ts +8 -2
- package/src/load/plan.ts +11 -2
- package/src/load/specifiers.ts +8 -5
- package/src/load/synthesize.ts +12 -6
- package/src/load/test-globals.ts +1 -1
- package/src/load/workspace-manifests.ts +1 -1
- package/src/load/workspace-resolution.ts +9 -2
- package/src/load/workspace-run.ts +1 -1
- package/src/matrix.ts +13 -17
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/paths.ts +65 -1
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +213 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +174 -1492
- package/src/report.ts +2 -2
- package/src/resolve.ts +1 -1
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +10 -7
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +5 -8
- package/src/{manifest.ts → roots/manifest.ts} +5 -5
- package/src/roots/published-reach.ts +481 -0
- package/src/{roots.ts → roots/root-set.ts} +203 -630
- package/src/roots/unseen-loads.ts +345 -0
- package/src/serialization-contract.ts +9 -4
- package/src/source-files.ts +5 -10
- package/src/stores.ts +13 -2
- package/src/suppress.ts +48 -33
- package/src/sweep.ts +37 -14
- package/src/symbol-keys.ts +102 -102
- package/src/tests/file-class.ts +118 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/verbs/analyze.ts +19 -5
- package/src/verbs/describe.ts +5 -2
- package/src/verbs/explain.ts +75 -32
- package/src/verbs/print-retained.ts +2 -2
- package/dist/src/build-scripts.js +0 -418
- package/dist/src/conventions.js +0 -907
- package/dist/src/entry-points.js +0 -444
- package/dist/src/own-body.js +0 -28
- package/dist/src/roots.js +0 -865
- package/dist/src/unseen-loads.js +0 -189
- package/src/build-scripts.ts +0 -536
- package/src/entry-points.ts +0 -584
- package/src/own-body.ts +0 -42
- package/src/unseen-loads.ts +0 -282
package/dist/src/unseen-loads.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The loads by a computed path: those whose files the analysis resolves, and those of a
|
|
3
|
-
* project's production files it cannot resolve, an `import()` or `require()` call whose
|
|
4
|
-
* path starts with no relative literal naming a directory below the calling file's. The
|
|
5
|
-
* files such a load runs are roots the analysis does not see, so the configuration's
|
|
6
|
-
* roots are never complete.
|
|
7
|
-
*/
|
|
8
|
-
import { isBinaryExpression, isCallExpression, isIdentifier, isMetaProperty, isNoSubstitutionTemplateLiteral, isObjectLiteralExpression, isPropertyAccessExpression, isPropertyAssignment, isStringLiteral, isTemplateExpression, SyntaxKind, } from "@typescript/native/ast";
|
|
9
|
-
import { literalsOf } from "./entry-points.js";
|
|
10
|
-
import { hasOwnBody } from "./own-body.js";
|
|
11
|
-
import { dirnamePath, relativePath, resolvePath } from "./paths.js";
|
|
12
|
-
import { renderPosition } from "./position.js";
|
|
13
|
-
import { sourceFilesOf } from "./source-files.js";
|
|
14
|
-
import { unwrapped } from "./unwrap.js";
|
|
15
|
-
import { globExpression } from "./text/glob.js";
|
|
16
|
-
/** The literal text a computed path starts with: a template's head, or a concatenation's first literal. */
|
|
17
|
-
function leadingLiteral(node) {
|
|
18
|
-
const at = unwrapped(node);
|
|
19
|
-
if (isTemplateExpression(at)) {
|
|
20
|
-
return at.head.text;
|
|
21
|
-
}
|
|
22
|
-
if (isBinaryExpression(at) && at.operatorToken.kind === SyntaxKind.PlusToken) {
|
|
23
|
-
const left = unwrapped(at.left);
|
|
24
|
-
return isStringLiteral(left) || isNoSubstitutionTemplateLiteral(left)
|
|
25
|
-
? left.text
|
|
26
|
-
: leadingLiteral(at.left);
|
|
27
|
-
}
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* The directory below `dir` a computed load's leading literal names, every file of which
|
|
32
|
-
* the load reaches, or none where it names a package, `dir` itself or a directory holding
|
|
33
|
-
* it, each of which would name every sibling.
|
|
34
|
-
*/
|
|
35
|
-
function computedLoadDirectory(dir, prefix) {
|
|
36
|
-
if (!(prefix.startsWith("./") || prefix.startsWith("../")) || !prefix.endsWith("/")) {
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
const target = resolvePath(dir, prefix);
|
|
40
|
-
return target === dir || relativePath(target, dir) !== undefined ? undefined : target;
|
|
41
|
-
}
|
|
42
|
-
/** Whether one node is a call that may load a module by a computed path. */
|
|
43
|
-
export function isLoadCall(node) {
|
|
44
|
-
if (!isCallExpression(node)) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
const callee = node.expression;
|
|
48
|
-
return (callee.kind === SyntaxKind.ImportKeyword ||
|
|
49
|
-
(isIdentifier(callee) && callee.text === "require") ||
|
|
50
|
-
isMetaGlob(node));
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* The resolved computed loads among one file's load calls, each loading the `candidates`
|
|
54
|
-
* but the file itself: an `import()` or `require()` whose path starts with a relative
|
|
55
|
-
* literal naming a directory below the file's, every candidate below it, and an
|
|
56
|
-
* `import.meta.glob` of relative literal globs, every candidate one matches, each read
|
|
57
|
-
* against the file's directory, as a bundler's context module reads them.
|
|
58
|
-
*/
|
|
59
|
-
export function computedLoadsOf(file, calls, candidates) {
|
|
60
|
-
const dir = dirnamePath(file.fileName);
|
|
61
|
-
const others = candidates.filter((candidate) => candidate.file !== file);
|
|
62
|
-
return calls.flatMap(({ call, from }) => {
|
|
63
|
-
const [first, options] = call.arguments;
|
|
64
|
-
if (first === undefined) {
|
|
65
|
-
return [];
|
|
66
|
-
}
|
|
67
|
-
if (isMetaGlob(call)) {
|
|
68
|
-
const globs = (literalsOf(first) ?? [])
|
|
69
|
-
.filter((pattern) => pattern.startsWith("./") || pattern.startsWith("../"))
|
|
70
|
-
.map((pattern) => globExpression(resolvePath(dir, pattern)));
|
|
71
|
-
const files = others.filter((candidate) => globs.some((glob) => glob.test(candidate.file.fileName)));
|
|
72
|
-
const asset = readsAsAsset(options);
|
|
73
|
-
return [{ call, from, require: undefined, files, asset, eager: isEager(options) }];
|
|
74
|
-
}
|
|
75
|
-
const prefix = leadingLiteral(first);
|
|
76
|
-
const target = prefix === undefined ? undefined : computedLoadDirectory(dir, prefix);
|
|
77
|
-
if (target === undefined) {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
const files = others.filter((candidate) => relativePath(target, candidate.file.fileName) !== undefined);
|
|
81
|
-
const callee = call.expression;
|
|
82
|
-
const require = isIdentifier(callee) ? callee : undefined;
|
|
83
|
-
return [{ call, from, require, files, asset: false, eager: false }];
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
/** Whether one call is `import.meta.glob(...)`. */
|
|
87
|
-
function isMetaGlob(node) {
|
|
88
|
-
if (!isPropertyAccessExpression(node.expression)) {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
const { expression, name } = node.expression;
|
|
92
|
-
return (isIdentifier(name) &&
|
|
93
|
-
name.text === "glob" &&
|
|
94
|
-
isMetaProperty(expression) &&
|
|
95
|
-
expression.keywordToken === SyntaxKind.ImportKeyword);
|
|
96
|
-
}
|
|
97
|
-
/** The values an `import.meta.glob` options object assigns, each by its literal key. */
|
|
98
|
-
function globOptions(options) {
|
|
99
|
-
const literal = options === undefined ? undefined : unwrapped(options);
|
|
100
|
-
if (literal === undefined || !isObjectLiteralExpression(literal)) {
|
|
101
|
-
return [];
|
|
102
|
-
}
|
|
103
|
-
return literal.properties.flatMap((property) => isPropertyAssignment(property) &&
|
|
104
|
-
(isIdentifier(property.name) || isStringLiteral(property.name))
|
|
105
|
-
? [[property.name.text, unwrapped(property.initializer)]]
|
|
106
|
-
: []);
|
|
107
|
-
}
|
|
108
|
-
/** Whether the options of an `import.meta.glob` set `eager` to `true`. */
|
|
109
|
-
function isEager(options) {
|
|
110
|
-
return globOptions(options).some(([key, value]) => key === "eager" && value.kind === SyntaxKind.TrueKeyword);
|
|
111
|
-
}
|
|
112
|
-
/** The query parameters that make Vite load a file as its text or its URL, each written bare. */
|
|
113
|
-
const ASSET_QUERY = /(?:^\?|&)(?:raw|url|inline)(?:&|$)/u;
|
|
114
|
-
/**
|
|
115
|
-
* Whether the options of an `import.meta.glob` read each file as text or as a URL: a
|
|
116
|
-
* `query` string holding a bare `raw`, `url` or `inline`, or an `as` of `raw` or `url`,
|
|
117
|
-
* which Vite reads as that query (https://vite.dev/guide/features.html#glob-import). Any
|
|
118
|
-
* other query is read as loading the module, which keeps more than it may.
|
|
119
|
-
*/
|
|
120
|
-
function readsAsAsset(options) {
|
|
121
|
-
return globOptions(options).some(([key, value]) => {
|
|
122
|
-
if (!isStringLiteral(value) && !isNoSubstitutionTemplateLiteral(value)) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
if (key === "as") {
|
|
126
|
-
return value.text === "raw" || value.text === "url";
|
|
127
|
-
}
|
|
128
|
-
return (key === "query" &&
|
|
129
|
-
ASSET_QUERY.test(value.text.startsWith("?") ? value.text : `?${value.text}`));
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
/** Whether a computed path's leading literal names a package, whose files are none of the target's. */
|
|
133
|
-
function namesPackage(prefix) {
|
|
134
|
-
return (prefix !== undefined &&
|
|
135
|
-
prefix !== "" &&
|
|
136
|
-
!prefix.startsWith(".") &&
|
|
137
|
-
!prefix.startsWith("/") &&
|
|
138
|
-
!/^[A-Za-z][A-Za-z\d+.-]*:/u.test(prefix));
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Every unresolved load the project's production files write, in file then source order.
|
|
142
|
-
* `testFiles` holds the test files by their path below the target root. A `require` call
|
|
143
|
-
* loads a module unless {@link hasOwnBody} reads it as the project's own function.
|
|
144
|
-
*/
|
|
145
|
-
export function unseenLoadsOf(project, configuration, targetRoot, testFiles) {
|
|
146
|
-
const tests = new Set(testFiles);
|
|
147
|
-
const sites = [];
|
|
148
|
-
for (const [path, file] of sourceFilesOf(project, targetRoot).byPath) {
|
|
149
|
-
if (tests.has(path) || file.isDeclarationFile) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
const dir = dirnamePath(file.fileName);
|
|
153
|
-
const visit = (node) => {
|
|
154
|
-
if (isCallExpression(node)) {
|
|
155
|
-
const callee = node.expression;
|
|
156
|
-
const required = isIdentifier(callee) && callee.text === "require";
|
|
157
|
-
const [first] = node.arguments;
|
|
158
|
-
const argument = first === undefined ? undefined : unwrapped(first);
|
|
159
|
-
if ((callee.kind === SyntaxKind.ImportKeyword || required) &&
|
|
160
|
-
argument !== undefined &&
|
|
161
|
-
!isStringLiteral(argument) &&
|
|
162
|
-
!isNoSubstitutionTemplateLiteral(argument)) {
|
|
163
|
-
const prefix = leadingLiteral(argument);
|
|
164
|
-
const seen = namesPackage(prefix) ||
|
|
165
|
-
(prefix !== undefined && computedLoadDirectory(dir, prefix) !== undefined);
|
|
166
|
-
if (!seen) {
|
|
167
|
-
sites.push({
|
|
168
|
-
position: renderPosition(file, targetRoot, node.getStart()),
|
|
169
|
-
require: required ? callee : undefined,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
node.forEachChild(visit);
|
|
175
|
-
};
|
|
176
|
-
file.forEachChild(visit);
|
|
177
|
-
}
|
|
178
|
-
const requires = sites.flatMap((site) => (site.require === undefined ? [] : [site.require]));
|
|
179
|
-
const local = new Set();
|
|
180
|
-
project.symbolsAt(requires.map((node) => project.handle(node))).forEach((symbol, at) => {
|
|
181
|
-
const node = requires[at];
|
|
182
|
-
if (node !== undefined && typeof symbol === "object" && hasOwnBody(project, symbol)) {
|
|
183
|
-
local.add(node);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
return sites
|
|
187
|
-
.filter((site) => site.require === undefined || !local.has(site.require))
|
|
188
|
-
.map((site) => ({ configuration, position: site.position }));
|
|
189
|
-
}
|