@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
package/src/file-facts.ts CHANGED
@@ -5,12 +5,13 @@
5
5
  */
6
6
 
7
7
  import type { SourceFile } from "@typescript/native/ast";
8
- import { IGNORED_DIRECTORIES } from "./discover.ts";
9
8
  import type { Host } from "./host.ts";
10
- import { packageScope } from "./inventory.ts";
9
+ import { packageScope } from "./load/package-scope.ts";
11
10
  import { dirnamePath, joinPath, relativePath, resolvePath } from "./paths.ts";
12
11
  import { renderRef } from "./ref.ts";
13
12
  import type { ProjectView } from "./session.ts";
13
+ import type { UnseenLoad } from "./roots/unseen-loads.ts";
14
+ import { filesBelow } from "./fs/tree.ts";
14
15
 
15
16
  /** A file name the compiler reads as a source file. */
16
17
  const SOURCE_FILE = /\.(?:ts|tsx|mts|cts)$/u;
@@ -51,6 +52,13 @@ export interface FileFacts {
51
52
  readonly generated?: ReadonlySet<string>;
52
53
  /** The property names an `in` expression of a production file tests by a literal. */
53
54
  readonly inOperands?: ReadonlySet<string>;
55
+ /** The loads of production files whose target the analysis cannot resolve. */
56
+ readonly unseenLoads?: readonly UnseenLoad[];
57
+ /**
58
+ * The directories below the target root, `.` for the root, of the packages a command of
59
+ * which may run a file whose path no word of it writes (`roots.13`).
60
+ */
61
+ readonly unwrittenRuns?: ReadonlySet<string>;
54
62
  }
55
63
 
56
64
  /** The line of the last character of one text, counted from one; an empty text is one line. */
@@ -71,29 +79,11 @@ function lastLine(text: string): number {
71
79
  * that cannot be read is skipped, as discovery skips it.
72
80
  */
73
81
  export function sourcePaths(host: Host, targetRoot: string): readonly string[] {
74
- const found: string[] = [];
75
- const pending = [""];
76
- for (let dir = pending.pop(); dir !== undefined; dir = pending.pop()) {
77
- let entries: readonly { readonly name: string; readonly directory: boolean }[];
78
- try {
79
- entries = host.readDirectory(joinPath(targetRoot, dir));
80
- } catch {
81
- continue;
82
- }
83
- for (const entry of entries) {
84
- const path = dir === "" ? entry.name : `${dir}/${entry.name}`;
85
- if (entry.directory) {
86
- if (!IGNORED_DIRECTORIES.has(entry.name)) {
87
- pending.push(path);
88
- }
89
- continue;
90
- }
91
- if (SOURCE_FILE.test(entry.name) && !DECLARATION_FILE.test(entry.name)) {
92
- found.push(path);
93
- }
94
- }
95
- }
96
- return found.sort((a, b) => (a < b ? -1 : 1));
82
+ return filesBelow(
83
+ host,
84
+ targetRoot,
85
+ (name) => SOURCE_FILE.test(name) && !DECLARATION_FILE.test(name),
86
+ );
97
87
  }
98
88
 
99
89
  /**
package/src/finding.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { Confidence, Severity } from "./config.ts";
2
- import type { Fixability } from "./kinds.ts";
1
+ import type { Fixability, Confidence, Severity } from "./contract/contract.generated.ts";
3
2
  import type { DependencySection } from "./ref.ts";
4
3
  import type { Mechanism } from "./suppress.ts";
5
- import type { Relation } from "./sweep.ts";
4
+ import type { Relation } from "./liveness/sweep.ts";
5
+ import type { FindingSymbol } from "./contract/report.generated.ts";
6
6
 
7
7
  /**
8
8
  * The finding: what an emitter decides about one subject, and every member the
@@ -29,7 +29,7 @@ interface FindingSubject {
29
29
  /** The stable symbol reference, or for a configured root the root as written. */
30
30
  readonly ref: string;
31
31
  /** The subject kind, from the closed vocabulary of the finding schema. */
32
- readonly kind: string;
32
+ readonly kind: FindingSymbol["kind"];
33
33
  /** The display name a text line renders. */
34
34
  readonly name: string;
35
35
  /** The number of source lines the subject spans. */
@@ -55,19 +55,19 @@ export interface PositionedSymbol {
55
55
  */
56
56
  export interface FindingDetails {
57
57
  /**
58
- * On `DS1101` and `DS1104`: the widest scope that holds every reference to the
58
+ * On `DS1501` and `DS1503`: the widest scope that holds every reference to the
59
59
  * subject, which is the visibility its references support.
60
60
  */
61
61
  readonly narrowerVisibility?: "file" | "package";
62
- /** On `DS1201` and `DS1203`: the classes implementing the interface, in site order. */
62
+ /** On `DS1201` and `DS1202`: the classes implementing the interface, in site order. */
63
63
  readonly implementations?: readonly PositionedSymbol[];
64
- /** On `DS1301` and `DS1807`: every position the subject is written at, in site order. */
64
+ /** On `DS1301` and `DS1404`: every position the subject is written at, in site order. */
65
65
  readonly writePositions?: readonly FindingPosition[];
66
- /** On `DS1601`: the manifest section that declares the dependency. */
66
+ /** On `DS1701`: the manifest section that declares the dependency. */
67
67
  readonly dependencyClass?: DependencySection;
68
- /** On `DS1701` and `DS1702`: the document that holds the refused suppression. */
68
+ /** On `DS9001` and `DS9002`: the document that holds the refused suppression. */
69
69
  readonly mechanism?: Mechanism;
70
- /** On `DS1701` and `DS1702`: the refused suppression as written, a member absent where it lacks one. */
70
+ /** On `DS9001` and `DS9002`: the refused suppression as written, a member absent where it lacks one. */
71
71
  readonly entry?: SuppressionEntry;
72
72
  /** On the intra-function kinds: the external rules that report the same kind, as the vocabulary lists them. */
73
73
  readonly overlap?: readonly string[];
@@ -1,3 +1,5 @@
1
+ import type { Carriers } from "../exposure.ts";
2
+
1
3
  /** Which side of a declared cross-language edge, as the edges document spells it. */
2
4
  export type EdgeSideName = "provides" | "used_by";
3
5
 
@@ -25,4 +27,13 @@ export interface Boundary {
25
27
  readonly encapsulated: boolean;
26
28
  /** Every side of a declared cross-language edge that names a symbol of this language. */
27
29
  readonly edges: readonly EdgeSide[];
30
+ /** The members a function outside the analysis fills, which it may read unseen. */
31
+ readonly filledOutside?: ReadonlySet<string>;
32
+ /** The files and declarations only a bundler's retry of an import Node leaves unresolved names. */
33
+ readonly possiblyLoaded?: ReadonlySet<string>;
34
+ /**
35
+ * The types of the target each declaration hands to code that holds its values, which a
36
+ * reference from outside the package reaches through it.
37
+ */
38
+ readonly carriers?: Carriers;
28
39
  }
@@ -4,39 +4,38 @@
4
4
  * together with every finding that falls with a root they withhold.
5
5
  */
6
6
 
7
+ import {
8
+ CODE,
9
+ FAMILY_KEY_LENGTH,
10
+ type Confidence,
11
+ type Severity,
12
+ KIND_ROWS,
13
+ type KindRow,
14
+ } from "../contract/contract.generated.ts";
7
15
  import type { RunSweep } from "../analysis.ts";
8
- import { componentId, type Component } from "../components.ts";
9
- import { deadComponents } from "../matrix.ts";
10
- import type { Cascade, Confidence, Severity } from "../config.ts";
16
+ import { componentId, type Component } from "../liveness/components.ts";
17
+ import { deadComponents } from "../liveness/sweep.ts";
18
+ import type { Cascade } from "../config.ts";
11
19
  import type { CompletedFinding, Finding, FindingComponent, PositionedSymbol } from "../finding.ts";
12
- import { OUTSIDE, type Graph } from "../graph.ts";
20
+ import { OUTSIDE, type Graph } from "../liveness/graph.ts";
13
21
  import type { SymbolKind } from "../inventory.ts";
14
- import { KINDS, type KindRow } from "../kinds.ts";
22
+ import { KINDS } from "../kinds.ts";
15
23
  import { byPosition, positionKey } from "../position.ts";
16
24
  import { declarationKey } from "../ref.ts";
17
- import { FAMILY_KEY_LENGTH } from "../resolve.ts";
18
25
  import { isPartSubject, isRowSubject, type Dials } from "../suppress.ts";
19
- import type { Candidate } from "../sweep.ts";
26
+ import type { Candidate } from "../liveness/sweep.ts";
20
27
  import type { Boundary } from "./boundary.ts";
21
28
  import type { EmitterInput } from "./emitter.ts";
22
29
 
23
- /** The unused-file code, whose deletion removes every use its file writes. */
24
- const FILE_NEVER_IMPORTED = "DS1502";
25
-
26
30
  /**
27
- * The codes whose subject the run that counts test references holds live, as
28
- * finding.schema.json lists them, so a test file's candidate reported under one carries
29
- * none of a dead declaration's sweep facts.
31
+ * The codes whose subject the run that counts test references holds live, so a test
32
+ * file's candidate reported under one carries none of a dead declaration's sweep facts.
30
33
  */
31
- const LIVE_SUBJECT: ReadonlySet<string> = new Set([
32
- "DS1101",
33
- "DS1102",
34
- "DS1104",
35
- "DS1204",
36
- "DS1301",
37
- ]);
34
+ const LIVE_SUBJECT: ReadonlySet<string> = new Set(
35
+ KIND_ROWS.filter((row) => row.holdsLive).map((row) => row.code),
36
+ );
38
37
 
39
- /** The fixability grammar/analysis.md "Fixability" gives a finding about a held declaration. */
38
+ /** The fixability grammar/analysis/fixability.md gives a finding about a held declaration. */
40
39
  const MANUAL = "manual";
41
40
 
42
41
  /** The member kinds an object property can declare, which an `in` expression tests by name. */
@@ -66,10 +65,9 @@ function everyDeclaredLoaded(boundary: Boundary): boolean {
66
65
  * naming its family, else the code's default.
67
66
  */
68
67
  function severityOf(input: EmitterInput, code: string, fallback: Severity): Severity {
69
- const { config } = input;
70
- return (
71
- config.severity.get(code) ?? config.severity.get(code.slice(0, FAMILY_KEY_LENGTH)) ?? fallback
72
- );
68
+ const { severity } = input.config;
69
+ const key = [code, code.slice(0, FAMILY_KEY_LENGTH)].find((one) => Object.hasOwn(severity, one));
70
+ return key === undefined ? fallback : (severity[key] ?? fallback);
73
71
  }
74
72
 
75
73
  /**
@@ -112,10 +110,13 @@ function testedByIn(input: EmitterInput): ReadonlySet<string> {
112
110
  * published API, a public member of a published type included, is `certain` where the
113
111
  * run loaded every consumer the scope declared and declared one, `probable` where one did
114
112
  * not load, and `possible` where it declared none, whatever the configuration says of the
115
- * consumer set. A member an `in` expression tests by name is `possible`.
113
+ * consumer set. A member an `in` expression tests by name, one a function outside the
114
+ * analysis fills, and one {@link possiblyLoaded} names, is `possible`.
116
115
  */
117
- function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
116
+ export function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
118
117
  const tested = testedByIn(input);
118
+ const filled = input.boundary.filledOutside ?? new Set<string>();
119
+ const possible = possiblyLoaded(input);
119
120
  const published = publishedIds(input.swept.matrix.union);
120
121
  const { declared } = input.boundary.consumers;
121
122
  const outside: Confidence =
@@ -125,7 +126,7 @@ function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
125
126
  ? "certain"
126
127
  : "probable";
127
128
  return (id) => {
128
- if (tested.has(id)) {
129
+ if (tested.has(id) || filled.has(id) || possible.has(id)) {
129
130
  return "possible";
130
131
  }
131
132
  return published.has(id) ? outside : "certain";
@@ -168,9 +169,39 @@ function testCeilings(
168
169
  : "certain";
169
170
  }
170
171
 
172
+ /**
173
+ * What only a bundler's retry of an import Node leaves unresolved names (program.38), and each
174
+ * dead declaration that reaches through dead declarations, as confidence.20 reads what only
175
+ * tests reach: each is dead only while no loader the analysis does not see loads the file.
176
+ */
177
+ function possiblyLoaded(input: EmitterInput): ReadonlySet<string> {
178
+ const seeds = input.boundary.possiblyLoaded ?? new Set<string>();
179
+ if (seeds.size === 0) {
180
+ return seeds;
181
+ }
182
+ const union = input.swept.matrix.union;
183
+ const dead = new Set(input.swept.sweep.candidates.map((one) => one.id));
184
+ const reached = new Set<string>();
185
+ const pending = union.symbols.flatMap((symbol, at) => (seeds.has(symbol.id) ? [at] : []));
186
+ for (let at = pending.pop(); at !== undefined; at = pending.pop()) {
187
+ const symbol = union.symbols[at];
188
+ if (symbol === undefined || reached.has(symbol.id)) {
189
+ continue;
190
+ }
191
+ reached.add(symbol.id);
192
+ for (const edge of union.out[at] ?? []) {
193
+ const to = union.symbols[edge.to];
194
+ if (to !== undefined && dead.has(to.id)) {
195
+ pending.push(edge.to);
196
+ }
197
+ }
198
+ }
199
+ return reached;
200
+ }
201
+
171
202
  /**
172
203
  * The subjects dead only because production code only tests use is: each declaration the
173
- * sweep marks test-used, each `DS1502` file of such code, and each test of dead code every
204
+ * sweep marks test-used, each `DS1602` file of such code, and each test of dead code every
174
205
  * target of which is one. Nothing they hold references a dead declaration outside them, so
175
206
  * the rest of a component they share is reported without them.
176
207
  */
@@ -197,17 +228,21 @@ function testUsedSubjects(input: EmitterInput): {
197
228
 
198
229
  /**
199
230
  * The ceiling the roots the run found put on one dead subject: a subject other declarations
200
- * reference, found dead only because no root reaches them, is `probable` unless
201
- * the configuration declares the roots complete, because a root the analysis cannot see
202
- * would make it live; every other declaration has none below `certain`.
231
+ * reference, found dead only because no root reaches them, is `probable` unless the
232
+ * configuration declares the roots complete and no configuration holding the subject loads
233
+ * a module the analysis cannot resolve, because a root the analysis cannot see would make
234
+ * it live; every other declaration has none below `certain`.
203
235
  */
204
236
  function rootsCeiling(
205
237
  input: EmitterInput,
206
238
  finding: Finding,
207
239
  candidate: Candidate | undefined,
240
+ configurations: readonly string[],
208
241
  ): Confidence {
209
242
  const unreachable = candidate?.relation === "reachability" || finding.unreachableOnly === true;
210
- return unreachable && !input.config.ts.rootsComplete ? "probable" : "certain";
243
+ const unseen = new Set((input.files.unseenLoads ?? []).map((load) => load.configuration));
244
+ const complete = input.config.ts.roots_complete && !configurations.some((one) => unseen.has(one));
245
+ return unreachable && !complete ? "probable" : "certain";
211
246
  }
212
247
 
213
248
  /**
@@ -225,9 +260,28 @@ function findingComponents(
225
260
  held.set(member, component);
226
261
  }
227
262
  }
263
+ const listed = membersListed(swept);
264
+ return (id) => {
265
+ const component = held.get(id);
266
+ return component === undefined
267
+ ? undefined
268
+ : {
269
+ id: component.id,
270
+ root: component.roots.includes(id),
271
+ symbolCount: component.members.length,
272
+ deletableLines: component.deletableLines,
273
+ ...(cascade === "full" ? { members: listed(component.members) } : {}),
274
+ };
275
+ };
276
+ }
277
+
278
+ /** The members of a component as the run lists them, positioned and in the canonical order. */
279
+ function membersListed(
280
+ swept: RunSweep,
281
+ ): (members: readonly string[]) => readonly PositionedSymbol[] {
228
282
  const symbols = new Map(swept.matrix.union.symbols.map((symbol) => [symbol.id, symbol]));
229
- const listed = (component: Component): readonly PositionedSymbol[] =>
230
- component.members
283
+ return (members) =>
284
+ members
231
285
  .flatMap((member) => {
232
286
  const symbol = symbols.get(member);
233
287
  return symbol === undefined
@@ -244,22 +298,10 @@ function findingComponents(
244
298
  ];
245
299
  })
246
300
  .sort((a, b) => byPosition(a.position, b.position));
247
- return (id) => {
248
- const component = held.get(id);
249
- return component === undefined
250
- ? undefined
251
- : {
252
- id: component.id,
253
- root: component.roots.includes(id),
254
- symbolCount: component.members.length,
255
- deletableLines: component.deletableLines,
256
- ...(cascade === "full" ? { members: listed(component) } : {}),
257
- };
258
- };
259
301
  }
260
302
 
261
303
  /**
262
- * The run's dead components with each file a `DS1502` finding reports dead among them, so
304
+ * The run's dead components with each file a `DS1602` finding reports dead among them, so
263
305
  * the file's declarations fall with it, and with the components each subject that is no
264
306
  * declaration falls with joined into one.
265
307
  */
@@ -273,7 +315,7 @@ function runComponents(
273
315
  } {
274
316
  const union = swept.matrix.union;
275
317
  const reported = new Set(
276
- findings.filter((one) => one.code === FILE_NEVER_IMPORTED).map((one) => one.position.path),
318
+ findings.filter((one) => one.code === CODE.fileNeverImported).map((one) => one.position.path),
277
319
  );
278
320
  const files = new Map(
279
321
  union.symbols.flatMap((symbol, at) =>
@@ -348,6 +390,9 @@ export function completed(
348
390
  union.symbols.map((symbol, at) => [declarationKey(symbol.ref, symbol.position.path), at]),
349
391
  );
350
392
  const candidates = new Map(swept.sweep.candidates.map((candidate) => [candidate.id, candidate]));
393
+ const fileIds = new Map(
394
+ union.symbols.flatMap((one) => (one.kind === "file" ? [[one.position.path, one.id]] : [])),
395
+ );
351
396
  const classOf = reachabilityClasses(input);
352
397
  const ceilingOf = testCeilings(input, classOf);
353
398
  const testUsed = testUsedSubjects(input);
@@ -357,12 +402,13 @@ export function completed(
357
402
  // A join keeps its first component's identifier, so a minted one counts past every computed one.
358
403
  let minted = computed;
359
404
  const dead = new Set(components.map((component) => component.id));
360
- const fallingWith = new Map<string, number>();
361
- for (const { heldByTests } of swept.sweep.candidates) {
405
+ const fallingWith = new Map<string, string[]>();
406
+ for (const { id, heldByTests } of swept.sweep.candidates) {
362
407
  if (heldByTests !== undefined) {
363
- fallingWith.set(heldByTests, (fallingWith.get(heldByTests) ?? 0) + 1);
408
+ fallingWith.set(heldByTests, [...(fallingWith.get(heldByTests) ?? []), id]);
364
409
  }
365
410
  }
411
+ const listed = membersListed(swept);
366
412
 
367
413
  const done = findings.map((finding): CompletedFinding => {
368
414
  const row = kinds.get(finding.code);
@@ -391,7 +437,7 @@ export function completed(
391
437
  const fallsWith = finding.fallsWith?.[0];
392
438
  const joined = fallsWith === undefined ? undefined : componentOf(fallsWith);
393
439
  const file =
394
- finding.code === FILE_NEVER_IMPORTED ? files.get(finding.position.path) : undefined;
440
+ finding.code === CODE.fileNeverImported ? files.get(finding.position.path) : undefined;
395
441
  const found =
396
442
  joined !== undefined
397
443
  ? { ...joined, root: false }
@@ -413,11 +459,25 @@ export function completed(
413
459
  let component = found;
414
460
  if (component === undefined) {
415
461
  minted += 1;
462
+ const falling = symbol?.kind === "interface" ? fallingWith.get(symbol.id) : undefined;
416
463
  component = {
417
464
  id: componentId(minted),
418
465
  root: true,
419
- symbolCount: symbol?.kind === "interface" ? (fallingWith.get(symbol.id) ?? 1) : 1,
466
+ symbolCount: falling?.length ?? 1,
420
467
  deletableLines: 0,
468
+ ...(input.config.reporters.cascade !== "full"
469
+ ? {}
470
+ : falling === undefined
471
+ ? {
472
+ members: [
473
+ {
474
+ ref: finding.symbol.ref,
475
+ name: finding.symbol.name,
476
+ position: finding.position,
477
+ },
478
+ ],
479
+ }
480
+ : { members: listed(falling) }),
421
481
  };
422
482
  }
423
483
  const counts =
@@ -425,14 +485,27 @@ export function completed(
425
485
  ? union.made[at]
426
486
  : { production: candidate.productionRefs, test: candidate.testRefs };
427
487
  const ownClass =
428
- judged === undefined ? (finding.reachabilityClass ?? "certain") : classOf(judged.id);
488
+ judged !== undefined
489
+ ? classOf(judged.id)
490
+ : (finding.reachabilityClass ??
491
+ (finding.code === CODE.fileNeverImported
492
+ ? classOf(fileIds.get(finding.position.path) ?? "")
493
+ : "certain"));
429
494
  const used =
430
495
  judged !== undefined
431
496
  ? candidate !== undefined && testUsed.declarations.has(judged.id)
432
- : finding.code === FILE_NEVER_IMPORTED && testUsed.files.has(finding.position.path);
497
+ : finding.code === CODE.fileNeverImported && testUsed.files.has(finding.position.path);
433
498
  const reachabilityClass = used && candidate?.testOfDeadCode !== true ? "possible" : ownClass;
499
+ const configurations =
500
+ candidate?.configurations ??
501
+ (judged === undefined && !part
502
+ ? swept.matrix.configurations
503
+ : (swept.matrix.heldIn[at] ?? swept.matrix.configurations));
434
504
  const untested = capped(
435
- capped(capped(ownClass, row.maxClass), rootsCeiling(input, finding, candidate)),
505
+ capped(
506
+ capped(ownClass, row.maxClass),
507
+ rootsCeiling(input, finding, candidate, configurations),
508
+ ),
436
509
  judged === undefined ? "certain" : ceilingOf(judged.id),
437
510
  );
438
511
  const generated = input.files.generated?.has(finding.position.path) === true;
@@ -449,7 +522,7 @@ export function completed(
449
522
  ? undefined
450
523
  : candidate !== undefined
451
524
  ? input.dependencies.lastUses.get(candidate.id)
452
- : finding.code === FILE_NEVER_IMPORTED
525
+ : finding.code === CODE.fileNeverImported
453
526
  ? input.dependencies.fileLastUses.get(finding.position.path)
454
527
  : undefined;
455
528
  return {
@@ -466,11 +539,7 @@ export function completed(
466
539
  generated,
467
540
  component,
468
541
  retainedBy: [],
469
- configurations:
470
- candidate?.configurations ??
471
- (judged === undefined && !part
472
- ? swept.matrix.configurations
473
- : (swept.matrix.heldIn[at] ?? swept.matrix.configurations)),
542
+ configurations,
474
543
  consumersLoaded: input.boundary.consumers.loaded,
475
544
  fixability,
476
545
  severity: severityOf(input, finding.code, row.defaultSeverity),
@@ -540,7 +609,7 @@ export function dialsOf(
540
609
  input: EmitterInput,
541
610
  findings: readonly CompletedFinding[],
542
611
  ): Dials<CompletedFinding> {
543
- const minConfidence = input.config.analysis.minConfidence;
612
+ const minConfidence = input.config.analysis.min_confidence;
544
613
  const components = new Set(
545
614
  findings
546
615
  .filter(
@@ -1,13 +1,10 @@
1
+ import { CODE } from "../contract/contract.generated.ts";
1
2
  import { declarationKey, type Dependencies } from "../dependencies.ts";
2
3
  import type { Finding } from "../finding.ts";
3
4
  import { renderRef, type DependencySection } from "../ref.ts";
4
5
  import type { Emitter, EmitterInput } from "./emitter.ts";
5
6
  import { nonCodeArtifacts } from "./non-code-artifacts.ts";
6
7
 
7
- const UNUSED_DEPENDENCY = "DS1601";
8
-
9
- const FILE_NEVER_IMPORTED = "DS1502";
10
-
11
8
  const MESSAGES: Readonly<Record<DependencySection, string>> = {
12
9
  dependency: "no import in the target needs the declared dependency",
13
10
  "dev-dependency": "no import in the target needs the declared development dependency",
@@ -46,7 +43,7 @@ function deadCode(input: EmitterInput): DeadCode {
46
43
  );
47
44
  for (const finding of nonCodeArtifacts(input)) {
48
45
  const id = files.get(finding.position.path);
49
- if (finding.code === FILE_NEVER_IMPORTED && id !== undefined) {
46
+ if (finding.code === CODE.fileNeverImported && id !== undefined) {
50
47
  dead.add(id);
51
48
  if (finding.unreachableOnly === true) {
52
49
  reachedOnly.add(id);
@@ -81,7 +78,7 @@ function unusedDependencies(input: EmitterInput, dependencies: Dependencies): Fi
81
78
  const atPossible = unbuilt || users?.some((id) => published.has(id)) === true;
82
79
  return [
83
80
  {
84
- code: UNUSED_DEPENDENCY,
81
+ code: CODE.unusedDependency,
85
82
  position: dependency.position,
86
83
  symbol: {
87
84
  ref: renderRef(dependency.manifest, {
@@ -105,6 +102,6 @@ function unusedDependencies(input: EmitterInput, dependencies: Dependencies): Fi
105
102
  });
106
103
  }
107
104
 
108
- /** The findings of the dependencies-and-module-machinery family, `DS1600` to `DS1699`. */
105
+ /** The findings of the dependencies family, `DS1700` to `DS1799`. */
109
106
  export const dependenciesAndModuleMachinery: Emitter = (input) =>
110
107
  unusedDependencies(input, input.dependencies);
@@ -1,9 +1,9 @@
1
1
  import type { RunSweep } from "../analysis.ts";
2
- import type { Config } from "../config.ts";
2
+ import type { ResolvedConfig } from "../config.ts";
3
3
  import type { Dependencies } from "../dependencies.ts";
4
4
  import type { FileFacts } from "../file-facts.ts";
5
5
  import type { Finding } from "../finding.ts";
6
- import type { Implementations } from "../implementations.ts";
6
+ import type { Implementations } from "./implementations.ts";
7
7
  import type { IntraFunctionFacts } from "../intra-function-parts.ts";
8
8
  import type { Stores } from "../stores.ts";
9
9
  import type { Boundary } from "./boundary.ts";
@@ -11,10 +11,10 @@ import type { SelfCheckFacts } from "./self-check.ts";
11
11
 
12
12
  /**
13
13
  * What every emitter reads: the configuration the run resolved, the run's sweep, and
14
- * the facts about the run each kind family reads beside the sweep.
14
+ * the facts about the run each emitter reads beside the sweep.
15
15
  */
16
16
  export interface EmitterInput {
17
- readonly config: Config;
17
+ readonly config: ResolvedConfig;
18
18
  /** The production sweep a report is built from, beside the matrix it judged. */
19
19
  readonly swept: RunSweep;
20
20
  /** The declarations carrying the deprecation marker in any configuration of the run. */
@@ -29,18 +29,17 @@ export interface EmitterInput {
29
29
  readonly files: FileFacts;
30
30
  /** What can reach the target from outside it: consumers, declared edges, and `exports`. */
31
31
  readonly boundary: Boundary;
32
- /** The run's suppression outcomes and configured roots, which the self-check family reports. */
32
+ /** The run's suppression outcomes and configured roots, which the configuration family reports. */
33
33
  readonly selfCheck: SelfCheckFacts;
34
- /** The parts of the run's declarations, which the intra-function family reports. */
34
+ /** The parts of the run's declarations, which the inside-functions family reports. */
35
35
  readonly intraFunction: IntraFunctionFacts;
36
36
  }
37
37
 
38
38
  /**
39
- * One kind family's rule over one run: every finding of the codes in its family's range
40
- * of the Contract's code space, whatever severity and minimum confidence the
41
- * configuration sets, in no particular order.
39
+ * One emitter's rule over one run: every finding of the codes it reports, whatever
40
+ * severity and minimum confidence the configuration sets, in no particular order.
42
41
  */
43
42
  export type Emitter = (input: EmitterInput) => readonly Finding[];
44
43
 
45
- /** The emitter of each kind family, by the family's name in the Contract, in code order. */
44
+ /** Every emitter this analyzer runs, by the name its tests select it by. */
46
45
  export type Emitters = ReadonlyMap<string, Emitter>;