@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.
Files changed (207) hide show
  1. package/dist/src/alias-chain.js +0 -5
  2. package/dist/src/amd.js +81 -0
  3. package/dist/src/analysis.js +94 -54
  4. package/dist/src/augmentations.js +23 -24
  5. package/dist/src/bindings.js +382 -0
  6. package/dist/src/calls.js +25 -8
  7. package/dist/src/commands/read.js +6 -7
  8. package/dist/src/commands/tools.js +5 -9
  9. package/dist/src/component-files.js +3 -2
  10. package/dist/src/conformance-record.js +1 -1
  11. package/dist/src/consumers.js +9 -10
  12. package/dist/src/contextual-uses.js +1 -17
  13. package/dist/src/contract/config.generated.js +5 -2
  14. package/dist/src/contract/contract.generated.js +119 -2
  15. package/dist/src/contract/report.generated.js +6 -2
  16. package/dist/src/dependencies.js +98 -71
  17. package/dist/src/destructuring.js +1 -19
  18. package/dist/src/element-access.js +179 -164
  19. package/dist/src/entries/build-scripts.js +222 -0
  20. package/dist/src/{configuration-files.js → entries/configuration-files.js} +22 -64
  21. package/dist/src/{convention-rows.js → entries/convention-rows.js} +120 -27
  22. package/dist/src/entries/conventions.js +739 -0
  23. package/dist/src/{html-entries.js → entries/html-entries.js} +9 -12
  24. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +3 -3
  25. package/dist/src/entries/run-directories.js +77 -0
  26. package/dist/src/entries/sources.js +144 -0
  27. package/dist/src/entries/static-module.js +670 -0
  28. package/dist/src/entries/test-runners.js +684 -0
  29. package/dist/src/{workflow-steps.js → entries/workflow-steps.js} +18 -8
  30. package/dist/src/extensions.js +37 -0
  31. package/dist/src/facts.js +38 -0
  32. package/dist/src/findings/completion.js +40 -4
  33. package/dist/src/findings/emitters.js +5 -8
  34. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  35. package/dist/src/{in-operands.js → findings/in-operands.js} +2 -2
  36. package/dist/src/findings/self-check.js +36 -20
  37. package/dist/src/findings-pass.js +5 -6
  38. package/dist/src/framework-lifecycle.js +42 -15
  39. package/dist/src/fs/manifest.js +15 -20
  40. package/dist/src/generated-file.js +172 -29
  41. package/dist/src/graph.js +14 -8
  42. package/dist/src/import-bindings.js +73 -28
  43. package/dist/src/index/sites.js +557 -0
  44. package/dist/src/index.js +1 -1
  45. package/dist/src/indexed-access.js +523 -478
  46. package/dist/src/injection-container.js +1 -1
  47. package/dist/src/interface-satisfaction.js +1 -1
  48. package/dist/src/inventory/commonjs.js +62 -17
  49. package/dist/src/inventory/enumerate.js +2 -1
  50. package/dist/src/javascript-file.js +26 -11
  51. package/dist/src/keyof-comparisons.js +124 -103
  52. package/dist/src/load/classify.js +28 -9
  53. package/dist/src/load/diagnostics.js +8 -1
  54. package/dist/src/load/discover.js +15 -7
  55. package/dist/src/load/expected-module.js +2 -2
  56. package/dist/src/load/plan.js +2 -2
  57. package/dist/src/load/specifiers.js +2 -4
  58. package/dist/src/load/synthesize.js +10 -5
  59. package/dist/src/load/workspace-manifests.js +1 -1
  60. package/dist/src/load/workspace-resolution.js +2 -2
  61. package/dist/src/matrix.js +12 -17
  62. package/dist/src/module-declarations.js +70 -85
  63. package/dist/src/overrides.js +134 -112
  64. package/dist/src/paths.js +56 -1
  65. package/dist/src/platform-calls.js +78 -0
  66. package/dist/src/platform-symbols.js +134 -0
  67. package/dist/src/references/read-rule.js +1 -0
  68. package/dist/src/references/read-rules.js +48 -0
  69. package/dist/src/references/sink.js +151 -0
  70. package/dist/src/references/sources.js +450 -0
  71. package/dist/src/references.js +111 -1116
  72. package/dist/src/resolve.js +1 -1
  73. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +7 -4
  74. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +5 -8
  75. package/dist/src/{manifest.js → roots/manifest.js} +4 -4
  76. package/dist/src/roots/published-reach.js +412 -0
  77. package/dist/src/roots/root-set.js +489 -0
  78. package/dist/src/roots/unseen-loads.js +236 -0
  79. package/dist/src/serialization-contract.js +9 -4
  80. package/dist/src/source-files.js +5 -9
  81. package/dist/src/stores.js +4 -2
  82. package/dist/src/suppress.js +30 -32
  83. package/dist/src/sweep.js +25 -13
  84. package/dist/src/symbol-keys.js +89 -83
  85. package/dist/src/tests/file-class.js +76 -0
  86. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  87. package/dist/src/{test-support.js → tests/support.js} +5 -12
  88. package/dist/src/type-parameter-reads.js +178 -139
  89. package/dist/src/unimplemented-callees.js +262 -242
  90. package/dist/src/verbs/analyze.js +15 -3
  91. package/dist/src/verbs/describe.js +5 -3
  92. package/dist/src/verbs/explain.js +50 -28
  93. package/dist/src/verbs/print-retained.js +2 -2
  94. package/jsr.json +1 -1
  95. package/package.json +3 -3
  96. package/src/alias-chain.ts +0 -7
  97. package/src/amd.ts +130 -0
  98. package/src/analysis.ts +156 -70
  99. package/src/augmentations.ts +41 -27
  100. package/src/automatic-types.ts +1 -1
  101. package/src/bindings.ts +460 -0
  102. package/src/calls.ts +25 -7
  103. package/src/commands/read.ts +6 -8
  104. package/src/commands/tools.ts +5 -11
  105. package/src/component-files.ts +4 -2
  106. package/src/conformance-record.ts +1 -1
  107. package/src/consumers.ts +12 -11
  108. package/src/contextual-uses.ts +2 -22
  109. package/src/contract/config.generated.ts +5 -2
  110. package/src/contract/contract.generated.ts +138 -2
  111. package/src/contract/report.generated.ts +6 -2
  112. package/src/dependencies.ts +117 -71
  113. package/src/destructuring.ts +1 -31
  114. package/src/element-access.ts +188 -182
  115. package/src/entries/build-scripts.ts +292 -0
  116. package/src/{configuration-files.ts → entries/configuration-files.ts} +33 -82
  117. package/src/{convention-rows.ts → entries/convention-rows.ts} +167 -28
  118. package/src/{conventions.ts → entries/conventions.ts} +349 -523
  119. package/src/{html-entries.ts → entries/html-entries.ts} +19 -18
  120. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +5 -5
  121. package/src/entries/run-directories.ts +108 -0
  122. package/src/entries/sources.ts +266 -0
  123. package/src/entries/static-module.ts +858 -0
  124. package/src/entries/test-runners.ts +868 -0
  125. package/src/{workflow-steps.ts → entries/workflow-steps.ts} +29 -11
  126. package/src/exempt.ts +3 -2
  127. package/src/extensions.ts +45 -0
  128. package/src/facts.ts +46 -0
  129. package/src/file-facts.ts +1 -1
  130. package/src/findings/boundary.ts +2 -0
  131. package/src/findings/completion.ts +43 -4
  132. package/src/findings/emitter.ts +1 -1
  133. package/src/findings/emitters.ts +14 -10
  134. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  135. package/src/{in-operands.ts → findings/in-operands.ts} +3 -3
  136. package/src/findings/self-check.ts +41 -22
  137. package/src/findings/visibility-narrowing.ts +1 -1
  138. package/src/findings-pass.ts +5 -12
  139. package/src/framework-lifecycle.ts +43 -15
  140. package/src/fs/manifest.ts +25 -21
  141. package/src/generated-file.ts +240 -36
  142. package/src/graph.ts +27 -11
  143. package/src/import-bindings.ts +98 -29
  144. package/src/index/sites.ts +781 -0
  145. package/src/index.ts +1 -1
  146. package/src/indexed-access.ts +570 -527
  147. package/src/injection-container.ts +1 -1
  148. package/src/interface-satisfaction.ts +1 -1
  149. package/src/inventory/commonjs.ts +102 -17
  150. package/src/inventory/enumerate.ts +2 -1
  151. package/src/javascript-file.ts +29 -12
  152. package/src/keyof-comparisons.ts +131 -116
  153. package/src/load/classify.ts +49 -13
  154. package/src/load/diagnostics.ts +11 -1
  155. package/src/load/discover.ts +27 -11
  156. package/src/load/expected-module.ts +8 -2
  157. package/src/load/plan.ts +11 -2
  158. package/src/load/specifiers.ts +8 -5
  159. package/src/load/synthesize.ts +12 -6
  160. package/src/load/test-globals.ts +1 -1
  161. package/src/load/workspace-manifests.ts +1 -1
  162. package/src/load/workspace-resolution.ts +9 -2
  163. package/src/load/workspace-run.ts +1 -1
  164. package/src/matrix.ts +13 -17
  165. package/src/module-declarations.ts +74 -98
  166. package/src/overrides.ts +162 -134
  167. package/src/paths.ts +65 -1
  168. package/src/platform-calls.ts +119 -0
  169. package/src/platform-symbols.ts +189 -0
  170. package/src/references/read-rule.ts +60 -0
  171. package/src/references/read-rules.ts +55 -0
  172. package/src/references/sink.ts +213 -0
  173. package/src/references/sources.ts +632 -0
  174. package/src/references.ts +174 -1492
  175. package/src/report.ts +2 -2
  176. package/src/resolve.ts +1 -1
  177. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +10 -7
  178. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +5 -8
  179. package/src/{manifest.ts → roots/manifest.ts} +5 -5
  180. package/src/roots/published-reach.ts +481 -0
  181. package/src/{roots.ts → roots/root-set.ts} +203 -630
  182. package/src/roots/unseen-loads.ts +345 -0
  183. package/src/serialization-contract.ts +9 -4
  184. package/src/source-files.ts +5 -10
  185. package/src/stores.ts +13 -2
  186. package/src/suppress.ts +48 -33
  187. package/src/sweep.ts +37 -14
  188. package/src/symbol-keys.ts +102 -102
  189. package/src/tests/file-class.ts +118 -0
  190. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  191. package/src/{test-support.ts → tests/support.ts} +15 -21
  192. package/src/type-parameter-reads.ts +187 -158
  193. package/src/unimplemented-callees.ts +297 -280
  194. package/src/verbs/analyze.ts +19 -5
  195. package/src/verbs/describe.ts +5 -2
  196. package/src/verbs/explain.ts +75 -32
  197. package/src/verbs/print-retained.ts +2 -2
  198. package/dist/src/build-scripts.js +0 -418
  199. package/dist/src/conventions.js +0 -907
  200. package/dist/src/entry-points.js +0 -444
  201. package/dist/src/own-body.js +0 -28
  202. package/dist/src/roots.js +0 -865
  203. package/dist/src/unseen-loads.js +0 -189
  204. package/src/build-scripts.ts +0 -536
  205. package/src/entry-points.ts +0 -584
  206. package/src/own-body.ts +0 -42
  207. package/src/unseen-loads.ts +0 -282
@@ -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
- }