@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.21

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 (431) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +35 -9
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +274 -496
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/commands/held.js +499 -0
  12. package/dist/src/commands/read.js +161 -0
  13. package/dist/src/commands/shell.js +169 -0
  14. package/dist/src/commands/tools.js +1847 -0
  15. package/dist/src/component-files.js +3 -2
  16. package/dist/src/component-layer.js +4 -2
  17. package/dist/src/config.js +6 -82
  18. package/dist/src/conformance-record.js +2 -2
  19. package/dist/src/consumers.js +10 -38
  20. package/dist/src/contextual-uses.js +57 -26
  21. package/dist/src/contract/config.generated.js +561 -0
  22. package/dist/src/contract/contract.generated.js +1370 -0
  23. package/dist/src/contract/report.generated.js +866 -0
  24. package/dist/src/dependencies.js +165 -122
  25. package/dist/src/destructuring.js +1 -19
  26. package/dist/src/edges.js +38 -122
  27. package/dist/src/element-access.js +181 -168
  28. package/dist/src/entries/build-scripts.js +222 -0
  29. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  30. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  31. package/dist/src/entries/conventions.js +740 -0
  32. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  33. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  34. package/dist/src/entries/run-directories.js +77 -0
  35. package/dist/src/entries/sources.js +144 -0
  36. package/dist/src/entries/static-module.js +670 -0
  37. package/dist/src/entries/test-runners.js +650 -0
  38. package/dist/src/entries/workflow-steps.js +345 -0
  39. package/dist/src/exemptions/argument-places.js +131 -0
  40. package/dist/src/exemptions/calls.js +338 -0
  41. package/dist/src/exemptions/classes.js +13 -0
  42. package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
  43. package/dist/src/exemptions/detectors.js +48 -0
  44. package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
  45. package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
  46. package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
  47. package/dist/src/exemptions/generated-file.js +241 -0
  48. package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
  49. package/dist/src/exemptions/installed-globals.js +173 -0
  50. package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
  51. package/dist/src/exemptions/lifecycle.js +150 -0
  52. package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
  53. package/dist/src/exemptions/serialization-contract.js +1276 -0
  54. package/dist/src/exemptions/sites.js +182 -0
  55. package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
  56. package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
  57. package/dist/src/exposure.js +400 -0
  58. package/dist/src/extensions.js +37 -0
  59. package/dist/src/facts.js +38 -0
  60. package/dist/src/failure.js +36 -0
  61. package/dist/src/file-facts.js +3 -26
  62. package/dist/src/findings/completion.js +109 -56
  63. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  64. package/dist/src/findings/emitters.js +27 -41
  65. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  66. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  67. package/dist/src/findings/interfaces.js +4 -5
  68. package/dist/src/findings/intra-function.js +16 -13
  69. package/dist/src/findings/non-code-artifacts.js +17 -12
  70. package/dist/src/findings/reads-and-writes.js +86 -27
  71. package/dist/src/findings/self-check.js +44 -30
  72. package/dist/src/findings/unused-declarations.js +29 -45
  73. package/dist/src/findings/visibility-narrowing.js +23 -31
  74. package/dist/src/findings-pass.js +13 -21
  75. package/dist/src/fs/document.js +52 -0
  76. package/dist/src/fs/manifest.js +67 -0
  77. package/dist/src/fs/tree.js +88 -0
  78. package/dist/src/git-ignore.js +39 -26
  79. package/dist/src/import-bindings.js +73 -28
  80. package/dist/src/index/sites.js +557 -0
  81. package/dist/src/index/values.js +124 -0
  82. package/dist/src/index.js +2 -2
  83. package/dist/src/indexed-access.js +523 -478
  84. package/dist/src/intra-function-parts.js +63 -43
  85. package/dist/src/inventory/commonjs.js +507 -0
  86. package/dist/src/inventory/enumerate.js +167 -0
  87. package/dist/src/inventory/syntax.js +236 -0
  88. package/dist/src/inventory.js +323 -724
  89. package/dist/src/javascript-file.js +48 -0
  90. package/dist/src/json-document.js +198 -67
  91. package/dist/src/keyof-comparisons.js +126 -107
  92. package/dist/src/kinds.js +3 -366
  93. package/dist/src/{components.js → liveness/components.js} +2 -3
  94. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  95. package/dist/src/liveness/matrix.js +99 -0
  96. package/dist/src/liveness/sweep.js +558 -0
  97. package/dist/src/load/classify.js +289 -0
  98. package/dist/src/load/diagnostics.js +87 -0
  99. package/dist/src/load/discover.js +285 -0
  100. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  101. package/dist/src/load/expected-module.js +136 -0
  102. package/dist/src/load/load.js +27 -0
  103. package/dist/src/load/module-lookup.js +37 -0
  104. package/dist/src/load/package-scope.js +56 -0
  105. package/dist/src/load/plan.js +313 -0
  106. package/dist/src/load/specifiers.js +113 -0
  107. package/dist/src/load/synthesize.js +152 -0
  108. package/dist/src/load/test-globals.js +207 -0
  109. package/dist/src/load/test-joins.js +82 -0
  110. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  111. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  112. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  113. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  114. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  115. package/dist/src/module-declarations.js +70 -85
  116. package/dist/src/overrides.js +134 -112
  117. package/dist/src/partial.js +2 -1
  118. package/dist/src/paths.js +82 -16
  119. package/dist/src/platform-calls.js +78 -0
  120. package/dist/src/platform-symbols.js +134 -0
  121. package/dist/src/position.js +43 -1
  122. package/dist/src/print.js +11 -79
  123. package/dist/src/product.js +13 -0
  124. package/dist/src/query.js +95 -0
  125. package/dist/src/ref.js +12 -20
  126. package/dist/src/references/read-rule.js +1 -0
  127. package/dist/src/references/read-rules.js +48 -0
  128. package/dist/src/references/sink.js +237 -0
  129. package/dist/src/references/sources.js +450 -0
  130. package/dist/src/references.js +117 -1074
  131. package/dist/src/report-schema.js +51 -0
  132. package/dist/src/report.js +57 -41
  133. package/dist/src/reporters/annotations.js +15 -8
  134. package/dist/src/reporters/sarif.js +16 -10
  135. package/dist/src/reporters/template.js +4 -19
  136. package/dist/src/resolve.js +246 -730
  137. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  138. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  139. package/dist/src/roots/manifest.js +216 -0
  140. package/dist/src/roots/published-reach.js +412 -0
  141. package/dist/src/roots/root-set.js +487 -0
  142. package/dist/src/roots/unseen-loads.js +236 -0
  143. package/dist/src/run.js +66 -77
  144. package/dist/src/schema.js +320 -343
  145. package/dist/src/scope.js +38 -115
  146. package/dist/src/session.js +37 -29
  147. package/dist/src/source-files.js +6 -10
  148. package/dist/src/stores.js +4 -2
  149. package/dist/src/suppress-file.js +25 -28
  150. package/dist/src/suppress-inline.js +36 -83
  151. package/dist/src/suppress.js +50 -71
  152. package/dist/src/symbol-keys.js +92 -88
  153. package/dist/src/tests/file-class.js +76 -0
  154. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  155. package/dist/src/{test-support.js → tests/support.js} +5 -12
  156. package/dist/src/text/compare.js +26 -0
  157. package/dist/src/text/glob.js +194 -0
  158. package/dist/src/text/named-files.js +298 -0
  159. package/dist/src/text/yaml.js +684 -0
  160. package/dist/src/type-errors.js +11 -232
  161. package/dist/src/type-parameter-reads.js +178 -139
  162. package/dist/src/unimplemented-callees.js +262 -242
  163. package/dist/src/unwrap.js +23 -0
  164. package/dist/src/usage.js +10 -0
  165. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  166. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  167. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  168. package/dist/src/vendor/unbash/assignment.js +131 -0
  169. package/dist/src/vendor/unbash/chars.js +48 -0
  170. package/dist/src/vendor/unbash/command.js +41 -0
  171. package/dist/src/vendor/unbash/expansion.js +80 -0
  172. package/dist/src/vendor/unbash/glob.js +268 -0
  173. package/dist/src/vendor/unbash/heredoc.js +27 -0
  174. package/dist/src/vendor/unbash/internal-types.js +1 -0
  175. package/dist/src/vendor/unbash/lexer.js +4274 -0
  176. package/dist/src/vendor/unbash/limits.js +3 -0
  177. package/dist/src/vendor/unbash/parser.js +1366 -0
  178. package/dist/src/vendor/unbash/parts.js +57 -0
  179. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  180. package/dist/src/vendor/unbash/traversal.js +212 -0
  181. package/dist/src/vendor/unbash/types.js +1 -0
  182. package/dist/src/vendor/unbash/word-value.js +61 -0
  183. package/dist/src/vendor/unbash/word.js +40 -0
  184. package/dist/src/verbs/analyze.js +194 -127
  185. package/dist/src/verbs/describe.js +13 -18
  186. package/dist/src/verbs/explain.js +85 -139
  187. package/dist/src/verbs/print-config.js +2 -1
  188. package/dist/src/verbs/print-projects.js +6 -4
  189. package/dist/src/verbs/print-retained.js +30 -6
  190. package/dist/src/verbs/print-roots.js +4 -2
  191. package/dist/src/verbs/verb.js +1 -5
  192. package/dist/src/verbs/version.js +14 -3
  193. package/jsr.json +2 -1
  194. package/package.json +14 -8
  195. package/src/alias-chain.ts +40 -11
  196. package/src/amd.ts +130 -0
  197. package/src/analysis.ts +426 -733
  198. package/src/augmentations.ts +93 -4
  199. package/src/automatic-types.ts +12 -30
  200. package/src/bindings.ts +460 -0
  201. package/src/commands/held.ts +632 -0
  202. package/src/commands/read.ts +242 -0
  203. package/src/commands/shell.ts +228 -0
  204. package/src/commands/tools.ts +2382 -0
  205. package/src/component-files.ts +4 -2
  206. package/src/component-layer.ts +4 -2
  207. package/src/config.ts +31 -302
  208. package/src/conformance-record.ts +2 -2
  209. package/src/consumers.ts +16 -66
  210. package/src/contextual-uses.ts +66 -34
  211. package/src/contract/config.generated.ts +821 -0
  212. package/src/contract/contract.generated.ts +1453 -0
  213. package/src/contract/report.generated.ts +1241 -0
  214. package/src/dependencies.ts +223 -128
  215. package/src/destructuring.ts +1 -31
  216. package/src/edges.ts +41 -140
  217. package/src/element-access.ts +190 -187
  218. package/src/entries/build-scripts.ts +292 -0
  219. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  220. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  221. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  222. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  223. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  224. package/src/entries/run-directories.ts +108 -0
  225. package/src/entries/sources.ts +266 -0
  226. package/src/entries/static-module.ts +858 -0
  227. package/src/entries/test-runners.ts +835 -0
  228. package/src/entries/workflow-steps.ts +432 -0
  229. package/src/exemptions/argument-places.ts +198 -0
  230. package/src/exemptions/calls.ts +483 -0
  231. package/src/exemptions/classes.ts +49 -0
  232. package/src/exemptions/decorator.ts +56 -0
  233. package/src/exemptions/detectors.ts +75 -0
  234. package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
  235. package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
  236. package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
  237. package/src/exemptions/generated-file.ts +318 -0
  238. package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
  239. package/src/exemptions/installed-globals.ts +255 -0
  240. package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
  241. package/src/exemptions/lifecycle.ts +286 -0
  242. package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
  243. package/src/exemptions/serialization-contract.ts +1729 -0
  244. package/src/exemptions/sites.ts +293 -0
  245. package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
  246. package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
  247. package/src/exposure.ts +492 -0
  248. package/src/extensions.ts +45 -0
  249. package/src/facts.ts +46 -0
  250. package/src/failure.ts +63 -0
  251. package/src/file-facts.ts +15 -25
  252. package/src/finding.ts +10 -10
  253. package/src/findings/boundary.ts +11 -0
  254. package/src/findings/completion.ts +133 -64
  255. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  256. package/src/findings/emitter.ts +9 -10
  257. package/src/findings/emitters.ts +38 -52
  258. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  259. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  260. package/src/findings/interfaces.ts +7 -9
  261. package/src/findings/intra-function.ts +16 -14
  262. package/src/findings/non-code-artifacts.ts +24 -15
  263. package/src/findings/reads-and-writes.ts +118 -41
  264. package/src/findings/self-check.ts +51 -38
  265. package/src/findings/unused-declarations.ts +31 -49
  266. package/src/findings/visibility-narrowing.ts +36 -40
  267. package/src/findings-pass.ts +15 -31
  268. package/src/fs/document.ts +70 -0
  269. package/src/fs/manifest.ts +96 -0
  270. package/src/fs/tree.ts +110 -0
  271. package/src/git-ignore.ts +50 -26
  272. package/src/host.ts +12 -5
  273. package/src/import-bindings.ts +98 -29
  274. package/src/index/sites.ts +781 -0
  275. package/src/index/values.ts +170 -0
  276. package/src/index.ts +2 -2
  277. package/src/indexed-access.ts +570 -527
  278. package/src/intra-function-parts.ts +73 -44
  279. package/src/inventory/commonjs.ts +696 -0
  280. package/src/inventory/enumerate.ts +203 -0
  281. package/src/inventory/syntax.ts +311 -0
  282. package/src/inventory.ts +442 -895
  283. package/src/javascript-file.ts +54 -0
  284. package/src/json-document.ts +241 -76
  285. package/src/keyof-comparisons.ts +133 -122
  286. package/src/kinds.ts +5 -413
  287. package/src/{components.ts → liveness/components.ts} +4 -6
  288. package/src/{graph.ts → liveness/graph.ts} +100 -35
  289. package/src/liveness/matrix.ts +162 -0
  290. package/src/liveness/sweep.ts +855 -0
  291. package/src/load/classify.ts +433 -0
  292. package/src/load/diagnostics.ts +154 -0
  293. package/src/load/discover.ts +471 -0
  294. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  295. package/src/load/expected-module.ts +194 -0
  296. package/src/load/load.ts +73 -0
  297. package/src/load/module-lookup.ts +50 -0
  298. package/src/load/package-scope.ts +74 -0
  299. package/src/load/plan.ts +513 -0
  300. package/src/load/specifiers.ts +171 -0
  301. package/src/load/synthesize.ts +230 -0
  302. package/src/load/test-globals.ts +251 -0
  303. package/src/load/test-joins.ts +98 -0
  304. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  305. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  306. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  307. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  308. package/src/{workspace.ts → load/workspace.ts} +90 -134
  309. package/src/module-declarations.ts +74 -98
  310. package/src/overrides.ts +162 -134
  311. package/src/partial.ts +3 -2
  312. package/src/paths.ts +92 -16
  313. package/src/platform-calls.ts +119 -0
  314. package/src/platform-symbols.ts +189 -0
  315. package/src/position.ts +44 -1
  316. package/src/print.ts +12 -92
  317. package/src/product.ts +18 -0
  318. package/src/query.ts +201 -10
  319. package/src/ref.ts +12 -20
  320. package/src/references/read-rule.ts +60 -0
  321. package/src/references/read-rules.ts +55 -0
  322. package/src/references/sink.ts +314 -0
  323. package/src/references/sources.ts +632 -0
  324. package/src/references.ts +187 -1450
  325. package/src/report-schema.ts +68 -0
  326. package/src/report.ts +103 -226
  327. package/src/reporters/annotations.ts +22 -11
  328. package/src/reporters/json.ts +1 -1
  329. package/src/reporters/reporter.ts +2 -4
  330. package/src/reporters/reporters.ts +1 -1
  331. package/src/reporters/sarif.ts +29 -16
  332. package/src/reporters/template.ts +4 -20
  333. package/src/reporters/text.ts +3 -3
  334. package/src/resolve.ts +284 -1115
  335. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
  336. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  337. package/src/roots/manifest.ts +303 -0
  338. package/src/roots/published-reach.ts +486 -0
  339. package/src/{roots.ts → roots/root-set.ts} +286 -469
  340. package/src/roots/unseen-loads.ts +345 -0
  341. package/src/run.ts +75 -91
  342. package/src/schema.ts +391 -388
  343. package/src/scope.ts +46 -138
  344. package/src/session.ts +87 -55
  345. package/src/source-files.ts +6 -11
  346. package/src/stores.ts +15 -3
  347. package/src/suppress-file.ts +24 -33
  348. package/src/suppress-inline.ts +55 -91
  349. package/src/suppress.ts +78 -79
  350. package/src/symbol-keys.ts +104 -107
  351. package/src/tests/file-class.ts +135 -0
  352. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  353. package/src/{test-support.ts → tests/support.ts} +15 -21
  354. package/src/text/compare.ts +27 -0
  355. package/src/text/glob.ts +210 -0
  356. package/src/text/named-files.ts +388 -0
  357. package/src/text/yaml.ts +747 -0
  358. package/src/type-errors.ts +18 -288
  359. package/src/type-parameter-reads.ts +187 -158
  360. package/src/unimplemented-callees.ts +297 -280
  361. package/src/unwrap.ts +34 -0
  362. package/src/usage.ts +10 -0
  363. package/src/vendor/unbash/LICENSE +15 -0
  364. package/src/vendor/unbash/VENDORED.md +16 -0
  365. package/src/vendor/unbash/ansi-c.ts +132 -0
  366. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  367. package/src/vendor/unbash/arithmetic.ts +641 -0
  368. package/src/vendor/unbash/assignment.ts +163 -0
  369. package/src/vendor/unbash/chars.ts +48 -0
  370. package/src/vendor/unbash/command.ts +47 -0
  371. package/src/vendor/unbash/expansion.ts +144 -0
  372. package/src/vendor/unbash/glob.ts +284 -0
  373. package/src/vendor/unbash/heredoc.ts +34 -0
  374. package/src/vendor/unbash/internal-types.ts +94 -0
  375. package/src/vendor/unbash/lexer.ts +4352 -0
  376. package/src/vendor/unbash/limits.ts +3 -0
  377. package/src/vendor/unbash/parser.ts +1612 -0
  378. package/src/vendor/unbash/parts.ts +96 -0
  379. package/src/vendor/unbash/substitution-context.ts +20 -0
  380. package/src/vendor/unbash/traversal.ts +182 -0
  381. package/src/vendor/unbash/types.ts +660 -0
  382. package/src/vendor/unbash/word-value.ts +64 -0
  383. package/src/vendor/unbash/word.ts +50 -0
  384. package/src/verbs/analyze.ts +255 -164
  385. package/src/verbs/describe.ts +19 -17
  386. package/src/verbs/explain.ts +93 -169
  387. package/src/verbs/print-config.ts +2 -1
  388. package/src/verbs/print-projects.ts +6 -4
  389. package/src/verbs/print-retained.ts +36 -6
  390. package/src/verbs/print-roots.ts +4 -2
  391. package/src/verbs/verb.ts +2 -8
  392. package/src/verbs/version.ts +15 -3
  393. package/dist/src/base-url.js +0 -18
  394. package/dist/src/calls.js +0 -155
  395. package/dist/src/conventions.js +0 -937
  396. package/dist/src/discover.js +0 -468
  397. package/dist/src/entry-points.js +0 -529
  398. package/dist/src/exempt-classes.js +0 -75
  399. package/dist/src/exempt.js +0 -209
  400. package/dist/src/generated-file.js +0 -95
  401. package/dist/src/glob.js +0 -65
  402. package/dist/src/manifest.js +0 -165
  403. package/dist/src/matrix.js +0 -246
  404. package/dist/src/pnpm-workspace.js +0 -120
  405. package/dist/src/roots.js +0 -672
  406. package/dist/src/serialization-contract.js +0 -611
  407. package/dist/src/setup-failure.js +0 -23
  408. package/dist/src/sweep.js +0 -224
  409. package/dist/src/test-joins.js +0 -101
  410. package/dist/src/value-flow.js +0 -74
  411. package/dist/src/version.js +0 -7
  412. package/dist/src/workflow-steps.js +0 -185
  413. package/src/base-url.ts +0 -24
  414. package/src/calls.ts +0 -225
  415. package/src/decorator.ts +0 -78
  416. package/src/discover.ts +0 -653
  417. package/src/entry-points.ts +0 -687
  418. package/src/exempt-classes.ts +0 -123
  419. package/src/exempt.ts +0 -323
  420. package/src/generated-file.ts +0 -111
  421. package/src/glob.ts +0 -67
  422. package/src/manifest.ts +0 -234
  423. package/src/matrix.ts +0 -423
  424. package/src/pnpm-workspace.ts +0 -135
  425. package/src/serialization-contract.ts +0 -849
  426. package/src/setup-failure.ts +0 -39
  427. package/src/sweep.ts +0 -347
  428. package/src/test-joins.ts +0 -120
  429. package/src/value-flow.ts +0 -104
  430. package/src/version.ts +0 -7
  431. package/src/workflow-steps.ts +0 -216
@@ -1,13 +1,16 @@
1
- import { runAnalysis } from "../analysis.js";
2
- import { listing } from "../components.js";
3
- import { ConfigError } from "../config.js";
4
- import { OUTSIDE, swept as judged } from "../graph.js";
5
- import { referenceKey } from "../matrix.js";
1
+ import { EXIT_CLEAN, EXIT_USAGE } from "../contract/contract.generated.js";
2
+ import { productionMode, runAnalysis } from "../analysis.js";
3
+ import { listing } from "../liveness/components.js";
4
+ import { swept as judged } from "../liveness/graph.js";
6
5
  import { partialNotes } from "../partial.js";
7
6
  import { resolvePath } from "../paths.js";
8
7
  import { positionKey } from "../position.js";
8
+ import { madeByTestCode } from "../tests/file-class.js";
9
9
  import { resolve } from "../resolve.js";
10
- import { EXIT_CLEAN, EXIT_USAGE } from "./verb.js";
10
+ import {} from "./verb.js";
11
+ import { UsageError } from "../usage.js";
12
+ import { bytewise } from "../text/compare.js";
13
+ import { diagnose } from "../product.js";
11
14
  /**
12
15
  * The three spellings of an explanation request, each naming the symbol to explain. They are
13
16
  * one request, because exactly one state holds for a symbol and the answer is that state.
@@ -33,10 +36,10 @@ function namedSymbol(option) {
33
36
  });
34
37
  const [only, ...more] = named;
35
38
  if (only === undefined) {
36
- throw new ConfigError("malformed", "", "explain explains the symbol --why, --why-live or --why-not names, and none was named");
39
+ throw new UsageError("explain explains the symbol --why, --why-live or --why-not names, and none was named");
37
40
  }
38
41
  if (more.length > 0) {
39
- throw new ConfigError("malformed", "", `explain explains one symbol, and ${named.map((one) => `--${one.name}`).join(", ")} each name one`);
42
+ throw new UsageError(`explain explains one symbol, and ${named.map((one) => `--${one.name}`).join(", ")} each name one`);
40
43
  }
41
44
  return only.value;
42
45
  }
@@ -73,153 +76,97 @@ function subjectOf(symbols, named) {
73
76
  const partial = symbols
74
77
  .filter((symbol) => symbol.ref.toLowerCase().includes(folded) || symbol.name.toLowerCase().includes(folded))
75
78
  .map(described)
76
- .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
79
+ .sort(bytewise);
77
80
  return { candidates: partial.slice(0, MAX_PARTIAL_MATCHES) };
78
81
  }
79
- /** Every reference of the run once, a reference several configurations make counted once. */
80
- function referencesOf(configured) {
81
- const seen = new Set();
82
- const held = [];
83
- for (const reference of configured.flatMap((one) => one.references)) {
84
- const key = referenceKey(reference);
85
- if (!seen.has(key)) {
86
- seen.add(key);
87
- held.push(reference);
88
- }
89
- }
90
- return held;
91
- }
92
- /** Every root of the run once per reason, in the order the projects name them. */
93
- function rootsOf(configured) {
94
- const seen = new Set();
95
- return configured
96
- .flatMap((one) => one.roots)
97
- .filter((root) => {
98
- const key = [root.id, root.kind, root.source].join("\u0000");
99
- if (seen.has(key)) {
100
- return false;
101
- }
102
- seen.add(key);
103
- return true;
104
- });
105
- }
106
- /**
107
- * The shortest path from a root or a loaded consumer to one declaration, walked breadth first
108
- * from every root at once in the order the run names them, a consumer's reference being the
109
- * first hop of a path of its own, and following the references the sweep follows: a
110
- * reference that reads a module reaches what the module exports, and an evaluation or a root
111
- * reaches the module alone. Under `production` no reference a test file made is followed,
112
- * which is the set the report's sweep counts.
113
- */
114
- function shortestPath(analysis, to, production) {
115
- const graph = analysis.swept.matrix.union;
116
- const out = new Map();
117
- const consumed = [];
118
- for (const reference of referencesOf(analysis.configured)) {
119
- if (production && reference.test) {
120
- continue;
121
- }
122
- const { consumer } = reference;
123
- if (consumer !== undefined) {
124
- consumed.push({ ...reference, consumer });
125
- continue;
126
- }
127
- const held = out.get(reference.from);
128
- if (held === undefined) {
129
- out.set(reference.from, [reference]);
130
- }
131
- else {
132
- held.push(reference);
133
- }
134
- }
135
- const steps = [];
136
- const seen = new Set();
137
- const expanded = new Set();
138
- const enter = (step) => {
139
- if (!seen.has(step.at)) {
140
- seen.add(step.at);
141
- steps.push(step);
142
- }
143
- };
144
- const follow = (reference, previous, origin) => {
145
- enter({ at: reference.to, hop: { k: "reference", reference }, previous, origin });
146
- const target = graph.at(reference.to);
147
- if (reference.use === "evaluation" || target === OUTSIDE || expanded.has(reference.to)) {
148
- return;
149
- }
150
- expanded.add(reference.to);
151
- for (const exported of graph.exportsOf[target] ?? []) {
152
- const id = graph.symbols[exported]?.id;
153
- if (id !== undefined) {
154
- enter({ at: id, hop: { k: "export", reference, to: id }, previous, origin });
155
- }
156
- }
157
- };
158
- for (const root of rootsOf(analysis.configured)) {
159
- enter({ at: root.id, hop: undefined, previous: -1, origin: { k: "root", root } });
160
- }
161
- // A consumer's reference is one hop long, so it joins the walk where the roots' first
162
- // hops do.
163
- const firstHops = steps.length;
164
- for (let head = 0;; head += 1) {
165
- if (head === firstHops) {
166
- for (const reference of consumed) {
167
- follow(reference, -1, { k: "consumer", consumer: reference.consumer });
82
+ /** Where a path starts, as a line names it. */
83
+ function originText(origin, graph) {
84
+ const id = (at) => graph.symbols[at]?.id ?? "";
85
+ switch (origin.k) {
86
+ case "root":
87
+ return `root ${origin.rooted.kind} ${id(origin.rooted.at)}`;
88
+ case "consumed": {
89
+ const reference = graph.references[origin.edge.reference];
90
+ if (reference?.consumer !== undefined) {
91
+ return `consumer ${reference.consumer}`;
168
92
  }
93
+ return reference?.unheld === true
94
+ ? `test file no project holds ${reference.from.replace(/#$/u, "")}`
95
+ : `declaration no configuration judges ${reference?.from ?? ""}`;
169
96
  }
170
- const step = steps[head];
171
- if (step === undefined) {
172
- break;
173
- }
174
- if (step.at === to) {
175
- const path = [];
176
- for (let at = step; at?.hop !== undefined; at = steps[at.previous]) {
177
- path.unshift(at.hop);
178
- }
179
- return { origin: step.origin, path };
180
- }
181
- for (const reference of out.get(step.at) ?? []) {
182
- follow(reference, head, step.origin);
183
- }
97
+ case "exemption":
98
+ return `exemption ${origin.record.class} ${positionKey(origin.record.site)}`;
99
+ case "mark":
100
+ return `suppression of ${id(origin.at)}`;
101
+ case "unanswered":
102
+ return `unanswered question about ${id(origin.at)}`;
184
103
  }
185
- return undefined;
186
104
  }
187
105
  /** What made a reference: a declaration of the target, or a loaded consumer. */
188
106
  function madeBy(reference) {
189
107
  return reference.consumer === undefined ? reference.from : `consumer ${reference.consumer}`;
190
108
  }
191
- function referenceLine(reference, tail) {
192
- return ` reference: ${positionKey(reference.position)}\t${reference.use}\t${tail}${reference.test ? "\tfrom a test file" : ""}\n`;
109
+ /**
110
+ * One reference of an answer, marked where test code made it, a test-support file's included,
111
+ * and naming the configurations that make it where they are not every one of the run.
112
+ */
113
+ function referenceLine(reference, tail, support, configurations) {
114
+ const partial = configurations.making.length < configurations.run.length;
115
+ return ` reference: ${positionKey(reference.position)}\t${reference.use}\t${tail}${madeByTestCode(reference, support) ? "\tfrom a test file" : ""}${partial ? `\tmade in ${configurations.making.join(" ")}` : ""}\n`;
193
116
  }
194
117
  /** Why a declaration no finding names and no exemption held back is live, or how it fell. */
195
118
  function liveness(analysis, subject, cascade) {
196
- const { sweep } = analysis.swept;
119
+ const { matrix, sweep } = analysis.swept;
120
+ const graph = matrix.union;
197
121
  const candidate = sweep.candidates.find((one) => one.id === subject.id);
198
122
  if (candidate === undefined && !judged(subject.kind)) {
199
123
  return `answer: unjudged\n unjudged: neither liveness relation judges a ${subject.kind}\n`;
200
124
  }
201
125
  let text = `answer: ${candidate === undefined ? "live" : "dead"}\n`;
202
126
  text += ` live under: ${listed(sweep.liveUnder.get(subject.id) ?? [])}\n`;
203
- for (const root of rootsOf(analysis.configured).filter((one) => one.id === subject.id)) {
204
- text += ` root: ${root.kind}${root.source === "" ? "" : `\tnamed by ${root.source}`}\n`;
127
+ const at = graph.at(subject.id);
128
+ const seen = new Set();
129
+ for (const root of graph.rooted.filter((one) => one.at === at)) {
130
+ const key = `${root.kind}\u0000${root.source}`;
131
+ if (!seen.has(key)) {
132
+ seen.add(key);
133
+ text += ` root: ${root.kind}${root.source === "" ? "" : `\tnamed by ${root.source}`}\n`;
134
+ }
205
135
  }
206
- const found = shortestPath(analysis, subject.id, true) ?? shortestPath(analysis, subject.id, false);
207
- if (found !== undefined && found.path.length > 0) {
208
- const { origin } = found;
209
- text += ` reached from: ${origin.k === "root" ? `root ${origin.root.kind} ${origin.root.id}` : `consumer ${origin.consumer}`}\n`;
210
- for (const hop of found.path) {
211
- text += referenceLine(hop.reference, `${madeBy(hop.reference)} -> ${hop.reference.to}`);
136
+ const support = new Set(analysis.configured.flatMap((one) => one.supportFiles ?? []));
137
+ const line = (edge, tail) => {
138
+ const reference = graph.references[edge.reference];
139
+ return reference === undefined
140
+ ? ""
141
+ : referenceLine(reference, tail(reference), support, {
142
+ making: graph.configurations[edge.reference] ?? [],
143
+ run: matrix.configurations,
144
+ });
145
+ };
146
+ const found = sweep.path(subject.id);
147
+ if (found !== undefined && found.hops.length > 0) {
148
+ text += ` reached from: ${originText(found.origin, graph)}\n`;
149
+ for (const hop of found.hops) {
150
+ text += line(hop.edge, (reference) => `${madeBy(reference)} -> ${reference.to}`);
212
151
  if (hop.k === "export") {
213
- text += ` export: ${hop.reference.to} -> ${hop.to}\n`;
152
+ const reference = graph.references[hop.edge.reference];
153
+ text += ` export: ${reference?.to ?? ""} -> ${graph.symbols[hop.to]?.id ?? ""}\n`;
214
154
  }
215
155
  }
216
156
  }
217
157
  else if (found === undefined) {
218
- const references = referencesOf(analysis.configured).filter((one) => one.to === subject.id);
219
- text += " unreachable: no path of references reaches it from a root or a loaded consumer\n";
158
+ const references = graph.references.flatMap((one, place) => one.to === subject.id ? [place] : []);
159
+ text +=
160
+ " unreachable: no path of references reaches it from a root, a loaded consumer or a test file no project holds\n";
220
161
  text += ` references: ${String(references.length)}\n`;
221
- for (const reference of references) {
222
- text += referenceLine(reference, `from ${madeBy(reference)}`);
162
+ for (const place of references) {
163
+ const reference = graph.references[place];
164
+ if (reference !== undefined) {
165
+ text += referenceLine(reference, `from ${madeBy(reference)}`, support, {
166
+ making: graph.configurations[place] ?? [],
167
+ run: matrix.configurations,
168
+ });
169
+ }
223
170
  }
224
171
  }
225
172
  if (candidate !== undefined) {
@@ -276,7 +223,7 @@ function explanation(analysis, subject, cascade) {
276
223
  text += `position: ${subject.id}\n`;
277
224
  text += `configurations: ${listed(analysis.swept.matrix.heldIn[at] ?? [])}\n`;
278
225
  const found = analysis.result.findings.find((one) => positionKey(one.position) === subject.id);
279
- const retained = analysis.swept.retained.filter((one) => one.id === subject.id);
226
+ const retained = analysis.swept.sweep.retained.filter((one) => one.id === subject.id);
280
227
  if (found !== undefined) {
281
228
  text += reported(found);
282
229
  }
@@ -286,7 +233,7 @@ function explanation(analysis, subject, cascade) {
286
233
  text += ` class: ${one.class}\t${positionKey(one.site)}\t${one.detail}\n`;
287
234
  }
288
235
  }
289
- else if (analysis.swept.heldByUnanswered.includes(subject.id)) {
236
+ else if (analysis.swept.sweep.held.includes(subject.id)) {
290
237
  text +=
291
238
  "answer: held\n held by: a question the checker did not answer, which could have kept it live, so no finding names it\n";
292
239
  }
@@ -298,18 +245,17 @@ function explanation(analysis, subject, cascade) {
298
245
  /**
299
246
  * Explains one symbol from the analysis the report is built from: why a reported symbol is
300
247
  * reported, which exemption classes held a retained one back, that an unanswered question held
301
- * a held one, and for any other declaration the relations that hold it live and the shortest
302
- * path from a root or a loaded consumer, or the references it has where no path reaches it. A
303
- * request naming no one declaration exits with the usage code and names what partially
248
+ * a held one, and for any other declaration the relations that hold it live and the path the
249
+ * sweep's strongest tier reaching it follows, or the references it has where no path reaches
250
+ * it. A request naming no one declaration exits with the usage code and names what partially
304
251
  * matches it. Where the analysis was partial, the error stream says so.
305
252
  */
306
253
  export const explainVerb = ({ out, err, host, inputs, scope, openClient, option }) => {
307
254
  const named = namedSymbol(option);
308
255
  const { config, provenance } = resolve(inputs());
309
256
  const scoped = scope();
310
- const analysis = runAnalysis(openClient(config), host, scoped, config, provenance, {
311
- production: true,
312
- });
257
+ const mode = productionMode(config);
258
+ const analysis = runAnalysis(openClient(config), host, scoped, config, provenance, mode);
313
259
  const { subject, candidates } = subjectOf(analysis.swept.matrix.union.symbols, named);
314
260
  const notes = partialNotes({
315
261
  notBuilt: analysis.run.notBuilt,
@@ -317,7 +263,7 @@ export const explainVerb = ({ out, err, host, inputs, scope, openClient, option
317
263
  targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
318
264
  });
319
265
  if (subject === undefined) {
320
- err.write(`deadset-ts: ${JSON.stringify(named)} names no one symbol of the target\n`);
266
+ diagnose(err, `${JSON.stringify(named)} names no one symbol of the target`);
321
267
  for (const candidate of candidates) {
322
268
  err.write(` ${candidate}\n`);
323
269
  }
@@ -329,7 +275,7 @@ export const explainVerb = ({ out, err, host, inputs, scope, openClient, option
329
275
  out.write(explanation(analysis, subject, config.reporters.cascade));
330
276
  }
331
277
  for (const note of notes) {
332
- err.write(`deadset-ts: ${note}\n`);
278
+ diagnose(err, note);
333
279
  }
334
280
  return subject === undefined ? EXIT_USAGE : EXIT_CLEAN;
335
281
  };
@@ -1,6 +1,7 @@
1
+ import { EXIT_CLEAN } from "../contract/contract.generated.js";
1
2
  import { printConfig } from "../print.js";
2
3
  import { resolve } from "../resolve.js";
3
- import { EXIT_CLEAN } from "./verb.js";
4
+ import {} from "./verb.js";
4
5
  /** Writes the resolved configuration with the source of every setting. */
5
6
  export const printConfigVerb = ({ out, inputs }) => {
6
7
  const { config, provenance } = resolve(inputs());
@@ -1,8 +1,10 @@
1
+ import { EXIT_CLEAN } from "../contract/contract.generated.js";
1
2
  import { runProjects } from "../analysis.js";
2
3
  import { partialNotes } from "../partial.js";
3
4
  import { resolvePath } from "../paths.js";
4
- import { resolveUnkinded } from "../resolve.js";
5
- import { EXIT_CLEAN } from "./verb.js";
5
+ import { resolvePartial } from "../resolve.js";
6
+ import {} from "./verb.js";
7
+ import { diagnose } from "../product.js";
6
8
  /**
7
9
  * Writes the name of every project one run analyzes, one per line: the identifier the
8
10
  * build matrix declares for it, or, where discovery derived the project, its
@@ -11,7 +13,7 @@ import { EXIT_CLEAN } from "./verb.js";
11
13
  * instead, and one that fails the analysis fails this command the same way.
12
14
  */
13
15
  export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient }) => {
14
- const config = resolveUnkinded(inputs());
16
+ const config = resolvePartial(inputs());
15
17
  const scoped = scope();
16
18
  const answer = runProjects(openClient(config), host, scoped, config);
17
19
  for (const id of answer.configurations) {
@@ -22,7 +24,7 @@ export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient })
22
24
  unanswered: answer.unanswered,
23
25
  targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
24
26
  })) {
25
- err.write(`deadset-ts: ${note}\n`);
27
+ diagnose(err, note);
26
28
  }
27
29
  return EXIT_CLEAN;
28
30
  };
@@ -1,9 +1,33 @@
1
- import { runSweep } from "../analysis.js";
2
- import { retainedLines } from "../exempt.js";
1
+ import { EXIT_CLEAN } from "../contract/contract.generated.js";
2
+ import { productionMode, runSweep } from "../analysis.js";
3
3
  import { partialNotes } from "../partial.js";
4
+ import { positionKey } from "../position.js";
4
5
  import { resolvePath } from "../paths.js";
5
6
  import { resolve } from "../resolve.js";
6
- import { EXIT_CLEAN } from "./verb.js";
7
+ import {} from "./verb.js";
8
+ import { diagnose } from "../product.js";
9
+ /**
10
+ * One line per held-back declaration, in site order: its reference and position, then
11
+ * each record's class, site and detail, all separated by tabs.
12
+ */
13
+ function retainedLines(symbols, retained) {
14
+ const held = new Map();
15
+ for (const record of retained) {
16
+ held.set(record.id, [...(held.get(record.id) ?? []), record]);
17
+ }
18
+ return symbols.flatMap((symbol) => {
19
+ const records = held.get(symbol.id);
20
+ if (records === undefined) {
21
+ return [];
22
+ }
23
+ const fields = records.flatMap((record) => [
24
+ record.class,
25
+ positionKey(record.site),
26
+ record.detail,
27
+ ]);
28
+ return [[symbol.ref, positionKey(symbol.position), ...fields].join("\t")];
29
+ });
30
+ }
7
31
  /**
8
32
  * Writes every declaration an exemption held back in the production sweep a report is
9
33
  * built from, one per line, and nothing where no exemption held one back. One fact
@@ -16,9 +40,9 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
16
40
  const scoped = scope();
17
41
  const swept = runSweep(openClient(config), host, scoped, config, {
18
42
  marked: [],
19
- mode: { production: true },
43
+ mode: productionMode(config),
20
44
  });
21
- for (const line of retainedLines(swept.matrix.union.symbols, swept.retained)) {
45
+ for (const line of retainedLines(swept.matrix.union.symbols, swept.sweep.retained)) {
22
46
  out.write(`${line}\n`);
23
47
  }
24
48
  for (const note of partialNotes({
@@ -26,7 +50,7 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
26
50
  unanswered: swept.unanswered,
27
51
  targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
28
52
  })) {
29
- err.write(`deadset-ts: ${note}\n`);
53
+ diagnose(err, note);
30
54
  }
31
55
  return EXIT_CLEAN;
32
56
  };
@@ -1,8 +1,10 @@
1
+ import { EXIT_CLEAN, EXIT_FINDINGS } from "../contract/contract.generated.js";
1
2
  import { runRoots } from "../analysis.js";
2
3
  import { partialNotes } from "../partial.js";
3
4
  import { resolvePath } from "../paths.js";
4
5
  import { resolve } from "../resolve.js";
5
- import { EXIT_CLEAN, EXIT_FINDINGS } from "./verb.js";
6
+ import {} from "./verb.js";
7
+ import { diagnose } from "../product.js";
6
8
  /**
7
9
  * One root as a line: the declaration's reference, why it is a root, and the string
8
10
  * that named it, separated by tabs. A run of several configurations adds the ones
@@ -39,7 +41,7 @@ export const printRootsVerb = ({ out, err, host, inputs, scope, openClient }) =>
39
41
  unanswered: answer.unanswered,
40
42
  targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
41
43
  })) {
42
- err.write(`deadset-ts: ${note}\n`);
44
+ diagnose(err, note);
43
45
  }
44
46
  return answer.findings.length > 0 ? EXIT_FINDINGS : EXIT_CLEAN;
45
47
  };
@@ -1,5 +1 @@
1
- /** The exit codes the Contract's exit-code table names. */
2
- export const EXIT_CLEAN = 0;
3
- export const EXIT_FINDINGS = 1;
4
- export const EXIT_USAGE = 2;
5
- export const EXIT_FAILURE = 3;
1
+ export {};
@@ -1,7 +1,18 @@
1
- import { CONTRACT_VERSION } from "../version.js";
2
- import { EXIT_CLEAN } from "./verb.js";
1
+ import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.js";
2
+ import { productFault } from "../failure.js";
3
+ import {} from "./verb.js";
4
+ import { message, PRODUCT } from "../product.js";
5
+ /** The version the host reports for this analyzer; one it cannot read is a fault of the analyzer. */
6
+ export function ownVersion(host) {
7
+ try {
8
+ return host.analyzerVersion();
9
+ }
10
+ catch (error) {
11
+ throw productFault(`cannot read its own version: ${message(error)}`);
12
+ }
13
+ }
3
14
  /** Writes the version the host reports and the Contract version this analyzer implements. */
4
15
  export const versionVerb = ({ out, host }) => {
5
- out.write(`deadset-ts ${host.analyzerVersion()}\ncontract ${CONTRACT_VERSION}\n`);
16
+ out.write(`${PRODUCT} ${ownVersion(host)}\ncontract ${CONTRACT_VERSION}\n`);
6
17
  return EXIT_CLEAN;
7
18
  };
package/jsr.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cplieger/deadset-ts",
3
- "version": "8.0.0-dev.2",
3
+ "version": "8.0.0-dev.21",
4
4
  "license": "GPL-3.0-or-later",
5
5
  "exports": {
6
6
  ".": "./src/index.ts"
@@ -9,6 +9,7 @@
9
9
  "include": [
10
10
  "LICENSE",
11
11
  "NOTICE",
12
+ "THIRD_PARTY_NOTICES.md",
12
13
  "README.md",
13
14
  "bin/**",
14
15
  "src/**",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cplieger/deadset-ts",
3
- "version": "8.0.0-dev.2",
3
+ "version": "8.0.0-dev.21",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Deterministic dead-code analysis for TypeScript, class and type members included",
@@ -19,6 +19,8 @@
19
19
  },
20
20
  "scripts": {
21
21
  "build": "tsc -p tsconfig.build.json",
22
+ "gen": "node scripts/gen-contract.ts",
23
+ "vendor": "node scripts/vendor-unbash.ts",
22
24
  "prepack": "npm run build",
23
25
  "typecheck": "tsc -p tsconfig.json",
24
26
  "typecheck:tests": "tsc -p tsconfig.test.json",
@@ -29,24 +31,27 @@
29
31
  "lint:prettier": "prettier --check .",
30
32
  "lint:fix": "eslint . --fix && prettier --write ."
31
33
  },
34
+ "cplieger": {
35
+ "vitestShards": 2
36
+ },
32
37
  "dependencies": {
33
- "@typescript/native": "npm:typescript@7.1.0-dev.20261010.1"
38
+ "@typescript/native": "npm:typescript@7.1.0-dev.20261103.1"
34
39
  },
35
40
  "overrides": {
36
41
  "qs": "^6.15.2"
37
42
  },
38
43
  "devDependencies": {
39
44
  "@eslint/js": "10.0.1",
40
- "@stryker-mutator/core": "10.0.0",
41
- "@stryker-mutator/typescript-checker": "10.0.0",
42
- "@stryker-mutator/vitest-runner": "10.0.0",
45
+ "@stryker-mutator/core": "10.1.1",
46
+ "@stryker-mutator/typescript-checker": "10.1.1",
47
+ "@stryker-mutator/vitest-runner": "10.1.1",
43
48
  "@types/node": "24.19.2",
44
- "eslint": "10.12.0",
49
+ "eslint": "10.14.0",
45
50
  "fast-check": "4.10.2",
46
51
  "prettier": "3.9.10",
47
52
  "typescript": "npm:@typescript/typescript6@6.0.2",
48
- "typescript-eslint": "8.71.1",
49
- "vitest": "5.0.4"
53
+ "typescript-eslint": "8.72.1",
54
+ "vitest": "5.1.0"
50
55
  },
51
56
  "publishConfig": {
52
57
  "access": "public"
@@ -71,6 +76,7 @@
71
76
  "files": [
72
77
  "LICENSE",
73
78
  "NOTICE",
79
+ "THIRD_PARTY_NOTICES.md",
74
80
  "dist/",
75
81
  "src/",
76
82
  "!src/**/*.test.ts",
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Where an import or export chain leads in one project: from one symbol to each
3
3
  * declaration of the target it is, and along the chain of aliases it heads to each
4
- * declaration every link of that chain is.
4
+ * declaration every link of that chain is, and what a name resolves to through them.
5
5
  */
6
6
 
7
7
  import {
@@ -12,10 +12,11 @@ import {
12
12
  isImportSpecifier,
13
13
  isNamespaceExport,
14
14
  isNamespaceImport,
15
+ type Node,
15
16
  } from "@typescript/native/ast";
16
17
  import { SymbolFlags, type Symbol as TSSymbol } from "@typescript/native/sync";
17
- import { declarationsByName, isParameterProperty, nodeKey, type Inventory } from "./inventory.ts";
18
- import { UNANSWERED, type Answer } from "./query.ts";
18
+ import { isParameterProperty, nodeKey, type Inventory } from "./inventory.ts";
19
+ import { must, UNANSWERED, type Answer } from "./query.ts";
19
20
  import type { ProjectView } from "./session.ts";
20
21
 
21
22
  /** One declaration a chain reaches, and whether a step along an alias reached it. */
@@ -49,8 +50,6 @@ export interface AliasChains {
49
50
  * link is declared.
50
51
  */
51
52
  nextDeclared(symbol: TSSymbol): readonly ChainTarget[];
52
- /** How many steps the compiler was asked for: one per alias, whatever the chains it heads. */
53
- readonly steps: number;
54
53
  }
55
54
 
56
55
  /**
@@ -65,7 +64,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
65
64
  const ownFiles = project.ownPaths();
66
65
  const steps = new Map<number, Answer<TSSymbol | undefined>>();
67
66
  const chains = new Map<number, readonly ChainTarget[]>();
68
- let asked = 0;
69
67
 
70
68
  const declarationsOf = (symbol: TSSymbol): string[] => {
71
69
  const ids: string[] = [];
@@ -102,7 +100,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
102
100
  return steps.get(symbol.id);
103
101
  }
104
102
  const next = project.aliasStepOf(symbol);
105
- asked += 1;
106
103
  steps.set(symbol.id, next);
107
104
  return next;
108
105
  };
@@ -132,7 +129,7 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
132
129
  names.add(node.expression.text);
133
130
  }
134
131
  }
135
- const byName = declarationsByName(held);
132
+ const byName = held.byName;
136
133
  const ids = [...names].flatMap((name) => byName.get(name) ?? []);
137
134
  return [...new Set([...ids, ...(module ? files : [])])].map((id) => ({
138
135
  id,
@@ -197,8 +194,40 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
197
194
  declarationsOf,
198
195
  chainOf,
199
196
  nextDeclared,
200
- get steps() {
201
- return asked;
202
- },
203
197
  };
204
198
  }
199
+
200
+ /**
201
+ * What each of a batch of nodes resolves to, every alias followed to the declaration
202
+ * it stands for. A node the checker resolves to nothing, and an alias that resolves
203
+ * to nothing, are absent from the answer. Each alias is followed once. A question the
204
+ * checker does not answer stops the pass, as {@link must} stops.
205
+ */
206
+ export function resolvedTargets<Brand>(
207
+ project: ProjectView<Brand>,
208
+ nodes: readonly Node[],
209
+ ): ReadonlyMap<Node, TSSymbol> {
210
+ const followed = new Map<number, TSSymbol | undefined>();
211
+ const targets = new Map<Node, TSSymbol>();
212
+ project
213
+ .symbolsAt(nodes.map((node) => project.handle(node)))
214
+ .map(must)
215
+ .forEach((symbol, index) => {
216
+ const node = nodes[index];
217
+ if (symbol === undefined || node === undefined) {
218
+ return;
219
+ }
220
+ let target: TSSymbol | undefined = symbol;
221
+ if ((symbol.flags & SymbolFlags.Alias) !== 0) {
222
+ if (!followed.has(symbol.id)) {
223
+ const aliased = must(project.queries.aliased(symbol));
224
+ followed.set(symbol.id, aliased.declarations.length === 0 ? undefined : aliased);
225
+ }
226
+ target = followed.get(symbol.id);
227
+ }
228
+ if (target !== undefined) {
229
+ targets.set(node, target);
230
+ }
231
+ });
232
+ return targets;
233
+ }