@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
@@ -0,0 +1,242 @@
1
+ /**
2
+ * The one reader of every command string the analysis reads. Layer 3, the holding rule
3
+ * `roots/root-set.ts` applies through `commands/held.ts` and `text/named-files.ts`, reads every
4
+ * word of the string whatever the other two layers make of it; layer 1 parses the string and
5
+ * layer 2 reads each simple command a tool's reader understands, and they only add the files
6
+ * and modules it runs.
7
+ */
8
+
9
+ import { joinPath, resolvePath } from "../paths.ts";
10
+ import { shellLine, type Pipeline, type Word } from "./shell.ts";
11
+ import {
12
+ configurationsOf,
13
+ preloadTarget,
14
+ readBuiltin,
15
+ handedOn,
16
+ testRun,
17
+ type Outcome,
18
+ type Preload,
19
+ type TestRun,
20
+ } from "./tools.ts";
21
+ import { APPENDED_EXTENSIONS } from "../extensions.ts";
22
+
23
+ /** One program a read command runs. */
24
+ interface Run {
25
+ /** The directory it runs in, absolute where the string's directory is. */
26
+ readonly dir: string;
27
+ /** The path of the file it runs, as written. */
28
+ readonly entry: string | undefined;
29
+ /** The modules it loads before the entry. */
30
+ readonly preloads: readonly Preload[];
31
+ readonly runtime: "node" | undefined;
32
+ }
33
+
34
+ /** One simple command's words, `undefined` for a dynamic one, with the directory it runs in. */
35
+ interface CommandWords {
36
+ readonly dir: string;
37
+ readonly words: readonly (string | undefined)[];
38
+ }
39
+
40
+ /** One configuration file a command names by its tool's configuration option, as written, with its command's directory. */
41
+ interface NamedConfiguration {
42
+ readonly dir: string;
43
+ readonly written: string;
44
+ }
45
+
46
+ /** One test run a command string writes, with the directory it runs in. */
47
+ export interface CommandTests extends TestRun {
48
+ readonly dir: string;
49
+ }
50
+
51
+ /** What one command string runs. */
52
+ export interface CommandReading {
53
+ readonly runs: readonly Run[];
54
+ /**
55
+ * Each simple command read in the directory it runs in, and each one of the string's own
56
+ * line in the string's directory too, wherever and whether it runs.
57
+ */
58
+ readonly commands: readonly CommandWords[];
59
+ readonly configurations: readonly NamedConfiguration[];
60
+ /** Each test run of {@link commands}, as `testRun` reads the command a launcher hands on. */
61
+ readonly tests: readonly CommandTests[];
62
+ /** The string's whole text, which the dependency rule reads. */
63
+ readonly held: string;
64
+ }
65
+
66
+ /**
67
+ * The outcomes of one pipeline run in `dir`: those of the builtin that is its one member, as
68
+ * `readBuiltin` gives them, a directory the analysis does not know after a part layer 1 does
69
+ * not read, and either status in `dir` otherwise, a pipeline of several members included,
70
+ * whose members each run in a subshell.
71
+ */
72
+ function outcomesOf(pipeline: Pipeline, dir: string | undefined): readonly Outcome[] {
73
+ const [only] = pipeline.alone ? pipeline.commands : [];
74
+ const outcomes = pipeline.opaque
75
+ ? [
76
+ { dir: undefined, ok: true },
77
+ { dir: undefined, ok: false },
78
+ ]
79
+ : ((only === undefined ? undefined : readBuiltin(only, dir)) ?? [
80
+ { dir, ok: true },
81
+ { dir, ok: false },
82
+ ]);
83
+ return outcomes.map((one) => ({ dir: one.dir, ok: one.ok !== pipeline.negated }));
84
+ }
85
+
86
+ /** The one directory every outcome is in, or `undefined` where they differ or none is known. */
87
+ function oneDirectory(outcomes: readonly Outcome[]): string | undefined {
88
+ const dirs = new Set(outcomes.map((one) => one.dir));
89
+ return dirs.size === 1 ? [...dirs][0] : undefined;
90
+ }
91
+
92
+ /**
93
+ * What `text`, run in `dir`, `undefined` where not known, runs. A pipeline is read where every
94
+ * way its and-or list reaches it leaves the shell in one known directory, none after an `exit`;
95
+ * a background list moves and ends no later one. The words and configuration files of every
96
+ * simple command of the string's own line are read in `dir` as well, wherever they run.
97
+ */
98
+ export function readCommands(text: string, dir: string | undefined): CommandReading {
99
+ const runs: Run[] = [];
100
+ const commands: CommandWords[] = [];
101
+ const configurations: NamedConfiguration[] = [];
102
+ const tests: CommandTests[] = [];
103
+ const readTests = (words: readonly Word[], at: string): void => {
104
+ const run = testRun(words);
105
+ if (run !== undefined) {
106
+ tests.push({ dir: at, ...run });
107
+ }
108
+ };
109
+ const readCommand = (words: readonly Word[], at: string): void => {
110
+ commands.push({ dir: at, words: words.map((word) => word.value) });
111
+ const [handed, reading] = handedOn(words);
112
+ readTests(handed, at);
113
+ if (reading?.kind === "line") {
114
+ readLine(reading.text, at);
115
+ return;
116
+ }
117
+ configurations.push(...configurationsOf(handed).map((written) => ({ dir: at, written })));
118
+ if (reading !== undefined && (reading.entry !== undefined || reading.preloads.length > 0)) {
119
+ runs.push({
120
+ dir: at,
121
+ entry: reading.entry,
122
+ preloads: reading.preloads,
123
+ runtime: reading.runtime,
124
+ });
125
+ }
126
+ };
127
+ const readLine = (source: string, start: string | undefined): void => {
128
+ let at = start;
129
+ for (const list of shellLine(source)) {
130
+ let outcomes: readonly Outcome[] = [{ dir: at, ok: true }];
131
+ for (const pipeline of list.pipelines) {
132
+ const { operator } = pipeline;
133
+ const reached = outcomes.filter(
134
+ (one) => operator === undefined || one.ok === (operator === "&&"),
135
+ );
136
+ const where = reached.length === 0 ? undefined : oneDirectory(reached);
137
+ if (where !== undefined) {
138
+ pipeline.commands.forEach((words) => {
139
+ readCommand(words, where);
140
+ });
141
+ }
142
+ const next = reached.flatMap((one) => outcomesOf(pipeline, one.dir));
143
+ const passed = outcomes.filter((one) => !reached.includes(one));
144
+ outcomes = [
145
+ ...new Map(
146
+ [...passed, ...next].map((one) => [`${String(one.ok)}\u0000${one.dir ?? ""}`, one]),
147
+ ).values(),
148
+ ];
149
+ }
150
+ if (!list.background) {
151
+ at = oneDirectory(outcomes);
152
+ }
153
+ }
154
+ };
155
+ readLine(text, dir);
156
+ if (dir !== undefined) {
157
+ for (const words of shellLine(text).flatMap((list) =>
158
+ list.pipelines.flatMap((pipeline) => pipeline.commands),
159
+ )) {
160
+ commands.push({ dir, words: words.map((word) => word.value) });
161
+ configurations.push(...configurationsOf(words).map((written) => ({ dir, written })));
162
+ readTests(handedOn(words)[0], dir);
163
+ }
164
+ }
165
+ const unique = <T>(all: readonly T[]): T[] => [
166
+ ...new Map(all.map((one) => [JSON.stringify(one), one])).values(),
167
+ ];
168
+ return {
169
+ runs,
170
+ commands: unique(commands),
171
+ configurations: unique(configurations),
172
+ tests: unique(tests),
173
+ held: text,
174
+ };
175
+ }
176
+
177
+ /** One file a run loads, as written, and every absolute path it may be at. */
178
+ interface Load {
179
+ readonly written: string;
180
+ readonly paths: readonly string[];
181
+ }
182
+
183
+ /**
184
+ * The files `run` loads: its entry, and each preload written as a path. Each may be at its
185
+ * path, with each extension tried, and as a directory's `index` file.
186
+ */
187
+ export function loadsOf(run: Run): readonly Load[] {
188
+ const written = [
189
+ ...(run.entry === undefined
190
+ ? []
191
+ : [{ written: run.entry, path: resolvePath(run.dir, run.entry) }]),
192
+ ...run.preloads.flatMap((preload) => {
193
+ const target = preloadTarget(preload, run.dir);
194
+ return target !== undefined && "path" in target
195
+ ? [{ written: preload.specifier, path: target.path }]
196
+ : [];
197
+ }),
198
+ ];
199
+ return written.map(({ written: one, path }) => ({
200
+ written: one,
201
+ paths: [
202
+ path,
203
+ ...APPENDED_EXTENSIONS.map((extension) => `${path}${extension}`),
204
+ ...APPENDED_EXTENSIONS.map((extension) => joinPath(path, `index${extension}`)),
205
+ ],
206
+ }));
207
+ }
208
+
209
+ /** The module specifiers `run` preloads that name a package rather than a path. */
210
+ export function preloadedPackages(run: Run): readonly string[] {
211
+ return run.preloads.flatMap((preload) => {
212
+ const target = preloadTarget(preload, run.dir);
213
+ return target !== undefined && "package" in target ? [target.package] : [];
214
+ });
215
+ }
216
+
217
+ /** One path a command string names, with the word or the load that names it. */
218
+ interface NamedPath {
219
+ readonly path: string;
220
+ readonly written: string;
221
+ }
222
+
223
+ /**
224
+ * Every path `reading` names: each static word of its commands read against the directory the
225
+ * command runs in, a word holding `*` aside, which a tool reads as a pattern, and every path a
226
+ * file a read command runs or preloads may be at.
227
+ */
228
+ export function pathsNamed(reading: CommandReading): readonly NamedPath[] {
229
+ const named = [
230
+ ...reading.commands.flatMap(({ dir, words }) =>
231
+ words.flatMap((word) =>
232
+ word === undefined || word.includes("*")
233
+ ? []
234
+ : [{ path: resolvePath(dir, word), written: word }],
235
+ ),
236
+ ),
237
+ ...reading.runs
238
+ .flatMap(loadsOf)
239
+ .flatMap(({ written, paths }) => paths.map((path) => ({ path, written }))),
240
+ ];
241
+ return [...new Map(named.map((one) => [`${one.path}\u0000${one.written}`, one])).values()];
242
+ }
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Layer 1 of the command reader: one command line, parsed by the vendored shell parser, as
3
+ * its and-or lists, their pipelines and the words of each simple command, and the one place
4
+ * that decides which parts of a word the shell computes and which words a brace expansion
5
+ * stands for, for layer 3 too.
6
+ */
7
+
8
+ import {
9
+ parse,
10
+ type CommandNode,
11
+ type ParsedScript,
12
+ type PipelineNode,
13
+ type Word as ShellWord,
14
+ type WordPart,
15
+ } from "../vendor/unbash/parser.ts";
16
+
17
+ /**
18
+ * The character that stands, in a word's text as layer 3 reads it, for a part only the run
19
+ * knows. It is a private-use character, so no path holds it, and the parser reads it as
20
+ * literal text.
21
+ */
22
+ export const PART = "\uE000";
23
+
24
+ /** A GitHub Actions expression, which the runner substitutes before any shell reads the line. */
25
+ const EXPRESSION = /\$\{\{[\s\S]*?\}\}/gu;
26
+
27
+ /** `text` with each `${{ }}` expression in it read as a part only the run knows. */
28
+ export function expressionsAsParts(text: string): string {
29
+ return text.replace(EXPRESSION, PART);
30
+ }
31
+
32
+ /** One command line parsed, each `${{ }}` expression in it read as a part only the run knows. */
33
+ export function parseLine(source: string): ParsedScript {
34
+ return parse(expressionsAsParts(source));
35
+ }
36
+
37
+ /** The words a word's brace expansions stand for, at most this many. */
38
+ const ALTERNATIVES = 64;
39
+
40
+ /** One word of a simple command: its value, or `undefined` where the shell computes it. */
41
+ export interface Word {
42
+ readonly value: string | undefined;
43
+ /** The word as the line writes it. */
44
+ readonly text: string;
45
+ /** Where the shell expands it to one text, that text with each part it computes as {@link PART}. */
46
+ readonly written?: string;
47
+ }
48
+
49
+ /** One pipeline of an and-or list. */
50
+ export interface Pipeline {
51
+ /** The operator that joins it to the pipeline before it, `undefined` for a list's first. */
52
+ readonly operator: "&&" | "||" | undefined;
53
+ /** Whether a `!` inverts its status. */
54
+ readonly negated: boolean;
55
+ /** The words of each member that is a simple command with a program word. */
56
+ readonly commands: readonly (readonly Word[])[];
57
+ /**
58
+ * Whether it has one member, which runs in the line's own shell; with several, each member
59
+ * runs in a subshell of its own, whatever it is.
60
+ */
61
+ readonly alone: boolean;
62
+ /**
63
+ * Whether its one member is no simple command but a compound command, whose commands may
64
+ * change the line's shell's directory, or a function definition, whose later calls may.
65
+ */
66
+ readonly opaque: boolean;
67
+ }
68
+
69
+ /** One and-or list: its pipelines, run in a subshell where `&` sends it to the background. */
70
+ interface List {
71
+ readonly background: boolean;
72
+ readonly pipelines: readonly Pipeline[];
73
+ }
74
+
75
+ /**
76
+ * The text one part of a word stands for: a literal's, a quoted text's or an escape's value,
77
+ * and {@link PART} for every part the shell computes, a glob among them.
78
+ */
79
+ function partText(part: WordPart): string {
80
+ switch (part.type) {
81
+ case "Literal":
82
+ case "SingleQuoted":
83
+ case "AnsiCQuoted":
84
+ return part.value;
85
+ case "DoubleQuoted":
86
+ return part.parts.map((child) => (child.type === "Literal" ? child.value : PART)).join("");
87
+ default:
88
+ return PART;
89
+ }
90
+ }
91
+
92
+ /** The texts the word `piece` of a brace expansion stands for, or a part where it is no one word. */
93
+ function alternativeTexts(piece: string): readonly string[] {
94
+ if (piece === "") {
95
+ return [""];
96
+ }
97
+ const script = parse(piece);
98
+ const [statement, ...more] = script.commands;
99
+ const command = statement?.command;
100
+ return (script.errors ?? []).length === 0 &&
101
+ more.length === 0 &&
102
+ command?.type === "Command" &&
103
+ command.name !== undefined &&
104
+ command.prefix.length === 0 &&
105
+ command.suffix.length === 0
106
+ ? heldTextsOf(command.name)
107
+ : [PART];
108
+ }
109
+
110
+ /**
111
+ * The texts a brace expansion stands for, its comma-separated alternatives, or a part where it
112
+ * has none, a sequence such as `{1..3}` among them.
113
+ */
114
+ function braceTexts(text: string): readonly string[] {
115
+ const inner = text.slice(1, -1);
116
+ const pieces: string[] = [];
117
+ let depth = 0;
118
+ let from = 0;
119
+ let quote = "";
120
+ for (let at = 0; at < inner.length; at += 1) {
121
+ const char = inner.charAt(at);
122
+ if (char === "\\") {
123
+ at += 1;
124
+ } else if (quote !== "") {
125
+ quote = char === quote ? "" : quote;
126
+ } else if (char === "'" || char === '"') {
127
+ quote = char;
128
+ } else if (char === "{" || char === "}") {
129
+ depth += char === "{" ? 1 : -1;
130
+ } else if (char === "," && depth === 0) {
131
+ pieces.push(inner.slice(from, at));
132
+ from = at + 1;
133
+ }
134
+ }
135
+ if (pieces.length === 0) {
136
+ return [PART];
137
+ }
138
+ pieces.push(inner.slice(from));
139
+ return pieces.flatMap(alternativeTexts);
140
+ }
141
+
142
+ /**
143
+ * Each word the shell may expand `word` to, as layer 3 reads it: its quotes removed, each brace
144
+ * expansion read as its alternatives, past {@link ALTERNATIVES} words as a part, and each part
145
+ * it computes, a tilde that starts it unquoted among them, as {@link PART}.
146
+ */
147
+ export function heldTextsOf(word: ShellWord): readonly string[] {
148
+ const { parts } = word;
149
+ const [first] = parts ?? [];
150
+ const tilde =
151
+ parts === undefined
152
+ ? word.text.startsWith("~")
153
+ : first?.type === "Literal" && first.text.startsWith("~");
154
+ let texts: readonly string[] = [parts === undefined ? word.value : ""];
155
+ for (const part of parts ?? []) {
156
+ const options = part.type === "BraceExpansion" ? braceTexts(part.text) : [partText(part)];
157
+ const next = texts.flatMap((text) => options.map((option) => `${text}${option}`));
158
+ texts = next.length > ALTERNATIVES ? texts.map((text) => `${text}${PART}`) : next;
159
+ }
160
+ return tilde ? texts.map((text) => `${PART}${text.slice(1)}`) : texts;
161
+ }
162
+
163
+ /** One word as layer 1 reads it: static only where the shell expands it to one text with no part. */
164
+ export function wordOf(word: ShellWord): Word {
165
+ const [only, ...more] = heldTextsOf(word);
166
+ const one = more.length === 0 ? only : undefined;
167
+ const known = one !== undefined && !one.includes(PART);
168
+ return {
169
+ value: known ? word.value : undefined,
170
+ text: word.text,
171
+ ...(one === undefined ? {} : { written: one }),
172
+ };
173
+ }
174
+
175
+ /**
176
+ * Whether one member of a pipeline, run in the line's own shell, may change that shell's
177
+ * directory without being a simple command: POSIX XCU 2.9.4 runs every compound command but
178
+ * `( )` in the current environment, and a function body runs there when called.
179
+ */
180
+ function isOpaque(node: CommandNode): boolean {
181
+ switch (node.type) {
182
+ case "Command":
183
+ case "Subshell":
184
+ case "Coproc":
185
+ case "TestCommand":
186
+ case "ArithmeticCommand":
187
+ return false;
188
+ case "Redirected":
189
+ return isOpaque(node.command);
190
+ default:
191
+ return true;
192
+ }
193
+ }
194
+
195
+ function pipelineOf(node: PipelineNode, operator: Pipeline["operator"]): Pipeline {
196
+ const members = node.type === "Pipeline" ? node.commands : [node];
197
+ const negated =
198
+ node.type === "Pipeline" && node.prefixes.some((prefix) => prefix.type === "Negation");
199
+ const commands = members.flatMap((member) =>
200
+ member.type === "Command" && member.name !== undefined
201
+ ? [[member.name, ...member.suffix.filter((part) => part.type === "Word")].map(wordOf)]
202
+ : [],
203
+ );
204
+ const alone = members.length === 1;
205
+ return { operator, negated, commands, alone, opaque: alone && members.some(isOpaque) };
206
+ }
207
+
208
+ /**
209
+ * The and-or lists one command line runs, or none where any of it does not parse. A simple
210
+ * command's assignments and redirections are no words; a part that is no simple command
211
+ * gives no words, and marks its pipeline where it may change the line's directory.
212
+ */
213
+ export function shellLine(source: string): readonly List[] {
214
+ const script = parseLine(source);
215
+ if ((script.errors ?? []).length > 0) {
216
+ return [];
217
+ }
218
+ return script.commands.map((statement) => {
219
+ const { command } = statement;
220
+ const pipelines =
221
+ command.type === "AndOr"
222
+ ? command.commands.map((one, at) =>
223
+ pipelineOf(one, at === 0 ? undefined : command.operators[at - 1]),
224
+ )
225
+ : [pipelineOf(command, undefined)];
226
+ return { background: statement.background === true, pipelines };
227
+ });
228
+ }