blume 1.7.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +217 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
  60. package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +186 -515
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +27 -12
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2282 -452
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +15 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +162 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +50 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +35 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +9 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +16 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +11 -11
  307. package/docs/discoverability/index.mdx +4 -4
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +21 -22
  329. package/src/ai/ai-catalog.ts +50 -32
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +7 -6
  338. package/src/ai/llms.ts +20 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/openapi-components.ts +4 -1
  342. package/src/ai/relative-links.ts +170 -0
  343. package/src/ai/serializers.ts +2 -2
  344. package/src/ai/skills.ts +1 -1
  345. package/src/ai/web-bot-auth.ts +2 -2
  346. package/src/analytics/adobe.ts +46 -0
  347. package/src/analytics/amplitude.ts +79 -0
  348. package/src/analytics/clarity.ts +46 -0
  349. package/src/analytics/clearbit.ts +47 -0
  350. package/src/analytics/cloudflare.ts +67 -0
  351. package/src/analytics/fathom.ts +64 -0
  352. package/src/analytics/google-analytics.ts +84 -0
  353. package/src/analytics/google-tag-manager.ts +61 -0
  354. package/src/analytics/head.ts +130 -0
  355. package/src/analytics/heap.ts +65 -0
  356. package/src/analytics/hightouch.ts +77 -0
  357. package/src/analytics/hotjar.ts +47 -0
  358. package/src/analytics/index.ts +71 -0
  359. package/src/analytics/inline.ts +21 -0
  360. package/src/analytics/logrocket.ts +71 -0
  361. package/src/analytics/mixpanel.ts +92 -0
  362. package/src/analytics/pirsch.ts +66 -0
  363. package/src/analytics/plausible.ts +83 -0
  364. package/src/analytics/posthog.ts +78 -0
  365. package/src/analytics/schema.ts +60 -0
  366. package/src/analytics/script.ts +60 -0
  367. package/src/analytics/segment.ts +85 -0
  368. package/src/analytics/vercel.ts +50 -0
  369. package/src/astro/adapter-root.ts +7 -9
  370. package/src/astro/component-slots.ts +131 -91
  371. package/src/astro/generate.ts +112 -345
  372. package/src/astro/integration.ts +2 -6
  373. package/src/astro/pages.ts +13 -101
  374. package/src/astro/render-deps.ts +379 -0
  375. package/src/astro/runtime-deps.ts +201 -0
  376. package/src/astro/templates.ts +554 -541
  377. package/src/audit/agent.ts +24 -0
  378. package/src/audit/catalog.ts +2 -2
  379. package/src/audit/checks/assets.ts +2 -2
  380. package/src/audit/checks/dns-aid.ts +1 -1
  381. package/src/audit/checks/duplicates.ts +3 -1
  382. package/src/audit/checks/i18n.ts +1 -1
  383. package/src/audit/checks/indexability.ts +7 -7
  384. package/src/audit/checks/links.ts +2 -2
  385. package/src/audit/checks/llms.ts +6 -6
  386. package/src/audit/checks/network.ts +3 -3
  387. package/src/audit/checks/og-image.ts +2 -2
  388. package/src/audit/checks/robots.ts +1 -1
  389. package/src/audit/checks/sitemap.ts +2 -2
  390. package/src/audit/checks/social.ts +1 -1
  391. package/src/audit/run.ts +4 -3
  392. package/src/audit/terms.ts +31 -0
  393. package/src/audit/url.ts +13 -13
  394. package/src/cli/command-meta.ts +10 -0
  395. package/src/cli/commands/audit.ts +39 -20
  396. package/src/cli/commands/build.ts +71 -316
  397. package/src/cli/commands/check.ts +1 -0
  398. package/src/cli/commands/dev.ts +40 -1
  399. package/src/cli/commands/doctor.ts +90 -14
  400. package/src/cli/commands/eject.ts +44 -7
  401. package/src/cli/commands/eval.ts +2 -2
  402. package/src/cli/commands/init.ts +161 -41
  403. package/src/cli/commands/migrate.ts +121 -0
  404. package/src/cli/commands/preview.ts +7 -1
  405. package/src/cli/commands/translate.ts +2 -2
  406. package/src/cli/commands/upgrade.ts +141 -0
  407. package/src/cli/commands/version.ts +57 -44
  408. package/src/cli/eject-scripts.ts +121 -6
  409. package/src/cli/index.ts +11 -1
  410. package/src/cli/init/install.ts +70 -0
  411. package/src/cli/init/questions.ts +7 -0
  412. package/src/cli/init/scaffold.ts +459 -75
  413. package/src/cli/lazy-command.ts +37 -1
  414. package/src/cli/prepare.ts +40 -6
  415. package/src/cli/required-secrets.ts +38 -11
  416. package/src/cli/unknown-flags.ts +266 -0
  417. package/src/cli/yarn-pnp.ts +52 -0
  418. package/src/components/content/AccordionItem.astro +7 -1
  419. package/src/components/content/Card.astro +4 -3
  420. package/src/components/content/ColorItem.astro +22 -4
  421. package/src/components/content/GithubInfo.astro +2 -2
  422. package/src/components/content/Prompt.astro +25 -25
  423. package/src/components/content/Tabs.astro +3 -1
  424. package/src/components/content/Tile.astro +2 -3
  425. package/src/components/content/Tooltip.astro +57 -9
  426. package/src/components/content/content-strings.ts +34 -0
  427. package/src/components/content/diff.ts +1 -1
  428. package/src/components/content/mermaid-element.ts +13 -2
  429. package/src/components/content/prompt-markdown.ts +292 -0
  430. package/src/components/content/tooltip-id.ts +41 -0
  431. package/src/components/islands/hooks.ts +25 -2
  432. package/src/components/layout/Analytics.astro +21 -79
  433. package/src/components/layout/Banner.astro +3 -1
  434. package/src/components/layout/DiscoveryLinks.astro +69 -0
  435. package/src/components/layout/Header.astro +83 -20
  436. package/src/components/layout/LanguageSwitcher.astro +4 -1
  437. package/src/components/layout/Logo.astro +23 -2
  438. package/src/components/layout/NavSelector.astro +13 -2
  439. package/src/components/layout/NavTree.astro +12 -3
  440. package/src/components/layout/NavTreeScript.astro +17 -3
  441. package/src/components/layout/PageActions.astro +3 -3
  442. package/src/components/layout/PageFeedback.astro +11 -1
  443. package/src/components/layout/PageLayout.astro +52 -5
  444. package/src/components/layout/ReferenceLayout.astro +21 -12
  445. package/src/components/layout/RootLayout.astro +69 -66
  446. package/src/components/layout/Search.astro +30 -6
  447. package/src/components/layout/WebMcp.astro +1 -1
  448. package/src/components/layout/analytics-client.ts +72 -15
  449. package/src/components/layout/drawer-inert.ts +113 -15
  450. package/src/components/layout/dropdown-clamp.ts +105 -0
  451. package/src/components/layout/head-scripts.ts +15 -6
  452. package/src/components/layout/nav-utils.ts +17 -0
  453. package/src/components/layout/search/algolia.ts +8 -8
  454. package/src/components/layout/search/orama-cloud.ts +9 -7
  455. package/src/components/layout/search/typesense.ts +11 -17
  456. package/src/components/openapi/MessageComposer.astro +2 -2
  457. package/src/components/openapi/Playground.astro +2 -2
  458. package/src/components/openapi/playground-client.ts +79 -10
  459. package/src/core/changelog-index.ts +24 -0
  460. package/src/core/component-overrides.ts +399 -154
  461. package/src/core/config-input.ts +188 -553
  462. package/src/core/config.ts +130 -41
  463. package/src/core/custom-pages.ts +105 -0
  464. package/src/core/data.ts +31 -12
  465. package/src/core/define-components.ts +12 -9
  466. package/src/core/deployment-env.ts +18 -74
  467. package/src/core/diagnostics.ts +14 -7
  468. package/src/core/graph.ts +69 -25
  469. package/src/core/i18n-ui.ts +6 -2
  470. package/src/core/i18n.ts +17 -0
  471. package/src/core/includes.ts +156 -38
  472. package/src/core/last-modified.ts +6 -11
  473. package/src/core/links.ts +166 -2
  474. package/src/core/manifest.ts +10 -3
  475. package/src/core/navigation.ts +115 -16
  476. package/src/core/new-tab.ts +35 -0
  477. package/src/core/node-require.ts +21 -0
  478. package/src/core/project-graph.ts +42 -26
  479. package/src/core/project.ts +9 -4
  480. package/src/core/request-body.ts +61 -0
  481. package/src/core/safe-href.ts +28 -0
  482. package/src/core/safe-links.ts +68 -0
  483. package/src/core/schema.ts +517 -739
  484. package/src/core/server-features.ts +8 -9
  485. package/src/core/sources/assets.ts +47 -11
  486. package/src/core/sources/collection.ts +67 -0
  487. package/src/core/sources/contentful-rich-text.ts +285 -0
  488. package/src/core/sources/contentful.ts +173 -0
  489. package/src/core/sources/github-releases.ts +51 -1
  490. package/src/core/sources/json.ts +71 -0
  491. package/src/core/sources/lexical.ts +195 -0
  492. package/src/core/sources/lower.ts +226 -0
  493. package/src/core/sources/normalize.ts +52 -2
  494. package/src/core/sources/notion.ts +39 -28
  495. package/src/core/sources/payload.ts +135 -0
  496. package/src/core/sources/portable-text.ts +11 -16
  497. package/src/core/sources/remote.ts +226 -0
  498. package/src/core/sources/resolve.ts +104 -166
  499. package/src/core/sources/sanity.ts +16 -49
  500. package/src/core/sources/strapi-blocks.ts +124 -0
  501. package/src/core/sources/strapi.ts +191 -0
  502. package/src/core/sources/types.ts +12 -1
  503. package/src/core/types.ts +15 -1
  504. package/src/core/ui-packs/ar.ts +6 -2
  505. package/src/core/ui-packs/bg.ts +6 -2
  506. package/src/core/ui-packs/bn.ts +6 -2
  507. package/src/core/ui-packs/ca.ts +3 -1
  508. package/src/core/ui-packs/cs.ts +6 -2
  509. package/src/core/ui-packs/da.ts +6 -2
  510. package/src/core/ui-packs/de.ts +6 -2
  511. package/src/core/ui-packs/el.ts +3 -1
  512. package/src/core/ui-packs/es.ts +3 -1
  513. package/src/core/ui-packs/fa.ts +6 -2
  514. package/src/core/ui-packs/fi.ts +6 -2
  515. package/src/core/ui-packs/fr.ts +3 -1
  516. package/src/core/ui-packs/he.ts +6 -2
  517. package/src/core/ui-packs/hi.ts +6 -2
  518. package/src/core/ui-packs/hr.ts +6 -2
  519. package/src/core/ui-packs/hu.ts +6 -2
  520. package/src/core/ui-packs/id.ts +6 -2
  521. package/src/core/ui-packs/it.ts +3 -1
  522. package/src/core/ui-packs/ja.ts +3 -1
  523. package/src/core/ui-packs/ko.ts +3 -1
  524. package/src/core/ui-packs/nl.ts +6 -2
  525. package/src/core/ui-packs/no.ts +6 -2
  526. package/src/core/ui-packs/pl.ts +6 -2
  527. package/src/core/ui-packs/pt-br.ts +3 -1
  528. package/src/core/ui-packs/pt.ts +3 -1
  529. package/src/core/ui-packs/ro.ts +6 -2
  530. package/src/core/ui-packs/ru.ts +6 -2
  531. package/src/core/ui-packs/sk.ts +6 -2
  532. package/src/core/ui-packs/sr.ts +6 -2
  533. package/src/core/ui-packs/sv.ts +6 -2
  534. package/src/core/ui-packs/th.ts +3 -1
  535. package/src/core/ui-packs/tr.ts +6 -2
  536. package/src/core/ui-packs/uk.ts +6 -2
  537. package/src/core/ui-packs/vi.ts +3 -1
  538. package/src/core/ui-packs/zh-tw.ts +3 -1
  539. package/src/core/ui-packs/zh.ts +3 -1
  540. package/src/core/unrecognized-keys.ts +10 -0
  541. package/src/core/version-cut.ts +116 -8
  542. package/src/deploy/adapter-output.ts +57 -97
  543. package/src/deploy/adapters/cloudflare.ts +39 -0
  544. package/src/deploy/adapters/index.ts +41 -0
  545. package/src/deploy/adapters/netlify.ts +34 -0
  546. package/src/deploy/adapters/node.ts +34 -0
  547. package/src/deploy/adapters/registry.ts +127 -0
  548. package/src/deploy/adapters/types.ts +92 -0
  549. package/src/deploy/adapters/vercel.ts +35 -0
  550. package/src/deploy/artifacts.ts +55 -27
  551. package/src/deploy/cloudflare-negotiation.ts +179 -100
  552. package/src/deploy/function-bundle.ts +18 -3
  553. package/src/deploy/headers.ts +124 -23
  554. package/src/deploy/node-headers.ts +198 -0
  555. package/src/deploy/platforms/cloudflare.ts +312 -0
  556. package/src/deploy/platforms/index.ts +67 -0
  557. package/src/deploy/platforms/netlify.ts +52 -0
  558. package/src/deploy/platforms/node.ts +40 -0
  559. package/src/deploy/platforms/paths.ts +42 -0
  560. package/src/deploy/platforms/static.ts +29 -0
  561. package/src/deploy/platforms/types.ts +112 -0
  562. package/src/deploy/platforms/vercel.ts +193 -0
  563. package/src/deploy/redirects.ts +30 -18
  564. package/src/deploy/robots.ts +3 -3
  565. package/src/deploy/rss.ts +2 -2
  566. package/src/deploy/sitemap.ts +2 -2
  567. package/src/deploy/vercel-negotiation.ts +2 -2
  568. package/src/eval/agents.ts +32 -1
  569. package/src/eval/findings.ts +19 -11
  570. package/src/eval/report.ts +10 -2
  571. package/src/markdown/external-links.ts +65 -0
  572. package/src/markdown/include.ts +45 -27
  573. package/src/markdown/index.ts +34 -9
  574. package/src/markdown/inline-code.ts +12 -6
  575. package/src/markdown/relative-links.ts +324 -0
  576. package/src/markdown/themes.ts +3 -3
  577. package/src/migrate/migrate.ts +149 -0
  578. package/src/openapi/parse.ts +64 -16
  579. package/src/openapi/proxy.ts +62 -10
  580. package/src/openapi/references.ts +147 -147
  581. package/src/openapi/render-mdx.ts +32 -10
  582. package/src/openapi/scalar.ts +15 -13
  583. package/src/openapi/sentence.ts +14 -0
  584. package/src/openapi/source.ts +37 -21
  585. package/src/openapi/spec-dependency-error.ts +15 -0
  586. package/src/reference/asyncapi.ts +83 -0
  587. package/src/reference/graphql.ts +89 -0
  588. package/src/reference/index.ts +40 -0
  589. package/src/reference/openapi.ts +83 -0
  590. package/src/reference/options.ts +201 -0
  591. package/src/reference/scalar.ts +136 -0
  592. package/src/reference/schema.ts +88 -0
  593. package/src/registry/eject.ts +97 -42
  594. package/src/search/adapters/algolia.ts +46 -0
  595. package/src/search/adapters/flexsearch.ts +29 -0
  596. package/src/search/adapters/index.ts +39 -0
  597. package/src/search/adapters/mixedbread.ts +39 -0
  598. package/src/search/adapters/orama-cloud.ts +51 -0
  599. package/src/search/adapters/orama.ts +24 -0
  600. package/src/search/adapters/pagefind.ts +27 -0
  601. package/src/search/adapters/registry.ts +131 -0
  602. package/src/search/adapters/types.ts +46 -0
  603. package/src/search/adapters/typesense.ts +57 -0
  604. package/src/search/build.ts +8 -4
  605. package/src/search/documents.ts +6 -0
  606. package/src/search/sync/algolia.ts +12 -11
  607. package/src/search/sync/index.ts +35 -20
  608. package/src/search/sync/orama-cloud.ts +12 -9
  609. package/src/search/sync/typesense.ts +15 -13
  610. package/src/sources/contentful.ts +63 -0
  611. package/src/sources/custom.ts +38 -0
  612. package/src/sources/filesystem.ts +51 -0
  613. package/src/sources/github-releases.ts +52 -0
  614. package/src/sources/index.ts +60 -0
  615. package/src/sources/mdx-remote.ts +76 -0
  616. package/src/sources/notion.ts +63 -0
  617. package/src/sources/obsidian.ts +38 -0
  618. package/src/sources/payload.ts +60 -0
  619. package/src/sources/registry.ts +182 -0
  620. package/src/sources/sanity.ts +66 -0
  621. package/src/sources/shared.ts +52 -0
  622. package/src/sources/strapi.ts +58 -0
  623. package/src/theme/entry.ts +24 -2
  624. package/src/translate/report.ts +40 -7
  625. package/src/upgrade/upgrade.ts +499 -0
  626. package/dist/cli/chunk-0qymqwzz.js +0 -164
  627. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  628. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  632. package/dist/cli/chunk-5093q3n7.js +0 -68
  633. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  634. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  635. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  636. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  637. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  638. package/dist/cli/chunk-97r59kpr.js +0 -381
  639. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  640. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  641. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  642. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  643. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  644. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  645. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  646. package/dist/cli/chunk-esphfr8p.js +0 -107
  647. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  648. package/dist/cli/chunk-ex56aa81.js +0 -1016
  649. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  650. package/dist/cli/chunk-garjf5z9.js +0 -30
  651. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  652. package/dist/cli/chunk-js7saxwm.js +0 -1045
  653. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  654. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  655. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  656. package/dist/cli/chunk-q4rae3bg.js +0 -60
  657. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  658. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  659. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  660. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  661. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  662. package/dist/cli/chunk-vrfp10qk.js +0 -81
  663. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  664. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  665. package/docs/advanced/api-reference.mdx +0 -240
  666. package/docs/reference/cli.mdx +0 -197
  667. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  668. package/src/components/content/changelog-element.ts +0 -69
  669. package/src/search/providers.ts +0 -91
  670. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
  671. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
  672. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
  673. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
@@ -5,111 +5,56 @@ import { dirname, join } from "pathe";
5
5
 
6
6
  import type { ResolvedConfig } from "../core/schema.ts";
7
7
  import type { ProjectContext } from "../core/types.ts";
8
-
9
- type Adapter = NonNullable<ResolvedConfig["deployment"]["adapter"]>;
10
-
11
- /** An optional per-adapter path, keyed by the closed adapter union. */
12
- type AdapterPathMap = { [A in Adapter]?: string };
13
-
14
- /**
15
- * Top-level directory each server adapter writes its deploy bundle into, for
16
- * `.gitignore` — the bundle is a build artifact, and the platform's own state
17
- * lives alongside it (`.vercel/project.json`, `.netlify/state.json`), so the
18
- * whole directory is ignored. `node` and `cloudflare` emit into `dist/`, which
19
- * `blume init` already ignores.
20
- */
21
- export const ADAPTER_IGNORE_DIRS: AdapterPathMap = {
22
- netlify: ".netlify/",
23
- vercel: ".vercel/",
24
- };
8
+ import type { ResolvedDeployment } from "./adapters/registry.ts";
9
+ import { deployPlatform } from "./platforms/index.ts";
10
+ import { distDir } from "./platforms/paths.ts";
25
11
 
26
12
  /**
27
- * Server adapters whose deploy bundle lands *outside* Astro's `outDir`, at a
28
- * path relative to the Astro project root. Blume points the Astro root at the
29
- * hidden `<root>/.blume` runtime, so these adapters write their bundle to
30
- * `<root>/.blume/<path>` — where the deploy platform never looks. Each value is
31
- * the sub-path to surface up to the real project root.
32
- *
33
- * `netlify` writes a Frameworks API tree at `.netlify/v1` (its `.netlify/build`
34
- * sibling is only the intermediate SSR bundle, already traced into
35
- * `v1/functions`); only `v1` is moved, so the `.netlify/state.json` written by
36
- * `netlify link` survives too. `node` and `cloudflare` emit into `dist/`
37
- * (already at the project root), so they are absent here and need no
38
- * relocation.
39
- *
40
- * `vercel` is absent for a different reason: it is shown the real project root
41
- * up front (see `withAdapterRoot`), because its `@vercel/nft` dependency trace
42
- * is rooted there too and tracing from `.blume` silently drops the function's
43
- * chunks and `node_modules`. Given the right root it writes its Build Output
44
- * tree straight to `<root>/.vercel/output`, so there is nothing left to move.
13
+ * Where a build's output lands. Every static build and most server builds
14
+ * write to Astro's `outDir`; the Vercel adapter writes its Build Output tree
15
+ * beside it instead. Each platform declares its own (see `deploy/platforms`).
45
16
  */
46
- export const ADAPTER_OUTPUT_PATHS: AdapterPathMap = {
47
- netlify: ".netlify/v1",
17
+ export const deployOutputDir = (
18
+ config: ResolvedConfig,
19
+ context: ProjectContext
20
+ ): string => {
21
+ const { deployment } = config;
22
+ return deployment.options.output === "server"
23
+ ? deployPlatform(deployment).serverOutputDir(context)
24
+ : distDir(context);
48
25
  };
49
26
 
50
- /**
51
- * Whether this build keeps Astro's `dist/client` + `dist/server` split and
52
- * serves only the `client/` half. True for Node and Cloudflare server builds:
53
- * the Node standalone server's static handler reads only `build.client`, and
54
- * `@astrojs/cloudflare` declares `preserveBuildClientDir: true` and points the
55
- * ASSETS binding in the `dist/server/wrangler.json` it generates at
56
- * `../client` — the Worker serves that directory and nothing above it. A
57
- * Cloudflare *static* build has no server dir to split against, so its
58
- * `outDir` root is what ships.
59
- */
60
- export const servesClientSubdir = (
61
- deployment: ResolvedConfig["deployment"]
62
- ): boolean =>
63
- deployment.output === "server" &&
64
- (deployment.adapter === "node" || deployment.adapter === "cloudflare");
65
-
66
- /**
67
- * Whether the platform applies a `_headers` file to the static assets it
68
- * serves. True for every static build (Netlify and Cloudflare Pages/Workers
69
- * both read it) and, additionally, for a **Cloudflare server** build: the
70
- * Worker serves `dist/client` through its ASSETS binding, and Workers static
71
- * assets honor `_headers` from that directory exactly as Pages does.
72
- *
73
- * Deliberately not true for a Node server build. Node's standalone server has
74
- * its own static handler with no `_headers` support, so writing the file there
75
- * would be inert — and reporting a header that is not applied is worse than
76
- * omitting it.
77
- *
78
- * A Vercel **server** build is excluded because its headers arrive through the
79
- * routing config instead (see `deploy/vercel-negotiation.ts`), which
80
- * `_headers` would duplicate rather than complement. A *static* build on the
81
- * Vercel adapter still returns true: Vercel ignores the file, so it is inert
82
- * there, matching what the old `output === "static"` gate emitted.
83
- */
84
- export const readsHeaderFiles = (
85
- deployment: ResolvedConfig["deployment"]
86
- ): boolean =>
87
- deployment.output === "static" ||
88
- (deployment.output === "server" && deployment.adapter === "cloudflare");
89
-
90
27
  /**
91
28
  * Directory whose contents the deploy platform serves as static files. Build
92
29
  * artifacts (robots.txt, sitemap.xml, llms.txt, …) must be written here to be
93
- * served. For a Vercel server build that is the adapter's
94
- * `.vercel/output/static`; for a Node or Cloudflare server build it is Astro's
95
- * `build.client` dir (`dist/client/` — see {@link servesClientSubdir}). Every
96
- * other build serves `dist/` itself, Netlify included.
30
+ * served. A static build serves `dist/` wherever it lands; a server build
31
+ * serves what its platform declares — the Build Output tree's `static/` half
32
+ * on Vercel, Astro's `build.client` dir (`dist/client/`) on Node and
33
+ * Cloudflare, `dist/` on Netlify.
97
34
  */
98
35
  export const deployStaticDir = (
99
36
  config: ResolvedConfig,
100
37
  context: ProjectContext
101
38
  ): string => {
102
- const { adapter, output } = config.deployment;
103
- if (output === "server" && adapter === "vercel") {
104
- return join(context.root, ".vercel", "output", "static");
105
- }
106
- const dist = context.distDir ?? join(context.root, "dist");
107
- if (servesClientSubdir(config.deployment)) {
108
- return join(dist, "client");
109
- }
110
- return dist;
39
+ const { deployment } = config;
40
+ return deployment.options.output === "server"
41
+ ? deployPlatform(deployment).serverStaticDir(context)
42
+ : distDir(context);
111
43
  };
112
44
 
45
+ /**
46
+ * Whether the platform applies a `_headers` file to the static assets it
47
+ * serves — true where Netlify or Cloudflare read one, including a Cloudflare
48
+ * **server** build (the Worker serves `dist/client` through its ASSETS
49
+ * binding, which honors `_headers` exactly as Pages does), and for a static
50
+ * build with no named host. Deliberately false where the file would be inert:
51
+ * Node's standalone server has its own static handler with no `_headers`
52
+ * support, and Vercel's headers arrive through the routing config instead.
53
+ * Reporting a header that is not applied is worse than omitting it.
54
+ */
55
+ export const readsHeaderFiles = (deployment: ResolvedDeployment): boolean =>
56
+ deployPlatform(deployment).readsHeaderFiles[deployment.options.output];
57
+
113
58
  /** Outcome of {@link surfaceAdapterOutput}, for logging. */
114
59
  export type SurfaceResult =
115
60
  | { moved: false }
@@ -117,19 +62,20 @@ export type SurfaceResult =
117
62
 
118
63
  /**
119
64
  * Move a server adapter's deploy bundle out of the hidden `.blume` runtime and
120
- * up to the project root, where the deploy platform (and `vercel deploy
121
- * --prebuilt`) expects it. A no-op for static builds, for adapters that emit
122
- * into `dist/`, and when the expected output is absent.
65
+ * up to the project root, where the deploy platform expects it. A no-op for
66
+ * static builds, for platforms whose bundle already lands where they look
67
+ * (`hiddenRuntime.surfacePath` is null), and when the expected output is
68
+ * absent.
123
69
  */
124
70
  export const surfaceAdapterOutput = async (
125
71
  config: ResolvedConfig,
126
72
  context: ProjectContext
127
73
  ): Promise<SurfaceResult> => {
128
- const { adapter, output } = config.deployment;
129
- if (output !== "server" || !adapter) {
74
+ const { deployment } = config;
75
+ if (deployment.options.output !== "server") {
130
76
  return { moved: false };
131
77
  }
132
- const rel = ADAPTER_OUTPUT_PATHS[adapter];
78
+ const rel = deployPlatform(deployment).hiddenRuntime.surfacePath;
133
79
  if (!rel) {
134
80
  return { moved: false };
135
81
  }
@@ -150,7 +96,21 @@ export const surfaceAdapterOutput = async (
150
96
  // ERR_MODULE_NOT_FOUND. Verbatim, the links stay relative and internal to the
151
97
  // bundle, surviving both this move and the platform's own (Vercel mounts the
152
98
  // bundle at `/var/task`).
153
- await cp(from, to, { recursive: true, verbatimSymlinks: true });
99
+ try {
100
+ await cp(from, to, { recursive: true, verbatimSymlinks: true });
101
+ } catch (error) {
102
+ // SAFETY: a rejected `cp` always yields a Node system error, whose `code`
103
+ // is the only field read here.
104
+ if ((error as NodeJS.ErrnoException).code !== "EPERM") {
105
+ throw error;
106
+ }
107
+ // `EPERM` is Windows refusing to create a symlink without Developer Mode
108
+ // or admin rights (the same answer `symlinkDir` handles for the deps
109
+ // link). Copy through the links instead: each becomes an ordinary
110
+ // directory holding its target's files — bigger, but self-contained.
111
+ await rm(to, { force: true, recursive: true });
112
+ await cp(from, to, { dereference: true, recursive: true });
113
+ }
154
114
  await rm(from, { force: true, recursive: true });
155
115
  return { from, moved: true, to };
156
116
  };
@@ -0,0 +1,39 @@
1
+ import { adapterDescriptorSchema } from "../../core/adapter.ts";
2
+ import type { DeployAdapter, DeployOptions } from "./types.ts";
3
+ import { deployOptionsSchema, serverRuntimeDeps } from "./types.ts";
4
+
5
+ /** The Astro adapter package a Cloudflare server build imports. */
6
+ export const CLOUDFLARE_ADAPTER_PACKAGE = "@astrojs/cloudflare";
7
+
8
+ /**
9
+ * Options for {@link cloudflare}: `output`, `site`, and `base`, plus any
10
+ * option of `@astrojs/cloudflare` forwarded verbatim (`platformProxy`,
11
+ * `routes`, `cloudflareModules`, …). Blume sets `prerenderEnvironment`,
12
+ * `imageService`, and `configPath` itself; an option you pass wins.
13
+ */
14
+ export type CloudflareOptions = DeployOptions;
15
+
16
+ export type CloudflareAdapter = DeployAdapter<"cloudflare">;
17
+
18
+ export const cloudflareOptionsSchema = deployOptionsSchema;
19
+
20
+ export const cloudflareAdapterSchema = adapterDescriptorSchema(
21
+ "cloudflare",
22
+ cloudflareOptionsSchema
23
+ );
24
+
25
+ /**
26
+ * Cloudflare Workers and Pages. A server build emits a Worker into
27
+ * `dist/server` (with a generated wrapper that answers `Accept:
28
+ * text/markdown`) and serves `dist/client` through the ASSETS binding.
29
+ * `@astrojs/cloudflare` is an optional peer: install it in the project
30
+ * (`npm install @astrojs/cloudflare`).
31
+ */
32
+ export const cloudflare = (
33
+ options: CloudflareOptions = {}
34
+ ): CloudflareAdapter => ({
35
+ kind: "cloudflare",
36
+ options,
37
+ requiredSecrets: [],
38
+ runtimeDeps: serverRuntimeDeps(options, CLOUDFLARE_ADAPTER_PACKAGE),
39
+ });
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Deployment adapters for `blume.config.ts`:
3
+ *
4
+ * ```ts
5
+ * import { defineConfig } from "blume";
6
+ * import { vercel } from "blume/deploy";
7
+ *
8
+ * export default defineConfig({
9
+ * deployment: vercel({ site: "https://docs.example.com" }),
10
+ * });
11
+ * ```
12
+ *
13
+ * Naming a host switches the build to server output on that host; leave
14
+ * `deployment` unset (or `{ site, base }`) for a static build anywhere. Each
15
+ * factory returns a plain descriptor (see `core/adapter.ts`) that the schema
16
+ * validates; the generated `astro.config.mjs` imports the real `@astrojs/*`
17
+ * adapter and passes the options through verbatim.
18
+ */
19
+ export type { AdapterDescriptor, JsonValue } from "../../core/adapter.ts";
20
+ export { cloudflare } from "./cloudflare.ts";
21
+ export type { CloudflareAdapter, CloudflareOptions } from "./cloudflare.ts";
22
+ export { netlify } from "./netlify.ts";
23
+ export type { NetlifyAdapter, NetlifyOptions } from "./netlify.ts";
24
+ export { node } from "./node.ts";
25
+ export type { NodeAdapter, NodeOptions } from "./node.ts";
26
+ export type {
27
+ AnyDeployAdapter,
28
+ DeployAdapterKind,
29
+ DeploymentInput,
30
+ ResolvedDeployment,
31
+ ResolvedDeployOptions,
32
+ } from "./registry.ts";
33
+ export type {
34
+ DeployAdapter,
35
+ DeployNamedOptions,
36
+ DeployOptions,
37
+ DeployOutput,
38
+ StaticDeployment,
39
+ } from "./types.ts";
40
+ export { vercel } from "./vercel.ts";
41
+ export type { VercelAdapter, VercelOptions } from "./vercel.ts";
@@ -0,0 +1,34 @@
1
+ import { adapterDescriptorSchema } from "../../core/adapter.ts";
2
+ import type { DeployAdapter, DeployOptions } from "./types.ts";
3
+ import { deployOptionsSchema, serverRuntimeDeps } from "./types.ts";
4
+
5
+ /** The Astro adapter package a Netlify server build imports. */
6
+ export const NETLIFY_ADAPTER_PACKAGE = "@astrojs/netlify";
7
+
8
+ /**
9
+ * Options for {@link netlify}: `output`, `site`, and `base`, plus any option
10
+ * of `@astrojs/netlify` forwarded verbatim (`edgeMiddleware`, `imageCDN`,
11
+ * `cacheOnDemandPages`, …).
12
+ */
13
+ export type NetlifyOptions = DeployOptions;
14
+
15
+ export type NetlifyAdapter = DeployAdapter<"netlify">;
16
+
17
+ export const netlifyOptionsSchema = deployOptionsSchema;
18
+
19
+ export const netlifyAdapterSchema = adapterDescriptorSchema(
20
+ "netlify",
21
+ netlifyOptionsSchema
22
+ );
23
+
24
+ /**
25
+ * Netlify. A server build runs on Netlify Functions from the Frameworks API
26
+ * tree the adapter writes to `.netlify/v1`. `@astrojs/netlify` is an optional
27
+ * peer: install it in the project (`npm install @astrojs/netlify`).
28
+ */
29
+ export const netlify = (options: NetlifyOptions = {}): NetlifyAdapter => ({
30
+ kind: "netlify",
31
+ options,
32
+ requiredSecrets: [],
33
+ runtimeDeps: serverRuntimeDeps(options, NETLIFY_ADAPTER_PACKAGE),
34
+ });
@@ -0,0 +1,34 @@
1
+ import { adapterDescriptorSchema } from "../../core/adapter.ts";
2
+ import type { DeployAdapter, DeployOptions } from "./types.ts";
3
+ import { deployOptionsSchema, serverRuntimeDeps } from "./types.ts";
4
+
5
+ /** The Astro adapter package a Node server build imports. */
6
+ export const NODE_ADAPTER_PACKAGE = "@astrojs/node";
7
+
8
+ /**
9
+ * Options for {@link node}: `output`, `site`, and `base`, plus any option of
10
+ * `@astrojs/node` forwarded verbatim (`mode`, `host`, `port`, …). Blume
11
+ * defaults `mode` to `"standalone"`; an option you pass wins.
12
+ */
13
+ export type NodeOptions = DeployOptions;
14
+
15
+ export type NodeAdapter = DeployAdapter<"node">;
16
+
17
+ export const nodeOptionsSchema = deployOptionsSchema;
18
+
19
+ export const nodeAdapterSchema = adapterDescriptorSchema(
20
+ "node",
21
+ nodeOptionsSchema
22
+ );
23
+
24
+ /**
25
+ * A self-hosted Node server (containers, VMs). The standalone server in
26
+ * `dist/server/entry.mjs` serves `dist/client` itself. `@astrojs/node` is one
27
+ * of Blume's own dependencies.
28
+ */
29
+ export const node = (options: NodeOptions = {}): NodeAdapter => ({
30
+ kind: "node",
31
+ options,
32
+ requiredSecrets: [],
33
+ runtimeDeps: serverRuntimeDeps(options, NODE_ADAPTER_PACKAGE),
34
+ });
@@ -0,0 +1,127 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../../core/adapter.ts";
4
+ import { cloudflare, cloudflareAdapterSchema } from "./cloudflare.ts";
5
+ import type { CloudflareAdapter } from "./cloudflare.ts";
6
+ import { netlify, netlifyAdapterSchema } from "./netlify.ts";
7
+ import type { NetlifyAdapter } from "./netlify.ts";
8
+ import { node, nodeAdapterSchema } from "./node.ts";
9
+ import type { NodeAdapter } from "./node.ts";
10
+ import type { DeployOutput, StaticDeployment } from "./types.ts";
11
+ import { vercel, vercelAdapterSchema } from "./vercel.ts";
12
+ import type { VercelAdapter } from "./vercel.ts";
13
+
14
+ /** Every descriptor a host adapter factory can return. */
15
+ export type AnyDeployAdapter =
16
+ | CloudflareAdapter
17
+ | NetlifyAdapter
18
+ | NodeAdapter
19
+ | VercelAdapter;
20
+
21
+ /** Every adapter identity, including the resolved `static` default. */
22
+ export type DeployAdapterKind = "static" | AnyDeployAdapter["kind"];
23
+
24
+ /**
25
+ * A resolved deployment's options: `output` is always present (a host adapter
26
+ * defaults to `server`, the static form is `static`), and anything else the
27
+ * adapter was given rides along for the `@astrojs/*` constructor.
28
+ */
29
+ export type ResolvedDeployOptions = {
30
+ base?: string;
31
+ output: DeployOutput;
32
+ site?: string;
33
+ } & { [option: string]: JsonValue };
34
+
35
+ /**
36
+ * What `config.deployment` resolves to: the descriptor the factory returned
37
+ * with `output` filled in, or the `static` descriptor for the plain form.
38
+ */
39
+ export type ResolvedDeployment = AdapterDescriptor<
40
+ DeployAdapterKind,
41
+ ResolvedDeployOptions
42
+ >;
43
+
44
+ /** What `blume.config.ts` accepts under `deployment`. */
45
+ export type DeploymentInput = AnyDeployAdapter | StaticDeployment;
46
+
47
+ const HINT =
48
+ 'deployment takes a host adapter from "blume/deploy" — e.g. `deployment: vercel()`, `netlify({ output: "static" })`, `node({ site })` — or `{ site, base }` for a static build on any host. The 1.x `adapter`/`output` fields were removed.';
49
+
50
+ /**
51
+ * The static form, `{ site?, base? }`. Its discriminator is optional so the
52
+ * union resolves a plain object (and `{}`) to it; the 1.x object form fails
53
+ * here on its unrecognized `adapter`/`output` keys with the adapter hint.
54
+ */
55
+ const staticDeploymentSchema = z.strictObject(
56
+ {
57
+ base: z.string().optional(),
58
+ kind: z.literal("static").optional(),
59
+ site: z.url().optional(),
60
+ },
61
+ {
62
+ error: (issue) => (issue.code === "unrecognized_keys" ? HINT : undefined),
63
+ }
64
+ );
65
+
66
+ /** The union `deployment` is validated against, before resolution. */
67
+ const deploymentInputSchema = z.discriminatedUnion(
68
+ "kind",
69
+ [
70
+ cloudflareAdapterSchema,
71
+ netlifyAdapterSchema,
72
+ nodeAdapterSchema,
73
+ vercelAdapterSchema,
74
+ staticDeploymentSchema,
75
+ ],
76
+ {
77
+ error: (issue) =>
78
+ issue.code === "invalid_union" || issue.code === "invalid_type"
79
+ ? HINT
80
+ : undefined,
81
+ }
82
+ );
83
+
84
+ /** A host adapter with `output` resolved: unset means a server build. */
85
+ const resolveHost = (adapter: AnyDeployAdapter): ResolvedDeployment => ({
86
+ ...adapter,
87
+ options: { ...adapter.options, output: adapter.options.output ?? "server" },
88
+ });
89
+
90
+ /**
91
+ * Validates what a factory returned (or the plain static form) and resolves
92
+ * it to the canonical descriptor, re-derived through the factory so a
93
+ * descriptor that went through JSON carries the same metadata Blume ships.
94
+ * `static` is internal: `kind: "static"` is admitted but never needed.
95
+ */
96
+ export const resolvedDeploymentSchema = deploymentInputSchema.transform(
97
+ (value): ResolvedDeployment => {
98
+ switch (value.kind) {
99
+ case "cloudflare": {
100
+ return resolveHost(cloudflare(value.options));
101
+ }
102
+ case "netlify": {
103
+ return resolveHost(netlify(value.options));
104
+ }
105
+ case "node": {
106
+ return resolveHost(node(value.options));
107
+ }
108
+ case "vercel": {
109
+ return resolveHost(vercel(value.options));
110
+ }
111
+ default: {
112
+ // The static form (`kind` unset or "static") is resolved after the
113
+ // switch rather than in this block: Bun 1.4.0's line coverage never
114
+ // credits the closing brace of a switch's final block.
115
+ break;
116
+ }
117
+ }
118
+ const options: ResolvedDeployOptions = { output: "static" };
119
+ if (value.base !== undefined) {
120
+ options.base = value.base;
121
+ }
122
+ if (value.site !== undefined) {
123
+ options.site = value.site;
124
+ }
125
+ return { kind: "static", options, requiredSecrets: [], runtimeDeps: [] };
126
+ }
127
+ );
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../../core/adapter.ts";
4
+
5
+ /** Build output mode: prerendered HTML only, or a server that can also answer requests. */
6
+ export type DeployOutput = "static" | "server";
7
+
8
+ /** The options every host adapter maps itself. */
9
+ export interface DeployNamedOptions {
10
+ /** Base path when the site is served from a subdirectory (`/docs`). */
11
+ base?: string;
12
+ /**
13
+ * Build output mode. Defaults to `server`: naming a host adapter is how a
14
+ * site opts into server rendering. Pass `"static"` to keep a static build
15
+ * on that host, with its site detection and platform files.
16
+ */
17
+ output?: DeployOutput;
18
+ /**
19
+ * Canonical site URL. Needed for absolute links, the sitemap, and OG images;
20
+ * detected from the platform's env at build time when unset.
21
+ */
22
+ site?: string;
23
+ }
24
+
25
+ /**
26
+ * Options for a host adapter: the named options plus anything else, forwarded
27
+ * verbatim to the underlying `@astrojs/*` adapter's constructor. JSON values
28
+ * only — the descriptor is inlined into the generated `astro.config.mjs`.
29
+ */
30
+ export type DeployOptions = DeployNamedOptions & {
31
+ [option: string]: JsonValue;
32
+ };
33
+
34
+ /**
35
+ * The descriptor a host adapter factory returns and `blume.config.ts` carries
36
+ * under `deployment`: the shared {@link AdapterDescriptor} contract, with the
37
+ * options a host takes. Plain data, never an Astro integration — the generated
38
+ * config imports the real adapter package itself.
39
+ */
40
+ export type DeployAdapter<
41
+ Kind extends string,
42
+ Options extends DeployOptions = DeployOptions,
43
+ > = AdapterDescriptor<Kind, Options>;
44
+
45
+ /**
46
+ * A static build for any host — the form `deployment` takes when no adapter is
47
+ * named: `{ site, base }`, or nothing at all. `kind` is the resolved
48
+ * discriminator; leave it unset.
49
+ */
50
+ export interface StaticDeployment {
51
+ /** Base path when the site is served from a subdirectory (`/docs`). */
52
+ base?: string;
53
+ /** The resolved kind; never needed in a config. */
54
+ kind?: "static";
55
+ /**
56
+ * Canonical site URL. Needed for absolute links, the sitemap, and OG images;
57
+ * detected from the platform's env at build time when unset.
58
+ */
59
+ site?: string;
60
+ }
61
+
62
+ /** The named options' schema; every host adapter extends it with `z.json()` passthrough. */
63
+ export const deployOptionsSchema = z
64
+ .object({
65
+ base: z.string().optional(),
66
+ output: z.enum(["static", "server"]).optional(),
67
+ site: z.url().optional(),
68
+ })
69
+ .catchall(z.json());
70
+
71
+ const NAMED_OPTIONS = new Set(["base", "output", "site"]);
72
+
73
+ /**
74
+ * The options Blume does not name — what reaches the `@astrojs/*` adapter's
75
+ * constructor verbatim.
76
+ */
77
+ export const deployPassthrough = (
78
+ options: DeployOptions
79
+ ): Record<string, JsonValue> =>
80
+ Object.fromEntries(
81
+ Object.entries(options).filter(([key]) => !NAMED_OPTIONS.has(key))
82
+ );
83
+
84
+ /**
85
+ * The runtime dependency a host adapter declares: its `@astrojs/*` package,
86
+ * which the generated `astro.config.mjs` imports for a server build and
87
+ * nothing imports for a static one. Unset `output` means server.
88
+ */
89
+ export const serverRuntimeDeps = (
90
+ options: DeployNamedOptions,
91
+ adapterPackage: string
92
+ ): string[] => (options.output === "static" ? [] : [adapterPackage]);
@@ -0,0 +1,35 @@
1
+ import { adapterDescriptorSchema } from "../../core/adapter.ts";
2
+ import type { DeployAdapter, DeployOptions } from "./types.ts";
3
+ import { deployOptionsSchema, serverRuntimeDeps } from "./types.ts";
4
+
5
+ /** The Astro adapter package a Vercel server build imports. */
6
+ export const VERCEL_ADAPTER_PACKAGE = "@astrojs/vercel";
7
+
8
+ /**
9
+ * Options for {@link vercel}: `output`, `site`, and `base`, plus any option of
10
+ * `@astrojs/vercel` forwarded verbatim (`isr`, `maxDuration`, `imageService`,
11
+ * `webAnalytics`, …).
12
+ */
13
+ export type VercelOptions = DeployOptions;
14
+
15
+ export type VercelAdapter = DeployAdapter<"vercel">;
16
+
17
+ export const vercelOptionsSchema = deployOptionsSchema;
18
+
19
+ export const vercelAdapterSchema = adapterDescriptorSchema(
20
+ "vercel",
21
+ vercelOptionsSchema
22
+ );
23
+
24
+ /**
25
+ * Vercel. A server build writes the Build Output tree to `.vercel/output`,
26
+ * audits the function bundle for imports the platform's dependency trace
27
+ * dropped, and wires `Accept: text/markdown` negotiation into the routing
28
+ * config. `@astrojs/vercel` is one of Blume's own dependencies.
29
+ */
30
+ export const vercel = (options: VercelOptions = {}): VercelAdapter => ({
31
+ kind: "vercel",
32
+ options,
33
+ requiredSecrets: [],
34
+ runtimeDeps: serverRuntimeDeps(options, VERCEL_ADAPTER_PACKAGE),
35
+ });