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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +35 -9
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +274 -496
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/commands/held.js +499 -0
  12. package/dist/src/commands/read.js +161 -0
  13. package/dist/src/commands/shell.js +169 -0
  14. package/dist/src/commands/tools.js +1847 -0
  15. package/dist/src/component-files.js +3 -2
  16. package/dist/src/component-layer.js +4 -2
  17. package/dist/src/config.js +6 -82
  18. package/dist/src/conformance-record.js +2 -2
  19. package/dist/src/consumers.js +10 -38
  20. package/dist/src/contextual-uses.js +57 -26
  21. package/dist/src/contract/config.generated.js +561 -0
  22. package/dist/src/contract/contract.generated.js +1370 -0
  23. package/dist/src/contract/report.generated.js +866 -0
  24. package/dist/src/dependencies.js +165 -122
  25. package/dist/src/destructuring.js +1 -19
  26. package/dist/src/edges.js +38 -122
  27. package/dist/src/element-access.js +181 -168
  28. package/dist/src/entries/build-scripts.js +222 -0
  29. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  30. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  31. package/dist/src/entries/conventions.js +740 -0
  32. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  33. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  34. package/dist/src/entries/run-directories.js +77 -0
  35. package/dist/src/entries/sources.js +144 -0
  36. package/dist/src/entries/static-module.js +670 -0
  37. package/dist/src/entries/test-runners.js +650 -0
  38. package/dist/src/entries/workflow-steps.js +345 -0
  39. package/dist/src/exemptions/argument-places.js +131 -0
  40. package/dist/src/exemptions/calls.js +338 -0
  41. package/dist/src/exemptions/classes.js +13 -0
  42. package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
  43. package/dist/src/exemptions/detectors.js +48 -0
  44. package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
  45. package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
  46. package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
  47. package/dist/src/exemptions/generated-file.js +241 -0
  48. package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
  49. package/dist/src/exemptions/installed-globals.js +173 -0
  50. package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
  51. package/dist/src/exemptions/lifecycle.js +150 -0
  52. package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
  53. package/dist/src/exemptions/serialization-contract.js +1276 -0
  54. package/dist/src/exemptions/sites.js +182 -0
  55. package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
  56. package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
  57. package/dist/src/exposure.js +400 -0
  58. package/dist/src/extensions.js +37 -0
  59. package/dist/src/facts.js +38 -0
  60. package/dist/src/failure.js +36 -0
  61. package/dist/src/file-facts.js +3 -26
  62. package/dist/src/findings/completion.js +109 -56
  63. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  64. package/dist/src/findings/emitters.js +27 -41
  65. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  66. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  67. package/dist/src/findings/interfaces.js +4 -5
  68. package/dist/src/findings/intra-function.js +16 -13
  69. package/dist/src/findings/non-code-artifacts.js +17 -12
  70. package/dist/src/findings/reads-and-writes.js +86 -27
  71. package/dist/src/findings/self-check.js +44 -30
  72. package/dist/src/findings/unused-declarations.js +29 -45
  73. package/dist/src/findings/visibility-narrowing.js +23 -31
  74. package/dist/src/findings-pass.js +13 -21
  75. package/dist/src/fs/document.js +52 -0
  76. package/dist/src/fs/manifest.js +67 -0
  77. package/dist/src/fs/tree.js +88 -0
  78. package/dist/src/git-ignore.js +39 -26
  79. package/dist/src/import-bindings.js +73 -28
  80. package/dist/src/index/sites.js +557 -0
  81. package/dist/src/index/values.js +124 -0
  82. package/dist/src/index.js +2 -2
  83. package/dist/src/indexed-access.js +523 -478
  84. package/dist/src/intra-function-parts.js +63 -43
  85. package/dist/src/inventory/commonjs.js +507 -0
  86. package/dist/src/inventory/enumerate.js +167 -0
  87. package/dist/src/inventory/syntax.js +236 -0
  88. package/dist/src/inventory.js +323 -724
  89. package/dist/src/javascript-file.js +48 -0
  90. package/dist/src/json-document.js +198 -67
  91. package/dist/src/keyof-comparisons.js +126 -107
  92. package/dist/src/kinds.js +3 -366
  93. package/dist/src/{components.js → liveness/components.js} +2 -3
  94. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  95. package/dist/src/liveness/matrix.js +99 -0
  96. package/dist/src/liveness/sweep.js +558 -0
  97. package/dist/src/load/classify.js +289 -0
  98. package/dist/src/load/diagnostics.js +87 -0
  99. package/dist/src/load/discover.js +285 -0
  100. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  101. package/dist/src/load/expected-module.js +136 -0
  102. package/dist/src/load/load.js +27 -0
  103. package/dist/src/load/module-lookup.js +37 -0
  104. package/dist/src/load/package-scope.js +56 -0
  105. package/dist/src/load/plan.js +313 -0
  106. package/dist/src/load/specifiers.js +113 -0
  107. package/dist/src/load/synthesize.js +152 -0
  108. package/dist/src/load/test-globals.js +207 -0
  109. package/dist/src/load/test-joins.js +82 -0
  110. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  111. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  112. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  113. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  114. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  115. package/dist/src/module-declarations.js +70 -85
  116. package/dist/src/overrides.js +134 -112
  117. package/dist/src/partial.js +2 -1
  118. package/dist/src/paths.js +82 -16
  119. package/dist/src/platform-calls.js +78 -0
  120. package/dist/src/platform-symbols.js +134 -0
  121. package/dist/src/position.js +43 -1
  122. package/dist/src/print.js +11 -79
  123. package/dist/src/product.js +13 -0
  124. package/dist/src/query.js +95 -0
  125. package/dist/src/ref.js +12 -20
  126. package/dist/src/references/read-rule.js +1 -0
  127. package/dist/src/references/read-rules.js +48 -0
  128. package/dist/src/references/sink.js +237 -0
  129. package/dist/src/references/sources.js +450 -0
  130. package/dist/src/references.js +117 -1074
  131. package/dist/src/report-schema.js +51 -0
  132. package/dist/src/report.js +57 -41
  133. package/dist/src/reporters/annotations.js +15 -8
  134. package/dist/src/reporters/sarif.js +16 -10
  135. package/dist/src/reporters/template.js +4 -19
  136. package/dist/src/resolve.js +246 -730
  137. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  138. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  139. package/dist/src/roots/manifest.js +216 -0
  140. package/dist/src/roots/published-reach.js +412 -0
  141. package/dist/src/roots/root-set.js +487 -0
  142. package/dist/src/roots/unseen-loads.js +236 -0
  143. package/dist/src/run.js +66 -77
  144. package/dist/src/schema.js +320 -343
  145. package/dist/src/scope.js +38 -115
  146. package/dist/src/session.js +37 -29
  147. package/dist/src/source-files.js +6 -10
  148. package/dist/src/stores.js +4 -2
  149. package/dist/src/suppress-file.js +25 -28
  150. package/dist/src/suppress-inline.js +36 -83
  151. package/dist/src/suppress.js +50 -71
  152. package/dist/src/symbol-keys.js +92 -88
  153. package/dist/src/tests/file-class.js +76 -0
  154. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  155. package/dist/src/{test-support.js → tests/support.js} +5 -12
  156. package/dist/src/text/compare.js +26 -0
  157. package/dist/src/text/glob.js +194 -0
  158. package/dist/src/text/named-files.js +298 -0
  159. package/dist/src/text/yaml.js +684 -0
  160. package/dist/src/type-errors.js +11 -232
  161. package/dist/src/type-parameter-reads.js +178 -139
  162. package/dist/src/unimplemented-callees.js +262 -242
  163. package/dist/src/unwrap.js +23 -0
  164. package/dist/src/usage.js +10 -0
  165. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  166. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  167. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  168. package/dist/src/vendor/unbash/assignment.js +131 -0
  169. package/dist/src/vendor/unbash/chars.js +48 -0
  170. package/dist/src/vendor/unbash/command.js +41 -0
  171. package/dist/src/vendor/unbash/expansion.js +80 -0
  172. package/dist/src/vendor/unbash/glob.js +268 -0
  173. package/dist/src/vendor/unbash/heredoc.js +27 -0
  174. package/dist/src/vendor/unbash/internal-types.js +1 -0
  175. package/dist/src/vendor/unbash/lexer.js +4274 -0
  176. package/dist/src/vendor/unbash/limits.js +3 -0
  177. package/dist/src/vendor/unbash/parser.js +1366 -0
  178. package/dist/src/vendor/unbash/parts.js +57 -0
  179. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  180. package/dist/src/vendor/unbash/traversal.js +212 -0
  181. package/dist/src/vendor/unbash/types.js +1 -0
  182. package/dist/src/vendor/unbash/word-value.js +61 -0
  183. package/dist/src/vendor/unbash/word.js +40 -0
  184. package/dist/src/verbs/analyze.js +194 -127
  185. package/dist/src/verbs/describe.js +13 -18
  186. package/dist/src/verbs/explain.js +85 -139
  187. package/dist/src/verbs/print-config.js +2 -1
  188. package/dist/src/verbs/print-projects.js +6 -4
  189. package/dist/src/verbs/print-retained.js +30 -6
  190. package/dist/src/verbs/print-roots.js +4 -2
  191. package/dist/src/verbs/verb.js +1 -5
  192. package/dist/src/verbs/version.js +14 -3
  193. package/jsr.json +2 -1
  194. package/package.json +14 -8
  195. package/src/alias-chain.ts +40 -11
  196. package/src/amd.ts +130 -0
  197. package/src/analysis.ts +426 -733
  198. package/src/augmentations.ts +93 -4
  199. package/src/automatic-types.ts +12 -30
  200. package/src/bindings.ts +460 -0
  201. package/src/commands/held.ts +632 -0
  202. package/src/commands/read.ts +242 -0
  203. package/src/commands/shell.ts +228 -0
  204. package/src/commands/tools.ts +2382 -0
  205. package/src/component-files.ts +4 -2
  206. package/src/component-layer.ts +4 -2
  207. package/src/config.ts +31 -302
  208. package/src/conformance-record.ts +2 -2
  209. package/src/consumers.ts +16 -66
  210. package/src/contextual-uses.ts +66 -34
  211. package/src/contract/config.generated.ts +821 -0
  212. package/src/contract/contract.generated.ts +1453 -0
  213. package/src/contract/report.generated.ts +1241 -0
  214. package/src/dependencies.ts +223 -128
  215. package/src/destructuring.ts +1 -31
  216. package/src/edges.ts +41 -140
  217. package/src/element-access.ts +190 -187
  218. package/src/entries/build-scripts.ts +292 -0
  219. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  220. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  221. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  222. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  223. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  224. package/src/entries/run-directories.ts +108 -0
  225. package/src/entries/sources.ts +266 -0
  226. package/src/entries/static-module.ts +858 -0
  227. package/src/entries/test-runners.ts +835 -0
  228. package/src/entries/workflow-steps.ts +432 -0
  229. package/src/exemptions/argument-places.ts +198 -0
  230. package/src/exemptions/calls.ts +483 -0
  231. package/src/exemptions/classes.ts +49 -0
  232. package/src/exemptions/decorator.ts +56 -0
  233. package/src/exemptions/detectors.ts +75 -0
  234. package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
  235. package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
  236. package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
  237. package/src/exemptions/generated-file.ts +318 -0
  238. package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
  239. package/src/exemptions/installed-globals.ts +255 -0
  240. package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
  241. package/src/exemptions/lifecycle.ts +286 -0
  242. package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
  243. package/src/exemptions/serialization-contract.ts +1729 -0
  244. package/src/exemptions/sites.ts +293 -0
  245. package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
  246. package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
  247. package/src/exposure.ts +492 -0
  248. package/src/extensions.ts +45 -0
  249. package/src/facts.ts +46 -0
  250. package/src/failure.ts +63 -0
  251. package/src/file-facts.ts +15 -25
  252. package/src/finding.ts +10 -10
  253. package/src/findings/boundary.ts +11 -0
  254. package/src/findings/completion.ts +133 -64
  255. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  256. package/src/findings/emitter.ts +9 -10
  257. package/src/findings/emitters.ts +38 -52
  258. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  259. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  260. package/src/findings/interfaces.ts +7 -9
  261. package/src/findings/intra-function.ts +16 -14
  262. package/src/findings/non-code-artifacts.ts +24 -15
  263. package/src/findings/reads-and-writes.ts +118 -41
  264. package/src/findings/self-check.ts +51 -38
  265. package/src/findings/unused-declarations.ts +31 -49
  266. package/src/findings/visibility-narrowing.ts +36 -40
  267. package/src/findings-pass.ts +15 -31
  268. package/src/fs/document.ts +70 -0
  269. package/src/fs/manifest.ts +96 -0
  270. package/src/fs/tree.ts +110 -0
  271. package/src/git-ignore.ts +50 -26
  272. package/src/host.ts +12 -5
  273. package/src/import-bindings.ts +98 -29
  274. package/src/index/sites.ts +781 -0
  275. package/src/index/values.ts +170 -0
  276. package/src/index.ts +2 -2
  277. package/src/indexed-access.ts +570 -527
  278. package/src/intra-function-parts.ts +73 -44
  279. package/src/inventory/commonjs.ts +696 -0
  280. package/src/inventory/enumerate.ts +203 -0
  281. package/src/inventory/syntax.ts +311 -0
  282. package/src/inventory.ts +442 -895
  283. package/src/javascript-file.ts +54 -0
  284. package/src/json-document.ts +241 -76
  285. package/src/keyof-comparisons.ts +133 -122
  286. package/src/kinds.ts +5 -413
  287. package/src/{components.ts → liveness/components.ts} +4 -6
  288. package/src/{graph.ts → liveness/graph.ts} +100 -35
  289. package/src/liveness/matrix.ts +162 -0
  290. package/src/liveness/sweep.ts +855 -0
  291. package/src/load/classify.ts +433 -0
  292. package/src/load/diagnostics.ts +154 -0
  293. package/src/load/discover.ts +471 -0
  294. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  295. package/src/load/expected-module.ts +194 -0
  296. package/src/load/load.ts +73 -0
  297. package/src/load/module-lookup.ts +50 -0
  298. package/src/load/package-scope.ts +74 -0
  299. package/src/load/plan.ts +513 -0
  300. package/src/load/specifiers.ts +171 -0
  301. package/src/load/synthesize.ts +230 -0
  302. package/src/load/test-globals.ts +251 -0
  303. package/src/load/test-joins.ts +98 -0
  304. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  305. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  306. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  307. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  308. package/src/{workspace.ts → load/workspace.ts} +90 -134
  309. package/src/module-declarations.ts +74 -98
  310. package/src/overrides.ts +162 -134
  311. package/src/partial.ts +3 -2
  312. package/src/paths.ts +92 -16
  313. package/src/platform-calls.ts +119 -0
  314. package/src/platform-symbols.ts +189 -0
  315. package/src/position.ts +44 -1
  316. package/src/print.ts +12 -92
  317. package/src/product.ts +18 -0
  318. package/src/query.ts +201 -10
  319. package/src/ref.ts +12 -20
  320. package/src/references/read-rule.ts +60 -0
  321. package/src/references/read-rules.ts +55 -0
  322. package/src/references/sink.ts +314 -0
  323. package/src/references/sources.ts +632 -0
  324. package/src/references.ts +187 -1450
  325. package/src/report-schema.ts +68 -0
  326. package/src/report.ts +103 -226
  327. package/src/reporters/annotations.ts +22 -11
  328. package/src/reporters/json.ts +1 -1
  329. package/src/reporters/reporter.ts +2 -4
  330. package/src/reporters/reporters.ts +1 -1
  331. package/src/reporters/sarif.ts +29 -16
  332. package/src/reporters/template.ts +4 -20
  333. package/src/reporters/text.ts +3 -3
  334. package/src/resolve.ts +284 -1115
  335. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
  336. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  337. package/src/roots/manifest.ts +303 -0
  338. package/src/roots/published-reach.ts +486 -0
  339. package/src/{roots.ts → roots/root-set.ts} +286 -469
  340. package/src/roots/unseen-loads.ts +345 -0
  341. package/src/run.ts +75 -91
  342. package/src/schema.ts +391 -388
  343. package/src/scope.ts +46 -138
  344. package/src/session.ts +87 -55
  345. package/src/source-files.ts +6 -11
  346. package/src/stores.ts +15 -3
  347. package/src/suppress-file.ts +24 -33
  348. package/src/suppress-inline.ts +55 -91
  349. package/src/suppress.ts +78 -79
  350. package/src/symbol-keys.ts +104 -107
  351. package/src/tests/file-class.ts +135 -0
  352. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  353. package/src/{test-support.ts → tests/support.ts} +15 -21
  354. package/src/text/compare.ts +27 -0
  355. package/src/text/glob.ts +210 -0
  356. package/src/text/named-files.ts +388 -0
  357. package/src/text/yaml.ts +747 -0
  358. package/src/type-errors.ts +18 -288
  359. package/src/type-parameter-reads.ts +187 -158
  360. package/src/unimplemented-callees.ts +297 -280
  361. package/src/unwrap.ts +34 -0
  362. package/src/usage.ts +10 -0
  363. package/src/vendor/unbash/LICENSE +15 -0
  364. package/src/vendor/unbash/VENDORED.md +16 -0
  365. package/src/vendor/unbash/ansi-c.ts +132 -0
  366. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  367. package/src/vendor/unbash/arithmetic.ts +641 -0
  368. package/src/vendor/unbash/assignment.ts +163 -0
  369. package/src/vendor/unbash/chars.ts +48 -0
  370. package/src/vendor/unbash/command.ts +47 -0
  371. package/src/vendor/unbash/expansion.ts +144 -0
  372. package/src/vendor/unbash/glob.ts +284 -0
  373. package/src/vendor/unbash/heredoc.ts +34 -0
  374. package/src/vendor/unbash/internal-types.ts +94 -0
  375. package/src/vendor/unbash/lexer.ts +4352 -0
  376. package/src/vendor/unbash/limits.ts +3 -0
  377. package/src/vendor/unbash/parser.ts +1612 -0
  378. package/src/vendor/unbash/parts.ts +96 -0
  379. package/src/vendor/unbash/substitution-context.ts +20 -0
  380. package/src/vendor/unbash/traversal.ts +182 -0
  381. package/src/vendor/unbash/types.ts +660 -0
  382. package/src/vendor/unbash/word-value.ts +64 -0
  383. package/src/vendor/unbash/word.ts +50 -0
  384. package/src/verbs/analyze.ts +255 -164
  385. package/src/verbs/describe.ts +19 -17
  386. package/src/verbs/explain.ts +93 -169
  387. package/src/verbs/print-config.ts +2 -1
  388. package/src/verbs/print-projects.ts +6 -4
  389. package/src/verbs/print-retained.ts +36 -6
  390. package/src/verbs/print-roots.ts +4 -2
  391. package/src/verbs/verb.ts +2 -8
  392. package/src/verbs/version.ts +15 -3
  393. package/dist/src/base-url.js +0 -18
  394. package/dist/src/calls.js +0 -155
  395. package/dist/src/conventions.js +0 -937
  396. package/dist/src/discover.js +0 -468
  397. package/dist/src/entry-points.js +0 -529
  398. package/dist/src/exempt-classes.js +0 -75
  399. package/dist/src/exempt.js +0 -209
  400. package/dist/src/generated-file.js +0 -95
  401. package/dist/src/glob.js +0 -65
  402. package/dist/src/manifest.js +0 -165
  403. package/dist/src/matrix.js +0 -246
  404. package/dist/src/pnpm-workspace.js +0 -120
  405. package/dist/src/roots.js +0 -672
  406. package/dist/src/serialization-contract.js +0 -611
  407. package/dist/src/setup-failure.js +0 -23
  408. package/dist/src/sweep.js +0 -224
  409. package/dist/src/test-joins.js +0 -101
  410. package/dist/src/value-flow.js +0 -74
  411. package/dist/src/version.js +0 -7
  412. package/dist/src/workflow-steps.js +0 -185
  413. package/src/base-url.ts +0 -24
  414. package/src/calls.ts +0 -225
  415. package/src/decorator.ts +0 -78
  416. package/src/discover.ts +0 -653
  417. package/src/entry-points.ts +0 -687
  418. package/src/exempt-classes.ts +0 -123
  419. package/src/exempt.ts +0 -323
  420. package/src/generated-file.ts +0 -111
  421. package/src/glob.ts +0 -67
  422. package/src/manifest.ts +0 -234
  423. package/src/matrix.ts +0 -423
  424. package/src/pnpm-workspace.ts +0 -135
  425. package/src/serialization-contract.ts +0 -849
  426. package/src/setup-failure.ts +0 -39
  427. package/src/sweep.ts +0 -347
  428. package/src/test-joins.ts +0 -120
  429. package/src/value-flow.ts +0 -104
  430. package/src/version.ts +0 -7
  431. package/src/workflow-steps.ts +0 -216
package/dist/src/scope.js CHANGED
@@ -1,150 +1,73 @@
1
- import { ConfigError } from "./config.js";
1
+ import { SCOPE_SCHEMA } from "./contract/config.generated.js";
2
+ import { dotted, locatedFault, placeIn, readStrict, StrictJSONError } from "./json-document.js";
2
3
  import { dirnamePath, isAbsolutePath, joinPath, resolvePath } from "./paths.js";
3
- import { checkDocument } from "./schema.js";
4
- /** The roles a scope document declares for a module. */
5
- const ROLE_TARGET = "target";
6
- const ROLE_CONSUMER = "consumer";
4
+ import { MARKERS } from "./load/discover.js";
5
+ import { failureExit } from "./failure.js";
6
+ import { message } from "./product.js";
7
+ import { firstRefusal } from "./schema.js";
8
+ import { UsageError } from "./usage.js";
7
9
  /**
8
10
  * A scope document above this length is refused rather than decoded. It names one
9
11
  * target and its consumers, so a larger file is not one.
10
12
  */
11
13
  const MAX_DOCUMENT_LENGTH = 1 << 20;
12
14
  /**
13
- * A scope document that cannot be read as one. It ends the run with the failure
14
- * code: the run could not learn what to analyze, so it produced no answer.
15
+ * The bytes read of a scope document. A UTF-16 unit decodes from at most three bytes,
16
+ * so a document past the bound is past it within these.
15
17
  */
16
- export class ScopeError extends Error {
17
- constructor(message) {
18
- super(message);
19
- this.name = "ScopeError";
20
- }
21
- }
22
- const MODULE = {
23
- kind: "section",
24
- members: { id: { kind: "leaf" }, role: { kind: "leaf" }, path: { kind: "leaf" } },
25
- };
26
- /** The closed key list of the scope document, compared as bytes. */
27
- const SCOPE_ROOT = {
28
- kind: "section",
29
- members: {
30
- target: MODULE,
31
- workspace: { kind: "leaf" },
32
- consumers: { kind: "list", members: MODULE.members ?? {} },
33
- },
34
- };
35
- function isRecord(value) {
36
- return typeof value === "object" && value !== null && !Array.isArray(value);
37
- }
38
- /**
39
- * One string member, or undefined where the document omits it. A member the
40
- * document writes is a string holding at least one character, so `null` and `""`
41
- * are refused rather than read as absent.
42
- */
43
- function stringMember(parent, name, at) {
44
- if (!Object.hasOwn(parent, name)) {
45
- return undefined;
46
- }
47
- const value = parent[name];
48
- if (typeof value !== "string") {
49
- throw new ScopeError(`scope: ${at === "" ? name : `${at}.${name}`} is not a string`);
50
- }
51
- if (value === "") {
52
- throw new ScopeError(`scope: ${at === "" ? name : `${at}.${name}`} names nothing`);
53
- }
54
- return value;
55
- }
56
- function readModule(value, at, role, documentDir) {
57
- if (!isRecord(value)) {
58
- throw new ScopeError(`scope: ${at} is not an object`);
59
- }
60
- const declared = stringMember(value, "role", at);
61
- if (declared !== undefined && declared !== role) {
62
- throw new ScopeError(`scope: ${at}.role is ${JSON.stringify(declared)}, want ${JSON.stringify(role)}`);
63
- }
64
- const path = stringMember(value, "path", at);
65
- if (path === undefined) {
66
- throw new ScopeError(`scope: ${at}.path names nothing`);
67
- }
68
- return {
69
- id: stringMember(value, "id", at) ?? "",
70
- path: isAbsolutePath(path) ? path : joinPath(documentDir, path),
71
- };
72
- }
73
- /**
74
- * Walks the document's text against the closed key list, refusing a key the list
75
- * does not declare, compared as bytes, and a key one object writes twice, which a
76
- * parse cannot report because it keeps the last value.
77
- */
78
- function checkKeys(text, file) {
79
- try {
80
- checkDocument(text, SCOPE_ROOT, `scope: ${file}`);
81
- }
82
- catch (error) {
83
- if (error instanceof ConfigError) {
84
- // The configuration's refusal names the nearest configuration key, which a
85
- // scope document does not have.
86
- throw new ScopeError(error.kind === "unimplemented-key"
87
- ? `scope: ${file}: ${error.key} is not a declared key`
88
- : error.message);
89
- }
90
- throw error;
91
- }
18
+ const MAX_DOCUMENT_BYTES = 3 * (MAX_DOCUMENT_LENGTH + 1);
19
+ function refusal(file, place, reason) {
20
+ return new UsageError(`scope: ${file}: ${place === "" ? "" : `${place}: `}${reason}`);
92
21
  }
93
22
  /**
94
- * Decodes the scope document at `file`. Decoding is strict: an undeclared key, a
95
- * key written twice in one object, and a value of a type the document does not
96
- * admit, `null` included, are errors, and a relative path inside the document
97
- * resolves against the document's own directory.
98
- *
99
- * The `workspace` key the format declares is checked and carries nothing here: it
100
- * names the file a Go consumer resolves the target through, and a TypeScript
101
- * project resolves one through its own compiler configuration.
23
+ * Decodes the scope document at `file`, held to the Contract's scope schema, a relative
24
+ * path resolved against the document's own directory. A document that cannot be read or is
25
+ * refused is a usage error, as any document the invocation names. `workspace` is read by Go consumers
26
+ * alone: a TypeScript project resolves the target through its own compiler configuration.
102
27
  */
103
28
  export function readScope(host, file) {
104
29
  const absolute = resolvePath(host.workingDirectory(), file);
105
30
  let text;
106
31
  try {
107
- text = host.readFile(absolute);
32
+ text = host.readFile(absolute, MAX_DOCUMENT_BYTES);
108
33
  }
109
34
  catch (error) {
110
- throw new ScopeError(`scope: ${file}: ${error instanceof Error ? error.message : String(error)}`);
35
+ throw new UsageError(`scope: ${file}: ${message(error)}`);
111
36
  }
112
37
  if (text.length > MAX_DOCUMENT_LENGTH) {
113
- throw new ScopeError(`scope: ${file} is longer than ${String(MAX_DOCUMENT_LENGTH)} characters`);
38
+ throw new UsageError(`scope: ${file} is longer than ${String(MAX_DOCUMENT_LENGTH)} characters`);
114
39
  }
115
40
  let value;
116
41
  try {
117
- value = JSON.parse(text);
42
+ value = readStrict(text).value;
118
43
  }
119
44
  catch (error) {
120
- throw new ScopeError(`scope: ${file}: ${error instanceof Error ? error.message : String(error)}`);
45
+ if (!(error instanceof StrictJSONError)) {
46
+ throw error;
47
+ }
48
+ throw refusal(file, dotted(error.place), locatedFault(text, error));
121
49
  }
122
- if (!isRecord(value)) {
123
- throw new ScopeError(`scope: ${file} is not one JSON object`);
50
+ const refused = firstRefusal(SCOPE_SCHEMA, value);
51
+ if (refused !== undefined) {
52
+ throw refusal(file, dotted(placeIn(value, refused.pointer, refused.member)), refused.reason);
124
53
  }
125
- checkKeys(text, file);
126
- stringMember(value, "workspace", "");
54
+ const declared = value;
127
55
  const documentDir = dirnamePath(absolute);
128
- if (!Object.hasOwn(value, "target")) {
129
- throw new ScopeError(`scope: ${file} names no target`);
130
- }
131
- const target = readModule(value["target"], "target", ROLE_TARGET, documentDir);
132
- const listed = Object.hasOwn(value, "consumers") ? value["consumers"] : [];
133
- if (!Array.isArray(listed)) {
134
- throw new ScopeError(`scope: ${file}: consumers is not an array`);
135
- }
136
- const consumers = listed.map((entry, index) => readModule(entry, `consumers[${String(index)}]`, ROLE_CONSUMER, documentDir));
137
- return { target, consumers };
56
+ const moduleOf = (module) => ({
57
+ id: module.id ?? "",
58
+ path: isAbsolutePath(module.path) ? module.path : joinPath(documentDir, module.path),
59
+ });
60
+ return { target: moduleOf(declared.target), consumers: (declared.consumers ?? []).map(moduleOf) };
138
61
  }
139
- /** The single-package scope one directory is, when no scope document is given. */
62
+ /**
63
+ * The single-package scope one directory is, when no scope document is given. A target that is
64
+ * no directory holds no program.
65
+ */
140
66
  export function scopeForDir(host, dir) {
141
67
  const path = resolvePath(host.workingDirectory(), dir);
142
68
  const kind = host.kindOf(path);
143
- if (kind === "absent") {
144
- throw new ScopeError(`scope: ${path} does not exist`);
145
- }
146
69
  if (kind !== "directory") {
147
- throw new ScopeError(`scope: ${path} is not a directory`);
70
+ throw failureExit("no-program", `the target ${path} ${kind === "absent" ? "does not exist" : "is not a directory"}, so it holds no compiler configuration, no file named ${MARKERS.join(", ")}: name the directory that holds one`);
148
71
  }
149
72
  return { target: { id: "", path }, consumers: [] };
150
73
  }
@@ -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 === "") {