@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
package/src/session.ts CHANGED
@@ -13,11 +13,9 @@ import type {
13
13
  Symbol as TSSymbol,
14
14
  TimingInfo,
15
15
  } from "@typescript/native/sync";
16
- import type { Node, SourceFile } from "@typescript/native/ast";
16
+ import type { Node, SourceFile, StringLiteralLikeNode } from "@typescript/native/ast";
17
17
  import { componentLayer, mapperManifest } from "./component-layer.ts";
18
- import { DiscoveryError } from "./discover.ts";
19
18
  import type { Host, TemporaryDirectory } from "./host.ts";
20
- import type { WorkspaceProgram } from "./workspace-programs.ts";
21
19
  import { joinPath } from "./paths.ts";
22
20
  import {
23
21
  queriesOf,
@@ -26,6 +24,7 @@ import {
26
24
  type Queries,
27
25
  type UnansweredQuestion,
28
26
  } from "./query.ts";
27
+ import { MANIFEST } from "./fs/manifest.ts";
29
28
 
30
29
  /**
31
30
  * The compiler the analysis reads through: a client over a protocol to a separate
@@ -36,8 +35,8 @@ import {
36
35
  export interface Engine {
37
36
  /**
38
37
  * Resolves one compiler configuration file, or throws with the reason it cannot
39
- * be read. The result is spelled through the client's own signature: the type
40
- * the compiler package returns here is not one of its exported names.
38
+ * be read. The result is spelled through the client's own signature: the type the
39
+ * compiler package returns here is not one of its exported names.
41
40
  */
42
41
  parseConfigFile(file: DocumentIdentifier): ReturnType<API["parseConfigFile"]>;
43
42
  /** Resolves one configuration's JSON as if `configFile` held it, which no file need. */
@@ -82,6 +81,22 @@ export interface Engine {
82
81
  close(): void;
83
82
  }
84
83
 
84
+ /** The most questions one round trip carries. */
85
+ const BATCH = 2048;
86
+
87
+ /** Asks one question of every item, in round trips of at most {@link BATCH}, answers in order. */
88
+ export function batched<T, A>(
89
+ engine: Engine,
90
+ items: readonly T[],
91
+ question: (item: T) => APIRequestGenerator<A>,
92
+ ): A[] {
93
+ const answers: A[] = [];
94
+ for (let at = 0; at < items.length; at += BATCH) {
95
+ answers.push(...engine.batch(items.slice(at, at + BATCH).map(question)));
96
+ }
97
+ return answers;
98
+ }
99
+
85
100
  /** How a run opens its compiler client. */
86
101
  export interface EngineOptions {
87
102
  /** Collect per-request timing, which the calibration record reads. */
@@ -115,7 +130,7 @@ export function openEngine(options: EngineOptions): Engine {
115
130
  if (components !== undefined && components.extensions.length > 0) {
116
131
  const made = components.host.temporaryDirectory();
117
132
  try {
118
- components.host.writeDocument(joinPath(made.path, "package.json"), [
133
+ components.host.writeDocument(joinPath(made.path, MANIFEST), [
119
134
  mapperManifest(components.host.componentMapperCommand()),
120
135
  ]);
121
136
  } catch (error: unknown) {
@@ -227,6 +242,11 @@ export interface ProjectView<Brand> {
227
242
  * file it is in.
228
243
  */
229
244
  ownPaths(): ReadonlySet<string>;
245
+ /**
246
+ * The file the compiler's module resolution names for each module specifier of this
247
+ * project's files, in order, or `undefined` where it names none.
248
+ */
249
+ resolvedFileNames(specifiers: readonly StringLiteralLikeNode[]): (string | undefined)[];
230
250
  /** A handle to one node of this project's program. */
231
251
  handle(node: Node): Handle<Brand>;
232
252
  /**
@@ -271,13 +291,6 @@ export interface ProjectView<Brand> {
271
291
  */
272
292
  export type ProjectVisitor<Result> = <Brand>(project: ProjectView<Brand>) => Result;
273
293
 
274
- /** One project a session opened: its configuration and the files of its own program. */
275
- export interface OpenedFiles {
276
- readonly configFile: string;
277
- /** The program's source files no default library and no external library holds. */
278
- readonly fileNames: () => readonly string[];
279
- }
280
-
281
294
  /**
282
295
  * The source files of one program that `own` admits, in the program's order, none of
283
296
  * them one of the compiler's default libraries.
@@ -339,6 +352,17 @@ function viewOf<Brand>(
339
352
  ownKeys ??= new Set(ownSourceFiles().map((file) => file.path));
340
353
  return ownKeys;
341
354
  },
355
+ resolvedFileNames: (specifiers) =>
356
+ batched(engine, specifiers, (node) =>
357
+ project.program.getResolvedModuleFromModuleSpecifier.gen(
358
+ node,
359
+ node.getSourceFile().fileName,
360
+ ),
361
+ ).map((resolved) =>
362
+ resolved === undefined || resolved.resolvedFileName === ""
363
+ ? undefined
364
+ : resolved.resolvedFileName,
365
+ ),
342
366
  handle: (node) => ({ node }),
343
367
  symbolsAt: (handles, cap) =>
344
368
  queries.symbolsAt(
@@ -471,19 +495,30 @@ export function diagnosticsOf<Brand>(project: ProjectView<Brand>): ProjectDiagno
471
495
  };
472
496
  }
473
497
 
498
+ /** How a snapshot builds one configuration other than by opening the project it names. */
499
+ export type ProgramBuild =
500
+ | { readonly kind: "program"; readonly params: CreateSnapshotProgramParams }
501
+ /** A configuration only the snapshot holds, at a path no file has. */
502
+ | { readonly kind: "configuration"; readonly file: string; readonly text: string };
503
+
474
504
  /** One run's result: what the visitor answered for each project, and what it cost. */
475
505
  export interface SessionResult<Result> {
476
- /** One answer per configuration the snapshot opened a project for, in the order named. */
506
+ /** One answer per configuration, in the order named. */
477
507
  readonly projects: readonly Result[];
478
- /** The configurations the snapshot opened no project for, in the order named. */
479
- readonly unopened: readonly string[];
480
508
  readonly timing: TimingInfo;
481
- /** Every question the checker could not answer, each once, in the order first asked. */
482
- readonly unanswered: readonly UnansweredQuestion[];
483
509
  }
484
510
 
485
- /** What a run does about a configuration the snapshot opened no project for. */
486
- type Unopened = "refuse" | "record";
511
+ /** One open snapshot's projects, valid only while the session that handed it out runs. */
512
+ export interface OpenedSession {
513
+ /** One view per configuration the snapshot opened a project for, in the order named. */
514
+ readonly views: readonly ProjectView<unknown>[];
515
+ }
516
+
517
+ /** How one session opens its configurations. */
518
+ export interface SessionOptions {
519
+ /** How the snapshot builds each configuration it does not open as its project. */
520
+ readonly programs?: ReadonlyMap<string, ProgramBuild> | undefined;
521
+ }
487
522
 
488
523
  /**
489
524
  * The projects one snapshot holds for the configurations named, by configuration file. A
@@ -512,22 +547,18 @@ function projectsOf(
512
547
  }
513
548
 
514
549
  /**
515
- * Runs `visit` over every project the compiler configurations name, inside one never updated
516
- * snapshot of one client, and answers in their order. A configuration `programs` describes is
517
- * built as that program, or opened from the configuration it writes. One the snapshot holds
518
- * nothing for ends the run under `"refuse"` and is named in the result under `"record"`.
519
- * `first` runs over every opened project before the first visit and `last` after the last,
520
- * both while the client answers; the snapshot and the client are then released.
550
+ * Opens every project the compiler configurations name in one never updated snapshot of one
551
+ * client, and hands them to `use` while the client answers; the snapshot and the client are
552
+ * then released. A configuration `options.programs` describes is built as that program, or
553
+ * opened from the configuration it writes. One the snapshot holds nothing for has no view.
521
554
  */
522
- export function runSession<Result>(
555
+ export function openSession<Result>(
523
556
  engine: Engine,
524
557
  configFiles: readonly string[],
525
- visit: ProjectVisitor<Result>,
526
- unopened: Unopened = "refuse",
527
- programs: ReadonlyMap<string, WorkspaceProgram> = new Map(),
528
- last: () => void = () => undefined,
529
- first: (opened: readonly OpenedFiles[]) => void = () => undefined,
530
- ): SessionResult<Result> {
558
+ options: SessionOptions,
559
+ use: (opened: OpenedSession, unanswered: () => readonly UnansweredQuestion[]) => Result,
560
+ ): Result {
561
+ const programs = options.programs ?? new Map<string, ProgramBuild>();
531
562
  try {
532
563
  const built: string[] = [];
533
564
  const params: CreateSnapshotProgramParams[] = [];
@@ -552,32 +583,13 @@ export function runSession<Result>(
552
583
  const opened = projectsOf(snapshot, built, written);
553
584
  const log = new UnansweredLog();
554
585
  const views: ProjectView<unknown>[] = [];
555
- const missing: string[] = [];
556
586
  for (const configFile of configFiles) {
557
587
  const project = opened.get(configFile);
558
- if (project === undefined) {
559
- if (unopened === "refuse") {
560
- throw new DiscoveryError(`${configFile} opened no project`, []);
561
- }
562
- missing.push(configFile);
563
- continue;
588
+ if (project !== undefined) {
589
+ views.push(viewOf(project, configFile, engine, log));
564
590
  }
565
- views.push(viewOf(project, configFile, engine, log));
566
591
  }
567
- first(
568
- views.map((view) => ({
569
- configFile: view.configFile,
570
- fileNames: () => view.ownSourceFiles().map((file) => file.fileName),
571
- })),
572
- );
573
- const projects = views.map((view) => visit(view));
574
- last();
575
- return {
576
- projects,
577
- unopened: missing,
578
- timing: engine.getTimingInfo(),
579
- unanswered: log.questions,
580
- };
592
+ return use({ views }, () => log.questions);
581
593
  } finally {
582
594
  snapshot.dispose();
583
595
  }
@@ -585,3 +597,23 @@ export function runSession<Result>(
585
597
  engine.close();
586
598
  }
587
599
  }
600
+
601
+ /**
602
+ * Runs `visit` over the project {@link openSession} opens for each configuration, and answers
603
+ * in their order; a configuration the snapshot opens nothing for throws before any visit.
604
+ */
605
+ export function runSession<Result>(
606
+ engine: Engine,
607
+ configFiles: readonly string[],
608
+ visit: ProjectVisitor<Result>,
609
+ ): SessionResult<Result> {
610
+ return openSession(engine, configFiles, {}, (opened) => {
611
+ const unopened = configFiles.find(
612
+ (configFile) => !opened.views.some((view) => view.configFile === configFile),
613
+ );
614
+ if (unopened !== undefined) {
615
+ throw new Error(`${unopened} opened no project`);
616
+ }
617
+ return { projects: opened.views.map((view) => visit(view)), timing: engine.getTimingInfo() };
618
+ });
619
+ }
@@ -5,9 +5,10 @@
5
5
  */
6
6
 
7
7
  import type { SourceFile } from "@typescript/native/ast";
8
- import { commonDirectory, emittedFrom } from "./emit-map.ts";
8
+ import { commonDirectory, emittedFrom } from "./load/emit-map.ts";
9
9
  import { dirnamePath, joinPath, relativePath, resolvePath } from "./paths.ts";
10
10
  import type { ProjectView } from "./session.ts";
11
+ import { OUTPUT_EXTENSIONS } from "./extensions.ts";
11
12
 
12
13
  /** The one character a subpath pattern of a manifest's `exports` holds. */
13
14
  const SUBPATH_WILDCARD = "*";
@@ -15,9 +16,6 @@ const SUBPATH_WILDCARD = "*";
15
16
  /** The extension a source file's name drops when the project writes it out. */
16
17
  const SOURCE_EXTENSION = /\.[cm]?[jt]sx?$/u;
17
18
 
18
- /** The extensions the project may write a source file's output under. */
19
- const OUTPUT_EXTENSIONS = [".js", ".mjs", ".cjs", ".jsx", ".d.ts", ".d.mts", ".d.cts"] as const;
20
-
21
19
  /**
22
20
  * Whether one path is what a subpath pattern stands for: the text before the
23
21
  * wildcard, any run of characters including the solidus, then the text after it.
@@ -90,13 +88,10 @@ function layoutOf<Brand>(
90
88
  }
91
89
 
92
90
  /**
93
- * The lookups over one project's own files.
94
- *
95
- * A path that names an emitted file is read back to the source the project would
96
- * emit it from through the project's own emit mapping and nothing else: the
97
- * extension is one the compiler emits from a source extension, and a path below the
98
- * output directory is read below the directory the compiler emits from, which the
99
- * configuration declares or which is the directory every input file shares.
91
+ * The lookups over one project's own files. A path naming an emitted file is read back to its
92
+ * source through the project's own emit mapping alone: the extension is one the compiler emits
93
+ * from a source extension, and a path below the output directory is read below the directory
94
+ * the compiler emits from, which the configuration declares or every input file shares.
100
95
  */
101
96
  export function sourceFilesOf<Brand>(project: ProjectView<Brand>, targetRoot: string): SourceFiles {
102
97
  const byName = new Map<string, SourceFile>();
package/src/stores.ts CHANGED
@@ -12,7 +12,9 @@ import {
12
12
  import { nodeKey, type Inventory } from "./inventory.ts";
13
13
  import type { Reference } from "./references.ts";
14
14
  import type { ProjectView } from "./session.ts";
15
- import type { Exemption, Mode } from "./sweep.ts";
15
+ import type { Exemption } from "./exempt.ts";
16
+ import type { Mode } from "./tests/file-class.ts";
17
+ import { classedAsTest, madeByTestCode, withheldBy } from "./tests/file-class.ts";
16
18
 
17
19
  /** One run's stores and reads, over every configuration. */
18
20
  export interface Stores {
@@ -39,6 +41,8 @@ export interface Stores {
39
41
  /** What one configuration contributes to the run's stores. */
40
42
  interface ConfigurationStores {
41
43
  readonly references: readonly Reference[];
44
+ /** The configuration's test-support files, whose references are test code's. */
45
+ readonly support: ReadonlySet<string>;
42
46
  readonly accessors: readonly string[];
43
47
  }
44
48
 
@@ -71,12 +75,20 @@ export function storesOf(
71
75
  ): Stores {
72
76
  return {
73
77
  references: per.flatMap((one) =>
74
- one.references.filter((reference) => !mode.production || !reference.test),
78
+ one.references.filter((reference) => !withheldBy(mode, reference, one.support)),
75
79
  ),
76
80
  readInTests: new Set(
77
81
  per.flatMap((one) =>
78
82
  one.references
79
- .filter((reference) => reference.test && reference.use !== "write")
83
+ .filter(
84
+ (reference) =>
85
+ reference.use !== "write" &&
86
+ classedAsTest(
87
+ madeByTestCode(reference, one.support),
88
+ reference.consumer !== undefined,
89
+ mode,
90
+ ),
91
+ )
80
92
  .map((reference) => reference.to),
81
93
  ),
82
94
  ),
@@ -5,18 +5,17 @@
5
5
  * ignore file by gaining a maintainer's reason.
6
6
  */
7
7
 
8
+ import { CODE } from "./contract/contract.generated.ts";
8
9
  import type { Host } from "./host.ts";
9
10
  import type { InventorySymbol } from "./inventory.ts";
11
+ import { readTargetDocument } from "./fs/document.ts";
10
12
  import { jsonChunks } from "./json-chunks.ts";
11
- import { joinPath } from "./paths.ts";
12
- import { positionAt, walkDocument } from "./json-document.ts";
13
+ import { isRecord, positionAt, readStrict, StrictJSONError } from "./json-document.ts";
13
14
  import type { Position } from "./position.ts";
14
15
  import { declarationKey } from "./ref.ts";
15
16
  import {
16
17
  CODE_FORM,
17
- SUPPRESSION_WITHOUT_REASON,
18
18
  SuppressionError,
19
- UNSCOPED_ENTRY,
20
19
  blankReason,
21
20
  isEntryPath,
22
21
  isPartKind,
@@ -27,6 +26,7 @@ import {
27
26
  type SuppressionRecord,
28
27
  type Suppressions,
29
28
  } from "./suppress.ts";
29
+ import { message } from "./product.ts";
30
30
 
31
31
  /** The name and the location the grammar fixes for the ignore file. */
32
32
  export const IGNORE_FILE = "deadset-ignore.json";
@@ -80,10 +80,6 @@ function documentSite(shape: Shape): Position {
80
80
  return { path: shape.file, line: 0, column: 0 };
81
81
  }
82
82
 
83
- function isObject(value: unknown): value is Record<string, unknown> {
84
- return typeof value === "object" && value !== null && !Array.isArray(value);
85
- }
86
-
87
83
  /** What one entry or row resolves to. */
88
84
  interface Read {
89
85
  readonly records: readonly SuppressionRecord[];
@@ -101,7 +97,7 @@ function readRecord(value: unknown, site: Position, byReference: ByReference, sh
101
97
  const refuse = (text: string, want: string): never => {
102
98
  throw new SuppressionError(shape.mechanism, siteText(site), text, want);
103
99
  };
104
- if (!isObject(value)) {
100
+ if (!isRecord(value)) {
105
101
  return refuse(JSON.stringify(value), shape.recordWant);
106
102
  }
107
103
  for (const [key, held] of Object.entries(value)) {
@@ -148,10 +144,10 @@ function readRecord(value: unknown, site: Position, byReference: ByReference, sh
148
144
  };
149
145
  const refusals: Refusal[] = [];
150
146
  if (blankReason(reason)) {
151
- refusals.push({ ...written, reported: SUPPRESSION_WITHOUT_REASON });
147
+ refusals.push({ ...written, reported: CODE.suppressionWithoutReason });
152
148
  }
153
149
  if (written.path === "") {
154
- refusals.push({ ...written, reported: UNSCOPED_ENTRY });
150
+ refusals.push({ ...written, reported: CODE.unscopedIgnoreEntry });
155
151
  }
156
152
  if (refusals.length > 0) {
157
153
  return { records: [], refusals };
@@ -189,30 +185,26 @@ function readDocument(
189
185
  symbols: readonly InventorySymbol[],
190
186
  shape: Shape,
191
187
  ): Suppressions {
192
- const file = joinPath(targetRoot, shape.file);
193
- if (host.kindOf(file) === "absent") {
188
+ const text = readTargetDocument(host, targetRoot, shape.file);
189
+ if (text === undefined) {
194
190
  return { records: [], refusals: [] };
195
191
  }
196
- const text = host.readFile(file);
197
192
  const malformed = (detail: string, site = documentSite(shape)): never => {
198
193
  throw new SuppressionError(shape.mechanism, siteText(site), detail, shape.documentWant);
199
194
  };
200
- let parsed: unknown;
195
+ let document;
201
196
  try {
202
- parsed = JSON.parse(text);
197
+ document = readStrict(text, shape.array);
203
198
  } catch (error: unknown) {
204
- return malformed(`${shape.file}: ${error instanceof Error ? error.message : String(error)}`);
199
+ if (!(error instanceof StrictJSONError)) {
200
+ throw error;
201
+ }
202
+ return malformed(error.message, positionAt(text, shape.file, error.offset));
205
203
  }
206
- if (!isObject(parsed)) {
204
+ const parsed = document.value;
205
+ if (!isRecord(parsed)) {
207
206
  return malformed(shape.file);
208
207
  }
209
- const walk = walkDocument(text, shape.array);
210
- if (walk.twice !== undefined) {
211
- malformed(
212
- `the member ${JSON.stringify(walk.twice.name)} is written twice, so neither value is chosen`,
213
- positionAt(text, shape.file, walk.twice.offset),
214
- );
215
- }
216
208
  for (const key of Object.keys(parsed)) {
217
209
  if (key !== "description" && key !== shape.array) {
218
210
  malformed(`the member ${JSON.stringify(key)} is not one the grammar declares`);
@@ -228,7 +220,7 @@ function readDocument(
228
220
  const records: SuppressionRecord[] = [];
229
221
  const refusals: Refusal[] = [];
230
222
  (held as readonly unknown[]).forEach((value, index) => {
231
- const offset = walk.starts[index];
223
+ const offset = document.starts.get(index);
232
224
  const site = offset === undefined ? documentSite(shape) : positionAt(text, shape.file, offset);
233
225
  const read = readRecord(value, site, byReference, shape);
234
226
  records.push(...read.records);
@@ -329,9 +321,9 @@ export function otherSchemeRows(text: string, own: string = OWN_SCHEME): readonl
329
321
  try {
330
322
  parsed = JSON.parse(text);
331
323
  } catch (error: unknown) {
332
- return refuse(error instanceof Error ? error.message : String(error));
324
+ return refuse(message(error));
333
325
  }
334
- const held = isObject(parsed) ? parsed[BASELINE_SHAPE.array] : undefined;
326
+ const held = isRecord(parsed) ? parsed[BASELINE_SHAPE.array] : undefined;
335
327
  if (!Array.isArray(held)) {
336
328
  return refuse(BASELINE_SHAPE.documentWant);
337
329
  }
@@ -339,7 +331,7 @@ export function otherSchemeRows(text: string, own: string = OWN_SCHEME): readonl
339
331
  try {
340
332
  readRecord(value, documentSite(BASELINE_SHAPE), new Map(), BASELINE_SHAPE);
341
333
  } catch (error: unknown) {
342
- return refuse(error instanceof Error ? error.message : String(error));
334
+ return refuse(message(error));
343
335
  }
344
336
  // readRecord has checked every member is a string and the code and symbol are present.
345
337
  const { code, symbol, path, reason } = value as Readonly<Record<string, string>>;
@@ -386,10 +378,9 @@ function* separatorsEscaped(pieces: Iterable<string>): Generator<string, void, u
386
378
  * A baseline holding one row per finding, in the order given, which is the report's, and
387
379
  * the other language's rows `kept`, Go's rows ahead of TypeScript's and each scheme's in
388
380
  * the order given, so two analyzers writing one document in either order write the same
389
- * bytes, in the form grammar/suppression.md fixes. Every recorded row carries the
390
- * provenance as its reason. A finding
391
- * missing a value a row needs, and an identity missing its name or version, are refused
392
- * rather than written, because the grammar requires a reason on every row.
381
+ * bytes, in the form grammar/suppression.md fixes. Every row carries the provenance as
382
+ * its reason, so a finding missing a value a row needs, or an identity missing its name
383
+ * or version, is refused rather than written.
393
384
  */
394
385
  export function writeBaseline(
395
386
  findings: readonly Recorded[],