blume 2.1.2 → 2.2.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 (377) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +133 -0
  3. package/README.md +4 -4
  4. package/dist/cli/{chunk-74wfhv79.js → chunk-05f21r8h.js} +1 -1
  5. package/dist/cli/{chunk-9qzgg6mj.js → chunk-1cm0h819.js} +3 -3
  6. package/dist/cli/{chunk-nbyvgnnm.js → chunk-1rkxzg3n.js} +104 -47
  7. package/dist/cli/chunk-1rkxzg3n.js.map +36 -0
  8. package/dist/cli/{chunk-desvm72z.js → chunk-2nr29y95.js} +22 -26
  9. package/dist/cli/chunk-2nr29y95.js.map +13 -0
  10. package/dist/cli/{chunk-32khwcb6.js → chunk-49r370mb.js} +42 -69
  11. package/dist/cli/{chunk-32khwcb6.js.map → chunk-49r370mb.js.map} +9 -10
  12. package/dist/cli/{chunk-ms9z66nz.js → chunk-4rftmttv.js} +2 -2
  13. package/dist/cli/{chunk-s0bdnc7v.js → chunk-79bzzkx4.js} +5 -4
  14. package/dist/cli/chunk-79bzzkx4.js.map +10 -0
  15. package/dist/cli/{chunk-hvcxng5f.js → chunk-7tekknev.js} +6 -6
  16. package/dist/cli/{chunk-dv2z0rzf.js → chunk-8b489v1b.js} +38 -13
  17. package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-8b489v1b.js.map} +5 -4
  18. package/dist/cli/{chunk-0pmb4tr4.js → chunk-8f8xw4x2.js} +1195 -222
  19. package/dist/cli/chunk-8f8xw4x2.js.map +44 -0
  20. package/dist/cli/chunk-96snx8yy.js +329 -0
  21. package/dist/cli/chunk-96snx8yy.js.map +13 -0
  22. package/dist/cli/{chunk-ckrcm08h.js → chunk-a3ydrqny.js} +48 -62
  23. package/dist/cli/{chunk-ckrcm08h.js.map → chunk-a3ydrqny.js.map} +4 -5
  24. package/dist/cli/{chunk-bxwhtvw8.js → chunk-ahc5gc9h.js} +5 -5
  25. package/dist/cli/{chunk-dpy8qdjf.js → chunk-as09pafp.js} +73 -182
  26. package/dist/cli/chunk-as09pafp.js.map +18 -0
  27. package/dist/cli/{chunk-tfycddbt.js → chunk-bjk964fp.js} +2 -2
  28. package/dist/cli/{chunk-gfc5fqvf.js → chunk-br0n8n3e.js} +18 -18
  29. package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-br0n8n3e.js.map} +1 -1
  30. package/dist/cli/{chunk-297ajdcv.js → chunk-c69tw29j.js} +6 -6
  31. package/dist/cli/{chunk-297ajdcv.js.map → chunk-c69tw29j.js.map} +3 -3
  32. package/dist/cli/chunk-cn3dy3hz.js +146 -0
  33. package/dist/cli/chunk-cn3dy3hz.js.map +11 -0
  34. package/dist/cli/{chunk-124fvmzq.js → chunk-dm4mg9bj.js} +11064 -8742
  35. package/dist/cli/{chunk-124fvmzq.js.map → chunk-dm4mg9bj.js.map} +78 -64
  36. package/dist/cli/{chunk-dqhg54mr.js → chunk-dmx6cezx.js} +1 -1
  37. package/dist/cli/{chunk-60hz265r.js → chunk-dpcahcrb.js} +24 -11
  38. package/dist/cli/chunk-dpcahcrb.js.map +10 -0
  39. package/dist/cli/{chunk-a57yh0h9.js → chunk-dyk3r7jw.js} +7 -7
  40. package/dist/cli/{chunk-a57yh0h9.js.map → chunk-dyk3r7jw.js.map} +1 -1
  41. package/dist/cli/{chunk-twy7psdz.js → chunk-enk76qd5.js} +14 -10
  42. package/dist/cli/chunk-enk76qd5.js.map +10 -0
  43. package/dist/cli/{chunk-k3gr1nm9.js → chunk-fqy4n3q2.js} +13 -16
  44. package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-fqy4n3q2.js.map} +3 -3
  45. package/dist/cli/{chunk-sc93apfs.js → chunk-frk2wdq1.js} +17 -17
  46. package/dist/cli/{chunk-sc93apfs.js.map → chunk-frk2wdq1.js.map} +2 -2
  47. package/dist/cli/{chunk-kdpzw38a.js → chunk-gprwej7h.js} +95 -7
  48. package/dist/cli/chunk-gprwej7h.js.map +11 -0
  49. package/dist/cli/chunk-kkrteb15.js +157 -0
  50. package/dist/cli/chunk-kkrteb15.js.map +10 -0
  51. package/dist/cli/{chunk-ave1wcbr.js → chunk-m9bp2hc1.js} +1 -1
  52. package/dist/cli/{chunk-58bt3hag.js → chunk-mrvh4c88.js} +4 -4
  53. package/dist/cli/{chunk-5cmts6dv.js → chunk-p8zg3a2h.js} +7 -7
  54. package/dist/cli/{chunk-5cmts6dv.js.map → chunk-p8zg3a2h.js.map} +1 -1
  55. package/dist/cli/{chunk-0w6hs479.js → chunk-rkqae7kh.js} +30 -18
  56. package/dist/cli/chunk-rkqae7kh.js.map +10 -0
  57. package/dist/cli/{chunk-bqxaqn5p.js → chunk-t5xx74rd.js} +8 -8
  58. package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-t5xx74rd.js.map} +1 -1
  59. package/dist/cli/{chunk-1f882900.js → chunk-th0pgaj5.js} +2 -2
  60. package/dist/cli/{chunk-dhwtqnnd.js → chunk-vnbvhgmd.js} +2 -2
  61. package/dist/cli/{chunk-gxtg6ed2.js → chunk-vzy9rh6y.js} +21 -21
  62. package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-vzy9rh6y.js.map} +3 -3
  63. package/dist/cli/{chunk-j1x92mx9.js → chunk-w6e455pz.js} +1 -1
  64. package/dist/cli/chunk-wehv26ry.js +155 -0
  65. package/dist/cli/chunk-wehv26ry.js.map +11 -0
  66. package/dist/cli/{chunk-y4msrwm9.js → chunk-xgq4eytj.js} +15 -15
  67. package/dist/cli/{chunk-36bxs9c7.js → chunk-xt0qvz1t.js} +27 -23
  68. package/dist/cli/chunk-xt0qvz1t.js.map +10 -0
  69. package/dist/cli/index.js +78 -42
  70. package/dist/cli/index.js.map +7 -6
  71. package/dist/types/ai/changelog-components.d.ts +18 -0
  72. package/dist/types/ai/changelog-markdown.d.ts +12 -0
  73. package/dist/types/ai/openapi-components.d.ts +7 -7
  74. package/dist/types/ai/operation-details.d.ts +39 -0
  75. package/dist/types/ai/relative-links.d.ts +3 -1
  76. package/dist/types/ai/serializers.d.ts +6 -4
  77. package/dist/types/analytics/head.d.ts +4 -2
  78. package/dist/types/analytics/script.d.ts +8 -2
  79. package/dist/types/components/content/youtube.d.ts +20 -0
  80. package/dist/types/components/layout/nav-utils.d.ts +8 -0
  81. package/dist/types/components/openapi/example-panels.d.ts +33 -0
  82. package/dist/types/components/openapi/helpers.d.ts +53 -11
  83. package/dist/types/components/openapi/snippets.d.ts +7 -1
  84. package/dist/types/core/alert-diagnostics.d.ts +10 -0
  85. package/dist/types/core/builtin-tags.d.ts +16 -0
  86. package/dist/types/core/changelog-list.d.ts +48 -0
  87. package/dist/types/core/closest-match.d.ts +6 -0
  88. package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
  89. package/dist/types/core/code-fences.d.ts +8 -1
  90. package/dist/types/core/config-input.d.ts +1 -1
  91. package/dist/types/core/content-assets.d.ts +16 -18
  92. package/dist/types/core/diagnostics.d.ts +14 -0
  93. package/dist/types/core/directive-diagnostics.d.ts +22 -8
  94. package/dist/types/core/former-routes.d.ts +14 -0
  95. package/dist/types/core/github.d.ts +5 -4
  96. package/dist/types/core/heading-markers.d.ts +65 -2
  97. package/dist/types/core/hidden-pages.d.ts +3 -0
  98. package/dist/types/core/includes.d.ts +23 -0
  99. package/dist/types/core/last-modified.d.ts +18 -6
  100. package/dist/types/core/links.d.ts +42 -2
  101. package/dist/types/core/load-module.d.ts +19 -4
  102. package/dist/types/core/manifest.d.ts +14 -1
  103. package/dist/types/core/markdown-mirrors.d.ts +22 -0
  104. package/dist/types/core/mdx-elements.d.ts +32 -0
  105. package/dist/types/core/mdx-syntax.d.ts +100 -0
  106. package/dist/types/core/meta-diagnostics.d.ts +7 -0
  107. package/dist/types/core/meta.d.ts +32 -5
  108. package/dist/types/core/nav-diagnostics.d.ts +9 -2
  109. package/dist/types/core/navigation.d.ts +13 -0
  110. package/dist/types/core/ordering-prefix.d.ts +6 -0
  111. package/dist/types/core/pinned-ids.d.ts +23 -0
  112. package/dist/types/core/project-graph.d.ts +9 -1
  113. package/dist/types/core/redirect-patterns.d.ts +18 -0
  114. package/dist/types/core/relative-files.d.ts +31 -0
  115. package/dist/types/core/schema.d.ts +267 -7
  116. package/dist/types/core/sources/normalize.d.ts +101 -9
  117. package/dist/types/core/sources/types.d.ts +16 -0
  118. package/dist/types/core/static-files.d.ts +10 -0
  119. package/dist/types/core/static-host.d.ts +42 -0
  120. package/dist/types/core/svg-images.d.ts +26 -0
  121. package/dist/types/core/syntax-diagnostics.d.ts +14 -0
  122. package/dist/types/core/types.d.ts +42 -1
  123. package/dist/types/deploy/generated-files.d.ts +41 -0
  124. package/dist/types/deploy/redirects.d.ts +21 -7
  125. package/dist/types/markdown/code-title.d.ts +9 -5
  126. package/dist/types/markdown/directives.d.ts +8 -0
  127. package/dist/types/markdown/fence-language.d.ts +51 -0
  128. package/dist/types/markdown/fence-meta.d.ts +5 -0
  129. package/dist/types/markdown/github-alerts.d.ts +35 -0
  130. package/dist/types/openapi/asyncapi.d.ts +6 -5
  131. package/dist/types/openapi/checks.d.ts +10 -5
  132. package/dist/types/openapi/model.d.ts +55 -8
  133. package/dist/types/openapi/parse.d.ts +4 -1
  134. package/dist/types/sources/filesystem.d.ts +14 -4
  135. package/dist/types/sources/mdx-remote.d.ts +6 -3
  136. package/dist/types/sources/registry.d.ts +3 -3
  137. package/dist/types/theme/color.d.ts +33 -0
  138. package/dist/types/theme/palette.d.ts +122 -0
  139. package/docs/01-quickstart.mdx +1 -1
  140. package/docs/02-deployment.mdx +23 -8
  141. package/docs/04-migrating.mdx +16 -4
  142. package/docs/advanced/changelog.mdx +27 -1
  143. package/docs/advanced/skills.mdx +1 -1
  144. package/docs/cli/audit.mdx +1 -1
  145. package/docs/cli/doctor.mdx +2 -2
  146. package/docs/cli/evals.mdx +1 -1
  147. package/docs/cli/index.mdx +4 -2
  148. package/docs/cli/validate.mdx +10 -7
  149. package/docs/configuration/analytics.mdx +2 -0
  150. package/docs/configuration/customization.mdx +3 -1
  151. package/docs/configuration/index.mdx +2 -2
  152. package/docs/configuration/theming.mdx +5 -1
  153. package/docs/content/components.mdx +26 -6
  154. package/docs/content/frontmatter.mdx +1 -1
  155. package/docs/content/includes.mdx +6 -2
  156. package/docs/content/index.mdx +11 -1
  157. package/docs/content/islands.mdx +2 -0
  158. package/docs/content/meta.mdx +9 -3
  159. package/docs/content/navigation.mdx +14 -6
  160. package/docs/content/sources/obsidian.mdx +1 -1
  161. package/docs/content/sources/remote-mdx.mdx +3 -1
  162. package/docs/content/syntax.mdx +76 -8
  163. package/docs/content/variables.mdx +3 -1
  164. package/docs/discoverability/agent-discovery.mdx +1 -1
  165. package/docs/discoverability/json-api.mdx +1 -1
  166. package/docs/discoverability/llms-txt.mdx +1 -1
  167. package/docs/discoverability/markdown.mdx +2 -2
  168. package/docs/discoverability/open-graph.mdx +1 -1
  169. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  170. package/docs/references/graphql.mdx +2 -0
  171. package/docs/references/openapi.mdx +45 -7
  172. package/package.json +10 -9
  173. package/skills/blume/SKILL.md +2 -2
  174. package/skills/blume-migrate/SKILL.md +49 -27
  175. package/skills/blume-migrate/references/docsify.md +262 -0
  176. package/skills/blume-migrate/references/docus.md +298 -0
  177. package/skills/blume-migrate/references/docusaurus.md +3 -3
  178. package/skills/blume-migrate/references/fern.md +327 -0
  179. package/skills/blume-migrate/references/fumadocs.md +1 -1
  180. package/skills/blume-migrate/references/gitbook.md +267 -0
  181. package/skills/blume-migrate/references/github-wiki.md +259 -0
  182. package/skills/blume-migrate/references/jekyll.md +253 -0
  183. package/skills/blume-migrate/references/mdbook.md +256 -0
  184. package/skills/blume-migrate/references/mintlify.md +5 -5
  185. package/skills/blume-migrate/references/mkdocs.md +236 -0
  186. package/skills/blume-migrate/references/monorepo.md +20 -8
  187. package/skills/blume-migrate/references/nextra.md +2 -2
  188. package/skills/blume-migrate/references/readme.md +257 -0
  189. package/skills/blume-migrate/references/redocly.md +198 -0
  190. package/skills/blume-migrate/references/starlight.md +3 -3
  191. package/skills/blume-migrate/references/vitepress.md +204 -0
  192. package/skills/blume-migrate/references/vuepress.md +271 -0
  193. package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
  194. package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
  195. package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
  196. package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
  197. package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
  198. package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
  199. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
  200. package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
  201. package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
  202. package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
  203. package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
  204. package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
  205. package/src/ai/changelog-components.ts +24 -0
  206. package/src/ai/changelog-markdown.ts +45 -41
  207. package/src/ai/component-markdown.ts +22 -9
  208. package/src/ai/llms.ts +36 -5
  209. package/src/ai/markdown.ts +2 -2
  210. package/src/ai/openapi-components.ts +25 -9
  211. package/src/ai/operation-details.ts +208 -0
  212. package/src/ai/relative-links.ts +48 -8
  213. package/src/ai/serializers.ts +7 -6
  214. package/src/ai/site-skill.ts +6 -2
  215. package/src/analytics/head.ts +11 -5
  216. package/src/analytics/script.ts +13 -3
  217. package/src/astro/generate.ts +32 -6
  218. package/src/astro/index.ts +1 -0
  219. package/src/astro/integration.ts +27 -1
  220. package/src/astro/mdx-source-errors.ts +46 -0
  221. package/src/astro/templates.ts +89 -185
  222. package/src/audit/checks/redirects.ts +5 -1
  223. package/src/audit/redirects.ts +36 -19
  224. package/src/audit/report.ts +22 -9
  225. package/src/audit/run.ts +12 -28
  226. package/src/audit/terms.ts +23 -0
  227. package/src/audit/url.ts +2 -2
  228. package/src/cli/build-failure.ts +256 -7
  229. package/src/cli/command-meta.ts +1 -1
  230. package/src/cli/commands/audit.ts +1 -1
  231. package/src/cli/commands/build.ts +12 -3
  232. package/src/cli/commands/check.ts +13 -2
  233. package/src/cli/commands/dev.ts +1 -1
  234. package/src/cli/commands/doctor.ts +4 -2
  235. package/src/cli/commands/init.ts +3 -3
  236. package/src/cli/commands/preview.ts +17 -1
  237. package/src/cli/commands/validate.ts +22 -10
  238. package/src/cli/prepare.ts +1 -1
  239. package/src/cli/preview-pages.ts +161 -0
  240. package/src/cli/unknown-flags.ts +1 -42
  241. package/src/components/code-copy.ts +51 -0
  242. package/src/components/code-language.ts +75 -0
  243. package/src/components/content/AccordionItem.astro +16 -1
  244. package/src/components/content/Callout.astro +11 -1
  245. package/src/components/content/Changelog.astro +189 -0
  246. package/src/components/content/CodeBlock.astro +8 -11
  247. package/src/components/content/Tabs.astro +16 -2
  248. package/src/components/content/YouTube.astro +6 -4
  249. package/src/components/content/code-block.ts +33 -0
  250. package/src/components/content/content-strings.ts +5 -1
  251. package/src/components/content/inline-markdown.ts +35 -8
  252. package/src/components/content/youtube.ts +49 -7
  253. package/src/components/layout/Analytics.astro +5 -1
  254. package/src/components/layout/NavTree.astro +8 -3
  255. package/src/components/layout/RootLayout.astro +18 -31
  256. package/src/components/layout/nav-utils.ts +14 -0
  257. package/src/components/layout/search/pagefind.ts +2 -1
  258. package/src/components/openapi/Operation.astro +4 -0
  259. package/src/components/openapi/PanelTabs.astro +9 -3
  260. package/src/components/openapi/RequestBody.astro +42 -8
  261. package/src/components/openapi/RequestPanel.astro +34 -53
  262. package/src/components/openapi/example-panels.ts +110 -0
  263. package/src/components/openapi/helpers.ts +195 -20
  264. package/src/components/openapi/operation-model.ts +63 -26
  265. package/src/components/openapi/request.ts +13 -0
  266. package/src/components/openapi/snippets.ts +14 -2
  267. package/src/core/alert-diagnostics.ts +89 -0
  268. package/src/core/builtin-tags.ts +76 -0
  269. package/src/core/changelog-list.ts +87 -0
  270. package/src/core/closest-match.ts +41 -0
  271. package/src/core/code-fence-diagnostics.ts +267 -0
  272. package/src/core/code-fences.ts +43 -7
  273. package/src/core/component-diagnostics.ts +65 -12
  274. package/src/core/config-input.ts +1 -1
  275. package/src/core/config.ts +46 -1
  276. package/src/core/content-assets.ts +64 -144
  277. package/src/core/diagnostics.ts +36 -3
  278. package/src/core/directive-diagnostics.ts +265 -47
  279. package/src/core/former-routes.ts +46 -0
  280. package/src/core/git-ignored.ts +53 -0
  281. package/src/core/github.ts +5 -4
  282. package/src/core/heading-markers.ts +156 -2
  283. package/src/core/hidden-pages.ts +64 -0
  284. package/src/core/includes.ts +181 -41
  285. package/src/core/last-modified.ts +47 -10
  286. package/src/core/links.ts +438 -83
  287. package/src/core/load-module.ts +98 -9
  288. package/src/core/manifest.ts +12 -9
  289. package/src/core/markdown-mirrors.ts +52 -0
  290. package/src/core/mdx-elements.ts +153 -0
  291. package/src/core/mdx-syntax.ts +377 -0
  292. package/src/core/meta-diagnostics.ts +134 -0
  293. package/src/core/meta.ts +154 -55
  294. package/src/core/nav-diagnostics.ts +16 -4
  295. package/src/core/navigation.ts +70 -10
  296. package/src/core/ordering-prefix.ts +22 -2
  297. package/src/core/pinned-ids.ts +141 -0
  298. package/src/core/project-graph.ts +221 -29
  299. package/src/core/redirect-patterns.ts +41 -0
  300. package/src/core/relative-files.ts +145 -0
  301. package/src/core/schema.ts +17 -3
  302. package/src/core/sources/mdx-remote.ts +75 -14
  303. package/src/core/sources/normalize.ts +885 -179
  304. package/src/core/sources/notion.ts +5 -4
  305. package/src/core/sources/obsidian.ts +2 -5
  306. package/src/core/sources/types.ts +17 -0
  307. package/src/core/static-files.ts +40 -0
  308. package/src/core/static-host.ts +125 -0
  309. package/src/core/svg-images.ts +98 -0
  310. package/src/core/syntax-diagnostics.ts +491 -0
  311. package/src/core/types.ts +43 -1
  312. package/src/deploy/artifacts.ts +2 -28
  313. package/src/deploy/generated-files.ts +128 -0
  314. package/src/deploy/platforms/vercel.ts +25 -1
  315. package/src/deploy/redirects.ts +43 -16
  316. package/src/deploy/sitemap.ts +2 -1
  317. package/src/markdown/base-links.ts +87 -6
  318. package/src/markdown/code-title.ts +29 -13
  319. package/src/markdown/content-assets.ts +210 -0
  320. package/src/markdown/directives.ts +69 -5
  321. package/src/markdown/fence-language.ts +106 -0
  322. package/src/markdown/fence-meta.ts +42 -0
  323. package/src/markdown/github-alerts.ts +172 -0
  324. package/src/markdown/heading-anchors.ts +265 -56
  325. package/src/markdown/include.ts +30 -3
  326. package/src/markdown/index.ts +145 -40
  327. package/src/markdown/prompt-text.ts +95 -0
  328. package/src/markdown/relative-links.ts +37 -2
  329. package/src/markdown/route-snapshot.ts +22 -12
  330. package/src/markdown/svg-fallback.ts +51 -0
  331. package/src/markdown/title-heading.ts +134 -0
  332. package/src/migrate/migrate.ts +127 -2
  333. package/src/og/card.ts +14 -4
  334. package/src/openapi/asyncapi.ts +14 -6
  335. package/src/openapi/checks.ts +160 -15
  336. package/src/openapi/model.ts +172 -33
  337. package/src/openapi/parse.ts +13 -4
  338. package/src/openapi/render-mdx.ts +55 -9
  339. package/src/openapi/source.ts +87 -6
  340. package/src/registry/eject.ts +0 -1
  341. package/src/search/documents.ts +10 -2
  342. package/src/sources/filesystem.ts +28 -3
  343. package/src/sources/mdx-remote.ts +7 -15
  344. package/src/theme/color.ts +14 -0
  345. package/src/theme/entry.ts +22 -1
  346. package/src/theme/palette.ts +74 -1
  347. package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
  348. package/dist/cli/chunk-0w6hs479.js.map +0 -10
  349. package/dist/cli/chunk-150jk7km.js +0 -52
  350. package/dist/cli/chunk-150jk7km.js.map +0 -10
  351. package/dist/cli/chunk-36bxs9c7.js.map +0 -10
  352. package/dist/cli/chunk-53jqw8z0.js +0 -89
  353. package/dist/cli/chunk-53jqw8z0.js.map +0 -10
  354. package/dist/cli/chunk-60hz265r.js.map +0 -10
  355. package/dist/cli/chunk-desvm72z.js.map +0 -14
  356. package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
  357. package/dist/cli/chunk-es8h0v3j.js +0 -441
  358. package/dist/cli/chunk-es8h0v3j.js.map +0 -11
  359. package/dist/cli/chunk-kdpzw38a.js.map +0 -11
  360. package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
  361. package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
  362. package/dist/cli/chunk-twy7psdz.js.map +0 -10
  363. package/dist/cli/chunk-ydp3065p.js +0 -64
  364. package/dist/cli/chunk-ydp3065p.js.map +0 -10
  365. /package/dist/cli/{chunk-74wfhv79.js.map → chunk-05f21r8h.js.map} +0 -0
  366. /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-1cm0h819.js.map} +0 -0
  367. /package/dist/cli/{chunk-ms9z66nz.js.map → chunk-4rftmttv.js.map} +0 -0
  368. /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-7tekknev.js.map} +0 -0
  369. /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-ahc5gc9h.js.map} +0 -0
  370. /package/dist/cli/{chunk-tfycddbt.js.map → chunk-bjk964fp.js.map} +0 -0
  371. /package/dist/cli/{chunk-dqhg54mr.js.map → chunk-dmx6cezx.js.map} +0 -0
  372. /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-m9bp2hc1.js.map} +0 -0
  373. /package/dist/cli/{chunk-58bt3hag.js.map → chunk-mrvh4c88.js.map} +0 -0
  374. /package/dist/cli/{chunk-1f882900.js.map → chunk-th0pgaj5.js.map} +0 -0
  375. /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-vnbvhgmd.js.map} +0 -0
  376. /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-w6e455pz.js.map} +0 -0
  377. /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-xgq4eytj.js.map} +0 -0
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli/index.ts", "../src/core/version.ts", "../src/core/package-root.ts", "../src/cli/command-meta.ts", "../src/cli/env.ts", "../src/cli/host-args.ts", "../src/cli/internal-error.ts", "../src/core/diagnostics.ts", "../src/cli/log.ts", "../src/cli/unknown-flags.ts", "../src/cli/lazy-command.ts"],
3
+ "sources": ["../src/cli/index.ts", "../src/core/version.ts", "../src/core/package-root.ts", "../src/cli/command-meta.ts", "../src/cli/env.ts", "../src/cli/host-args.ts", "../src/cli/internal-error.ts", "../src/core/diagnostics.ts", "../src/cli/log.ts", "../src/core/closest-match.ts", "../src/cli/unknown-flags.ts", "../src/cli/lazy-command.ts"],
4
4
  "sourcesContent": [
5
5
  "import { defineCommand, runMain } from \"citty\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\nimport { commandMeta } from \"./command-meta.ts\";\nimport { loadEnvFiles } from \"./env.ts\";\nimport { normalizeHostArgs } from \"./host-args.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { lazyCommand } from \"./lazy-command.ts\";\n// consola reads CONSOLA_LEVEL / NODE_ENV / TEST / CI / DEBUG when its module\n// evaluates. Import the logger here, ahead of `loadEnvFiles`, so those values\n// come from the real environment — never from a project `.env`, which would\n// otherwise silence or restyle every command's output. The commands are loaded\n// lazily below, so without this line consola would first evaluate after `.env`\n// had been applied.\nimport \"./log.ts\";\n\nconst main = defineCommand({\n meta: {\n description: \"The open-source docs framework for humans and agents.\",\n name: \"blume\",\n version: getBlumeVersion(),\n },\n subCommands: {\n add: lazyCommand(\n commandMeta.add,\n () => import(\"./commands/add.ts\"),\n \"addCommand\"\n ),\n audit: lazyCommand(\n commandMeta.audit,\n () => import(\"./commands/audit.ts\"),\n \"auditCommand\"\n ),\n build: lazyCommand(\n commandMeta.build,\n () => import(\"./commands/build.ts\"),\n \"buildCommand\"\n ),\n check: lazyCommand(\n commandMeta.check,\n () => import(\"./commands/check.ts\"),\n \"checkCommand\"\n ),\n dev: lazyCommand(\n commandMeta.dev,\n () => import(\"./commands/dev.ts\"),\n \"devCommand\"\n ),\n doctor: lazyCommand(\n commandMeta.doctor,\n () => import(\"./commands/doctor.ts\"),\n \"doctorCommand\"\n ),\n eject: lazyCommand(\n commandMeta.eject,\n () => import(\"./commands/eject.ts\"),\n \"ejectCommand\"\n ),\n eval: lazyCommand(\n commandMeta.eval,\n () => import(\"./commands/eval.ts\"),\n \"evalCommand\"\n ),\n init: lazyCommand(\n commandMeta.init,\n () => import(\"./commands/init.ts\"),\n \"initCommand\"\n ),\n \"mcp-stdio\": lazyCommand(\n commandMeta[\"mcp-stdio\"],\n () => import(\"./commands/mcp-stdio.ts\"),\n \"mcpStdioCommand\"\n ),\n migrate: lazyCommand(\n commandMeta.migrate,\n () => import(\"./commands/migrate.ts\"),\n \"migrateCommand\"\n ),\n preview: lazyCommand(\n commandMeta.preview,\n () => import(\"./commands/preview.ts\"),\n \"previewCommand\"\n ),\n skill: lazyCommand(\n commandMeta.skill,\n () => import(\"./commands/skill.ts\"),\n \"skillCommand\"\n ),\n sync: lazyCommand(\n commandMeta.sync,\n () => import(\"./commands/sync.ts\"),\n \"syncCommand\"\n ),\n translate: lazyCommand(\n commandMeta.translate,\n () => import(\"./commands/translate.ts\"),\n \"translateCommand\"\n ),\n upgrade: lazyCommand(\n commandMeta.upgrade,\n () => import(\"./commands/upgrade.ts\"),\n \"upgradeCommand\"\n ),\n validate: lazyCommand(\n commandMeta.validate,\n () => import(\"./commands/validate.ts\"),\n \"validateCommand\"\n ),\n version: lazyCommand(\n commandMeta.version,\n () => import(\"./commands/version.ts\"),\n \"versionCommand\"\n ),\n },\n});\n\nloadEnvFiles(process.cwd());\n\nprocess.on(\"uncaughtException\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\nprocess.on(\"unhandledRejection\", (error) => {\n reportInternalError(error);\n process.exit(1);\n});\n\nrunMain(main, { rawArgs: normalizeHostArgs(process.argv.slice(2)) });\n",
6
6
  "import { readFileSync } from \"node:fs\";\n\nimport { join } from \"pathe\";\n\nimport { packageRoot } from \"./package-root.ts\";\n\nlet cached: string | undefined;\n\n/**\n * The installed Blume package version, read lazily from its `package.json`.\n *\n * Computed on demand (not at module load) so importing the `blume` barrel has no\n * filesystem side effect, and anchored at the package root so it resolves the\n * same whether running from source or the bundled CLI.\n */\nexport const getBlumeVersion = (): string => {\n if (cached === undefined) {\n const pkgPath = join(packageRoot(), \"package.json\");\n // SAFETY: this reads blume's own package.json, which always declares a\n // `version` (publishing requires it).\n cached = (JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string })\n .version;\n }\n return cached;\n};\n",
7
7
  "import { existsSync } from \"node:fs\";\n\nimport { dirname, join } from \"pathe\";\n\n/**\n * Walk up from `start` until a directory containing a `package.json` is found.\n *\n * Exported for testing; call sites should use {@link packageRoot}.\n */\nexport const findPackageRoot = (start: string): string => {\n let dir = start;\n while (!existsSync(join(dir, \"package.json\"))) {\n const parent = dirname(dir);\n if (parent === dir) {\n throw new Error(\"blume: unable to locate the package root\");\n }\n dir = parent;\n }\n return dir;\n};\n\nlet cached: string | undefined;\n\n/**\n * Absolute path to the installed Blume package root (the directory holding its\n * `package.json`), found by walking up from this module.\n *\n * Anchoring here — rather than at a fixed offset from `import.meta` — keeps the\n * package's own `src/`, assets, and `node_modules` locatable whether the code\n * runs from source under Bun (`src/...`) or from the published, bundled CLI\n * (`dist/cli/*.js`). The two layouts sit at different depths, so a relative\n * `../..` resolves to different places; locating `package.json` does not.\n */\nexport const packageRoot = (): string => {\n cached ??= findPackageRoot(import.meta.dirname);\n return cached;\n};\n",
8
- "import type { CommandMeta } from \"citty\";\n\n/**\n * Every command's `meta`, held apart from the command modules themselves.\n *\n * The CLI entry loads each command lazily (see `lazy-command.ts`), but citty\n * still reads every subcommand's `meta` to render `blume --help` and to match\n * an unknown name against aliases. Keeping that table here lets those paths\n * run without importing a single command module — `dev` alone drags in Astro,\n * `mcp-stdio` the MCP SDK. The command modules read their `meta` from this\n * table too, so the entry and the command can't drift.\n */\nexport const commandMeta = {\n add: {\n description: \"Install a source component or template from the registry.\",\n name: \"add\",\n },\n audit: {\n description: \"Audit the built site for SEO and site-health issues.\",\n name: \"audit\",\n },\n build: {\n description: \"Build the docs site for production.\",\n name: \"build\",\n },\n check: {\n description: \"Type-check the docs site with astro check.\",\n name: \"check\",\n },\n dev: {\n description: \"Start the Blume development server.\",\n name: \"dev\",\n },\n doctor: {\n description: \"Diagnose common configuration and content problems.\",\n name: \"doctor\",\n },\n eject: {\n description: \"Promote the generated runtime into an owned Astro project.\",\n name: \"eject\",\n },\n eval: {\n description:\n \"Test the docs: an agent answers your questions using only the documentation.\",\n name: \"eval\",\n },\n init: {\n description: \"Scaffold a minimal Blume project.\",\n name: \"init\",\n },\n \"mcp-stdio\": {\n description:\n \"Serve an MCP data snapshot over stdio (internal, used by `blume eval`).\",\n name: \"mcp-stdio\",\n },\n migrate: {\n description:\n \"Migrate a docs site from Mintlify, Fumadocs, Docusaurus, Starlight, or Nextra with a coding agent.\",\n name: \"migrate\",\n },\n preview: {\n description: \"Preview the last production build.\",\n name: \"preview\",\n },\n skill: {\n description:\n \"Write the docs site's agent skill with a coding agent, in place of the generated one.\",\n name: \"skill\",\n },\n sync: {\n description: \"Re-fetch remote content sources and regenerate the runtime.\",\n name: \"sync\",\n },\n translate: {\n description:\n \"Translate docs into the configured locales with a local agent CLI.\",\n name: \"translate\",\n },\n upgrade: {\n description:\n \"Upgrade to this version of Blume: bump the dependency and list the config changes left.\",\n name: \"upgrade\",\n },\n validate: {\n description: \"Validate internal, anchor, asset, and external links.\",\n name: \"validate\",\n },\n version: {\n description: \"Freeze the current docs as an archived version.\",\n name: \"version\",\n },\n} satisfies Record<string, CommandMeta>;\n",
8
+ "import type { CommandMeta } from \"citty\";\n\n/**\n * Every command's `meta`, held apart from the command modules themselves.\n *\n * The CLI entry loads each command lazily (see `lazy-command.ts`), but citty\n * still reads every subcommand's `meta` to render `blume --help` and to match\n * an unknown name against aliases. Keeping that table here lets those paths\n * run without importing a single command module — `dev` alone drags in Astro,\n * `mcp-stdio` the MCP SDK. The command modules read their `meta` from this\n * table too, so the entry and the command can't drift.\n */\nexport const commandMeta = {\n add: {\n description: \"Install a source component or template from the registry.\",\n name: \"add\",\n },\n audit: {\n description: \"Audit the built site for SEO and site-health issues.\",\n name: \"audit\",\n },\n build: {\n description: \"Build the docs site for production.\",\n name: \"build\",\n },\n check: {\n description: \"Type-check the docs site with astro check.\",\n name: \"check\",\n },\n dev: {\n description: \"Start the Blume development server.\",\n name: \"dev\",\n },\n doctor: {\n description: \"Diagnose common configuration and content problems.\",\n name: \"doctor\",\n },\n eject: {\n description: \"Promote the generated runtime into an owned Astro project.\",\n name: \"eject\",\n },\n eval: {\n description:\n \"Test the docs: an agent answers your questions using only the documentation.\",\n name: \"eval\",\n },\n init: {\n description: \"Scaffold a minimal Blume project.\",\n name: \"init\",\n },\n \"mcp-stdio\": {\n description:\n \"Serve an MCP data snapshot over stdio (internal, used by `blume eval`).\",\n name: \"mcp-stdio\",\n },\n migrate: {\n description:\n \"Migrate a docs site from Mintlify, Docusaurus, GitBook, MkDocs, ReadMe, or another framework with a coding agent.\",\n name: \"migrate\",\n },\n preview: {\n description: \"Preview the last production build.\",\n name: \"preview\",\n },\n skill: {\n description:\n \"Write the docs site's agent skill with a coding agent, in place of the generated one.\",\n name: \"skill\",\n },\n sync: {\n description: \"Re-fetch remote content sources and regenerate the runtime.\",\n name: \"sync\",\n },\n translate: {\n description:\n \"Translate docs into the configured locales with a local agent CLI.\",\n name: \"translate\",\n },\n upgrade: {\n description:\n \"Upgrade to this version of Blume: bump the dependency and list the config changes left.\",\n name: \"upgrade\",\n },\n validate: {\n description: \"Validate internal, anchor, asset, and external links.\",\n name: \"validate\",\n },\n version: {\n description: \"Freeze the current docs as an archived version.\",\n name: \"version\",\n },\n} satisfies Record<string, CommandMeta>;\n",
9
9
  "import { existsSync } from \"node:fs\";\n\nimport { config } from \"dotenv\";\nimport { dirname, join, resolve } from \"pathe\";\n\n// Blume's remote sources (GitHub Releases, mdx-remote, Sanity, Notion…) read\n// their tokens from `process.env` during the content scan — which runs before\n// Astro/Vite boots, so Vite's own `.env` loading is too late. This loader fills\n// that gap: it cascades `.env`/`.env.local` from the working dir up to the repo\n// root, so a monorepo can keep one `.env` at the root and every app picks it up.\n\n/**\n * Load `.env`/`.env.local`, cascading from `startDir` up to the repository root\n * (the first ancestor containing a `.git`) or the filesystem root. The ordered\n * path list is handed to dotenv, whose `config` is first-wins, never clobbers\n * existing `process.env` values, and treats unreadable files as best-effort —\n * so shell/CI overrides are never lost, `.env.local` layers over `.env`, and a\n * bad file never aborts a build. dotenv is also the parser Vite runs over\n * these files at build time, so a value means the same thing to the pre-boot\n * content scan and the built site — including multi-line double-quoted values\n * (PEM keys), which a line-based parser silently truncates.\n *\n * `NODE_ENV` is never taken from these files: it picks the mode Vite and Astro\n * run in, so a monorepo root `.env` that sets it for another app would turn\n * every `blume build` into a development build (or `blume dev` into a\n * production one).\n */\nexport const loadEnvFiles = (startDir: string): void => {\n const paths: string[] = [];\n let dir = resolve(startDir);\n let done = false;\n while (!done) {\n paths.push(join(dir, \".env.local\"), join(dir, \".env\"));\n const parent = dirname(dir);\n // Stop at the repo root (nearest `.git`) or the filesystem root.\n done = existsSync(join(dir, \".git\")) || parent === dir;\n dir = parent;\n }\n const loaded: Record<string, string> = {};\n config({ path: paths, processEnv: loaded, quiet: true });\n for (const [key, value] of Object.entries(loaded)) {\n if (key !== \"NODE_ENV\" && process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n};\n",
10
10
  "/**\n * Rewrite a bare `--host` in the raw argv to `--host=` before citty parses it.\n *\n * `host` is a string arg (citty has no mixed string/boolean type), and citty\n * 0.2 parses with `node:util.parseArgs`, where a string option consumes the\n * next token as its value even when that token is another flag: `blume dev\n * --host --open` would bind the literal hostname \"--open\" and drop `--open`.\n * The `--host=` spelling parses as `\"\"` without touching its neighbor, which\n * `normalizeHost` then maps to Astro's \"bind all interfaces\".\n */\nexport const normalizeHostArgs = (rawArgs: readonly string[]): string[] =>\n rawArgs.map((arg, index) => {\n if (arg !== \"--host\") {\n return arg;\n }\n const next = rawArgs[index + 1];\n return next === undefined || next.startsWith(\"-\") ? \"--host=\" : arg;\n });\n\n/**\n * Resolve a `--host` flag value into what Astro/Vite's `server.host` expects.\n * citty has no mixed string/boolean arg type, so `host` is declared as a\n * string and a bare `--host` parses as `\"\"` (`normalizeHostArgs` rewrites it\n * to `--host=` first) — Node would bind all interfaces for `\"\"`, but Vite's\n * `resolveHostname` treats it as a literal hostname and prints malformed URLs\n * like `http://:4321/`. Match Astro's own `--host` semantics instead: bare\n * flag → `true` (bind all interfaces), `--host 10.0.0.1` → that address,\n * absent → `false` (localhost only).\n *\n * Lives beside `normalizeHostArgs` rather than in `commands/dev.ts` so\n * `preview` can share it without importing the whole dev command graph.\n */\nexport const normalizeHost = (host?: string): boolean | string =>\n host === \"\" ? true : (host ?? false);\n",
11
11
  "import { colors } from \"consola/utils\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\n\nconst ISSUES_URL = \"https://github.com/haydenbleasel/blume/issues\";\n\n// Absolute paths into the hidden generated runtime — POSIX (`…/.blume/…`) or\n// Windows drive-letter (`C:\\…\\.blume\\…`) — including any trailing `:line:col`,\n// stopping at whitespace or a closing paren.\nconst BLUME_FRAME =\n /(?<abs>(?:\\/[^\\s()]*\\/|[A-Za-z]:\\\\[^\\s()]*\\\\)\\.blume[/\\\\][^\\s()]*)/gu;\n\n// The separator immediately before `.blume/` (or `.blume\\`) in a matched path.\nconst BLUME_MARKER = /[/\\\\]\\.blume[/\\\\]/u;\n\n/**\n * Rewrite `.blume/` frames in a stack so the generated runtime reads clearly:\n * the machine-absolute prefix is dropped to a project-relative `.blume/…` path\n * and tagged `(generated)`, keeping the reader oriented instead of staring at a\n * long path into a hidden directory. Frames in the user's own source (custom\n * pages keep their real location; wrappers import user files by their real path)\n * are untouched, so the actionable frame stays intact.\n */\nexport const remapBlumeStack = (stack: string): string =>\n stack.replaceAll(BLUME_FRAME, (match) => {\n const marker = match.search(BLUME_MARKER);\n return `${match.slice(marker + 1)} (generated)`;\n });\n\n/**\n * Print an unexpected (non-{@link BlumeError}) failure in a stable, reportable\n * shape instead of a bare stack trace: a fixed `BLUME_INTERNAL` code, the\n * message, a trimmed stack, and an environment dump for bug reports. Callers\n * exit after this — it doesn't exit itself, so it's testable.\n */\n// oxlint-disable-next-line anti-slop/no-unknown-parameters -- last-resort handler for whatever a catch clause caught; anything narrower would force casts at every call site\nexport const reportInternalError = (error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n const lines = [\n `${colors.red(colors.bold(\"BLUME_INTERNAL\"))} An unexpected error occurred.`,\n ` ${err.message}`,\n ];\n\n // A few frames are enough to locate the fault without burying the report;\n // `.blume/` frames are relativized so the hidden runtime reads clearly.\n const stack = remapBlumeStack(err.stack ?? \"\")\n .split(\"\\n\")\n .slice(1, 5)\n .map((line) => line.trim())\n .filter(Boolean);\n if (stack.length > 0) {\n lines.push(\"\", colors.dim(stack.join(\"\\n\")));\n }\n\n lines.push(\n \"\",\n \"This is likely a bug in Blume. Please report it with the details below:\",\n colors.dim(\n [\n ` Blume: ${getBlumeVersion()}`,\n ` Node: ${process.version}`,\n ` Platform: ${process.platform} ${process.arch}`,\n ].join(\"\\n\")\n ),\n ` ${ISSUES_URL}`\n );\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n};\n",
12
- "import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_SOURCES_OBSIDIAN = \"/docs/content/sources/obsidian\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_EXAMPLE_NOT_FOUND: \"/docs/content/components#component\",\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SEARCH_SYNC_FAILED: \"/docs/configuration/search\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_PATH_MISSING: \"/docs/content/sources/remote-mdx\",\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNRESOLVED_LINK: \"/docs/content/sources/contentful\",\n BLUME_SOURCE_UNSUPPORTED_NODE: \"/docs/content/sources/payload\",\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_UNLOADABLE_FILE_NAME: \"/docs/content\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
12
+ "import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_SOURCES_OBSIDIAN = \"/docs/content/sources/obsidian\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\nconst DOCS_OPENAPI_WARNINGS = \"/docs/references/openapi#spec-warnings\";\nconst DOCS_OTHER_TOOLS_SYNTAX = \"/docs/content/syntax#syntax-from-other-tools\";\nconst DOCS_MARKDOWN_AND_MDX = \"/docs/content#markdown-and-mdx\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_REDIRECT: DOCS_CLI_VALIDATE,\n BLUME_CODE_FENCE_OPTION: \"/docs/content/syntax\",\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DIRECTIVE_CLOSING_TEXT: \"/docs/content/syntax\",\n BLUME_DIRECTIVE_OPENING_TEXT: \"/docs/content/syntax\",\n BLUME_DIRECTIVE_SPACED_NAME: \"/docs/content/syntax\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_EXAMPLE_NOT_FOUND: \"/docs/content/components#component\",\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_GRAPHQL_UNKNOWN_CODE_SAMPLE: \"/docs/references/graphql\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDC_SYNTAX: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_MDX_ATTRIBUTE_LIST: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n BLUME_MDX_EVENT_HANDLER: \"/docs/content/islands\",\n BLUME_MDX_SYNTAX: DOCS_MARKDOWN_AND_MDX,\n BLUME_MDX_UNCLOSED_ELEMENT: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_MDX_UNDEFINED_NAME: DOCS_MARKDOWN_AND_MDX,\n BLUME_MD_ATTRIBUTE_LIST: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_MD_CURLY_ANCHOR: \"/docs/content/syntax\",\n BLUME_MD_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_MD_GITHUB_ALERT: \"/docs/content/syntax\",\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_META_OUTSIDE_INCLUDE: \"/docs/content/meta\",\n BLUME_META_UNKNOWN_PAGE: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_OPENAPI_DUPLICATE_OPERATION_ID: DOCS_OPENAPI_WARNINGS,\n BLUME_OPENAPI_LOCAL_SERVER: DOCS_OPENAPI_WARNINGS,\n BLUME_OPENAPI_NULLABLE: DOCS_OPENAPI_WARNINGS,\n BLUME_OPENAPI_UNKNOWN_CODE_SAMPLE:\n \"/docs/references/openapi#code-samples-and-schemas\",\n BLUME_PUBLIC_OPENAPI_JSON: \"/docs/discoverability/json-api\",\n BLUME_SEARCH_SYNC_FAILED: \"/docs/configuration/search\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_PATH_MISSING: \"/docs/content/sources/remote-mdx\",\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNRESOLVED_LINK: \"/docs/content/sources/contentful\",\n BLUME_SOURCE_UNSUPPORTED_NODE: \"/docs/content/sources/payload\",\n BLUME_SVG_UNOPTIMIZED: \"/docs/content/syntax#links-and-images\",\n BLUME_TEMPLATE_TAG: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_THEME_COLOR_INVALID: \"/docs/configuration/theming\",\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_TSCONFIG_EXTENDS: \"/docs/cli#type-checking\",\n BLUME_UNKNOWN_CODE_LANGUAGE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_UNKNOWN_PROP: \"/docs/content/components\",\n BLUME_UNLOADABLE_FILE_NAME: \"/docs/content\",\n BLUME_UNSUPPORTED_LINK_SCHEME: DOCS_CLI_VALIDATE,\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES_OBSIDIAN,\n BLUME_WIKILINK_UNSUPPORTED: DOCS_OTHER_TOOLS_SYNTAX,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nexport const locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
13
13
  "import { consola } from \"consola\";\nimport { relative } from \"pathe\";\n\nimport {\n countBySeverity,\n enrichDiagnostic,\n formatDiagnostic,\n hasErrors,\n} from \"../core/diagnostics.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\nexport const logger = consola.withTag(\"blume\");\n\n/**\n * Resolve once stdout has drained. `process.exit` doesn't flush a piped stdout,\n * so await this before exiting non-zero after writing machine-readable output\n * (e.g. `--json`), otherwise the payload can be truncated in CI.\n */\nexport const flushStdout = (): Promise<void> =>\n // oxlint-disable-next-line promise/avoid-new -- adapt stdout's write callback\n new Promise((resolve) => {\n process.stdout.write(\"\", () => resolve());\n });\n\n/**\n * Print diagnostics as a JSON document on stdout for CI and editors: each is\n * enriched with its `docsUrl` and its `file` made root-relative. Returns whether\n * any were errors, matching {@link reportDiagnostics}.\n */\nexport const reportDiagnosticsJson = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n const enriched = diagnostics.map((diagnostic) => {\n const withDocs = enrichDiagnostic(diagnostic);\n return withDocs.file && root\n ? { ...withDocs, file: relative(root, withDocs.file) }\n : withDocs;\n });\n process.stdout.write(\n `${JSON.stringify(\n { diagnostics: enriched, summary: countBySeverity(diagnostics) },\n null,\n 2\n )}\\n`\n );\n return hasErrors(diagnostics);\n};\n\n/** Print a batch of diagnostics and return whether any were errors. */\nexport const reportDiagnostics = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n if (diagnostics.length === 0) {\n return false;\n }\n\n for (const diagnostic of diagnostics) {\n process.stderr.write(\n `${formatDiagnostic(enrichDiagnostic(diagnostic), root)}\\n`\n );\n }\n\n const counts = countBySeverity(diagnostics);\n const summary = [\n counts.error ? `${counts.error} error(s)` : null,\n counts.warning ? `${counts.warning} warning(s)` : null,\n ]\n .filter(Boolean)\n .join(\", \");\n if (summary) {\n process.stderr.write(`\\n${summary}\\n`);\n }\n\n return hasErrors(diagnostics);\n};\n",
14
- "import type { ArgsDef } from \"citty\";\n\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** A flag the command doesn't declare, with the declared one it most resembles. */\nexport interface UnknownFlag {\n /** The flag as typed, without any `=value`. */\n flag: string;\n /** The closest declared flag (`--isolated` for `--isolatd`), if one is close. */\n suggestion?: string;\n}\n\n/** What a declared option spelling means for the token that follows it. */\ninterface KnownFlag {\n /** Whether it's a boolean switch, which `--no-<name>` turns off. */\n boolean: boolean;\n /**\n * How the flags a command takes list it: `--kebab-name`, or `--no-<name>`\n * for a boolean that's on by default, since that's the form anyone types.\n */\n display: string;\n /** The canonical kebab-case name, which typos are matched against. */\n name: string;\n /** Whether it reads the next token as its value (`--port 4000`). */\n takesValue: boolean;\n}\n\n/** `budgetJs` → `budget-js`; a name already in kebab case is unchanged. */\nconst kebabCase = (name: string): string =>\n name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);\n\n/** `budget-js` → `budgetJs`; a name already in camel case is unchanged. */\nconst camelCase = (name: string): string =>\n name.replaceAll(/-(?<letter>[a-z])/gu, (match) =>\n match.slice(1).toUpperCase()\n );\n\nconst aliasesOf = (alias: string | string[] | undefined): string[] => {\n if (alias === undefined) {\n return [];\n }\n return Array.isArray(alias) ? alias : [alias];\n};\n\n/**\n * Every spelling citty accepts for each declared option — the name, its camel\n * and kebab forms, and its aliases — mapped to what that option is. Positional\n * arguments aren't flags and don't appear.\n */\nconst knownFlags = (argsDef: ArgsDef): Map<string, KnownFlag> => {\n const flags = new Map<string, KnownFlag>();\n for (const [name, def] of Object.entries(argsDef)) {\n if (def.type === \"positional\") {\n continue;\n }\n const kebab = kebabCase(name);\n const boolean = def.type === \"boolean\";\n const onByDefault = boolean && \"default\" in def && def.default === true;\n const flag = {\n boolean,\n display: onByDefault ? `--no-${kebab}` : `--${kebab}`,\n name: kebab,\n takesValue: def.type === \"string\" || def.type === \"enum\",\n };\n for (const spelling of [\n name,\n kebabCase(name),\n camelCase(name),\n ...aliasesOf(\"alias\" in def ? def.alias : undefined),\n ]) {\n flags.set(spelling, flag);\n }\n }\n return flags;\n};\n\n/** Edit distance between two short strings (insertions, deletions, swaps of one letter). */\nconst distance = (from: string, to: string): number => {\n let previous = Array.from({ length: to.length + 1 }, (_, index) => index);\n for (const [row, fromChar] of [...from].entries()) {\n const current = [row + 1];\n for (const [column, toChar] of [...to].entries()) {\n current.push(\n Math.min(\n (previous[column + 1] ?? 0) + 1,\n (current[column] ?? 0) + 1,\n (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)\n )\n );\n }\n previous = current;\n }\n return previous[to.length] ?? 0;\n};\n\n/**\n * The candidate closest to `name`, when it's close enough to be the likely\n * intent: at most two edits away, and fewer edits than half the candidate's\n * length, so a short typo doesn't \"suggest\" an unrelated short word.\n */\nexport const closestMatch = (\n name: string,\n candidates: readonly string[]\n): string | undefined => {\n let best: { candidate: string; edits: number } | undefined;\n for (const candidate of candidates) {\n const edits = distance(name, candidate);\n if (\n edits <= 2 &&\n edits * 2 < candidate.length &&\n (best === undefined || edits < best.edits)\n ) {\n best = { candidate, edits };\n }\n }\n return best?.candidate;\n};\n\n/** A `--name`, `--no-name`, `--name=value`, or `-n` token, taken apart. */\ninterface FlagToken {\n /** Whether it carries its value inline (`--port=4000`). */\n hasValue: boolean;\n /** `--name` rather than `-n`. */\n long: boolean;\n /** The name as typed, without dashes or `=value`. */\n name: string;\n /** The negated flag's name, for a `--no-name` token. */\n negated: string | undefined;\n}\n\nconst parseToken = (arg: string): FlagToken => {\n const long = arg.startsWith(\"--\");\n const [name = \"\"] = arg.slice(long ? 2 : 1).split(\"=\");\n return {\n hasValue: arg.includes(\"=\"),\n long,\n name,\n negated: long && name.startsWith(\"no-\") ? name.slice(3) : undefined,\n };\n};\n\n/**\n * How many tokens after this one a declared flag consumes — one for a string\n * flag's separate value (`--port 4000`, read whatever it looks like, as\n * citty's parser does), none otherwise — or undefined when the token names no\n * declared flag. A negation never reads a value; grouped single-letter\n * booleans (`-ab`) are declared when every letter is.\n */\nconst declaredWidth = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): number | undefined => {\n const known =\n flags.get(token.name) ??\n (token.negated === undefined ? undefined : flags.get(token.negated));\n if (known) {\n return known.takesValue && !token.hasValue && token.negated === undefined\n ? 1\n : 0;\n }\n const grouped =\n !token.long &&\n token.name.length > 1 &&\n [...token.name].every((letter) => flags.get(letter)?.takesValue === false);\n return grouped ? 0 : undefined;\n};\n\n/**\n * An undeclared token as reported, with the declared flag it most resembles.\n * A mistyped negation keeps its `no-` in the suggestion (`--no-instal` →\n * `--no-install`), so the fix doesn't flip what was asked for; negating a flag\n * that takes a value means nothing, so those suggest the flag itself.\n */\nconst describeUnknown = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): UnknownFlag => {\n const unknown: UnknownFlag = {\n flag: `${token.long ? \"--\" : \"-\"}${token.name}`,\n };\n const names = [...new Set([...flags.values()].map((flag) => flag.name))];\n const match = closestMatch(token.negated ?? token.name, names);\n if (match) {\n const negate = token.negated !== undefined && flags.get(match)?.boolean;\n unknown.suggestion = negate ? `--no-${match}` : `--${match}`;\n }\n return unknown;\n};\n\n/**\n * The flags in `rawArgs` that the command's `args` don't declare. citty itself\n * accepts any flag and drops the ones it doesn't know, so a typo like\n * `--isolatd` would silently run a different command than the one intended.\n *\n * Mirrors what citty accepts: every spelling from {@link knownFlags}, a\n * `--no-<flag>` negation of any of them, `--flag=value`, a declared string\n * flag's separate value token, grouped single-letter boolean aliases, and\n * everything after a bare `--`. `accepted` names extra flags the command\n * handles itself (the removed `blume build --adapter`, which gets its own\n * migration message).\n */\nexport const unknownFlags = (\n rawArgs: readonly string[],\n argsDef: ArgsDef,\n accepted: readonly string[] = []\n): UnknownFlag[] => {\n const flags = knownFlags(argsDef);\n const unknown: UnknownFlag[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index] ?? \"\";\n if (arg === \"--\") {\n break;\n }\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n continue;\n }\n const token = parseToken(arg);\n const width = declaredWidth(token, flags);\n if (width !== undefined) {\n index += width;\n } else if (!accepted.includes(token.negated ?? token.name)) {\n unknown.push(describeUnknown(token, flags));\n }\n }\n return unknown;\n};\n\n/**\n * Flags a command reads from its raw arguments itself instead of declaring\n * them, keyed by command name. `blume build` answers the Blume 1 `--adapter`,\n * `--output`, and `--base` with the `deployment` setting that replaced each,\n * which says more than \"unknown option\" would.\n */\nexport const COMMAND_HANDLED_FLAGS = new Map([\n [\"build\", [\"adapter\", \"output\", \"base\"]],\n]);\n\n/**\n * The error for a command run with flags it doesn't declare: each unknown\n * flag (with its likely intended spelling), then every flag the command does\n * take, so the fix is on screen without a trip to `--help`.\n */\nexport const unknownFlagsDiagnostic = (\n command: string,\n unknown: readonly UnknownFlag[],\n argsDef: ArgsDef\n): Diagnostic => {\n const listed = unknown\n .map(({ flag, suggestion }) =>\n suggestion ? `${flag} (did you mean ${suggestion}?)` : flag\n )\n .join(\", \");\n const declared = [\n ...new Set([...knownFlags(argsDef).values()].map((flag) => flag.display)),\n ].toSorted();\n const takes =\n declared.length > 0\n ? `It takes ${declared.join(\", \")}.`\n : \"It takes no options.\";\n return {\n code: \"BLUME_UNKNOWN_OPTION\",\n message: `blume ${command} doesn't know ${unknown.length === 1 ? \"the option\" : \"the options\"} ${listed}.`,\n severity: \"error\",\n suggestion: `${takes} Run \\`blume ${command} --help\\` for what each does.`,\n };\n};\n",
14
+ "/** Edit distance between two short strings (insertions, deletions, swaps of one letter). */\nconst distance = (from: string, to: string): number => {\n let previous = Array.from({ length: to.length + 1 }, (_, index) => index);\n for (const [row, fromChar] of [...from].entries()) {\n const current = [row + 1];\n for (const [column, toChar] of [...to].entries()) {\n current.push(\n Math.min(\n (previous[column + 1] ?? 0) + 1,\n (current[column] ?? 0) + 1,\n (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)\n )\n );\n }\n previous = current;\n }\n return previous[to.length] ?? 0;\n};\n\n/**\n * The candidate closest to `name`, when it's close enough to be the likely\n * intent: at most two edits away, and fewer edits than half the candidate's\n * length, so a short typo doesn't \"suggest\" an unrelated short word.\n */\nexport const closestMatch = (\n name: string,\n candidates: readonly string[]\n): string | undefined => {\n let best: { candidate: string; edits: number } | undefined;\n for (const candidate of candidates) {\n const edits = distance(name, candidate);\n if (\n edits <= 2 &&\n edits * 2 < candidate.length &&\n (best === undefined || edits < best.edits)\n ) {\n best = { candidate, edits };\n }\n }\n return best?.candidate;\n};\n",
15
+ "import type { ArgsDef } from \"citty\";\n\nimport { closestMatch } from \"../core/closest-match.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** A flag the command doesn't declare, with the declared one it most resembles. */\nexport interface UnknownFlag {\n /** The flag as typed, without any `=value`. */\n flag: string;\n /** The closest declared flag (`--isolated` for `--isolatd`), if one is close. */\n suggestion?: string;\n}\n\n/** What a declared option spelling means for the token that follows it. */\ninterface KnownFlag {\n /** Whether it's a boolean switch, which `--no-<name>` turns off. */\n boolean: boolean;\n /**\n * How the flags a command takes list it: `--kebab-name`, or `--no-<name>`\n * for a boolean that's on by default, since that's the form anyone types.\n */\n display: string;\n /** The canonical kebab-case name, which typos are matched against. */\n name: string;\n /** Whether it reads the next token as its value (`--port 4000`). */\n takesValue: boolean;\n}\n\n/** `budgetJs` → `budget-js`; a name already in kebab case is unchanged. */\nconst kebabCase = (name: string): string =>\n name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);\n\n/** `budget-js` → `budgetJs`; a name already in camel case is unchanged. */\nconst camelCase = (name: string): string =>\n name.replaceAll(/-(?<letter>[a-z])/gu, (match) =>\n match.slice(1).toUpperCase()\n );\n\nconst aliasesOf = (alias: string | string[] | undefined): string[] => {\n if (alias === undefined) {\n return [];\n }\n return Array.isArray(alias) ? alias : [alias];\n};\n\n/**\n * Every spelling citty accepts for each declared option — the name, its camel\n * and kebab forms, and its aliases — mapped to what that option is. Positional\n * arguments aren't flags and don't appear.\n */\nconst knownFlags = (argsDef: ArgsDef): Map<string, KnownFlag> => {\n const flags = new Map<string, KnownFlag>();\n for (const [name, def] of Object.entries(argsDef)) {\n if (def.type === \"positional\") {\n continue;\n }\n const kebab = kebabCase(name);\n const boolean = def.type === \"boolean\";\n const onByDefault = boolean && \"default\" in def && def.default === true;\n const flag = {\n boolean,\n display: onByDefault ? `--no-${kebab}` : `--${kebab}`,\n name: kebab,\n takesValue: def.type === \"string\" || def.type === \"enum\",\n };\n for (const spelling of [\n name,\n kebabCase(name),\n camelCase(name),\n ...aliasesOf(\"alias\" in def ? def.alias : undefined),\n ]) {\n flags.set(spelling, flag);\n }\n }\n return flags;\n};\n\n/** A `--name`, `--no-name`, `--name=value`, or `-n` token, taken apart. */\ninterface FlagToken {\n /** Whether it carries its value inline (`--port=4000`). */\n hasValue: boolean;\n /** `--name` rather than `-n`. */\n long: boolean;\n /** The name as typed, without dashes or `=value`. */\n name: string;\n /** The negated flag's name, for a `--no-name` token. */\n negated: string | undefined;\n}\n\nconst parseToken = (arg: string): FlagToken => {\n const long = arg.startsWith(\"--\");\n const [name = \"\"] = arg.slice(long ? 2 : 1).split(\"=\");\n return {\n hasValue: arg.includes(\"=\"),\n long,\n name,\n negated: long && name.startsWith(\"no-\") ? name.slice(3) : undefined,\n };\n};\n\n/**\n * How many tokens after this one a declared flag consumes — one for a string\n * flag's separate value (`--port 4000`, read whatever it looks like, as\n * citty's parser does), none otherwise — or undefined when the token names no\n * declared flag. A negation never reads a value; grouped single-letter\n * booleans (`-ab`) are declared when every letter is.\n */\nconst declaredWidth = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): number | undefined => {\n const known =\n flags.get(token.name) ??\n (token.negated === undefined ? undefined : flags.get(token.negated));\n if (known) {\n return known.takesValue && !token.hasValue && token.negated === undefined\n ? 1\n : 0;\n }\n const grouped =\n !token.long &&\n token.name.length > 1 &&\n [...token.name].every((letter) => flags.get(letter)?.takesValue === false);\n return grouped ? 0 : undefined;\n};\n\n/**\n * An undeclared token as reported, with the declared flag it most resembles.\n * A mistyped negation keeps its `no-` in the suggestion (`--no-instal` →\n * `--no-install`), so the fix doesn't flip what was asked for; negating a flag\n * that takes a value means nothing, so those suggest the flag itself.\n */\nconst describeUnknown = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): UnknownFlag => {\n const unknown: UnknownFlag = {\n flag: `${token.long ? \"--\" : \"-\"}${token.name}`,\n };\n const names = [...new Set([...flags.values()].map((flag) => flag.name))];\n const match = closestMatch(token.negated ?? token.name, names);\n if (match) {\n const negate = token.negated !== undefined && flags.get(match)?.boolean;\n unknown.suggestion = negate ? `--no-${match}` : `--${match}`;\n }\n return unknown;\n};\n\n/**\n * The flags in `rawArgs` that the command's `args` don't declare. citty itself\n * accepts any flag and drops the ones it doesn't know, so a typo like\n * `--isolatd` would silently run a different command than the one intended.\n *\n * Mirrors what citty accepts: every spelling from {@link knownFlags}, a\n * `--no-<flag>` negation of any of them, `--flag=value`, a declared string\n * flag's separate value token, grouped single-letter boolean aliases, and\n * everything after a bare `--`. `accepted` names extra flags the command\n * handles itself (the removed `blume build --adapter`, which gets its own\n * migration message).\n */\nexport const unknownFlags = (\n rawArgs: readonly string[],\n argsDef: ArgsDef,\n accepted: readonly string[] = []\n): UnknownFlag[] => {\n const flags = knownFlags(argsDef);\n const unknown: UnknownFlag[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index] ?? \"\";\n if (arg === \"--\") {\n break;\n }\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n continue;\n }\n const token = parseToken(arg);\n const width = declaredWidth(token, flags);\n if (width !== undefined) {\n index += width;\n } else if (!accepted.includes(token.negated ?? token.name)) {\n unknown.push(describeUnknown(token, flags));\n }\n }\n return unknown;\n};\n\n/**\n * Flags a command reads from its raw arguments itself instead of declaring\n * them, keyed by command name. `blume build` answers the Blume 1 `--adapter`,\n * `--output`, and `--base` with the `deployment` setting that replaced each,\n * which says more than \"unknown option\" would.\n */\nexport const COMMAND_HANDLED_FLAGS = new Map([\n [\"build\", [\"adapter\", \"output\", \"base\"]],\n]);\n\n/**\n * The error for a command run with flags it doesn't declare: each unknown\n * flag (with its likely intended spelling), then every flag the command does\n * take, so the fix is on screen without a trip to `--help`.\n */\nexport const unknownFlagsDiagnostic = (\n command: string,\n unknown: readonly UnknownFlag[],\n argsDef: ArgsDef\n): Diagnostic => {\n const listed = unknown\n .map(({ flag, suggestion }) =>\n suggestion ? `${flag} (did you mean ${suggestion}?)` : flag\n )\n .join(\", \");\n const declared = [\n ...new Set([...knownFlags(argsDef).values()].map((flag) => flag.display)),\n ].toSorted();\n const takes =\n declared.length > 0\n ? `It takes ${declared.join(\", \")}.`\n : \"It takes no options.\";\n return {\n code: \"BLUME_UNKNOWN_OPTION\",\n message: `blume ${command} doesn't know ${unknown.length === 1 ? \"the option\" : \"the options\"} ${listed}.`,\n severity: \"error\",\n suggestion: `${takes} Run \\`blume ${command} --help\\` for what each does.`,\n };\n};\n",
15
16
  "import type { ArgsDef, CommandDef, CommandMeta } from \"citty\";\n\nimport { BlumeError } from \"../core/diagnostics.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { reportDiagnostics } from \"./log.ts\";\nimport {\n COMMAND_HANDLED_FLAGS,\n unknownFlags,\n unknownFlagsDiagnostic,\n} from \"./unknown-flags.ts\";\n\n/**\n * Wrap a command so its module is imported only when citty needs its `args`\n * or runs it. `meta` stays static (from `command-meta.ts`), so rendering root\n * usage, matching an unknown name, and `blume <cmd> --help` for *another*\n * command never touch this one's dependency graph.\n *\n * `load` imports the command's module and `key` names its export, so the call\n * site stays a plain `() => import(\"./commands/x.ts\")`.\n *\n * Only `args`, `setup`, `run`, and `cleanup` are forwarded: no Blume command\n * declares `default`, `plugins`, or nested `subCommands`.\n *\n * Two behaviors every command shares live here rather than in each command:\n * `setup` rejects flags the command doesn't declare (citty accepts and drops\n * them, so `blume build --isolatd` would run a real, non-isolated build), and\n * `run` reports a {@link BlumeError} a command lets escape — a config that\n * fails validation, say — as its diagnostic instead of citty's raw stack dump.\n */\nexport const lazyCommand = <Args extends ArgsDef, Key extends string>(\n meta: CommandMeta,\n load: () => Promise<Record<Key, CommandDef<Args>>>,\n key: Key\n): CommandDef<Args> => {\n const command = async () => {\n const module = await load();\n return module[key];\n };\n const name = meta.name ?? key;\n return {\n args: async () => {\n const { args } = await command();\n // SAFETY: every Blume command passes `args` to `defineCommand` as a plain\n // object literal (the \"command registry\" test checks it); citty's\n // `Resolvable` widening is the only reason the type also admits a thunk\n // or a promise here.\n return args as Args;\n },\n cleanup: async (context) => {\n const loaded = await command();\n await loaded.cleanup?.(context);\n },\n meta,\n run: async (context) => {\n const loaded = await command();\n try {\n await loaded.run?.(context);\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], process.cwd());\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n },\n setup: async (context) => {\n const loaded = await command();\n // SAFETY: as for `args` above, every command's `args` is a plain object.\n const argsDef = (loaded.args ?? {}) as ArgsDef;\n const unknown = unknownFlags(\n context.rawArgs,\n argsDef,\n COMMAND_HANDLED_FLAGS.get(name)\n );\n if (unknown.length > 0) {\n reportDiagnostics([unknownFlagsDiagnostic(name, unknown, argsDef)]);\n process.exit(1);\n }\n await loaded.setup?.(context);\n },\n };\n};\n"
16
17
  ],
17
- "mappings": "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",
18
- "debugId": "D285C7A054BEC2C764756E2164756E21",
18
+ "mappings": "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",
19
+ "debugId": "0853E5F28957397564756E2164756E21",
19
20
  "names": []
20
21
  }
@@ -0,0 +1,18 @@
1
+ import type { BlumeProject } from "../core/project-graph.ts";
2
+ /**
3
+ * Downlevel `<Changelog />` to the release list it renders.
4
+ *
5
+ * The generated `/changelog` page publishes its list through
6
+ * `buildChangelogIndexMarkdown`, but a hand-written page that owns the route
7
+ * instead goes through the component downleveler — which leaves a tag it has
8
+ * no serializer for exactly as written. Without this, moving to an authored
9
+ * page would publish a literal `<Changelog />` to `/changelog.md`,
10
+ * llms-full.txt, MCP `get_page` and the search corpus, and an agent would see
11
+ * no releases at all.
12
+ *
13
+ * The list is the same one the mirror publishes, so both routes to a changelog
14
+ * index — generated or authored — reach agents identically.
15
+ */
16
+ export declare const changelogComponentSerializers: (project: BlumeProject) => {
17
+ Changelog: () => string;
18
+ };
@@ -1,2 +1,14 @@
1
1
  import type { BlumeProject } from "../core/project-graph.ts";
2
+ /**
3
+ * The release list alone, as year headings over linked rows — what
4
+ * `<Changelog />` renders, in Markdown. Split out of the document below so the
5
+ * component's serializer publishes exactly the list the generated page's
6
+ * mirror does: an authored `/changelog` page brings its own heading and prose,
7
+ * and only the list comes from here.
8
+ *
9
+ * Entries are the default locale's, as everywhere else this list is published
10
+ * — see `components/content/Changelog.astro` for why the rule is the same on
11
+ * the rendered page.
12
+ */
13
+ export declare const changelogIndexBlocks: (project: BlumeProject) => string[];
2
14
  export declare const buildChangelogIndexMarkdown: (project: BlumeProject) => string;
@@ -17,13 +17,13 @@ import type { OpenApiData } from "../openapi/model.ts";
17
17
  * Each serializer emits what its component renders and no more: the endpoint
18
18
  * in the spec kind's own notation ({@link operationSignature}), the version and
19
19
  * addresses the overview shows ({@link specAddresses}), the linked list a tag
20
- * section shows. Parameters, schemas and responses are deliberately left out:
21
- * those are `operation-model.ts` plus each component's own preparation, and a
22
- * second implementation here would be free to disagree with the page. The
23
- * endpoint and what it does is the part that was missing altogether. The
24
- * spec's own `x-codeSamples` do come along, as fenced code: they're text the
25
- * spec wrote out (often an SDK call no agent could derive from the
26
- * endpoint), read through the same `customCodeSamples` the page renders.
20
+ * section shows. The spec's own `x-codeSamples` come along, as fenced code:
21
+ * they're text the spec wrote out (often an SDK call no agent could derive
22
+ * from the endpoint), read through the same `customCodeSamples` the page
23
+ * renders. So do an OpenAPI operation's request body and responses, with
24
+ * their examples ({@link operationDetails}), built from the helpers the
25
+ * page's components use so the two can't disagree; parameters and nested
26
+ * schemas are left to the page.
27
27
  *
28
28
  * `specs` is the parsed `blume:openapi` data — empty when the project has no
29
29
  * API reference, in which case every serializer declines. `deployBase` is the
@@ -0,0 +1,39 @@
1
+ import type { ResponseLike } from "../components/openapi/example-panels.ts";
2
+ import type { MediaLike } from "../components/openapi/helpers.ts";
3
+ import type { ApiDocument } from "../openapi/model.ts";
4
+ /**
5
+ * The body and responses of an OpenAPI operation as compact Markdown, for the
6
+ * agent-facing copy of its page (`<route>.md`, llms-full.txt, MCP
7
+ * `get_page`): the request body's media type and top-level properties, its
8
+ * example (every named one), each response's status and description, and
9
+ * the examples the spec records. Without these an agent read an endpoint
10
+ * with no word of what to send or what comes back, though the spec, and the
11
+ * page, had both. Built from the helpers the page's own components use, so
12
+ * the two can't disagree: the same JSON-ish media type, the same examples,
13
+ * `readOnly` and `writeOnly` properties left out the same way.
14
+ *
15
+ * Kept compact: properties one level deep (an example shows the rest), and
16
+ * a sampled response example only for the first success response that
17
+ * records none, since error bodies often all share one schema.
18
+ */
19
+ /** A request body, `$ref` resolved. */
20
+ interface RequestBodyLike {
21
+ description?: string;
22
+ required?: boolean;
23
+ content?: Record<string, MediaLike>;
24
+ }
25
+ /** The operation fields read here. */
26
+ export interface OperationParts {
27
+ requestBody?: RequestBodyLike & {
28
+ $ref?: string;
29
+ };
30
+ responses?: Record<string, ResponseLike & {
31
+ $ref?: string;
32
+ }>;
33
+ }
34
+ /**
35
+ * An operation's body and responses as Markdown blocks, `$ref`s to
36
+ * `components` resolved, ready to join with blank lines.
37
+ */
38
+ export declare const operationDetails: (document: ApiDocument, operation: OperationParts, webhook: boolean) => string[];
39
+ export {};
@@ -13,7 +13,9 @@ import type { BlumeProject } from "../core/project-graph.ts";
13
13
  * `basePath` prefix, a public file (`/spec.pdf`) or image the
14
14
  * `deployment.base` alone, and, on a page in a prefixed locale, a page link
15
15
  * that locale's copy of the route when it is served
16
- * (`components/layout/LocaleLinks.astro`). Inline links, images, component
16
+ * (`components/layout/LocaleLinks.astro`). A root-relative link to a content
17
+ * file (`/guide/new.md`) lands on that file's page, as on the rendered page
18
+ * (`resolveRootFileHref`). Inline links, images, component
17
19
  * `href`s, and reference definitions are rewritten; fenced and inline code,
18
20
  * relative images and asset links, and external URLs are left as written.
19
21
  */
@@ -3,11 +3,13 @@ import type { BlumeProject } from "../core/project-graph.ts";
3
3
  * Every serializer a project brings to a downlevel pass, layered once for all
4
4
  * the agent surfaces (`<route>.md`, llms-full.txt, the search and assistant
5
5
  * corpora): the built-in families that read project data — examples, then the
6
- * API reference — under the user's `agents.markdownComponents`, which is spread
7
- * last so an entry of the same name still wins. One layering, so a new family
8
- * or a new surface cannot leave one consumer printing raw JSX.
6
+ * API reference, then the changelog index — under the user's
7
+ * `agents.markdownComponents`, which is spread last so an entry of the same
8
+ * name still wins. One layering, so a new family or a new surface cannot leave
9
+ * one consumer printing raw JSX.
9
10
  */
10
- export declare const projectComponentSerializers: (project: Pick<BlumeProject, "config" | "examples" | "sources">) => {
11
+ export declare const projectComponentSerializers: (project: BlumeProject) => {
12
+ Changelog: () => string;
11
13
  ApiOverview: ({ props }: import("./component-markdown.ts").ComponentMarkdownContext) => string | null;
12
14
  ApiTagOperations: ({ props }: import("./component-markdown.ts").ComponentMarkdownContext) => string | null;
13
15
  Operation: ({ props }: import("./component-markdown.ts").ComponentMarkdownContext) => string | null;
@@ -25,6 +25,8 @@ export type HeadNode = (HeadScript & {
25
25
  /**
26
26
  * Map the configured adapters to what `Analytics.astro` renders, in declared
27
27
  * order. A second `vercel()` is dropped — two copies of the component would
28
- * count every pageview twice — so the first one keeps its position.
28
+ * count every pageview twice — so the first one keeps its position. `base` is
29
+ * the deployment base a `script()` adapter's root-relative `src` is served
30
+ * under.
29
31
  */
30
- export declare const analyticsHead: (adapters: AnalyticsAdapter[]) => HeadNode[];
32
+ export declare const analyticsHead: (adapters: AnalyticsAdapter[], base?: string) => HeadNode[];
@@ -42,5 +42,11 @@ export declare const scriptAdapterSchema: z.ZodObject<{
42
42
  * passthrough here — every entry lands on the tag as-is.
43
43
  */
44
44
  export declare const script: (options: ScriptOptions) => ScriptAdapter;
45
- /** The tag. Explicit `src`/`strategy` win over a same-named spread attribute. */
46
- export declare const scriptHead: (options: ScriptOptions) => HeadScript[];
45
+ /**
46
+ * The tag. Explicit `src`/`strategy` win over a same-named spread attribute.
47
+ * A root-relative `src` (`/js/x.js`, a file in `public/`) is served under the
48
+ * deployment `base`, so it gets the base the way a link does; one already
49
+ * under it is left alone, and absolute and protocol-relative URLs pass
50
+ * through.
51
+ */
52
+ export declare const scriptHead: (options: ScriptOptions, base: string) => HeadScript[];
@@ -9,6 +9,12 @@
9
9
  * nothing rather than a broken embed.
10
10
  */
11
11
  export declare const parseYouTubeId: (input: string) => string | null;
12
+ /**
13
+ * The playlist id of a YouTube playlist URL (`/embed/videoseries?list=…` or
14
+ * `/playlist?list=…`), or `null` for anything else — a video URL that also
15
+ * carries a `list` (`watch?v=…&list=…`) is that video.
16
+ */
17
+ export declare const parseYouTubePlaylist: (input: string) => string | null;
12
18
  /**
13
19
  * Build a privacy-enhanced (`youtube-nocookie.com`) embed URL, optionally
14
20
  * starting at `start` seconds.
@@ -16,3 +22,17 @@ export declare const parseYouTubeId: (input: string) => string | null;
16
22
  export declare const youtubeEmbedUrl: (id: string, options?: {
17
23
  start?: number;
18
24
  }) => string;
25
+ /**
26
+ * The privacy-enhanced embed URL for a playlist, optionally starting its
27
+ * first video at `start` seconds.
28
+ */
29
+ export declare const youtubePlaylistEmbedUrl: (list: string, options?: {
30
+ start?: number;
31
+ }) => string;
32
+ /**
33
+ * The embed URL for a `<YouTube>`'s `id` or `url`: a video, else a playlist,
34
+ * else `null` when the input names neither.
35
+ */
36
+ export declare const youtubeEmbedSrc: (input: string, options?: {
37
+ start?: number;
38
+ }) => string | null;
@@ -73,6 +73,14 @@ export declare const getPagination: (flat: FlatPage[], route: string) => {
73
73
  export type NavGroup = Extract<NavNode, {
74
74
  kind: "group";
75
75
  }>;
76
+ /**
77
+ * Whether a `group`-mode disclosure renders open: it holds the current page,
78
+ * its meta forces it open (`collapsed: false`), or it is the only row at the
79
+ * top of the sidebar, where starting closed would leave a sidebar of one row
80
+ * to click before any link shows (a wrapper folder around every page). An
81
+ * explicit `collapsed: true` keeps that lone group closed.
82
+ */
83
+ export declare const groupStartsOpen: (group: NavGroup, active: boolean, lone: boolean) => boolean;
76
84
  /**
77
85
  * The group whose own page `route` is, when that page lists the group's
78
86
  * pages: its `directory` (inherited when the group sets none) is `card` or
@@ -0,0 +1,33 @@
1
+ import type { ComponentsLike, MediaLike, SchemaLike, SpecValue } from "./helpers.ts";
2
+ /**
3
+ * The example tabs of an operation's rail (`RequestPanel.astro`): one per
4
+ * response status, or per webhook payload media type — and one per named
5
+ * example where its `examples` map names two or more, labeled by the
6
+ * example's `summary` (else its key) after the status or media type, so
7
+ * every recorded example shows, under its name. Values are left for the
8
+ * component to highlight.
9
+ */
10
+ /** One tab before highlighting. */
11
+ export interface ExamplePanel {
12
+ key: string;
13
+ label: string;
14
+ /** The status or media type the tab is under. */
15
+ name: string;
16
+ /** The media type the value is an example of. */
17
+ type: string;
18
+ /** The example, or `null`/`undefined` when there's none to show. */
19
+ value: SpecValue;
20
+ /** What the tab says when there's no example. */
21
+ text: string;
22
+ }
23
+ /** A response: its description and its body's media types. */
24
+ export interface ResponseLike {
25
+ description?: string;
26
+ content?: Record<string, MediaLike>;
27
+ }
28
+ /** The media entry a body shows: the first JSON-ish one, else the first. */
29
+ export declare const preferredMedia: (content?: Record<string, MediaLike>) => [string, MediaLike] | undefined;
30
+ /** The Response tabs: per status, per named example. */
31
+ export declare const responsePanels: (responses: Record<string, ResponseLike>, schemas: Record<string, SchemaLike>, components?: ComponentsLike) => ExamplePanel[];
32
+ /** A webhook's Payload tabs: per media type, per named example. */
33
+ export declare const payloadPanels: (payload: Record<string, MediaLike> | undefined, schemas: Record<string, SchemaLike>, components?: ComponentsLike) => ExamplePanel[];