@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
package/src/exempt.ts CHANGED
@@ -7,24 +7,53 @@
7
7
  * hands it the table of the classes it has.
8
8
  */
9
9
 
10
- import type { Config, TSSection } from "./config.ts";
11
- import { ConfigError } from "./config.ts";
10
+ import { EXEMPTION_CLASSES } from "./contract/contract.generated.ts";
11
+ import type { GeneratedFact } from "./generated-file.ts";
12
+ import type { ResolvedConfig } from "./config.ts";
12
13
  import {
13
- EXEMPTION_CLASSES,
14
- isExemptionClass,
15
14
  TS_EXEMPTION_CLASSES,
16
15
  typescriptVisibilityOf,
17
16
  type ExemptionClass,
18
17
  type TSExemptionClass,
19
18
  type TypeScriptVisibility,
20
19
  } from "./exempt-classes.ts";
21
- import type { Inventory, InventorySymbol, SymbolKind, Visibility } from "./inventory.ts";
22
- import type { Matrix } from "./matrix.ts";
20
+ import type { Inventory, InventorySymbol, Visibility } from "./inventory.ts";
23
21
  import { byPosition, positionKey, type Position } from "./position.ts";
24
22
  import { Unanswerable } from "./query.ts";
25
23
  import type { ProjectView } from "./session.ts";
26
24
  import type { Templates } from "./template-field.ts";
27
- import { sweep, type Exemption, type Implementing, type Mode, type SweepInput } from "./sweep.ts";
25
+ import type { Mode } from "./tests/file-class.ts";
26
+ import { bytewise } from "./text/compare.ts";
27
+
28
+ /** One declaration an exemption class holds back, and the evidence it was found by. */
29
+ export interface Exemption {
30
+ /** The identifier of the declaration held back. */
31
+ readonly id: string;
32
+ readonly class: TSExemptionClass;
33
+ /** One clause naming the relation, then the thing it relates to: `passed to JSON.stringify`. */
34
+ readonly detail: string;
35
+ /** Where the evidence is written. */
36
+ readonly site: Position;
37
+ /**
38
+ * The component file, below the target root, whose markup holds the evidence. The
39
+ * record holds only while that file is live.
40
+ */
41
+ readonly whileLive?: string;
42
+ /**
43
+ * The interface methods the retained member implements, and whether its body is empty.
44
+ * The record holds only while one of them is called through its interface.
45
+ */
46
+ readonly implementing?: Implementing;
47
+ /** Whether the record holds only where a write the mode counts stores into the declaration. */
48
+ readonly whileWritten?: true;
49
+ }
50
+
51
+ /** The interface methods one retained class member implements, and whether its body is empty. */
52
+ interface Implementing {
53
+ /** The declarations of the interface's methods the member answers, by identifier. */
54
+ readonly methods: readonly string[];
55
+ readonly empty: boolean;
56
+ }
28
57
 
29
58
  /** One declaration a detector holds back, and where and why. */
30
59
  export interface Evidence {
@@ -37,6 +66,8 @@ export interface Evidence {
37
66
  readonly whileLive?: string;
38
67
  /** Where the evidence is an implementation of interface methods, which and how. */
39
68
  readonly implementing?: Implementing;
69
+ /** Whether the evidence holds only where a write the mode counts stores into the declaration. */
70
+ readonly whileWritten?: true;
40
71
  }
41
72
 
42
73
  /** What a detector reads of one project, while the project's view is open. */
@@ -47,11 +78,11 @@ export interface DetectorInput<Brand> {
47
78
  /** The configured templates, read once for the run. */
48
79
  readonly templates: Templates;
49
80
  /** The `ts` section, whose declarations the configured classes read. */
50
- readonly ts: TSSection;
81
+ readonly ts: ResolvedConfig["ts"];
51
82
  /** The absolute path of each declared consumer, whose modules are part of the analysis. */
52
83
  readonly consumers: readonly string[];
53
- /** The project's generated files, by path below the target root, each with the detail its retentions name. */
54
- readonly generated?: ReadonlyMap<string, string>;
84
+ /** The project's generated files, by path below the target root, each with what decided it. */
85
+ readonly generated?: ReadonlyMap<string, GeneratedFact>;
55
86
  }
56
87
 
57
88
  /**
@@ -71,24 +102,11 @@ interface Holding {
71
102
  }
72
103
 
73
104
  /**
74
- * The classes `exemptions.disabled` switches off. A name is refused unless the
75
- * vocabulary holds it; a class that runs on another language only is admitted and
76
- * switches nothing off here, so one configuration serves every analyzer.
105
+ * The classes `exemptions.disabled` switches off. A class that runs on another language
106
+ * only switches nothing off here, so one configuration serves every analyzer.
77
107
  */
78
- export function disabledClasses(config: Config): ReadonlySet<ExemptionClass> {
79
- const disabled = new Set<ExemptionClass>();
80
- for (const name of config.exemptionsDisabled) {
81
- if (!isExemptionClass(name)) {
82
- const known = EXEMPTION_CLASSES.map((row) => row.class).join(", ");
83
- throw new ConfigError(
84
- "malformed",
85
- "exemptions.disabled",
86
- `exemptions.disabled: ${JSON.stringify(name)} is not an exemption class: the classes are ${known}`,
87
- );
88
- }
89
- disabled.add(name);
90
- }
91
- return disabled;
108
+ export function disabledClasses(config: ResolvedConfig): ReadonlySet<ExemptionClass> {
109
+ return new Set(config.exemptions.disabled);
92
110
  }
93
111
 
94
112
  /**
@@ -105,20 +123,12 @@ function retainable(allowed: TypeScriptVisibility, visibility: Visibility | unde
105
123
  return true;
106
124
  }
107
125
 
108
- /**
109
- * The kinds of declaration each class can hold back, which a detector that stops holds
110
- * back whole. A class with no row here holds back every declaration but a file.
111
- */
112
- const RETAINABLE: ReadonlyMap<TSExemptionClass, ReadonlySet<SymbolKind>> = new Map([
113
- ["interface-satisfaction", new Set<SymbolKind>(["method", "class-member"])],
114
- ["enum-group", new Set<SymbolKind>(["enum-member"])],
115
- ["injection-container", new Set<SymbolKind>(["method", "class-member"])],
116
- ["framework-lifecycle", new Set<SymbolKind>(["method", "class-member"])],
117
- [
118
- "serialization-contract",
119
- new Set<SymbolKind>(["method", "class-member", "interface-method", "type-member"]),
120
- ],
121
- ]);
126
+ /** The kinds of declaration each class can hold back, which a detector that stops holds back whole. */
127
+ const RETAINABLE: ReadonlyMap<string, ReadonlySet<string>> = new Map(
128
+ EXEMPTION_CLASSES.flatMap((row) =>
129
+ "ts" in row.retainsKinds ? [[row.class, new Set<string>(row.retainsKinds.ts)] as const] : [],
130
+ ),
131
+ );
122
132
 
123
133
  /** The detail of a record a detector that could not finish holds. */
124
134
  const UNANSWERED_DETAIL = "kept live by a question the checker did not answer";
@@ -147,7 +157,7 @@ function detected<Brand>(
147
157
  }
148
158
  const kinds = RETAINABLE.get(exemptionClass);
149
159
  return input.held.symbols
150
- .filter((symbol) => (kinds === undefined ? symbol.kind !== "file" : kinds.has(symbol.kind)))
160
+ .filter((symbol) => kinds?.has(symbol.kind) === true)
151
161
  .map((symbol) => ({ id: symbol.id, detail: UNANSWERED_DETAIL, site: symbol.position }));
152
162
  }
153
163
  }
@@ -193,12 +203,26 @@ export function evidenceRecords<Brand>(
193
203
  site: evidence.site,
194
204
  ...(evidence.whileLive === undefined ? {} : { whileLive: evidence.whileLive }),
195
205
  ...(evidence.implementing === undefined ? {} : { implementing: evidence.implementing }),
206
+ ...(evidence.whileWritten === undefined ? {} : { whileWritten: evidence.whileWritten }),
196
207
  });
197
208
  }
198
209
  }
199
210
  return found;
200
211
  }
201
212
 
213
+ /**
214
+ * The records that hold given the declarations a write the mode counts stores into: one
215
+ * that holds only while written holds where its declaration is among them.
216
+ */
217
+ export function writtenRecords(
218
+ records: readonly Exemption[],
219
+ written: ReadonlySet<string>,
220
+ ): readonly Exemption[] {
221
+ return records.flatMap(({ whileWritten, ...record }) =>
222
+ whileWritten === undefined || written.has(record.id) ? [record] : [],
223
+ );
224
+ }
225
+
202
226
  /** The records that hold under one mode, beside the evidence a production mode found in a test file. */
203
227
  export function heldRecords(records: readonly Exemption[], holding: Holding): Detected {
204
228
  const found: Exemption[] = [];
@@ -213,14 +237,6 @@ export function heldRecords(records: readonly Exemption[], holding: Holding): De
213
237
  return { records: exemptionsOf(found), inTestFiles };
214
238
  }
215
239
 
216
- /** Two strings ordered bytewise. */
217
- function compare(a: string, b: string): number {
218
- if (a === b) {
219
- return 0;
220
- }
221
- return a < b ? -1 : 1;
222
- }
223
-
224
240
  /**
225
241
  * Records as a run holds them: ordered by site, then class, then declaration, and one
226
242
  * per declaration, class, detail and file it holds while live, the one at the first
@@ -228,7 +244,7 @@ function compare(a: string, b: string): number {
228
244
  */
229
245
  export function exemptionsOf(found: readonly Exemption[]): readonly Exemption[] {
230
246
  const ordered = [...found].sort(
231
- (a, b) => byPosition(a.site, b.site) || compare(a.class, b.class) || compare(a.id, b.id),
247
+ (a, b) => byPosition(a.site, b.site) || bytewise(a.class, b.class) || bytewise(a.id, b.id),
232
248
  );
233
249
  const seen = new Set<string>();
234
250
  return ordered.filter((record) => {
@@ -241,21 +257,6 @@ export function exemptionsOf(found: readonly Exemption[]): readonly Exemption[]
241
257
  });
242
258
  }
243
259
 
244
- /**
245
- * The records that hold while the component files at `live` are live: every record that
246
- * holds whatever is live, and each one a live file's markup holds, as a record of the run.
247
- */
248
- export function holdingWhile(
249
- records: readonly Exemption[],
250
- live: ReadonlySet<string>,
251
- ): readonly Exemption[] {
252
- return exemptionsOf(
253
- records.flatMap(({ whileLive, ...record }) =>
254
- whileLive === undefined || live.has(whileLive) ? [record] : [],
255
- ),
256
- );
257
- }
258
-
259
260
  /** The records per declaration, each declaration's in the order given. */
260
261
  function byDeclaration(records: readonly Exemption[]): ReadonlyMap<string, readonly Exemption[]> {
261
262
  const grouped = new Map<string, Exemption[]>();
@@ -271,37 +272,8 @@ function byDeclaration(records: readonly Exemption[]): ReadonlyMap<string, reado
271
272
  }
272
273
 
273
274
  /**
274
- * The records that held back a declaration: one some configuration's graph, swept
275
- * again with no exemption and its marks, judges a candidate, whatever another
276
- * configuration answers, or one in `writeOnly`, which the run would report as written
277
- * and never read without the record's read. A declaration a relation or a mark holds
278
- * live in every configuration is held back by no record. The order is the
279
- * declarations' site order, and for one declaration the input's.
280
- */
281
- export function retainedIn(
282
- matrix: Matrix,
283
- input: SweepInput,
284
- writeOnly: ReadonlySet<string> = new Set(),
285
- ): readonly Exemption[] {
286
- const exempt = input.exempt ?? [];
287
- if (exempt.length === 0) {
288
- return [];
289
- }
290
- const bare: SweepInput = { marked: input.marked, mode: input.mode };
291
- const dead = new Set(
292
- matrix.graphs.flatMap((graph) =>
293
- sweep(graph, bare).candidates.map((candidate) => candidate.id),
294
- ),
295
- );
296
- const held = byDeclaration(
297
- exempt.filter((record) => dead.has(record.id) || writeOnly.has(record.id)),
298
- );
299
- return matrix.union.symbols.flatMap((symbol) => held.get(symbol.id) ?? []);
300
- }
301
-
302
- /**
303
- * One line per held-back declaration, in site order: its reference, then each record's
304
- * class, site and detail, all separated by tabs.
275
+ * One line per held-back declaration, in site order: its reference and position, then
276
+ * each record's class, site and detail, all separated by tabs.
305
277
  */
306
278
  export function retainedLines(
307
279
  symbols: readonly InventorySymbol[],
@@ -318,6 +290,6 @@ export function retainedLines(
318
290
  positionKey(record.site),
319
291
  record.detail,
320
292
  ]);
321
- return [[symbol.ref, ...fields].join("\t")];
293
+ return [[symbol.ref, positionKey(symbol.position), ...fields].join("\t")];
322
294
  });
323
295
  }