blume 1.7.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +227 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-xhtpx3ff.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-688e0dde.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-hs3gbh8p.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-9bkjd11x.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-9bkjd11x.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-t3tj0dgr.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-exeeb35e.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/chunk-jts8mvcz.js +106 -0
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
  60. package/dist/cli/{chunk-n9sra6sy.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-eevwt1sc.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-ppfvdcd4.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +209 -505
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +28 -11
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2291 -441
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +20 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +176 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +52 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +37 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +12 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +26 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +91 -10
  307. package/docs/discoverability/index.mdx +5 -5
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +26 -22
  329. package/src/ai/ai-catalog.ts +259 -0
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +19 -6
  338. package/src/ai/llms.ts +26 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/mcp/discovery.ts +1 -1
  342. package/src/ai/openapi-components.ts +4 -1
  343. package/src/ai/relative-links.ts +170 -0
  344. package/src/ai/serializers.ts +2 -2
  345. package/src/ai/skills.ts +1 -1
  346. package/src/ai/web-bot-auth.ts +2 -2
  347. package/src/analytics/adobe.ts +46 -0
  348. package/src/analytics/amplitude.ts +79 -0
  349. package/src/analytics/clarity.ts +46 -0
  350. package/src/analytics/clearbit.ts +47 -0
  351. package/src/analytics/cloudflare.ts +67 -0
  352. package/src/analytics/fathom.ts +64 -0
  353. package/src/analytics/google-analytics.ts +84 -0
  354. package/src/analytics/google-tag-manager.ts +61 -0
  355. package/src/analytics/head.ts +130 -0
  356. package/src/analytics/heap.ts +65 -0
  357. package/src/analytics/hightouch.ts +77 -0
  358. package/src/analytics/hotjar.ts +47 -0
  359. package/src/analytics/index.ts +71 -0
  360. package/src/analytics/inline.ts +21 -0
  361. package/src/analytics/logrocket.ts +71 -0
  362. package/src/analytics/mixpanel.ts +92 -0
  363. package/src/analytics/pirsch.ts +66 -0
  364. package/src/analytics/plausible.ts +83 -0
  365. package/src/analytics/posthog.ts +78 -0
  366. package/src/analytics/schema.ts +60 -0
  367. package/src/analytics/script.ts +60 -0
  368. package/src/analytics/segment.ts +85 -0
  369. package/src/analytics/vercel.ts +50 -0
  370. package/src/astro/adapter-root.ts +7 -9
  371. package/src/astro/component-slots.ts +131 -91
  372. package/src/astro/generate.ts +114 -345
  373. package/src/astro/integration.ts +2 -6
  374. package/src/astro/pages.ts +13 -101
  375. package/src/astro/render-deps.ts +379 -0
  376. package/src/astro/runtime-deps.ts +201 -0
  377. package/src/astro/templates.ts +554 -541
  378. package/src/audit/agent.ts +24 -0
  379. package/src/audit/catalog.ts +2 -2
  380. package/src/audit/checks/assets.ts +2 -2
  381. package/src/audit/checks/dns-aid.ts +1 -1
  382. package/src/audit/checks/duplicates.ts +3 -1
  383. package/src/audit/checks/i18n.ts +1 -1
  384. package/src/audit/checks/indexability.ts +7 -7
  385. package/src/audit/checks/links.ts +2 -2
  386. package/src/audit/checks/llms.ts +6 -6
  387. package/src/audit/checks/network.ts +3 -3
  388. package/src/audit/checks/og-image.ts +2 -2
  389. package/src/audit/checks/robots.ts +1 -1
  390. package/src/audit/checks/sitemap.ts +2 -2
  391. package/src/audit/checks/social.ts +1 -1
  392. package/src/audit/run.ts +4 -3
  393. package/src/audit/terms.ts +31 -0
  394. package/src/audit/url.ts +13 -13
  395. package/src/cli/command-meta.ts +10 -0
  396. package/src/cli/commands/audit.ts +39 -20
  397. package/src/cli/commands/build.ts +71 -314
  398. package/src/cli/commands/check.ts +1 -0
  399. package/src/cli/commands/dev.ts +40 -1
  400. package/src/cli/commands/doctor.ts +90 -14
  401. package/src/cli/commands/eject.ts +44 -7
  402. package/src/cli/commands/eval.ts +2 -2
  403. package/src/cli/commands/init.ts +161 -41
  404. package/src/cli/commands/migrate.ts +121 -0
  405. package/src/cli/commands/preview.ts +7 -1
  406. package/src/cli/commands/translate.ts +2 -2
  407. package/src/cli/commands/upgrade.ts +141 -0
  408. package/src/cli/commands/version.ts +57 -44
  409. package/src/cli/eject-scripts.ts +121 -6
  410. package/src/cli/index.ts +11 -1
  411. package/src/cli/init/install.ts +70 -0
  412. package/src/cli/init/questions.ts +7 -0
  413. package/src/cli/init/scaffold.ts +459 -75
  414. package/src/cli/lazy-command.ts +37 -1
  415. package/src/cli/prepare.ts +40 -6
  416. package/src/cli/required-secrets.ts +38 -11
  417. package/src/cli/unknown-flags.ts +266 -0
  418. package/src/cli/yarn-pnp.ts +52 -0
  419. package/src/components/content/AccordionItem.astro +7 -1
  420. package/src/components/content/Card.astro +4 -3
  421. package/src/components/content/ColorItem.astro +22 -4
  422. package/src/components/content/GithubInfo.astro +2 -2
  423. package/src/components/content/Prompt.astro +25 -25
  424. package/src/components/content/Tabs.astro +3 -1
  425. package/src/components/content/Tile.astro +2 -3
  426. package/src/components/content/Tooltip.astro +57 -9
  427. package/src/components/content/content-strings.ts +34 -0
  428. package/src/components/content/diff.ts +1 -1
  429. package/src/components/content/mermaid-element.ts +13 -2
  430. package/src/components/content/prompt-markdown.ts +292 -0
  431. package/src/components/content/tooltip-id.ts +41 -0
  432. package/src/components/islands/hooks.ts +75 -3
  433. package/src/components/layout/Analytics.astro +21 -79
  434. package/src/components/layout/Banner.astro +3 -1
  435. package/src/components/layout/DiscoveryLinks.astro +69 -0
  436. package/src/components/layout/Header.astro +83 -20
  437. package/src/components/layout/LanguageSwitcher.astro +4 -1
  438. package/src/components/layout/Logo.astro +23 -2
  439. package/src/components/layout/NavSelector.astro +13 -2
  440. package/src/components/layout/NavTree.astro +12 -3
  441. package/src/components/layout/NavTreeScript.astro +17 -3
  442. package/src/components/layout/PageActions.astro +3 -3
  443. package/src/components/layout/PageFeedback.astro +11 -1
  444. package/src/components/layout/PageLayout.astro +52 -5
  445. package/src/components/layout/ReferenceLayout.astro +21 -12
  446. package/src/components/layout/RootLayout.astro +69 -43
  447. package/src/components/layout/Search.astro +30 -6
  448. package/src/components/layout/WebMcp.astro +1 -1
  449. package/src/components/layout/analytics-client.ts +101 -15
  450. package/src/components/layout/drawer-inert.ts +113 -15
  451. package/src/components/layout/dropdown-clamp.ts +105 -0
  452. package/src/components/layout/head-scripts.ts +15 -6
  453. package/src/components/layout/nav-utils.ts +17 -0
  454. package/src/components/layout/search/algolia.ts +8 -8
  455. package/src/components/layout/search/orama-cloud.ts +9 -7
  456. package/src/components/layout/search/typesense.ts +11 -17
  457. package/src/components/openapi/MessageComposer.astro +2 -2
  458. package/src/components/openapi/Playground.astro +2 -2
  459. package/src/components/openapi/playground-client.ts +79 -10
  460. package/src/core/changelog-index.ts +24 -0
  461. package/src/core/component-overrides.ts +399 -154
  462. package/src/core/config-input.ts +212 -543
  463. package/src/core/config.ts +130 -41
  464. package/src/core/custom-pages.ts +105 -0
  465. package/src/core/data.ts +32 -11
  466. package/src/core/define-components.ts +12 -9
  467. package/src/core/deployment-env.ts +18 -74
  468. package/src/core/diagnostics.ts +14 -7
  469. package/src/core/graph.ts +69 -25
  470. package/src/core/i18n-ui.ts +6 -2
  471. package/src/core/i18n.ts +17 -0
  472. package/src/core/includes.ts +156 -38
  473. package/src/core/last-modified.ts +6 -11
  474. package/src/core/links.ts +166 -2
  475. package/src/core/manifest.ts +10 -3
  476. package/src/core/navigation.ts +137 -19
  477. package/src/core/new-tab.ts +35 -0
  478. package/src/core/node-require.ts +21 -0
  479. package/src/core/project-graph.ts +42 -26
  480. package/src/core/project.ts +9 -4
  481. package/src/core/request-body.ts +61 -0
  482. package/src/core/safe-href.ts +28 -0
  483. package/src/core/safe-links.ts +68 -0
  484. package/src/core/schema.ts +531 -721
  485. package/src/core/server-features.ts +8 -9
  486. package/src/core/sources/assets.ts +47 -11
  487. package/src/core/sources/collection.ts +67 -0
  488. package/src/core/sources/contentful-rich-text.ts +285 -0
  489. package/src/core/sources/contentful.ts +173 -0
  490. package/src/core/sources/github-releases.ts +51 -1
  491. package/src/core/sources/json.ts +71 -0
  492. package/src/core/sources/lexical.ts +195 -0
  493. package/src/core/sources/lower.ts +226 -0
  494. package/src/core/sources/normalize.ts +52 -2
  495. package/src/core/sources/notion.ts +39 -28
  496. package/src/core/sources/payload.ts +135 -0
  497. package/src/core/sources/portable-text.ts +11 -16
  498. package/src/core/sources/remote.ts +226 -0
  499. package/src/core/sources/resolve.ts +104 -166
  500. package/src/core/sources/sanity.ts +16 -49
  501. package/src/core/sources/strapi-blocks.ts +124 -0
  502. package/src/core/sources/strapi.ts +191 -0
  503. package/src/core/sources/types.ts +12 -1
  504. package/src/core/types.ts +20 -1
  505. package/src/core/ui-packs/ar.ts +6 -2
  506. package/src/core/ui-packs/bg.ts +6 -2
  507. package/src/core/ui-packs/bn.ts +6 -2
  508. package/src/core/ui-packs/ca.ts +3 -1
  509. package/src/core/ui-packs/cs.ts +6 -2
  510. package/src/core/ui-packs/da.ts +6 -2
  511. package/src/core/ui-packs/de.ts +6 -2
  512. package/src/core/ui-packs/el.ts +3 -1
  513. package/src/core/ui-packs/es.ts +3 -1
  514. package/src/core/ui-packs/fa.ts +6 -2
  515. package/src/core/ui-packs/fi.ts +6 -2
  516. package/src/core/ui-packs/fr.ts +3 -1
  517. package/src/core/ui-packs/he.ts +6 -2
  518. package/src/core/ui-packs/hi.ts +6 -2
  519. package/src/core/ui-packs/hr.ts +6 -2
  520. package/src/core/ui-packs/hu.ts +6 -2
  521. package/src/core/ui-packs/id.ts +6 -2
  522. package/src/core/ui-packs/it.ts +3 -1
  523. package/src/core/ui-packs/ja.ts +3 -1
  524. package/src/core/ui-packs/ko.ts +3 -1
  525. package/src/core/ui-packs/nl.ts +6 -2
  526. package/src/core/ui-packs/no.ts +6 -2
  527. package/src/core/ui-packs/pl.ts +6 -2
  528. package/src/core/ui-packs/pt-br.ts +3 -1
  529. package/src/core/ui-packs/pt.ts +3 -1
  530. package/src/core/ui-packs/ro.ts +6 -2
  531. package/src/core/ui-packs/ru.ts +6 -2
  532. package/src/core/ui-packs/sk.ts +6 -2
  533. package/src/core/ui-packs/sr.ts +6 -2
  534. package/src/core/ui-packs/sv.ts +6 -2
  535. package/src/core/ui-packs/th.ts +3 -1
  536. package/src/core/ui-packs/tr.ts +6 -2
  537. package/src/core/ui-packs/uk.ts +6 -2
  538. package/src/core/ui-packs/vi.ts +3 -1
  539. package/src/core/ui-packs/zh-tw.ts +3 -1
  540. package/src/core/ui-packs/zh.ts +3 -1
  541. package/src/core/unrecognized-keys.ts +10 -0
  542. package/src/core/version-cut.ts +116 -8
  543. package/src/deploy/adapter-output.ts +57 -97
  544. package/src/deploy/adapters/cloudflare.ts +39 -0
  545. package/src/deploy/adapters/index.ts +41 -0
  546. package/src/deploy/adapters/netlify.ts +34 -0
  547. package/src/deploy/adapters/node.ts +34 -0
  548. package/src/deploy/adapters/registry.ts +127 -0
  549. package/src/deploy/adapters/types.ts +92 -0
  550. package/src/deploy/adapters/vercel.ts +35 -0
  551. package/src/deploy/artifacts.ts +67 -28
  552. package/src/deploy/cloudflare-negotiation.ts +179 -100
  553. package/src/deploy/function-bundle.ts +18 -3
  554. package/src/deploy/headers.ts +129 -22
  555. package/src/deploy/node-headers.ts +198 -0
  556. package/src/deploy/platforms/cloudflare.ts +312 -0
  557. package/src/deploy/platforms/index.ts +67 -0
  558. package/src/deploy/platforms/netlify.ts +52 -0
  559. package/src/deploy/platforms/node.ts +40 -0
  560. package/src/deploy/platforms/paths.ts +42 -0
  561. package/src/deploy/platforms/static.ts +29 -0
  562. package/src/deploy/platforms/types.ts +112 -0
  563. package/src/deploy/platforms/vercel.ts +193 -0
  564. package/src/deploy/redirects.ts +30 -18
  565. package/src/deploy/robots.ts +3 -3
  566. package/src/deploy/rss.ts +2 -2
  567. package/src/deploy/sitemap.ts +2 -2
  568. package/src/deploy/vercel-negotiation.ts +27 -4
  569. package/src/eval/agents.ts +32 -1
  570. package/src/eval/findings.ts +19 -11
  571. package/src/eval/report.ts +10 -2
  572. package/src/markdown/external-links.ts +65 -0
  573. package/src/markdown/include.ts +45 -27
  574. package/src/markdown/index.ts +34 -9
  575. package/src/markdown/inline-code.ts +12 -6
  576. package/src/markdown/relative-links.ts +324 -0
  577. package/src/markdown/themes.ts +3 -3
  578. package/src/migrate/migrate.ts +149 -0
  579. package/src/openapi/parse.ts +64 -16
  580. package/src/openapi/proxy.ts +62 -10
  581. package/src/openapi/references.ts +147 -147
  582. package/src/openapi/render-mdx.ts +32 -10
  583. package/src/openapi/scalar.ts +15 -13
  584. package/src/openapi/sentence.ts +14 -0
  585. package/src/openapi/source.ts +37 -21
  586. package/src/openapi/spec-dependency-error.ts +15 -0
  587. package/src/reference/asyncapi.ts +83 -0
  588. package/src/reference/graphql.ts +89 -0
  589. package/src/reference/index.ts +40 -0
  590. package/src/reference/openapi.ts +83 -0
  591. package/src/reference/options.ts +201 -0
  592. package/src/reference/scalar.ts +136 -0
  593. package/src/reference/schema.ts +88 -0
  594. package/src/registry/eject.ts +97 -42
  595. package/src/search/adapters/algolia.ts +46 -0
  596. package/src/search/adapters/flexsearch.ts +29 -0
  597. package/src/search/adapters/index.ts +39 -0
  598. package/src/search/adapters/mixedbread.ts +39 -0
  599. package/src/search/adapters/orama-cloud.ts +51 -0
  600. package/src/search/adapters/orama.ts +24 -0
  601. package/src/search/adapters/pagefind.ts +27 -0
  602. package/src/search/adapters/registry.ts +131 -0
  603. package/src/search/adapters/types.ts +46 -0
  604. package/src/search/adapters/typesense.ts +57 -0
  605. package/src/search/build.ts +33 -7
  606. package/src/search/documents.ts +6 -0
  607. package/src/search/sync/algolia.ts +12 -11
  608. package/src/search/sync/index.ts +35 -20
  609. package/src/search/sync/orama-cloud.ts +12 -9
  610. package/src/search/sync/typesense.ts +15 -13
  611. package/src/sources/contentful.ts +63 -0
  612. package/src/sources/custom.ts +38 -0
  613. package/src/sources/filesystem.ts +51 -0
  614. package/src/sources/github-releases.ts +52 -0
  615. package/src/sources/index.ts +60 -0
  616. package/src/sources/mdx-remote.ts +76 -0
  617. package/src/sources/notion.ts +63 -0
  618. package/src/sources/obsidian.ts +38 -0
  619. package/src/sources/payload.ts +60 -0
  620. package/src/sources/registry.ts +182 -0
  621. package/src/sources/sanity.ts +66 -0
  622. package/src/sources/shared.ts +52 -0
  623. package/src/sources/strapi.ts +58 -0
  624. package/src/theme/entry.ts +47 -2
  625. package/src/translate/report.ts +40 -7
  626. package/src/upgrade/upgrade.ts +499 -0
  627. package/dist/cli/chunk-12dxjqk7.js.map +0 -10
  628. package/dist/cli/chunk-196vjxp9.js.map +0 -13
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-30e87n55.js +0 -108
  632. package/dist/cli/chunk-30e87n55.js.map +0 -10
  633. package/dist/cli/chunk-450a7rcr.js +0 -185
  634. package/dist/cli/chunk-450a7rcr.js.map +0 -11
  635. package/dist/cli/chunk-5n7t497w.js.map +0 -40
  636. package/dist/cli/chunk-61j18dwk.js +0 -5342
  637. package/dist/cli/chunk-61j18dwk.js.map +0 -58
  638. package/dist/cli/chunk-88by27n5.js +0 -17
  639. package/dist/cli/chunk-88by27n5.js.map +0 -10
  640. package/dist/cli/chunk-8cd8tj54.js.map +0 -34
  641. package/dist/cli/chunk-aztttvb3.js +0 -381
  642. package/dist/cli/chunk-aztttvb3.js.map +0 -12
  643. package/dist/cli/chunk-cvky9gb2.js.map +0 -11
  644. package/dist/cli/chunk-ejjx8znq.js.map +0 -15
  645. package/dist/cli/chunk-fmceyezb.js +0 -1007
  646. package/dist/cli/chunk-fmceyezb.js.map +0 -13
  647. package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
  648. package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
  649. package/dist/cli/chunk-jbj4qhfw.js +0 -30
  650. package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
  651. package/dist/cli/chunk-mqb2ka8m.js +0 -68
  652. package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
  653. package/dist/cli/chunk-mt76t7dj.js.map +0 -11
  654. package/dist/cli/chunk-q4rae3bg.js +0 -60
  655. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  656. package/dist/cli/chunk-ra1v2nc2.js +0 -35
  657. package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
  658. package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
  659. package/dist/cli/chunk-tqa1s0k8.js +0 -69
  660. package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
  661. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  662. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  663. package/dist/cli/chunk-vkrsvbr5.js +0 -107
  664. package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
  665. package/dist/cli/chunk-vrfp10qk.js +0 -81
  666. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  667. package/dist/cli/chunk-wjt80jps.js +0 -1049
  668. package/dist/cli/chunk-wjt80jps.js.map +0 -24
  669. package/docs/advanced/api-reference.mdx +0 -240
  670. package/docs/reference/cli.mdx +0 -197
  671. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  672. package/src/components/content/changelog-element.ts +0 -69
  673. package/src/search/providers.ts +0 -91
  674. /package/dist/cli/{chunk-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
  675. /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
  676. /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
  677. /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions, SourceFieldMap } from "./shared.ts";
6
+ import {
7
+ queryParamsSchema,
8
+ sharedSourceOptionsSchema,
9
+ sourceFieldMapSchema,
10
+ } from "./shared.ts";
11
+
12
+ /** Options for {@link contentful}. */
13
+ export interface ContentfulOptions extends SharedSourceOptions {
14
+ /** The content type id whose entries become pages. */
15
+ contentType: string;
16
+ /** Environment id. Defaults to `master`. */
17
+ environment?: string;
18
+ /**
19
+ * Field ids mapping an entry onto Blume meta + body; `sys.<key>` reaches
20
+ * the entry's `sys`. Defaults to `title` / `description` / `slug` / `body`
21
+ * / `sys.updatedAt`.
22
+ */
23
+ fields?: SourceFieldMap;
24
+ /** Locale code to fetch; omit for the space's default locale. */
25
+ locale?: string;
26
+ /** Extra query parameters for the entries request (`"fields.section": "sdk"`). */
27
+ params?: Record<string, string>;
28
+ /** Space id. */
29
+ space: string;
30
+ }
31
+
32
+ export const contentfulOptionsSchema = sharedSourceOptionsSchema.extend({
33
+ contentType: z.string(),
34
+ environment: z.string().optional(),
35
+ fields: sourceFieldMapSchema.optional(),
36
+ locale: z.string().optional(),
37
+ params: queryParamsSchema.optional(),
38
+ space: z.string(),
39
+ });
40
+
41
+ export type ContentfulAdapter = AdapterDescriptor<
42
+ "contentful",
43
+ ContentfulOptions
44
+ >;
45
+
46
+ export const contentfulAdapterSchema = adapterDescriptorSchema(
47
+ "contentful",
48
+ contentfulOptionsSchema
49
+ );
50
+
51
+ /**
52
+ * A Contentful content type read through the Delivery API; rich text bodies
53
+ * become Markdown. The Delivery token comes from `CONTENTFUL_ACCESS_TOKEN`,
54
+ * and `--preview` reads drafts through the Preview API with
55
+ * `CONTENTFUL_PREVIEW_TOKEN`. Nothing to install: the adapter speaks the
56
+ * REST API directly.
57
+ */
58
+ export const contentful = (options: ContentfulOptions): ContentfulAdapter => ({
59
+ kind: "contentful",
60
+ options,
61
+ requiredSecrets: ["CONTENTFUL_ACCESS_TOKEN"],
62
+ runtimeDeps: [],
63
+ });
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { ContentSource } from "../core/sources/types.ts";
6
+
7
+ /** A user-provided {@link ContentSource} instance, validated for `name` + `load`. */
8
+ export const customOptionsSchema = z.custom<ContentSource>(
9
+ (value): value is ContentSource =>
10
+ typeof value === "object" &&
11
+ value !== null &&
12
+ "load" in value &&
13
+ typeof value.load === "function" &&
14
+ "name" in value &&
15
+ typeof value.name === "string",
16
+ { message: "custom() takes a ContentSource (an object with name + load)" }
17
+ );
18
+
19
+ export type CustomAdapter = AdapterDescriptor<"custom", ContentSource>;
20
+
21
+ export const customAdapterSchema = adapterDescriptorSchema(
22
+ "custom",
23
+ customOptionsSchema
24
+ );
25
+
26
+ /**
27
+ * Any object implementing the {@link ContentSource} interface, passed straight
28
+ * through. This is the extension point for adapters with custom serializers or
29
+ * any other backend, without their SDKs touching core. Unlike the built-in
30
+ * adapters the descriptor carries a live instance, so it never travels through
31
+ * the generated project's data snapshot — the CLI consumes it at scan time.
32
+ */
33
+ export const custom = (source: ContentSource): CustomAdapter => ({
34
+ kind: "custom",
35
+ options: source,
36
+ requiredSecrets: [],
37
+ runtimeDeps: [],
38
+ });
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions } from "./shared.ts";
6
+ import { DEFAULT_CONTENT_GLOB, sharedSourceOptionsSchema } from "./shared.ts";
7
+
8
+ /** What `include` defaults to: every Markdown/MDX file under the root. */
9
+ export const DEFAULT_CONTENT_INCLUDE = [DEFAULT_CONTENT_GLOB];
10
+ /** What `exclude` defaults to: underscore- and dot-prefixed paths. */
11
+ export const DEFAULT_CONTENT_EXCLUDE = ["**/_*", "**/.*"];
12
+
13
+ /** Options for {@link filesystem}. */
14
+ export interface FilesystemOptions extends SharedSourceOptions {
15
+ /** Glob patterns to ignore. Defaults to `["**\/_*", "**\/.*"]`. */
16
+ exclude?: string[];
17
+ /** Glob patterns to include. Defaults to `["**\/*.{md,mdx}"]`. */
18
+ include?: string[];
19
+ /** Directory to read from, relative to the project root. Defaults to `docs`. */
20
+ root?: string;
21
+ }
22
+
23
+ export const filesystemOptionsSchema = sharedSourceOptionsSchema.extend({
24
+ exclude: z.array(z.string()).default(DEFAULT_CONTENT_EXCLUDE),
25
+ include: z.array(z.string()).default(DEFAULT_CONTENT_INCLUDE),
26
+ root: z.string().default("docs"),
27
+ });
28
+
29
+ export type FilesystemAdapter = AdapterDescriptor<
30
+ "filesystem",
31
+ FilesystemOptions
32
+ >;
33
+
34
+ export const filesystemAdapterSchema = adapterDescriptorSchema(
35
+ "filesystem",
36
+ filesystemOptionsSchema
37
+ );
38
+
39
+ /**
40
+ * Local Markdown/MDX read from a directory. The zero-config default: with no
41
+ * `content.sources`, the top-level `content.root`/`include`/`exclude` desugar
42
+ * to exactly one of these.
43
+ */
44
+ export const filesystem = (
45
+ options: FilesystemOptions = {}
46
+ ): FilesystemAdapter => ({
47
+ kind: "filesystem",
48
+ options,
49
+ requiredSecrets: [],
50
+ runtimeDeps: [],
51
+ });
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions } from "./shared.ts";
6
+ import { sharedSourceOptionsSchema } from "./shared.ts";
7
+
8
+ /** Options for {@link githubReleases}. */
9
+ export interface GithubReleasesOptions extends SharedSourceOptions {
10
+ /** Include draft releases (needs a token with repo write access). */
11
+ drafts?: boolean;
12
+ /** Cap the number of releases materialized, newest-first. Defaults to 100. */
13
+ limit?: number;
14
+ /** Repository owner (user or org). */
15
+ owner: string;
16
+ /** Include prereleases. */
17
+ prereleases?: boolean;
18
+ /** Repository name. */
19
+ repo: string;
20
+ }
21
+
22
+ export const githubReleasesOptionsSchema = sharedSourceOptionsSchema.extend({
23
+ drafts: z.boolean().optional(),
24
+ limit: z.number().positive().optional(),
25
+ owner: z.string(),
26
+ prereleases: z.boolean().optional(),
27
+ repo: z.string(),
28
+ });
29
+
30
+ export type GithubReleasesAdapter = AdapterDescriptor<
31
+ "github-releases",
32
+ GithubReleasesOptions
33
+ >;
34
+
35
+ export const githubReleasesAdapterSchema = adapterDescriptorSchema(
36
+ "github-releases",
37
+ githubReleasesOptionsSchema
38
+ );
39
+
40
+ /**
41
+ * A repo's GitHub Releases, materialized as `type: changelog` entries — release
42
+ * notes become the changelog with no files to maintain. A private repo reads a
43
+ * token from `GITHUB_TOKEN`; it is never inlined here.
44
+ */
45
+ export const githubReleases = (
46
+ options: GithubReleasesOptions
47
+ ): GithubReleasesAdapter => ({
48
+ kind: "github-releases",
49
+ options,
50
+ requiredSecrets: ["GITHUB_TOKEN"],
51
+ runtimeDeps: [],
52
+ });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Content source adapters for `blume.config.ts`:
3
+ *
4
+ * ```ts
5
+ * import { defineConfig } from "blume";
6
+ * import { filesystem, githubReleases } from "blume/sources";
7
+ *
8
+ * export default defineConfig({
9
+ * content: {
10
+ * sources: [
11
+ * filesystem({ root: "docs" }),
12
+ * githubReleases({ owner: "acme", repo: "sdk", prefix: "changelog" }),
13
+ * ],
14
+ * },
15
+ * });
16
+ * ```
17
+ *
18
+ * Each factory returns a plain descriptor (see `core/adapter.ts`) that the
19
+ * schema validates and the CLI reads at scan time; every consumer — the
20
+ * generated `.blume/package.json`, the secrets check, `blume doctor` — reads
21
+ * the descriptor's `runtimeDeps` and `requiredSecrets` instead of switching
22
+ * on a source name. `custom()` is the exception that carries a live
23
+ * {@link ContentSource} instance rather than JSON.
24
+ */
25
+ export type { AdapterDescriptor } from "../core/adapter.ts";
26
+ export type {
27
+ ContentSource,
28
+ SourceContext,
29
+ SourceEntry,
30
+ SourceLoadResult,
31
+ } from "../core/sources/types.ts";
32
+ export { contentful } from "./contentful.ts";
33
+ export type { ContentfulAdapter, ContentfulOptions } from "./contentful.ts";
34
+ export { custom } from "./custom.ts";
35
+ export type { CustomAdapter } from "./custom.ts";
36
+ export { filesystem } from "./filesystem.ts";
37
+ export type { FilesystemAdapter, FilesystemOptions } from "./filesystem.ts";
38
+ export { githubReleases } from "./github-releases.ts";
39
+ export type {
40
+ GithubReleasesAdapter,
41
+ GithubReleasesOptions,
42
+ } from "./github-releases.ts";
43
+ export { mdxRemote } from "./mdx-remote.ts";
44
+ export type { MdxRemoteAdapter, MdxRemoteOptions } from "./mdx-remote.ts";
45
+ export { notion } from "./notion.ts";
46
+ export type { NotionAdapter, NotionOptions } from "./notion.ts";
47
+ export { obsidian } from "./obsidian.ts";
48
+ export type { ObsidianAdapter, ObsidianOptions } from "./obsidian.ts";
49
+ export { payload } from "./payload.ts";
50
+ export type { PayloadAdapter, PayloadOptions } from "./payload.ts";
51
+ export type {
52
+ AnySourceAdapter,
53
+ ContentSourceAdapter,
54
+ SourceAdapterKind,
55
+ } from "./registry.ts";
56
+ export { sanity } from "./sanity.ts";
57
+ export type { SanityAdapter, SanityOptions } from "./sanity.ts";
58
+ export type { SharedSourceOptions, SourceFieldMap } from "./shared.ts";
59
+ export { strapi } from "./strapi.ts";
60
+ export type { StrapiAdapter, StrapiOptions } from "./strapi.ts";
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions } from "./shared.ts";
6
+ import { DEFAULT_CONTENT_GLOB, sharedSourceOptionsSchema } from "./shared.ts";
7
+
8
+ /** Options for {@link mdxRemote}. */
9
+ export interface MdxRemoteOptions extends SharedSourceOptions {
10
+ /** Explicit list of source-relative file paths to fetch from `url`. */
11
+ files?: string[];
12
+ /** Enumerate a GitHub repo subtree via the git-trees API. */
13
+ github?: {
14
+ /** Repository owner (user or org). */
15
+ owner: string;
16
+ /** Subpath within the repo. Defaults to the repo root. */
17
+ path?: string;
18
+ /** Git ref (branch, tag, or SHA). Defaults to `main`. */
19
+ ref?: string;
20
+ /** Repository name. */
21
+ repo: string;
22
+ };
23
+ /** Glob patterns applied to enumerated refs. Defaults to `["**\/*.{md,mdx}"]`. */
24
+ include?: string[];
25
+ /** Raw base URL, e.g. `https://raw.githubusercontent.com/acme/sdk/main/docs`. */
26
+ url?: string;
27
+ }
28
+
29
+ export const mdxRemoteOptionsSchema = sharedSourceOptionsSchema.extend({
30
+ files: z.array(z.string()).optional(),
31
+ github: z
32
+ .strictObject({
33
+ owner: z.string(),
34
+ path: z.string().default(""),
35
+ ref: z.string().default("main"),
36
+ repo: z.string(),
37
+ })
38
+ .optional(),
39
+ include: z.array(z.string()).default([DEFAULT_CONTENT_GLOB]),
40
+ url: z.string().optional(),
41
+ });
42
+
43
+ export type MdxRemoteAdapter = AdapterDescriptor<
44
+ "mdx-remote",
45
+ MdxRemoteOptions
46
+ >;
47
+
48
+ export const mdxRemoteAdapterSchema = adapterDescriptorSchema(
49
+ "mdx-remote",
50
+ mdxRemoteOptionsSchema
51
+ );
52
+
53
+ // The hosts the source ever sends `GITHUB_TOKEN` to (the same set the fetch
54
+ // in core/sources/mdx-remote.ts checks), so only an adapter reading from
55
+ // GitHub declares the variable.
56
+ const GITHUB_HOSTS = new Set(["api.github.com", "raw.githubusercontent.com"]);
57
+
58
+ const readsFromGithub = (options: MdxRemoteOptions): boolean =>
59
+ options.github !== undefined ||
60
+ (options.url !== undefined &&
61
+ URL.canParse(options.url) &&
62
+ GITHUB_HOSTS.has(new URL(options.url).hostname));
63
+
64
+ /**
65
+ * Remote Markdown/MDX fetched over HTTP. Enumerate files explicitly against a
66
+ * raw `url` base, or from a GitHub repo subtree via `github`. A private repo's
67
+ * token comes from `GITHUB_TOKEN` — never inline it here. The adapter declares
68
+ * the variable only when it reads from GitHub, since a `url` on any other host
69
+ * is never sent the token.
70
+ */
71
+ export const mdxRemote = (options: MdxRemoteOptions): MdxRemoteAdapter => ({
72
+ kind: "mdx-remote",
73
+ options,
74
+ requiredSecrets: readsFromGithub(options) ? ["GITHUB_TOKEN"] : [],
75
+ runtimeDeps: [],
76
+ });
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions } from "./shared.ts";
6
+ import { sharedSourceOptionsSchema } from "./shared.ts";
7
+
8
+ /** Options for {@link notion}. */
9
+ export interface NotionOptions extends SharedSourceOptions {
10
+ /** Max concurrent Notion API requests; default 3 (Notion's per-integration pace). */
11
+ concurrency?: number;
12
+ /** Notion database id. */
13
+ database: string;
14
+ /** Notion property names mapped onto Blume meta. */
15
+ properties?: {
16
+ /** Property holding the page description. */
17
+ description?: string;
18
+ /** Property holding the sort order. */
19
+ order?: string;
20
+ /** Property holding the page slug. */
21
+ slug?: string;
22
+ /** Property holding the publish status. */
23
+ status?: string;
24
+ /** Property holding the page title. */
25
+ title?: string;
26
+ };
27
+ /** Status value treated as published; others map to `draft`. Defaults to `Published`. */
28
+ publishedValue?: string;
29
+ }
30
+
31
+ export const notionOptionsSchema = sharedSourceOptionsSchema.extend({
32
+ concurrency: z.number().positive().optional(),
33
+ database: z.string(),
34
+ properties: z
35
+ .strictObject({
36
+ description: z.string().optional(),
37
+ order: z.string().optional(),
38
+ slug: z.string().optional(),
39
+ status: z.string().optional(),
40
+ title: z.string().optional(),
41
+ })
42
+ .optional(),
43
+ publishedValue: z.string().optional(),
44
+ });
45
+
46
+ export type NotionAdapter = AdapterDescriptor<"notion", NotionOptions>;
47
+
48
+ export const notionAdapterSchema = adapterDescriptorSchema(
49
+ "notion",
50
+ notionOptionsSchema
51
+ );
52
+
53
+ /**
54
+ * A Notion database; pages become entries, blocks become MDX. `@notionhq/client`
55
+ * is the declared runtime dependency, and the integration token comes from
56
+ * `NOTION_TOKEN`.
57
+ */
58
+ export const notion = (options: NotionOptions): NotionAdapter => ({
59
+ kind: "notion",
60
+ options,
61
+ requiredSecrets: ["NOTION_TOKEN"],
62
+ runtimeDeps: ["@notionhq/client"],
63
+ });
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions } from "./shared.ts";
6
+ import { sharedSourceOptionsSchema } from "./shared.ts";
7
+
8
+ /** Options for {@link obsidian}. */
9
+ export interface ObsidianOptions extends SharedSourceOptions {
10
+ /** Vault folder names to skip at any depth, in addition to dot-folders. */
11
+ exclude?: string[];
12
+ /** Vault directory, absolute or relative to the project root. */
13
+ vault: string;
14
+ }
15
+
16
+ export const obsidianOptionsSchema = sharedSourceOptionsSchema.extend({
17
+ exclude: z.array(z.string()).optional(),
18
+ vault: z.string().min(1),
19
+ });
20
+
21
+ export type ObsidianAdapter = AdapterDescriptor<"obsidian", ObsidianOptions>;
22
+
23
+ export const obsidianAdapterSchema = adapterDescriptorSchema(
24
+ "obsidian",
25
+ obsidianOptionsSchema
26
+ );
27
+
28
+ /**
29
+ * An Obsidian vault, read in place. Wikilinks become route links and
30
+ * `%%comments%%` are stripped at load time, so the vault stays the source of
31
+ * truth — no export step and no generated notes in the repo.
32
+ */
33
+ export const obsidian = (options: ObsidianOptions): ObsidianAdapter => ({
34
+ kind: "obsidian",
35
+ options,
36
+ requiredSecrets: [],
37
+ runtimeDeps: [],
38
+ });
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { SharedSourceOptions, SourceFieldMap } from "./shared.ts";
6
+ import {
7
+ queryParamsSchema,
8
+ sharedSourceOptionsSchema,
9
+ sourceFieldMapSchema,
10
+ } from "./shared.ts";
11
+
12
+ /** Options for {@link payload}. */
13
+ export interface PayloadOptions extends SharedSourceOptions {
14
+ /**
15
+ * The auth-enabled collection the API key belongs to. Defaults to `users`;
16
+ * it names the scheme in the `Authorization` header (`users API-Key <key>`).
17
+ */
18
+ authCollection?: string;
19
+ /** The collection slug whose documents become pages. */
20
+ collection: string;
21
+ /** Relationship depth to populate. Defaults to `1`, enough for upload URLs. */
22
+ depth?: number;
23
+ /**
24
+ * Field paths mapping a document onto Blume meta + body. Defaults to
25
+ * `title` / `description` / `slug` / `content` / `updatedAt`.
26
+ */
27
+ fields?: SourceFieldMap;
28
+ /** Extra query parameters for the collection request (`"where[status][equals]": "live"`). */
29
+ params?: Record<string, string>;
30
+ /** The Payload app's origin (`https://cms.acme.dev`); its REST API is at `/api`. */
31
+ url: string;
32
+ }
33
+
34
+ export const payloadOptionsSchema = sharedSourceOptionsSchema.extend({
35
+ authCollection: z.string().optional(),
36
+ collection: z.string(),
37
+ depth: z.number().int().nonnegative().optional(),
38
+ fields: sourceFieldMapSchema.optional(),
39
+ params: queryParamsSchema.optional(),
40
+ url: z.string(),
41
+ });
42
+
43
+ export type PayloadAdapter = AdapterDescriptor<"payload", PayloadOptions>;
44
+
45
+ export const payloadAdapterSchema = adapterDescriptorSchema(
46
+ "payload",
47
+ payloadOptionsSchema
48
+ );
49
+
50
+ /**
51
+ * A Payload collection read through its REST API; Lexical bodies become
52
+ * Markdown. The API key comes from `PAYLOAD_API_KEY`, and `--preview` reads
53
+ * drafts. Nothing to install: the adapter speaks the REST API directly.
54
+ */
55
+ export const payload = (options: PayloadOptions): PayloadAdapter => ({
56
+ kind: "payload",
57
+ options,
58
+ requiredSecrets: ["PAYLOAD_API_KEY"],
59
+ runtimeDeps: [],
60
+ });
@@ -0,0 +1,182 @@
1
+ import { z } from "zod";
2
+
3
+ import { contentful, contentfulAdapterSchema } from "./contentful.ts";
4
+ import type { ContentfulAdapter } from "./contentful.ts";
5
+ import { custom, customAdapterSchema } from "./custom.ts";
6
+ import type { CustomAdapter } from "./custom.ts";
7
+ import { filesystem, filesystemAdapterSchema } from "./filesystem.ts";
8
+ import type { FilesystemAdapter } from "./filesystem.ts";
9
+ import {
10
+ githubReleases,
11
+ githubReleasesAdapterSchema,
12
+ } from "./github-releases.ts";
13
+ import type { GithubReleasesAdapter } from "./github-releases.ts";
14
+ import { mdxRemote, mdxRemoteAdapterSchema } from "./mdx-remote.ts";
15
+ import type { MdxRemoteAdapter } from "./mdx-remote.ts";
16
+ import { notion, notionAdapterSchema } from "./notion.ts";
17
+ import type { NotionAdapter } from "./notion.ts";
18
+ import { obsidian, obsidianAdapterSchema } from "./obsidian.ts";
19
+ import type { ObsidianAdapter } from "./obsidian.ts";
20
+ import { payload, payloadAdapterSchema } from "./payload.ts";
21
+ import type { PayloadAdapter } from "./payload.ts";
22
+ import { sanity, sanityAdapterSchema } from "./sanity.ts";
23
+ import type { SanityAdapter } from "./sanity.ts";
24
+ import { strapi, strapiAdapterSchema } from "./strapi.ts";
25
+ import type { StrapiAdapter } from "./strapi.ts";
26
+
27
+ /** Every descriptor a `blume/sources` factory can return. */
28
+ export type AnySourceAdapter =
29
+ | FilesystemAdapter
30
+ | MdxRemoteAdapter
31
+ | GithubReleasesAdapter
32
+ | SanityAdapter
33
+ | NotionAdapter
34
+ | ContentfulAdapter
35
+ | PayloadAdapter
36
+ | StrapiAdapter
37
+ | ObsidianAdapter
38
+ | CustomAdapter;
39
+
40
+ /** Every adapter identity. */
41
+ export type SourceAdapterKind = AnySourceAdapter["kind"];
42
+
43
+ /** One variant per public adapter factory. */
44
+ const adapterVariants = [
45
+ filesystemAdapterSchema,
46
+ mdxRemoteAdapterSchema,
47
+ githubReleasesAdapterSchema,
48
+ sanityAdapterSchema,
49
+ notionAdapterSchema,
50
+ contentfulAdapterSchema,
51
+ payloadAdapterSchema,
52
+ strapiAdapterSchema,
53
+ obsidianAdapterSchema,
54
+ customAdapterSchema,
55
+ ] as const;
56
+
57
+ const sourceAdapterUnion = z.discriminatedUnion("kind", adapterVariants);
58
+
59
+ /** What a public factory returns, as the config schema accepts it. */
60
+ export type SourceAdapterInput = z.input<typeof sourceAdapterUnion>;
61
+
62
+ /**
63
+ * A validated descriptor: the adapter's options with their defaults applied
64
+ * (a `filesystem()` entry always carries `root`/`include`/`exclude`), and the
65
+ * metadata lists re-derived from the factory so every consumer reads the
66
+ * `runtimeDeps` and `requiredSecrets` this version of Blume ships.
67
+ */
68
+ export type ContentSourceAdapter = z.output<typeof sourceAdapterUnion>;
69
+
70
+ /** The factory name the 1.x `type` discriminator maps to, for the hint below. */
71
+ const FACTORY_FOR_TYPE = new Map([
72
+ ["custom", "custom"],
73
+ ["filesystem", "filesystem"],
74
+ ["github-releases", "githubReleases"],
75
+ ["mdx-remote", "mdxRemote"],
76
+ ["notion", "notion"],
77
+ ["obsidian", "obsidian"],
78
+ ["sanity", "sanity"],
79
+ ]);
80
+
81
+ const FACTORIES_HINT =
82
+ 'content.sources takes adapters imported from "blume/sources" — filesystem({ root }), mdxRemote({ github }), githubReleases({ owner, repo }), sanity({ projectId, dataset, query }), notion({ database }), contentful({ space, contentType }), payload({ url, collection }), strapi({ url, contentType }), obsidian({ vault }), or custom(source).';
83
+
84
+ const ARRAY_HINT = `content.sources is a list of adapters — e.g. \`sources: [filesystem({ root: "docs" }), githubReleases({ owner, repo, prefix: "changelog" })]\`, imported from "blume/sources".`;
85
+
86
+ const isObjectLike = (value: unknown): value is object =>
87
+ typeof value === "object" && value !== null;
88
+
89
+ /** The 1.x object form's discriminator, when an entry carries one. */
90
+ const legacyEntrySchema = z.looseObject({ type: z.string() });
91
+
92
+ /**
93
+ * The message for an entry that is not a descriptor. A 1.x `{ type: "…" }`
94
+ * object names the factory that replaces it, so the fix is a rename plus
95
+ * moving the remaining fields into the call.
96
+ */
97
+ const entryHint = (type: string | undefined): string => {
98
+ if (type === undefined) {
99
+ return FACTORIES_HINT;
100
+ }
101
+ const factory = FACTORY_FOR_TYPE.get(type);
102
+ if (!factory) {
103
+ return `${FACTORIES_HINT} The 1.x { type: "${type}" } object form was removed.`;
104
+ }
105
+ const call =
106
+ type === "custom"
107
+ ? "custom(source) with the source you passed as `source`"
108
+ : `${factory}({ … }) with the other fields as its options`;
109
+ return `${FACTORIES_HINT} The 1.x { type: "${type}", … } object was removed: replace it with ${call}.`;
110
+ };
111
+
112
+ /**
113
+ * Validates a descriptor a factory returned and resolves it to the canonical
114
+ * form, so a descriptor that went through JSON (or was edited by hand)
115
+ * resolves to the same metadata Blume ships.
116
+ */
117
+ export const resolvedSourceAdapterSchema = sourceAdapterUnion.transform(
118
+ (value): ContentSourceAdapter => {
119
+ switch (value.kind) {
120
+ case "filesystem": {
121
+ return { ...filesystem(value.options), options: value.options };
122
+ }
123
+ case "github-releases": {
124
+ return { ...githubReleases(value.options), options: value.options };
125
+ }
126
+ case "mdx-remote": {
127
+ return { ...mdxRemote(value.options), options: value.options };
128
+ }
129
+ case "notion": {
130
+ return { ...notion(value.options), options: value.options };
131
+ }
132
+ case "contentful": {
133
+ return { ...contentful(value.options), options: value.options };
134
+ }
135
+ case "payload": {
136
+ return { ...payload(value.options), options: value.options };
137
+ }
138
+ case "strapi": {
139
+ return { ...strapi(value.options), options: value.options };
140
+ }
141
+ case "obsidian": {
142
+ return { ...obsidian(value.options), options: value.options };
143
+ }
144
+ case "sanity": {
145
+ return { ...sanity(value.options), options: value.options };
146
+ }
147
+ default: {
148
+ // Only `custom` is left, and TypeScript has narrowed `value` to it.
149
+ // It returns after the switch rather than from a last case block:
150
+ // Bun 1.4.0's line coverage never credits the closing brace of a
151
+ // switch's final block, which would fail the 100% gate in CI.
152
+ break;
153
+ }
154
+ }
155
+ return custom(value.options);
156
+ }
157
+ );
158
+
159
+ /**
160
+ * One `content.sources` entry. Anything without a `kind` — the 1.x `{ type }`
161
+ * object, a string, `null` — fails here with the factory hint instead of the
162
+ * union's opaque "invalid discriminator" message.
163
+ */
164
+ const sourceEntrySchema = z
165
+ .custom<SourceAdapterInput>(
166
+ (value) => isObjectLike(value) && "kind" in value,
167
+ {
168
+ error: (issue) => {
169
+ const legacy = legacyEntrySchema.safeParse(issue.input);
170
+ return entryHint(legacy.success ? legacy.data.type : undefined);
171
+ },
172
+ }
173
+ )
174
+ .pipe(resolvedSourceAdapterSchema);
175
+
176
+ /**
177
+ * `content.sources`: the adapters to read, in order. A non-array (the 1.x
178
+ * object form, say) fails with the list hint; entry errors keep their own.
179
+ */
180
+ export const contentSourcesSchema = z.array(sourceEntrySchema, {
181
+ error: (issue) => (issue.code === "invalid_type" ? ARRAY_HINT : undefined),
182
+ });