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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +35 -9
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +274 -496
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/commands/held.js +499 -0
  12. package/dist/src/commands/read.js +161 -0
  13. package/dist/src/commands/shell.js +169 -0
  14. package/dist/src/commands/tools.js +1847 -0
  15. package/dist/src/component-files.js +3 -2
  16. package/dist/src/component-layer.js +4 -2
  17. package/dist/src/config.js +6 -82
  18. package/dist/src/conformance-record.js +2 -2
  19. package/dist/src/consumers.js +10 -38
  20. package/dist/src/contextual-uses.js +57 -26
  21. package/dist/src/contract/config.generated.js +561 -0
  22. package/dist/src/contract/contract.generated.js +1370 -0
  23. package/dist/src/contract/report.generated.js +866 -0
  24. package/dist/src/dependencies.js +165 -122
  25. package/dist/src/destructuring.js +1 -19
  26. package/dist/src/edges.js +38 -122
  27. package/dist/src/element-access.js +181 -168
  28. package/dist/src/entries/build-scripts.js +222 -0
  29. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  30. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  31. package/dist/src/entries/conventions.js +740 -0
  32. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  33. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  34. package/dist/src/entries/run-directories.js +77 -0
  35. package/dist/src/entries/sources.js +144 -0
  36. package/dist/src/entries/static-module.js +670 -0
  37. package/dist/src/entries/test-runners.js +650 -0
  38. package/dist/src/entries/workflow-steps.js +345 -0
  39. package/dist/src/exemptions/argument-places.js +131 -0
  40. package/dist/src/exemptions/calls.js +338 -0
  41. package/dist/src/exemptions/classes.js +13 -0
  42. package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
  43. package/dist/src/exemptions/detectors.js +48 -0
  44. package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
  45. package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
  46. package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
  47. package/dist/src/exemptions/generated-file.js +241 -0
  48. package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
  49. package/dist/src/exemptions/installed-globals.js +173 -0
  50. package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
  51. package/dist/src/exemptions/lifecycle.js +150 -0
  52. package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
  53. package/dist/src/exemptions/serialization-contract.js +1276 -0
  54. package/dist/src/exemptions/sites.js +182 -0
  55. package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
  56. package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
  57. package/dist/src/exposure.js +400 -0
  58. package/dist/src/extensions.js +37 -0
  59. package/dist/src/facts.js +38 -0
  60. package/dist/src/failure.js +36 -0
  61. package/dist/src/file-facts.js +3 -26
  62. package/dist/src/findings/completion.js +109 -56
  63. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  64. package/dist/src/findings/emitters.js +27 -41
  65. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  66. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  67. package/dist/src/findings/interfaces.js +4 -5
  68. package/dist/src/findings/intra-function.js +16 -13
  69. package/dist/src/findings/non-code-artifacts.js +17 -12
  70. package/dist/src/findings/reads-and-writes.js +86 -27
  71. package/dist/src/findings/self-check.js +44 -30
  72. package/dist/src/findings/unused-declarations.js +29 -45
  73. package/dist/src/findings/visibility-narrowing.js +23 -31
  74. package/dist/src/findings-pass.js +13 -21
  75. package/dist/src/fs/document.js +52 -0
  76. package/dist/src/fs/manifest.js +67 -0
  77. package/dist/src/fs/tree.js +88 -0
  78. package/dist/src/git-ignore.js +39 -26
  79. package/dist/src/import-bindings.js +73 -28
  80. package/dist/src/index/sites.js +557 -0
  81. package/dist/src/index/values.js +124 -0
  82. package/dist/src/index.js +2 -2
  83. package/dist/src/indexed-access.js +523 -478
  84. package/dist/src/intra-function-parts.js +63 -43
  85. package/dist/src/inventory/commonjs.js +507 -0
  86. package/dist/src/inventory/enumerate.js +167 -0
  87. package/dist/src/inventory/syntax.js +236 -0
  88. package/dist/src/inventory.js +323 -724
  89. package/dist/src/javascript-file.js +48 -0
  90. package/dist/src/json-document.js +198 -67
  91. package/dist/src/keyof-comparisons.js +126 -107
  92. package/dist/src/kinds.js +3 -366
  93. package/dist/src/{components.js → liveness/components.js} +2 -3
  94. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  95. package/dist/src/liveness/matrix.js +99 -0
  96. package/dist/src/liveness/sweep.js +558 -0
  97. package/dist/src/load/classify.js +289 -0
  98. package/dist/src/load/diagnostics.js +87 -0
  99. package/dist/src/load/discover.js +285 -0
  100. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  101. package/dist/src/load/expected-module.js +136 -0
  102. package/dist/src/load/load.js +27 -0
  103. package/dist/src/load/module-lookup.js +37 -0
  104. package/dist/src/load/package-scope.js +56 -0
  105. package/dist/src/load/plan.js +313 -0
  106. package/dist/src/load/specifiers.js +113 -0
  107. package/dist/src/load/synthesize.js +152 -0
  108. package/dist/src/load/test-globals.js +207 -0
  109. package/dist/src/load/test-joins.js +82 -0
  110. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  111. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  112. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  113. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  114. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  115. package/dist/src/module-declarations.js +70 -85
  116. package/dist/src/overrides.js +134 -112
  117. package/dist/src/partial.js +2 -1
  118. package/dist/src/paths.js +82 -16
  119. package/dist/src/platform-calls.js +78 -0
  120. package/dist/src/platform-symbols.js +134 -0
  121. package/dist/src/position.js +43 -1
  122. package/dist/src/print.js +11 -79
  123. package/dist/src/product.js +13 -0
  124. package/dist/src/query.js +95 -0
  125. package/dist/src/ref.js +12 -20
  126. package/dist/src/references/read-rule.js +1 -0
  127. package/dist/src/references/read-rules.js +48 -0
  128. package/dist/src/references/sink.js +237 -0
  129. package/dist/src/references/sources.js +450 -0
  130. package/dist/src/references.js +117 -1074
  131. package/dist/src/report-schema.js +51 -0
  132. package/dist/src/report.js +57 -41
  133. package/dist/src/reporters/annotations.js +15 -8
  134. package/dist/src/reporters/sarif.js +16 -10
  135. package/dist/src/reporters/template.js +4 -19
  136. package/dist/src/resolve.js +246 -730
  137. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  138. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  139. package/dist/src/roots/manifest.js +216 -0
  140. package/dist/src/roots/published-reach.js +412 -0
  141. package/dist/src/roots/root-set.js +487 -0
  142. package/dist/src/roots/unseen-loads.js +236 -0
  143. package/dist/src/run.js +66 -77
  144. package/dist/src/schema.js +320 -343
  145. package/dist/src/scope.js +38 -115
  146. package/dist/src/session.js +37 -29
  147. package/dist/src/source-files.js +6 -10
  148. package/dist/src/stores.js +4 -2
  149. package/dist/src/suppress-file.js +25 -28
  150. package/dist/src/suppress-inline.js +36 -83
  151. package/dist/src/suppress.js +50 -71
  152. package/dist/src/symbol-keys.js +92 -88
  153. package/dist/src/tests/file-class.js +76 -0
  154. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  155. package/dist/src/{test-support.js → tests/support.js} +5 -12
  156. package/dist/src/text/compare.js +26 -0
  157. package/dist/src/text/glob.js +194 -0
  158. package/dist/src/text/named-files.js +298 -0
  159. package/dist/src/text/yaml.js +684 -0
  160. package/dist/src/type-errors.js +11 -232
  161. package/dist/src/type-parameter-reads.js +178 -139
  162. package/dist/src/unimplemented-callees.js +262 -242
  163. package/dist/src/unwrap.js +23 -0
  164. package/dist/src/usage.js +10 -0
  165. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  166. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  167. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  168. package/dist/src/vendor/unbash/assignment.js +131 -0
  169. package/dist/src/vendor/unbash/chars.js +48 -0
  170. package/dist/src/vendor/unbash/command.js +41 -0
  171. package/dist/src/vendor/unbash/expansion.js +80 -0
  172. package/dist/src/vendor/unbash/glob.js +268 -0
  173. package/dist/src/vendor/unbash/heredoc.js +27 -0
  174. package/dist/src/vendor/unbash/internal-types.js +1 -0
  175. package/dist/src/vendor/unbash/lexer.js +4274 -0
  176. package/dist/src/vendor/unbash/limits.js +3 -0
  177. package/dist/src/vendor/unbash/parser.js +1366 -0
  178. package/dist/src/vendor/unbash/parts.js +57 -0
  179. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  180. package/dist/src/vendor/unbash/traversal.js +212 -0
  181. package/dist/src/vendor/unbash/types.js +1 -0
  182. package/dist/src/vendor/unbash/word-value.js +61 -0
  183. package/dist/src/vendor/unbash/word.js +40 -0
  184. package/dist/src/verbs/analyze.js +194 -127
  185. package/dist/src/verbs/describe.js +13 -18
  186. package/dist/src/verbs/explain.js +85 -139
  187. package/dist/src/verbs/print-config.js +2 -1
  188. package/dist/src/verbs/print-projects.js +6 -4
  189. package/dist/src/verbs/print-retained.js +30 -6
  190. package/dist/src/verbs/print-roots.js +4 -2
  191. package/dist/src/verbs/verb.js +1 -5
  192. package/dist/src/verbs/version.js +14 -3
  193. package/jsr.json +2 -1
  194. package/package.json +14 -8
  195. package/src/alias-chain.ts +40 -11
  196. package/src/amd.ts +130 -0
  197. package/src/analysis.ts +426 -733
  198. package/src/augmentations.ts +93 -4
  199. package/src/automatic-types.ts +12 -30
  200. package/src/bindings.ts +460 -0
  201. package/src/commands/held.ts +632 -0
  202. package/src/commands/read.ts +242 -0
  203. package/src/commands/shell.ts +228 -0
  204. package/src/commands/tools.ts +2382 -0
  205. package/src/component-files.ts +4 -2
  206. package/src/component-layer.ts +4 -2
  207. package/src/config.ts +31 -302
  208. package/src/conformance-record.ts +2 -2
  209. package/src/consumers.ts +16 -66
  210. package/src/contextual-uses.ts +66 -34
  211. package/src/contract/config.generated.ts +821 -0
  212. package/src/contract/contract.generated.ts +1453 -0
  213. package/src/contract/report.generated.ts +1241 -0
  214. package/src/dependencies.ts +223 -128
  215. package/src/destructuring.ts +1 -31
  216. package/src/edges.ts +41 -140
  217. package/src/element-access.ts +190 -187
  218. package/src/entries/build-scripts.ts +292 -0
  219. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  220. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  221. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  222. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  223. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  224. package/src/entries/run-directories.ts +108 -0
  225. package/src/entries/sources.ts +266 -0
  226. package/src/entries/static-module.ts +858 -0
  227. package/src/entries/test-runners.ts +835 -0
  228. package/src/entries/workflow-steps.ts +432 -0
  229. package/src/exemptions/argument-places.ts +198 -0
  230. package/src/exemptions/calls.ts +483 -0
  231. package/src/exemptions/classes.ts +49 -0
  232. package/src/exemptions/decorator.ts +56 -0
  233. package/src/exemptions/detectors.ts +75 -0
  234. package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
  235. package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
  236. package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
  237. package/src/exemptions/generated-file.ts +318 -0
  238. package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
  239. package/src/exemptions/installed-globals.ts +255 -0
  240. package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
  241. package/src/exemptions/lifecycle.ts +286 -0
  242. package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
  243. package/src/exemptions/serialization-contract.ts +1729 -0
  244. package/src/exemptions/sites.ts +293 -0
  245. package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
  246. package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
  247. package/src/exposure.ts +492 -0
  248. package/src/extensions.ts +45 -0
  249. package/src/facts.ts +46 -0
  250. package/src/failure.ts +63 -0
  251. package/src/file-facts.ts +15 -25
  252. package/src/finding.ts +10 -10
  253. package/src/findings/boundary.ts +11 -0
  254. package/src/findings/completion.ts +133 -64
  255. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  256. package/src/findings/emitter.ts +9 -10
  257. package/src/findings/emitters.ts +38 -52
  258. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  259. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  260. package/src/findings/interfaces.ts +7 -9
  261. package/src/findings/intra-function.ts +16 -14
  262. package/src/findings/non-code-artifacts.ts +24 -15
  263. package/src/findings/reads-and-writes.ts +118 -41
  264. package/src/findings/self-check.ts +51 -38
  265. package/src/findings/unused-declarations.ts +31 -49
  266. package/src/findings/visibility-narrowing.ts +36 -40
  267. package/src/findings-pass.ts +15 -31
  268. package/src/fs/document.ts +70 -0
  269. package/src/fs/manifest.ts +96 -0
  270. package/src/fs/tree.ts +110 -0
  271. package/src/git-ignore.ts +50 -26
  272. package/src/host.ts +12 -5
  273. package/src/import-bindings.ts +98 -29
  274. package/src/index/sites.ts +781 -0
  275. package/src/index/values.ts +170 -0
  276. package/src/index.ts +2 -2
  277. package/src/indexed-access.ts +570 -527
  278. package/src/intra-function-parts.ts +73 -44
  279. package/src/inventory/commonjs.ts +696 -0
  280. package/src/inventory/enumerate.ts +203 -0
  281. package/src/inventory/syntax.ts +311 -0
  282. package/src/inventory.ts +442 -895
  283. package/src/javascript-file.ts +54 -0
  284. package/src/json-document.ts +241 -76
  285. package/src/keyof-comparisons.ts +133 -122
  286. package/src/kinds.ts +5 -413
  287. package/src/{components.ts → liveness/components.ts} +4 -6
  288. package/src/{graph.ts → liveness/graph.ts} +100 -35
  289. package/src/liveness/matrix.ts +162 -0
  290. package/src/liveness/sweep.ts +855 -0
  291. package/src/load/classify.ts +433 -0
  292. package/src/load/diagnostics.ts +154 -0
  293. package/src/load/discover.ts +471 -0
  294. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  295. package/src/load/expected-module.ts +194 -0
  296. package/src/load/load.ts +73 -0
  297. package/src/load/module-lookup.ts +50 -0
  298. package/src/load/package-scope.ts +74 -0
  299. package/src/load/plan.ts +513 -0
  300. package/src/load/specifiers.ts +171 -0
  301. package/src/load/synthesize.ts +230 -0
  302. package/src/load/test-globals.ts +251 -0
  303. package/src/load/test-joins.ts +98 -0
  304. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  305. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  306. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  307. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  308. package/src/{workspace.ts → load/workspace.ts} +90 -134
  309. package/src/module-declarations.ts +74 -98
  310. package/src/overrides.ts +162 -134
  311. package/src/partial.ts +3 -2
  312. package/src/paths.ts +92 -16
  313. package/src/platform-calls.ts +119 -0
  314. package/src/platform-symbols.ts +189 -0
  315. package/src/position.ts +44 -1
  316. package/src/print.ts +12 -92
  317. package/src/product.ts +18 -0
  318. package/src/query.ts +201 -10
  319. package/src/ref.ts +12 -20
  320. package/src/references/read-rule.ts +60 -0
  321. package/src/references/read-rules.ts +55 -0
  322. package/src/references/sink.ts +314 -0
  323. package/src/references/sources.ts +632 -0
  324. package/src/references.ts +187 -1450
  325. package/src/report-schema.ts +68 -0
  326. package/src/report.ts +103 -226
  327. package/src/reporters/annotations.ts +22 -11
  328. package/src/reporters/json.ts +1 -1
  329. package/src/reporters/reporter.ts +2 -4
  330. package/src/reporters/reporters.ts +1 -1
  331. package/src/reporters/sarif.ts +29 -16
  332. package/src/reporters/template.ts +4 -20
  333. package/src/reporters/text.ts +3 -3
  334. package/src/resolve.ts +284 -1115
  335. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
  336. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  337. package/src/roots/manifest.ts +303 -0
  338. package/src/roots/published-reach.ts +486 -0
  339. package/src/{roots.ts → roots/root-set.ts} +286 -469
  340. package/src/roots/unseen-loads.ts +345 -0
  341. package/src/run.ts +75 -91
  342. package/src/schema.ts +391 -388
  343. package/src/scope.ts +46 -138
  344. package/src/session.ts +87 -55
  345. package/src/source-files.ts +6 -11
  346. package/src/stores.ts +15 -3
  347. package/src/suppress-file.ts +24 -33
  348. package/src/suppress-inline.ts +55 -91
  349. package/src/suppress.ts +78 -79
  350. package/src/symbol-keys.ts +104 -107
  351. package/src/tests/file-class.ts +135 -0
  352. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  353. package/src/{test-support.ts → tests/support.ts} +15 -21
  354. package/src/text/compare.ts +27 -0
  355. package/src/text/glob.ts +210 -0
  356. package/src/text/named-files.ts +388 -0
  357. package/src/text/yaml.ts +747 -0
  358. package/src/type-errors.ts +18 -288
  359. package/src/type-parameter-reads.ts +187 -158
  360. package/src/unimplemented-callees.ts +297 -280
  361. package/src/unwrap.ts +34 -0
  362. package/src/usage.ts +10 -0
  363. package/src/vendor/unbash/LICENSE +15 -0
  364. package/src/vendor/unbash/VENDORED.md +16 -0
  365. package/src/vendor/unbash/ansi-c.ts +132 -0
  366. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  367. package/src/vendor/unbash/arithmetic.ts +641 -0
  368. package/src/vendor/unbash/assignment.ts +163 -0
  369. package/src/vendor/unbash/chars.ts +48 -0
  370. package/src/vendor/unbash/command.ts +47 -0
  371. package/src/vendor/unbash/expansion.ts +144 -0
  372. package/src/vendor/unbash/glob.ts +284 -0
  373. package/src/vendor/unbash/heredoc.ts +34 -0
  374. package/src/vendor/unbash/internal-types.ts +94 -0
  375. package/src/vendor/unbash/lexer.ts +4352 -0
  376. package/src/vendor/unbash/limits.ts +3 -0
  377. package/src/vendor/unbash/parser.ts +1612 -0
  378. package/src/vendor/unbash/parts.ts +96 -0
  379. package/src/vendor/unbash/substitution-context.ts +20 -0
  380. package/src/vendor/unbash/traversal.ts +182 -0
  381. package/src/vendor/unbash/types.ts +660 -0
  382. package/src/vendor/unbash/word-value.ts +64 -0
  383. package/src/vendor/unbash/word.ts +50 -0
  384. package/src/verbs/analyze.ts +255 -164
  385. package/src/verbs/describe.ts +19 -17
  386. package/src/verbs/explain.ts +93 -169
  387. package/src/verbs/print-config.ts +2 -1
  388. package/src/verbs/print-projects.ts +6 -4
  389. package/src/verbs/print-retained.ts +36 -6
  390. package/src/verbs/print-roots.ts +4 -2
  391. package/src/verbs/verb.ts +2 -8
  392. package/src/verbs/version.ts +15 -3
  393. package/dist/src/base-url.js +0 -18
  394. package/dist/src/calls.js +0 -155
  395. package/dist/src/conventions.js +0 -937
  396. package/dist/src/discover.js +0 -468
  397. package/dist/src/entry-points.js +0 -529
  398. package/dist/src/exempt-classes.js +0 -75
  399. package/dist/src/exempt.js +0 -209
  400. package/dist/src/generated-file.js +0 -95
  401. package/dist/src/glob.js +0 -65
  402. package/dist/src/manifest.js +0 -165
  403. package/dist/src/matrix.js +0 -246
  404. package/dist/src/pnpm-workspace.js +0 -120
  405. package/dist/src/roots.js +0 -672
  406. package/dist/src/serialization-contract.js +0 -611
  407. package/dist/src/setup-failure.js +0 -23
  408. package/dist/src/sweep.js +0 -224
  409. package/dist/src/test-joins.js +0 -101
  410. package/dist/src/value-flow.js +0 -74
  411. package/dist/src/version.js +0 -7
  412. package/dist/src/workflow-steps.js +0 -185
  413. package/src/base-url.ts +0 -24
  414. package/src/calls.ts +0 -225
  415. package/src/decorator.ts +0 -78
  416. package/src/discover.ts +0 -653
  417. package/src/entry-points.ts +0 -687
  418. package/src/exempt-classes.ts +0 -123
  419. package/src/exempt.ts +0 -323
  420. package/src/generated-file.ts +0 -111
  421. package/src/glob.ts +0 -67
  422. package/src/manifest.ts +0 -234
  423. package/src/matrix.ts +0 -423
  424. package/src/pnpm-workspace.ts +0 -135
  425. package/src/serialization-contract.ts +0 -849
  426. package/src/setup-failure.ts +0 -39
  427. package/src/sweep.ts +0 -347
  428. package/src/test-joins.ts +0 -120
  429. package/src/value-flow.ts +0 -104
  430. package/src/version.ts +0 -7
  431. package/src/workflow-steps.ts +0 -216
@@ -1,209 +0,0 @@
1
- /**
2
- * The exemption framework: the classes of reason for which a declaration the reference
3
- * graph alone would report is live all the same. A class is policy over what one
4
- * project's checker answers, and its detector names the declarations it holds back;
5
- * this module runs the detectors, decides which of their records stand, and answers
6
- * which records held something back. It names no class's detector: the composition
7
- * hands it the table of the classes it has.
8
- */
9
- import { ConfigError } from "./config.js";
10
- import { EXEMPTION_CLASSES, isExemptionClass, TS_EXEMPTION_CLASSES, typescriptVisibilityOf, } from "./exempt-classes.js";
11
- import { byPosition, positionKey } from "./position.js";
12
- import { Unanswerable } from "./query.js";
13
- import { sweep } from "./sweep.js";
14
- /**
15
- * The classes `exemptions.disabled` switches off. A name is refused unless the
16
- * vocabulary holds it; a class that runs on another language only is admitted and
17
- * switches nothing off here, so one configuration serves every analyzer.
18
- */
19
- export function disabledClasses(config) {
20
- const disabled = new Set();
21
- for (const name of config.exemptionsDisabled) {
22
- if (!isExemptionClass(name)) {
23
- const known = EXEMPTION_CLASSES.map((row) => row.class).join(", ");
24
- throw new ConfigError("malformed", "exemptions.disabled", `exemptions.disabled: ${JSON.stringify(name)} is not an exemption class: the classes are ${known}`);
25
- }
26
- disabled.add(name);
27
- }
28
- return disabled;
29
- }
30
- /**
31
- * Whether a class whose row states `allowed` may retain a member of one visibility. A
32
- * declaration the inventory does not hold has no visibility to refuse it by.
33
- */
34
- function retainable(allowed, visibility) {
35
- if (visibility === "private") {
36
- return allowed.private;
37
- }
38
- if (visibility === "private-name") {
39
- return allowed.privateName;
40
- }
41
- return true;
42
- }
43
- /**
44
- * The kinds of declaration each class can hold back, which a detector that stops holds
45
- * back whole. A class with no row here holds back every declaration but a file.
46
- */
47
- const RETAINABLE = new Map([
48
- ["interface-satisfaction", new Set(["method", "class-member"])],
49
- ["enum-group", new Set(["enum-member"])],
50
- ["injection-container", new Set(["method", "class-member"])],
51
- ["framework-lifecycle", new Set(["method", "class-member"])],
52
- [
53
- "serialization-contract",
54
- new Set(["method", "class-member", "interface-method", "type-member"]),
55
- ],
56
- ]);
57
- /** The detail of a record a detector that could not finish holds. */
58
- const UNANSWERED_DETAIL = "kept live by a question the checker did not answer";
59
- /** Whether one record is held by a detector that could not finish. */
60
- export function isUnansweredRecord(record) {
61
- return record.detail === UNANSWERED_DETAIL;
62
- }
63
- /**
64
- * What one detector holds back over one project. A detector that stops because the
65
- * checker left a question it needs unanswered holds back every declaration of the
66
- * project its class could hold back, each recorded at its own position, so the gap
67
- * never yields a finding.
68
- */
69
- function detected(exemptionClass, detect, input) {
70
- try {
71
- return detect(input);
72
- }
73
- catch (error) {
74
- if (!(error instanceof Unanswerable)) {
75
- throw error;
76
- }
77
- const kinds = RETAINABLE.get(exemptionClass);
78
- return input.held.symbols
79
- .filter((symbol) => (kinds === undefined ? symbol.kind !== "file" : kinds.has(symbol.kind)))
80
- .map((symbol) => ({ id: symbol.id, detail: UNANSWERED_DETAIL, site: symbol.position }));
81
- }
82
- }
83
- /**
84
- * Every record one project's detectors found, one per piece of evidence, before the
85
- * mode decides which of them hold: what {@link heldRecords} reads. Classes run in the
86
- * vocabulary's order and a switched-off class runs not at all; evidence on a private
87
- * member the class's row says it cannot retain is dropped, whatever the detector found.
88
- */
89
- export function evidenceRecords(input, detectors, disabled) {
90
- const visibility = new Map(input.held.symbols.map((symbol) => [symbol.id, symbol.visibility]));
91
- const found = [];
92
- for (const exemptionClass of TS_EXEMPTION_CLASSES) {
93
- const detect = detectors.get(exemptionClass);
94
- if (detect === undefined || disabled.has(exemptionClass)) {
95
- continue;
96
- }
97
- const allowed = typescriptVisibilityOf(exemptionClass);
98
- for (const evidence of detected(exemptionClass, detect, input)) {
99
- if (!retainable(allowed, visibility.get(evidence.id))) {
100
- continue;
101
- }
102
- found.push({
103
- id: evidence.id,
104
- class: exemptionClass,
105
- detail: evidence.detail,
106
- site: evidence.site,
107
- ...(evidence.whileLive === undefined ? {} : { whileLive: evidence.whileLive }),
108
- ...(evidence.implementing === undefined ? {} : { implementing: evidence.implementing }),
109
- });
110
- }
111
- }
112
- return found;
113
- }
114
- /** The records that hold under one mode, beside the evidence a production mode found in a test file. */
115
- export function heldRecords(records, holding) {
116
- const found = [];
117
- const inTestFiles = [];
118
- for (const record of records) {
119
- if (holding.mode.production && holding.testFiles.has(record.site.path)) {
120
- inTestFiles.push(record);
121
- }
122
- else {
123
- found.push(record);
124
- }
125
- }
126
- return { records: exemptionsOf(found), inTestFiles };
127
- }
128
- /** Two strings ordered bytewise. */
129
- function compare(a, b) {
130
- if (a === b) {
131
- return 0;
132
- }
133
- return a < b ? -1 : 1;
134
- }
135
- /**
136
- * Records as a run holds them: ordered by site, then class, then declaration, and one
137
- * per declaration, class, detail and file it holds while live, the one at the first
138
- * site. A fact found at many sites, or by several projects, is one record.
139
- */
140
- export function exemptionsOf(found) {
141
- const ordered = [...found].sort((a, b) => byPosition(a.site, b.site) || compare(a.class, b.class) || compare(a.id, b.id));
142
- const seen = new Set();
143
- return ordered.filter((record) => {
144
- const fact = [record.id, record.class, record.detail, record.whileLive ?? ""].join("\u0000");
145
- if (seen.has(fact)) {
146
- return false;
147
- }
148
- seen.add(fact);
149
- return true;
150
- });
151
- }
152
- /**
153
- * The records that hold while the component files at `live` are live: every record that
154
- * holds whatever is live, and each one a live file's markup holds, as a record of the run.
155
- */
156
- export function holdingWhile(records, live) {
157
- return exemptionsOf(records.flatMap(({ whileLive, ...record }) => whileLive === undefined || live.has(whileLive) ? [record] : []));
158
- }
159
- /** The records per declaration, each declaration's in the order given. */
160
- function byDeclaration(records) {
161
- const grouped = new Map();
162
- for (const record of records) {
163
- const held = grouped.get(record.id);
164
- if (held === undefined) {
165
- grouped.set(record.id, [record]);
166
- }
167
- else {
168
- held.push(record);
169
- }
170
- }
171
- return grouped;
172
- }
173
- /**
174
- * The records that held back a declaration: one some configuration's graph, swept
175
- * again with no exemption and its marks, judges a candidate, whatever another
176
- * configuration answers, or one in `writeOnly`, which the run would report as written
177
- * and never read without the record's read. A declaration a relation or a mark holds
178
- * live in every configuration is held back by no record. The order is the
179
- * declarations' site order, and for one declaration the input's.
180
- */
181
- export function retainedIn(matrix, input, writeOnly = new Set()) {
182
- const exempt = input.exempt ?? [];
183
- if (exempt.length === 0) {
184
- return [];
185
- }
186
- const bare = { marked: input.marked, mode: input.mode };
187
- const dead = new Set(matrix.graphs.flatMap((graph) => sweep(graph, bare).candidates.map((candidate) => candidate.id)));
188
- const held = byDeclaration(exempt.filter((record) => dead.has(record.id) || writeOnly.has(record.id)));
189
- return matrix.union.symbols.flatMap((symbol) => held.get(symbol.id) ?? []);
190
- }
191
- /**
192
- * One line per held-back declaration, in site order: its reference, then each record's
193
- * class, site and detail, all separated by tabs.
194
- */
195
- export function retainedLines(symbols, retained) {
196
- const held = byDeclaration(retained);
197
- return symbols.flatMap((symbol) => {
198
- const records = held.get(symbol.id);
199
- if (records === undefined) {
200
- return [];
201
- }
202
- const fields = records.flatMap((record) => [
203
- record.class,
204
- positionKey(record.site),
205
- record.detail,
206
- ]);
207
- return [[symbol.ref, ...fields].join("\t")];
208
- });
209
- }
@@ -1,95 +0,0 @@
1
- /**
2
- * The generated-file class on TypeScript: every declaration in a file that marks itself
3
- * generated, or below a directory an applied convention row names as generated, is
4
- * retained, because a generator owns the file and a deletion there is undone at the next
5
- * generation.
6
- */
7
- /** The generated-code header, matched against each line of a leading comment. */
8
- const HEADER_LINE = /^\/\/ Code generated .* DO NOT EDIT\.$/u;
9
- /** The documentation tag `@generated` as a word of a comment. */
10
- const GENERATED_TAG = /(?<![\w@$])@generated(?![\w$-])/u;
11
- /** A first comment naming the tool that wrote the file. */
12
- const GENERATED_BY = /^\/\/ Generated by \S/u;
13
- /** The word a generator's notice holds, beside one of {@link KEEP_OUT}. */
14
- const GENERATED_WORD = /\bgenerated\b/iu;
15
- /** The phrases a generator's notice asks a reader not to edit the file by. */
16
- const KEEP_OUT = /\b(?:do not edit|will be overwritten|should not make any changes)\b/iu;
17
- /** The comments before a text's first token, a leading hashbang line skipped. */
18
- function leadingComments(text) {
19
- const comments = [];
20
- let at = text.startsWith("\uFEFF") ? 1 : 0;
21
- if (text.startsWith("#!", at)) {
22
- const end = text.indexOf("\n", at);
23
- at = end === -1 ? text.length : end + 1;
24
- }
25
- for (;;) {
26
- while (at < text.length && /\s/u.test(text.charAt(at))) {
27
- at++;
28
- }
29
- if (text.startsWith("//", at)) {
30
- const end = text.slice(at).search(/[\r\n\u2028\u2029]/u);
31
- const stop = end === -1 ? text.length : at + end;
32
- comments.push(text.slice(at, stop));
33
- at = stop;
34
- }
35
- else if (text.startsWith("/*", at)) {
36
- const end = text.indexOf("*/", at + 2);
37
- if (end === -1) {
38
- return comments;
39
- }
40
- comments.push(text.slice(at, end + 2));
41
- at = end + 2;
42
- }
43
- else {
44
- return comments;
45
- }
46
- }
47
- }
48
- /** The detail a file's leading comments mark it generated by, or undefined where they mark nothing. */
49
- export function generatedByComment(text) {
50
- const comments = leadingComments(text);
51
- if (comments.some((one) => one.split(/\r?\n/u).some((line) => HEADER_LINE.test(line)))) {
52
- return "generated by the header line its leading comments hold";
53
- }
54
- if (comments.some((one) => GENERATED_TAG.test(one))) {
55
- return "generated by the @generated tag its leading comments hold";
56
- }
57
- const notice = comments.join("\n");
58
- if (GENERATED_BY.test(comments[0] ?? "") ||
59
- (GENERATED_WORD.test(notice) && KEEP_OUT.test(notice))) {
60
- return "generated by the notice its leading comments hold";
61
- }
62
- return undefined;
63
- }
64
- /**
65
- * Every own file of one project that is generated, by its path below the target root,
66
- * with the detail a retention in it names: its leading comments' mark, else the row
67
- * naming its directory as generated.
68
- */
69
- export function generatedFilesOf(files, byRow) {
70
- const found = new Map();
71
- for (const [path, file] of files.byPath) {
72
- const row = byRow.get(path);
73
- const detail = generatedByComment(file.text) ??
74
- (row === undefined
75
- ? undefined
76
- : `generated below a directory the convention row ${row} names`);
77
- if (detail !== undefined) {
78
- found.set(path, detail);
79
- }
80
- }
81
- return found;
82
- }
83
- /** The generated-file detector, recording each file's first line. */
84
- export function generatedFile(input) {
85
- const generated = input.generated;
86
- if (generated === undefined || generated.size === 0) {
87
- return [];
88
- }
89
- return input.held.symbols.flatMap((symbol) => {
90
- const detail = generated.get(symbol.position.path);
91
- return symbol.kind === "file" || detail === undefined
92
- ? []
93
- : [{ id: symbol.id, detail, site: { path: symbol.position.path, line: 1, column: 1 } }];
94
- });
95
- }
package/dist/src/glob.js DELETED
@@ -1,65 +0,0 @@
1
- /**
2
- * Glob patterns over the paths of the target's own files, as the configuration
3
- * writes them. Both `ts.test_files` and `ts.entry_files` name files this way, and
4
- * one grammar answers for both.
5
- *
6
- * A configured root is not written in this grammar. It names a symbol reference
7
- * rather than a path, `*` there spans the solidus and a brace list means nothing,
8
- * so that rule is written where it is read.
9
- */
10
- /**
11
- * One literal run of a pattern, with every character the expression syntax claims
12
- * escaped.
13
- *
14
- * The set is the syntax characters and the solidus, and it is closed: an escape of any
15
- * other character is refused outright by the expression syntax under the unicode flag,
16
- * so escaping a hyphen, which needs none outside a character class, would refuse every
17
- * pattern that names a hyphenated path.
18
- */
19
- function quoted(text) {
20
- return text.replaceAll(/[.*+?^${}()|[\]\\/]/gu, (character) => `\\${character}`);
21
- }
22
- /**
23
- * The expression one glob pattern denotes. `**` spans path separators while `*` and `?`
24
- * do not, a brace list is an alternation of its members, and every other character
25
- * stands for itself.
26
- */
27
- export function globExpression(pattern) {
28
- let source = "^";
29
- let at = 0;
30
- while (at < pattern.length) {
31
- const rest = pattern.slice(at);
32
- if (rest.startsWith("**/")) {
33
- source += "(?:[^/]*/)*";
34
- at += 3;
35
- continue;
36
- }
37
- if (rest.startsWith("**")) {
38
- source += ".*";
39
- at += 2;
40
- continue;
41
- }
42
- const character = pattern[at] ?? "";
43
- at += 1;
44
- if (character === "*") {
45
- source += "[^/]*";
46
- continue;
47
- }
48
- if (character === "?") {
49
- source += "[^/]";
50
- continue;
51
- }
52
- if (character === "{") {
53
- const close = pattern.indexOf("}", at);
54
- if (close < 0) {
55
- source += "\\{";
56
- continue;
57
- }
58
- source += `(?:${pattern.slice(at, close).split(",").map(quoted).join("|")})`;
59
- at = close + 1;
60
- continue;
61
- }
62
- source += quoted(character);
63
- }
64
- return new RegExp(`${source}$`, "u");
65
- }
@@ -1,165 +0,0 @@
1
- /**
2
- * The entry points a package manifest names, which are roots because something
3
- * outside the analyzed program reaches them: a consumer importing the package, or a
4
- * shell running its command or one of its scripts. {@link readManifest} reads one
5
- * directory's manifest, {@link packageEntries} those of the packages below the target root.
6
- */
7
- import { isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.js";
8
- /** The manifest's own name. */
9
- const MANIFEST = "package.json";
10
- /** The three members that name an entry point beside `exports` and `bin`. */
11
- const LEGACY_MEMBERS = ["main", "module", "types"];
12
- function isRecord(value) {
13
- return typeof value === "object" && value !== null && !Array.isArray(value);
14
- }
15
- /**
16
- * Whether one member's value names a file of this package rather than another
17
- * package or a URL. A target written with no leading dot is a path too, which is
18
- * how the members that preceded `exports` are written.
19
- */
20
- function isTarget(value, requireDot) {
21
- if (value === "" || isAbsolutePath(value) || value.includes("://")) {
22
- return false;
23
- }
24
- return !requireDot || value.startsWith("./");
25
- }
26
- /** Where a script's command line splits into tokens: white space and the shell's operators. */
27
- const SCRIPT_SEPARATORS = /\s+|&&|\|\||;|\|/u;
28
- /** A token written inside one pair of quotes. */
29
- const QUOTED = /^(["'])(.*)\1$/su;
30
- /**
31
- * Every token one script's command line holds, each with one pair of enclosing quotes
32
- * removed. A token holding a wildcard is a pattern rather than a path, and names no
33
- * entry point.
34
- */
35
- export function scriptTokens(command) {
36
- return command
37
- .split(SCRIPT_SEPARATORS)
38
- .map((token) => token.replace(QUOTED, "$2"))
39
- .filter((token) => token !== "" && !token.includes("*"));
40
- }
41
- /** One member's spelling below another: `exports` then `exports["."]`. */
42
- function below(member, key) {
43
- return `${member}[${JSON.stringify(key)}]`;
44
- }
45
- /**
46
- * Every target one `exports` value carries, at the member each is written under.
47
- *
48
- * The value nests strings, subpath or condition objects and alternative arrays to
49
- * any depth; a `null` blocks a subpath. Every level is walked, because each
50
- * condition names its own entry file, and a key's meaning is never read.
51
- */
52
- function exportTargets(value, member, found) {
53
- if (typeof value === "string") {
54
- if (isTarget(value, true)) {
55
- found.push({ member, path: value, role: "import", published: true });
56
- }
57
- return;
58
- }
59
- if (Array.isArray(value)) {
60
- value.forEach((alternative, index) => {
61
- exportTargets(alternative, below(member, String(index)), found);
62
- });
63
- return;
64
- }
65
- if (!isRecord(value)) {
66
- return;
67
- }
68
- for (const [key, held] of Object.entries(value)) {
69
- exportTargets(held, below(member, key), found);
70
- }
71
- }
72
- /** The manifest at the target root, decoded, or undefined where there is none to read. */
73
- function manifestOf(host, targetRoot) {
74
- let text;
75
- try {
76
- text = host.readFile(joinPath(targetRoot, MANIFEST));
77
- }
78
- catch {
79
- return undefined;
80
- }
81
- let value;
82
- try {
83
- value = JSON.parse(text);
84
- }
85
- catch {
86
- // A manifest this program cannot read names no entry point, which is the same
87
- // answer as an absent one. What a manifest's contents say is not refused here:
88
- // the package manager owns that refusal, and an analysis of a tree it rejects
89
- // is not the run's subject.
90
- return undefined;
91
- }
92
- return isRecord(value) ? value : undefined;
93
- }
94
- /**
95
- * What the manifest in `targetRoot` declares about where its package is entered.
96
- *
97
- * A target is taken as written. It is not resolved to a source file here, because
98
- * which file a target names is a fact about the compiler configuration that emits
99
- * it and there is one such configuration per project, while there is one manifest.
100
- */
101
- export function readManifest(host, targetRoot) {
102
- const manifest = manifestOf(host, targetRoot);
103
- if (manifest === undefined) {
104
- return { entries: [], declaresExports: false };
105
- }
106
- const found = [];
107
- for (const member of LEGACY_MEMBERS) {
108
- const value = manifest[member];
109
- if (typeof value === "string" && isTarget(value, false)) {
110
- found.push({ member, path: value, role: "import", published: true });
111
- }
112
- }
113
- const bin = manifest["bin"];
114
- if (typeof bin === "string" && isTarget(bin, false)) {
115
- found.push({ member: "bin", path: bin, role: "run", published: false });
116
- }
117
- else if (isRecord(bin)) {
118
- for (const [command, value] of Object.entries(bin)) {
119
- if (typeof value === "string" && isTarget(value, false)) {
120
- found.push({ member: below("bin", command), path: value, role: "run", published: false });
121
- }
122
- }
123
- }
124
- exportTargets(manifest["exports"], "exports", found);
125
- const scripts = manifest["scripts"];
126
- if (isRecord(scripts)) {
127
- for (const [name, command] of Object.entries(scripts)) {
128
- if (typeof command !== "string") {
129
- continue;
130
- }
131
- for (const token of new Set(scriptTokens(command))) {
132
- found.push({
133
- member: below("scripts", name),
134
- path: token,
135
- role: "script",
136
- published: false,
137
- });
138
- }
139
- }
140
- }
141
- return {
142
- entries: found.map((entry) => ({
143
- ...entry,
144
- path: resolvePath(targetRoot, entry.path),
145
- dir: targetRoot,
146
- })),
147
- declaresExports: manifest["exports"] !== undefined,
148
- };
149
- }
150
- /**
151
- * The entry points the manifests of the nested packages in `dirs` name. Each entry is
152
- * spelled under its manifest's path below the target root, and is published by its own
153
- * manifest's rule, as the target's own entries are.
154
- */
155
- export function packageEntries(host, targetRoot, dirs) {
156
- return dirs.flatMap((dir) => {
157
- const manifest = readManifest(host, dir);
158
- const where = `${relativePath(targetRoot, dir) ?? dir}/${MANIFEST}`;
159
- return manifest.entries.map((entry) => ({
160
- ...entry,
161
- member: `${where} ${entry.member}`,
162
- published: entry.published && (!manifest.declaresExports || entry.member.startsWith("exports")),
163
- }));
164
- });
165
- }