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

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 (402) 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 +2 -7
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +269 -432
  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/calls.js +279 -43
  12. package/dist/src/commands/held.js +499 -0
  13. package/dist/src/commands/read.js +161 -0
  14. package/dist/src/commands/shell.js +169 -0
  15. package/dist/src/commands/tools.js +1847 -0
  16. package/dist/src/component-files.js +3 -2
  17. package/dist/src/component-layer.js +4 -2
  18. package/dist/src/config.js +6 -82
  19. package/dist/src/conformance-record.js +1 -1
  20. package/dist/src/consumers.js +10 -38
  21. package/dist/src/contextual-uses.js +57 -26
  22. package/dist/src/contract/config.generated.js +561 -0
  23. package/dist/src/contract/contract.generated.js +1369 -0
  24. package/dist/src/contract/report.generated.js +866 -0
  25. package/dist/src/dependencies.js +164 -121
  26. package/dist/src/destructuring.js +1 -19
  27. package/dist/src/edges.js +38 -122
  28. package/dist/src/element-access.js +181 -168
  29. package/dist/src/entries/build-scripts.js +222 -0
  30. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  31. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  32. package/dist/src/entries/conventions.js +740 -0
  33. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  34. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  35. package/dist/src/entries/run-directories.js +77 -0
  36. package/dist/src/entries/sources.js +144 -0
  37. package/dist/src/entries/static-module.js +670 -0
  38. package/dist/src/entries/test-runners.js +650 -0
  39. package/dist/src/entries/workflow-steps.js +345 -0
  40. package/dist/src/enum-group.js +3 -10
  41. package/dist/src/erased-stores.js +4 -6
  42. package/dist/src/exempt-classes.js +1 -63
  43. package/dist/src/exempt.js +21 -66
  44. package/dist/src/exposure.js +400 -0
  45. package/dist/src/extensions.js +37 -0
  46. package/dist/src/facts.js +38 -0
  47. package/dist/src/failure.js +36 -0
  48. package/dist/src/file-facts.js +3 -26
  49. package/dist/src/findings/completion.js +109 -56
  50. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  51. package/dist/src/findings/emitters.js +27 -41
  52. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  53. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  54. package/dist/src/findings/interfaces.js +4 -5
  55. package/dist/src/findings/intra-function.js +16 -13
  56. package/dist/src/findings/non-code-artifacts.js +17 -12
  57. package/dist/src/findings/reads-and-writes.js +86 -27
  58. package/dist/src/findings/self-check.js +44 -30
  59. package/dist/src/findings/unused-declarations.js +29 -45
  60. package/dist/src/findings/visibility-narrowing.js +23 -31
  61. package/dist/src/findings-pass.js +13 -21
  62. package/dist/src/framework-lifecycle.js +46 -19
  63. package/dist/src/fs/document.js +52 -0
  64. package/dist/src/fs/manifest.js +67 -0
  65. package/dist/src/fs/tree.js +88 -0
  66. package/dist/src/generated-file.js +174 -28
  67. package/dist/src/git-ignore.js +39 -26
  68. package/dist/src/import-bindings.js +73 -28
  69. package/dist/src/index/sites.js +557 -0
  70. package/dist/src/index.js +2 -2
  71. package/dist/src/indexed-access.js +523 -478
  72. package/dist/src/injection-container.js +2 -2
  73. package/dist/src/interface-satisfaction.js +1 -1
  74. package/dist/src/intra-function-parts.js +63 -43
  75. package/dist/src/inventory/commonjs.js +507 -0
  76. package/dist/src/inventory/enumerate.js +167 -0
  77. package/dist/src/inventory/syntax.js +236 -0
  78. package/dist/src/inventory.js +323 -724
  79. package/dist/src/javascript-file.js +48 -0
  80. package/dist/src/json-document.js +198 -67
  81. package/dist/src/keyof-comparisons.js +126 -107
  82. package/dist/src/kinds.js +3 -366
  83. package/dist/src/{components.js → liveness/components.js} +2 -3
  84. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  85. package/dist/src/liveness/matrix.js +99 -0
  86. package/dist/src/liveness/sweep.js +558 -0
  87. package/dist/src/load/classify.js +289 -0
  88. package/dist/src/load/diagnostics.js +87 -0
  89. package/dist/src/load/discover.js +285 -0
  90. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  91. package/dist/src/load/expected-module.js +136 -0
  92. package/dist/src/load/load.js +27 -0
  93. package/dist/src/load/module-lookup.js +37 -0
  94. package/dist/src/load/package-scope.js +56 -0
  95. package/dist/src/load/plan.js +313 -0
  96. package/dist/src/load/specifiers.js +113 -0
  97. package/dist/src/load/synthesize.js +152 -0
  98. package/dist/src/load/test-globals.js +207 -0
  99. package/dist/src/load/test-joins.js +82 -0
  100. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  101. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  102. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  103. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  104. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  105. package/dist/src/module-declarations.js +70 -85
  106. package/dist/src/overrides.js +134 -112
  107. package/dist/src/partial.js +2 -1
  108. package/dist/src/paths.js +82 -16
  109. package/dist/src/platform-calls.js +78 -0
  110. package/dist/src/platform-symbols.js +134 -0
  111. package/dist/src/position.js +43 -1
  112. package/dist/src/print.js +11 -79
  113. package/dist/src/product.js +13 -0
  114. package/dist/src/query.js +47 -0
  115. package/dist/src/ref.js +12 -20
  116. package/dist/src/references/read-rule.js +1 -0
  117. package/dist/src/references/read-rules.js +48 -0
  118. package/dist/src/references/sink.js +237 -0
  119. package/dist/src/references/sources.js +450 -0
  120. package/dist/src/references.js +117 -1074
  121. package/dist/src/report-schema.js +51 -0
  122. package/dist/src/report.js +57 -41
  123. package/dist/src/reporters/annotations.js +15 -8
  124. package/dist/src/reporters/sarif.js +16 -10
  125. package/dist/src/reporters/template.js +4 -19
  126. package/dist/src/resolve.js +246 -730
  127. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  128. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  129. package/dist/src/roots/manifest.js +216 -0
  130. package/dist/src/roots/published-reach.js +412 -0
  131. package/dist/src/roots/root-set.js +487 -0
  132. package/dist/src/roots/unseen-loads.js +236 -0
  133. package/dist/src/run.js +66 -77
  134. package/dist/src/schema.js +320 -343
  135. package/dist/src/scope.js +38 -115
  136. package/dist/src/serialization-contract.js +601 -22
  137. package/dist/src/session.js +37 -29
  138. package/dist/src/source-files.js +6 -10
  139. package/dist/src/stores.js +4 -2
  140. package/dist/src/suppress-file.js +25 -28
  141. package/dist/src/suppress-inline.js +36 -83
  142. package/dist/src/suppress.js +50 -71
  143. package/dist/src/symbol-keys.js +92 -88
  144. package/dist/src/template-field.js +9 -19
  145. package/dist/src/tests/file-class.js +76 -0
  146. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  147. package/dist/src/{test-support.js → tests/support.js} +5 -12
  148. package/dist/src/text/compare.js +26 -0
  149. package/dist/src/text/glob.js +194 -0
  150. package/dist/src/text/named-files.js +298 -0
  151. package/dist/src/text/yaml.js +684 -0
  152. package/dist/src/type-errors.js +11 -232
  153. package/dist/src/type-parameter-reads.js +178 -139
  154. package/dist/src/unimplemented-callees.js +262 -242
  155. package/dist/src/unwrap.js +23 -0
  156. package/dist/src/usage.js +10 -0
  157. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  158. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  159. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  160. package/dist/src/vendor/unbash/assignment.js +131 -0
  161. package/dist/src/vendor/unbash/chars.js +48 -0
  162. package/dist/src/vendor/unbash/command.js +41 -0
  163. package/dist/src/vendor/unbash/expansion.js +80 -0
  164. package/dist/src/vendor/unbash/glob.js +268 -0
  165. package/dist/src/vendor/unbash/heredoc.js +27 -0
  166. package/dist/src/vendor/unbash/internal-types.js +1 -0
  167. package/dist/src/vendor/unbash/lexer.js +4274 -0
  168. package/dist/src/vendor/unbash/limits.js +3 -0
  169. package/dist/src/vendor/unbash/parser.js +1366 -0
  170. package/dist/src/vendor/unbash/parts.js +57 -0
  171. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  172. package/dist/src/vendor/unbash/traversal.js +212 -0
  173. package/dist/src/vendor/unbash/types.js +1 -0
  174. package/dist/src/vendor/unbash/word-value.js +61 -0
  175. package/dist/src/vendor/unbash/word.js +40 -0
  176. package/dist/src/verbs/analyze.js +194 -127
  177. package/dist/src/verbs/describe.js +13 -18
  178. package/dist/src/verbs/explain.js +85 -139
  179. package/dist/src/verbs/print-config.js +2 -1
  180. package/dist/src/verbs/print-projects.js +6 -4
  181. package/dist/src/verbs/print-retained.js +7 -5
  182. package/dist/src/verbs/print-roots.js +4 -2
  183. package/dist/src/verbs/verb.js +1 -5
  184. package/dist/src/verbs/version.js +14 -3
  185. package/jsr.json +2 -1
  186. package/package.json +14 -8
  187. package/src/alias-chain.ts +2 -9
  188. package/src/amd.ts +130 -0
  189. package/src/analysis.ts +424 -650
  190. package/src/augmentations.ts +93 -4
  191. package/src/automatic-types.ts +12 -30
  192. package/src/bindings.ts +460 -0
  193. package/src/calls.ts +338 -46
  194. package/src/commands/held.ts +632 -0
  195. package/src/commands/read.ts +242 -0
  196. package/src/commands/shell.ts +228 -0
  197. package/src/commands/tools.ts +2382 -0
  198. package/src/component-files.ts +4 -2
  199. package/src/component-layer.ts +4 -2
  200. package/src/config.ts +31 -302
  201. package/src/conformance-record.ts +1 -1
  202. package/src/consumers.ts +16 -66
  203. package/src/contextual-uses.ts +66 -34
  204. package/src/contract/config.generated.ts +821 -0
  205. package/src/contract/contract.generated.ts +1452 -0
  206. package/src/contract/report.generated.ts +1241 -0
  207. package/src/dependencies.ts +222 -127
  208. package/src/destructuring.ts +1 -31
  209. package/src/edges.ts +41 -140
  210. package/src/element-access.ts +190 -187
  211. package/src/entries/build-scripts.ts +292 -0
  212. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  213. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  214. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  215. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  216. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  217. package/src/entries/run-directories.ts +108 -0
  218. package/src/entries/sources.ts +266 -0
  219. package/src/entries/static-module.ts +858 -0
  220. package/src/entries/test-runners.ts +835 -0
  221. package/src/entries/workflow-steps.ts +432 -0
  222. package/src/enum-group.ts +2 -11
  223. package/src/erased-stores.ts +3 -7
  224. package/src/exempt-classes.ts +1 -75
  225. package/src/exempt.ts +70 -98
  226. package/src/exposure.ts +492 -0
  227. package/src/extensions.ts +45 -0
  228. package/src/facts.ts +46 -0
  229. package/src/failure.ts +63 -0
  230. package/src/file-facts.ts +15 -25
  231. package/src/finding.ts +10 -10
  232. package/src/findings/boundary.ts +11 -0
  233. package/src/findings/completion.ts +133 -64
  234. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  235. package/src/findings/emitter.ts +9 -10
  236. package/src/findings/emitters.ts +38 -52
  237. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  238. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  239. package/src/findings/interfaces.ts +7 -9
  240. package/src/findings/intra-function.ts +16 -14
  241. package/src/findings/non-code-artifacts.ts +24 -15
  242. package/src/findings/reads-and-writes.ts +118 -41
  243. package/src/findings/self-check.ts +51 -38
  244. package/src/findings/unused-declarations.ts +31 -49
  245. package/src/findings/visibility-narrowing.ts +36 -40
  246. package/src/findings-pass.ts +15 -31
  247. package/src/framework-lifecycle.ts +47 -19
  248. package/src/fs/document.ts +70 -0
  249. package/src/fs/manifest.ts +96 -0
  250. package/src/fs/tree.ts +110 -0
  251. package/src/generated-file.ts +242 -35
  252. package/src/git-ignore.ts +50 -26
  253. package/src/host.ts +12 -5
  254. package/src/import-bindings.ts +98 -29
  255. package/src/index/sites.ts +781 -0
  256. package/src/index.ts +2 -2
  257. package/src/indexed-access.ts +570 -527
  258. package/src/injection-container.ts +2 -2
  259. package/src/interface-satisfaction.ts +2 -2
  260. package/src/intra-function-parts.ts +73 -44
  261. package/src/inventory/commonjs.ts +696 -0
  262. package/src/inventory/enumerate.ts +203 -0
  263. package/src/inventory/syntax.ts +311 -0
  264. package/src/inventory.ts +442 -895
  265. package/src/javascript-file.ts +54 -0
  266. package/src/json-document.ts +241 -76
  267. package/src/keyof-comparisons.ts +133 -122
  268. package/src/kinds.ts +5 -413
  269. package/src/{components.ts → liveness/components.ts} +4 -6
  270. package/src/{graph.ts → liveness/graph.ts} +100 -35
  271. package/src/liveness/matrix.ts +162 -0
  272. package/src/liveness/sweep.ts +855 -0
  273. package/src/load/classify.ts +433 -0
  274. package/src/load/diagnostics.ts +154 -0
  275. package/src/load/discover.ts +471 -0
  276. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  277. package/src/load/expected-module.ts +194 -0
  278. package/src/load/load.ts +73 -0
  279. package/src/load/module-lookup.ts +50 -0
  280. package/src/load/package-scope.ts +74 -0
  281. package/src/load/plan.ts +513 -0
  282. package/src/load/specifiers.ts +171 -0
  283. package/src/load/synthesize.ts +230 -0
  284. package/src/load/test-globals.ts +251 -0
  285. package/src/load/test-joins.ts +98 -0
  286. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  287. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  288. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  289. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  290. package/src/{workspace.ts → load/workspace.ts} +90 -134
  291. package/src/module-declarations.ts +74 -98
  292. package/src/overrides.ts +162 -134
  293. package/src/partial.ts +3 -2
  294. package/src/paths.ts +92 -16
  295. package/src/platform-calls.ts +119 -0
  296. package/src/platform-symbols.ts +189 -0
  297. package/src/position.ts +44 -1
  298. package/src/print.ts +12 -92
  299. package/src/product.ts +18 -0
  300. package/src/query.ts +92 -0
  301. package/src/ref.ts +12 -20
  302. package/src/references/read-rule.ts +60 -0
  303. package/src/references/read-rules.ts +55 -0
  304. package/src/references/sink.ts +314 -0
  305. package/src/references/sources.ts +632 -0
  306. package/src/references.ts +187 -1450
  307. package/src/report-schema.ts +68 -0
  308. package/src/report.ts +103 -226
  309. package/src/reporters/annotations.ts +22 -11
  310. package/src/reporters/json.ts +1 -1
  311. package/src/reporters/reporter.ts +2 -4
  312. package/src/reporters/reporters.ts +1 -1
  313. package/src/reporters/sarif.ts +29 -16
  314. package/src/reporters/template.ts +4 -20
  315. package/src/reporters/text.ts +3 -3
  316. package/src/resolve.ts +284 -1115
  317. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
  318. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  319. package/src/roots/manifest.ts +303 -0
  320. package/src/roots/published-reach.ts +486 -0
  321. package/src/{roots.ts → roots/root-set.ts} +286 -469
  322. package/src/roots/unseen-loads.ts +345 -0
  323. package/src/run.ts +75 -91
  324. package/src/schema.ts +391 -388
  325. package/src/scope.ts +46 -138
  326. package/src/serialization-contract.ts +769 -23
  327. package/src/session.ts +87 -55
  328. package/src/source-files.ts +6 -11
  329. package/src/stores.ts +15 -3
  330. package/src/suppress-file.ts +24 -33
  331. package/src/suppress-inline.ts +55 -91
  332. package/src/suppress.ts +78 -79
  333. package/src/symbol-keys.ts +104 -107
  334. package/src/template-field.ts +15 -25
  335. package/src/tests/file-class.ts +135 -0
  336. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  337. package/src/{test-support.ts → tests/support.ts} +15 -21
  338. package/src/text/compare.ts +27 -0
  339. package/src/text/glob.ts +210 -0
  340. package/src/text/named-files.ts +388 -0
  341. package/src/text/yaml.ts +747 -0
  342. package/src/type-errors.ts +18 -288
  343. package/src/type-parameter-reads.ts +187 -158
  344. package/src/unimplemented-callees.ts +297 -280
  345. package/src/unwrap.ts +34 -0
  346. package/src/usage.ts +10 -0
  347. package/src/vendor/unbash/LICENSE +15 -0
  348. package/src/vendor/unbash/VENDORED.md +16 -0
  349. package/src/vendor/unbash/ansi-c.ts +132 -0
  350. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  351. package/src/vendor/unbash/arithmetic.ts +641 -0
  352. package/src/vendor/unbash/assignment.ts +163 -0
  353. package/src/vendor/unbash/chars.ts +48 -0
  354. package/src/vendor/unbash/command.ts +47 -0
  355. package/src/vendor/unbash/expansion.ts +144 -0
  356. package/src/vendor/unbash/glob.ts +284 -0
  357. package/src/vendor/unbash/heredoc.ts +34 -0
  358. package/src/vendor/unbash/internal-types.ts +94 -0
  359. package/src/vendor/unbash/lexer.ts +4352 -0
  360. package/src/vendor/unbash/limits.ts +3 -0
  361. package/src/vendor/unbash/parser.ts +1612 -0
  362. package/src/vendor/unbash/parts.ts +96 -0
  363. package/src/vendor/unbash/substitution-context.ts +20 -0
  364. package/src/vendor/unbash/traversal.ts +182 -0
  365. package/src/vendor/unbash/types.ts +660 -0
  366. package/src/vendor/unbash/word-value.ts +64 -0
  367. package/src/vendor/unbash/word.ts +50 -0
  368. package/src/verbs/analyze.ts +255 -164
  369. package/src/verbs/describe.ts +19 -17
  370. package/src/verbs/explain.ts +93 -169
  371. package/src/verbs/print-config.ts +2 -1
  372. package/src/verbs/print-projects.ts +6 -4
  373. package/src/verbs/print-retained.ts +7 -5
  374. package/src/verbs/print-roots.ts +4 -2
  375. package/src/verbs/verb.ts +2 -8
  376. package/src/verbs/version.ts +15 -3
  377. package/dist/src/base-url.js +0 -18
  378. package/dist/src/conventions.js +0 -937
  379. package/dist/src/discover.js +0 -468
  380. package/dist/src/entry-points.js +0 -529
  381. package/dist/src/glob.js +0 -65
  382. package/dist/src/manifest.js +0 -165
  383. package/dist/src/matrix.js +0 -246
  384. package/dist/src/pnpm-workspace.js +0 -120
  385. package/dist/src/roots.js +0 -672
  386. package/dist/src/setup-failure.js +0 -23
  387. package/dist/src/sweep.js +0 -224
  388. package/dist/src/test-joins.js +0 -101
  389. package/dist/src/version.js +0 -7
  390. package/dist/src/workflow-steps.js +0 -185
  391. package/src/base-url.ts +0 -24
  392. package/src/discover.ts +0 -653
  393. package/src/entry-points.ts +0 -687
  394. package/src/glob.ts +0 -67
  395. package/src/manifest.ts +0 -234
  396. package/src/matrix.ts +0 -423
  397. package/src/pnpm-workspace.ts +0 -135
  398. package/src/setup-failure.ts +0 -39
  399. package/src/sweep.ts +0 -347
  400. package/src/test-joins.ts +0 -120
  401. package/src/version.ts +0 -7
  402. 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,11 @@
1
- import { runSweep } from "../analysis.js";
1
+ import { EXIT_CLEAN } from "../contract/contract.generated.js";
2
+ import { productionMode, runSweep } from "../analysis.js";
2
3
  import { retainedLines } from "../exempt.js";
3
4
  import { partialNotes } from "../partial.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";
7
9
  /**
8
10
  * Writes every declaration an exemption held back in the production sweep a report is
9
11
  * built from, one per line, and nothing where no exemption held one back. One fact
@@ -16,9 +18,9 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
16
18
  const scoped = scope();
17
19
  const swept = runSweep(openClient(config), host, scoped, config, {
18
20
  marked: [],
19
- mode: { production: true },
21
+ mode: productionMode(config),
20
22
  });
21
- for (const line of retainedLines(swept.matrix.union.symbols, swept.retained)) {
23
+ for (const line of retainedLines(swept.matrix.union.symbols, swept.sweep.retained)) {
22
24
  out.write(`${line}\n`);
23
25
  }
24
26
  for (const note of partialNotes({
@@ -26,7 +28,7 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
26
28
  unanswered: swept.unanswered,
27
29
  targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
28
30
  })) {
29
- err.write(`deadset-ts: ${note}\n`);
31
+ diagnose(err, note);
30
32
  }
31
33
  return EXIT_CLEAN;
32
34
  };
@@ -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.20",
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.20",
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",
@@ -14,7 +14,7 @@ import {
14
14
  isNamespaceImport,
15
15
  } from "@typescript/native/ast";
16
16
  import { SymbolFlags, type Symbol as TSSymbol } from "@typescript/native/sync";
17
- import { declarationsByName, isParameterProperty, nodeKey, type Inventory } from "./inventory.ts";
17
+ import { isParameterProperty, nodeKey, type Inventory } from "./inventory.ts";
18
18
  import { UNANSWERED, type Answer } from "./query.ts";
19
19
  import type { ProjectView } from "./session.ts";
20
20
 
@@ -49,8 +49,6 @@ export interface AliasChains {
49
49
  * link is declared.
50
50
  */
51
51
  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
52
  }
55
53
 
56
54
  /**
@@ -65,7 +63,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
65
63
  const ownFiles = project.ownPaths();
66
64
  const steps = new Map<number, Answer<TSSymbol | undefined>>();
67
65
  const chains = new Map<number, readonly ChainTarget[]>();
68
- let asked = 0;
69
66
 
70
67
  const declarationsOf = (symbol: TSSymbol): string[] => {
71
68
  const ids: string[] = [];
@@ -102,7 +99,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
102
99
  return steps.get(symbol.id);
103
100
  }
104
101
  const next = project.aliasStepOf(symbol);
105
- asked += 1;
106
102
  steps.set(symbol.id, next);
107
103
  return next;
108
104
  };
@@ -132,7 +128,7 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
132
128
  names.add(node.expression.text);
133
129
  }
134
130
  }
135
- const byName = declarationsByName(held);
131
+ const byName = held.byName;
136
132
  const ids = [...names].flatMap((name) => byName.get(name) ?? []);
137
133
  return [...new Set([...ids, ...(module ? files : [])])].map((id) => ({
138
134
  id,
@@ -197,8 +193,5 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
197
193
  declarationsOf,
198
194
  chainOf,
199
195
  nextDeclared,
200
- get steps() {
201
- return asked;
202
- },
203
196
  };
204
197
  }