@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
@@ -1,8 +1,18 @@
1
1
  import { API, SymbolFlags } from "@typescript/native/sync";
2
2
  import { componentLayer, mapperManifest } from "./component-layer.js";
3
- import { DiscoveryError } from "./discover.js";
4
3
  import { joinPath } from "./paths.js";
5
4
  import { queriesOf, UnansweredLog, } from "./query.js";
5
+ import { MANIFEST } from "./fs/manifest.js";
6
+ /** The most questions one round trip carries. */
7
+ const BATCH = 2048;
8
+ /** Asks one question of every item, in round trips of at most {@link BATCH}, answers in order. */
9
+ export function batched(engine, items, question) {
10
+ const answers = [];
11
+ for (let at = 0; at < items.length; at += BATCH) {
12
+ answers.push(...engine.batch(items.slice(at, at + BATCH).map(question)));
13
+ }
14
+ return answers;
15
+ }
6
16
  /**
7
17
  * Opens the compiler client the analysis reads through.
8
18
  *
@@ -16,7 +26,7 @@ export function openEngine(options) {
16
26
  if (components !== undefined && components.extensions.length > 0) {
17
27
  const made = components.host.temporaryDirectory();
18
28
  try {
19
- components.host.writeDocument(joinPath(made.path, "package.json"), [
29
+ components.host.writeDocument(joinPath(made.path, MANIFEST), [
20
30
  mapperManifest(components.host.componentMapperCommand()),
21
31
  ]);
22
32
  }
@@ -128,6 +138,9 @@ function viewOf(project, configFile, engine, log) {
128
138
  ownKeys ??= new Set(ownSourceFiles().map((file) => file.path));
129
139
  return ownKeys;
130
140
  },
141
+ resolvedFileNames: (specifiers) => batched(engine, specifiers, (node) => project.program.getResolvedModuleFromModuleSpecifier.gen(node, node.getSourceFile().fileName)).map((resolved) => resolved === undefined || resolved.resolvedFileName === ""
142
+ ? undefined
143
+ : resolved.resolvedFileName),
131
144
  handle: (node) => ({ node }),
132
145
  symbolsAt: (handles, cap) => queries.symbolsAt(handles.map(({ node }) => node), cap),
133
146
  resolvedSymbolAt: ({ node }) => queries.resolvedSymbol(node),
@@ -252,14 +265,13 @@ function projectsOf(snapshot, built, written) {
252
265
  return opened;
253
266
  }
254
267
  /**
255
- * Runs `visit` over every project the compiler configurations name, inside one never updated
256
- * snapshot of one client, and answers in their order. A configuration `programs` describes is
257
- * built as that program, or opened from the configuration it writes. One the snapshot holds
258
- * nothing for ends the run under `"refuse"` and is named in the result under `"record"`.
259
- * `first` runs over every opened project before the first visit and `last` after the last,
260
- * both while the client answers; the snapshot and the client are then released.
268
+ * Opens every project the compiler configurations name in one never updated snapshot of one
269
+ * client, and hands them to `use` while the client answers; the snapshot and the client are
270
+ * then released. A configuration `options.programs` describes is built as that program, or
271
+ * opened from the configuration it writes. One the snapshot holds nothing for has no view.
261
272
  */
262
- export function runSession(engine, configFiles, visit, unopened = "refuse", programs = new Map(), last = () => undefined, first = () => undefined) {
273
+ export function openSession(engine, configFiles, options, use) {
274
+ const programs = options.programs ?? new Map();
263
275
  try {
264
276
  const built = [];
265
277
  const params = [];
@@ -281,30 +293,13 @@ export function runSession(engine, configFiles, visit, unopened = "refuse", prog
281
293
  const opened = projectsOf(snapshot, built, written);
282
294
  const log = new UnansweredLog();
283
295
  const views = [];
284
- const missing = [];
285
296
  for (const configFile of configFiles) {
286
297
  const project = opened.get(configFile);
287
- if (project === undefined) {
288
- if (unopened === "refuse") {
289
- throw new DiscoveryError(`${configFile} opened no project`, []);
290
- }
291
- missing.push(configFile);
292
- continue;
298
+ if (project !== undefined) {
299
+ views.push(viewOf(project, configFile, engine, log));
293
300
  }
294
- views.push(viewOf(project, configFile, engine, log));
295
301
  }
296
- first(views.map((view) => ({
297
- configFile: view.configFile,
298
- fileNames: () => view.ownSourceFiles().map((file) => file.fileName),
299
- })));
300
- const projects = views.map((view) => visit(view));
301
- last();
302
- return {
303
- projects,
304
- unopened: missing,
305
- timing: engine.getTimingInfo(),
306
- unanswered: log.questions,
307
- };
302
+ return use({ views }, () => log.questions);
308
303
  }
309
304
  finally {
310
305
  snapshot.dispose();
@@ -314,3 +309,16 @@ export function runSession(engine, configFiles, visit, unopened = "refuse", prog
314
309
  engine.close();
315
310
  }
316
311
  }
312
+ /**
313
+ * Runs `visit` over the project {@link openSession} opens for each configuration, and answers
314
+ * in their order; a configuration the snapshot opens nothing for throws before any visit.
315
+ */
316
+ export function runSession(engine, configFiles, visit) {
317
+ return openSession(engine, configFiles, {}, (opened) => {
318
+ const unopened = configFiles.find((configFile) => !opened.views.some((view) => view.configFile === configFile));
319
+ if (unopened !== undefined) {
320
+ throw new Error(`${unopened} opened no project`);
321
+ }
322
+ return { projects: opened.views.map((view) => visit(view)), timing: engine.getTimingInfo() };
323
+ });
324
+ }
@@ -3,14 +3,13 @@
3
3
  * in a document or a string names one: as the file itself, or as a file the
4
4
  * compiler emits from it.
5
5
  */
6
- import { commonDirectory, emittedFrom } from "./emit-map.js";
6
+ import { commonDirectory, emittedFrom } from "./load/emit-map.js";
7
7
  import { dirnamePath, joinPath, relativePath, resolvePath } from "./paths.js";
8
+ import { OUTPUT_EXTENSIONS } from "./extensions.js";
8
9
  /** The one character a subpath pattern of a manifest's `exports` holds. */
9
10
  const SUBPATH_WILDCARD = "*";
10
11
  /** The extension a source file's name drops when the project writes it out. */
11
12
  const SOURCE_EXTENSION = /\.[cm]?[jt]sx?$/u;
12
- /** The extensions the project may write a source file's output under. */
13
- const OUTPUT_EXTENSIONS = [".js", ".mjs", ".cjs", ".jsx", ".d.ts", ".d.mts", ".d.cts"];
14
13
  /**
15
14
  * Whether one path is what a subpath pattern stands for: the text before the
16
15
  * wildcard, any run of characters including the solidus, then the text after it.
@@ -43,13 +42,10 @@ function layoutOf(project, fileNames) {
43
42
  };
44
43
  }
45
44
  /**
46
- * The lookups over one project's own files.
47
- *
48
- * A path that names an emitted file is read back to the source the project would
49
- * emit it from through the project's own emit mapping and nothing else: the
50
- * extension is one the compiler emits from a source extension, and a path below the
51
- * output directory is read below the directory the compiler emits from, which the
52
- * configuration declares or which is the directory every input file shares.
45
+ * The lookups over one project's own files. A path naming an emitted file is read back to its
46
+ * source through the project's own emit mapping alone: the extension is one the compiler emits
47
+ * from a source extension, and a path below the output directory is read below the directory
48
+ * the compiler emits from, which the configuration declares or every input file shares.
53
49
  */
54
50
  export function sourceFilesOf(project, targetRoot) {
55
51
  const byName = new Map();
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { isGetAccessorDeclaration, isSetAccessorDeclaration, } from "@typescript/native/ast";
7
7
  import { nodeKey } from "./inventory.js";
8
+ import { classedAsTest, madeByTestCode, withheldBy } from "./tests/file-class.js";
8
9
  /** The class members one project's own files declare by a getter or a setter. */
9
10
  export function accessorsOf(project, held) {
10
11
  const found = [];
@@ -25,9 +26,10 @@ export function accessorsOf(project, held) {
25
26
  /** The run's stores, from what each configuration contributed, the records and the mode. */
26
27
  export function storesOf(per, exempt, mode) {
27
28
  return {
28
- references: per.flatMap((one) => one.references.filter((reference) => !mode.production || !reference.test)),
29
+ references: per.flatMap((one) => one.references.filter((reference) => !withheldBy(mode, reference, one.support))),
29
30
  readInTests: new Set(per.flatMap((one) => one.references
30
- .filter((reference) => reference.test && reference.use !== "write")
31
+ .filter((reference) => reference.use !== "write" &&
32
+ classedAsTest(madeByTestCode(reference, one.support), reference.consumer !== undefined, mode))
31
33
  .map((reference) => reference.to))),
32
34
  accessors: new Set(per.flatMap((one) => one.accessors)),
33
35
  exempt: new Set(exempt.map((record) => record.id)),
@@ -4,11 +4,13 @@
4
4
  * one record shape, so one decoder and one matcher serve both, and a row moves into the
5
5
  * ignore file by gaining a maintainer's reason.
6
6
  */
7
+ import { CODE } from "./contract/contract.generated.js";
8
+ import { readTargetDocument } from "./fs/document.js";
7
9
  import { jsonChunks } from "./json-chunks.js";
8
- import { joinPath } from "./paths.js";
9
- import { positionAt, walkDocument } from "./json-document.js";
10
+ import { isRecord, positionAt, readStrict, StrictJSONError } from "./json-document.js";
10
11
  import { declarationKey } from "./ref.js";
11
- import { CODE_FORM, SUPPRESSION_WITHOUT_REASON, SuppressionError, UNSCOPED_ENTRY, blankReason, isEntryPath, isPartKind, isSymbolRef, siteText, } from "./suppress.js";
12
+ import { CODE_FORM, SuppressionError, blankReason, isEntryPath, isPartKind, isSymbolRef, siteText, } from "./suppress.js";
13
+ import { message } from "./product.js";
12
14
  /** The name and the location the grammar fixes for the ignore file. */
13
15
  export const IGNORE_FILE = "deadset-ignore.json";
14
16
  /** The name and the location the grammar fixes for the baseline. */
@@ -42,9 +44,6 @@ const PATH_WANT = "a path relative to the target root, with the solidus as separ
42
44
  function documentSite(shape) {
43
45
  return { path: shape.file, line: 0, column: 0 };
44
46
  }
45
- function isObject(value) {
46
- return typeof value === "object" && value !== null && !Array.isArray(value);
47
- }
48
47
  /**
49
48
  * Reads one entry or row: the records it binds, the refusals it carries, or the
50
49
  * malformed value that ends the run.
@@ -53,7 +52,7 @@ function readRecord(value, site, byReference, shape) {
53
52
  const refuse = (text, want) => {
54
53
  throw new SuppressionError(shape.mechanism, siteText(site), text, want);
55
54
  };
56
- if (!isObject(value)) {
55
+ if (!isRecord(value)) {
57
56
  return refuse(JSON.stringify(value), shape.recordWant);
58
57
  }
59
58
  for (const [key, held] of Object.entries(value)) {
@@ -99,10 +98,10 @@ function readRecord(value, site, byReference, shape) {
99
98
  };
100
99
  const refusals = [];
101
100
  if (blankReason(reason)) {
102
- refusals.push({ ...written, reported: SUPPRESSION_WITHOUT_REASON });
101
+ refusals.push({ ...written, reported: CODE.suppressionWithoutReason });
103
102
  }
104
103
  if (written.path === "") {
105
- refusals.push({ ...written, reported: UNSCOPED_ENTRY });
104
+ refusals.push({ ...written, reported: CODE.unscopedIgnoreEntry });
106
105
  }
107
106
  if (refusals.length > 0) {
108
107
  return { records: [], refusals };
@@ -131,28 +130,27 @@ function byReferenceOf(symbols) {
131
130
  }
132
131
  /** Reads one document at the target root, binding each record against the run's declarations. */
133
132
  function readDocument(host, targetRoot, symbols, shape) {
134
- const file = joinPath(targetRoot, shape.file);
135
- if (host.kindOf(file) === "absent") {
133
+ const text = readTargetDocument(host, targetRoot, shape.file);
134
+ if (text === undefined) {
136
135
  return { records: [], refusals: [] };
137
136
  }
138
- const text = host.readFile(file);
139
137
  const malformed = (detail, site = documentSite(shape)) => {
140
138
  throw new SuppressionError(shape.mechanism, siteText(site), detail, shape.documentWant);
141
139
  };
142
- let parsed;
140
+ let document;
143
141
  try {
144
- parsed = JSON.parse(text);
142
+ document = readStrict(text, shape.array);
145
143
  }
146
144
  catch (error) {
147
- return malformed(`${shape.file}: ${error instanceof Error ? error.message : String(error)}`);
145
+ if (!(error instanceof StrictJSONError)) {
146
+ throw error;
147
+ }
148
+ return malformed(error.message, positionAt(text, shape.file, error.offset));
148
149
  }
149
- if (!isObject(parsed)) {
150
+ const parsed = document.value;
151
+ if (!isRecord(parsed)) {
150
152
  return malformed(shape.file);
151
153
  }
152
- const walk = walkDocument(text, shape.array);
153
- if (walk.twice !== undefined) {
154
- malformed(`the member ${JSON.stringify(walk.twice.name)} is written twice, so neither value is chosen`, positionAt(text, shape.file, walk.twice.offset));
155
- }
156
154
  for (const key of Object.keys(parsed)) {
157
155
  if (key !== "description" && key !== shape.array) {
158
156
  malformed(`the member ${JSON.stringify(key)} is not one the grammar declares`);
@@ -167,7 +165,7 @@ function readDocument(host, targetRoot, symbols, shape) {
167
165
  const records = [];
168
166
  const refusals = [];
169
167
  held.forEach((value, index) => {
170
- const offset = walk.starts[index];
168
+ const offset = document.starts.get(index);
171
169
  const site = offset === undefined ? documentSite(shape) : positionAt(text, shape.file, offset);
172
170
  const read = readRecord(value, site, byReference, shape);
173
171
  records.push(...read.records);
@@ -227,9 +225,9 @@ export function otherSchemeRows(text, own = OWN_SCHEME) {
227
225
  parsed = JSON.parse(text);
228
226
  }
229
227
  catch (error) {
230
- return refuse(error instanceof Error ? error.message : String(error));
228
+ return refuse(message(error));
231
229
  }
232
- const held = isObject(parsed) ? parsed[BASELINE_SHAPE.array] : undefined;
230
+ const held = isRecord(parsed) ? parsed[BASELINE_SHAPE.array] : undefined;
233
231
  if (!Array.isArray(held)) {
234
232
  return refuse(BASELINE_SHAPE.documentWant);
235
233
  }
@@ -238,7 +236,7 @@ export function otherSchemeRows(text, own = OWN_SCHEME) {
238
236
  readRecord(value, documentSite(BASELINE_SHAPE), new Map(), BASELINE_SHAPE);
239
237
  }
240
238
  catch (error) {
241
- return refuse(error instanceof Error ? error.message : String(error));
239
+ return refuse(message(error));
242
240
  }
243
241
  // readRecord has checked every member is a string and the code and symbol are present.
244
242
  const { code, symbol, path, reason } = value;
@@ -279,10 +277,9 @@ function* separatorsEscaped(pieces) {
279
277
  * A baseline holding one row per finding, in the order given, which is the report's, and
280
278
  * the other language's rows `kept`, Go's rows ahead of TypeScript's and each scheme's in
281
279
  * the order given, so two analyzers writing one document in either order write the same
282
- * bytes, in the form grammar/suppression.md fixes. Every recorded row carries the
283
- * provenance as its reason. A finding
284
- * missing a value a row needs, and an identity missing its name or version, are refused
285
- * rather than written, because the grammar requires a reason on every row.
280
+ * bytes, in the form grammar/suppression.md fixes. Every row carries the provenance as
281
+ * its reason, so a finding missing a value a row needs, or an identity missing its name
282
+ * or version, is refused rather than written.
286
283
  */
287
284
  export function writeBaseline(findings, provenance, kept = []) {
288
285
  if (provenance.analyzer === "" || provenance.version === "") {
@@ -3,13 +3,14 @@
3
3
  * one or more codes and a reason, and binding to every declaration that begins on the line
4
4
  * below it, or on its own line where it trails a token there.
5
5
  */
6
- import { isConstructorDeclaration, SyntaxKind, } from "@typescript/native/ast";
6
+ import { CODE } from "./contract/contract.generated.js";
7
+ import { SyntaxKind } from "@typescript/native/ast";
7
8
  import { importBindings } from "./import-bindings.js";
8
- import { isParameterProperty, nodeKey } from "./inventory.js";
9
- import { byPosition, positionKey, renderPosition } from "./position.js";
9
+ import { nodeKey } from "./inventory.js";
10
+ import { relativePath } from "./paths.js";
11
+ import { byPosition, lineEnd, positionKey, renderPosition, startLine, tokenStart, } from "./position.js";
10
12
  import { importRef } from "./ref.js";
11
- import { signatureOf } from "./signatures.js";
12
- import { isPartKind, SUPPRESSION_WITHOUT_REASON, SuppressionError, siteText, } from "./suppress.js";
13
+ import { isPartKind, SuppressionError, siteText, } from "./suppress.js";
13
14
  /**
14
15
  * The three expressions the grammar applies to the text of each line comment, in this
15
16
  * order: a comment in the namespace, a well-formed directive, and a directive that lacks
@@ -54,43 +55,6 @@ const LITERALS = new Set([
54
55
  SyntaxKind.RegularExpressionLiteral,
55
56
  SyntaxKind.JsxText,
56
57
  ]);
57
- /** Whether one character ends a line, under the language's line terminators. */
58
- function endsLine(char) {
59
- return char === "\n" || char === "\r" || char === "\u2028" || char === "\u2029";
60
- }
61
- /** The offset where the line holding `from` ends. */
62
- function lineEnd(text, from) {
63
- let at = from;
64
- while (at < text.length && !endsLine(text[at])) {
65
- at += 1;
66
- }
67
- return at;
68
- }
69
- /**
70
- * The offset of the first token at or after `from`: whitespace, comments and a leading
71
- * hashbang are trivia.
72
- */
73
- export function tokenStart(text, from) {
74
- let at = from;
75
- if (at === 0 && text.startsWith("#!")) {
76
- at = lineEnd(text, 0);
77
- }
78
- for (;;) {
79
- if (/\s/u.test(text[at] ?? "")) {
80
- at += 1;
81
- }
82
- else if (text.startsWith("//", at)) {
83
- at = lineEnd(text, at);
84
- }
85
- else if (text.startsWith("/*", at)) {
86
- const close = text.indexOf("*/", at + 2);
87
- at = close < 0 ? text.length : close + 2;
88
- }
89
- else {
90
- return at;
91
- }
92
- }
93
- }
94
58
  /**
95
59
  * Every `//` line comment of one file, in file order. The text between tokens is read as
96
60
  * the language reads it: a block comment holds no line comment, and the literal tokens the
@@ -139,55 +103,42 @@ function lineComments(file) {
139
103
  function bindingKey(one) {
140
104
  return `${one.declared?.id ?? ""}\u0000${one.part.id}`;
141
105
  }
106
+ /** The placed declarations of a project by the path of the file each is in. */
107
+ function placedByPath(held, symbols) {
108
+ const byPath = new Map();
109
+ for (const [id, placed] of held.placement) {
110
+ const one = symbols.get(id);
111
+ const holder = symbols.get(placed.holder);
112
+ if (one === undefined || holder === undefined) {
113
+ continue;
114
+ }
115
+ const at = byPath.get(one.position.path) ?? [];
116
+ at.push({ one, holder, startLines: placed.startLines, partLines: placed.partLines });
117
+ byPath.set(one.position.path, at);
118
+ }
119
+ return byPath;
120
+ }
142
121
  /**
143
- * The declarations of one file by the line each begins on, the line of its first token: a
144
- * decorator, a modifier or the keyword. A variable's first token is its statement's
145
- * keyword, and a variable written on a later line of the statement also begins there. A
146
- * function also begins, for a directive, on the line of each of its parameters, and a
147
- * class, for a part kind, on the lines of its constructor and its constructor's parameters.
122
+ * The declarations of one file by the line a directive binds each on, as the inventory
123
+ * places them, and each import binding of the file on its statement's lines.
148
124
  */
149
- function declarationLines(file, held, symbols, targetRoot) {
125
+ function declarationLines(file, placed, held, targetRoot) {
150
126
  const below = new Map();
151
- const add = (offset, one) => {
152
- const line = file.getLineAndCharacterOfPosition(tokenStart(file.text, offset)).line + 1;
127
+ const add = (line, one) => {
153
128
  const at = below.get(line) ?? [];
154
129
  if (!at.some((known) => bindingKey(known) === bindingKey(one))) {
155
130
  at.push(one);
156
131
  }
157
132
  below.set(line, at);
158
133
  };
159
- const declaredAt = (node) => {
160
- const id = held.declarations.get(nodeKey(file, node));
161
- return id === undefined ? undefined : symbols.get(id);
162
- };
163
- const visit = (node) => {
164
- const one = declaredAt(node);
165
- const owner = isConstructorDeclaration(node) ? declaredAt(node.parent) : undefined;
166
- if (owner !== undefined && isConstructorDeclaration(node)) {
167
- for (const at of [node, ...node.parameters.filter((one) => !isParameterProperty(one))]) {
168
- add(at.pos, { declared: undefined, part: owner });
169
- }
170
- }
171
- const holder = one !== undefined && isParameterProperty(node) ? declaredAt(node.parent.parent) : one;
172
- if (one !== undefined && holder !== undefined) {
173
- add(node.pos, { declared: one, part: holder });
134
+ for (const { one, holder, startLines, partLines } of placed) {
135
+ for (const line of startLines) {
136
+ add(line, { declared: one, part: holder });
174
137
  }
175
- if (one !== undefined) {
176
- // A parameter on a later line of a wrapped signature takes its directive on the
177
- // line above it, inside the parameter list, and the directive binds the function.
178
- for (const parameter of signatureOf(node)?.parameters ?? []) {
179
- add(parameter.pos, { declared: one, part: one });
180
- }
181
- const list = node.parent;
182
- if (node.kind === SyntaxKind.VariableDeclaration &&
183
- list.kind === SyntaxKind.VariableDeclarationList &&
184
- list.parent.kind === SyntaxKind.VariableStatement) {
185
- add(list.parent.pos, { declared: one, part: one });
186
- }
138
+ for (const line of partLines) {
139
+ add(line, { declared: undefined, part: one });
187
140
  }
188
- node.forEachChild(visit);
189
- };
190
- file.forEachChild(visit);
141
+ }
191
142
  // An import binding is a subject of its own, bound on its line as a declaration is.
192
143
  const fileId = held.declarations.get(nodeKey(file, file));
193
144
  const moduleRef = held.symbols.find((symbol) => symbol.id === fileId)?.ref ?? "";
@@ -199,7 +150,7 @@ function declarationLines(file, held, symbols, targetRoot) {
199
150
  statement = statement.parent;
200
151
  }
201
152
  for (const at of [statement.pos, name.getStart()]) {
202
- add(at, { declared: one, part: one });
153
+ add(startLine(file, at), { declared: one, part: one });
203
154
  }
204
155
  }
205
156
  return below;
@@ -220,13 +171,15 @@ export function inlineDirectives(project, held, targetRoot) {
220
171
  const symbols = new Map(held.symbols
221
172
  .filter((symbol) => symbol.kind !== "file")
222
173
  .map((symbol) => [symbol.id, { id: symbol.id, ref: symbol.ref, position: symbol.position }]));
174
+ const placed = placedByPath(held, symbols);
223
175
  const found = [];
224
176
  for (const file of project.ownSourceFiles()) {
225
177
  const comments = lineComments(file).filter((comment) => CANDIDATE.test(comment.text));
226
178
  if (comments.length === 0) {
227
179
  continue;
228
180
  }
229
- const below = declarationLines(file, held, symbols, targetRoot);
181
+ const path = relativePath(targetRoot, file.fileName) ?? "";
182
+ const below = declarationLines(file, placed.get(path) ?? [], held, targetRoot);
230
183
  for (const comment of comments) {
231
184
  const site = renderPosition(file, targetRoot, comment.offset);
232
185
  const target = trails(file, comment.offset) ? site.line : site.line + 1;
@@ -274,7 +227,7 @@ export function inlineSuppressions(perProject) {
274
227
  case "no-reason":
275
228
  for (const code of directive.codes) {
276
229
  refusals.push({
277
- reported: SUPPRESSION_WITHOUT_REASON,
230
+ reported: CODE.suppressionWithoutReason,
278
231
  code,
279
232
  symbol: "",
280
233
  path: site.path,