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
@@ -1,18 +1,29 @@
1
- import { isAbsolute, join, resolve } from "pathe";
1
+ import { join } from "pathe";
2
2
 
3
3
  import { blumeReferences } from "../../openapi/references.ts";
4
4
  import { openApiSource } from "../../openapi/source.ts";
5
- import type { ContentSourceConfig, ResolvedConfig } from "../schema.ts";
5
+ import type { ContentSourceAdapter } from "../../sources/registry.ts";
6
+ import type { ResolvedConfig } from "../schema.ts";
6
7
  import type { ProjectContext } from "../types.ts";
8
+ import { contentfulSource } from "./contentful.ts";
7
9
  import { filesystemSource } from "./filesystem.ts";
8
10
  import { githubReleasesSource } from "./github-releases.ts";
9
11
  import { mdxRemoteSource } from "./mdx-remote.ts";
10
12
  import { notionSource } from "./notion.ts";
11
13
  import { obsidianSource } from "./obsidian.ts";
14
+ import { payloadSource } from "./payload.ts";
12
15
  import { sanitySource } from "./sanity.ts";
16
+ import { strapiSource } from "./strapi.ts";
13
17
  import type { ContentSource, SourceContext } from "./types.ts";
14
18
 
15
- /** Allocate a unique, stable source name from a base (prefix or type). */
19
+ export {
20
+ resolveDocsCollection,
21
+ resolveSourceRoot,
22
+ sourcesOfKind,
23
+ } from "./collection.ts";
24
+ export type { DocsCollection } from "./collection.ts";
25
+
26
+ /** Allocate a unique, stable source name from a base (prefix or kind). */
16
27
  const uniqueNamer = (): ((base: string) => string) => {
17
28
  const used = new Set<string>();
18
29
  return (base) => {
@@ -63,191 +74,118 @@ const typeFrontmatterKeys = (
63
74
  ])
64
75
  );
65
76
 
77
+ /**
78
+ * Instantiate the engine-side source for a descriptor. Each adapter's options
79
+ * spread straight into its engine factory: the descriptor carries exactly the
80
+ * fields the factory documents, plus the shared `prefix`/`pollInterval`.
81
+ */
66
82
  const buildSource = (
67
- def: ContentSourceConfig,
83
+ adapter: ContentSourceAdapter,
68
84
  name: string,
69
85
  config: ResolvedConfig,
70
86
  context: ProjectContext,
71
87
  runtime: SourceRuntime
72
88
  ): ContentSource => {
73
- if (def.type === "filesystem") {
74
- return filesystemSource({
75
- exclude: def.exclude,
76
- include: def.include,
77
- name,
78
- prefix: def.prefix,
79
- projectRoot: context.root,
80
- root: def.root,
81
- });
82
- }
83
- if (def.type === "custom") {
84
- // A user-provided instance manages its own context/caching; we only ensure
85
- // its name is unique across the project for id namespacing.
86
- return def.source.name === name ? def.source : { ...def.source, name };
87
- }
88
- if (def.type === "sanity") {
89
- return sanitySource(
90
- {
91
- apiVersion: def.apiVersion,
92
- dataset: def.dataset,
93
- fields: def.fields,
94
- name,
95
- pollInterval: def.pollInterval,
96
- prefix: def.prefix,
97
- projectId: def.projectId,
98
- query: def.query,
99
- },
100
- sourceContext(context, name, runtime)
101
- );
102
- }
103
- if (def.type === "notion") {
104
- return notionSource(
105
- {
106
- concurrency: def.concurrency,
107
- database: def.database,
108
- name,
109
- pollInterval: def.pollInterval,
110
- prefix: def.prefix,
111
- properties: def.properties,
112
- publishedValue: def.publishedValue,
113
- },
114
- sourceContext(context, name, runtime)
115
- );
116
- }
117
- if (def.type === "obsidian") {
118
- return obsidianSource(
119
- {
120
- defaultType: config.content.defaultType,
121
- exclude: def.exclude,
122
- frontmatterKeys: Object.keys(config.frontmatter.extend),
123
- i18n: config.i18n,
124
- name,
125
- prefix: def.prefix,
126
- typeFrontmatterKeys: typeFrontmatterKeys(config),
127
- vault: def.vault,
128
- versions: config.versions,
129
- },
130
- sourceContext(context, name, runtime)
131
- );
132
- }
133
- if (def.type === "github-releases") {
134
- return githubReleasesSource(
135
- {
136
- drafts: def.drafts,
137
- limit: def.limit,
138
- name,
139
- owner: def.owner,
140
- pollInterval: def.pollInterval,
141
- prefix: def.prefix,
142
- prereleases: def.prereleases,
143
- repo: def.repo,
144
- },
145
- sourceContext(context, name, runtime)
146
- );
89
+ switch (adapter.kind) {
90
+ case "filesystem": {
91
+ const { pollInterval: _ignored, ...options } = adapter.options;
92
+ return filesystemSource({ ...options, name, projectRoot: context.root });
93
+ }
94
+ case "custom": {
95
+ // A user-provided instance manages its own context/caching; we only ensure
96
+ // its name is unique across the project for id namespacing.
97
+ const source = adapter.options;
98
+ return source.name === name ? source : { ...source, name };
99
+ }
100
+ case "sanity": {
101
+ return sanitySource(
102
+ { ...adapter.options, name },
103
+ sourceContext(context, name, runtime)
104
+ );
105
+ }
106
+ case "notion": {
107
+ return notionSource(
108
+ { ...adapter.options, name },
109
+ sourceContext(context, name, runtime)
110
+ );
111
+ }
112
+ case "contentful": {
113
+ return contentfulSource(
114
+ { ...adapter.options, name },
115
+ sourceContext(context, name, runtime)
116
+ );
117
+ }
118
+ case "payload": {
119
+ return payloadSource(
120
+ { ...adapter.options, name },
121
+ sourceContext(context, name, runtime)
122
+ );
123
+ }
124
+ case "strapi": {
125
+ return strapiSource(
126
+ { ...adapter.options, name },
127
+ sourceContext(context, name, runtime)
128
+ );
129
+ }
130
+ case "obsidian": {
131
+ const { pollInterval: _ignored, ...options } = adapter.options;
132
+ return obsidianSource(
133
+ {
134
+ ...options,
135
+ defaultType: config.content.defaultType,
136
+ frontmatterKeys: Object.keys(config.frontmatter.extend),
137
+ i18n: config.i18n,
138
+ name,
139
+ typeFrontmatterKeys: typeFrontmatterKeys(config),
140
+ versions: config.versions,
141
+ },
142
+ sourceContext(context, name, runtime)
143
+ );
144
+ }
145
+ case "github-releases": {
146
+ return githubReleasesSource(
147
+ { ...adapter.options, name },
148
+ sourceContext(context, name, runtime)
149
+ );
150
+ }
151
+ default: {
152
+ // Only `mdx-remote` is left, and TypeScript has narrowed `adapter` to it.
153
+ // It returns after the switch rather than from a last case block: Bun
154
+ // 1.4.0's line coverage never credits the closing brace of a switch's
155
+ // final block, which would fail the 100% gate in CI.
156
+ break;
157
+ }
147
158
  }
148
159
  return mdxRemoteSource(
149
- {
150
- files: def.files,
151
- github: def.github,
152
- include: def.include,
153
- name,
154
- pollInterval: def.pollInterval,
155
- prefix: def.prefix,
156
- url: def.url,
157
- },
160
+ { ...adapter.options, name },
158
161
  sourceContext(context, name, runtime)
159
162
  );
160
163
  };
161
164
 
162
- /** Resolve a source `root` against the project root (absolute passes through). */
163
- const resolveRoot = (projectRoot: string, root: string): string =>
164
- isAbsolute(root) ? root : join(resolve(projectRoot), root);
165
-
166
- /**
167
- * The generated `docs` glob collection: its base directory and the include /
168
- * exclude globs applied under it. Astro's glob loader ids each entry by its path
169
- * relative to `base`, and a filesystem source ids each entry relative to its own
170
- * root — so the two only agree when the collection is rooted at that source. A
171
- * project with exactly one filesystem source therefore roots the collection at
172
- * *that* source (honoring a non-default `root`), rather than the global
173
- * `content.root`. With no sources (the implicit source) or several, the base
174
- * stays `content.root`; a second filesystem source rooted elsewhere can't share
175
- * one base and is caught by the entry-id guard in `scanProject`.
176
- */
177
- export interface DocsCollection {
178
- base: string;
179
- include: string[];
180
- exclude: string[];
181
- }
182
-
183
- export const resolveDocsCollection = (
184
- config: ResolvedConfig,
185
- context: ProjectContext
186
- ): DocsCollection => {
187
- const filesystem = (config.content.sources ?? []).filter(
188
- (def) => def.type === "filesystem"
189
- );
190
- const only = filesystem.length === 1 ? filesystem[0] : undefined;
191
- if (only) {
192
- return {
193
- base: resolveRoot(context.root, only.root),
194
- exclude: only.exclude,
195
- include: only.include,
196
- };
197
- }
198
- return {
199
- base: context.contentRoot,
200
- exclude: config.content.exclude,
201
- include: config.content.include,
202
- };
203
- };
204
-
205
- /** The base name to allocate for a source config (before deduplication). */
206
- const baseName = (def: ContentSourceConfig): string => {
207
- if (def.type === "custom") {
208
- return def.source.name;
209
- }
210
- return def.prefix ?? def.type;
211
- };
212
-
213
- /** The content sources declared by config (implicit filesystem when none). */
214
- const contentSources = (
215
- config: ResolvedConfig,
216
- context: ProjectContext,
217
- runtime: SourceRuntime
218
- ): ContentSource[] => {
219
- const defs = config.content.sources;
220
- if (!defs || defs.length === 0) {
221
- return [
222
- filesystemSource({
223
- exclude: config.content.exclude,
224
- include: config.content.include,
225
- name: "filesystem",
226
- projectRoot: context.root,
227
- root: config.content.root,
228
- }),
229
- ];
165
+ /** The base name to allocate for a descriptor (before deduplication). */
166
+ const baseName = (adapter: ContentSourceAdapter): string => {
167
+ if (adapter.kind === "custom") {
168
+ return adapter.options.name;
230
169
  }
231
-
232
- const nameFor = uniqueNamer();
233
- return defs.map((def) =>
234
- buildSource(def, nameFor(baseName(def)), config, context, runtime)
235
- );
170
+ return adapter.options.prefix ?? adapter.kind;
236
171
  };
237
172
 
238
173
  /**
239
- * Build the ordered list of content sources for a project. With no
240
- * `content.sources` configured, the top-level `root`/`include`/`exclude` desugar
241
- * to a single implicit filesystem source, so existing projects are untouched.
242
- * A Blume-rendered OpenAPI reference contributes an internal staged source that
243
- * lowers each operation into a real content page (routing/nav/search/OG).
174
+ * Build the ordered list of content sources for a project. The config schema
175
+ * already desugared the zero-config shorthand into a single `filesystem()`
176
+ * descriptor, so every project has at least one entry here. A Blume-rendered
177
+ * OpenAPI reference contributes an internal staged source that lowers each
178
+ * operation into a real content page (routing/nav/search/OG).
244
179
  */
245
180
  export const resolveSources = (
246
181
  config: ResolvedConfig,
247
182
  context: ProjectContext,
248
183
  runtime: SourceRuntime
249
184
  ): ContentSource[] => {
250
- const sources = contentSources(config, context, runtime);
185
+ const nameFor = uniqueNamer();
186
+ const sources = config.content.sources.map((adapter) =>
187
+ buildSource(adapter, nameFor(baseName(adapter)), config, context, runtime)
188
+ );
251
189
 
252
190
  const references = blumeReferences(config);
253
191
  if (references.length > 0) {
@@ -2,12 +2,16 @@ import { join } from "pathe";
2
2
 
3
3
  import { BlumeError } from "../diagnostics.ts";
4
4
  import matter from "../frontmatter.ts";
5
+ import { nodeRequire } from "../node-require.ts";
5
6
  import {
6
7
  hashText,
7
8
  loadWithCache,
8
9
  pollingWatch,
9
10
  snapshotCache,
10
11
  } from "./cache.ts";
12
+ import type { JsonObject } from "./json.ts";
13
+ import { asString, getPath } from "./json.ts";
14
+ import { writesMdx } from "./lower.ts";
11
15
  import { slugify, slugifyPath } from "./normalize.ts";
12
16
  import { portableTextToMarkdown } from "./portable-text.ts";
13
17
  import type { PortableTextBlock } from "./portable-text.ts";
@@ -59,19 +63,8 @@ export interface SanitySourceOptions {
59
63
 
60
64
  const IMAGE_REF = /^image-(?<id>[a-f0-9]+)-(?<dims>\d+x\d+)-(?<ext>\w+)$/u;
61
65
 
62
- /** A value in a fetched document: arbitrary JSON the GROQ query returned. */
63
- type SanityValue =
64
- | string
65
- | number
66
- | boolean
67
- | null
68
- | SanityValue[]
69
- | { [key: string]: SanityValue };
70
-
71
66
  /** A document as the GROQ query returns it. */
72
- interface SanityDocument {
73
- [key: string]: SanityValue;
74
- }
67
+ type SanityDocument = JsonObject;
75
68
 
76
69
  /** The frontmatter fields this adapter maps from a document. */
77
70
  interface SanityFrontmatter {
@@ -79,37 +72,6 @@ interface SanityFrontmatter {
79
72
  title?: string;
80
73
  }
81
74
 
82
- /**
83
- * A node a dot path can descend into. Arrays pass too (matching their runtime
84
- * string-key indexing, e.g. `items.0`), so the predicate types them as the
85
- * keyed form both traverse through.
86
- */
87
- const isTraversable = (
88
- value: SanityValue | undefined
89
- ): value is SanityDocument => typeof value === "object" && value !== null;
90
-
91
- /** Resolve a dot path (`slug.current`) against a document. */
92
- const getPath = (
93
- doc: SanityDocument,
94
- path: string
95
- ): SanityValue | undefined => {
96
- let current: SanityValue | undefined = doc;
97
- for (const key of path.split(".")) {
98
- if (isTraversable(current)) {
99
- current = current[key];
100
- } else {
101
- return;
102
- }
103
- }
104
- return current;
105
- };
106
-
107
- const isStringValue = (value: SanityValue | undefined): value is string =>
108
- typeof value === "string";
109
-
110
- const asString = (value: SanityValue | undefined): string | undefined =>
111
- isStringValue(value) ? value : undefined;
112
-
113
75
  /** Build a Sanity CDN URL from an image asset `_ref`. */
114
76
  const imageUrlFromRef = (
115
77
  ref: string,
@@ -134,19 +96,21 @@ interface SanityClientConfig {
134
96
  useCdn: boolean;
135
97
  }
136
98
 
137
- const resolveClient = async (
99
+ const resolveClient = (
138
100
  options: SanitySourceOptions,
139
101
  preview: boolean
140
- ): Promise<SanityClientLike> => {
102
+ ): SanityClientLike => {
141
103
  if (options.client) {
142
104
  return options.client;
143
105
  }
144
106
  let createClient: (config: SanityClientConfig) => SanityClientLike;
145
107
  try {
108
+ // `require`, not `import()`: an ejected app scans in `astro:build:done`
109
+ // (see `core/node-require.ts`).
146
110
  // SAFETY: `@sanity/client` is an optional dependency; its `createClient`
147
111
  // accepts a superset of this config slice and returns a client exposing
148
112
  // the `fetch` method this adapter uses.
149
- ({ createClient } = (await import("@sanity/client")) as {
113
+ ({ createClient } = nodeRequire("@sanity/client") as {
150
114
  createClient: (config: SanityClientConfig) => SanityClientLike;
151
115
  });
152
116
  } catch {
@@ -228,16 +192,19 @@ export const sanitySource = (
228
192
  })
229
193
  : "";
230
194
 
195
+ // Serializer output is MDX (components, directives), so a source with
196
+ // serializers writes its entries as `.mdx`.
197
+ const format = writesMdx(options.serializers) ? "mdx" : "md";
231
198
  const raw = matter.stringify(markdown, data);
232
199
  return {
233
- body: { format: "md", text: markdown },
200
+ body: { format, text: markdown },
234
201
  // Spread into a fresh literal: `SourceEntry.data` wants an
235
202
  // index-signature type, which the named interface lacks.
236
203
  data: { ...data },
237
204
  hash: hashText(raw),
238
205
  lastModified: asString(getPath(doc, fields.lastModified ?? "_updatedAt")),
239
206
  raw,
240
- ref: `${slug}.md`,
207
+ ref: `${slug}.${format}`,
241
208
  };
242
209
  };
243
210
 
@@ -248,7 +215,7 @@ export const sanitySource = (
248
215
  options.name,
249
216
  cache,
250
217
  async () => {
251
- const client = await resolveClient(options, ctx?.preview ?? false);
218
+ const client = resolveClient(options, ctx?.preview ?? false);
252
219
  const docs = await client.fetch<SanityDocument[]>(options.query);
253
220
  return docs.map(toEntry);
254
221
  },
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Strapi's Rich text (Blocks) field → Markdown. Covers every block the
3
+ * editor emits: paragraphs, headings, lists (nested), quotes, code, images,
4
+ * and links with the text modifiers.
5
+ */
6
+ import type { JsonObject, JsonValue } from "./json.ts";
7
+ import { asNumber, asObject, asString, objectsIn } from "./json.ts";
8
+ import {
9
+ absoluteUrl,
10
+ blockquote,
11
+ codeFence,
12
+ headingPrefix,
13
+ image,
14
+ listItem,
15
+ markdownDocument,
16
+ renderInline,
17
+ renderLink,
18
+ unsupported,
19
+ } from "./lower.ts";
20
+
21
+ export interface StrapiBlocksOptions {
22
+ /** The Strapi origin a relative upload URL (`/uploads/x.png`) resolves against. */
23
+ baseUrl?: string;
24
+ }
25
+
26
+ const children = (node: JsonObject): JsonObject[] => objectsIn(node.children);
27
+
28
+ const typeOf = (node: JsonObject): string => asString(node.type) ?? "";
29
+
30
+ const renderInlines = (nodes: JsonObject[]): string =>
31
+ nodes
32
+ // oxlint-disable-next-line no-use-before-define -- mutual recursion: a link's label is itself inline content
33
+ .map((node) => renderInlineNode(node))
34
+ .join("");
35
+
36
+ const renderInlineNode = (node: JsonObject): string => {
37
+ switch (typeOf(node)) {
38
+ case "text": {
39
+ return renderInline(asString(node.text) ?? "", {
40
+ bold: node.bold === true,
41
+ code: node.code === true,
42
+ italic: node.italic === true,
43
+ strike: node.strikethrough === true,
44
+ });
45
+ }
46
+ case "link": {
47
+ return renderLink(renderInlines(children(node)), asString(node.url));
48
+ }
49
+ default: {
50
+ return renderInlines(children(node));
51
+ }
52
+ }
53
+ };
54
+
55
+ const renderList = (node: JsonObject): string => {
56
+ const ordered = asString(node.format) === "ordered";
57
+ return children(node)
58
+ .map((item, index) => {
59
+ const kids = children(item);
60
+ const line = renderInlines(kids.filter((kid) => typeOf(kid) !== "list"));
61
+ const sub = kids
62
+ .filter((kid) => typeOf(kid) === "list")
63
+ .map((list) => renderList(list))
64
+ .join("\n");
65
+ const body = sub ? `${line}\n${sub}` : line;
66
+ return listItem(ordered ? `${index + 1}.` : "-", body);
67
+ })
68
+ .join("\n");
69
+ };
70
+
71
+ const renderImage = (
72
+ node: JsonObject,
73
+ options: StrapiBlocksOptions
74
+ ): string => {
75
+ const file = asObject(node.image);
76
+ const url = file ? asString(file.url) : undefined;
77
+ if (!(file && url)) {
78
+ return "";
79
+ }
80
+ return image(
81
+ asString(file.alternativeText) ?? asString(file.name) ?? "",
82
+ absoluteUrl(url, options.baseUrl)
83
+ );
84
+ };
85
+
86
+ const renderBlock = (
87
+ node: JsonObject,
88
+ options: StrapiBlocksOptions
89
+ ): string => {
90
+ switch (typeOf(node)) {
91
+ case "paragraph": {
92
+ return renderInlines(children(node));
93
+ }
94
+ case "heading": {
95
+ return `${headingPrefix(asNumber(node.level) ?? 1)}${renderInlines(children(node))}`;
96
+ }
97
+ case "quote": {
98
+ return blockquote(renderInlines(children(node)));
99
+ }
100
+ case "list": {
101
+ return renderList(node);
102
+ }
103
+ case "code": {
104
+ // Code children are plain text nodes; their text is literal.
105
+ const code = children(node)
106
+ .map((child) => asString(child.text) ?? "")
107
+ .join("");
108
+ return codeFence(code, asString(node.language) ?? "");
109
+ }
110
+ case "image": {
111
+ return renderImage(node, options);
112
+ }
113
+ default: {
114
+ return unsupported(`Strapi block: ${typeOf(node)}`);
115
+ }
116
+ }
117
+ };
118
+
119
+ /** Serialize a Blocks field value (an array of block nodes) to Markdown. */
120
+ export const strapiBlocksToMarkdown = (
121
+ blocks: JsonValue,
122
+ options: StrapiBlocksOptions = {}
123
+ ): string =>
124
+ markdownDocument(objectsIn(blocks).map((node) => renderBlock(node, options)));