@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
@@ -5,6 +5,7 @@
5
5
  * write to a local that no read reaches, and each case an earlier case covers.
6
6
  */
7
7
 
8
+ import { CODE } from "./contract/contract.generated.ts";
8
9
  import {
9
10
  isArrowFunction,
10
11
  isAwaitExpression,
@@ -95,6 +96,7 @@ import type { Reference } from "./references.ts";
95
96
  import type { ProjectView } from "./session.ts";
96
97
  import { signatureOf, type SignatureNode } from "./signatures.ts";
97
98
  import { spellsNoBinding } from "./spelled-names.ts";
99
+ import { parenthesesRemoved } from "./unwrap.ts";
98
100
 
99
101
  /** The subject kind of each part this module reads. */
100
102
  type PartKind = "parameter" | "result" | "statement" | "store" | "case";
@@ -137,6 +139,12 @@ interface ParameterPlace {
137
139
  * so the annotation may steer the call's inference.
138
140
  */
139
141
  readonly annotated?: "steers" | "free";
142
+ /**
143
+ * Whether the name is one an object binding pattern of a parameter binds, and the
144
+ * compiler gives its function a contextual type: the code handing the argument may act on
145
+ * the pattern's read of the property, which the program does not show.
146
+ */
147
+ readonly contextualPattern?: true;
140
148
  /** Whether the compiler checks the parameter's file, so its unused-parameter rule may report it. */
141
149
  readonly checked: boolean;
142
150
  }
@@ -173,13 +181,6 @@ export interface ProjectParts {
173
181
  readonly constructions: ReadonlySet<string>;
174
182
  }
175
183
 
176
- /** The codes of the parts this module reads. */
177
- export const UNUSED_PARAMETER = "DS1801";
178
- export const UNUSED_RESULT = "DS1803";
179
- const UNREACHABLE_STATEMENT = "DS1805";
180
- const DEAD_STORE = "DS1807";
181
- const UNREACHABLE_CASE = "DS1809";
182
-
183
184
  /** The result types that carry no value, as the checker spells them. */
184
185
  const NO_VALUE: ReadonlySet<string> = new Set([
185
186
  "void",
@@ -197,11 +198,6 @@ function spanOf(file: SourceFile, root: string, node: Node): FindingPosition {
197
198
  return { ...start, endLine };
198
199
  }
199
200
 
200
- /** The parenthesized expression's content, through every pair of parentheses. */
201
- function unwrapped(node: Node): Node {
202
- return isParenthesizedExpression(node) ? unwrapped(node.expression) : node;
203
- }
204
-
205
201
  /** The node the parentheses around one expression sit in. */
206
202
  function outerParent(node: Node): Node {
207
203
  return isParenthesizedExpression(node.parent) ? outerParent(node.parent) : node.parent;
@@ -209,7 +205,7 @@ function outerParent(node: Node): Node {
209
205
 
210
206
  /** The name a call is made through: the identifier, or the member a property access names. */
211
207
  function calleeName(call: CallExpression): Identifier | undefined {
212
- const callee = unwrapped(call.expression);
208
+ const callee = parenthesesRemoved(call.expression);
213
209
  if (isIdentifier(callee)) {
214
210
  return callee;
215
211
  }
@@ -276,7 +272,7 @@ function unreachableExempt(statement: Statement): boolean {
276
272
 
277
273
  /** The value a case expression is a literal of, as a key two equal literals share, or none. */
278
274
  function caseKey(expression: Node): string | undefined {
279
- const node = unwrapped(expression);
275
+ const node = parenthesesRemoved(expression);
280
276
  if (isStringLiteral(node) || isNoSubstitutionTemplateLiteral(node)) {
281
277
  return `s:${node.text}`;
282
278
  }
@@ -402,7 +398,7 @@ function extendedNames(files: readonly SourceFile[]): ReadonlySet<string> {
402
398
  if (isTypeReferenceNode(type)) {
403
399
  named = isQualifiedName(type.typeName) ? type.typeName.right : type.typeName;
404
400
  } else {
405
- const expression = unwrapped(type.expression);
401
+ const expression = parenthesesRemoved(type.expression);
406
402
  named = isPropertyAccessExpression(expression) ? expression.name : expression;
407
403
  }
408
404
  if (isIdentifier(named)) {
@@ -455,7 +451,7 @@ function decoratorFixes(constructor: ConstructorDeclaration): boolean {
455
451
 
456
452
  /** The name an expression spells a class by: an identifier, or the member a property access names. */
457
453
  function spelledName(expression: Node): Identifier | undefined {
458
- const node = unwrapped(expression);
454
+ const node = parenthesesRemoved(expression);
459
455
  if (isIdentifier(node)) {
460
456
  return node;
461
457
  }
@@ -724,8 +720,8 @@ export function projectParts<Brand>(
724
720
  if ((isImportClause(node) || isNamespaceImport(node)) && node.name !== undefined) {
725
721
  specifiers.add(position(node.name));
726
722
  }
727
- if (isExportAssignment(node) && isIdentifier(unwrapped(node.expression))) {
728
- specifiers.add(position(unwrapped(node.expression)));
723
+ if (isExportAssignment(node) && isIdentifier(parenthesesRemoved(node.expression))) {
724
+ specifiers.add(position(parenthesesRemoved(node.expression)));
729
725
  }
730
726
  if (isSwitchStatement(node)) {
731
727
  const holder = holderOf(node);
@@ -863,7 +859,7 @@ export function projectParts<Brand>(
863
859
  }
864
860
  walk.catches.forEach(({ name, holder }, at) => {
865
861
  parts.push({
866
- code: DEAD_STORE,
862
+ code: CODE.deadStore,
867
863
  declaration: holder,
868
864
  kind: "store",
869
865
  name: name.text,
@@ -875,7 +871,7 @@ export function projectParts<Brand>(
875
871
  for (const { names, uses, holder } of loopVariables) {
876
872
  for (const name of names) {
877
873
  parts.push({
878
- code: DEAD_STORE,
874
+ code: CODE.deadStore,
879
875
  declaration: holder,
880
876
  kind: "store",
881
877
  name: name.text,
@@ -893,7 +889,7 @@ export function projectParts<Brand>(
893
889
  });
894
890
  for (const { statement, holder } of walk.unreachable) {
895
891
  parts.push({
896
- code: UNREACHABLE_STATEMENT,
892
+ code: CODE.unreachableStatement,
897
893
  declaration: holder,
898
894
  kind: "statement",
899
895
  name: "statement",
@@ -904,7 +900,7 @@ export function projectParts<Brand>(
904
900
  }
905
901
  for (const { clause, text, holder } of walk.cases) {
906
902
  parts.push({
907
- code: UNREACHABLE_CASE,
903
+ code: CODE.unreachableCase,
908
904
  declaration: holder,
909
905
  kind: "case",
910
906
  name: text,
@@ -1093,10 +1089,9 @@ function calleeSteers<Brand>(
1093
1089
 
1094
1090
  /**
1095
1091
  * The parts with each name of `contextual` judged where the compiler gives its function a
1096
- * contextual type: the code handing the argument may act on what an object pattern reads,
1097
- * so each such name is read, and an annotated parameter is marked with whether the call's
1098
- * inference may read its annotation. A question the checker leaves unanswered keeps the
1099
- * name read.
1092
+ * contextual type: a name an object pattern binds is marked as one, and an annotated
1093
+ * parameter with whether the call's inference may read its annotation. A question the
1094
+ * checker leaves unanswered keeps the name read.
1100
1095
  */
1101
1096
  function withContextualRead<Brand>(
1102
1097
  project: ProjectView<Brand>,
@@ -1118,15 +1113,17 @@ function withContextualRead<Brand>(
1118
1113
  const place = one.part.parameter;
1119
1114
  judged.set(
1120
1115
  one.part,
1121
- one.pattern || answer === UNANSWERED || place === undefined
1116
+ answer === UNANSWERED || place === undefined
1122
1117
  ? { ...one.part, used: true }
1123
- : {
1124
- ...one.part,
1125
- parameter: {
1126
- ...place,
1127
- annotated: calleeSteers(project, one.signature, one.at) ? "steers" : "free",
1118
+ : one.pattern
1119
+ ? { ...one.part, parameter: { ...place, contextualPattern: true } }
1120
+ : {
1121
+ ...one.part,
1122
+ parameter: {
1123
+ ...place,
1124
+ annotated: calleeSteers(project, one.signature, one.at) ? "steers" : "free",
1125
+ },
1128
1126
  },
1129
- },
1130
1127
  );
1131
1128
  }
1132
1129
  return parts.map((part) => judged.get(part) ?? part);
@@ -1169,7 +1166,7 @@ function parameterParts(
1169
1166
  return;
1170
1167
  }
1171
1168
  const part: PartFact = {
1172
- code: UNUSED_PARAMETER,
1169
+ code: CODE.unusedParameter,
1173
1170
  declaration,
1174
1171
  kind: "parameter",
1175
1172
  name: name.text,
@@ -1205,6 +1202,8 @@ interface Local {
1205
1202
  readonly uses: readonly Identifier[];
1206
1203
  /** A `var` of a nested block, whose function scope outlives the block's end. */
1207
1204
  readonly outlives: boolean;
1205
+ /** A function declaration, written at the start of the block whatever its place. */
1206
+ readonly hoisted: boolean;
1208
1207
  }
1209
1208
 
1210
1209
  /**
@@ -1244,9 +1243,10 @@ function functionOf(block: Block): FunctionLikeDeclaration | undefined {
1244
1243
  }
1245
1244
 
1246
1245
  /**
1247
- * The locals one block declares with `let`, `const` or `var`, each with the names of the
1248
- * block that spell it. A `var` of a nested block is one where no nested function of its
1249
- * function names it, since the function scope holds it past the block's end.
1246
+ * The locals one block declares with `let`, `const`, `var` or a function declaration
1247
+ * inside a function, each with the names of the block that spell it. A `var` of a nested
1248
+ * block is one where no nested function of its function names it, since the function scope
1249
+ * holds it past the block's end.
1250
1250
  */
1251
1251
  function localsOf(block: Block): readonly Local[] {
1252
1252
  const declared: {
@@ -1254,10 +1254,23 @@ function localsOf(block: Block): readonly Local[] {
1254
1254
  statement: number;
1255
1255
  initialized: boolean;
1256
1256
  outlives: boolean;
1257
+ hoisted: boolean;
1257
1258
  }[] = [];
1258
1259
  const scope = functionOf(block);
1259
1260
  const outlives = scope?.body !== block;
1260
1261
  block.statements.forEach((statement, at) => {
1262
+ if (isFunctionDeclaration(statement)) {
1263
+ if (scope !== undefined && statement.name !== undefined && statement.body !== undefined) {
1264
+ declared.push({
1265
+ name: statement.name,
1266
+ statement: at,
1267
+ initialized: true,
1268
+ outlives: false,
1269
+ hoisted: true,
1270
+ });
1271
+ }
1272
+ return;
1273
+ }
1261
1274
  if (!isVariableStatement(statement)) {
1262
1275
  return;
1263
1276
  }
@@ -1267,6 +1280,11 @@ function localsOf(block: Block): readonly Local[] {
1267
1280
  return;
1268
1281
  }
1269
1282
  for (const declaration of list.declarations) {
1283
+ // A write to a local typed `never` is the compiler's exhaustiveness check, which
1284
+ // fails to compile once a case goes unhandled.
1285
+ if (declaration.type?.kind === SyntaxKind.NeverKeyword) {
1286
+ continue;
1287
+ }
1270
1288
  for (const name of boundNames(declaration.name)) {
1271
1289
  if (
1272
1290
  !blockScoped &&
@@ -1282,6 +1300,7 @@ function localsOf(block: Block): readonly Local[] {
1282
1300
  statement: at,
1283
1301
  initialized: declaration.initializer !== undefined,
1284
1302
  outlives: !blockScoped && outlives,
1303
+ hoisted: false,
1285
1304
  });
1286
1305
  }
1287
1306
  }
@@ -1302,7 +1321,7 @@ function isPlainWrite(use: Identifier): boolean {
1302
1321
  return (
1303
1322
  isBinaryExpression(parent) &&
1304
1323
  parent.operatorToken.kind === SyntaxKind.EqualsToken &&
1305
- unwrapped(parent.left) === use
1324
+ parenthesesRemoved(parent.left) === use
1306
1325
  );
1307
1326
  }
1308
1327
 
@@ -1324,7 +1343,7 @@ function deadStores(
1324
1343
  ): PartFact[] {
1325
1344
  const found: PartFact[] = [];
1326
1345
  const deadAt = (local: Local, target: Identifier): PartFact => ({
1327
- code: DEAD_STORE,
1346
+ code: CODE.deadStore,
1328
1347
  declaration: holder,
1329
1348
  kind: "store",
1330
1349
  name: local.name.text,
@@ -1333,12 +1352,22 @@ function deadStores(
1333
1352
  used: false,
1334
1353
  });
1335
1354
  for (const local of locals) {
1336
- const uses = local.uses.filter((use) => readsBinding(use, local.name, ids));
1355
+ const own = local.hoisted ? block.statements[local.statement] : undefined;
1356
+ // A function's reads of itself keep it no more than its absence would.
1357
+ const uses = local.uses.filter(
1358
+ (use) => readsBinding(use, local.name, ids) && (own === undefined || !within(use, own)),
1359
+ );
1337
1360
  if (!local.outlives && uses.every(isPlainWrite)) {
1338
- const targets = [...(local.initialized ? [local.name] : []), ...uses];
1361
+ // A declaration with no initializer writes `undefined`, the one store left to name.
1362
+ const writes = [...(local.initialized ? [local.name] : []), ...uses];
1363
+ const targets = writes.length === 0 ? [local.name] : writes;
1339
1364
  found.push(...targets.map((target) => deadAt(local, target)));
1340
1365
  continue;
1341
1366
  }
1367
+ // A read anywhere in the block reads a function declaration, which is written first.
1368
+ if (local.hoisted) {
1369
+ continue;
1370
+ }
1342
1371
  if (uses.some((use) => inNestedFunction(use, block))) {
1343
1372
  continue;
1344
1373
  }
@@ -1349,14 +1378,14 @@ function deadStores(
1349
1378
  if (!isExpressionStatement(statement)) {
1350
1379
  return undefined;
1351
1380
  }
1352
- const expression = unwrapped(statement.expression);
1381
+ const expression = parenthesesRemoved(statement.expression);
1353
1382
  if (
1354
1383
  !isBinaryExpression(expression) ||
1355
1384
  expression.operatorToken.kind !== SyntaxKind.EqualsToken
1356
1385
  ) {
1357
1386
  return undefined;
1358
1387
  }
1359
- const target = unwrapped(expression.left);
1388
+ const target = parenthesesRemoved(expression.left);
1360
1389
  return isIdentifier(target) && uses.includes(target)
1361
1390
  ? { target, value: expression.right }
1362
1391
  : undefined;
@@ -1443,7 +1472,7 @@ function resultParts<Brand>(
1443
1472
  const valued = project.queries.nonNullable(result);
1444
1473
  const members = isAnswered(valued) ? project.queries.propertiesOf(valued) : UNANSWERED;
1445
1474
  found.push({
1446
- code: UNUSED_RESULT,
1475
+ code: CODE.unusedResult,
1447
1476
  declaration: id,
1448
1477
  kind: "result",
1449
1478
  name: "result",