@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
@@ -5,6 +5,7 @@
5
5
  * of the module is the same position of the file. A default export and the imports a `src`
6
6
  * attribute names are appended past the file's end.
7
7
  */
8
+ import { isPathRelativeURL, startsRelativePath } from "./paths.js";
8
9
  const LANGUAGES = new Map([
9
10
  ["ts", "ts"],
10
11
  ["tsx", "tsx"],
@@ -346,10 +347,10 @@ function actionOf(text) {
346
347
  /** Whether a `src` value names a file: no scheme, no root-relative path, not empty. */
347
348
  function specifierOf(value) {
348
349
  const trimmed = value.trim();
349
- if (trimmed === "" || trimmed.startsWith("/") || /^[A-Za-z][A-Za-z0-9+.-]*:/u.test(trimmed)) {
350
+ if (!isPathRelativeURL(trimmed)) {
350
351
  return undefined;
351
352
  }
352
- return trimmed.startsWith("./") || trimmed.startsWith("../") ? trimmed : `./${trimmed}`;
353
+ return startsRelativePath(trimmed) ? trimmed : `./${trimmed}`;
353
354
  }
354
355
  /** The line-start `<script` tags one block's content holds. */
355
356
  function scriptsInside(text, from, to) {
@@ -5,9 +5,11 @@
5
5
  * member wins over one it extends. The mapper resolves as a package linked into the
6
6
  * `node_modules` beside each configuration, to a directory holding only its manifest.
7
7
  */
8
+ import { INSTALLED_PACKAGES } from "./fs/manifest.js";
8
9
  import { dirnamePath, joinPath } from "./paths.js";
10
+ import { PRODUCT } from "./product.js";
9
11
  /** The name the mapper's manifest declares and every configuration's entry names. */
10
- const MAPPER_PACKAGE = "deadset-ts-component-files";
12
+ const MAPPER_PACKAGE = `${PRODUCT}-component-files`;
11
13
  /** The manifest of the mapper's package, which runs `command`. */
12
14
  export function mapperManifest(command) {
13
15
  return `${JSON.stringify({
@@ -122,7 +124,7 @@ export function componentLayer(host, configFiles, mapper, written = new Map()) {
122
124
  for (const configFile of configFiles) {
123
125
  files[configFile] = withContentMappers(written.get(configFile) ?? host.readFile(configFile), mappers);
124
126
  if (mapper !== undefined) {
125
- symlinks[joinPath(dirnamePath(configFile), "node_modules", MAPPER_PACKAGE)] = {
127
+ symlinks[joinPath(dirnamePath(configFile), INSTALLED_PACKAGES, MAPPER_PACKAGE)] = {
126
128
  target: mapper.packageDirectory,
127
129
  host: true,
128
130
  };
@@ -1,74 +1,18 @@
1
- import { CONTRACT_VERSION } from "./version.js";
1
+ import { SEVERITIES } from "./contract/contract.generated.js";
2
+ import { LANGUAGE } from "./product.js";
2
3
  /**
3
4
  * The name of the repository configuration at the target root, which is also the
4
5
  * document a finding about the configuration names where no document of the
5
6
  * target supplied the setting it is about.
6
7
  */
7
8
  export const REPOSITORY_DOCUMENT = "deadset.json";
8
- /** The kind a target kind setting gives one language's declarations. */
9
- export function kindOf(setting, language) {
10
- return typeof setting === "string" ? setting : setting[language];
9
+ /** The kind a target kind setting gives this analyzer's declarations. */
10
+ export function kindOf(kind) {
11
+ return typeof kind === "string" ? kind : kind[LANGUAGE];
11
12
  }
12
- /** The severities ranked, the strongest highest. */
13
- const SEVERITY_RANK = { allow: 0, warn: 1, deny: 2 };
14
13
  /** Whether a finding at one severity fails a run under the failing severity. */
15
14
  export function fails(severity, failOn) {
16
- return SEVERITY_RANK[severity] >= SEVERITY_RANK[failOn];
17
- }
18
- /**
19
- * The configuration every documented default states. `targetKind` is empty: the
20
- * field has no default and is never inferred.
21
- */
22
- export function defaultConfig() {
23
- return {
24
- contractVersion: CONTRACT_VERSION,
25
- targetKind: "",
26
- analysis: {
27
- languages: [],
28
- minConfidence: "probable",
29
- generatedFiles: "exclude",
30
- consumerTests: "test",
31
- configurations: [],
32
- matrixComplete: false,
33
- templateDirs: [],
34
- templateDelimiters: { left: "{{", right: "}}" },
35
- },
36
- consumersComplete: false,
37
- rootPatterns: [],
38
- severity: new Map(),
39
- exemptionsDisabled: [],
40
- reporters: {
41
- formats: ["text"],
42
- sort: "position",
43
- cascade: "roots",
44
- maxFindings: 0,
45
- failOn: "deny",
46
- },
47
- providers: {
48
- analyzers: [
49
- { shape: "installed", name: "deadset-go", languages: ["go"], command: "deadset-go" },
50
- { shape: "installed", name: "deadset-ts", languages: ["ts"], command: "deadset-ts" },
51
- ],
52
- },
53
- ts: {
54
- testFiles: [
55
- "**/*.test.{ts,tsx,mts,cts}",
56
- "**/*.test-d.{ts,tsx,mts,cts}",
57
- "**/*.spec-d.{ts,tsx,mts,cts}",
58
- "**/*.spec.*",
59
- "**/__tests__/**",
60
- "**/__mocks__/**",
61
- "**/test-d/**",
62
- ],
63
- entryFiles: [],
64
- componentExtensions: [".vue", ".svelte", ".astro"],
65
- disabledConventions: [],
66
- injectionRegistrations: [],
67
- lifecycleContracts: [],
68
- serializers: [],
69
- rootsComplete: false,
70
- },
71
- };
15
+ return SEVERITIES.indexOf(severity) >= SEVERITIES.indexOf(failOn);
72
16
  }
73
17
  /**
74
18
  * Renders the origin as the provenance value the Contract declares: `default`,
@@ -77,23 +21,3 @@ export function defaultConfig() {
77
21
  export function renderOrigin(origin) {
78
22
  return origin.source === "default" ? "default" : `${origin.source}: ${origin.label}`;
79
23
  }
80
- /**
81
- * Every refusal configuration resolution makes. Each maps to the usage exit
82
- * code, and each is thrown rather than returned: a refusal ends the run, and the
83
- * one caller that turns it into an exit code is the command line.
84
- */
85
- export class ConfigError extends Error {
86
- /** Which refusal this is. */
87
- kind;
88
- /**
89
- * The key or field the message names, spelled as the document spells it. It is
90
- * empty when the refusal names none.
91
- */
92
- key;
93
- constructor(kind, key, message) {
94
- super(message);
95
- this.name = "ConfigError";
96
- this.kind = kind;
97
- this.key = key;
98
- }
99
- }
@@ -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
  };
@@ -1,49 +1,21 @@
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
- import { consumerProjects } from "./discover.js";
7
- import { inventory, packageScope } from "./inventory.js";
1
+ import { runDirectories } from "./entries/run-directories.js";
2
+ import { inventory } from "./inventory/enumerate.js";
8
3
  import { relativePath } from "./paths.js";
9
4
  import { references } from "./references.js";
10
5
  import { narrowedTo } from "./session.js";
11
- /** The name one module publishes itself under: the scope's, else its manifest's. */
12
- export function moduleIdentity(host, module) {
13
- return module.id === "" ? packageScope(host, module.path)("index.ts").package : module.id;
14
- }
15
- /**
16
- * Every consumer the scope declares, in its order, with the projects it opens as. A
17
- * configuration that is also one of the target's projects, or an earlier consumer's, is
18
- * that project's alone. A consumer whose directory is absent, is no directory or holds
19
- * no configuration ends the run naming it, before any project opens.
20
- */
21
- export function consumerLoads(engine, host, scope, targetConfigFiles) {
22
- const opened = new Set(targetConfigFiles);
23
- return scope.consumers.map((module) => {
24
- const configFiles = consumerProjects(engine, host, module.path).filter((configFile) => {
25
- const fresh = !opened.has(configFile);
26
- opened.add(configFile);
27
- return fresh;
28
- });
29
- return { consumer: { id: moduleIdentity(host, module), path: module.path }, configFiles };
30
- });
31
- }
6
+ import { patternTestFile } from "./tests/file-class.js";
32
7
  /**
33
8
  * Every reference one consumer project's own files make to a declaration of the target.
34
9
  * The target's declarations are enumerated over the target's files the consumer's
35
10
  * program holds, against the target root, so each carries the identifier the target's
36
- * own projects give it. A reference from a consumer's test file is a test reference
37
- * unless the configuration counts it as a production one.
11
+ * own projects give it. A reference from a consumer's test file is a test reference;
12
+ * whether the run counts it as a production one is the sweep's mode.
38
13
  */
39
- export function consumerReferences(project, host, targetRoot, consumer, config) {
14
+ export function consumerReferences(project, host, targetRoot, consumer, config, parse) {
40
15
  const held = inventory(narrowedTo(project, (file) => relativePath(targetRoot, file.fileName) !== undefined), host, targetRoot);
41
- const found = references(project, held, targetRoot, {
42
- testFiles: config.ts.testFiles,
16
+ return references(project, held, targetRoot, {
17
+ testFile: patternTestFile(config.ts.test_files, consumer.root),
43
18
  consumer,
44
- }).references;
45
- if (config.analysis.consumerTests !== "production") {
46
- return found;
47
- }
48
- return found.map((reference) => (reference.test ? { ...reference, test: false } : reference));
19
+ directories: runDirectories(host, consumer.root, parse),
20
+ });
49
21
  }
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * The uses contextual types make of the target's members, which no name node resolves to.
3
3
  * An object-literal property writes the member of its name on each constituent of the
4
- * literal's contextual type that declares one. A value reaching a position typed by another
5
- * object type reads each of its members that type declares, through array elements and
6
- * the parameters and results of functions and constructors too; a class instance there is
7
- * the interface-satisfaction class's evidence instead.
4
+ * literal's contextual type that declares one, and so does a property of a literal whose
5
+ * type is inferred, where a value of that type reaches such a position. A value reaching a
6
+ * position typed by another object type reads each of its members that type declares,
7
+ * through array elements and the parameters and results of functions and constructors
8
+ * too; a class instance there is the interface-satisfaction class's evidence instead.
8
9
  */
9
10
  import { isClassDeclaration, isClassExpression, isComputedPropertyName, isGetAccessorDeclaration, isIdentifier, isMethodDeclaration, isMethodSignatureDeclaration, isNoSubstitutionTemplateLiteral, isNumericLiteral, isObjectLiteralExpression, isPropertyAssignment, isSetAccessorDeclaration, isShorthandPropertyAssignment, isSpreadAssignment, isStringLiteral, } from "@typescript/native/ast";
10
11
  import { SignatureKind } from "@typescript/native/sync";
@@ -62,9 +63,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
62
63
  const privateNames = new Set(held.symbols
63
64
  .filter((symbol) => symbol.visibility === "private-name")
64
65
  .map((symbol) => symbol.id));
65
- let batches = 0;
66
- let lookups = 0;
67
- const batchesOf = (count) => Math.ceil(count / cap);
68
66
  const parts = new Map();
69
67
  /** The object types one type is: itself, or its constituents at any depth. */
70
68
  const partsOf = (type) => {
@@ -74,7 +72,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
74
72
  }
75
73
  let found = [];
76
74
  if (type.isUnionType() || type.isIntersectionType()) {
77
- lookups += 1;
78
75
  const constituents = queries.constituents(type);
79
76
  found = isAnswered(constituents) ? constituents.flatMap(partsOf) : [];
80
77
  }
@@ -93,7 +90,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
93
90
  }
94
91
  const table = new Map();
95
92
  const read = properties.of(type);
96
- lookups += read.asked ? 1 : 0;
97
93
  for (const property of isAnswered(read.properties) ? read.properties : []) {
98
94
  table.set(property.name, {
99
95
  ids: chains
@@ -111,7 +107,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
111
107
  return table;
112
108
  };
113
109
  const writes = [];
114
- batches += batchesOf(literals.length);
115
110
  const contexts = queries.contextualTypes(literals.map((one) => one.literal), cap);
116
111
  // A computed name that is not literal text names the property the literal declares
117
112
  // under the checker's own key, which is how a type declares a member a unique symbol
@@ -122,7 +117,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
122
117
  const name = propertyName(property);
123
118
  return name !== undefined && name.text === undefined ? [name.node] : [];
124
119
  }));
125
- batches += batchesOf(computed.length);
126
120
  const keys = new Map();
127
121
  (computed.length === 0
128
122
  ? []
@@ -151,7 +145,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
151
145
  }
152
146
  });
153
147
  const carried = flows.filter((flow) => !isObjectLiteralExpression(flow.value));
154
- batches += batchesOf(carried.length);
155
148
  const types = queries.typesAt(carried.map((flow) => flow.value), cap);
156
149
  /** The members a position may read structurally: those of object types, not of classes. */
157
150
  const readable = (member) => [
@@ -164,17 +157,42 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
164
157
  const members = [...membersOf(part).values()];
165
158
  return members.length > 0 && members.every((member) => !member.own);
166
159
  };
160
+ const literalTypes = new Map();
161
+ /**
162
+ * Whether an object type is an object literal's own, inferred where no contextual type
163
+ * names it: every member a property an object literal of the target writes.
164
+ */
165
+ const literalTyped = (part) => {
166
+ let known = literalTypes.get(part.id);
167
+ if (known === undefined) {
168
+ const members = [...membersOf(part).values()];
169
+ known =
170
+ members.length > 0 &&
171
+ members.every((member) => member.ids.length === 0 &&
172
+ member.declarations.length > 0 &&
173
+ member.declarations.every((handle) => literalProperty(handle) !== undefined));
174
+ literalTypes.set(part.id, known);
175
+ }
176
+ return known;
177
+ };
178
+ /** The name node of the object literal property one declaration handle names, if it is one. */
179
+ const literalProperty = (handle) => {
180
+ const node = project.declarationAt(handle)?.node;
181
+ return node !== undefined &&
182
+ (isPropertyAssignment(node) || isShorthandPropertyAssignment(node)) &&
183
+ isObjectLiteralExpression(node.parent)
184
+ ? node.name
185
+ : undefined;
186
+ };
167
187
  const elements = new Map();
168
188
  /** The element type of an array type, read once per type. */
169
189
  const elementOf = (type) => {
170
190
  if (elements.has(type.id)) {
171
191
  return elements.get(type.id);
172
192
  }
173
- lookups += 1;
174
193
  const isArray = queries.isArray(type);
175
194
  let element;
176
195
  if (isAnswered(isArray) && isArray) {
177
- lookups += 1;
178
196
  const held = queries.typeArguments(type);
179
197
  element = isAnswered(held) ? held[0] : undefined;
180
198
  }
@@ -188,7 +206,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
188
206
  if (known !== undefined) {
189
207
  return known;
190
208
  }
191
- lookups += type.isTypeReference() ? 1 : 0;
192
209
  const held = queries.typeArguments(type);
193
210
  const found = isAnswered(held) ? held : [];
194
211
  argumentsOf.set(type.id, found);
@@ -204,18 +221,15 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
204
221
  if (known !== undefined) {
205
222
  return known;
206
223
  }
207
- lookups += 1;
208
224
  let kind = SignatureKind.Call;
209
225
  let signatures = queries.signaturesOf(type, kind);
210
226
  if (isAnswered(signatures) && signatures.length === 0) {
211
- lookups += 1;
212
227
  kind = SignatureKind.Construct;
213
228
  signatures = queries.signaturesOf(type, kind);
214
229
  }
215
230
  const called = (isAnswered(signatures) ? signatures : []).map((signature) => {
216
231
  const parameters = signature.parameters.map((_parameter, index) => queries.parameterType(signature, index));
217
232
  const result = queries.returnTypeOf(signature);
218
- lookups += parameters.length + 1;
219
233
  return {
220
234
  kind,
221
235
  parameters: parameters.map((one) => (isAnswered(one) ? one : undefined)),
@@ -246,10 +260,13 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
246
260
  const sources = partsOf(source).filter((one) => !targets.some((part) => part.id === one.id));
247
261
  for (const one of sources) {
248
262
  if (carries(one)) {
249
- into.push({ source: one, targets, outside: false });
263
+ into.push({ source: one, targets, sourceKind: "members" });
250
264
  }
251
265
  else if (outside(one)) {
252
- into.push({ source: one, targets, outside: true });
266
+ into.push({ source: one, targets, sourceKind: "outside" });
267
+ }
268
+ else if (literalTyped(one)) {
269
+ into.push({ source: one, targets, sourceKind: "literal" });
253
270
  }
254
271
  const element = elementOf(one);
255
272
  const called = element === undefined ? callsOf(one) : [];
@@ -290,7 +307,7 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
290
307
  }
291
308
  seen.add(type.id);
292
309
  return partsOf(type).some((part) => {
293
- if (carries(part) || outside(part)) {
310
+ if (carries(part) || outside(part) || literalTyped(part)) {
294
311
  return true;
295
312
  }
296
313
  const element = elementOf(part);
@@ -304,9 +321,10 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
304
321
  const type = types[index];
305
322
  return type === undefined || !isAnswered(type) || !mayCarry(type) ? [] : [{ flow, type }];
306
323
  });
307
- batches += batchesOf(sourced.length);
308
324
  const positions = queries.contextualTypes(sourced.map((one) => one.flow.value), cap);
309
325
  const reads = [];
326
+ // A literal property writes a position's members once, however many values carry it there.
327
+ const carriedWrites = new Set();
310
328
  sourced.forEach(({ flow, type }, index) => {
311
329
  const position = positions[index];
312
330
  if (position === undefined || !isAnswered(position)) {
@@ -315,10 +333,24 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
315
333
  const checked = [];
316
334
  compared(type, position, checked, new Set());
317
335
  const ids = new Set();
318
- for (const { source, targets, outside: held } of checked) {
336
+ for (const { source, targets, sourceKind } of checked) {
319
337
  const tables = targets.map(membersOf);
320
338
  const sourceMembers = membersOf(source);
321
- if (held) {
339
+ if (sourceKind === "literal") {
340
+ for (const [name, member] of sourceMembers) {
341
+ const written = [...new Set(tables.flatMap((table) => table.get(name)?.ids ?? []))];
342
+ for (const at of written.length === 0 ? [] : member.declarations) {
343
+ const node = literalProperty(at);
344
+ const key = `${at.path}#${String(at.index)}>${written.join(",")}`;
345
+ if (node !== undefined && !carriedWrites.has(key)) {
346
+ carriedWrites.add(key);
347
+ writes.push({ at: node, from: flow.from, ids: written });
348
+ }
349
+ }
350
+ }
351
+ continue;
352
+ }
353
+ if (sourceKind === "outside") {
322
354
  for (const table of tables) {
323
355
  for (const [name, member] of table) {
324
356
  if (sourceMembers.has(name)) {
@@ -361,7 +393,6 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
361
393
  return known;
362
394
  };
363
395
  const spreads = literals.flatMap(({ literal, from }) => literal.properties.flatMap((property) => isSpreadAssignment(property) ? [{ value: property.expression, from }] : []));
364
- batches += batchesOf(spreads.length);
365
396
  const spreadTypes = queries.typesAt(spreads.map((one) => one.value), cap);
366
397
  spreads.forEach(({ value, from }, index) => {
367
398
  const type = spreadTypes[index];
@@ -379,5 +410,5 @@ export function contextualUses(project, held, chains, literals, flows, cap, prop
379
410
  reads.push({ at: value, from, ids });
380
411
  }
381
412
  });
382
- return { writes, reads, batches, lookups };
413
+ return { writes, reads };
383
414
  }