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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +2 -7
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +269 -432
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/calls.js +279 -43
  12. package/dist/src/commands/held.js +499 -0
  13. package/dist/src/commands/read.js +161 -0
  14. package/dist/src/commands/shell.js +169 -0
  15. package/dist/src/commands/tools.js +1847 -0
  16. package/dist/src/component-files.js +3 -2
  17. package/dist/src/component-layer.js +4 -2
  18. package/dist/src/config.js +6 -82
  19. package/dist/src/conformance-record.js +1 -1
  20. package/dist/src/consumers.js +10 -38
  21. package/dist/src/contextual-uses.js +57 -26
  22. package/dist/src/contract/config.generated.js +561 -0
  23. package/dist/src/contract/contract.generated.js +1369 -0
  24. package/dist/src/contract/report.generated.js +866 -0
  25. package/dist/src/dependencies.js +164 -121
  26. package/dist/src/destructuring.js +1 -19
  27. package/dist/src/edges.js +38 -122
  28. package/dist/src/element-access.js +181 -168
  29. package/dist/src/entries/build-scripts.js +222 -0
  30. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  31. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  32. package/dist/src/entries/conventions.js +740 -0
  33. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  34. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  35. package/dist/src/entries/run-directories.js +77 -0
  36. package/dist/src/entries/sources.js +144 -0
  37. package/dist/src/entries/static-module.js +670 -0
  38. package/dist/src/entries/test-runners.js +650 -0
  39. package/dist/src/entries/workflow-steps.js +345 -0
  40. package/dist/src/enum-group.js +3 -10
  41. package/dist/src/erased-stores.js +4 -6
  42. package/dist/src/exempt-classes.js +1 -63
  43. package/dist/src/exempt.js +21 -66
  44. package/dist/src/exposure.js +400 -0
  45. package/dist/src/extensions.js +37 -0
  46. package/dist/src/facts.js +38 -0
  47. package/dist/src/failure.js +36 -0
  48. package/dist/src/file-facts.js +3 -26
  49. package/dist/src/findings/completion.js +109 -56
  50. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  51. package/dist/src/findings/emitters.js +27 -41
  52. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  53. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  54. package/dist/src/findings/interfaces.js +4 -5
  55. package/dist/src/findings/intra-function.js +16 -13
  56. package/dist/src/findings/non-code-artifacts.js +17 -12
  57. package/dist/src/findings/reads-and-writes.js +86 -27
  58. package/dist/src/findings/self-check.js +44 -30
  59. package/dist/src/findings/unused-declarations.js +29 -45
  60. package/dist/src/findings/visibility-narrowing.js +23 -31
  61. package/dist/src/findings-pass.js +13 -21
  62. package/dist/src/framework-lifecycle.js +46 -19
  63. package/dist/src/fs/document.js +52 -0
  64. package/dist/src/fs/manifest.js +67 -0
  65. package/dist/src/fs/tree.js +88 -0
  66. package/dist/src/generated-file.js +174 -28
  67. package/dist/src/git-ignore.js +39 -26
  68. package/dist/src/import-bindings.js +73 -28
  69. package/dist/src/index/sites.js +557 -0
  70. package/dist/src/index.js +2 -2
  71. package/dist/src/indexed-access.js +523 -478
  72. package/dist/src/injection-container.js +2 -2
  73. package/dist/src/interface-satisfaction.js +1 -1
  74. package/dist/src/intra-function-parts.js +63 -43
  75. package/dist/src/inventory/commonjs.js +507 -0
  76. package/dist/src/inventory/enumerate.js +167 -0
  77. package/dist/src/inventory/syntax.js +236 -0
  78. package/dist/src/inventory.js +323 -724
  79. package/dist/src/javascript-file.js +48 -0
  80. package/dist/src/json-document.js +198 -67
  81. package/dist/src/keyof-comparisons.js +126 -107
  82. package/dist/src/kinds.js +3 -366
  83. package/dist/src/{components.js → liveness/components.js} +2 -3
  84. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  85. package/dist/src/liveness/matrix.js +99 -0
  86. package/dist/src/liveness/sweep.js +558 -0
  87. package/dist/src/load/classify.js +289 -0
  88. package/dist/src/load/diagnostics.js +87 -0
  89. package/dist/src/load/discover.js +285 -0
  90. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  91. package/dist/src/load/expected-module.js +136 -0
  92. package/dist/src/load/load.js +27 -0
  93. package/dist/src/load/module-lookup.js +37 -0
  94. package/dist/src/load/package-scope.js +56 -0
  95. package/dist/src/load/plan.js +313 -0
  96. package/dist/src/load/specifiers.js +113 -0
  97. package/dist/src/load/synthesize.js +152 -0
  98. package/dist/src/load/test-globals.js +207 -0
  99. package/dist/src/load/test-joins.js +82 -0
  100. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  101. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  102. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  103. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  104. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  105. package/dist/src/module-declarations.js +70 -85
  106. package/dist/src/overrides.js +134 -112
  107. package/dist/src/partial.js +2 -1
  108. package/dist/src/paths.js +82 -16
  109. package/dist/src/platform-calls.js +78 -0
  110. package/dist/src/platform-symbols.js +134 -0
  111. package/dist/src/position.js +43 -1
  112. package/dist/src/print.js +11 -79
  113. package/dist/src/product.js +13 -0
  114. package/dist/src/query.js +47 -0
  115. package/dist/src/ref.js +12 -20
  116. package/dist/src/references/read-rule.js +1 -0
  117. package/dist/src/references/read-rules.js +48 -0
  118. package/dist/src/references/sink.js +237 -0
  119. package/dist/src/references/sources.js +450 -0
  120. package/dist/src/references.js +117 -1074
  121. package/dist/src/report-schema.js +51 -0
  122. package/dist/src/report.js +57 -41
  123. package/dist/src/reporters/annotations.js +15 -8
  124. package/dist/src/reporters/sarif.js +16 -10
  125. package/dist/src/reporters/template.js +4 -19
  126. package/dist/src/resolve.js +246 -730
  127. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  128. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  129. package/dist/src/roots/manifest.js +216 -0
  130. package/dist/src/roots/published-reach.js +412 -0
  131. package/dist/src/roots/root-set.js +487 -0
  132. package/dist/src/roots/unseen-loads.js +236 -0
  133. package/dist/src/run.js +66 -77
  134. package/dist/src/schema.js +320 -343
  135. package/dist/src/scope.js +38 -115
  136. package/dist/src/serialization-contract.js +601 -22
  137. package/dist/src/session.js +37 -29
  138. package/dist/src/source-files.js +6 -10
  139. package/dist/src/stores.js +4 -2
  140. package/dist/src/suppress-file.js +25 -28
  141. package/dist/src/suppress-inline.js +36 -83
  142. package/dist/src/suppress.js +50 -71
  143. package/dist/src/symbol-keys.js +92 -88
  144. package/dist/src/template-field.js +9 -19
  145. package/dist/src/tests/file-class.js +76 -0
  146. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  147. package/dist/src/{test-support.js → tests/support.js} +5 -12
  148. package/dist/src/text/compare.js +26 -0
  149. package/dist/src/text/glob.js +194 -0
  150. package/dist/src/text/named-files.js +298 -0
  151. package/dist/src/text/yaml.js +684 -0
  152. package/dist/src/type-errors.js +11 -232
  153. package/dist/src/type-parameter-reads.js +178 -139
  154. package/dist/src/unimplemented-callees.js +262 -242
  155. package/dist/src/unwrap.js +23 -0
  156. package/dist/src/usage.js +10 -0
  157. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  158. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  159. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  160. package/dist/src/vendor/unbash/assignment.js +131 -0
  161. package/dist/src/vendor/unbash/chars.js +48 -0
  162. package/dist/src/vendor/unbash/command.js +41 -0
  163. package/dist/src/vendor/unbash/expansion.js +80 -0
  164. package/dist/src/vendor/unbash/glob.js +268 -0
  165. package/dist/src/vendor/unbash/heredoc.js +27 -0
  166. package/dist/src/vendor/unbash/internal-types.js +1 -0
  167. package/dist/src/vendor/unbash/lexer.js +4274 -0
  168. package/dist/src/vendor/unbash/limits.js +3 -0
  169. package/dist/src/vendor/unbash/parser.js +1366 -0
  170. package/dist/src/vendor/unbash/parts.js +57 -0
  171. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  172. package/dist/src/vendor/unbash/traversal.js +212 -0
  173. package/dist/src/vendor/unbash/types.js +1 -0
  174. package/dist/src/vendor/unbash/word-value.js +61 -0
  175. package/dist/src/vendor/unbash/word.js +40 -0
  176. package/dist/src/verbs/analyze.js +194 -127
  177. package/dist/src/verbs/describe.js +13 -18
  178. package/dist/src/verbs/explain.js +85 -139
  179. package/dist/src/verbs/print-config.js +2 -1
  180. package/dist/src/verbs/print-projects.js +6 -4
  181. package/dist/src/verbs/print-retained.js +7 -5
  182. package/dist/src/verbs/print-roots.js +4 -2
  183. package/dist/src/verbs/verb.js +1 -5
  184. package/dist/src/verbs/version.js +14 -3
  185. package/jsr.json +2 -1
  186. package/package.json +14 -8
  187. package/src/alias-chain.ts +2 -9
  188. package/src/amd.ts +130 -0
  189. package/src/analysis.ts +424 -650
  190. package/src/augmentations.ts +93 -4
  191. package/src/automatic-types.ts +12 -30
  192. package/src/bindings.ts +460 -0
  193. package/src/calls.ts +338 -46
  194. package/src/commands/held.ts +632 -0
  195. package/src/commands/read.ts +242 -0
  196. package/src/commands/shell.ts +228 -0
  197. package/src/commands/tools.ts +2382 -0
  198. package/src/component-files.ts +4 -2
  199. package/src/component-layer.ts +4 -2
  200. package/src/config.ts +31 -302
  201. package/src/conformance-record.ts +1 -1
  202. package/src/consumers.ts +16 -66
  203. package/src/contextual-uses.ts +66 -34
  204. package/src/contract/config.generated.ts +821 -0
  205. package/src/contract/contract.generated.ts +1452 -0
  206. package/src/contract/report.generated.ts +1241 -0
  207. package/src/dependencies.ts +222 -127
  208. package/src/destructuring.ts +1 -31
  209. package/src/edges.ts +41 -140
  210. package/src/element-access.ts +190 -187
  211. package/src/entries/build-scripts.ts +292 -0
  212. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  213. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  214. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  215. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  216. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  217. package/src/entries/run-directories.ts +108 -0
  218. package/src/entries/sources.ts +266 -0
  219. package/src/entries/static-module.ts +858 -0
  220. package/src/entries/test-runners.ts +835 -0
  221. package/src/entries/workflow-steps.ts +432 -0
  222. package/src/enum-group.ts +2 -11
  223. package/src/erased-stores.ts +3 -7
  224. package/src/exempt-classes.ts +1 -75
  225. package/src/exempt.ts +70 -98
  226. package/src/exposure.ts +492 -0
  227. package/src/extensions.ts +45 -0
  228. package/src/facts.ts +46 -0
  229. package/src/failure.ts +63 -0
  230. package/src/file-facts.ts +15 -25
  231. package/src/finding.ts +10 -10
  232. package/src/findings/boundary.ts +11 -0
  233. package/src/findings/completion.ts +133 -64
  234. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  235. package/src/findings/emitter.ts +9 -10
  236. package/src/findings/emitters.ts +38 -52
  237. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  238. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  239. package/src/findings/interfaces.ts +7 -9
  240. package/src/findings/intra-function.ts +16 -14
  241. package/src/findings/non-code-artifacts.ts +24 -15
  242. package/src/findings/reads-and-writes.ts +118 -41
  243. package/src/findings/self-check.ts +51 -38
  244. package/src/findings/unused-declarations.ts +31 -49
  245. package/src/findings/visibility-narrowing.ts +36 -40
  246. package/src/findings-pass.ts +15 -31
  247. package/src/framework-lifecycle.ts +47 -19
  248. package/src/fs/document.ts +70 -0
  249. package/src/fs/manifest.ts +96 -0
  250. package/src/fs/tree.ts +110 -0
  251. package/src/generated-file.ts +242 -35
  252. package/src/git-ignore.ts +50 -26
  253. package/src/host.ts +12 -5
  254. package/src/import-bindings.ts +98 -29
  255. package/src/index/sites.ts +781 -0
  256. package/src/index.ts +2 -2
  257. package/src/indexed-access.ts +570 -527
  258. package/src/injection-container.ts +2 -2
  259. package/src/interface-satisfaction.ts +2 -2
  260. package/src/intra-function-parts.ts +73 -44
  261. package/src/inventory/commonjs.ts +696 -0
  262. package/src/inventory/enumerate.ts +203 -0
  263. package/src/inventory/syntax.ts +311 -0
  264. package/src/inventory.ts +442 -895
  265. package/src/javascript-file.ts +54 -0
  266. package/src/json-document.ts +241 -76
  267. package/src/keyof-comparisons.ts +133 -122
  268. package/src/kinds.ts +5 -413
  269. package/src/{components.ts → liveness/components.ts} +4 -6
  270. package/src/{graph.ts → liveness/graph.ts} +100 -35
  271. package/src/liveness/matrix.ts +162 -0
  272. package/src/liveness/sweep.ts +855 -0
  273. package/src/load/classify.ts +433 -0
  274. package/src/load/diagnostics.ts +154 -0
  275. package/src/load/discover.ts +471 -0
  276. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  277. package/src/load/expected-module.ts +194 -0
  278. package/src/load/load.ts +73 -0
  279. package/src/load/module-lookup.ts +50 -0
  280. package/src/load/package-scope.ts +74 -0
  281. package/src/load/plan.ts +513 -0
  282. package/src/load/specifiers.ts +171 -0
  283. package/src/load/synthesize.ts +230 -0
  284. package/src/load/test-globals.ts +251 -0
  285. package/src/load/test-joins.ts +98 -0
  286. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  287. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  288. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  289. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  290. package/src/{workspace.ts → load/workspace.ts} +90 -134
  291. package/src/module-declarations.ts +74 -98
  292. package/src/overrides.ts +162 -134
  293. package/src/partial.ts +3 -2
  294. package/src/paths.ts +92 -16
  295. package/src/platform-calls.ts +119 -0
  296. package/src/platform-symbols.ts +189 -0
  297. package/src/position.ts +44 -1
  298. package/src/print.ts +12 -92
  299. package/src/product.ts +18 -0
  300. package/src/query.ts +92 -0
  301. package/src/ref.ts +12 -20
  302. package/src/references/read-rule.ts +60 -0
  303. package/src/references/read-rules.ts +55 -0
  304. package/src/references/sink.ts +314 -0
  305. package/src/references/sources.ts +632 -0
  306. package/src/references.ts +187 -1450
  307. package/src/report-schema.ts +68 -0
  308. package/src/report.ts +103 -226
  309. package/src/reporters/annotations.ts +22 -11
  310. package/src/reporters/json.ts +1 -1
  311. package/src/reporters/reporter.ts +2 -4
  312. package/src/reporters/reporters.ts +1 -1
  313. package/src/reporters/sarif.ts +29 -16
  314. package/src/reporters/template.ts +4 -20
  315. package/src/reporters/text.ts +3 -3
  316. package/src/resolve.ts +284 -1115
  317. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
  318. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  319. package/src/roots/manifest.ts +303 -0
  320. package/src/roots/published-reach.ts +486 -0
  321. package/src/{roots.ts → roots/root-set.ts} +286 -469
  322. package/src/roots/unseen-loads.ts +345 -0
  323. package/src/run.ts +75 -91
  324. package/src/schema.ts +391 -388
  325. package/src/scope.ts +46 -138
  326. package/src/serialization-contract.ts +769 -23
  327. package/src/session.ts +87 -55
  328. package/src/source-files.ts +6 -11
  329. package/src/stores.ts +15 -3
  330. package/src/suppress-file.ts +24 -33
  331. package/src/suppress-inline.ts +55 -91
  332. package/src/suppress.ts +78 -79
  333. package/src/symbol-keys.ts +104 -107
  334. package/src/template-field.ts +15 -25
  335. package/src/tests/file-class.ts +135 -0
  336. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  337. package/src/{test-support.ts → tests/support.ts} +15 -21
  338. package/src/text/compare.ts +27 -0
  339. package/src/text/glob.ts +210 -0
  340. package/src/text/named-files.ts +388 -0
  341. package/src/text/yaml.ts +747 -0
  342. package/src/type-errors.ts +18 -288
  343. package/src/type-parameter-reads.ts +187 -158
  344. package/src/unimplemented-callees.ts +297 -280
  345. package/src/unwrap.ts +34 -0
  346. package/src/usage.ts +10 -0
  347. package/src/vendor/unbash/LICENSE +15 -0
  348. package/src/vendor/unbash/VENDORED.md +16 -0
  349. package/src/vendor/unbash/ansi-c.ts +132 -0
  350. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  351. package/src/vendor/unbash/arithmetic.ts +641 -0
  352. package/src/vendor/unbash/assignment.ts +163 -0
  353. package/src/vendor/unbash/chars.ts +48 -0
  354. package/src/vendor/unbash/command.ts +47 -0
  355. package/src/vendor/unbash/expansion.ts +144 -0
  356. package/src/vendor/unbash/glob.ts +284 -0
  357. package/src/vendor/unbash/heredoc.ts +34 -0
  358. package/src/vendor/unbash/internal-types.ts +94 -0
  359. package/src/vendor/unbash/lexer.ts +4352 -0
  360. package/src/vendor/unbash/limits.ts +3 -0
  361. package/src/vendor/unbash/parser.ts +1612 -0
  362. package/src/vendor/unbash/parts.ts +96 -0
  363. package/src/vendor/unbash/substitution-context.ts +20 -0
  364. package/src/vendor/unbash/traversal.ts +182 -0
  365. package/src/vendor/unbash/types.ts +660 -0
  366. package/src/vendor/unbash/word-value.ts +64 -0
  367. package/src/vendor/unbash/word.ts +50 -0
  368. package/src/verbs/analyze.ts +255 -164
  369. package/src/verbs/describe.ts +19 -17
  370. package/src/verbs/explain.ts +93 -169
  371. package/src/verbs/print-config.ts +2 -1
  372. package/src/verbs/print-projects.ts +6 -4
  373. package/src/verbs/print-retained.ts +7 -5
  374. package/src/verbs/print-roots.ts +4 -2
  375. package/src/verbs/verb.ts +2 -8
  376. package/src/verbs/version.ts +15 -3
  377. package/dist/src/base-url.js +0 -18
  378. package/dist/src/conventions.js +0 -937
  379. package/dist/src/discover.js +0 -468
  380. package/dist/src/entry-points.js +0 -529
  381. package/dist/src/glob.js +0 -65
  382. package/dist/src/manifest.js +0 -165
  383. package/dist/src/matrix.js +0 -246
  384. package/dist/src/pnpm-workspace.js +0 -120
  385. package/dist/src/roots.js +0 -672
  386. package/dist/src/setup-failure.js +0 -23
  387. package/dist/src/sweep.js +0 -224
  388. package/dist/src/test-joins.js +0 -101
  389. package/dist/src/version.js +0 -7
  390. package/dist/src/workflow-steps.js +0 -185
  391. package/src/base-url.ts +0 -24
  392. package/src/discover.ts +0 -653
  393. package/src/entry-points.ts +0 -687
  394. package/src/glob.ts +0 -67
  395. package/src/manifest.ts +0 -234
  396. package/src/matrix.ts +0 -423
  397. package/src/pnpm-workspace.ts +0 -135
  398. package/src/setup-failure.ts +0 -39
  399. package/src/sweep.ts +0 -347
  400. package/src/test-joins.ts +0 -120
  401. package/src/version.ts +0 -7
  402. package/src/workflow-steps.ts +0 -216
@@ -6,6 +6,8 @@
6
6
  * attribute names are appended past the file's end.
7
7
  */
8
8
 
9
+ import { isPathRelativeURL, startsRelativePath } from "./paths.ts";
10
+
9
11
  /** The language one block is written in, as the module's virtual extension spells it. */
10
12
  type BlockLanguage = "ts" | "tsx" | "js" | "jsx";
11
13
 
@@ -465,10 +467,10 @@ function actionOf(text: string): string {
465
467
  /** Whether a `src` value names a file: no scheme, no root-relative path, not empty. */
466
468
  function specifierOf(value: string): string | undefined {
467
469
  const trimmed = value.trim();
468
- if (trimmed === "" || trimmed.startsWith("/") || /^[A-Za-z][A-Za-z0-9+.-]*:/u.test(trimmed)) {
470
+ if (!isPathRelativeURL(trimmed)) {
469
471
  return undefined;
470
472
  }
471
- return trimmed.startsWith("./") || trimmed.startsWith("../") ? trimmed : `./${trimmed}`;
473
+ return startsRelativePath(trimmed) ? trimmed : `./${trimmed}`;
472
474
  }
473
475
 
474
476
  /** The line-start `<script` tags one block's content holds. */
@@ -8,10 +8,12 @@
8
8
 
9
9
  import type { CreateSnapshotParams } from "@typescript/native/sync";
10
10
  import type { Host } from "./host.ts";
11
+ import { INSTALLED_PACKAGES } from "./fs/manifest.ts";
11
12
  import { dirnamePath, joinPath } from "./paths.ts";
13
+ import { PRODUCT } from "./product.ts";
12
14
 
13
15
  /** The name the mapper's manifest declares and every configuration's entry names. */
14
- const MAPPER_PACKAGE = "deadset-ts-component-files";
16
+ const MAPPER_PACKAGE = `${PRODUCT}-component-files`;
15
17
 
16
18
  /** The file system one snapshot is created with. */
17
19
  type SnapshotFileSystem = NonNullable<CreateSnapshotParams["fileSystem"]>;
@@ -150,7 +152,7 @@ export function componentLayer(
150
152
  mappers,
151
153
  );
152
154
  if (mapper !== undefined) {
153
- symlinks[joinPath(dirnamePath(configFile), "node_modules", MAPPER_PACKAGE)] = {
155
+ symlinks[joinPath(dirnamePath(configFile), INSTALLED_PACKAGES, MAPPER_PACKAGE)] = {
154
156
  target: mapper.packageDirectory,
155
157
  host: true,
156
158
  };
package/src/config.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { CONTRACT_VERSION } from "./version.ts";
1
+ import type { ResolvedConfig } from "./contract/config.generated.ts";
2
+ import { SEVERITIES, type Severity } from "./contract/contract.generated.ts";
3
+ import { LANGUAGE } from "./product.ts";
2
4
 
3
5
  /**
4
6
  * The name of the repository configuration at the target root, which is also the
@@ -7,266 +9,32 @@ import { CONTRACT_VERSION } from "./version.ts";
7
9
  */
8
10
  export const REPOSITORY_DOCUMENT = "deadset.json";
9
11
 
10
- /**
11
- * Whether the target is an application, whose every caller is in the analyzed
12
- * graph, or a library, whose published API has callers outside it.
13
- */
14
- export type TargetKind = "application" | "library";
12
+ export type { PartialConfig, ResolvedConfig } from "./contract/config.generated.ts";
15
13
 
16
- /** The target kind as a source writes it: one kind for every language, or one per language. */
17
- export type TargetKindSetting = TargetKind | { readonly go: TargetKind; readonly ts: TargetKind };
14
+ /** Whether the target is an application or a library. */
15
+ export type TargetKind = Extract<ResolvedConfig["target"]["kind"], string>;
16
+ export type DeclarationEntry = ResolvedConfig["ts"]["serializers"][number];
17
+ export type LifecycleContract = ResolvedConfig["ts"]["lifecycle_contracts"][number];
18
+ export type BuildConfiguration = ResolvedConfig["analysis"]["configurations"][number];
19
+ export type ProjectConfiguration = Extract<BuildConfiguration, { readonly project: string }>;
20
+ export type TemplateDelimiters = ResolvedConfig["analysis"]["template_delimiters"];
21
+ export type Sort = ResolvedConfig["reporters"]["sort"];
22
+ export type Cascade = ResolvedConfig["reporters"]["cascade"];
18
23
 
19
- /** The kind a target kind setting gives one language's declarations. */
20
- export function kindOf(setting: TargetKindSetting, language: Language): TargetKind {
21
- return typeof setting === "string" ? setting : setting[language];
24
+ /** The kind a target kind setting gives this analyzer's declarations. */
25
+ export function kindOf(kind: ResolvedConfig["target"]["kind"]): TargetKind {
26
+ return typeof kind === "string" ? kind : kind[LANGUAGE];
22
27
  }
23
28
 
24
- /** The lowest reachability class a finding must reach to be reported. */
25
- export type Confidence = "certain" | "probable" | "possible";
26
-
27
- /** Whether declarations in generated files are analyzed. */
28
- export type GeneratedFiles = "exclude" | "include";
29
-
30
- /** How a reference from a consumer's test file counts. */
31
- export type ConsumerTests = "test" | "production";
32
-
33
- /** One language an analysis covers. */
34
- export type Language = "go" | "ts";
35
-
36
- /** What a finding of one issue kind does to a run. */
37
- export type Severity = "allow" | "warn" | "deny";
38
-
39
- /** The severities ranked, the strongest highest. */
40
- const SEVERITY_RANK: Readonly<Record<Severity, number>> = { allow: 0, warn: 1, deny: 2 };
41
-
42
29
  /** Whether a finding at one severity fails a run under the failing severity. */
43
30
  export function fails(severity: Severity, failOn: Severity): boolean {
44
- return SEVERITY_RANK[severity] >= SEVERITY_RANK[failOn];
45
- }
46
-
47
- /** One rendering of the finding list. */
48
- export type Format = "text" | "json" | "github" | "sarif" | "template";
49
-
50
- /** The order findings are rendered in. */
51
- export type Sort = "position" | "size";
52
-
53
- /** How much of a dead component a rendering names. */
54
- export type Cascade = "roots" | "full";
55
-
56
- /**
57
- * A platform configuration: an operating system, an architecture and the build
58
- * tags in effect. It is the shape a language built under build constraints reads,
59
- * and this analyzer leaves it to that analysis.
60
- */
61
- interface PlatformConfiguration {
62
- readonly shape: "platform";
63
- readonly id: string;
64
- readonly os: string;
65
- readonly arch: string;
66
- readonly tags: readonly string[];
67
- }
68
-
69
- /**
70
- * A project configuration: one compiler configuration file, as a path below the
71
- * target root with `/` between segments.
72
- */
73
- export interface ProjectConfiguration {
74
- readonly shape: "project";
75
- readonly id: string;
76
- readonly project: string;
77
- }
78
-
79
- /**
80
- * One entry of the build matrix: a configuration the target builds under, in
81
- * exactly one of the two shapes the matrix admits.
82
- */
83
- export type BuildConfiguration = PlatformConfiguration | ProjectConfiguration;
84
-
85
- /**
86
- * The pair of action delimiters a template is parsed with. Both members are
87
- * required once a document names the object, so the pair is one setting rather
88
- * than two.
89
- */
90
- export interface TemplateDelimiters {
91
- readonly left: string;
92
- readonly right: string;
93
- }
94
-
95
- /** How the analysis is scoped and filtered. */
96
- export interface Analysis {
97
- readonly languages: readonly Language[];
98
- readonly minConfidence: Confidence;
99
- readonly generatedFiles: GeneratedFiles;
100
- readonly consumerTests: ConsumerTests;
101
- readonly configurations: readonly BuildConfiguration[];
102
- readonly matrixComplete: boolean;
103
- readonly templateDirs: readonly string[];
104
- readonly templateDelimiters: TemplateDelimiters;
105
- }
106
-
107
- /** How findings are rendered. */
108
- interface Reporters {
109
- readonly formats: readonly Format[];
110
- readonly sort: Sort;
111
- readonly cascade: Cascade;
112
- readonly maxFindings: number;
113
- readonly failOn: Severity;
114
- }
115
-
116
- /**
117
- * One declaration a configuration entry names, in exactly one of three shapes: a
118
- * declaration of the analyzed program by its stable symbol reference, a declaration a
119
- * module exports by the bare specifier an import writes for the module and the
120
- * declaration's path from its exports, or a declaration of the global scope by its
121
- * path from that scope. A path joins the name and each member with dots and spells a
122
- * static member with `:static` after it.
123
- */
124
- export type DeclarationEntry =
125
- | { readonly shape: "symbol"; readonly symbol: string }
126
- | { readonly shape: "module"; readonly module: string; readonly name: string }
127
- | { readonly shape: "global"; readonly global: string };
128
-
129
- /**
130
- * One framework's lifecycle contract: the declarations whose use makes a class one of
131
- * the framework's components, the classes whose subclasses are its components, and the
132
- * names of the members the framework calls on a component, each spelled as the last
133
- * component of a member's stable symbol reference.
134
- */
135
- export interface LifecycleContract {
136
- readonly components: readonly DeclarationEntry[];
137
- readonly bases: readonly DeclarationEntry[];
138
- readonly members: readonly string[];
139
- }
140
-
141
- /**
142
- * One analyzer the orchestrator may run, in exactly one of two shapes: an installed
143
- * analyzer, named by its command alone, or an acquirable one, which also names the
144
- * artifact acquisition fetches and verifies. This analyzer validates and prints the
145
- * list and runs nothing from it.
146
- */
147
- export type Provider =
148
- | {
149
- readonly shape: "installed";
150
- readonly name: string;
151
- readonly languages: readonly Language[];
152
- readonly command: string;
153
- }
154
- | {
155
- readonly shape: "acquirable";
156
- readonly name: string;
157
- readonly languages: readonly Language[];
158
- readonly command: string;
159
- readonly source: string;
160
- readonly version: string;
161
- readonly digest: string;
162
- };
163
-
164
- /** The analyzers the orchestrator runs. */
165
- interface Providers {
166
- readonly analyzers: readonly Provider[];
167
- }
168
-
169
- /** The section the TypeScript analyzer owns. */
170
- export interface TSSection {
171
- readonly testFiles: readonly string[];
172
- readonly entryFiles: readonly string[];
173
- readonly componentExtensions: readonly string[];
174
- readonly disabledConventions: readonly string[];
175
- readonly injectionRegistrations: readonly DeclarationEntry[];
176
- readonly lifecycleContracts: readonly LifecycleContract[];
177
- readonly serializers: readonly DeclarationEntry[];
178
- /** Whether the maintainer declares the roots the analysis finds every root the target has. */
179
- readonly rootsComplete: boolean;
180
- }
181
-
182
- /**
183
- * The resolved configuration: the closed key list of the Contract's
184
- * configuration schema, decoded, with every default applied.
185
- *
186
- * `targetKind` is empty exactly in the configuration every default states, which
187
- * is not a configuration a run may use: the field has no default and resolution
188
- * refuses a result that carries none.
189
- *
190
- * `severity` is a map rather than an object because its keys come from a
191
- * document, and an object keyed by document text answers for names it never
192
- * held. The order it is written in is the emitter's, not the map's.
193
- */
194
- export interface Config {
195
- readonly contractVersion: string;
196
- readonly targetKind: TargetKindSetting | "";
197
- readonly analysis: Analysis;
198
- readonly consumersComplete: boolean;
199
- readonly rootPatterns: readonly string[];
200
- readonly severity: ReadonlyMap<string, Severity>;
201
- readonly exemptionsDisabled: readonly string[];
202
- readonly reporters: Reporters;
203
- readonly providers: Providers;
204
- readonly ts: TSSection;
205
- }
206
-
207
- /**
208
- * The configuration every documented default states. `targetKind` is empty: the
209
- * field has no default and is never inferred.
210
- */
211
- export function defaultConfig(): Config {
212
- return {
213
- contractVersion: CONTRACT_VERSION,
214
- targetKind: "",
215
- analysis: {
216
- languages: [],
217
- minConfidence: "probable",
218
- generatedFiles: "exclude",
219
- consumerTests: "test",
220
- configurations: [],
221
- matrixComplete: false,
222
- templateDirs: [],
223
- templateDelimiters: { left: "{{", right: "}}" },
224
- },
225
- consumersComplete: false,
226
- rootPatterns: [],
227
- severity: new Map(),
228
- exemptionsDisabled: [],
229
- reporters: {
230
- formats: ["text"],
231
- sort: "position",
232
- cascade: "roots",
233
- maxFindings: 0,
234
- failOn: "deny",
235
- },
236
- providers: {
237
- analyzers: [
238
- { shape: "installed", name: "deadset-go", languages: ["go"], command: "deadset-go" },
239
- { shape: "installed", name: "deadset-ts", languages: ["ts"], command: "deadset-ts" },
240
- ],
241
- },
242
- ts: {
243
- testFiles: [
244
- "**/*.test.{ts,tsx,mts,cts}",
245
- "**/*.test-d.{ts,tsx,mts,cts}",
246
- "**/*.spec-d.{ts,tsx,mts,cts}",
247
- "**/*.spec.*",
248
- "**/__tests__/**",
249
- "**/__mocks__/**",
250
- "**/test-d/**",
251
- ],
252
- entryFiles: [],
253
- componentExtensions: [".vue", ".svelte", ".astro"],
254
- disabledConventions: [],
255
- injectionRegistrations: [],
256
- lifecycleContracts: [],
257
- serializers: [],
258
- rootsComplete: false,
259
- },
260
- };
31
+ return SEVERITIES.indexOf(severity) >= SEVERITIES.indexOf(failOn);
261
32
  }
262
33
 
263
34
  /** Where a resolved setting came from, in the order the sources outrank each other. */
264
35
  export type Source = "flag" | "repository" | "central" | "default";
265
36
 
266
- /**
267
- * One setting's source together with the file or flag that supplied it. `label`
268
- * is empty exactly when `source` is `"default"`.
269
- */
37
+ /** One setting's source with the file or flag that supplied it, empty for a default. */
270
38
  export interface Origin {
271
39
  readonly source: Source;
272
40
  readonly label: string;
@@ -281,63 +49,24 @@ export function renderOrigin(origin: Origin): string {
281
49
  }
282
50
 
283
51
  /**
284
- * The origin of each resolved setting, keyed by the setting's dotted path. A
285
- * section holds no value of its own and has no entry; the severity object
286
- * carries one entry per code it names, or the entry `severity` alone when it is
287
- * empty.
52
+ * The origin of each resolved setting, keyed by the setting's dotted path. A section
53
+ * has no entry; a keyed section carries one entry per member it names, or one for
54
+ * itself when it is empty.
288
55
  */
289
56
  export type Provenance = ReadonlyMap<string, Origin>;
290
57
 
291
- /**
292
- * The configuration documents one invocation reads, each the document's text or
293
- * absent. `repositoryLabel` names the document `repository` holds and
294
- * `centralLabel` the one `central` holds; `flagLabels` names the flag that
295
- * supplied each setting `flags` names, keyed by dotted setting path.
296
- */
297
- export interface Inputs {
298
- readonly flags?: string;
299
- readonly repository?: string;
300
- readonly central?: string;
301
- readonly repositoryLabel?: string;
302
- readonly centralLabel?: string;
303
- readonly flagLabels?: ReadonlyMap<string, string>;
58
+ /** One configuration document: its text and the path it was read from. */
59
+ export interface Document {
60
+ readonly text: string;
61
+ readonly label: string;
304
62
  }
305
63
 
306
- /** Which refusal a {@link ConfigError} carries. */
307
- type ErrorKind =
308
- /**
309
- * A document that is not one JSON instance of the closed key list: a syntax
310
- * error, a value of the wrong type, a value outside the closed set a key
311
- * declares, or a member written twice at one level.
312
- */
313
- | "malformed"
314
- /**
315
- * A key the closed key list does not declare, or a severity key naming no live
316
- * kind or a kind whose severity the Contract fixes.
317
- */
318
- | "unimplemented-key"
319
- /** A resolved configuration no source supplied a target kind for. */
320
- | "missing-target-kind";
321
-
322
64
  /**
323
- * Every refusal configuration resolution makes. Each maps to the usage exit
324
- * code, and each is thrown rather than returned: a refusal ends the run, and the
325
- * one caller that turns it into an exit code is the command line.
65
+ * The configuration sources one invocation carries. `flags` holds the text each
66
+ * setting option was given, by the setting's dotted path.
326
67
  */
327
- export class ConfigError extends Error {
328
- /** Which refusal this is. */
329
- readonly kind: ErrorKind;
330
-
331
- /**
332
- * The key or field the message names, spelled as the document spells it. It is
333
- * empty when the refusal names none.
334
- */
335
- readonly key: string;
336
-
337
- constructor(kind: ErrorKind, key: string, message: string) {
338
- super(message);
339
- this.name = "ConfigError";
340
- this.kind = kind;
341
- this.key = key;
342
- }
68
+ export interface Inputs {
69
+ readonly flags?: ReadonlyMap<string, string>;
70
+ readonly repository?: Document;
71
+ readonly central?: Document;
343
72
  }
@@ -4,7 +4,7 @@ export const RECORD = {
4
4
  conformance: {
5
5
  corpusVersion: "6.0.0",
6
6
  result: "pass",
7
- digest: "sha256:d65daae4b7c95050c07896b166d0250d233cca71f97de75a6086c1d80fe76232",
7
+ digest: "sha256:e4af2b9bcd07fd745101bf3215cd21e9df1448bdc332a791f25d5676cf15c794",
8
8
  },
9
9
  gaps: [],
10
10
  } as const;
package/src/consumers.ts CHANGED
@@ -1,86 +1,36 @@
1
- /**
2
- * The consumers a scope declares, loaded beside the target: each a directory on the
3
- * local filesystem whose compiler configurations open as projects of the run's one
4
- * snapshot, and whose references to the target's declarations count against them.
5
- */
6
-
7
- import type { Config } from "./config.ts";
8
- import { consumerProjects } from "./discover.ts";
1
+ import type { PartialConfig } from "./config.ts";
2
+ import type { ParseFile } from "./entries/configuration-files.ts";
3
+ import { runDirectories } from "./entries/run-directories.ts";
9
4
  import type { Host } from "./host.ts";
10
- import { inventory, packageScope } from "./inventory.ts";
5
+ import { inventory } from "./inventory/enumerate.ts";
11
6
  import { relativePath } from "./paths.ts";
12
- import { references, type ConsumerSide, type Reference } from "./references.ts";
13
- import type { Module, Scope } from "./scope.ts";
14
- import { narrowedTo, type Engine, type ProjectView } from "./session.ts";
15
-
16
- /** One consumer the run loaded. */
17
- export interface LoadedConsumer {
18
- /** The name the consumer publishes itself under, which every finding names it by. */
19
- readonly id: string;
20
- /** The consumer's directory, absolute. */
21
- readonly path: string;
22
- }
23
-
24
- /** One declared consumer and the compiler configurations it opens as. */
25
- interface ConsumerLoad {
26
- readonly consumer: LoadedConsumer;
27
- /** The configuration files, absolute, in discovery order, none a target project's. */
28
- readonly configFiles: readonly string[];
29
- }
30
-
31
- /** The name one module publishes itself under: the scope's, else its manifest's. */
32
- export function moduleIdentity(host: Host, module: Module): string {
33
- return module.id === "" ? packageScope(host, module.path)("index.ts").package : module.id;
34
- }
35
-
36
- /**
37
- * Every consumer the scope declares, in its order, with the projects it opens as. A
38
- * configuration that is also one of the target's projects, or an earlier consumer's, is
39
- * that project's alone. A consumer whose directory is absent, is no directory or holds
40
- * no configuration ends the run naming it, before any project opens.
41
- */
42
- export function consumerLoads(
43
- engine: Engine,
44
- host: Host,
45
- scope: Scope,
46
- targetConfigFiles: readonly string[],
47
- ): readonly ConsumerLoad[] {
48
- const opened = new Set(targetConfigFiles);
49
- return scope.consumers.map((module) => {
50
- const configFiles = consumerProjects(engine, host, module.path).filter((configFile) => {
51
- const fresh = !opened.has(configFile);
52
- opened.add(configFile);
53
- return fresh;
54
- });
55
- return { consumer: { id: moduleIdentity(host, module), path: module.path }, configFiles };
56
- });
57
- }
7
+ import { references, type ConsumerSide, type References } from "./references.ts";
8
+ import { narrowedTo, type ProjectView } from "./session.ts";
9
+ import { patternTestFile } from "./tests/file-class.ts";
58
10
 
59
11
  /**
60
12
  * Every reference one consumer project's own files make to a declaration of the target.
61
13
  * The target's declarations are enumerated over the target's files the consumer's
62
14
  * program holds, against the target root, so each carries the identifier the target's
63
- * own projects give it. A reference from a consumer's test file is a test reference
64
- * unless the configuration counts it as a production one.
15
+ * own projects give it. A reference from a consumer's test file is a test reference;
16
+ * whether the run counts it as a production one is the sweep's mode.
65
17
  */
66
18
  export function consumerReferences<Brand>(
67
19
  project: ProjectView<Brand>,
68
20
  host: Host,
69
21
  targetRoot: string,
70
22
  consumer: ConsumerSide,
71
- config: Config,
72
- ): readonly Reference[] {
23
+ config: PartialConfig,
24
+ parse: ParseFile,
25
+ ): References {
73
26
  const held = inventory(
74
27
  narrowedTo(project, (file) => relativePath(targetRoot, file.fileName) !== undefined),
75
28
  host,
76
29
  targetRoot,
77
30
  );
78
- const found = references(project, held, targetRoot, {
79
- testFiles: config.ts.testFiles,
31
+ return references(project, held, targetRoot, {
32
+ testFile: patternTestFile(config.ts.test_files, consumer.root),
80
33
  consumer,
81
- }).references;
82
- if (config.analysis.consumerTests !== "production") {
83
- return found;
84
- }
85
- return found.map((reference) => (reference.test ? { ...reference, test: false } : reference));
34
+ directories: runDirectories(host, consumer.root, parse),
35
+ });
86
36
  }