blume 1.7.3 → 2.0.1

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 (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  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-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -0,0 +1,136 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import { hasSources, missingSourcesIssue } from "./options.ts";
6
+
7
+ /**
8
+ * What the generated Scalar page imports. Declared on every `scalar()`
9
+ * descriptor so the generated project lists it, which is what lets Astro's
10
+ * framework-package crawl bundle the embed.
11
+ */
12
+ export const SCALAR_RUNTIME_DEPS: readonly string[] = ["@scalar/astro"];
13
+
14
+ /**
15
+ * A single document rendered by a `scalar()` reference. Scalar reads OpenAPI
16
+ * and AsyncAPI documents and detects which it was given, so there is one
17
+ * source shape for both. The embed sits outside Blume's search and llms.txt,
18
+ * so of the native per-source controls only `noindex` applies here.
19
+ */
20
+ export const scalarSourceSchema = z.strictObject({
21
+ /** Nav/section label for this source. */
22
+ label: z.string().optional(),
23
+ /** Emit noindex metadata and omit the page from the sitemap. */
24
+ noindex: z.boolean().default(false),
25
+ /** Per-source route; defaults to the adapter's `route` (or a derived path). */
26
+ route: z.string().optional(),
27
+ /** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
28
+ spec: z.string(),
29
+ });
30
+
31
+ /** One document source, as `scalar()` accepts it. */
32
+ export interface ScalarSourceOptions {
33
+ /** Nav/section label for this source. */
34
+ label?: string;
35
+ /** Emit noindex metadata and omit the page from the sitemap. Defaults to `false`. */
36
+ noindex?: boolean;
37
+ /** Per-source route; defaults to the adapter's `route` (or a derived path). */
38
+ route?: string;
39
+ /** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
40
+ spec: string;
41
+ }
42
+
43
+ /** A source with every default applied. */
44
+ export type ResolvedScalarSource = z.output<typeof scalarSourceSchema>;
45
+
46
+ /**
47
+ * `scalar()` options with every default applied and `spec` folded into
48
+ * `sources`; every key beyond the named ones is forwarded Scalar config.
49
+ */
50
+ export type ResolvedScalarOptions = {
51
+ route: string;
52
+ sources: ResolvedScalarSource[];
53
+ theme?: string;
54
+ } & { [option: string]: JsonValue };
55
+
56
+ /** The options {@link scalar} maps itself. */
57
+ export interface ScalarNamedOptions {
58
+ /** Where the reference mounts. Defaults to `/reference`. */
59
+ route?: string;
60
+ /** One or more documents; each renders on its own route by default. */
61
+ sources?: ScalarSourceOptions[];
62
+ /** Shorthand for a single source: `sources: [{ spec }]`. */
63
+ spec?: string;
64
+ /** A Scalar theme name (`purple`, `moon`, …). Unset keeps Scalar's default theme with Blume's accent and radius layered on top. */
65
+ theme?: string;
66
+ }
67
+
68
+ /**
69
+ * Options for {@link scalar}: the source, route, and `theme` Blume maps, plus
70
+ * any other [Scalar configuration](https://github.com/scalar/scalar/blob/main/documentation/configuration.md)
71
+ * key, forwarded verbatim to the embedded `<ScalarComponent>` (`localization`,
72
+ * `agent`, `hideTestRequestButton`, `orderSchemaPropertiesBy`, …). Blume
73
+ * doesn't mirror Scalar's config surface, so this is a full escape hatch: a
74
+ * forwarded key wins over Blume's own derived spec/theme config. JSON values
75
+ * only — the configuration is inlined into the generated page. `sources` is
76
+ * Blume's (one page per document); Scalar's own multi-document `sources`
77
+ * can't be forwarded.
78
+ */
79
+ export type ScalarOptions = ScalarNamedOptions & {
80
+ [option: string]: JsonValue;
81
+ };
82
+
83
+ /**
84
+ * `spec` is the single-source shorthand and folds into `sources` at parse
85
+ * (through the source schema, so the two can never drift); every key beyond
86
+ * the named ones is Scalar configuration and passes through untouched.
87
+ */
88
+ export const scalarOptionsSchema = z
89
+ .object({
90
+ /** Where the reference mounts. */
91
+ route: z.string().default("/reference"),
92
+ /** One or more documents; each renders on its own route by default. */
93
+ sources: z.array(scalarSourceSchema).default([]),
94
+ /** Shorthand for a single source: `sources: [{ spec }]`. */
95
+ spec: z.string().optional(),
96
+ /** A Scalar theme name; unset layers Blume's accent and radius on Scalar's default theme. */
97
+ theme: z.string().optional(),
98
+ })
99
+ .catchall(z.json())
100
+ .transform(({ spec, sources, ...options }): ResolvedScalarOptions => ({
101
+ ...options,
102
+ sources:
103
+ spec === undefined
104
+ ? sources
105
+ : [scalarSourceSchema.parse({ spec }), ...sources],
106
+ }))
107
+ .refine(hasSources, missingSourcesIssue("scalar"));
108
+
109
+ export type ScalarAdapter = AdapterDescriptor<"scalar", ScalarOptions>;
110
+
111
+ /** A `scalar()` descriptor as the config schema resolves it. */
112
+ export type ResolvedScalarAdapter = AdapterDescriptor<
113
+ "scalar",
114
+ ResolvedScalarOptions
115
+ >;
116
+
117
+ export const scalarAdapterSchema = adapterDescriptorSchema(
118
+ "scalar",
119
+ scalarOptionsSchema
120
+ );
121
+
122
+ /**
123
+ * An API reference rendered by [Scalar](https://scalar.com)'s self-contained
124
+ * UI — its own sidebar, search, theme, and request client on a single route —
125
+ * instead of Blume's native operation pages. Takes an OpenAPI or AsyncAPI
126
+ * document (Scalar detects which); a GraphQL schema has no Scalar embed.
127
+ * Blume's per-page controls don't apply: the embed doesn't weave into the
128
+ * sidebar, search, or llms.txt, and it brings its own request client in place
129
+ * of the Try it playground.
130
+ */
131
+ export const scalar = (options: ScalarOptions): ScalarAdapter => ({
132
+ kind: "scalar",
133
+ options,
134
+ requiredSecrets: [],
135
+ runtimeDeps: [...SCALAR_RUNTIME_DEPS],
136
+ });
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+
3
+ import { unrecognizedKeysMessage } from "../core/unrecognized-keys.ts";
4
+ import { asyncapiAdapterSchema } from "./asyncapi.ts";
5
+ import type { AsyncApiAdapter, ResolvedAsyncApiAdapter } from "./asyncapi.ts";
6
+ import { graphqlAdapterSchema } from "./graphql.ts";
7
+ import type { GraphqlAdapter, ResolvedGraphqlAdapter } from "./graphql.ts";
8
+ import { openapiAdapterSchema } from "./openapi.ts";
9
+ import type { OpenApiAdapter, ResolvedOpenApiAdapter } from "./openapi.ts";
10
+ import { SCALAR_RUNTIME_DEPS, scalarAdapterSchema } from "./scalar.ts";
11
+ import type { ResolvedScalarAdapter, ScalarAdapter } from "./scalar.ts";
12
+
13
+ /** Every descriptor a `blume/reference` factory can return. */
14
+ export type ReferenceAdapter =
15
+ | AsyncApiAdapter
16
+ | GraphqlAdapter
17
+ | OpenApiAdapter
18
+ | ScalarAdapter;
19
+
20
+ /** What `config.reference` holds: each descriptor with its options resolved. */
21
+ export type ResolvedReferenceAdapter =
22
+ | ResolvedAsyncApiAdapter
23
+ | ResolvedGraphqlAdapter
24
+ | ResolvedOpenApiAdapter
25
+ | ResolvedScalarAdapter;
26
+
27
+ /**
28
+ * One configured reference adapter, as its factory returned it. Only `kind`
29
+ * and `options` carry information — the metadata lists are validated for
30
+ * shape, then re-derived from the resolved options so a descriptor that went
31
+ * through JSON resolves to the same canonical metadata the factory ships.
32
+ */
33
+ export const referenceAdapterSchema = z
34
+ .discriminatedUnion("kind", [
35
+ asyncapiAdapterSchema,
36
+ graphqlAdapterSchema,
37
+ openapiAdapterSchema,
38
+ scalarAdapterSchema,
39
+ ])
40
+ .transform((value): ResolvedReferenceAdapter => ({
41
+ ...value,
42
+ requiredSecrets: [],
43
+ // Blume's own renderer parses at generate time and needs nothing; the
44
+ // Scalar embed is imported by its generated page.
45
+ runtimeDeps: value.kind === "scalar" ? [...SCALAR_RUNTIME_DEPS] : [],
46
+ }));
47
+
48
+ const LIST_HINT =
49
+ 'reference is a list of adapters — e.g. `reference: [openapi({ spec }), asyncapi({ spec }), graphql({ spec, endpoint }), scalar({ spec })]`, imported from "blume/reference".';
50
+
51
+ /**
52
+ * `blume.config.reference`: the API references to render, in order. Unset
53
+ * means none. A non-array fails with the list hint; element errors keep their
54
+ * own messages.
55
+ */
56
+ export const referenceConfigSchema = z
57
+ .array(referenceAdapterSchema, {
58
+ error: (issue) => (issue.code === "invalid_type" ? LIST_HINT : undefined),
59
+ })
60
+ .default([]);
61
+
62
+ /** The top-level keys the `reference` list replaced. */
63
+ const REMOVED_KEYS: readonly string[] = ["asyncapi", "graphql", "openapi"];
64
+
65
+ /**
66
+ * The hint for a config still carrying the 1.x `openapi`/`asyncapi`/`graphql`
67
+ * blocks, or `undefined` when none of the unrecognized keys is one of them
68
+ * (so the default "unrecognized key" message applies). Wired into the root
69
+ * config object's error hook: the keys are gone from the schema, so without
70
+ * this a migrating site would see only "Unrecognized key". Any other unknown
71
+ * key keeps Zod's wording beside the hint, and the rest of the config is
72
+ * still validated in the same run.
73
+ */
74
+ export const removedReferenceKeysHint = (
75
+ keys: string[]
76
+ ): string | undefined => {
77
+ const removed = REMOVED_KEYS.filter((key) => keys.includes(key));
78
+ if (removed.length === 0) {
79
+ return undefined;
80
+ }
81
+ const list = removed.map((key) => `\`${key}\``).join(", ");
82
+ const factories = removed.map((key) => `${key}({ … })`).join(", ");
83
+ const hint = `The top-level ${list} config was replaced by \`reference\`, a list of adapters imported from "blume/reference": \`reference: [${factories}]\`. Each block's options move onto its factory unchanged (\`enabled\` is gone — an adapter in the list is enabled), and a block with \`renderer: "scalar"\` becomes its own \`scalar({ spec, theme, …scalar })\` adapter in the list.`;
84
+ const others = keys.filter((key) => !REMOVED_KEYS.includes(key));
85
+ return others.length > 0
86
+ ? `${hint} ${unrecognizedKeysMessage(others)}`
87
+ : hint;
88
+ };
@@ -16,6 +16,7 @@ import {
16
16
  exampleScanRoots,
17
17
  } from "../astro/examples.ts";
18
18
  import {
19
+ analyzeComponentsFile,
19
20
  buildRuntimeData,
20
21
  clientFeaturesFor,
21
22
  collectStaged,
@@ -37,8 +38,6 @@ import {
37
38
  examplesPageTemplate,
38
39
  exampleWrapperTemplate,
39
40
  featuresTemplate,
40
- islandMapTemplate,
41
- islandWrapperTemplate,
42
41
  mcpEndpointTemplate,
43
42
  mcpPageFile,
44
43
  mixedbreadSearchEndpointTemplate,
@@ -46,6 +45,7 @@ import {
46
45
  ogEndpointTemplate,
47
46
  rawMarkdownEndpointTemplate,
48
47
  rssEndpointTemplate,
48
+ runtimeDependencies,
49
49
  runtimeTsconfigTemplate,
50
50
  searchClientTemplate,
51
51
  searchEndpointTemplate,
@@ -55,6 +55,10 @@ import { buildIncludeGraph } from "../core/includes.ts";
55
55
  import { packageRoot } from "../core/package-root.ts";
56
56
  import { scanProject } from "../core/project-graph.ts";
57
57
  import type { BlumeProject } from "../core/project-graph.ts";
58
+ import {
59
+ resolveDocsCollection,
60
+ sourcesOfKind,
61
+ } from "../core/sources/collection.ts";
58
62
  import type { ProjectContext } from "../core/types.ts";
59
63
  import { buildRssFeeds, renderRssFeed } from "../deploy/rss.ts";
60
64
  import type { OpenApiData } from "../openapi/model.ts";
@@ -62,7 +66,6 @@ import { hasScalarReferences } from "../openapi/references.ts";
62
66
  import { buildReferenceFiles } from "../openapi/scalar.ts";
63
67
  import { isOpenApiSource } from "../openapi/source.ts";
64
68
  import { buildSearchDocuments } from "../search/documents.ts";
65
- import { servesStaticIndex } from "../search/providers.ts";
66
69
  import {
67
70
  examplesEntryTemplate,
68
71
  tailwindEntryTemplate,
@@ -113,16 +116,16 @@ const ejectOpenApiData = (project: BlumeProject): OpenApiData => {
113
116
  };
114
117
 
115
118
  /**
116
- * The Ask AI endpoint plus, unless the backend runs its own retrieval (Inkeep),
117
- * its grounding snapshot. Empty when Ask AI is disabled.
119
+ * The assistant endpoint plus, unless the backend runs its own retrieval (Inkeep),
120
+ * its grounding snapshot. Empty when the assistant is disabled.
118
121
  */
119
122
  const askFiles = async (
120
123
  project: BlumeProject,
121
124
  srcDir: string,
122
125
  genDir: string
123
126
  ): Promise<{ content: string; path: string }[]> => {
124
- const { ask } = project.config.ai;
125
- if (!(ask?.enabled && !ask.endpoint)) {
127
+ const { assistant } = project.config.ai;
128
+ if (!(assistant?.enabled && !assistant.endpoint)) {
126
129
  const endpointPath = join(srcDir, "pages", "api", "ask.ts");
127
130
  if (existsSync(endpointPath)) {
128
131
  const content = await readFile(endpointPath, "utf-8");
@@ -133,19 +136,18 @@ const askFiles = async (
133
136
  await rm(join(genDir, "ask-data.json"), { force: true });
134
137
  return [];
135
138
  }
136
- const grounded = ask.provider !== "inkeep";
139
+ const backend = resolveAskBackend(assistant.provider);
137
140
  const files = [
138
141
  {
139
- content: askEndpointTemplate(resolveAskBackend(ask), grounded, {
140
- cors: ask.cors,
141
- instructions: ask.instructions,
142
- reasoning: ask.reasoning,
143
- retrieval: ask.retrieval,
142
+ content: askEndpointTemplate(backend, {
143
+ cors: assistant.cors,
144
+ instructions: assistant.instructions,
145
+ retrieval: assistant.retrieval,
144
146
  }),
145
147
  path: join(srcDir, "pages", "api", "ask.ts"),
146
148
  },
147
149
  ];
148
- if (grounded) {
150
+ if (backend.grounded) {
149
151
  files.push({
150
152
  content: `${JSON.stringify(await buildAskData(project))}\n`,
151
153
  path: join(genDir, "ask-data.json"),
@@ -159,8 +161,12 @@ const hostsMcp = (
159
161
  project: BlumeProject,
160
162
  userPages: { pattern: string }[]
161
163
  ): boolean =>
162
- project.config.ai.mcp.enabled &&
163
- !routeIsTaken(userPages, project.graph.pages, project.config.ai.mcp.route);
164
+ project.config.agents.mcp.enabled &&
165
+ !routeIsTaken(
166
+ userPages,
167
+ project.graph.pages,
168
+ project.config.agents.mcp.route
169
+ );
164
170
 
165
171
  /**
166
172
  * The `.well-known` MCP discovery routes, injected as prerendered pages
@@ -198,7 +204,7 @@ const mcpFiles = async (
198
204
  if (!hostsMcp(project, userPages)) {
199
205
  return [];
200
206
  }
201
- const { route } = project.config.ai.mcp;
207
+ const { route } = project.config.agents.mcp;
202
208
  const data = await buildMcpData(project);
203
209
  const discoveryInput = {
204
210
  base: data.base,
@@ -243,9 +249,8 @@ const changelogFiles = (
243
249
  page.contentType === "changelog" &&
244
250
  !(page.meta.draft || page.meta.sidebar.hidden)
245
251
  );
246
- const hasChangelogSource = (project.config.content.sources ?? []).some(
247
- (source) => source.type === "github-releases"
248
- );
252
+ const hasChangelogSource =
253
+ sourcesOfKind(project.config, "github-releases").length > 0;
249
254
  if (
250
255
  !(hasChangelog || hasChangelogSource) ||
251
256
  routeIsTaken(userPages, project.graph.pages, "/changelog")
@@ -302,6 +307,36 @@ const examplesPreviewFiles = (
302
307
  ]
303
308
  : [];
304
309
 
310
+ /**
311
+ * The packages the ejected app imports by bare name: Astro, Tailwind's Vite
312
+ * plugin, `blume` itself, the integrations the config wires in, whatever the
313
+ * configured adapters declare, and React when islands, examples, or the assistant
314
+ * render with it (Blume ships React, so projects rarely list it). They have
315
+ * to be the project's own dependencies after eject — under a strict linker
316
+ * such as pnpm nothing else makes them resolvable, and `astro build` fails.
317
+ * The hidden runtime reaches the same packages through its `node_modules`
318
+ * junction into Blume's own, so only eject declares the ones its generated
319
+ * files import directly: the AI SDK the assistant route streams through (unless
320
+ * `ai.assistant.endpoint` points elsewhere, when no route is written) and the EPUB
321
+ * generator's browser bundle `features.ts` loads.
322
+ */
323
+ const ejectDependencies = (
324
+ options: Parameters<typeof runtimeDependencies>[0]
325
+ ): string[] => {
326
+ const { assistant } = options.config.ai;
327
+ return [
328
+ ...new Set([
329
+ "astro",
330
+ "@tailwindcss/vite",
331
+ "blume",
332
+ ...runtimeDependencies(options),
333
+ ...(options.needsReact ? ["react", "react-dom"] : []),
334
+ ...(assistant?.enabled && !assistant.endpoint ? ["ai"] : []),
335
+ ...(options.config.export.epub ? ["epub-gen-memory"] : []),
336
+ ]),
337
+ ];
338
+ };
339
+
305
340
  const ejectIntegrationBridge = (
306
341
  config: BlumeProject["config"],
307
342
  root: string,
@@ -318,17 +353,18 @@ const ejectIntegrationBridge = (
318
353
  *
319
354
  * Returns the written files plus non-fatal warnings, mirroring the generated
320
355
  * runtime (e.g. a Scalar reference spec that wasn't found, or a reference
321
- * route colliding with a content page).
356
+ * route colliding with a content page), and the packages the ejected app
357
+ * imports by bare name, for the caller to add to package.json.
322
358
  */
323
359
  export const eject = async (
324
360
  root: string
325
- ): Promise<{ files: string[]; warnings: string[] }> => {
361
+ ): Promise<{ dependencies: string[]; files: string[]; warnings: string[] }> => {
326
362
  const project = await scanProject(root, { mode: "build" });
327
363
  const { context, config } = project;
328
364
 
329
365
  const srcDir = join(root, "src");
330
366
  const genDir = join(srcDir, "generated");
331
- const askEnabled = config.ai.ask?.enabled ?? false;
367
+ const assistantEnabled = config.ai.assistant?.enabled ?? false;
332
368
  const exportPdf = config.export.pdf;
333
369
  const exportEpub = config.export.epub;
334
370
 
@@ -345,6 +381,7 @@ export const eject = async (
345
381
  userExamplesCss,
346
382
  rawMarkdown,
347
383
  islands,
384
+ overrideAnalysis,
348
385
  ] = await Promise.all([
349
386
  context.pagesRoot ? discoverPages(context.pagesRoot) : Promise.resolve([]),
350
387
  detectNeedsReact(root),
@@ -356,14 +393,23 @@ export const eject = async (
356
393
  ),
357
394
  buildRawMarkdown(project),
358
395
  discoverIslands(root),
396
+ analyzeComponentsFile(context.componentsFile),
359
397
  ]);
360
- // Island/example frameworks drive which Astro renderers the ejected config
361
- // wires in; React also switches on for project `.tsx`/`.jsx` and Ask AI.
398
+ // The `islands/` convention and `components.ts` share the same static plan
399
+ // the CLI uses, with every import written relative to its generated file so
400
+ // the ejected app builds from any checkout (like the example wrappers below).
401
+ const slotPlan = planComponentSlots(islands.islands, overrideAnalysis, {
402
+ relativeTo: genDir,
403
+ });
404
+ // Island/example/override frameworks drive which Astro renderers the ejected
405
+ // config wires in; React also switches on for project `.tsx`/`.jsx` and the assistant.
362
406
  const frameworks = new Set<string>([
363
407
  ...islands.islands.map((island) => island.framework),
364
408
  ...examples.examples.map((example) => example.framework),
409
+ ...slotPlan.frameworks,
365
410
  ]);
366
- const needsReact = needsReactRaw || askEnabled || frameworks.has("react");
411
+ const needsReact =
412
+ needsReactRaw || assistantEnabled || frameworks.has("react");
367
413
  const needsVue = frameworks.has("vue");
368
414
  const needsSvelte = frameworks.has("svelte");
369
415
 
@@ -371,13 +417,22 @@ export const eject = async (
371
417
  const relContext: ProjectContext = {
372
418
  ...context,
373
419
  contentRoot: toPosix(relative(root, context.contentRoot)),
420
+ distDir: "./dist",
374
421
  outDir: ".",
422
+ pagesRoot: context.pagesRoot
423
+ ? `./${toPosix(relative(root, context.pagesRoot))}`
424
+ : null,
375
425
  root: ".",
376
426
  };
427
+ // The `docs` collection resolves its base against the real project root and
428
+ // is then relativized like everything else, so the ejected content config
429
+ // never bakes in the absolute path `eject` happened to run from.
430
+ const docsCollection = resolveDocsCollection(config, root);
431
+ const relCollection = {
432
+ ...docsCollection,
433
+ base: toPosix(relative(root, docsCollection.base)),
434
+ };
377
435
 
378
- const componentsImport = context.componentsFile
379
- ? `../../${toPosix(relative(root, context.componentsFile))}`
380
- : null;
381
436
  const relPages = [
382
437
  ...pages.map((page) => ({
383
438
  entrypoint: toPosix(relative(root, page.entrypoint)),
@@ -437,6 +492,7 @@ export const eject = async (
437
492
  },
438
493
  {
439
494
  content: contentConfigTemplate({
495
+ collection: relCollection,
440
496
  config,
441
497
  context: relContext,
442
498
  staged: hasStaged,
@@ -454,18 +510,11 @@ export const eject = async (
454
510
  path: join(srcDir, "pages", "[...slug].astro"),
455
511
  },
456
512
  {
457
- // Eject keeps the portable re-export form (relative import to the user's
458
- // components file); hydration/island wrappers would need machine-specific
459
- // absolute paths, so the ejected app owns and wires those itself.
460
- content: planComponentSlots(componentsImport, null).module,
513
+ content: slotPlan.module,
461
514
  path: join(genDir, "components.ts"),
462
515
  },
463
- // Island/example maps the catch-all imports; written even when empty so the
464
- // relative import and the `blume:examples` alias always resolve.
465
- {
466
- content: islandMapTemplate(islands.islands),
467
- path: join(genDir, "islands.ts"),
468
- },
516
+ // The example map the catch-all imports; written even when empty so the
517
+ // `blume:examples` alias always resolves.
469
518
  {
470
519
  content: exampleMapTemplate(examples.examples, config.basePath),
471
520
  path: join(genDir, "examples.ts"),
@@ -502,7 +551,7 @@ export const eject = async (
502
551
  // The header's Ask trigger behind the `blume:ask` alias. Always written — it
503
552
  // renders nothing when Ask is off — so the alias always resolves.
504
553
  {
505
- content: askComponentTemplate(askEnabled),
554
+ content: askComponentTemplate(assistantEnabled),
506
555
  path: join(genDir, "Ask.astro"),
507
556
  },
508
557
  {
@@ -532,7 +581,7 @@ export const eject = async (
532
581
  },
533
582
  ];
534
583
 
535
- if (askEnabled) {
584
+ if (assistantEnabled) {
536
585
  files.push(...(await askFiles(project, srcDir, genDir)));
537
586
  }
538
587
 
@@ -553,7 +602,6 @@ export const eject = async (
553
602
  ...changelogFiles(project, pages, srcDir, {
554
603
  exportEpub,
555
604
  exportPdf,
556
- mathEnabled: usesMath,
557
605
  needsReact,
558
606
  staged: hasStaged,
559
607
  })
@@ -582,7 +630,8 @@ export const eject = async (
582
630
  }
583
631
  );
584
632
 
585
- if (servesStaticIndex(config.search.provider)) {
633
+ const searchAdapter = config.search.provider;
634
+ if (searchAdapter.mode === "static") {
586
635
  const documents = await buildSearchDocuments(project);
587
636
  files.push(
588
637
  {
@@ -596,11 +645,9 @@ export const eject = async (
596
645
  );
597
646
  }
598
647
 
599
- if (config.search.provider === "mixedbread") {
648
+ if (searchAdapter.kind === "mixedbread") {
600
649
  files.push({
601
- content: mixedbreadSearchEndpointTemplate(
602
- config.search.mixedbread?.storeId ?? ""
603
- ),
650
+ content: mixedbreadSearchEndpointTemplate(searchAdapter.options),
604
651
  path: join(srcDir, "pages", "api", "search.ts"),
605
652
  });
606
653
  }
@@ -642,14 +689,14 @@ export const eject = async (
642
689
  }
643
690
  }
644
691
 
645
- // Per-island and per-example live wrappers referenced by the maps above.
692
+ // Per-override and per-example live wrappers referenced by the maps above.
646
693
  files.push(
647
- ...islands.islands.map((island) => ({
648
- content: islandWrapperTemplate(island),
649
- path: join(genDir, "islands", `${island.name}.astro`),
694
+ ...slotPlan.wrappers.map((wrapper) => ({
695
+ content: wrapper.content,
696
+ path: join(genDir, "component-slots", `${wrapper.name}.astro`),
650
697
  })),
651
698
  ...examples.examples.map((example) => ({
652
- content: exampleWrapperTemplate(example),
699
+ content: exampleWrapperTemplate(example, join(genDir, "examples")),
653
700
  path: join(genDir, "examples", `${exampleSlug(example.path)}.astro`),
654
701
  })),
655
702
  ...examplesPreviewFiles(
@@ -688,5 +735,14 @@ export const eject = async (
688
735
  // The hidden runtime is no longer the source of truth.
689
736
  await rm(context.outDir, { force: true, recursive: true });
690
737
 
691
- return { files: written.map((file) => file.path), warnings };
738
+ return {
739
+ dependencies: ejectDependencies({
740
+ config,
741
+ needsReact,
742
+ needsSvelte,
743
+ needsVue,
744
+ }),
745
+ files: written.map((file) => file.path),
746
+ warnings,
747
+ };
692
748
  };
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+
3
+ import type { JsonValue } from "../../core/adapter.ts";
4
+ import type { SearchAdapter } from "./types.ts";
5
+
6
+ /**
7
+ * Public Algolia credentials. The browser queries the index with the
8
+ * search-only `apiKey`; the build-time sync replaces the index with the admin
9
+ * key from `ALGOLIA_ADMIN_API_KEY`, which never enters the config.
10
+ */
11
+ export interface AlgoliaNamedOptions {
12
+ appId: string;
13
+ /** The search-only API key (public — it ships to the browser). */
14
+ apiKey: string;
15
+ indexName: string;
16
+ }
17
+
18
+ /**
19
+ * Options for {@link algolia}: the named options plus any other client
20
+ * option, forwarded to the browser verbatim. JSON values only.
21
+ */
22
+ export type AlgoliaOptions = AlgoliaNamedOptions & {
23
+ [option: string]: JsonValue;
24
+ };
25
+
26
+ export type AlgoliaAdapter = SearchAdapter<"algolia", "hosted", AlgoliaOptions>;
27
+
28
+ export const algoliaOptionsSchema = z
29
+ .object({
30
+ apiKey: z.string(),
31
+ appId: z.string(),
32
+ indexName: z.string(),
33
+ })
34
+ .catchall(z.json());
35
+
36
+ /**
37
+ * Hosted search on Algolia. Each `blume build` replaces the whole index with
38
+ * the current records, so deleted or renamed pages don't linger as stale hits.
39
+ */
40
+ export const algolia = (options: AlgoliaOptions): AlgoliaAdapter => ({
41
+ kind: "algolia",
42
+ mode: "hosted",
43
+ options,
44
+ requiredSecrets: [],
45
+ runtimeDeps: ["algoliasearch"],
46
+ });
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+
3
+ import type { KeylessSearchOptions, SearchAdapter } from "./types.ts";
4
+
5
+ /** FlexSearch takes no options; unknown keys fail config validation. */
6
+ export type FlexsearchOptions = KeylessSearchOptions;
7
+
8
+ export type FlexsearchAdapter = SearchAdapter<
9
+ "flexsearch",
10
+ "static",
11
+ FlexsearchOptions
12
+ >;
13
+
14
+ export const flexsearchOptionsSchema = z.strictObject({});
15
+
16
+ /**
17
+ * A second keyless, client-side engine. It loads the same `/blume-search.json`
18
+ * index Orama ships and builds a FlexSearch document index in the browser.
19
+ * No locale-aware tokenizer, so prefer Orama for non-Latin scripts.
20
+ */
21
+ export const flexsearch = (
22
+ options: FlexsearchOptions = {}
23
+ ): FlexsearchAdapter => ({
24
+ kind: "flexsearch",
25
+ mode: "static",
26
+ options,
27
+ requiredSecrets: [],
28
+ runtimeDeps: ["flexsearch"],
29
+ });