blume 1.7.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +217 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
  60. package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +186 -515
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +27 -12
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2282 -452
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +15 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +162 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +50 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +35 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +9 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +16 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +11 -11
  307. package/docs/discoverability/index.mdx +4 -4
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +21 -22
  329. package/src/ai/ai-catalog.ts +50 -32
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +7 -6
  338. package/src/ai/llms.ts +20 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/openapi-components.ts +4 -1
  342. package/src/ai/relative-links.ts +170 -0
  343. package/src/ai/serializers.ts +2 -2
  344. package/src/ai/skills.ts +1 -1
  345. package/src/ai/web-bot-auth.ts +2 -2
  346. package/src/analytics/adobe.ts +46 -0
  347. package/src/analytics/amplitude.ts +79 -0
  348. package/src/analytics/clarity.ts +46 -0
  349. package/src/analytics/clearbit.ts +47 -0
  350. package/src/analytics/cloudflare.ts +67 -0
  351. package/src/analytics/fathom.ts +64 -0
  352. package/src/analytics/google-analytics.ts +84 -0
  353. package/src/analytics/google-tag-manager.ts +61 -0
  354. package/src/analytics/head.ts +130 -0
  355. package/src/analytics/heap.ts +65 -0
  356. package/src/analytics/hightouch.ts +77 -0
  357. package/src/analytics/hotjar.ts +47 -0
  358. package/src/analytics/index.ts +71 -0
  359. package/src/analytics/inline.ts +21 -0
  360. package/src/analytics/logrocket.ts +71 -0
  361. package/src/analytics/mixpanel.ts +92 -0
  362. package/src/analytics/pirsch.ts +66 -0
  363. package/src/analytics/plausible.ts +83 -0
  364. package/src/analytics/posthog.ts +78 -0
  365. package/src/analytics/schema.ts +60 -0
  366. package/src/analytics/script.ts +60 -0
  367. package/src/analytics/segment.ts +85 -0
  368. package/src/analytics/vercel.ts +50 -0
  369. package/src/astro/adapter-root.ts +7 -9
  370. package/src/astro/component-slots.ts +131 -91
  371. package/src/astro/generate.ts +112 -345
  372. package/src/astro/integration.ts +2 -6
  373. package/src/astro/pages.ts +13 -101
  374. package/src/astro/render-deps.ts +379 -0
  375. package/src/astro/runtime-deps.ts +201 -0
  376. package/src/astro/templates.ts +554 -541
  377. package/src/audit/agent.ts +24 -0
  378. package/src/audit/catalog.ts +2 -2
  379. package/src/audit/checks/assets.ts +2 -2
  380. package/src/audit/checks/dns-aid.ts +1 -1
  381. package/src/audit/checks/duplicates.ts +3 -1
  382. package/src/audit/checks/i18n.ts +1 -1
  383. package/src/audit/checks/indexability.ts +7 -7
  384. package/src/audit/checks/links.ts +2 -2
  385. package/src/audit/checks/llms.ts +6 -6
  386. package/src/audit/checks/network.ts +3 -3
  387. package/src/audit/checks/og-image.ts +2 -2
  388. package/src/audit/checks/robots.ts +1 -1
  389. package/src/audit/checks/sitemap.ts +2 -2
  390. package/src/audit/checks/social.ts +1 -1
  391. package/src/audit/run.ts +4 -3
  392. package/src/audit/terms.ts +31 -0
  393. package/src/audit/url.ts +13 -13
  394. package/src/cli/command-meta.ts +10 -0
  395. package/src/cli/commands/audit.ts +39 -20
  396. package/src/cli/commands/build.ts +71 -316
  397. package/src/cli/commands/check.ts +1 -0
  398. package/src/cli/commands/dev.ts +40 -1
  399. package/src/cli/commands/doctor.ts +90 -14
  400. package/src/cli/commands/eject.ts +44 -7
  401. package/src/cli/commands/eval.ts +2 -2
  402. package/src/cli/commands/init.ts +161 -41
  403. package/src/cli/commands/migrate.ts +121 -0
  404. package/src/cli/commands/preview.ts +7 -1
  405. package/src/cli/commands/translate.ts +2 -2
  406. package/src/cli/commands/upgrade.ts +141 -0
  407. package/src/cli/commands/version.ts +57 -44
  408. package/src/cli/eject-scripts.ts +121 -6
  409. package/src/cli/index.ts +11 -1
  410. package/src/cli/init/install.ts +70 -0
  411. package/src/cli/init/questions.ts +7 -0
  412. package/src/cli/init/scaffold.ts +459 -75
  413. package/src/cli/lazy-command.ts +37 -1
  414. package/src/cli/prepare.ts +40 -6
  415. package/src/cli/required-secrets.ts +38 -11
  416. package/src/cli/unknown-flags.ts +266 -0
  417. package/src/cli/yarn-pnp.ts +52 -0
  418. package/src/components/content/AccordionItem.astro +7 -1
  419. package/src/components/content/Card.astro +4 -3
  420. package/src/components/content/ColorItem.astro +22 -4
  421. package/src/components/content/GithubInfo.astro +2 -2
  422. package/src/components/content/Prompt.astro +25 -25
  423. package/src/components/content/Tabs.astro +3 -1
  424. package/src/components/content/Tile.astro +2 -3
  425. package/src/components/content/Tooltip.astro +57 -9
  426. package/src/components/content/content-strings.ts +34 -0
  427. package/src/components/content/diff.ts +1 -1
  428. package/src/components/content/mermaid-element.ts +13 -2
  429. package/src/components/content/prompt-markdown.ts +292 -0
  430. package/src/components/content/tooltip-id.ts +41 -0
  431. package/src/components/islands/hooks.ts +25 -2
  432. package/src/components/layout/Analytics.astro +21 -79
  433. package/src/components/layout/Banner.astro +3 -1
  434. package/src/components/layout/DiscoveryLinks.astro +69 -0
  435. package/src/components/layout/Header.astro +83 -20
  436. package/src/components/layout/LanguageSwitcher.astro +4 -1
  437. package/src/components/layout/Logo.astro +23 -2
  438. package/src/components/layout/NavSelector.astro +13 -2
  439. package/src/components/layout/NavTree.astro +12 -3
  440. package/src/components/layout/NavTreeScript.astro +17 -3
  441. package/src/components/layout/PageActions.astro +3 -3
  442. package/src/components/layout/PageFeedback.astro +11 -1
  443. package/src/components/layout/PageLayout.astro +52 -5
  444. package/src/components/layout/ReferenceLayout.astro +21 -12
  445. package/src/components/layout/RootLayout.astro +69 -66
  446. package/src/components/layout/Search.astro +30 -6
  447. package/src/components/layout/WebMcp.astro +1 -1
  448. package/src/components/layout/analytics-client.ts +72 -15
  449. package/src/components/layout/drawer-inert.ts +113 -15
  450. package/src/components/layout/dropdown-clamp.ts +105 -0
  451. package/src/components/layout/head-scripts.ts +15 -6
  452. package/src/components/layout/nav-utils.ts +17 -0
  453. package/src/components/layout/search/algolia.ts +8 -8
  454. package/src/components/layout/search/orama-cloud.ts +9 -7
  455. package/src/components/layout/search/typesense.ts +11 -17
  456. package/src/components/openapi/MessageComposer.astro +2 -2
  457. package/src/components/openapi/Playground.astro +2 -2
  458. package/src/components/openapi/playground-client.ts +79 -10
  459. package/src/core/changelog-index.ts +24 -0
  460. package/src/core/component-overrides.ts +399 -154
  461. package/src/core/config-input.ts +188 -553
  462. package/src/core/config.ts +130 -41
  463. package/src/core/custom-pages.ts +105 -0
  464. package/src/core/data.ts +31 -12
  465. package/src/core/define-components.ts +12 -9
  466. package/src/core/deployment-env.ts +18 -74
  467. package/src/core/diagnostics.ts +14 -7
  468. package/src/core/graph.ts +69 -25
  469. package/src/core/i18n-ui.ts +6 -2
  470. package/src/core/i18n.ts +17 -0
  471. package/src/core/includes.ts +156 -38
  472. package/src/core/last-modified.ts +6 -11
  473. package/src/core/links.ts +166 -2
  474. package/src/core/manifest.ts +10 -3
  475. package/src/core/navigation.ts +115 -16
  476. package/src/core/new-tab.ts +35 -0
  477. package/src/core/node-require.ts +21 -0
  478. package/src/core/project-graph.ts +42 -26
  479. package/src/core/project.ts +9 -4
  480. package/src/core/request-body.ts +61 -0
  481. package/src/core/safe-href.ts +28 -0
  482. package/src/core/safe-links.ts +68 -0
  483. package/src/core/schema.ts +517 -739
  484. package/src/core/server-features.ts +8 -9
  485. package/src/core/sources/assets.ts +47 -11
  486. package/src/core/sources/collection.ts +67 -0
  487. package/src/core/sources/contentful-rich-text.ts +285 -0
  488. package/src/core/sources/contentful.ts +173 -0
  489. package/src/core/sources/github-releases.ts +51 -1
  490. package/src/core/sources/json.ts +71 -0
  491. package/src/core/sources/lexical.ts +195 -0
  492. package/src/core/sources/lower.ts +226 -0
  493. package/src/core/sources/normalize.ts +52 -2
  494. package/src/core/sources/notion.ts +39 -28
  495. package/src/core/sources/payload.ts +135 -0
  496. package/src/core/sources/portable-text.ts +11 -16
  497. package/src/core/sources/remote.ts +226 -0
  498. package/src/core/sources/resolve.ts +104 -166
  499. package/src/core/sources/sanity.ts +16 -49
  500. package/src/core/sources/strapi-blocks.ts +124 -0
  501. package/src/core/sources/strapi.ts +191 -0
  502. package/src/core/sources/types.ts +12 -1
  503. package/src/core/types.ts +15 -1
  504. package/src/core/ui-packs/ar.ts +6 -2
  505. package/src/core/ui-packs/bg.ts +6 -2
  506. package/src/core/ui-packs/bn.ts +6 -2
  507. package/src/core/ui-packs/ca.ts +3 -1
  508. package/src/core/ui-packs/cs.ts +6 -2
  509. package/src/core/ui-packs/da.ts +6 -2
  510. package/src/core/ui-packs/de.ts +6 -2
  511. package/src/core/ui-packs/el.ts +3 -1
  512. package/src/core/ui-packs/es.ts +3 -1
  513. package/src/core/ui-packs/fa.ts +6 -2
  514. package/src/core/ui-packs/fi.ts +6 -2
  515. package/src/core/ui-packs/fr.ts +3 -1
  516. package/src/core/ui-packs/he.ts +6 -2
  517. package/src/core/ui-packs/hi.ts +6 -2
  518. package/src/core/ui-packs/hr.ts +6 -2
  519. package/src/core/ui-packs/hu.ts +6 -2
  520. package/src/core/ui-packs/id.ts +6 -2
  521. package/src/core/ui-packs/it.ts +3 -1
  522. package/src/core/ui-packs/ja.ts +3 -1
  523. package/src/core/ui-packs/ko.ts +3 -1
  524. package/src/core/ui-packs/nl.ts +6 -2
  525. package/src/core/ui-packs/no.ts +6 -2
  526. package/src/core/ui-packs/pl.ts +6 -2
  527. package/src/core/ui-packs/pt-br.ts +3 -1
  528. package/src/core/ui-packs/pt.ts +3 -1
  529. package/src/core/ui-packs/ro.ts +6 -2
  530. package/src/core/ui-packs/ru.ts +6 -2
  531. package/src/core/ui-packs/sk.ts +6 -2
  532. package/src/core/ui-packs/sr.ts +6 -2
  533. package/src/core/ui-packs/sv.ts +6 -2
  534. package/src/core/ui-packs/th.ts +3 -1
  535. package/src/core/ui-packs/tr.ts +6 -2
  536. package/src/core/ui-packs/uk.ts +6 -2
  537. package/src/core/ui-packs/vi.ts +3 -1
  538. package/src/core/ui-packs/zh-tw.ts +3 -1
  539. package/src/core/ui-packs/zh.ts +3 -1
  540. package/src/core/unrecognized-keys.ts +10 -0
  541. package/src/core/version-cut.ts +116 -8
  542. package/src/deploy/adapter-output.ts +57 -97
  543. package/src/deploy/adapters/cloudflare.ts +39 -0
  544. package/src/deploy/adapters/index.ts +41 -0
  545. package/src/deploy/adapters/netlify.ts +34 -0
  546. package/src/deploy/adapters/node.ts +34 -0
  547. package/src/deploy/adapters/registry.ts +127 -0
  548. package/src/deploy/adapters/types.ts +92 -0
  549. package/src/deploy/adapters/vercel.ts +35 -0
  550. package/src/deploy/artifacts.ts +55 -27
  551. package/src/deploy/cloudflare-negotiation.ts +179 -100
  552. package/src/deploy/function-bundle.ts +18 -3
  553. package/src/deploy/headers.ts +124 -23
  554. package/src/deploy/node-headers.ts +198 -0
  555. package/src/deploy/platforms/cloudflare.ts +312 -0
  556. package/src/deploy/platforms/index.ts +67 -0
  557. package/src/deploy/platforms/netlify.ts +52 -0
  558. package/src/deploy/platforms/node.ts +40 -0
  559. package/src/deploy/platforms/paths.ts +42 -0
  560. package/src/deploy/platforms/static.ts +29 -0
  561. package/src/deploy/platforms/types.ts +112 -0
  562. package/src/deploy/platforms/vercel.ts +193 -0
  563. package/src/deploy/redirects.ts +30 -18
  564. package/src/deploy/robots.ts +3 -3
  565. package/src/deploy/rss.ts +2 -2
  566. package/src/deploy/sitemap.ts +2 -2
  567. package/src/deploy/vercel-negotiation.ts +2 -2
  568. package/src/eval/agents.ts +32 -1
  569. package/src/eval/findings.ts +19 -11
  570. package/src/eval/report.ts +10 -2
  571. package/src/markdown/external-links.ts +65 -0
  572. package/src/markdown/include.ts +45 -27
  573. package/src/markdown/index.ts +34 -9
  574. package/src/markdown/inline-code.ts +12 -6
  575. package/src/markdown/relative-links.ts +324 -0
  576. package/src/markdown/themes.ts +3 -3
  577. package/src/migrate/migrate.ts +149 -0
  578. package/src/openapi/parse.ts +64 -16
  579. package/src/openapi/proxy.ts +62 -10
  580. package/src/openapi/references.ts +147 -147
  581. package/src/openapi/render-mdx.ts +32 -10
  582. package/src/openapi/scalar.ts +15 -13
  583. package/src/openapi/sentence.ts +14 -0
  584. package/src/openapi/source.ts +37 -21
  585. package/src/openapi/spec-dependency-error.ts +15 -0
  586. package/src/reference/asyncapi.ts +83 -0
  587. package/src/reference/graphql.ts +89 -0
  588. package/src/reference/index.ts +40 -0
  589. package/src/reference/openapi.ts +83 -0
  590. package/src/reference/options.ts +201 -0
  591. package/src/reference/scalar.ts +136 -0
  592. package/src/reference/schema.ts +88 -0
  593. package/src/registry/eject.ts +97 -42
  594. package/src/search/adapters/algolia.ts +46 -0
  595. package/src/search/adapters/flexsearch.ts +29 -0
  596. package/src/search/adapters/index.ts +39 -0
  597. package/src/search/adapters/mixedbread.ts +39 -0
  598. package/src/search/adapters/orama-cloud.ts +51 -0
  599. package/src/search/adapters/orama.ts +24 -0
  600. package/src/search/adapters/pagefind.ts +27 -0
  601. package/src/search/adapters/registry.ts +131 -0
  602. package/src/search/adapters/types.ts +46 -0
  603. package/src/search/adapters/typesense.ts +57 -0
  604. package/src/search/build.ts +8 -4
  605. package/src/search/documents.ts +6 -0
  606. package/src/search/sync/algolia.ts +12 -11
  607. package/src/search/sync/index.ts +35 -20
  608. package/src/search/sync/orama-cloud.ts +12 -9
  609. package/src/search/sync/typesense.ts +15 -13
  610. package/src/sources/contentful.ts +63 -0
  611. package/src/sources/custom.ts +38 -0
  612. package/src/sources/filesystem.ts +51 -0
  613. package/src/sources/github-releases.ts +52 -0
  614. package/src/sources/index.ts +60 -0
  615. package/src/sources/mdx-remote.ts +76 -0
  616. package/src/sources/notion.ts +63 -0
  617. package/src/sources/obsidian.ts +38 -0
  618. package/src/sources/payload.ts +60 -0
  619. package/src/sources/registry.ts +182 -0
  620. package/src/sources/sanity.ts +66 -0
  621. package/src/sources/shared.ts +52 -0
  622. package/src/sources/strapi.ts +58 -0
  623. package/src/theme/entry.ts +24 -2
  624. package/src/translate/report.ts +40 -7
  625. package/src/upgrade/upgrade.ts +499 -0
  626. package/dist/cli/chunk-0qymqwzz.js +0 -164
  627. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  628. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  632. package/dist/cli/chunk-5093q3n7.js +0 -68
  633. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  634. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  635. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  636. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  637. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  638. package/dist/cli/chunk-97r59kpr.js +0 -381
  639. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  640. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  641. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  642. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  643. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  644. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  645. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  646. package/dist/cli/chunk-esphfr8p.js +0 -107
  647. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  648. package/dist/cli/chunk-ex56aa81.js +0 -1016
  649. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  650. package/dist/cli/chunk-garjf5z9.js +0 -30
  651. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  652. package/dist/cli/chunk-js7saxwm.js +0 -1045
  653. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  654. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  655. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  656. package/dist/cli/chunk-q4rae3bg.js +0 -60
  657. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  658. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  659. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  660. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  661. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  662. package/dist/cli/chunk-vrfp10qk.js +0 -81
  663. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  664. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  665. package/docs/advanced/api-reference.mdx +0 -240
  666. package/docs/reference/cli.mdx +0 -197
  667. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  668. package/src/components/content/changelog-element.ts +0 -69
  669. package/src/search/providers.ts +0 -91
  670. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
  671. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
  672. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
  673. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
@@ -1,25 +1,32 @@
1
1
  import { normalizeRoute, withBasePath } from "../core/base-path.ts";
2
2
  import type { ResolvedConfig } from "../core/schema.ts";
3
3
  import { trimChar } from "../core/trim.ts";
4
+ import type { ScalarOptions } from "../reference/scalar.ts";
5
+ import type { ResolvedReferenceAdapter } from "../reference/schema.ts";
4
6
 
5
7
  // Re-exported from its home next to the other path helpers; `core/schema.ts`
6
8
  // and downstream consumers historically imported it from here.
7
9
  export { normalizeRoute } from "../core/base-path.ts";
8
10
 
9
11
  /**
10
- * Pure resolution of the configured API reference blocks into concrete routes,
11
- * labels, and a renderer choice — no file IO, so the content source, the
12
+ * Pure resolution of the configured `reference` adapters into concrete routes
13
+ * and labels — no file IO, so the content source, the
12
14
  * nav-target validation, the Scalar page generator, and the `blume:openapi`
13
15
  * data module all share one source of truth. Kept free of any Astro/template
14
16
  * imports so `core` can depend on it without a cycle.
15
17
  */
16
18
 
17
- export type ReferenceKind = "openapi" | "asyncapi" | "graphql";
19
+ /**
20
+ * Which adapter a reference came from. `openapi`, `asyncapi`, and `graphql`
21
+ * are rendered by Blume into real pages; `scalar` is the embedded Scalar SPA
22
+ * on a single route.
23
+ */
24
+ export type ReferenceKind = ResolvedReferenceAdapter["kind"];
18
25
 
19
- /** Who renders a reference: Blume's own UI, or the embedded Scalar SPA. */
20
- export type ReferenceRenderer = "blume" | "scalar";
26
+ /** The kinds Blume renders into pages itself — everything but the Scalar embed. */
27
+ export type BlumeReferenceKind = Exclude<ReferenceKind, "scalar">;
21
28
 
22
- /** Per-block display options for the Blume renderer. */
29
+ /** Per-adapter display options for the Blume renderer. */
23
30
  export interface ReferenceDisplay {
24
31
  /** Code-sample languages shown per operation. */
25
32
  codeSamples: string[];
@@ -33,10 +40,9 @@ export interface ReferenceDisplay {
33
40
  playground: { enabled: boolean; proxy: string | boolean };
34
41
  }
35
42
 
36
- /** A spec source resolved to a concrete route, label, and renderer. */
43
+ /** A spec source resolved to a concrete route and label. */
37
44
  export interface ReferenceSource {
38
45
  kind: ReferenceKind;
39
- renderer: ReferenceRenderer;
40
46
  /** Unique token derived from the route; the `<Operation source>` / data key. */
41
47
  slug: string;
42
48
  /** Normalized route the reference mounts at, e.g. `/reference`. */
@@ -66,14 +72,12 @@ export interface ReferenceSource {
66
72
  * (GraphQL only — a schema, unlike an OpenAPI document, names no server).
67
73
  */
68
74
  endpoint?: string;
69
- /** Per-block Scalar theme name override, if any (Scalar renderer only). */
70
- theme?: string;
71
75
  /**
72
- * Arbitrary Scalar config forwarded to `<ScalarComponent>` (Scalar renderer
73
- * only). Takes precedence over Blume's derived spec/theme config. Typed off
74
- * the config schema so the two can never drift.
76
+ * The `scalar()` adapter's own options (`scalar` kind only): `theme` plus
77
+ * any Scalar config forwarded verbatim to `<ScalarComponent>`, which takes
78
+ * precedence over Blume's derived spec/theme config.
75
79
  */
76
- scalar?: ResolvedConfig["openapi"]["scalar"];
80
+ scalar?: ScalarOptions;
77
81
  /** Display options carried through to the Blume renderer. */
78
82
  display: ReferenceDisplay;
79
83
  /**
@@ -83,6 +87,14 @@ export interface ReferenceSource {
83
87
  collisions?: string[];
84
88
  }
85
89
 
90
+ /** A reference Blume renders itself: one the content pipeline stages pages for. */
91
+ export type BlumeReferenceSource = ReferenceSource & {
92
+ kind: BlumeReferenceKind;
93
+ };
94
+
95
+ const isBlumeReference = (ref: ReferenceSource): ref is BlumeReferenceSource =>
96
+ ref.kind !== "scalar";
97
+
86
98
  // Keep Unicode letters/marks/numbers so diacritics stay in the slug (ASCII-only
87
99
  // stripping turned `Größe` into `gr-e`, which the nav humanizer rendered as
88
100
  // `Gr E`); `\p{M}` keeps combining marks attached to their base letter, which
@@ -119,59 +131,95 @@ export const slugify = (text: string): string =>
119
131
  const routeSlug = (route: string): string =>
120
132
  slugify(trimChar(route, "/")) || "reference";
121
133
 
134
+ /** The label a source gets when it names none (numbered when there are several). */
135
+ const DEFAULT_LABELS: Record<ReferenceKind, string> = {
136
+ asyncapi: "Events",
137
+ graphql: "GraphQL",
138
+ openapi: "API Reference",
139
+ scalar: "API Reference",
140
+ };
141
+
142
+ /** The Blume renderer has nothing to show for a Scalar embed. */
143
+ const NO_DISPLAY: ReferenceDisplay = {
144
+ codeSamples: [],
145
+ expandSchemas: false,
146
+ playground: { enabled: false, proxy: false },
147
+ };
148
+
149
+ const displayOf = (adapter: ResolvedReferenceAdapter): ReferenceDisplay => {
150
+ if (adapter.kind === "scalar") {
151
+ return NO_DISPLAY;
152
+ }
153
+ return {
154
+ codeSamples: adapter.options.codeSamples,
155
+ // GraphQL field tables have no nesting, so `graphql()` takes no
156
+ // `expandSchemas` toggle.
157
+ expandSchemas:
158
+ adapter.kind === "graphql" ? false : adapter.options.expandSchemas,
159
+ playground: adapter.options.playground,
160
+ };
161
+ };
162
+
122
163
  /**
123
- * The structural shape all three reference blocks (`openapi`, `asyncapi`,
124
- * `graphql`) share. `endpoint` exists only on the GraphQL block and its
125
- * sources; `scalar`/`theme` only on the Scalar-capable kinds — optional here
126
- * so one resolver serves every block.
164
+ * A `scalar()` adapter's options minus the ones Blume resolves itself
165
+ * (`route`, `sources`): `theme` and the verbatim Scalar passthrough, which
166
+ * the generated page inlines.
127
167
  */
128
- interface Block {
129
- enabled: boolean;
168
+ const scalarOptionsOf = (
169
+ options: Extract<ResolvedReferenceAdapter, { kind: "scalar" }>["options"]
170
+ ): ScalarOptions =>
171
+ Object.fromEntries(
172
+ Object.entries(options).filter(
173
+ ([key]) => key !== "route" && key !== "sources"
174
+ )
175
+ );
176
+
177
+ /** A source row with every kind's fields reconciled onto one shape. */
178
+ interface SourceRow {
130
179
  endpoint?: string;
131
- route: string;
132
- scalar?: ResolvedConfig["openapi"]["scalar"];
133
- sources: {
134
- endpoint?: string;
135
- includeInLlms: boolean;
136
- includeInSearch: boolean;
137
- label?: string;
138
- noindex: boolean;
139
- route?: string;
140
- seoDescriptionSuffix: boolean;
141
- spec: string;
142
- }[];
143
- spec?: string;
144
- theme?: string;
180
+ includeInLlms: boolean;
181
+ includeInSearch: boolean;
182
+ label?: string;
183
+ noindex: boolean;
184
+ route?: string;
185
+ seoDescriptionSuffix: boolean;
186
+ spec: string;
145
187
  }
146
188
 
147
- /** A spec is a single source (`spec` shorthand prepended to any `sources`). */
148
- const sourcesOf = (block: Block): Block["sources"] => {
149
- const sources = [...block.sources];
150
- if (block.spec) {
151
- sources.unshift({
152
- includeInLlms: true,
153
- includeInSearch: true,
154
- noindex: false,
155
- seoDescriptionSuffix: true,
156
- spec: block.spec,
157
- });
189
+ /**
190
+ * One row per source, with the kind-specific fields already reconciled: a
191
+ * GraphQL source's `endpoint` falls back to the adapter-wide default (the
192
+ * common single-schema case pairs it with the `spec` shorthand); the other
193
+ * kinds have no endpoint at all. A Scalar source carries only `noindex` of
194
+ * the per-source controls — the embed sits outside search and llms.txt, so
195
+ * the other two read as off.
196
+ */
197
+ const sourceRowsOf = (adapter: ResolvedReferenceAdapter): SourceRow[] => {
198
+ if (adapter.kind === "graphql") {
199
+ return adapter.options.sources.map((source) => ({
200
+ ...source,
201
+ endpoint: source.endpoint ?? adapter.options.endpoint,
202
+ }));
203
+ }
204
+ if (adapter.kind === "scalar") {
205
+ return adapter.options.sources.map((source) => ({
206
+ ...source,
207
+ includeInLlms: false,
208
+ includeInSearch: false,
209
+ seoDescriptionSuffix: false,
210
+ }));
158
211
  }
159
- return sources;
212
+ return adapter.options.sources;
160
213
  };
161
214
 
162
215
  const referencesFor = (
163
- kind: ReferenceKind,
164
- block: Block,
165
- defaultLabel: string,
166
- renderer: ReferenceRenderer,
167
- display: ReferenceDisplay,
216
+ adapter: ResolvedReferenceAdapter,
168
217
  basePath: string
169
218
  ): ReferenceSource[] => {
170
- if (!block.enabled) {
171
- return [];
172
- }
173
- const sources = sourcesOf(block);
174
- const base = normalizeRoute(block.route);
219
+ const sources = sourceRowsOf(adapter);
220
+ const base = normalizeRoute(adapter.options.route);
221
+ const defaultLabel = DEFAULT_LABELS[adapter.kind];
222
+ const display = displayOf(adapter);
175
223
 
176
224
  return sources.map((source, index) => {
177
225
  const label =
@@ -193,77 +241,36 @@ const referencesFor = (
193
241
  display,
194
242
  includeInLlms: source.includeInLlms,
195
243
  includeInSearch: source.includeInSearch,
196
- kind,
244
+ kind: adapter.kind,
197
245
  label,
198
246
  noindex: source.noindex,
199
- renderer,
200
247
  route,
201
- scalar: block.scalar,
202
248
  seoDescriptionSuffix: source.seoDescriptionSuffix,
203
249
  slug: routeSlug(route),
204
250
  spec: source.spec,
205
- theme: block.theme,
206
251
  };
207
- // Per-source endpoint wins; the block-level one is the shared default
208
- // (the common single-schema case pairs it with the `spec` shorthand).
209
- const endpoint = source.endpoint ?? block.endpoint;
210
- if (endpoint !== undefined) {
211
- reference.endpoint = endpoint;
252
+ if (adapter.kind === "scalar") {
253
+ reference.scalar = scalarOptionsOf(adapter.options);
254
+ }
255
+ if (source.endpoint !== undefined) {
256
+ reference.endpoint = source.endpoint;
212
257
  }
213
258
  return reference;
214
259
  });
215
260
  };
216
261
 
217
262
  /**
218
- * Resolve every enabled reference. Both blocks honor their `renderer` —
219
- * Blume's own UI by default, with the embedded Scalar SPA as the opt-out.
263
+ * Resolve every configured reference, in `reference` order: Blume's own pages
264
+ * for `openapi()`, `asyncapi()`, and `graphql()`, and one embedded Scalar page
265
+ * per `scalar()` source.
220
266
  */
221
- export const resolveReferences = (
222
- config: ResolvedConfig
223
- ): ReferenceSource[] => [
224
- ...referencesFor(
225
- "openapi",
226
- config.openapi,
227
- "API Reference",
228
- config.openapi.renderer,
229
- {
230
- codeSamples: config.openapi.codeSamples,
231
- expandSchemas: config.openapi.expandSchemas,
232
- playground: config.openapi.playground,
233
- },
234
- config.basePath
235
- ),
236
- ...referencesFor(
237
- "asyncapi",
238
- config.asyncapi,
239
- "Events",
240
- config.asyncapi.renderer,
241
- {
242
- codeSamples: config.asyncapi.codeSamples,
243
- expandSchemas: config.asyncapi.expandSchemas,
244
- playground: config.asyncapi.playground,
245
- },
246
- config.basePath
247
- ),
248
- // GraphQL is always Blume-rendered — Scalar's embedded SPA reads OpenAPI
249
- // documents only, so the block declares no `renderer` opt-out (nor the
250
- // schema-row `expandSchemas` toggle; GraphQL field tables have no nesting).
251
- ...referencesFor(
252
- "graphql",
253
- config.graphql,
254
- "GraphQL",
255
- "blume",
256
- {
257
- codeSamples: config.graphql.codeSamples,
258
- expandSchemas: false,
259
- playground: config.graphql.playground,
260
- },
261
- config.basePath
262
- ),
263
- ];
267
+ export const resolveReferences = (config: ResolvedConfig): ReferenceSource[] =>
268
+ config.reference.flatMap((adapter) =>
269
+ referencesFor(adapter, config.basePath)
270
+ );
264
271
 
265
272
  /**
266
- * Mounted route for every reference, regardless of renderer. References no
273
+ * Mounted route for every reference, regardless of kind. References no
267
274
  * longer add a header tab automatically — authors point a `navigation.tabs`
268
275
  * entry at one of these routes to surface it (and, for Blume-rendered specs, to
269
276
  * scope its operations sidebar). These routes are whitelisted as valid nav
@@ -274,9 +281,7 @@ export const referenceRoutes = (config: ResolvedConfig): string[] =>
274
281
  // Blume-rendered operation pages flow through the content pipeline and are
275
282
  // mounted under `basePath`. Scalar references are a single embedded page
276
283
  // injected at the raw `route`, left root-anchored.
277
- ref.renderer === "blume"
278
- ? withBasePath(config.basePath, ref.route)
279
- : ref.route
284
+ ref.kind === "scalar" ? ref.route : withBasePath(config.basePath, ref.route)
280
285
  );
281
286
 
282
287
  /**
@@ -287,10 +292,10 @@ export const referenceRoutes = (config: ResolvedConfig): string[] =>
287
292
  */
288
293
  const blumeReferenceOf = (
289
294
  ref: ReferenceSource,
290
- seen: Map<string, ReferenceSource>,
295
+ seen: Map<string, BlumeReferenceSource>,
291
296
  usedSlugs: Set<string>
292
- ): ReferenceSource | null => {
293
- if (ref.renderer !== "blume") {
297
+ ): BlumeReferenceSource | null => {
298
+ if (!isBlumeReference(ref)) {
294
299
  return null;
295
300
  }
296
301
  const kept = seen.get(ref.route);
@@ -318,11 +323,13 @@ const blumeReferenceOf = (
318
323
  return accepted;
319
324
  };
320
325
 
321
- /** Blume-rendered references (both kinds), deduped by route (first wins). */
322
- export const blumeReferences = (config: ResolvedConfig): ReferenceSource[] => {
323
- const seen = new Map<string, ReferenceSource>();
326
+ /** Blume-rendered references (every kind but Scalar), deduped by route (first wins). */
327
+ export const blumeReferences = (
328
+ config: ResolvedConfig
329
+ ): BlumeReferenceSource[] => {
330
+ const seen = new Map<string, BlumeReferenceSource>();
324
331
  const usedSlugs = new Set<string>();
325
- const result: ReferenceSource[] = [];
332
+ const result: BlumeReferenceSource[] = [];
326
333
  for (const ref of resolveReferences(config)) {
327
334
  const accepted = blumeReferenceOf(ref, seen, usedSlugs);
328
335
  if (accepted) {
@@ -332,42 +339,35 @@ export const blumeReferences = (config: ResolvedConfig): ReferenceSource[] => {
332
339
  return result;
333
340
  };
334
341
 
335
- /** Whether any reference is Scalar-rendered (gates the `@scalar/astro` dep + pages). */
342
+ /** Whether any reference is Scalar-rendered (gates the Scalar pages). */
336
343
  export const hasScalarReferences = (config: ResolvedConfig): boolean =>
337
- resolveReferences(config).some((ref) => ref.renderer === "scalar");
344
+ resolveReferences(config).some((ref) => ref.kind === "scalar");
338
345
 
339
346
  /**
340
- * The reference kinds whose enabled, Blume-rendered playground opted into the
347
+ * The Blume-rendered references whose enabled playground opted into the
341
348
  * built-in CORS proxy with `proxy: true`. A proxy URL string points at an
342
349
  * external service, and `false` sends requests directly — neither routes
343
- * through the endpoint. The generator's per-spec allowlist diagnostics key on
344
- * this, so it shares one definition with {@link needsPlaygroundProxy}.
350
+ * through the endpoint. AsyncAPI never does: an event composer's WebSocket
351
+ * connect is direct, so its `proxy` has nothing to forward. Drawn from the
352
+ * deduped set so the slugs match the `blume:openapi` data keys; the
353
+ * generator's per-spec allowlist diagnostics key on this, so it shares one
354
+ * definition with {@link needsPlaygroundProxy}.
345
355
  */
346
- export const builtinProxyKinds = (config: ResolvedConfig): ReferenceKind[] => {
347
- const kinds: ReferenceKind[] = [];
348
- if (
349
- config.openapi.enabled &&
350
- config.openapi.renderer === "blume" &&
351
- config.openapi.playground.enabled &&
352
- config.openapi.playground.proxy === true
353
- ) {
354
- kinds.push("openapi");
355
- }
356
- if (
357
- config.graphql.enabled &&
358
- config.graphql.playground.enabled &&
359
- config.graphql.playground.proxy === true
360
- ) {
361
- kinds.push("graphql");
362
- }
363
- return kinds;
364
- };
356
+ export const builtinProxyReferences = (
357
+ config: ResolvedConfig
358
+ ): BlumeReferenceSource[] =>
359
+ blumeReferences(config).filter(
360
+ (ref) =>
361
+ ref.kind !== "asyncapi" &&
362
+ ref.display.playground.enabled &&
363
+ ref.display.playground.proxy === true
364
+ );
365
365
 
366
366
  /**
367
367
  * Whether the built-in playground CORS proxy endpoint (`/_api-proxy`) must be
368
- * generated: some enabled Blume-rendered block's playground opted into it with
368
+ * generated: some Blume-rendered reference's playground opted into it with
369
369
  * `proxy: true`. Shared by the server feature gate and the generator so the
370
370
  * two can never disagree.
371
371
  */
372
372
  export const needsPlaygroundProxy = (config: ResolvedConfig): boolean =>
373
- builtinProxyKinds(config).length > 0;
373
+ builtinProxyReferences(config).length > 0;
@@ -1,14 +1,16 @@
1
- import type { Nodes } from "mdast";
1
+ import type { Nodes, Root } from "mdast";
2
2
  import { fromMarkdown } from "mdast-util-from-markdown";
3
3
  import { toString as mdastToString } from "mdast-util-to-string";
4
4
  import stringWidth from "string-width";
5
5
 
6
6
  import { apiNamePhrase } from "../core/api-name.ts";
7
+ import { unsafeLinkSpans } from "../core/safe-links.ts";
7
8
  import { columnsPrefix } from "../core/text-width.ts";
8
9
  import type { GraphqlMember } from "./graphql.ts";
9
10
  import { isGraphqlOperationKind } from "./graphql.ts";
10
11
  import type { ApiOperationRef, ApiSpecData } from "./model.ts";
11
12
  import type { ReferenceSource } from "./references.ts";
13
+ import { asSentence } from "./sentence.ts";
12
14
  import { operationSignature } from "./signature.ts";
13
15
 
14
16
  /**
@@ -60,7 +62,7 @@ const escapeProse = (text: string): string =>
60
62
  * whose braces genuinely need escaping; fence-or-backtick is told apart from
61
63
  * indentation by the construct's first character.
62
64
  */
63
- const codeSpans = (text: string): [number, number][] => {
65
+ const codeSpans = (text: string, tree: Root): [number, number][] => {
64
66
  const spans: [number, number][] = [];
65
67
  const collect = (node: Nodes): void => {
66
68
  if (node.type === "inlineCode" || node.type === "code") {
@@ -84,18 +86,33 @@ const codeSpans = (text: string): [number, number][] => {
84
86
  }
85
87
  }
86
88
  };
87
- collect(fromMarkdown(text));
89
+ collect(tree);
88
90
  return spans;
89
91
  };
90
92
 
91
- /** Escape MDX-special syntax in prose while leaving code verbatim. */
93
+ /**
94
+ * Escape MDX-special syntax in prose while leaving code verbatim. A spec is
95
+ * someone else's content, so a link whose destination isn't a web, mail, or
96
+ * relative address (`javascript:`, `data:`) is reduced to its label rather
97
+ * than rendered clickable on the docs site (see `core/safe-links.ts`).
98
+ */
92
99
  const mdxSafe = (text: string): string => {
100
+ const tree = fromMarkdown(text);
101
+ const unsafe = unsafeLinkSpans(tree);
102
+ const insideUnsafe = (offset: number): boolean =>
103
+ unsafe.some((span) => offset >= span.start && offset < span.end);
104
+ const segments = [
105
+ ...codeSpans(text, tree)
106
+ .filter(([start]) => !insideUnsafe(start))
107
+ .map(([start, end]) => ({ end, start, text: text.slice(start, end) })),
108
+ ...unsafe,
109
+ ].toSorted((a, b) => a.start - b.start);
93
110
  let out = "";
94
111
  let cursor = 0;
95
- for (const [start, end] of codeSpans(text)) {
96
- out += escapeProse(text.slice(cursor, start));
97
- out += text.slice(start, end);
98
- cursor = end;
112
+ for (const segment of segments) {
113
+ out += escapeProse(text.slice(cursor, segment.start));
114
+ out += segment.text;
115
+ cursor = segment.end;
99
116
  }
100
117
  return out + escapeProse(text.slice(cursor));
101
118
  };
@@ -208,11 +225,16 @@ const operationDescription = (
208
225
  subject = `${operation.method.toUpperCase()} ${operation.path} endpoint`;
209
226
  }
210
227
  const suffix = `Reference for the ${subject} in the ${apiPhrase(spec)}.`;
228
+ // Room for the joining space and the period `asSentence` may add, so a
229
+ // title-like summary ("Get a flag") ends before the suffix begins.
211
230
  const prose = clip(
212
231
  plainProse(operation.description || operation.summary),
213
- META_DESCRIPTION_MAX - stringWidth(suffix) - 1
232
+ META_DESCRIPTION_MAX - stringWidth(suffix) - 2
233
+ );
234
+ return clip(
235
+ [asSentence(prose), suffix].filter(Boolean).join(" "),
236
+ META_DESCRIPTION_MAX
214
237
  );
215
- return clip([prose, suffix].filter(Boolean).join(" "), META_DESCRIPTION_MAX);
216
238
  };
217
239
 
218
240
  /** Prepend a markdown description (if any) above a component invocation. */
@@ -10,11 +10,10 @@ import { resolveReferences } from "./references.ts";
10
10
  import type { ReferenceSource } from "./references.ts";
11
11
 
12
12
  /**
13
- * The Scalar renderer: an escape hatch (`openapi.renderer: "scalar"`) and the
14
- * path AsyncAPI still uses. Each Scalar-rendered spec becomes one self-contained
15
- * `@scalar/astro` page loaded client-side from Scalar's CDN. Blume's own OpenAPI
16
- * renderer (the default) lives in `source.ts` / the `components/openapi` set and
17
- * does not pass through here.
13
+ * The `scalar()` adapter's pages. Each source becomes one self-contained
14
+ * `@scalar/astro` page loaded client-side from Scalar's CDN. Blume's own
15
+ * renderer (`openapi()`, `asyncapi()`, `graphql()`) lives in `source.ts` /
16
+ * the `components/openapi` set and does not pass through here.
18
17
  */
19
18
 
20
19
  /** A generated Scalar reference page, ready to write under `src/pages`. */
@@ -88,7 +87,7 @@ const acceptScalarReference = (
88
87
  contentRoutes: ReadonlySet<string>,
89
88
  warnings: string[]
90
89
  ): ReferenceSource | null => {
91
- if (ref.renderer !== "scalar") {
90
+ if (ref.kind !== "scalar") {
92
91
  return null;
93
92
  }
94
93
  if (seen.has(ref.route)) {
@@ -108,8 +107,8 @@ const acceptScalarReference = (
108
107
  };
109
108
 
110
109
  /**
111
- * Build the Scalar reference page(s) for the project. Only Scalar-rendered
112
- * references are emitted here (Blume-rendered OpenAPI is staged content). Reads
110
+ * Build the Scalar reference page(s) for the project. Only `scalar()`
111
+ * references are emitted here (Blume-rendered kinds are staged content). Reads
113
112
  * local specs, maps the theme, and skips routes that collide with a content page
114
113
  * or another source. Returns the files to write under `src/pages` plus warnings.
115
114
  */
@@ -144,15 +143,18 @@ export const buildReferenceFiles = async (options: {
144
143
  warnings.push(spec.warning);
145
144
  }
146
145
  const pagePath = referencePagePath(ref.route);
146
+ // `theme` is the one option Blume maps (a named theme replaces the
147
+ // accent/radius layering); every other `scalar()` option is forwarded
148
+ // verbatim and wins outright — a full escape hatch over Blume's derived
149
+ // spec/theme config (localization, agent, hideTestRequestButton,
150
+ // orderSchemaPropertiesBy, customCss, and the rest).
151
+ const { theme, ...passthrough } = ref.scalar ?? {};
147
152
  files.push({
148
153
  content: scalarReferenceTemplate({
149
154
  configuration: {
150
155
  ...spec.config,
151
- ...themeConfiguration(config, ref.theme),
152
- // Author-supplied Scalar options win outright — a full escape hatch
153
- // over Blume's derived spec/theme config (localization, agent,
154
- // hideTestRequestButton, orderSchemaPropertiesBy, and the rest).
155
- ...ref.scalar,
156
+ ...themeConfiguration(config, theme),
157
+ ...passthrough,
156
158
  },
157
159
  noindex: ref.noindex,
158
160
  route: ref.route,
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A sentence's closing punctuation, allowing trailing closing quotes or
3
+ * brackets (`…done.")`) and the CJK full-width marks.
4
+ */
5
+ const TERMINAL_PUNCTUATION = /[.!?…。!?]["'”’)\]]*$/u;
6
+
7
+ /**
8
+ * Close a fragment of spec prose as a sentence. OpenAPI `summary` values are
9
+ * usually title-like ("Get a flag", no period), so prose that runs straight
10
+ * into the next generated sentence ("Get a flag Reference for …") needs one.
11
+ * Empty text stays empty.
12
+ */
13
+ export const asSentence = (text: string): string =>
14
+ text === "" || TERMINAL_PUNCTUATION.test(text) ? text : `${text}.`;