paperlint 3.1.3 → 4.0.0

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 (527) hide show
  1. package/.github/workflows/ci.yml +12 -7
  2. package/CLAUDE.md +5 -5
  3. package/CONTRIBUTING.md +34 -5
  4. package/dist/adapters/banal/failure.d.ts +1 -7
  5. package/dist/adapters/banal/failure.d.ts.map +1 -1
  6. package/dist/adapters/banal/failure.js +5 -7
  7. package/dist/adapters/banal/failure.js.map +1 -1
  8. package/dist/adapters/banal/index.d.ts.map +1 -1
  9. package/dist/adapters/banal/index.js +4 -3
  10. package/dist/adapters/banal/index.js.map +1 -1
  11. package/dist/adapters/banal/install.d.ts.map +1 -1
  12. package/dist/adapters/banal/install.js +4 -3
  13. package/dist/adapters/banal/install.js.map +1 -1
  14. package/dist/adapters/banal/invocation.d.ts +10 -5
  15. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  16. package/dist/adapters/banal/invocation.js +13 -1
  17. package/dist/adapters/banal/invocation.js.map +1 -1
  18. package/dist/adapters/banal/locate.d.ts +12 -9
  19. package/dist/adapters/banal/locate.d.ts.map +1 -1
  20. package/dist/adapters/banal/locate.js +19 -12
  21. package/dist/adapters/banal/locate.js.map +1 -1
  22. package/dist/adapters/banal/run.d.ts +10 -1
  23. package/dist/adapters/banal/run.d.ts.map +1 -1
  24. package/dist/adapters/banal/run.js +8 -4
  25. package/dist/adapters/banal/run.js.map +1 -1
  26. package/dist/adapters/banal/settings.d.ts +1 -1
  27. package/dist/adapters/banal/settings.d.ts.map +1 -1
  28. package/dist/adapters/banal/settings.js +2 -1
  29. package/dist/adapters/banal/settings.js.map +1 -1
  30. package/dist/adapters/memory/index.d.ts.map +1 -1
  31. package/dist/adapters/memory/index.js +8 -2
  32. package/dist/adapters/memory/index.js.map +1 -1
  33. package/dist/adapters/node/files.io.d.ts.map +1 -1
  34. package/dist/adapters/node/files.io.js +2 -1
  35. package/dist/adapters/node/files.io.js.map +1 -1
  36. package/dist/adapters/node/process.io.d.ts +5 -7
  37. package/dist/adapters/node/process.io.d.ts.map +1 -1
  38. package/dist/adapters/node/process.io.js +4 -3
  39. package/dist/adapters/node/process.io.js.map +1 -1
  40. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  41. package/dist/adapters/node/workspace.io.js +4 -2
  42. package/dist/adapters/node/workspace.io.js.map +1 -1
  43. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  44. package/dist/adapters/pdfjs/fill.js +13 -7
  45. package/dist/adapters/pdfjs/fill.js.map +1 -1
  46. package/dist/adapters/references/index.d.ts.map +1 -1
  47. package/dist/adapters/references/index.js +8 -7
  48. package/dist/adapters/references/index.js.map +1 -1
  49. package/dist/adapters/references/pool.d.ts.map +1 -1
  50. package/dist/adapters/references/pool.js +4 -5
  51. package/dist/adapters/references/pool.js.map +1 -1
  52. package/dist/adapters/references/reach.io.d.ts.map +1 -1
  53. package/dist/adapters/references/reach.io.js +2 -1
  54. package/dist/adapters/references/reach.io.js.map +1 -1
  55. package/dist/build-engine.d.ts +1 -1
  56. package/dist/build-engine.d.ts.map +1 -1
  57. package/dist/build-engine.js +10 -3
  58. package/dist/build-engine.js.map +1 -1
  59. package/dist/build.d.ts +2 -3
  60. package/dist/build.d.ts.map +1 -1
  61. package/dist/build.js +19 -17
  62. package/dist/build.js.map +1 -1
  63. package/dist/caller-path.d.ts +3 -0
  64. package/dist/caller-path.d.ts.map +1 -0
  65. package/dist/caller-path.js +13 -0
  66. package/dist/caller-path.js.map +1 -0
  67. package/dist/cli.d.ts +10 -17
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +93 -46
  70. package/dist/cli.js.map +1 -1
  71. package/dist/doctor.d.ts +12 -3
  72. package/dist/doctor.d.ts.map +1 -1
  73. package/dist/doctor.js +5 -3
  74. package/dist/doctor.js.map +1 -1
  75. package/dist/domain/lookup-cache.d.ts.map +1 -1
  76. package/dist/domain/lookup-cache.js +10 -8
  77. package/dist/domain/lookup-cache.js.map +1 -1
  78. package/dist/domain/paths.d.ts +8 -2
  79. package/dist/domain/paths.d.ts.map +1 -1
  80. package/dist/domain/paths.js +12 -1
  81. package/dist/domain/paths.js.map +1 -1
  82. package/dist/domain/ready.d.ts +24 -0
  83. package/dist/domain/ready.d.ts.map +1 -0
  84. package/dist/domain/ready.js +11 -0
  85. package/dist/domain/ready.js.map +1 -0
  86. package/dist/domain/record.d.ts +8 -0
  87. package/dist/domain/record.d.ts.map +1 -0
  88. package/dist/domain/record.js +8 -0
  89. package/dist/domain/record.js.map +1 -0
  90. package/dist/domain/sha256.d.ts.map +1 -1
  91. package/dist/domain/sha256.js +4 -2
  92. package/dist/domain/sha256.js.map +1 -1
  93. package/dist/domain/text.d.ts +12 -0
  94. package/dist/domain/text.d.ts.map +1 -1
  95. package/dist/domain/text.js +17 -0
  96. package/dist/domain/text.js.map +1 -1
  97. package/dist/engine.d.ts +23 -22
  98. package/dist/engine.d.ts.map +1 -1
  99. package/dist/engine.js +4 -3
  100. package/dist/engine.js.map +1 -1
  101. package/dist/eslint-rules/bib-reachable-entry.d.ts +22 -0
  102. package/dist/eslint-rules/bib-reachable-entry.d.ts.map +1 -0
  103. package/dist/eslint-rules/bib-reachable-entry.js +75 -0
  104. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -0
  105. package/dist/eslint-rules/install-path-literals.d.ts +80 -0
  106. package/dist/eslint-rules/install-path-literals.d.ts.map +1 -0
  107. package/dist/eslint-rules/install-path-literals.js +105 -0
  108. package/dist/eslint-rules/install-path-literals.js.map +1 -0
  109. package/dist/eslint-rules/latex-language.d.ts +136 -0
  110. package/dist/eslint-rules/latex-language.d.ts.map +1 -0
  111. package/dist/eslint-rules/latex-language.js +639 -0
  112. package/dist/eslint-rules/latex-language.js.map +1 -0
  113. package/dist/eslint-rules/paper-research-question.d.ts +31 -0
  114. package/dist/eslint-rules/paper-research-question.d.ts.map +1 -0
  115. package/dist/eslint-rules/paper-research-question.js +188 -0
  116. package/dist/eslint-rules/paper-research-question.js.map +1 -0
  117. package/dist/eslint-rules/paper-stages.d.ts +83 -0
  118. package/dist/eslint-rules/paper-stages.d.ts.map +1 -0
  119. package/dist/eslint-rules/paper-stages.js +358 -0
  120. package/dist/eslint-rules/paper-stages.js.map +1 -0
  121. package/dist/eslint-rules/paper-typography.d.ts +74 -0
  122. package/dist/eslint-rules/paper-typography.d.ts.map +1 -0
  123. package/dist/eslint-rules/paper-typography.js +404 -0
  124. package/dist/eslint-rules/paper-typography.js.map +1 -0
  125. package/dist/eslint-rules/papers.d.ts +42 -0
  126. package/dist/eslint-rules/papers.d.ts.map +1 -0
  127. package/dist/eslint-rules/papers.js +145 -0
  128. package/dist/eslint-rules/papers.js.map +1 -0
  129. package/dist/eslint-rules/pdf-last-page-balance.d.ts +72 -0
  130. package/dist/eslint-rules/pdf-last-page-balance.d.ts.map +1 -0
  131. package/dist/eslint-rules/pdf-last-page-balance.js +237 -0
  132. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -0
  133. package/dist/eslint-rules/review-frontmatter.d.ts +57 -0
  134. package/dist/eslint-rules/review-frontmatter.d.ts.map +1 -0
  135. package/dist/eslint-rules/review-frontmatter.js +126 -0
  136. package/dist/eslint-rules/review-frontmatter.js.map +1 -0
  137. package/dist/eslint-rules/review-frontmatter.schema.json +36 -0
  138. package/dist/eslint-rules/rule-context.d.ts +55 -0
  139. package/dist/eslint-rules/rule-context.d.ts.map +1 -0
  140. package/dist/eslint-rules/rule-context.js +9 -0
  141. package/dist/eslint-rules/rule-context.js.map +1 -0
  142. package/dist/eslint-rules/sibling-frontmatter.d.ts +25 -0
  143. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -0
  144. package/dist/eslint-rules/sibling-frontmatter.js +16 -0
  145. package/dist/eslint-rules/sibling-frontmatter.js.map +1 -0
  146. package/dist/eslint-rules/sibling-frontmatter.schema.json +14 -0
  147. package/dist/eslint-rules/temp-root-realpath.d.ts +71 -0
  148. package/dist/eslint-rules/temp-root-realpath.d.ts.map +1 -0
  149. package/dist/eslint-rules/temp-root-realpath.js +139 -0
  150. package/dist/eslint-rules/temp-root-realpath.js.map +1 -0
  151. package/dist/eslint-rules/tex-build.d.ts +35 -0
  152. package/dist/eslint-rules/tex-build.d.ts.map +1 -0
  153. package/dist/eslint-rules/tex-build.js +313 -0
  154. package/dist/eslint-rules/tex-build.js.map +1 -0
  155. package/dist/facts-file.d.ts.map +1 -1
  156. package/dist/facts-file.js +31 -27
  157. package/dist/facts-file.js.map +1 -1
  158. package/dist/hooks-settings.d.ts +1 -1
  159. package/dist/hooks-settings.d.ts.map +1 -1
  160. package/dist/hooks-settings.js +31 -11
  161. package/dist/hooks-settings.js.map +1 -1
  162. package/dist/init.d.ts +8 -9
  163. package/dist/init.d.ts.map +1 -1
  164. package/dist/init.js +33 -15
  165. package/dist/init.js.map +1 -1
  166. package/dist/latex-loop.d.ts +2 -2
  167. package/dist/latex-loop.d.ts.map +1 -1
  168. package/dist/latex-loop.js +2 -2
  169. package/dist/latex-loop.js.map +1 -1
  170. package/dist/lib/agent-cli-version.d.ts +65 -0
  171. package/dist/lib/agent-cli-version.d.ts.map +1 -0
  172. package/dist/lib/agent-cli-version.js +77 -0
  173. package/dist/lib/agent-cli-version.js.map +1 -0
  174. package/dist/lib/check.d.ts +19 -0
  175. package/dist/lib/check.d.ts.map +1 -0
  176. package/dist/lib/check.js +52 -0
  177. package/dist/lib/check.js.map +1 -0
  178. package/dist/lib/markdown.d.ts +180 -0
  179. package/dist/lib/markdown.d.ts.map +1 -0
  180. package/dist/lib/markdown.js +302 -0
  181. package/dist/lib/markdown.js.map +1 -0
  182. package/dist/lib/paper-config.d.ts +84 -0
  183. package/dist/lib/paper-config.d.ts.map +1 -0
  184. package/dist/lib/paper-config.js +138 -0
  185. package/dist/lib/paper-config.js.map +1 -0
  186. package/dist/lib/skill-eval-fixture.d.ts +29 -0
  187. package/dist/lib/skill-eval-fixture.d.ts.map +1 -0
  188. package/dist/lib/skill-eval-fixture.js +62 -0
  189. package/dist/lib/skill-eval-fixture.js.map +1 -0
  190. package/dist/link-skills.d.ts.map +1 -1
  191. package/dist/link-skills.js +5 -4
  192. package/dist/link-skills.js.map +1 -1
  193. package/dist/new-paper.d.ts.map +1 -1
  194. package/dist/new-paper.js +7 -3
  195. package/dist/new-paper.js.map +1 -1
  196. package/dist/paper-files.d.ts +4 -4
  197. package/dist/paper-files.d.ts.map +1 -1
  198. package/dist/paper-files.js +6 -6
  199. package/dist/paper-files.js.map +1 -1
  200. package/dist/paper-settings.d.ts.map +1 -1
  201. package/dist/paper-settings.js +8 -7
  202. package/dist/paper-settings.js.map +1 -1
  203. package/dist/pdf-facts.d.ts +51 -1
  204. package/dist/pdf-facts.d.ts.map +1 -1
  205. package/dist/pdf-facts.js +25 -16
  206. package/dist/pdf-facts.js.map +1 -1
  207. package/dist/pdf-geometry.d.ts.map +1 -1
  208. package/dist/pdf-geometry.js +3 -4
  209. package/dist/pdf-geometry.js.map +1 -1
  210. package/dist/ports/tool-installer.d.ts +2 -14
  211. package/dist/ports/tool-installer.d.ts.map +1 -1
  212. package/dist/presets.d.ts.map +1 -1
  213. package/dist/presets.js +19 -6
  214. package/dist/presets.js.map +1 -1
  215. package/dist/references.d.ts.map +1 -1
  216. package/dist/references.js +15 -10
  217. package/dist/references.js.map +1 -1
  218. package/dist/rules-config.d.ts +26 -1
  219. package/dist/rules-config.d.ts.map +1 -1
  220. package/dist/rules-config.js +15 -12
  221. package/dist/rules-config.js.map +1 -1
  222. package/dist/structure.js +1 -1
  223. package/dist/structure.js.map +1 -1
  224. package/dist/tex-requirements.d.ts +4 -0
  225. package/dist/tex-requirements.d.ts.map +1 -1
  226. package/dist/tex-requirements.js +22 -5
  227. package/dist/tex-requirements.js.map +1 -1
  228. package/dist/toolchain.d.ts.map +1 -1
  229. package/dist/toolchain.js +21 -16
  230. package/dist/toolchain.js.map +1 -1
  231. package/dist/types.d.ts +5 -3
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/venue-rules.d.ts.map +1 -1
  234. package/dist/venue-rules.js +21 -8
  235. package/dist/venue-rules.js.map +1 -1
  236. package/docs/configuration.md +2 -2
  237. package/docs/e2e.md +7 -7
  238. package/docs/install.md +1 -1
  239. package/docs/prior-art/README.md +1 -1
  240. package/docs/prior-art/package-location.md +5 -5
  241. package/docs/prior-art/repro/README.md +1 -1
  242. package/docs/prior-art/test-tooling.md +2 -2
  243. package/docs/testing.md +11 -8
  244. package/docs/toolchain.md +1 -1
  245. package/eslint-rules/{bib-reachable-entry.mjs → bib-reachable-entry.ts} +5 -4
  246. package/eslint-rules/install-path-literals.harness.mjs +1 -1
  247. package/eslint-rules/{install-path-literals.mjs → install-path-literals.ts} +18 -10
  248. package/eslint-rules/latex-language.harness.mjs +2 -2
  249. package/eslint-rules/latex-language.test.mjs +7 -1
  250. package/eslint-rules/{latex-language.mjs → latex-language.ts} +297 -109
  251. package/eslint-rules/paper-research-question.harness.mjs +3 -3
  252. package/eslint-rules/{paper-research-question.mjs → paper-research-question.ts} +35 -16
  253. package/eslint-rules/paper-stages.harness.mjs +2 -2
  254. package/eslint-rules/paper-stages.test.mjs +8 -2
  255. package/eslint-rules/{paper-stages.mjs → paper-stages.ts} +76 -31
  256. package/eslint-rules/paper-typography.test.mjs +3 -3
  257. package/eslint-rules/{paper-typography.mjs → paper-typography.ts} +134 -56
  258. package/eslint-rules/papers.harness.mjs +2 -2
  259. package/eslint-rules/{papers.mjs → papers.ts} +7 -4
  260. package/eslint-rules/pdf-last-page-balance.harness.mjs +3 -3
  261. package/eslint-rules/{pdf-last-page-balance.mjs → pdf-last-page-balance.ts} +89 -32
  262. package/eslint-rules/review-frontmatter.test.mjs +2 -2
  263. package/eslint-rules/{review-frontmatter.mjs → review-frontmatter.ts} +38 -16
  264. package/eslint-rules/rule-context.ts +62 -0
  265. package/eslint-rules/{sibling-frontmatter.mjs → sibling-frontmatter.ts} +1 -1
  266. package/eslint-rules/temp-root-realpath.harness.mjs +1 -1
  267. package/eslint-rules/{temp-root-realpath.mjs → temp-root-realpath.ts} +20 -7
  268. package/eslint-rules/tex-build.harness.mjs +2 -2
  269. package/eslint-rules/{tex-build.mjs → tex-build.ts} +6 -5
  270. package/eslint.config.mjs +146 -30
  271. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  272. package/fixtures/install-path-literals/clean.md +2 -2
  273. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  274. package/fixtures/install-path-literals/defect.md +2 -2
  275. package/fixtures/pdf-facts/README.md +2 -2
  276. package/fixtures/real-markdown-paper/{baseline.mjs → baseline.ts} +31 -10
  277. package/hooks/{hooks.harness.mjs → hooks.harness.ts} +51 -34
  278. package/hooks/paper-edit-guard.hook.mjs +1 -1
  279. package/hooks/{paper-edit-guard.test.mjs → paper-edit-guard.test.ts} +3 -7
  280. package/hooks/paper-skills-nudge.hook.mjs +1 -1
  281. package/hooks/{paper-skills-nudge.test.mjs → paper-skills-nudge.test.ts} +2 -6
  282. package/hooks/paper-status-gates.sh +9 -19
  283. package/hooks/{paper-status-gates.test.mjs → paper-status-gates.test.ts} +2 -6
  284. package/lib/agent-cli-version.harness.mjs +1 -1
  285. package/lib/{agent-cli-version.mjs → agent-cli-version.ts} +32 -18
  286. package/lib/check.test.ts +14 -9
  287. package/lib/{check.mjs → check.ts} +22 -9
  288. package/lib/markdown.test.mjs +7 -7
  289. package/lib/{markdown.mjs → markdown.ts} +68 -29
  290. package/lib/paper-config.harness.mjs +9 -9
  291. package/lib/{paper-config.mjs → paper-config.ts} +20 -19
  292. package/lib/skill-checks.mjs +24 -381
  293. package/lib/skill-checks.test.mjs +64 -116
  294. package/lib/skill-corpus.mjs +10 -251
  295. package/lib/skill-corpus.test.mjs +2 -13
  296. package/lib/skill-eval-kit.mjs +1 -1
  297. package/lib/skill-trigger-cases.mjs +1 -1
  298. package/package.json +42 -10
  299. package/scripts/{check.harness.mjs → check.harness.ts} +111 -10
  300. package/scripts/{check.test.mjs → check.test.ts} +13 -10
  301. package/scripts/{check.mjs → check.ts} +116 -42
  302. package/scripts/coverage-config.test.ts +80 -38
  303. package/scripts/eslint-report-guard.test.mjs +1 -1
  304. package/scripts/harness-api.frozen.json +14 -16
  305. package/scripts/harness-api.test.ts +8 -5
  306. package/scripts/layer-legacy-frozen.test.ts +17 -13
  307. package/scripts/{layer-legacy-frozen.mjs → layer-legacy-frozen.ts} +128 -39
  308. package/scripts/release-config.test.ts +12 -4
  309. package/scripts/rules-see-files.test.mjs +1 -1
  310. package/scripts/test.test.ts +78 -0
  311. package/scripts/test.ts +87 -0
  312. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  313. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  314. package/skills/argument-arc/SKILL.md +2 -36
  315. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  316. package/skills/build-benchmark/SKILL.md +1 -41
  317. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  318. package/skills/camera-ready/SKILL.md +1 -34
  319. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  320. package/skills/cold-read-diff/SKILL.md +1 -35
  321. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  322. package/skills/draft-paper/SKILL.md +2 -41
  323. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  324. package/skills/extend-paper/SKILL.md +2 -33
  325. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  326. package/skills/find-venue/SKILL.md +2 -38
  327. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  328. package/skills/grade-paper-writing/SKILL.md +3 -38
  329. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  330. package/skills/grade-paper-writing/prose-lint.mjs +3 -4
  331. package/skills/grade-paper-writing/{prose-lint.test.mjs → prose-lint.test.ts} +3 -3
  332. package/skills/harden-paper/SKILL.md +1 -39
  333. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  334. package/skills/map-prior-work/SKILL.md +1 -35
  335. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  336. package/skills/osf-artifact-upload/{osf-artifact-upload.harness.mjs → osf-artifact-upload.harness.ts} +3 -4
  337. package/skills/paper-adversarial-review/SKILL.md +2 -35
  338. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  339. package/skills/paper-pipeline/SKILL.md +2 -28
  340. package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
  341. package/skills/paper-pipeline/description-language.eval.mjs +1 -1
  342. package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +1 -1
  343. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +2 -2
  344. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  345. package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
  346. package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
  347. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  348. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  349. package/skills/paper-pipeline/scripts/README.md +30 -225
  350. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  351. package/skills/paper-pipeline/scripts/artifact-coverage.mjs +1 -1
  352. package/skills/paper-pipeline/scripts/{artifact-coverage.test.mjs → artifact-coverage.test.ts} +2 -2
  353. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  354. package/skills/paper-pipeline/scripts/consumer.mjs +24 -109
  355. package/skills/paper-pipeline/scripts/consumer.test.mjs +1 -1
  356. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +1 -1
  357. package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +1 -4
  358. package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +1 -1
  359. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  360. package/skills/paper-pipeline/scripts/{generated-code.test.mjs → generated-code.test.ts} +3 -3
  361. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  362. package/skills/paper-pipeline/scripts/population-map.mjs +1 -4
  363. package/skills/paper-pipeline/scripts/population-map.test.mjs +1 -1
  364. package/skills/paper-pipeline/scripts/{round-diff.harness.mjs → round-diff.harness.ts} +45 -18
  365. package/skills/paper-pipeline/scripts/round-diff.mjs +1 -1
  366. package/skills/paper-pipeline/scripts/round-diff.test.mjs +1 -1
  367. package/skills/paper-status/SKILL.md +2 -42
  368. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  369. package/skills/pc-panel-review/SKILL.md +2 -46
  370. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  371. package/skills/plan-paper-timeline/SKILL.md +2 -36
  372. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  373. package/skills/plan-paper-timeline/fixtures/{fake-google-calendar.mjs → fake-google-calendar.ts} +101 -70
  374. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +3 -3
  375. package/skills/render-paper/SKILL.md +1 -37
  376. package/skills/render-paper/SKILL.md.spec.ts +0 -36
  377. package/skills/render-paper/{extract-pdf-facts.harness.mjs → extract-pdf-facts.harness.ts} +34 -9
  378. package/skills/render-paper/render-paper.harness.mjs +2 -2
  379. package/skills/research-ideate/SKILL.md +2 -39
  380. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  381. package/skills/study-accepted-papers/SKILL.md +1 -34
  382. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  383. package/skills/submit-paper/SKILL.md +1 -33
  384. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  385. package/skills/sweep-design-space/SKILL.md +1 -38
  386. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  387. package/skills/tighten-paper/SKILL.md +2 -39
  388. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  389. package/skills/tighten-paper/structure.mjs +5 -12
  390. package/skills/tighten-paper/{structure.test.mjs → structure.test.ts} +4 -3
  391. package/skills/verify-citations/SKILL.md +2 -38
  392. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  393. package/skills/verify-citations/scripts/{bib-authors.cli.test.mjs → bib-authors.cli.test.ts} +14 -4
  394. package/skills/verify-citations/scripts/bib-authors.d.mts +63 -0
  395. package/skills/verify-citations/scripts/bib-authors.mjs +1 -4
  396. package/skills/verify-citations/scripts/{verify-cites.cli.test.mjs → verify-cites.cli.test.ts} +32 -9
  397. package/skills/verify-citations/scripts/verify-cites.d.mts +58 -0
  398. package/src/CLAUDE.md +1 -1
  399. package/src/adapters/banal/failure.ts +9 -10
  400. package/src/adapters/banal/index.test.ts +5 -8
  401. package/src/adapters/banal/index.ts +8 -7
  402. package/src/adapters/banal/install.ts +9 -4
  403. package/src/adapters/banal/invocation.test.ts +23 -9
  404. package/src/adapters/banal/invocation.ts +24 -9
  405. package/src/adapters/banal/locate.test.ts +2 -2
  406. package/src/adapters/banal/locate.ts +27 -21
  407. package/src/adapters/banal/output.test.ts +1 -1
  408. package/src/adapters/banal/run.test.ts +5 -5
  409. package/src/adapters/banal/run.ts +16 -10
  410. package/src/adapters/banal/settings.ts +2 -2
  411. package/src/adapters/banal/xml.test.ts +1 -1
  412. package/src/adapters/curl/download.test.ts +8 -6
  413. package/src/adapters/memory/index.ts +4 -3
  414. package/src/adapters/node/files.io.ts +2 -2
  415. package/src/adapters/node/files.test.ts +8 -4
  416. package/src/adapters/node/process.io.ts +13 -5
  417. package/src/adapters/node/process.test.ts +5 -5
  418. package/src/adapters/node/workspace.io.ts +9 -4
  419. package/src/adapters/node/workspace.test.ts +3 -1
  420. package/src/adapters/pdfjs/fill.test.ts +2 -2
  421. package/src/adapters/pdfjs/fill.ts +14 -7
  422. package/src/adapters/references/index.test.ts +31 -38
  423. package/src/adapters/references/index.ts +33 -60
  424. package/src/adapters/references/pool.ts +3 -5
  425. package/src/adapters/references/reach.io.ts +2 -1
  426. package/src/build-engine.harness.mjs +1 -1
  427. package/src/build-engine.test.ts +13 -8
  428. package/src/build-engine.ts +12 -7
  429. package/src/build.harness.mjs +2 -2
  430. package/src/build.test.ts +24 -24
  431. package/src/build.ts +34 -26
  432. package/src/caller-path.ts +13 -0
  433. package/src/cli.harness.mjs +6 -8
  434. package/src/cli.test.ts +31 -13
  435. package/src/cli.ts +117 -58
  436. package/src/doctor.harness.mjs +3 -3
  437. package/src/doctor.test.ts +1 -1
  438. package/src/doctor.ts +17 -7
  439. package/src/domain/lookup-cache.ts +21 -11
  440. package/src/domain/paths.test.ts +15 -0
  441. package/src/domain/paths.ts +20 -1
  442. package/src/domain/ready.ts +31 -0
  443. package/src/domain/record.test.ts +20 -0
  444. package/src/domain/record.ts +12 -0
  445. package/src/domain/result.test.ts +2 -2
  446. package/src/domain/sha256.ts +5 -3
  447. package/src/domain/text.test.ts +32 -0
  448. package/src/domain/text.ts +23 -0
  449. package/src/engine.harness.mjs +2 -2
  450. package/src/engine.ts +34 -5
  451. package/src/facts-file.test.ts +9 -7
  452. package/src/facts-file.ts +45 -29
  453. package/src/{hooks-settings.harness.mjs → hooks-settings.harness.ts} +56 -20
  454. package/src/hooks-settings.ts +48 -13
  455. package/src/init.test.ts +37 -14
  456. package/src/init.ts +48 -24
  457. package/src/{latex-log.harness.mjs → latex-log.harness.ts} +14 -14
  458. package/src/{latex-loop.harness.mjs → latex-loop.harness.ts} +64 -36
  459. package/src/latex-loop.ts +3 -3
  460. package/src/{link-skills.harness.mjs → link-skills.harness.ts} +19 -19
  461. package/src/link-skills.test.ts +3 -3
  462. package/src/link-skills.ts +5 -4
  463. package/src/lint-fix.test.ts +4 -6
  464. package/src/linted-set.test.ts +2 -2
  465. package/src/new-paper.harness.mjs +9 -25
  466. package/src/new-paper.test.ts +8 -10
  467. package/src/new-paper.ts +9 -5
  468. package/src/paper-files.test.ts +25 -24
  469. package/src/paper-files.ts +16 -27
  470. package/src/paper-settings-commands.test.ts +5 -4
  471. package/src/paper-settings.test.ts +7 -7
  472. package/src/paper-settings.ts +13 -14
  473. package/src/{pdf-facts.harness.mjs → pdf-facts.harness.ts} +9 -8
  474. package/src/pdf-facts.test.ts +25 -15
  475. package/src/pdf-facts.ts +81 -23
  476. package/src/{pdf-geometry.harness.mjs → pdf-geometry.harness.ts} +19 -12
  477. package/src/pdf-geometry.ts +8 -4
  478. package/src/ports/tool-installer.ts +2 -17
  479. package/src/presets.ts +31 -16
  480. package/src/references.test.ts +76 -62
  481. package/src/references.ts +18 -12
  482. package/src/{rules-config.harness.mjs → rules-config.harness.ts} +7 -13
  483. package/src/rules-config.ts +46 -14
  484. package/src/rules-off.test.ts +6 -4
  485. package/src/{structure.harness.mjs → structure.harness.ts} +26 -15
  486. package/src/structure.ts +1 -1
  487. package/src/{tex-requirements.harness.mjs → tex-requirements.harness.ts} +50 -22
  488. package/src/tex-requirements.test.ts +21 -0
  489. package/src/tex-requirements.ts +37 -11
  490. package/src/toolchain.harness.mjs +2 -2
  491. package/src/toolchain.test.ts +10 -6
  492. package/src/toolchain.ts +31 -17
  493. package/src/types.ts +5 -3
  494. package/src/venue-rules.test.ts +70 -68
  495. package/src/venue-rules.ts +22 -12
  496. package/tsconfig.json +6 -3
  497. package/tsconfig.pkg.json +10 -0
  498. package/lib/check.d.mts +0 -17
  499. package/lib/paper-config.d.mts +0 -31
  500. package/scripts/layer-legacy-frozen.d.mts +0 -36
  501. package/scripts/rules-are-content-only.harness.mjs +0 -105
  502. package/scripts/rules-are-content-only.mjs +0 -148
  503. package/scripts/rules-are-content-only.test.mjs +0 -61
  504. package/scripts/test.mjs +0 -44
  505. package/scripts/test.test.mjs +0 -52
  506. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  507. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  508. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  509. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  510. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  511. package/skills/paper-pipeline/scripts/fixtures/scorecard.mjs +0 -71
  512. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  513. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  514. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  515. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  516. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  517. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -753
  518. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  519. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  520. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  521. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  522. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  523. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
  524. /package/bin/{paperlint.test.mjs → paperlint.test.ts} +0 -0
  525. /package/lib/{skill-eval-fixture.mjs → skill-eval-fixture.ts} +0 -0
  526. /package/skills/grade-paper-writing/__snapshots__/{prose-lint.test.mjs.snap → prose-lint.test.ts.snap} +0 -0
  527. /package/skills/tighten-paper/__snapshots__/{structure.test.mjs.snap → structure.test.ts.snap} +0 -0
@@ -18,7 +18,7 @@
18
18
  # npm run fmt:check 5 s
19
19
  # vigiles lint . README.md 6 s
20
20
  # rules-see-files.mjs 5 s
21
- # layer-legacy-frozen.mjs 3 s
21
+ # layer-legacy-frozen.ts 3 s
22
22
  # install e2e --strict (npm + pnpm) 28 s
23
23
  # ───────────────────────────────────────────
24
24
  # total work ~96 s, plus checkout + install + the claude binary
@@ -118,6 +118,11 @@ jobs:
118
118
  - name: npm test, under coverage
119
119
  run: npm run coverage -- --no-skip
120
120
 
121
+ # vitest strips types without checking them, so the tests' types are checked here. After
122
+ # `npm ci`, whose `prepare` built `dist/`: the e2e runs import its declarations.
123
+ - name: the tests type-check
124
+ run: npx tsc -p tsconfig.test.json
125
+
121
126
  # The rules themselves, over this repository's own fixtures. Two of the four fixtures are
122
127
  # DEFECTIVE ON PURPOSE, so a healthy checkout reports warnings here and still exits 0 —
123
128
  # the pass/fail signal for rule behaviour lives in `npm test`, not in the warning count.
@@ -146,7 +151,7 @@ jobs:
146
151
  # or a pointer to a file that does not exist. Bond is 3 × the measured 3 s, floored at the
147
152
  # 1-minute granularity GitHub bills in.
148
153
  #
149
- # README.md is linted too, by name (see the same gate in scripts/check.mjs). Its
154
+ # README.md is linted too, by name (see the same gate in scripts/check.ts). Its
150
155
  # `vigiles:symbol` marks name the functions behind `paperlint init` and `paperlint new`; if one is
151
156
  # renamed or removed, this step fails and names README.md.
152
157
  - name: vigiles lint (skills + README.md)
@@ -163,7 +168,7 @@ jobs:
163
168
  # The legacy exemptions from src/'s layer rules (#76) may only shrink: counted from ESLint's
164
169
  # own suppressedMessages, so a new `-- legacy …` directive anywhere fails here.
165
170
  - name: legacy layer exemptions are frozen
166
- run: node scripts/layer-legacy-frozen.mjs
171
+ run: node scripts/layer-legacy-frozen.ts
167
172
 
168
173
  # pnpm is INSTALLED here rather than hoped for. The runner image may or may not carry it,
169
174
  # and the npm/pnpm difference is the entire reason the install e2e exists — so leaving it
@@ -176,7 +181,7 @@ jobs:
176
181
  # Called directly with --strict, the same as the build e2e below. --strict: a manager that does not launch is a declared skip on a
177
182
  # contributor's clone and a FAILURE here, because in CI it means a broken environment.
178
183
  - name: install e2e (--strict)
179
- run: node test/e2e/install.mjs --strict
184
+ run: node test/e2e/install.ts --strict
180
185
  timeout-minutes: 10
181
186
 
182
187
  # ── BUILDING THE PAPER WITH REAL pdflatex, ON LINUX AND macOS ──────────────────────────────────
@@ -271,14 +276,14 @@ jobs:
271
276
  # result must equal the numbers banal gave on the same PDFs through poppler's pdftohtml
272
277
  # (recorded once, hardcoded in the test). Runs in seconds, hence the short timeout.
273
278
  - name: banal e2e (--strict)
274
- run: node test/e2e/banal.mjs --strict
279
+ run: node test/e2e/banal.ts --strict
275
280
  timeout-minutes: 3
276
281
 
277
282
  # Called directly with --strict (see the install e2e step in the `gates` job).
278
283
  - name: build e2e (--strict)
279
- run: node test/e2e/build.mjs --strict
284
+ run: node test/e2e/build.ts --strict
280
285
  timeout-minutes: 10
281
286
 
282
287
  - name: toolchain e2e (--strict)
283
- run: node test/e2e/toolchain.mjs --strict
288
+ run: node test/e2e/toolchain.ts --strict
284
289
  timeout-minutes: 10
package/CLAUDE.md CHANGED
@@ -279,7 +279,7 @@ cannot.
279
279
 
280
280
  What the twin was for was the CAPABILITY CHECK — `vigiles compile` refuses a hook that imports
281
281
  anything but `vigiles/hook`, because the import list _is_ the capability surface. That check is a
282
- function, `checkHookImports`, and `hooks/hooks.harness.mjs` runs it over every shipped
282
+ function, `checkHookImports`, and `hooks/hooks.harness.ts` runs it over every shipped
283
283
  `.hook.mjs` directly. Same check, applied to the artifact that actually executes, with no second
284
284
  file to keep in step. What is lost is `tsc` on the hook body and the typed `e.ctx` — named here
285
285
  rather than left as an omission.
@@ -363,8 +363,8 @@ paid for by a consumer who only wants the ESLint rules and never loads a hook.
363
363
 
364
364
  `optional: true` is the entry that matches what this section already argues: the consumer brings
365
365
  its own `vigiles` _when it uses the hooks_, and npm stops deciding that for them. Both halves
366
- measured on the 56 MB tree: `eslint-rules/latex-language.mjs` and
367
- `skills/paper-pipeline/scripts/pipeline-check.mjs` load and run (RC=0), while
366
+ measured on the 56 MB tree: `eslint-rules/latex-language.mjs` and the skill scripts load and
367
+ run (RC=0), while
368
368
  `hooks/paper-edit-guard.hook.mjs` fails with `ERR_MODULE_NOT_FOUND` — which is this contract
369
369
  working, not a defect, exactly as argued below.
370
370
 
@@ -497,8 +497,8 @@ justified two hundred lines above precisely by these minutes being free.
497
497
  | -------------------------------------------------------------------------- | --------------------------------------------- |
498
498
  | a pure function | unit — vitest, `<module>.test.ts` beside it |
499
499
  | a use case or adapter that reaches disk, a process, the network, the clock | integration — vitest, fakes through the ports |
500
- | a hook's decision, a skill's contract | harness — vigiles, `<surface>.harness.mjs` |
501
- | the installed package, a real TeX build | e2e — `test/e2e/*.mjs` |
500
+ | a hook's decision, a skill's contract | harness — vigiles, `<surface>.harness.ts` |
501
+ | the installed package, a real TeX build | e2e — `test/e2e/*.ts` |
502
502
 
503
503
  Red first · assert the whole value · test what the code does, never what its source says · no test
504
504
  touches the real network · 100% coverage, no `c8 ignore`. **Before every push: `npm run check`,
package/CONTRIBUTING.md CHANGED
@@ -44,10 +44,10 @@ and reported as "the gates". If a step genuinely cannot run here, it says so out
44
44
  being skipped quietly: an e2e that finds no TeX or no pnpm exits 77 _having stated_ why, and
45
45
  `npm run check` lists it as skipped instead of counting it as passed.
46
46
 
47
- Each gate's command is listed in `scripts/check.mjs`; run one of them directly while iterating on
47
+ Each gate's command is listed in `scripts/check.ts`; run one of them directly while iterating on
48
48
  one rule. They are not what you run before pushing.
49
49
 
50
- **The list of gates cannot quietly fall behind CI.** `scripts/check.harness.mjs` pulls the job
50
+ **The list of gates cannot quietly fall behind CI.** `scripts/check.harness.ts` pulls the job
51
51
  names out of `.github/workflows/ci.yml` and requires each to be either reproduced by a gate or
52
52
  named with a reason for why it cannot be. Add a job and it goes red the same day, naming the job
53
53
  nobody covered — verified by adding a `windows` job and watching it fail.
@@ -55,8 +55,8 @@ nobody covered — verified by adding a `windows` job and watching it fail.
55
55
  ## Layout
56
56
 
57
57
  ```
58
- eslint-rules/ the rules, each with its .harness.mjs beside it
59
- lib/ shared readers — markdown, skill corpus
58
+ eslint-rules/ the rules (TypeScript, built to dist/eslint-rules/), each with its harness beside it
59
+ lib/ shared readers — markdown, config keys (TypeScript, built to dist/lib/); skill corpus
60
60
  hooks/ three hooks for vigiles — the code
61
61
  plugin/ the Claude Code plugin: wiring for those hooks, no code, no package.json
62
62
  skills/ 24 stage skills
@@ -102,6 +102,35 @@ npm run coverage # the same, under c8, failing below the thresholds in .
102
102
  None of these are needed to USE the tool — they are here because the gates are part of the
103
103
  argument, not decoration.
104
104
 
105
+ New code is TypeScript (#78). The last block of [`eslint.config.mjs`](eslint.config.mjs) makes any
106
+ `.js`, `.mjs` or `.cjs` file an error in the directories already converted (`TYPESCRIPT_ONLY`), so
107
+ `npm run lint` fails on one; a directory that still mixes the two is not listed yet, and the change
108
+ that converts it adds it. Code that only this repository runs (tests, `scripts/`, `test/e2e/`) is
109
+ run by `node` directly; code a consumer runs from `node_modules` needs a build first, because Node
110
+ does not strip types there.
111
+
112
+ `npm run build` is one `tsc` over two projects into one `dist/`: `tsconfig.json` builds `src/` to
113
+ `dist/*.js`, and `tsconfig.pkg.json` builds `lib/` and `eslint-rules/` to `dist/lib/` and
114
+ `dist/eslint-rules/`. Everything else imports those two through the package's subpath imports,
115
+ `#lib/<name>` and `#eslint-rules/<name>` (`"imports"` in `package.json`): the default target is the
116
+ build, which is what an install runs; the `paperlint-source` condition points at the `.ts` instead,
117
+ and `npm test` (so `npm run coverage` and `npm run check` too) and `tsconfig.test.json` set it so
118
+ they read the source. `scripts/test.ts` is the one place the tests get it; a harness run on its own
119
+ (`npx vigiles test <file>`) needs `NODE_OPTIONS=--conditions=paperlint-source`.
120
+
121
+ Consumers import the same modules by their old public names — `paperlint/eslint-rules/<name>.mjs`,
122
+ `paperlint/lib/<name>.mjs`, `paperlint/bin/paperlint.mjs` — which the `"exports"` map in
123
+ `package.json` points at `dist/`. The install e2e imports every one of them, and every
124
+ `paperlint/…` import in a `docs/` code block, from the installed package; a module moved or renamed
125
+ without its public name fails there. The five `lib/*.mjs` modules not yet converted are listed in
126
+ `"exports"` by name until step 4 (#127) converts them.
127
+
128
+ TypeScript is pinned to 6.x, not 7 (measured 2026-09-27): typescript-eslint 8.70.1 declares
129
+ `typescript: >=4.8.4 <6.1.0`, and `typescript@7.0.2`'s package root exports only its version — the
130
+ compiler API that `scripts/harness-api.test.ts` and `scripts/coverage-config.test.ts` parse with
131
+ (`createSourceFile`) moved under `typescript/unstable/*`. Moving to 7 waits for a typescript-eslint
132
+ release that allows it and for those two tests to parse through a stable API.
133
+
105
134
  Coverage is 100% for lines, statements, functions and branches, and there is no `c8 ignore`:
106
135
  code a test cannot reach directly — a race, a permission, a broken install, a real download — takes
107
136
  the effect as a parameter (the ports in `src/ports`, an injected `readdir` or runner), and the test
@@ -123,7 +152,7 @@ A venue is a **preset**, a JSONC file in `skills/submit-paper/references/venues/
123
152
  2. **The card.** `venues/<name>.md` — prose about the venue: deadlines, tracks, the blind model,
124
153
  what the form asks.
125
154
  3. **A test.** A case in `src/presets.test.ts` that `paperlint:<name>` resolves over its family with
126
- the kinds you declared; `src/tex-requirements.harness.mjs` already checks every shipped preset
155
+ the kinds you declared; `src/tex-requirements.harness.ts` already checks every shipped preset
127
156
  against the schema.
128
157
 
129
158
  `paperlint toolchain` picks the new preset's packages up by itself, and the README and
@@ -60,13 +60,7 @@ export type BanalFailure = {
60
60
  readonly why: BanalFailure;
61
61
  };
62
62
  export declare const PERL_MISSING: string;
63
- /**
64
- * What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes.
65
- *
66
- * The one assertion below narrows the table's entry for `f.kind` to a function of `f`: the mapped
67
- * type already pairs each kind with its own variant, and TypeScript cannot correlate the index with
68
- * the argument on its own.
69
- */
63
+ /** What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes. */
70
64
  export declare function describe(f: BanalFailure): Lines;
71
65
  /** `describe` as one line, for a caller that has a single line to fill. */
72
66
  export declare function describeLine(f: BanalFailure): string;
@@ -1 +1 @@
1
- {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACrD,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACH,uDAAuD;GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxD,kEAAkE;GAChE;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEN,eAAO,MAAM,YAAY,QAE+E,CAAC;AAmDzG;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CAG/C;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACrD,0FAA0F;GACxF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACH,uDAAuD;GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxD,kEAAkE;GAChE;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEN,eAAO,MAAM,YAAY,QAE+E,CAAC;AAyDzG,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CAE/C;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAEpD"}
@@ -41,15 +41,13 @@ const DESCRIBE = {
41
41
  ],
42
42
  };
43
43
  /**
44
- * What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes.
45
- *
46
- * The one assertion below narrows the table's entry for `f.kind` to a function of `f`: the mapped
47
- * type already pairs each kind with its own variant, and TypeScript cannot correlate the index with
48
- * the argument on its own.
44
+ * The describer for `kind`, applied to its own variant. Generic over the kind, so the table's entry
45
+ * and the argument are correlated through `FailureOf[K]` and need no assertion (TypeScript#47109).
49
46
  */
47
+ const describeKind = (kind, f) => DESCRIBE[kind](f);
48
+ /** What to tell a person. Most failures are one line; a sha256 mismatch shows both hashes. */
50
49
  export function describe(f) {
51
- const write = DESCRIBE[f.kind];
52
- return write(f);
50
+ return describeKind(f.kind, f);
53
51
  }
54
52
  /** `describe` as one line, for a caller that has a single line to fill. */
55
53
  export function describeLine(f) {
@@ -1 +1 @@
1
- {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAiDA,MAAM,CAAC,MAAM,YAAY,GACvB,0FAA0F;IAC1F,sGAAsG,CAAC;AAEzG,SAAS,OAAO,CAAC,CAAe;IAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,oBAAoB;QACpC,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,wBAAwB;QACjE,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,4CAA4C,CAAC;AAClF,CAAC;AAQD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC;AAEvD,MAAM,QAAQ,GAAe;IAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;IACpC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,sBAAsB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;KACnE;IACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;IACzE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iCAAiC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IACnE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACpB,6CAA6C,CAAC,CAAC,UAAU,EAAE;KAC5D;IACD,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACzB,iDAAiD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACvE;IACD,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,uDAAuD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC/E;IACD,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxB,iCAAiC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE;KACtD;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,cAAc,CAAC,CAAC,GAAG,2DAA2D;QAC9E,YAAY,CAAC,CAAC,QAAQ,EAAE;QACxB,YAAY,CAAC,CAAC,GAAG,EAAE;KACpB;IACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,CAAC,IAAI,yCAAyC;KAC5D;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,YAAY,CAAC,CAAC,IAAI,kBAAkB,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC1D;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAe;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAA+B,CAAC;IAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,CAAe;IAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../../src/adapters/banal/failure.ts"],"names":[],"mappings":"AAiDA,MAAM,CAAC,MAAM,YAAY,GACvB,0FAA0F;IAC1F,sGAAsG,CAAC;AAEzG,SAAS,OAAO,CAAC,CAAe;IAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,oBAAoB;QACpC,CAAC,CAAC,iCAAiC,CAAC,CAAC,IAAI,wBAAwB;QACjE,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,4CAA4C,CAAC;AAClF,CAAC;AAOD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC;AAEvD,MAAM,QAAQ,GAAe;IAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;IACpC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,sBAAsB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;KACnE;IACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;IACzE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iCAAiC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;IACnE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACpB,6CAA6C,CAAC,CAAC,UAAU,EAAE;KAC5D;IACD,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACzB,iDAAiD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACvE;IACD,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvB,uDAAuD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC/E;IACD,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxB,iCAAiC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE;KACtD;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,cAAc,CAAC,CAAC,GAAG,2DAA2D;QAC9E,YAAY,CAAC,CAAC,QAAQ,EAAE;QACxB,YAAY,CAAC,CAAC,GAAG,EAAE;KACpB;IACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,CAAC,IAAI,yCAAyC;KAC5D;IACD,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACrB,YAAY,CAAC,CAAC,IAAI,kBAAkB,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KAC1D;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAiB,IAAO,EAAE,CAAe,EAAS,EAAE,CACvE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpB,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAC,CAAe;IACtC,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,CAAe;IAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG1E,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,mGAAmG;AACnG,wBAAgB,aAAa,CAC3B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,eAAe,CAajB;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,aAAa,CAiBf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAIL,KAAK,SAAS,EAEd,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,mGAAmG;AACnG,wBAAgB,aAAa,CAC3B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,eAAe,CAajB;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,aAAa,CAiBf"}
@@ -1,4 +1,5 @@
1
1
  import { err, ok } from "../../domain/result.js";
2
+ import { ready } from "../../domain/ready.js";
2
3
  import { describe } from "./failure.js";
3
4
  import { provenanceLabel } from "./locate.js";
4
5
  import { pinLabel } from "./pin.js";
@@ -26,7 +27,7 @@ export function banalMeasurer(d, s, projectRoot) {
26
27
  };
27
28
  }
28
29
  /** The one place banal's `Ready` is minted: from an `Installed`, whose `PinnedBanal` only run.ts mints. */
29
- const ready = (i) => ({
30
+ const readyOf = (i) => ready({
30
31
  where: i.banal.path,
31
32
  fresh: i.fresh,
32
33
  verified: "sha256 verified, and it measured a probe page",
@@ -43,12 +44,12 @@ export function banalInstaller(d, s, source) {
43
44
  ...(source ? { source } : {}),
44
45
  onDownload: report,
45
46
  });
46
- return r.ok ? ok(ready(r.value)) : err(describe(r.error));
47
+ return r.ok ? ok(readyOf(r.value)) : err(describe(r.error));
47
48
  },
48
49
  check() {
49
50
  const r = checkBanal(d, s, source);
50
51
  return r.ok
51
- ? ok(ready({ banal: r.value, fresh: false }))
52
+ ? ok(readyOf({ banal: r.value, fresh: false }))
52
53
  : err(describe(r.error));
53
54
  },
54
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAoB,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,GAIhB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAIvB,gGAAgG;AAChG,MAAM,UAAU,GAAG,CAAC,CAAiB,EAAc,EAAE,CAAC,CAAC;IACrD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;CACnC,CAAC,CAAC;AAEH,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAC3B,CAAY,EACZ,CAAgB,EAChB,WAAyB;IAEzB,OAAO;QACL,OAAO,CAAC,KAAK;YACX,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO;gBACzB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAClE,CAAC,CAAC;oBACE,IAAI,EAAE,YAAY;oBAClB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC5C,CAAC;QACR,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,MAAM,KAAK,GAAG,CAAC,CAAY,EAAS,EAAE,CACpC,CAAC;IACC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAc;IAC7B,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,QAAQ,EAAE,+CAA+C;CAC1D,CAAU,CAAC;AAEd;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,CAAc,EACd,CAAgB,EAChB,MAAoB;IAEpB,OAAO;QACL,KAAK,EAAE,QAAQ,EAAE;QACjB,MAAM,CAAC,MAAM;YACX,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC,EAAE;gBACT,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/banal/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAc,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAoB,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,UAAU,EACV,WAAW,EACX,eAAe,GAIhB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,aAAa,EACb,SAAS,EACT,kBAAkB,GAEnB,MAAM,eAAe,CAAC;AAIvB,gGAAgG;AAChG,MAAM,UAAU,GAAG,CAAC,CAAiB,EAAc,EAAE,CAAC,CAAC;IACrD,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;CACnC,CAAC,CAAC;AAEH,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAC3B,CAAY,EACZ,CAAgB,EAChB,WAAyB;IAEzB,OAAO;QACL,OAAO,CAAC,KAAK;YACX,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO;gBACzB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAClE,CAAC,CAAC;oBACE,IAAI,EAAE,YAAY;oBAClB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC5C,CAAC;QACR,CAAC;KACF,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,MAAM,OAAO,GAAG,CAAC,CAAY,EAAS,EAAE,CACtC,KAAK,CAAC;IACJ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,QAAQ,EAAE,+CAA+C;CAC1D,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,CAAc,EACd,CAAgB,EAChB,MAAoB;IAEpB,OAAO;QACL,KAAK,EAAE,QAAQ,EAAE;QACjB,MAAM,CAAC,MAAM;YACX,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC,EAAE;gBACT,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAKlC;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1B,MAAM,EAAE,WAAW,GAClB,cAAc,CAIhB"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAQD,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAIlC;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1B,MAAM,EAAE,WAAW,GAClB,cAAc,CAIhB"}
@@ -1,10 +1,11 @@
1
1
  import { err, ok } from "../../domain/result.js";
2
2
  import { sha256Hex } from "../../domain/sha256.js";
3
+ // The brand's one owner: the predicate IS the pin check, so no assertion is needed to mint the type.
4
+ const isPinned = (bytes, source) => sha256Hex(bytes) === source.sha256;
3
5
  export function verifyPin(bytes, source) {
4
- const got = sha256Hex(bytes);
5
- return got === source.sha256
6
+ return isPinned(bytes, source)
6
7
  ? ok(bytes)
7
- : err({ expected: source.sha256, got });
8
+ : err({ expected: source.sha256, got: sha256Hex(bytes) });
8
9
  }
9
10
  export function installedState(current, source) {
10
11
  if (current === null)
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAC;AAWhE,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,MAAmB;IAEnB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,GAAG,KAAK,MAAM,CAAC,MAAM;QAC1B,CAAC,CAAC,EAAE,CAAC,KAAoB,CAAC;QAC1B,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAC5C,CAAC;AAQD,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,MAAmB;IAEnB,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/banal/install.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAe,MAAM,wBAAwB,CAAC;AAWhE,qGAAqG;AACrG,MAAM,QAAQ,GAAG,CACf,KAAiB,EACjB,MAAmB,EACG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC;AAE9D,MAAM,UAAU,SAAS,CACvB,KAAiB,EACjB,MAAmB;IAEnB,OAAO,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAC5B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC9D,CAAC;AAQD,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,MAAmB;IAEnB,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAChF,CAAC"}
@@ -7,18 +7,20 @@
7
7
  * (`Error: Failed to run pdftohtml`, measured); told a version below 0.85 it applies a larger
8
8
  * correction and every font size moves. So `$PDFTOHTML` (banal's own override, line 166) points at a
9
9
  * stub that answers `-v` with `XML_DIALECT.version` — the pdftohtml whose XML `xml.ts` writes — and
10
- * refuses anything else. `test/e2e/banal.mjs` shows both failures with the real banal.
10
+ * refuses anything else. `test/e2e/banal.ts` shows both failures with the real banal.
11
11
  */
12
12
  import type { Opaque } from "ts-essentials";
13
13
  import type { AbsolutePath } from "../../domain/paths.ts";
14
14
  import type { Command } from "../../ports/process.ts";
15
15
  import type { Scratch } from "../../ports/workspace.ts";
16
- import type { LocatedBanal } from "./locate.ts";
16
+ import type { BanalCandidate } from "./locate.ts";
17
17
  import type { PageLayout } from "../../domain/page-layout.ts";
18
18
  /** banal takes well under a second on a paper; a hang still has to end. */
19
19
  export declare const BANAL_RUN_MS = 120000;
20
20
  /** A path quoted for `/bin/sh`. Minted by `shQuote` only. */
21
21
  export type ShQuoted = Opaque<string, "ShQuoted">;
22
+ /** A word already quoted for `/bin/sh`, checked; anything else throws. */
23
+ export declare function parseShQuoted(s: string): ShQuoted;
22
24
  /** banal interpolates `$PDFTOHTML` into a shell command unquoted — so the value is quoted here. */
23
25
  export declare const shQuote: (s: string) => ShQuoted;
24
26
  /** The stub standing in for `pdftohtml`: it answers `-v` and refuses to convert anything. */
@@ -36,13 +38,16 @@ export interface BanalStaging {
36
38
  ];
37
39
  }
38
40
  export declare const stageBanalInput: (pages: readonly PageLayout[]) => BanalStaging;
41
+ declare const STAGED: unique symbol;
39
42
  /** The staging written to disk. Minted by `stage` only: both files written, or nothing returned. */
40
- export type StagedInput = Opaque<{
43
+ export interface StagedInput {
41
44
  readonly xml: AbsolutePath;
42
45
  readonly stub: AbsolutePath;
43
- }, "StagedInput">;
46
+ readonly [STAGED]: true;
47
+ }
44
48
  /** Write a staging into a scratch directory, the stub executable. The only minter of `StagedInput`. */
45
49
  export declare function stage(s: Scratch, staging: BanalStaging): StagedInput;
46
50
  /** `perl banal -no-time -json <xml>`, with `$PDFTOHTML` quoted by construction. */
47
- export declare function banalCommand(banal: LocatedBanal, staged: StagedInput, baseEnv: Readonly<Record<string, string>>): Command;
51
+ export declare function banalCommand(banal: Pick<BanalCandidate, "path">, staged: StagedInput, baseEnv: Readonly<Record<string, string>>): Command;
52
+ export {};
48
53
  //# sourceMappingURL=invocation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invocation.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,2EAA2E;AAC3E,eAAO,MAAM,YAAY,SAAU,CAAC;AAEpC,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAElD,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,QACS,CAAC;AAE9C,6FAA6F;AAC7F,eAAO,MAAM,cAAc,QAWf,CAAC;AAEb,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,yGAAyG;AACzG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;QAC/B,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,UAAU,EAAE,KAC3B,YAKD,CAAC;AAEH,oGAAoG;AACpG,MAAM,MAAM,WAAW,GAAG,MAAM,CAC9B;IAAE,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,EAC3D,aAAa,CACd,CAAC;AAEF,uGAAuG;AACvG,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAMpE;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACxC,OAAO,CAQT"}
1
+ {"version":3,"file":"invocation.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,2EAA2E;AAC3E,eAAO,MAAM,YAAY,SAAU,CAAC;AAEpC,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAMlD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAGjD;AAED,mGAAmG;AACnG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,QACY,CAAC;AAEjD,6FAA6F;AAC7F,eAAO,MAAM,cAAc,QAWf,CAAC;AAEb,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,yGAAyG;AACzG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;QAC/B,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,UAAU,EAAE,KAC3B,YAKD,CAAC;AAGH,QAAA,MAAM,MAAM,eAAwB,CAAC;AAErC,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;CACzB;AAED,uGAAuG;AACvG,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAOpE;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAC1B,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACnC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACxC,OAAO,CAQT"}
@@ -1,8 +1,17 @@
1
1
  import { pdf2xml, XML_DIALECT } from "./xml.js";
2
2
  /** banal takes well under a second on a paper; a hang still has to end. */
3
3
  export const BANAL_RUN_MS = 120_000;
4
+ // One single-quoted word: any run of non-quotes, each quote spelled `'"'"'`. What `shQuote` writes.
5
+ const SH_QUOTED = /^'(?:[^']|'"'"')*'$/;
6
+ const isShQuoted = (s) => SH_QUOTED.test(s);
7
+ /** A word already quoted for `/bin/sh`, checked; anything else throws. */
8
+ export function parseShQuoted(s) {
9
+ if (!isShQuoted(s))
10
+ throw new Error(`not one single-quoted shell word: ${s}`);
11
+ return s;
12
+ }
4
13
  /** banal interpolates `$PDFTOHTML` into a shell command unquoted — so the value is quoted here. */
5
- export const shQuote = (s) => `'${s.replace(/'/g, `'"'"'`)}'`;
14
+ export const shQuote = (s) => parseShQuoted(`'${s.replace(/'/g, `'"'"'`)}'`);
6
15
  /** The stub standing in for `pdftohtml`: it answers `-v` and refuses to convert anything. */
7
16
  export const PDFTOHTML_STUB = [
8
17
  "#!/bin/sh",
@@ -22,12 +31,15 @@ export const stageBanalInput = (pages) => ({
22
31
  { name: "pdftohtml", content: PDFTOHTML_STUB, mode: "exec" },
23
32
  ],
24
33
  });
34
+ // Not exported: only `stage` can write the property, so only it can make a StagedInput.
35
+ const STAGED = Symbol("StagedInput");
25
36
  /** Write a staging into a scratch directory, the stub executable. The only minter of `StagedInput`. */
26
37
  export function stage(s, staging) {
27
38
  const [xml, stub] = staging.files;
28
39
  return {
29
40
  xml: s.write(xml.name, xml.content, xml.mode),
30
41
  stub: s.write(stub.name, stub.content, stub.mode),
42
+ [STAGED]: true,
31
43
  };
32
44
  }
33
45
  /** `perl banal -no-time -json <xml>`, with `$PDFTOHTML` quoted by construction. */
@@ -1 +1 @@
1
- {"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAKpC,mGAAmG;AACnG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAY,EAAE,CAC7C,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAe,CAAC;AAE9C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW;IACX,kFAAkF;IAClF,4FAA4F;IAC5F,0BAA0B;IAC1B,6BAA6B,WAAW,CAAC,OAAO,GAAG;IACnD,UAAU;IACV,IAAI;IACJ,4GAA4G;IAC5G,QAAQ;IACR,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAgBb,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAA4B,EACd,EAAE,CAAC,CAAC;IAClB,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QAC5D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;KAC7D;CACF,CAAC,CAAC;AAQH,uGAAuG;AACvG,MAAM,UAAU,KAAK,CAAC,CAAU,EAAE,OAAqB;IACrD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAClC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;KACnC,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,MAAmB,EACnB,OAAyC;IAEzC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;QACnD,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACpD,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KACjC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../../src/adapters/banal/invocation.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAKpC,oGAAoG;AACpG,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAiB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAY,EAAE,CAC7C,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW;IACX,kFAAkF;IAClF,4FAA4F;IAC5F,0BAA0B;IAC1B,6BAA6B,WAAW,CAAC,OAAO,GAAG;IACnD,UAAU;IACV,IAAI;IACJ,4GAA4G;IAC5G,QAAQ;IACR,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAgBb,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAA4B,EACd,EAAE,CAAC,CAAC;IAClB,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QAC5D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;KAC7D;CACF,CAAC,CAAC;AAEH,wFAAwF;AACxF,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AASrC,uGAAuG;AACvG,MAAM,UAAU,KAAK,CAAC,CAAU,EAAE,OAAqB;IACrD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAClC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QACjD,CAAC,MAAM,CAAC,EAAE,IAAI;KACf,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAC1B,KAAmC,EACnC,MAAmB,EACnB,OAAyC;IAEzC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;QACnD,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACpD,SAAS,EAAE,YAAY;QACvB,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KACjC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,9 @@
1
- import type { Opaque } from "ts-essentials";
2
- import type { AbsolutePath } from "../../domain/paths.ts";
1
+ /**
2
+ * Where a banal may be, in order; which one is there; and which rule found it. The order:
3
+ * `$BANAL` (an explicit choice — if it names nothing, there is NO fallback), `<project>/vendor/banal`
4
+ * (a project that vendors its own copy), then the one `paperlint toolchain` installed.
5
+ */
6
+ import { type AbsolutePath } from "../../domain/paths.ts";
3
7
  import { type Result } from "../../domain/result.ts";
4
8
  import type { BanalSettings } from "./settings.ts";
5
9
  export type Provenance = {
@@ -13,13 +17,11 @@ export interface BanalCandidate {
13
17
  readonly path: AbsolutePath;
14
18
  readonly provenance: Provenance;
15
19
  }
16
- /** A candidate the `Files` port confirmed is a file. Minted by `pickBanal` only. */
17
- export type LocatedBanal = Opaque<BanalCandidate, "LocatedBanal">;
18
- /**
19
- * `paperlint toolchain`'s banal after its bytes hashed to the pin AND it measured the probe page. Minted by
20
- * `ensureBanal` / `checkBanal` only (`./index.ts`): a "ready" line cannot be printed without one.
21
- */
22
- export type PinnedBanal = Opaque<BanalCandidate, "PinnedBanal">;
20
+ declare const LOCATED: unique symbol;
21
+ /** A candidate the `Files` port confirmed is a file. Minted by `pickBanal` (through `locate`) only. */
22
+ export type LocatedBanal = BanalCandidate & {
23
+ readonly [LOCATED]: true;
24
+ };
23
25
  /** Why there is no banal to run. */
24
26
  export type BanalMissing =
25
27
  /** `$BANAL` names a file that is not there. An explicit choice: no fallback to another banal. */
@@ -47,4 +49,5 @@ export declare function lookupOrder(s: BanalSettings, projectRoot: AbsolutePath)
47
49
  export declare function pickBanal(order: LookupOrder, isFile: (p: AbsolutePath) => boolean): Result<LocatedBanal, BanalMissing>;
48
50
  /** Which rule found it, as a person reads it. */
49
51
  export declare const provenanceLabel: (p: Provenance) => string;
52
+ export {};
50
53
  //# sourceMappingURL=locate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED,oFAAoF;AACpF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAEhE,oCAAoC;AACpC,MAAM,MAAM,YAAY;AACtB,iGAAiG;AAC/F;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChE,8FAA8F;GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,iGAAiG;AACjG,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEN,0FAA0F;AAC1F,eAAO,MAAM,cAAc,GAAI,GAAG,aAAa,KAAG,YACwB,CAAC;AAE3E,wBAAgB,WAAW,CACzB,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,WAAW,CAOb;AAKD,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GACnC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAQpC;AAED,iDAAiD;AACjD,eAAO,MAAM,eAAe,GAAI,GAAG,UAAU,KAAG,MAG7C,CAAC"}
1
+ {"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAGD,QAAA,MAAM,OAAO,eAAyB,CAAC;AAEvC,uGAAuG;AACvG,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAWzE,oCAAoC;AACpC,MAAM,MAAM,YAAY;AACtB,iGAAiG;AAC/F;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChE,8FAA8F;GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,iGAAiG;AACjG,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;CAC9B,CAAC;AAEN,0FAA0F;AAC1F,eAAO,MAAM,cAAc,GAAI,GAAG,aAAa,KAAG,YACY,CAAC;AAE/D,wBAAgB,WAAW,CACzB,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,GACxB,WAAW,CAOb;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GACnC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAapC;AAED,iDAAiD;AACjD,eAAO,MAAM,eAAe,GAAI,GAAG,UAAU,KAAG,MAG7C,CAAC"}
@@ -3,31 +3,38 @@
3
3
  * `$BANAL` (an explicit choice — if it names nothing, there is NO fallback), `<project>/vendor/banal`
4
4
  * (a project that vendors its own copy), then the one `paperlint toolchain` installed.
5
5
  */
6
- import { join } from "node:path";
6
+ import { joinPath } from "../../domain/paths.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  import { BANAL_PIN } from "./pin.js";
9
+ // Not exported: only this module can write the property, so only `locate` can make a LocatedBanal.
10
+ const LOCATED = Symbol("LocatedBanal");
11
+ /** `path` as a banal to run — when the `Files` port says it is a file, else null. */
12
+ function locate(path, kind, isFile) {
13
+ return isFile(path) ? { path, provenance: { kind }, [LOCATED]: true } : null;
14
+ }
9
15
  /** Where `paperlint toolchain` puts the pinned banal: one directory per HotCRP commit. */
10
- export const installedBanal = (s) => join(s.cacheDir, BANAL_PIN.commit.slice(0, 12), "banal");
16
+ export const installedBanal = (s) => joinPath(s.cacheDir, BANAL_PIN.commit.slice(0, 12), "banal");
11
17
  export function lookupOrder(s, projectRoot) {
12
18
  if (s.explicit)
13
19
  return { kind: "explicit", path: s.explicit };
14
20
  return {
15
21
  kind: "search",
16
- vendor: join(projectRoot, "vendor", "banal"),
22
+ vendor: joinPath(projectRoot, "vendor", "banal"),
17
23
  cache: installedBanal(s),
18
24
  };
19
25
  }
20
- const located = (path, kind) => ok({ path, provenance: { kind } });
21
26
  export function pickBanal(order, isFile) {
22
- if (order.kind === "explicit")
23
- return isFile(order.path)
24
- ? located(order.path, "env")
27
+ if (order.kind === "explicit") {
28
+ const own = locate(order.path, "env", isFile);
29
+ return own
30
+ ? ok(own)
25
31
  : err({ kind: "explicit-not-found", path: order.path });
26
- if (isFile(order.vendor))
27
- return located(order.vendor, "vendor");
28
- if (isFile(order.cache))
29
- return located(order.cache, "cache");
30
- return err({ kind: "not-installed", installed: order.cache });
32
+ }
33
+ const found = locate(order.vendor, "vendor", isFile) ??
34
+ locate(order.cache, "cache", isFile);
35
+ return found
36
+ ? ok(found)
37
+ : err({ kind: "not-installed", installed: order.cache });
31
38
  }
32
39
  /** Which rule found it, as a person reads it. */
33
40
  export const provenanceLabel = (p) => ({ env: "$BANAL", vendor: "vendor/banal", cache: "paperlint toolchain" })[p.kind];
@@ -1 +1 @@
1
- {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsCrC,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAgB,EAAE,CAC/D,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAiB,CAAC;AAE3E,MAAM,UAAU,WAAW,CACzB,CAAgB,EAChB,WAAyB;IAEzB,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAiB;QAC5D,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAkB,EAAE,IAAwB,EAAE,EAAE,CAC/D,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAkB,CAAC,CAAC;AAErD,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,MAAoC;IAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;YAC5B,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAa,EAAU,EAAE,CACvD,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CACvE,CAAC,CAAC,IAAI,CACP,CAAC"}
1
+ {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC,mGAAmG;AACnG,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAKvC,qFAAqF;AACrF,SAAS,MAAM,CACb,IAAkB,EAClB,IAAwB,EACxB,MAAoC;IAEpC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAkBD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAgB,EAAE,CAC/D,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,UAAU,WAAW,CACzB,CAAgB,EAChB,WAAyB;IAEzB,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;QAChD,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,MAAoC;IAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG;YACR,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,KAAK;QACV,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAa,EAAU,EAAE,CACvD,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CACvE,CAAC,CAAC,IAAI,CACP,CAAC"}
@@ -32,7 +32,7 @@ import type { RunProcess } from "../../ports/process.ts";
32
32
  import type { Workspace } from "../../ports/workspace.ts";
33
33
  import { type Result } from "../../domain/result.ts";
34
34
  import type { BanalFailure } from "./failure.ts";
35
- import { type BanalCandidate, type PinnedBanal } from "./locate.ts";
35
+ import { type BanalCandidate } from "./locate.ts";
36
36
  import { type BanalSource } from "./pin.ts";
37
37
  import type { BanalSettings } from "./settings.ts";
38
38
  import type { PageLayout } from "../../domain/page-layout.ts";
@@ -67,6 +67,14 @@ export type BanalOutcome = {
67
67
  * `vendor/banal`, or `paperlint toolchain`'s — or why there is none.
68
68
  */
69
69
  export declare function measureGeometry(d: BanalDeps, s: BanalSettings, projectRoot: AbsolutePath, pages: readonly PageLayout[]): BanalOutcome;
70
+ declare const PINNED: unique symbol;
71
+ /**
72
+ * `paperlint toolchain`'s banal after its bytes hashed to the pin AND it measured the probe page. Minted by
73
+ * `probe` only, for `ensureBanal` / `checkBanal` (`./index.ts`): a "ready" line cannot be printed without one.
74
+ */
75
+ export type PinnedBanal = BanalCandidate & {
76
+ readonly [PINNED]: true;
77
+ };
70
78
  export interface Installed {
71
79
  readonly banal: PinnedBanal;
72
80
  /** True when this run downloaded it. */
@@ -86,4 +94,5 @@ export interface EnsureOptions {
86
94
  export declare function ensureBanal(d: InstallDeps, s: BanalSettings, o?: EnsureOptions): Result<Installed, BanalFailure>;
87
95
  /** `--check`: is the pinned banal installed and running? The same predicate as `ensureBanal`, no download. */
88
96
  export declare function checkBanal(d: BanalDeps, s: BanalSettings, source?: BanalSource): Result<PinnedBanal, BanalFailure>;
97
+ export {};
89
98
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC,CAAC;AAsBN;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,YAAY,CAed;AAsDD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,CAAC,GAAE,aAAkB,GACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAajC;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,MAAM,GAAE,WAAuB,GAC9B,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAYnC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC,CAAC;AAyBN;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,YAAY,CAed;AAgBD,QAAA,MAAM,MAAM,eAAwB,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAqCvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,CAAC,GAAE,aAAkB,GACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAajC;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,MAAM,GAAE,WAAuB,GAC9B,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAYnC"}
@@ -7,7 +7,10 @@ import { BANAL_PIN, pinLabel } from "./pin.js";
7
7
  import { acceptProbe, PROBE_PAGE } from "./probe.js";
8
8
  /** Seconds: banal is ~90 KB. */
9
9
  export const BANAL_DOWNLOAD_SECONDS = 60;
10
- /** Run `banal` on `pages` in a scratch directory that is gone when this returns. */
10
+ /**
11
+ * Run `banal` on `pages` in a scratch directory that is gone when this returns. It needs the path
12
+ * only: `measureGeometry` passes the banal `pickBanal` located, `probe` the one whose bytes it verified.
13
+ */
11
14
  function runBanal(d, s, banal, pages) {
12
15
  return d.workspace.within("paperlint-banal-", (scratch) => parseBanalOutput(d.run.run(banalCommand(banal, stage(scratch, stageBanalInput(pages)), s.processEnv))));
13
16
  }
@@ -40,15 +43,16 @@ function perlRuns(d, s) {
40
43
  });
41
44
  return r.kind === "exited" && r.status === 0;
42
45
  }
46
+ // Not exported: only `probe` below can write the property, so only it can make a PinnedBanal.
47
+ const PINNED = Symbol("PinnedBanal");
43
48
  /**
44
49
  * Does the installed, pin-verified banal RUN — accepted by measuring the probe page, not by a
45
50
  * download's exit code. The one place a `PinnedBanal` is minted; callers verified the bytes first.
46
51
  */
47
52
  function probe(d, s, path) {
48
- const at = { path, provenance: { kind: "cache" } };
49
- const r = andThen(runBanal(d, s, at, [PROBE_PAGE]), acceptProbe);
53
+ const r = andThen(runBanal(d, s, { path }, [PROBE_PAGE]), acceptProbe);
50
54
  return r.ok
51
- ? ok(at)
55
+ ? ok({ path, provenance: { kind: "cache" }, [PINNED]: true })
52
56
  : err({ kind: "does-not-run", path, why: r.error });
53
57
  }
54
58
  /** Download `source` into `dest`, keeping the bytes only when they hash to the pin. */