blume 1.7.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +217 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
  60. package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +186 -515
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +27 -12
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2282 -452
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +15 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +162 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +50 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +35 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +9 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +16 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +11 -11
  307. package/docs/discoverability/index.mdx +4 -4
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +21 -22
  329. package/src/ai/ai-catalog.ts +50 -32
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +7 -6
  338. package/src/ai/llms.ts +20 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/openapi-components.ts +4 -1
  342. package/src/ai/relative-links.ts +170 -0
  343. package/src/ai/serializers.ts +2 -2
  344. package/src/ai/skills.ts +1 -1
  345. package/src/ai/web-bot-auth.ts +2 -2
  346. package/src/analytics/adobe.ts +46 -0
  347. package/src/analytics/amplitude.ts +79 -0
  348. package/src/analytics/clarity.ts +46 -0
  349. package/src/analytics/clearbit.ts +47 -0
  350. package/src/analytics/cloudflare.ts +67 -0
  351. package/src/analytics/fathom.ts +64 -0
  352. package/src/analytics/google-analytics.ts +84 -0
  353. package/src/analytics/google-tag-manager.ts +61 -0
  354. package/src/analytics/head.ts +130 -0
  355. package/src/analytics/heap.ts +65 -0
  356. package/src/analytics/hightouch.ts +77 -0
  357. package/src/analytics/hotjar.ts +47 -0
  358. package/src/analytics/index.ts +71 -0
  359. package/src/analytics/inline.ts +21 -0
  360. package/src/analytics/logrocket.ts +71 -0
  361. package/src/analytics/mixpanel.ts +92 -0
  362. package/src/analytics/pirsch.ts +66 -0
  363. package/src/analytics/plausible.ts +83 -0
  364. package/src/analytics/posthog.ts +78 -0
  365. package/src/analytics/schema.ts +60 -0
  366. package/src/analytics/script.ts +60 -0
  367. package/src/analytics/segment.ts +85 -0
  368. package/src/analytics/vercel.ts +50 -0
  369. package/src/astro/adapter-root.ts +7 -9
  370. package/src/astro/component-slots.ts +131 -91
  371. package/src/astro/generate.ts +112 -345
  372. package/src/astro/integration.ts +2 -6
  373. package/src/astro/pages.ts +13 -101
  374. package/src/astro/render-deps.ts +379 -0
  375. package/src/astro/runtime-deps.ts +201 -0
  376. package/src/astro/templates.ts +554 -541
  377. package/src/audit/agent.ts +24 -0
  378. package/src/audit/catalog.ts +2 -2
  379. package/src/audit/checks/assets.ts +2 -2
  380. package/src/audit/checks/dns-aid.ts +1 -1
  381. package/src/audit/checks/duplicates.ts +3 -1
  382. package/src/audit/checks/i18n.ts +1 -1
  383. package/src/audit/checks/indexability.ts +7 -7
  384. package/src/audit/checks/links.ts +2 -2
  385. package/src/audit/checks/llms.ts +6 -6
  386. package/src/audit/checks/network.ts +3 -3
  387. package/src/audit/checks/og-image.ts +2 -2
  388. package/src/audit/checks/robots.ts +1 -1
  389. package/src/audit/checks/sitemap.ts +2 -2
  390. package/src/audit/checks/social.ts +1 -1
  391. package/src/audit/run.ts +4 -3
  392. package/src/audit/terms.ts +31 -0
  393. package/src/audit/url.ts +13 -13
  394. package/src/cli/command-meta.ts +10 -0
  395. package/src/cli/commands/audit.ts +39 -20
  396. package/src/cli/commands/build.ts +71 -316
  397. package/src/cli/commands/check.ts +1 -0
  398. package/src/cli/commands/dev.ts +40 -1
  399. package/src/cli/commands/doctor.ts +90 -14
  400. package/src/cli/commands/eject.ts +44 -7
  401. package/src/cli/commands/eval.ts +2 -2
  402. package/src/cli/commands/init.ts +161 -41
  403. package/src/cli/commands/migrate.ts +121 -0
  404. package/src/cli/commands/preview.ts +7 -1
  405. package/src/cli/commands/translate.ts +2 -2
  406. package/src/cli/commands/upgrade.ts +141 -0
  407. package/src/cli/commands/version.ts +57 -44
  408. package/src/cli/eject-scripts.ts +121 -6
  409. package/src/cli/index.ts +11 -1
  410. package/src/cli/init/install.ts +70 -0
  411. package/src/cli/init/questions.ts +7 -0
  412. package/src/cli/init/scaffold.ts +459 -75
  413. package/src/cli/lazy-command.ts +37 -1
  414. package/src/cli/prepare.ts +40 -6
  415. package/src/cli/required-secrets.ts +38 -11
  416. package/src/cli/unknown-flags.ts +266 -0
  417. package/src/cli/yarn-pnp.ts +52 -0
  418. package/src/components/content/AccordionItem.astro +7 -1
  419. package/src/components/content/Card.astro +4 -3
  420. package/src/components/content/ColorItem.astro +22 -4
  421. package/src/components/content/GithubInfo.astro +2 -2
  422. package/src/components/content/Prompt.astro +25 -25
  423. package/src/components/content/Tabs.astro +3 -1
  424. package/src/components/content/Tile.astro +2 -3
  425. package/src/components/content/Tooltip.astro +57 -9
  426. package/src/components/content/content-strings.ts +34 -0
  427. package/src/components/content/diff.ts +1 -1
  428. package/src/components/content/mermaid-element.ts +13 -2
  429. package/src/components/content/prompt-markdown.ts +292 -0
  430. package/src/components/content/tooltip-id.ts +41 -0
  431. package/src/components/islands/hooks.ts +25 -2
  432. package/src/components/layout/Analytics.astro +21 -79
  433. package/src/components/layout/Banner.astro +3 -1
  434. package/src/components/layout/DiscoveryLinks.astro +69 -0
  435. package/src/components/layout/Header.astro +83 -20
  436. package/src/components/layout/LanguageSwitcher.astro +4 -1
  437. package/src/components/layout/Logo.astro +23 -2
  438. package/src/components/layout/NavSelector.astro +13 -2
  439. package/src/components/layout/NavTree.astro +12 -3
  440. package/src/components/layout/NavTreeScript.astro +17 -3
  441. package/src/components/layout/PageActions.astro +3 -3
  442. package/src/components/layout/PageFeedback.astro +11 -1
  443. package/src/components/layout/PageLayout.astro +52 -5
  444. package/src/components/layout/ReferenceLayout.astro +21 -12
  445. package/src/components/layout/RootLayout.astro +69 -66
  446. package/src/components/layout/Search.astro +30 -6
  447. package/src/components/layout/WebMcp.astro +1 -1
  448. package/src/components/layout/analytics-client.ts +72 -15
  449. package/src/components/layout/drawer-inert.ts +113 -15
  450. package/src/components/layout/dropdown-clamp.ts +105 -0
  451. package/src/components/layout/head-scripts.ts +15 -6
  452. package/src/components/layout/nav-utils.ts +17 -0
  453. package/src/components/layout/search/algolia.ts +8 -8
  454. package/src/components/layout/search/orama-cloud.ts +9 -7
  455. package/src/components/layout/search/typesense.ts +11 -17
  456. package/src/components/openapi/MessageComposer.astro +2 -2
  457. package/src/components/openapi/Playground.astro +2 -2
  458. package/src/components/openapi/playground-client.ts +79 -10
  459. package/src/core/changelog-index.ts +24 -0
  460. package/src/core/component-overrides.ts +399 -154
  461. package/src/core/config-input.ts +188 -553
  462. package/src/core/config.ts +130 -41
  463. package/src/core/custom-pages.ts +105 -0
  464. package/src/core/data.ts +31 -12
  465. package/src/core/define-components.ts +12 -9
  466. package/src/core/deployment-env.ts +18 -74
  467. package/src/core/diagnostics.ts +14 -7
  468. package/src/core/graph.ts +69 -25
  469. package/src/core/i18n-ui.ts +6 -2
  470. package/src/core/i18n.ts +17 -0
  471. package/src/core/includes.ts +156 -38
  472. package/src/core/last-modified.ts +6 -11
  473. package/src/core/links.ts +166 -2
  474. package/src/core/manifest.ts +10 -3
  475. package/src/core/navigation.ts +115 -16
  476. package/src/core/new-tab.ts +35 -0
  477. package/src/core/node-require.ts +21 -0
  478. package/src/core/project-graph.ts +42 -26
  479. package/src/core/project.ts +9 -4
  480. package/src/core/request-body.ts +61 -0
  481. package/src/core/safe-href.ts +28 -0
  482. package/src/core/safe-links.ts +68 -0
  483. package/src/core/schema.ts +517 -739
  484. package/src/core/server-features.ts +8 -9
  485. package/src/core/sources/assets.ts +47 -11
  486. package/src/core/sources/collection.ts +67 -0
  487. package/src/core/sources/contentful-rich-text.ts +285 -0
  488. package/src/core/sources/contentful.ts +173 -0
  489. package/src/core/sources/github-releases.ts +51 -1
  490. package/src/core/sources/json.ts +71 -0
  491. package/src/core/sources/lexical.ts +195 -0
  492. package/src/core/sources/lower.ts +226 -0
  493. package/src/core/sources/normalize.ts +52 -2
  494. package/src/core/sources/notion.ts +39 -28
  495. package/src/core/sources/payload.ts +135 -0
  496. package/src/core/sources/portable-text.ts +11 -16
  497. package/src/core/sources/remote.ts +226 -0
  498. package/src/core/sources/resolve.ts +104 -166
  499. package/src/core/sources/sanity.ts +16 -49
  500. package/src/core/sources/strapi-blocks.ts +124 -0
  501. package/src/core/sources/strapi.ts +191 -0
  502. package/src/core/sources/types.ts +12 -1
  503. package/src/core/types.ts +15 -1
  504. package/src/core/ui-packs/ar.ts +6 -2
  505. package/src/core/ui-packs/bg.ts +6 -2
  506. package/src/core/ui-packs/bn.ts +6 -2
  507. package/src/core/ui-packs/ca.ts +3 -1
  508. package/src/core/ui-packs/cs.ts +6 -2
  509. package/src/core/ui-packs/da.ts +6 -2
  510. package/src/core/ui-packs/de.ts +6 -2
  511. package/src/core/ui-packs/el.ts +3 -1
  512. package/src/core/ui-packs/es.ts +3 -1
  513. package/src/core/ui-packs/fa.ts +6 -2
  514. package/src/core/ui-packs/fi.ts +6 -2
  515. package/src/core/ui-packs/fr.ts +3 -1
  516. package/src/core/ui-packs/he.ts +6 -2
  517. package/src/core/ui-packs/hi.ts +6 -2
  518. package/src/core/ui-packs/hr.ts +6 -2
  519. package/src/core/ui-packs/hu.ts +6 -2
  520. package/src/core/ui-packs/id.ts +6 -2
  521. package/src/core/ui-packs/it.ts +3 -1
  522. package/src/core/ui-packs/ja.ts +3 -1
  523. package/src/core/ui-packs/ko.ts +3 -1
  524. package/src/core/ui-packs/nl.ts +6 -2
  525. package/src/core/ui-packs/no.ts +6 -2
  526. package/src/core/ui-packs/pl.ts +6 -2
  527. package/src/core/ui-packs/pt-br.ts +3 -1
  528. package/src/core/ui-packs/pt.ts +3 -1
  529. package/src/core/ui-packs/ro.ts +6 -2
  530. package/src/core/ui-packs/ru.ts +6 -2
  531. package/src/core/ui-packs/sk.ts +6 -2
  532. package/src/core/ui-packs/sr.ts +6 -2
  533. package/src/core/ui-packs/sv.ts +6 -2
  534. package/src/core/ui-packs/th.ts +3 -1
  535. package/src/core/ui-packs/tr.ts +6 -2
  536. package/src/core/ui-packs/uk.ts +6 -2
  537. package/src/core/ui-packs/vi.ts +3 -1
  538. package/src/core/ui-packs/zh-tw.ts +3 -1
  539. package/src/core/ui-packs/zh.ts +3 -1
  540. package/src/core/unrecognized-keys.ts +10 -0
  541. package/src/core/version-cut.ts +116 -8
  542. package/src/deploy/adapter-output.ts +57 -97
  543. package/src/deploy/adapters/cloudflare.ts +39 -0
  544. package/src/deploy/adapters/index.ts +41 -0
  545. package/src/deploy/adapters/netlify.ts +34 -0
  546. package/src/deploy/adapters/node.ts +34 -0
  547. package/src/deploy/adapters/registry.ts +127 -0
  548. package/src/deploy/adapters/types.ts +92 -0
  549. package/src/deploy/adapters/vercel.ts +35 -0
  550. package/src/deploy/artifacts.ts +55 -27
  551. package/src/deploy/cloudflare-negotiation.ts +179 -100
  552. package/src/deploy/function-bundle.ts +18 -3
  553. package/src/deploy/headers.ts +124 -23
  554. package/src/deploy/node-headers.ts +198 -0
  555. package/src/deploy/platforms/cloudflare.ts +312 -0
  556. package/src/deploy/platforms/index.ts +67 -0
  557. package/src/deploy/platforms/netlify.ts +52 -0
  558. package/src/deploy/platforms/node.ts +40 -0
  559. package/src/deploy/platforms/paths.ts +42 -0
  560. package/src/deploy/platforms/static.ts +29 -0
  561. package/src/deploy/platforms/types.ts +112 -0
  562. package/src/deploy/platforms/vercel.ts +193 -0
  563. package/src/deploy/redirects.ts +30 -18
  564. package/src/deploy/robots.ts +3 -3
  565. package/src/deploy/rss.ts +2 -2
  566. package/src/deploy/sitemap.ts +2 -2
  567. package/src/deploy/vercel-negotiation.ts +2 -2
  568. package/src/eval/agents.ts +32 -1
  569. package/src/eval/findings.ts +19 -11
  570. package/src/eval/report.ts +10 -2
  571. package/src/markdown/external-links.ts +65 -0
  572. package/src/markdown/include.ts +45 -27
  573. package/src/markdown/index.ts +34 -9
  574. package/src/markdown/inline-code.ts +12 -6
  575. package/src/markdown/relative-links.ts +324 -0
  576. package/src/markdown/themes.ts +3 -3
  577. package/src/migrate/migrate.ts +149 -0
  578. package/src/openapi/parse.ts +64 -16
  579. package/src/openapi/proxy.ts +62 -10
  580. package/src/openapi/references.ts +147 -147
  581. package/src/openapi/render-mdx.ts +32 -10
  582. package/src/openapi/scalar.ts +15 -13
  583. package/src/openapi/sentence.ts +14 -0
  584. package/src/openapi/source.ts +37 -21
  585. package/src/openapi/spec-dependency-error.ts +15 -0
  586. package/src/reference/asyncapi.ts +83 -0
  587. package/src/reference/graphql.ts +89 -0
  588. package/src/reference/index.ts +40 -0
  589. package/src/reference/openapi.ts +83 -0
  590. package/src/reference/options.ts +201 -0
  591. package/src/reference/scalar.ts +136 -0
  592. package/src/reference/schema.ts +88 -0
  593. package/src/registry/eject.ts +97 -42
  594. package/src/search/adapters/algolia.ts +46 -0
  595. package/src/search/adapters/flexsearch.ts +29 -0
  596. package/src/search/adapters/index.ts +39 -0
  597. package/src/search/adapters/mixedbread.ts +39 -0
  598. package/src/search/adapters/orama-cloud.ts +51 -0
  599. package/src/search/adapters/orama.ts +24 -0
  600. package/src/search/adapters/pagefind.ts +27 -0
  601. package/src/search/adapters/registry.ts +131 -0
  602. package/src/search/adapters/types.ts +46 -0
  603. package/src/search/adapters/typesense.ts +57 -0
  604. package/src/search/build.ts +8 -4
  605. package/src/search/documents.ts +6 -0
  606. package/src/search/sync/algolia.ts +12 -11
  607. package/src/search/sync/index.ts +35 -20
  608. package/src/search/sync/orama-cloud.ts +12 -9
  609. package/src/search/sync/typesense.ts +15 -13
  610. package/src/sources/contentful.ts +63 -0
  611. package/src/sources/custom.ts +38 -0
  612. package/src/sources/filesystem.ts +51 -0
  613. package/src/sources/github-releases.ts +52 -0
  614. package/src/sources/index.ts +60 -0
  615. package/src/sources/mdx-remote.ts +76 -0
  616. package/src/sources/notion.ts +63 -0
  617. package/src/sources/obsidian.ts +38 -0
  618. package/src/sources/payload.ts +60 -0
  619. package/src/sources/registry.ts +182 -0
  620. package/src/sources/sanity.ts +66 -0
  621. package/src/sources/shared.ts +52 -0
  622. package/src/sources/strapi.ts +58 -0
  623. package/src/theme/entry.ts +24 -2
  624. package/src/translate/report.ts +40 -7
  625. package/src/upgrade/upgrade.ts +499 -0
  626. package/dist/cli/chunk-0qymqwzz.js +0 -164
  627. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  628. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  632. package/dist/cli/chunk-5093q3n7.js +0 -68
  633. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  634. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  635. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  636. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  637. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  638. package/dist/cli/chunk-97r59kpr.js +0 -381
  639. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  640. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  641. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  642. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  643. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  644. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  645. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  646. package/dist/cli/chunk-esphfr8p.js +0 -107
  647. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  648. package/dist/cli/chunk-ex56aa81.js +0 -1016
  649. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  650. package/dist/cli/chunk-garjf5z9.js +0 -30
  651. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  652. package/dist/cli/chunk-js7saxwm.js +0 -1045
  653. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  654. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  655. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  656. package/dist/cli/chunk-q4rae3bg.js +0 -60
  657. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  658. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  659. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  660. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  661. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  662. package/dist/cli/chunk-vrfp10qk.js +0 -81
  663. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  664. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  665. package/docs/advanced/api-reference.mdx +0 -240
  666. package/docs/reference/cli.mdx +0 -197
  667. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  668. package/src/components/content/changelog-element.ts +0 -69
  669. package/src/search/providers.ts +0 -91
  670. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
  671. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
  672. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
  673. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
@@ -1,1016 +0,0 @@
1
- #!/usr/bin/env node
2
- import"./chunk-ct47dqpx.js";
3
- import {
4
- pageJsonPath,
5
- API_CATALOG_PATH,
6
- API_CATALOG_TYPE,
7
- hasApiCatalog,
8
- crossOriginDiscoveryPaths
9
- } from "./chunk-0qymqwzz.js";
10
- import"./chunk-1jefwnfs.js";
11
- import {
12
- packageRoot,
13
- commandMeta,
14
- logger
15
- } from "./index.js";
16
- import"./chunk-7s8hm3b6.js";
17
- import"./chunk-bf6bt1xt.js";
18
- import {
19
- agentMarkdown,
20
- markdownTokenCount,
21
- buildRawMarkdown,
22
- markdownRoutePaths
23
- } from "./chunk-js7saxwm.js";
24
- import {
25
- SIGNATURES_DIRECTORY_PATH,
26
- SIGNATURES_DIRECTORY_TYPE,
27
- publishBuildProject,
28
- ogCacheDir,
29
- pruneCardCache,
30
- cardCacheTally
31
- } from "./chunk-k79xp7av.js";
32
- import {
33
- ADAPTER_IGNORE_DIRS,
34
- servesClientSubdir,
35
- deployStaticDir,
36
- surfaceAdapterOutput,
37
- buildHomeLinkHeader,
38
- platformRedirects
39
- } from "./chunk-ps4m1xh4.js";
40
- import"./chunk-vrfp10qk.js";
41
- import {
42
- ensureGitignore
43
- } from "./chunk-yzhm0j9q.js";
44
- import {
45
- refuseIfDevRunning
46
- } from "./chunk-vacwm2hv.js";
47
- import"./chunk-jq5n4avg.js";
48
- import"./chunk-nn13znc2.js";
49
- import {
50
- prepareProject
51
- } from "./chunk-esphfr8p.js";
52
- import {
53
- serverFeatures
54
- } from "./chunk-garjf5z9.js";
55
- import {
56
- normalizePath
57
- } from "./chunk-2mzebbbz.js";
58
-
59
- // src/cli/commands/build.ts
60
- import { existsSync as existsSync2 } from "node:fs";
61
- import { readdir as readdir2, readFile as readFile2, stat, writeFile } from "node:fs/promises";
62
- import { build } from "astro";
63
- import { defineCommand } from "citty";
64
- import { join as join2 } from "pathe";
65
-
66
- // src/deploy/cloudflare-negotiation.ts
67
- var NEGOTIATION_WORKER_FILE = "blume-worker.mjs";
68
- var MAX_RULES = 100;
69
- var MAX_RULE_LENGTH = 100;
70
- var FALLBACK_RULES = [
71
- "/*",
72
- "!/_astro/*",
73
- "!/*.md",
74
- "!/*.mdx",
75
- "!/*.txt",
76
- "!/*.json"
77
- ];
78
- var basePrefix = (base) => base && base !== "/" ? base.replace(/\/$/u, "") : "";
79
- var isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
80
- var isJsonString = (value) => typeof value === "string";
81
- var isNegativeRule = (rule) => rule.startsWith("!");
82
- var ruleBody = (rule) => isNegativeRule(rule) ? rule.slice(1) : rule;
83
- var buildRunWorkerFirstRules = (routePaths, base) => {
84
- const prefix = encodeURI(basePrefix(base));
85
- if (prefix) {
86
- return [
87
- prefix,
88
- `${prefix}/*`,
89
- `!${prefix}/*.md`,
90
- `!${prefix}/*.mdx`,
91
- `!${prefix}/*.txt`,
92
- `!${prefix}/*.json`,
93
- `!${prefix}/_astro/*`
94
- ];
95
- }
96
- const groups = new Map;
97
- let home = false;
98
- for (const route of routePaths) {
99
- if (route === "/") {
100
- home = true;
101
- continue;
102
- }
103
- const segments = route.split("/").filter(Boolean);
104
- const head = segments[0] ?? "";
105
- const group = groups.get(head) ?? { bare: false, nested: false };
106
- if (segments.length === 1) {
107
- group.bare = true;
108
- } else {
109
- group.nested = true;
110
- }
111
- groups.set(head, group);
112
- }
113
- const rules = home ? ["/"] : [];
114
- const negatives = [];
115
- for (const [head, group] of groups) {
116
- const segment = `/${encodeURI(head)}`;
117
- if (group.bare) {
118
- rules.push(segment);
119
- }
120
- if (group.nested) {
121
- rules.push(`${segment}/*`);
122
- negatives.push(`!${segment}/*.md`, `!${segment}/*.mdx`);
123
- } else {
124
- rules.push(`${segment}/`);
125
- }
126
- }
127
- return [...rules, ...negatives];
128
- };
129
- var coveredBy = (rule, other) => other !== rule && isNegativeRule(other) === isNegativeRule(rule) && ruleBody(other).endsWith("*") && ruleBody(rule).startsWith(ruleBody(other).slice(0, -1));
130
- var mergeRunWorkerFirstRules = (existing, added) => {
131
- if (existing === true) {
132
- return true;
133
- }
134
- const user = Array.isArray(existing) ? existing.filter((rule) => typeof rule === "string") : [];
135
- const merged = [...user, ...added.filter((rule) => !user.includes(rule))];
136
- return merged.filter((rule) => !merged.some((other) => coveredBy(rule, other)));
137
- };
138
- var withinWranglerLimits = (rules) => rules === true || rules.length <= MAX_RULES && rules.every((rule) => rule.length <= MAX_RULE_LENGTH);
139
- var buildNegotiationWorker = (options) => {
140
- const routes = JSON.stringify(options.routePaths);
141
- const pageJson = JSON.stringify(options.pageJsonPaths ?? []);
142
- const binding = JSON.stringify(options.assetsBinding);
143
- const prefix = JSON.stringify(encodeURI(basePrefix(options.base)));
144
- const homeLinkHeader = JSON.stringify(options.homeLinkHeader ?? null);
145
- const homeTokens = JSON.stringify(options.homeTokens === undefined ? null : String(options.homeTokens));
146
- const redirects = JSON.stringify(Object.fromEntries((options.redirects ?? []).map((redirect) => [
147
- normalizePath(redirect.from),
148
- [encodeURI(redirect.to), redirect.status]
149
- ])));
150
- return `// Generated by Blume. Do not edit; this file is recreated on each build.
151
- //
152
- // Request-time \`Accept: text/markdown\` negotiation for a Cloudflare server
153
- // build. \`assets.run_worker_first\` routes content-page requests here instead
154
- // of the platform's static layer; a client that prefers Markdown gets the
155
- // page's prerendered \`.md\` mirror from the assets binding, a configured
156
- // redirect is answered with its exact configured status, and a prerendered
157
- // per-page JSON document is served from the binding (the Astro Worker would
158
- // route it to the \`/api/\` catch-all, because Astro resolves a prerendered
159
- // dynamic route to the first live route on the same path). Every other
160
- // request is delegated to the Astro Worker untouched. \`_headers\` does not
161
- // apply to worker-first routes, so the homepage Link header and the Markdown
162
- // charset are re-stamped here.
163
- import server from ${JSON.stringify(options.mainSpecifier)};
164
-
165
- const ROUTES = new Set(${routes});
166
- const PAGE_JSON = new Set(${pageJson});
167
- const BASE_PREFIX = ${prefix};
168
- const ASSETS_BINDING = ${binding};
169
- const HOME_LINK_HEADER = ${homeLinkHeader};
170
- const HOME_TOKENS = ${homeTokens};
171
- const REDIRECTS = ${redirects};
172
-
173
- // Configured redirects live in \`_redirects\`, which only the static layer
174
- // reads — a worker-first route never reaches it. Answering from this baked-in
175
- // copy keeps the exact configured status; delegating instead would let Astro's
176
- // SSR handler default a GET to a permanent 301.
177
- const redirectFor = (pathname) => {
178
- const trimmed =
179
- pathname !== "/" && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname;
180
- const path = safeDecode(trimmed);
181
- return Object.hasOwn(REDIRECTS, path) ? REDIRECTS[path] : null;
182
- };
183
-
184
- // The request path with the deployment base removed: the whole path on a
185
- // root deploy, \`""\` for the bare base, \`null\` for a path outside the base.
186
- const stripBase = (pathname) => {
187
- if (!BASE_PREFIX) {
188
- return pathname;
189
- }
190
- if (pathname === BASE_PREFIX) {
191
- return "";
192
- }
193
- return pathname.startsWith(BASE_PREFIX + "/")
194
- ? pathname.slice(BASE_PREFIX.length)
195
- : null;
196
- };
197
-
198
- // Decoded for the lookups, which are keyed by decoded paths; a malformed
199
- // escape keeps the raw path, which simply won't match anything.
200
- const safeDecode = (path) => {
201
- try {
202
- return decodeURIComponent(path);
203
- } catch {
204
- return path;
205
- }
206
- };
207
-
208
- // \`_redirects\` semantics, which the static layer applies to these same
209
- // paths: the request's query string is forwarded unless the destination
210
- // carries its own, and a destination fragment stays after the query.
211
- const redirectLocation = (destination, search) => {
212
- const hashIndex = destination.indexOf("#");
213
- const bare = hashIndex === -1 ? destination : destination.slice(0, hashIndex);
214
- if (!search || bare.includes("?")) {
215
- return destination;
216
- }
217
- return hashIndex === -1
218
- ? bare + search
219
- : bare + search + destination.slice(hashIndex);
220
- };
221
-
222
- const parseAccept = (accept) =>
223
- accept.split(",").map((part) => {
224
- const segments = part.trim().split(";");
225
- const type = (segments[0] ?? "").trim().toLowerCase();
226
- const qSegment = segments
227
- .slice(1)
228
- .map((segment) => segment.trim())
229
- .find((segment) => segment.startsWith("q="));
230
- const q = qSegment ? Number(qSegment.slice(2)) : 1;
231
- return { q: Number.isNaN(q) ? 1 : q, type };
232
- });
233
-
234
- const prefersMarkdown = (accept) => {
235
- if (!accept) {
236
- return false;
237
- }
238
- let markdownQ = -1;
239
- let htmlQ = 0;
240
- for (const { q, type } of parseAccept(accept)) {
241
- if (type === "text/markdown" || type === "text/x-markdown") {
242
- markdownQ = Math.max(markdownQ, q);
243
- } else if (type === "text/html") {
244
- htmlQ = Math.max(htmlQ, q);
245
- }
246
- }
247
- return markdownQ > 0 && markdownQ >= htmlQ;
248
- };
249
-
250
- const markdownVariantUrl = (rawUrl) => {
251
- const queryIndex = rawUrl.indexOf("?");
252
- const query = queryIndex === -1 ? "" : rawUrl.slice(queryIndex);
253
- const rawPath = queryIndex === -1 ? rawUrl : rawUrl.slice(0, queryIndex);
254
- const rest = stripBase(rawPath);
255
- if (rest === null) {
256
- return null;
257
- }
258
- const path = rest || "/";
259
- const trimmed = path !== "/" && path.endsWith("/") ? path.slice(0, -1) : path;
260
- const pathname = safeDecode(trimmed);
261
- if (!ROUTES.has(pathname)) {
262
- return null;
263
- }
264
- const target = pathname === "/" ? "/index" : pathname;
265
- return BASE_PREFIX + encodeURI(target) + ".md" + query;
266
- };
267
-
268
- // Exactly the per-page JSON documents the build emitted, so a URL the site
269
- // never generated (a hidden page, a path outside the API) takes the normal
270
- // route to the Astro Worker and its problem document.
271
- const isPageJson = (pathname) => {
272
- const rest = stripBase(pathname);
273
- return rest !== null && PAGE_JSON.has(safeDecode(rest));
274
- };
275
-
276
- const isHomePath = (pathname) => {
277
- const rest = stripBase(pathname);
278
- return rest === "" || rest === "/";
279
- };
280
-
281
- const withHeaders = (response, apply) => {
282
- const patched = new Response(response.body, response);
283
- apply(patched.headers);
284
- return patched;
285
- };
286
-
287
- export default {
288
- async fetch(request, env, context) {
289
- const url = new URL(request.url);
290
- // Before the method guard: the static layer applies \`_redirects\` to every
291
- // method, so the wrapper does too.
292
- const redirect = redirectFor(url.pathname);
293
- if (redirect !== null) {
294
- return new Response(null, {
295
- headers: { location: redirectLocation(redirect[0], url.search) },
296
- status: redirect[1],
297
- });
298
- }
299
- if (request.method !== "GET" && request.method !== "HEAD") {
300
- return server.fetch(request, env, context);
301
- }
302
- const assets = env[ASSETS_BINDING];
303
- // The request goes through untouched, so a conditional revalidation
304
- // reaches the binding and comes back as a 304 — anything but a miss is
305
- // the document's own answer. A miss falls through to the Astro Worker.
306
- if (assets !== undefined && isPageJson(url.pathname)) {
307
- const asset = await assets.fetch(request);
308
- if (asset.status !== 404) {
309
- return asset;
310
- }
311
- }
312
- const variant = markdownVariantUrl(url.pathname + url.search);
313
- const home = isHomePath(url.pathname);
314
- if (
315
- variant !== null &&
316
- assets !== undefined &&
317
- prefersMarkdown(request.headers.get("accept"))
318
- ) {
319
- const asset = await assets.fetch(
320
- new Request(new URL(variant, url), request)
321
- );
322
- if (asset.ok) {
323
- return withHeaders(asset, (headers) => {
324
- headers.set("content-type", "text/markdown; charset=utf-8");
325
- headers.append("vary", "Accept");
326
- if (home) {
327
- if (HOME_LINK_HEADER !== null) {
328
- headers.set("link", HOME_LINK_HEADER);
329
- }
330
- if (HOME_TOKENS !== null) {
331
- headers.set("x-markdown-tokens", HOME_TOKENS);
332
- }
333
- }
334
- });
335
- }
336
- }
337
- const response = await server.fetch(request, env, context);
338
- if (variant === null && !(home && HOME_LINK_HEADER !== null)) {
339
- return response;
340
- }
341
- return withHeaders(response, (headers) => {
342
- if (variant !== null) {
343
- headers.append("vary", "Accept");
344
- }
345
- if (home && HOME_LINK_HEADER !== null && !headers.has("link")) {
346
- headers.set("link", HOME_LINK_HEADER);
347
- }
348
- });
349
- },
350
- };
351
- `;
352
- };
353
- var injectWorkerNegotiation = (wranglerText, options) => {
354
- if (options.routePaths.length === 0) {
355
- return null;
356
- }
357
- let config;
358
- try {
359
- config = JSON.parse(wranglerText);
360
- } catch {
361
- return null;
362
- }
363
- if (!isJsonObject(config)) {
364
- return null;
365
- }
366
- const { main } = config;
367
- if (!isJsonString(main) || main.length === 0 || main === NEGOTIATION_WORKER_FILE) {
368
- return null;
369
- }
370
- const { assets } = config;
371
- if (!isJsonObject(assets) || !isJsonString(assets.binding)) {
372
- return null;
373
- }
374
- const {
375
- contentRoutePaths = options.routePaths,
376
- redirects = [],
377
- ...workerOptions
378
- } = options;
379
- const deployPrefix = basePrefix(options.base);
380
- const guardRoutes = new Set(contentRoutePaths.map((route) => normalizePath(deployPrefix && route !== "/" ? `${deployPrefix}${route}` : deployPrefix || route)));
381
- const workerRedirects = redirects.filter((redirect) => redirect.from.startsWith("/") && !guardRoutes.has(normalizePath(redirect.from)));
382
- let rules = mergeRunWorkerFirstRules(assets.run_worker_first, buildRunWorkerFirstRules(options.routePaths, options.base));
383
- if (!withinWranglerLimits(rules)) {
384
- rules = mergeRunWorkerFirstRules(assets.run_worker_first, FALLBACK_RULES);
385
- }
386
- if (!withinWranglerLimits(rules)) {
387
- return null;
388
- }
389
- if (rules !== true) {
390
- assets.run_worker_first = rules;
391
- }
392
- config.main = NEGOTIATION_WORKER_FILE;
393
- const mainSpecifier = main.startsWith(".") || main.startsWith("/") ? main : `./${main}`;
394
- const worker = buildNegotiationWorker({
395
- ...workerOptions,
396
- assetsBinding: assets.binding,
397
- mainSpecifier,
398
- redirects: workerRedirects
399
- });
400
- return { worker, wrangler: JSON.stringify(config) };
401
- };
402
-
403
- // src/deploy/function-bundle.ts
404
- import { existsSync, readFileSync } from "node:fs";
405
- import { readdir, readFile } from "node:fs/promises";
406
- import { builtinModules } from "node:module";
407
- import { init, parse } from "es-module-lexer";
408
- import { dirname, join, relative } from "pathe";
409
- import { z } from "zod";
410
- var BUILTINS = new Set(builtinModules);
411
- var NON_PACKAGE_PREFIXES = ["node:", "astro:", "virtual:", "data:", "\x00"];
412
- var packageName = (specifier) => {
413
- if (specifier.startsWith(".") || specifier.startsWith("/") || NON_PACKAGE_PREFIXES.some((prefix) => specifier.startsWith(prefix)) || BUILTINS.has(specifier)) {
414
- return null;
415
- }
416
- const segments = specifier.split("/");
417
- if (specifier.startsWith("@")) {
418
- return segments.length >= 2 ? `${segments[0]}/${segments[1]}` : null;
419
- }
420
- return segments[0] || null;
421
- };
422
- var STATIC_IMPORT = /(?:^|[;\s}])(?:import\s*["'](?<bare>[^"'\n]+)["']|(?:import|export)\s*[\w$*{},\s]*?\s*from\s*["'](?<from>[^"'\n]+)["'])/gu;
423
- var DYNAMIC_IMPORT = /\bimport\(\s*["'](?<dynamic>[^"'\n]+)["']\s*\)/gu;
424
- var scannedSpecifiers = (source) => {
425
- const specifiers = [];
426
- for (const pattern of [STATIC_IMPORT, DYNAMIC_IMPORT]) {
427
- for (const match of source.matchAll(pattern)) {
428
- const groups = match.groups ?? {};
429
- specifiers.push(groups.bare ?? groups.from ?? groups.dynamic ?? "");
430
- }
431
- }
432
- return specifiers;
433
- };
434
- var lexedSpecifiers = (source, name) => {
435
- const [imports] = parse(source, name);
436
- const specifiers = [];
437
- for (const entry of imports) {
438
- if (entry.type === "dynamic" && entry.glob) {
439
- continue;
440
- }
441
- if (entry.specifier) {
442
- specifiers.push(entry.specifier);
443
- }
444
- }
445
- return specifiers;
446
- };
447
- var importedPackages = async (source, name = "module") => {
448
- await init();
449
- let specifiers;
450
- try {
451
- specifiers = lexedSpecifiers(source, name);
452
- } catch {
453
- specifiers = scannedSpecifiers(source);
454
- }
455
- const names = new Set;
456
- for (const specifier of specifiers) {
457
- const packageId = packageName(specifier);
458
- if (packageId) {
459
- names.add(packageId);
460
- }
461
- }
462
- return [...names];
463
- };
464
- var resolvable = (name, from, root) => {
465
- let dir = from;
466
- for (;; ) {
467
- if (existsSync(join(dir, "node_modules", name, "package.json"))) {
468
- return true;
469
- }
470
- if (dir === root) {
471
- return false;
472
- }
473
- const parent = dirname(dir);
474
- if (parent === dir) {
475
- return false;
476
- }
477
- dir = parent;
478
- }
479
- };
480
- var MODULE_FILE = /\.(?:m?js|cjs)$/u;
481
- var vcConfigSchema = z.looseObject({ handler: z.string().optional() });
482
- var listModules = async (dir) => {
483
- const files = [];
484
- const entries = await readdir(dir, { withFileTypes: true });
485
- for (const entry of entries) {
486
- const path = join(dir, entry.name);
487
- if (entry.isDirectory()) {
488
- if (entry.name !== "node_modules") {
489
- files.push(...await listModules(path));
490
- }
491
- } else if (entry.isFile() && MODULE_FILE.test(entry.name)) {
492
- files.push(path);
493
- }
494
- }
495
- return files;
496
- };
497
- var auditFunctionBundle = async (funcDir) => {
498
- const configPath = join(funcDir, ".vc-config.json");
499
- if (!existsSync(configPath)) {
500
- return [];
501
- }
502
- const config = vcConfigSchema.safeParse(JSON.parse(await readFile(configPath, "utf-8")));
503
- if (!config.success || !config.data.handler) {
504
- return [];
505
- }
506
- const serverDir = dirname(join(funcDir, config.data.handler));
507
- if (!existsSync(serverDir)) {
508
- return [];
509
- }
510
- const missing = new Map;
511
- for (const file of await listModules(serverDir)) {
512
- const source = await readFile(file, "utf-8");
513
- for (const name of await importedPackages(source, file)) {
514
- if (resolvable(name, dirname(file), funcDir)) {
515
- continue;
516
- }
517
- const importers = missing.get(name) ?? [];
518
- importers.push(relative(funcDir, file));
519
- missing.set(name, importers);
520
- }
521
- }
522
- return [...missing].map(([name, importers]) => ({ importers, name })).toSorted((a, b) => a.name.localeCompare(b.name));
523
- };
524
- var auditVercelFunctions = async (outputDir) => {
525
- const functionsDir = join(outputDir, "functions");
526
- if (!existsSync(functionsDir)) {
527
- return [];
528
- }
529
- const audits = [];
530
- const entries = await readdir(functionsDir, { withFileTypes: true });
531
- for (const entry of entries.toSorted((a, b) => a.name < b.name ? -1 : 1)) {
532
- if (!(entry.isDirectory() && entry.name.endsWith(".func"))) {
533
- continue;
534
- }
535
- const dir = join(functionsDir, entry.name);
536
- const missing = await auditFunctionBundle(dir);
537
- if (missing.length > 0) {
538
- audits.push({ dir, missing });
539
- }
540
- }
541
- return audits;
542
- };
543
- var blumeDependencyNames = () => {
544
- const manifest = JSON.parse(readFileSync(join(packageRoot(), "package.json"), "utf-8"));
545
- return new Set(Object.keys(manifest.dependencies ?? {}));
546
- };
547
- var functionBundleVerdict = (audit, root, ownDependencies) => {
548
- const names = audit.missing.map((entry) => entry.name);
549
- const lines = audit.missing.map((entry) => ` - ${entry.name} (imported by ${entry.importers.join(", ")})`);
550
- const fatal = names.some((name) => ownDependencies.has(name));
551
- const message = [
552
- `The Vercel function bundle at ${relative(root, audit.dir) || audit.dir} is missing packages its server code imports, so the deployed function would fail on every request with ERR_MODULE_NOT_FOUND:`,
553
- ...lines,
554
- "Vercel's dependency trace only includes packages resolvable from the project root; under an isolated linker (pnpm, Bun's isolated mode) Blume's own dependencies are not. Add them to the project's package.json so the trace can find them:",
555
- ` npm install -D ${names.join(" ")}`
556
- ].join(`
557
- `);
558
- return { fatal, message };
559
- };
560
-
561
- // src/deploy/vercel-negotiation.ts
562
- var ACCEPT_MARKDOWN_HEADER_VALUE = "(.*,)?\\s*text/(x-)?markdown(\\s*[;,].*)?$";
563
- var ACCEPT_JSON_HEADER_VALUE = "(.*,)?\\s*application/(problem\\+)?json(\\s*[;,].*)?$";
564
- var isString = (value) => typeof value === "string";
565
- var ACCEPT_MARKDOWN_CONDITION = [
566
- { key: "accept", type: "header", value: ACCEPT_MARKDOWN_HEADER_VALUE }
567
- ];
568
- var ACCEPT_JSON_CONDITION = [
569
- { key: "accept", type: "header", value: ACCEPT_JSON_HEADER_VALUE }
570
- ];
571
- var VARY_ACCEPT = { vary: "Accept" };
572
- var NOT_FOUND_MARKDOWN_DEST = "/404.md";
573
- var NOT_FOUND_JSON_DEST = "/404.json";
574
- var NOT_FOUND_HTML_DEST = "/404.html";
575
- var NOT_FOUND_MARKDOWN_ROUTES = [
576
- {
577
- dest: NOT_FOUND_MARKDOWN_DEST,
578
- has: ACCEPT_MARKDOWN_CONDITION,
579
- headers: VARY_ACCEPT,
580
- src: "^/.*$",
581
- status: 404
582
- },
583
- { dest: NOT_FOUND_MARKDOWN_DEST, src: "^/.*\\.mdx?$", status: 404 }
584
- ];
585
- var NOT_FOUND_JSON_ROUTES = [
586
- {
587
- dest: NOT_FOUND_JSON_DEST,
588
- has: ACCEPT_JSON_CONDITION,
589
- headers: VARY_ACCEPT,
590
- src: "^/.*$",
591
- status: 404
592
- },
593
- { dest: NOT_FOUND_JSON_DEST, src: "^/.*\\.json$", status: 404 }
594
- ];
595
- var MAX_ALTERNATION_LENGTH = 3900;
596
- var REGEX_SPECIALS = /[$()*+.?[\]^{|}\\]/gu;
597
- var routePattern = (route) => encodeURI(route).replace(REGEX_SPECIALS, "\\$&");
598
- var chunkPatterns = (patterns) => {
599
- const chunks = [];
600
- let current = [];
601
- let length = 0;
602
- for (const pattern of patterns) {
603
- if (current.length > 0 && length + pattern.length + 1 > MAX_ALTERNATION_LENGTH) {
604
- chunks.push(current);
605
- current = [];
606
- length = 0;
607
- }
608
- current.push(pattern);
609
- length += pattern.length + 1;
610
- }
611
- if (current.length > 0) {
612
- chunks.push(current);
613
- }
614
- return chunks;
615
- };
616
- var buildNegotiationRoutes = (routePaths, homeTokens) => {
617
- const home = routePaths.includes("/");
618
- const rest = routePaths.filter((path) => path !== "/").map((path) => routePattern(path));
619
- const chunks = chunkPatterns(rest);
620
- const rewriteRoutes = home ? [
621
- {
622
- dest: "/index.md",
623
- has: ACCEPT_MARKDOWN_CONDITION,
624
- headers: homeTokens === undefined ? VARY_ACCEPT : { ...VARY_ACCEPT, "x-markdown-tokens": String(homeTokens) },
625
- src: "^/$"
626
- }
627
- ] : [];
628
- for (const chunk of chunks) {
629
- rewriteRoutes.push({
630
- dest: "$1.md",
631
- has: ACCEPT_MARKDOWN_CONDITION,
632
- headers: VARY_ACCEPT,
633
- src: `^(${chunk.join("|")})/?$`
634
- });
635
- }
636
- const headerChunks = chunkPatterns(home ? ["/", ...rest] : rest);
637
- const headerRoutes = headerChunks.map((chunk) => ({
638
- continue: true,
639
- headers: VARY_ACCEPT,
640
- src: `^(?:${chunk.join("|")})/?$`
641
- }));
642
- return { headerRoutes, rewriteRoutes };
643
- };
644
- var HOME_SRC = "^/$";
645
- var ALLOW_ANY_ORIGIN = "*";
646
- var corsRoute = (path) => ({
647
- continue: true,
648
- headers: { "access-control-allow-origin": ALLOW_ANY_ORIGIN },
649
- src: `^${routePattern(path)}$`
650
- });
651
- var isCorsRoute = (route) => route.continue === true && route.headers?.["access-control-allow-origin"] === ALLOW_ANY_ORIGIN && isString(route.src) && Object.keys(route).length === 3;
652
- var isNegotiationRoute = (route) => route.has?.some((condition) => condition.value === ACCEPT_MARKDOWN_HEADER_VALUE) === true || route.dest === NOT_FOUND_MARKDOWN_DEST && route.status === 404 || route.dest === NOT_FOUND_JSON_DEST && route.status === 404 || route.continue === true && route.headers?.vary === "Accept" && isString(route.src) && Object.keys(route).length === 3 || route.continue === true && isString(route.headers?.link) && route.src === HOME_SRC && Object.keys(route).length === 3 || isCorsRoute(route);
653
- var injectNegotiationRoutes = (configText, routePaths, homeLinkHeader, contentTypeOverrides, homeTokens, notFound = {}, corsPaths = []) => {
654
- const overrideEntries = Object.entries(contentTypeOverrides ?? {});
655
- let config;
656
- try {
657
- config = JSON.parse(configText);
658
- } catch {
659
- return null;
660
- }
661
- if (!Array.isArray(config.routes)) {
662
- return null;
663
- }
664
- for (const [path, contentType] of overrideEntries) {
665
- config.overrides = { ...config.overrides, [path]: { contentType } };
666
- }
667
- const routes = config.routes.filter((route) => !isNegotiationRoute(route));
668
- const filesystemIndex = routes.findIndex((route) => route.handle === "filesystem");
669
- if (filesystemIndex === -1) {
670
- return null;
671
- }
672
- const { headerRoutes, rewriteRoutes } = buildNegotiationRoutes(routePaths, homeTokens);
673
- if (homeLinkHeader) {
674
- headerRoutes.push({
675
- continue: true,
676
- headers: { link: homeLinkHeader },
677
- src: HOME_SRC
678
- });
679
- }
680
- headerRoutes.push(...corsPaths.map(corsRoute));
681
- routes.splice(filesystemIndex, 0, ...headerRoutes, ...rewriteRoutes);
682
- const notFoundRoutes = [
683
- ...notFound.markdown ? NOT_FOUND_MARKDOWN_ROUTES : [],
684
- ...notFound.json ? NOT_FOUND_JSON_ROUTES : []
685
- ];
686
- if (notFoundRoutes.length > 0) {
687
- const fallbackIndex = routes.findIndex((route) => route.status === 404 && route.dest === NOT_FOUND_HTML_DEST);
688
- if (fallbackIndex !== -1) {
689
- routes.splice(fallbackIndex, 0, ...notFoundRoutes);
690
- }
691
- }
692
- config.routes = routes;
693
- return `${JSON.stringify(config, null, "\t")}
694
- `;
695
- };
696
-
697
- // src/cli/commands/build.ts
698
- var ADAPTERS = ["vercel", "node", "netlify", "cloudflare"];
699
- var isAdapter = (value) => ADAPTERS.some((adapter) => adapter === value);
700
- var BUDGET_JS = "budget-js";
701
- var BUDGET_CSS = "budget-css";
702
- var validateBudgetFlags = (args) => {
703
- for (const flag of [BUDGET_JS, BUDGET_CSS]) {
704
- const value = args[flag];
705
- const parsed = Number(value);
706
- if (value !== undefined && (Number.isNaN(parsed) || parsed <= 0)) {
707
- logger.error(`Invalid --${flag} "${value}" (expected a positive number of kB).`);
708
- process.exit(1);
709
- }
710
- }
711
- };
712
- var emitVercelNegotiation = async (project, routePaths, root) => {
713
- const { config } = project;
714
- const configPath = join2(root, ".vercel", "output", "config.json");
715
- if (!existsSync2(configPath)) {
716
- return;
717
- }
718
- const overrides = {};
719
- if (hasApiCatalog(config)) {
720
- overrides[API_CATALOG_PATH.slice(1)] = API_CATALOG_TYPE;
721
- }
722
- if (config.ai.webBotAuth.keys.length > 0) {
723
- overrides[SIGNATURES_DIRECTORY_PATH.slice(1)] = SIGNATURES_DIRECTORY_TYPE;
724
- }
725
- const rawMarkdown = await buildRawMarkdown(project);
726
- const home = rawMarkdown["/"];
727
- const staticDir = join2(root, ".vercel", "output", "static");
728
- const injected = injectNegotiationRoutes(await readFile2(configPath, "utf-8"), routePaths, buildHomeLinkHeader(config, routePaths), overrides, home ? markdownTokenCount(agentMarkdown(home)) : undefined, {
729
- json: existsSync2(join2(staticDir, "404.json")),
730
- markdown: existsSync2(join2(staticDir, "404.md"))
731
- }, crossOriginDiscoveryPaths(config));
732
- if (injected === null) {
733
- logger.warn("Could not wire Accept: text/markdown negotiation into .vercel/output/config.json — raw Markdown stays available at the .md URLs.");
734
- return;
735
- }
736
- await writeFile(configPath, injected, "utf-8");
737
- logger.success("Wired Accept: text/markdown negotiation into the Vercel routing config");
738
- };
739
- var checkVercelFunctionBundles = async (outputDir, root) => {
740
- const audits = await auditVercelFunctions(outputDir);
741
- if (audits.length === 0) {
742
- return;
743
- }
744
- const own = blumeDependencyNames();
745
- let fatal = false;
746
- for (const audit of audits) {
747
- const verdict = functionBundleVerdict(audit, root, own);
748
- if (verdict.fatal) {
749
- fatal = true;
750
- logger.error(verdict.message);
751
- } else {
752
- logger.warn(verdict.message);
753
- }
754
- }
755
- if (fatal) {
756
- process.exit(1);
757
- }
758
- };
759
- var warnCloudflareNegotiationSkipped = () => logger.warn("Could not wire Accept: text/markdown negotiation into dist/server/wrangler.json — raw Markdown stays available at the .md URLs.");
760
- var emitCloudflareNegotiation = async (project, routePaths) => {
761
- const { config, context } = project;
762
- const serverDir = join2(context.distDir ?? join2(context.root, "dist"), "server");
763
- const wranglerPath = join2(serverDir, "wrangler.json");
764
- if (!existsSync2(wranglerPath)) {
765
- warnCloudflareNegotiationSkipped();
766
- return;
767
- }
768
- const rawMarkdown = await buildRawMarkdown(project);
769
- const home = rawMarkdown["/"];
770
- const injected = injectWorkerNegotiation(await readFile2(wranglerPath, "utf-8"), {
771
- base: config.deployment.base,
772
- contentRoutePaths: project.manifest.routes.map((route) => route.path),
773
- homeLinkHeader: buildHomeLinkHeader(config, routePaths),
774
- homeTokens: home ? markdownTokenCount(agentMarkdown(home)) : undefined,
775
- pageJsonPaths: config.ai.api ? project.manifest.routes.filter((route) => !route.hidden && rawMarkdown[route.path] !== undefined).map((route) => pageJsonPath(route.path)) : [],
776
- redirects: platformRedirects(config),
777
- routePaths
778
- });
779
- if (injected === null) {
780
- warnCloudflareNegotiationSkipped();
781
- return;
782
- }
783
- await writeFile(join2(serverDir, NEGOTIATION_WORKER_FILE), injected.worker, "utf-8");
784
- await writeFile(wranglerPath, injected.wrangler, "utf-8");
785
- logger.success("Wired Accept: text/markdown negotiation into the Cloudflare Worker");
786
- };
787
- var reportCardCache = async (project, prune) => {
788
- const cards = cardCacheTally();
789
- if (!cards) {
790
- return;
791
- }
792
- logger.info(`OG cards: ${cards.hits} reused from the cache, ${cards.misses} rendered`);
793
- if (prune) {
794
- await pruneCardCache(ogCacheDir(project.context));
795
- }
796
- };
797
- var formatBytes = (bytes) => {
798
- if (bytes < 1024) {
799
- return `${bytes} B`;
800
- }
801
- const digits = bytes < 1024 * 100 ? 1 : 0;
802
- return `${(bytes / 1024).toFixed(digits)} kB`;
803
- };
804
- var astroAssets = async (distDir, ext) => {
805
- const astroDir = join2(distDir, "_astro");
806
- if (!existsSync2(astroDir)) {
807
- return [];
808
- }
809
- const entries = await readdir2(astroDir);
810
- const files = entries.filter((name) => name.endsWith(`.${ext}`));
811
- const sized = await Promise.all(files.map(async (name) => {
812
- const info = await stat(join2(astroDir, name));
813
- return { name, size: info.size };
814
- }));
815
- return sized.toSorted((a, b) => b.size - a.size);
816
- };
817
- var totalSize = (assets) => assets.reduce((sum, asset) => sum + asset.size, 0);
818
- var reportBundleSizes = async (distDir) => {
819
- const sized = await astroAssets(distDir, "js");
820
- if (sized.length === 0) {
821
- logger.info("No client JavaScript emitted — the site ships zero JS.");
822
- return;
823
- }
824
- const rows = sized.slice(0, 15).map((file) => ` ${formatBytes(file.size).padStart(8)} ${file.name}`);
825
- logger.box([
826
- `Client JavaScript — ${sized.length} file(s), ${formatBytes(totalSize(sized))} total`,
827
- "",
828
- ...rows,
829
- sized.length > 15 ? ` … and ${sized.length - 15} more` : null
830
- ].filter((line) => line !== null).join(`
831
- `));
832
- };
833
- var enforceBudget = async (distDir, args) => {
834
- const checks = [
835
- ...args[BUDGET_JS] ? [{ ext: "js", limitKb: Number(args[BUDGET_JS]), name: "JavaScript" }] : [],
836
- ...args[BUDGET_CSS] ? [{ ext: "css", limitKb: Number(args[BUDGET_CSS]), name: "CSS" }] : []
837
- ];
838
- if (checks.length === 0) {
839
- return "skip";
840
- }
841
- let passed = true;
842
- for (const check of checks) {
843
- const total = totalSize(await astroAssets(distDir, check.ext));
844
- const limit = check.limitKb * 1024;
845
- if (total > limit) {
846
- passed = false;
847
- logger.error(`${check.name} budget exceeded: ${formatBytes(total)} > ${check.limitKb} kB`);
848
- } else {
849
- logger.success(`${check.name} budget: ${formatBytes(total)} / ${check.limitKb} kB`);
850
- }
851
- }
852
- return passed ? "pass" : "fail";
853
- };
854
- var runClientAssetChecks = async (staticDir, args) => {
855
- if (args.analyze) {
856
- await reportBundleSizes(staticDir);
857
- }
858
- if (await enforceBudget(staticDir, args) === "fail") {
859
- process.exit(1);
860
- }
861
- };
862
- var isolatedOutputDir = (config, context) => {
863
- const { adapter, output } = config.deployment;
864
- if (output === "server" && adapter === "vercel") {
865
- return join2(context.outDir, ".vercel", "output");
866
- }
867
- return context.distDir ?? join2(context.outDir, "dist");
868
- };
869
- var isolatedStaticDir = (config, context) => {
870
- const { adapter, output } = config.deployment;
871
- const outputDir = isolatedOutputDir(config, context);
872
- if (output === "server" && adapter === "vercel") {
873
- return join2(outputDir, "static");
874
- }
875
- if (servesClientSubdir(config.deployment)) {
876
- return join2(outputDir, "client");
877
- }
878
- return outputDir;
879
- };
880
- var reportBuild = async (project, distDir, args) => {
881
- const { config } = project;
882
- const features = serverFeatures(config);
883
- const sitemapNote = config.seo.sitemap ? "no (set deployment.site)" : "no (seo.sitemap is false)";
884
- logger.box([
885
- `Output ${config.deployment.output}`,
886
- `Adapter ${config.deployment.adapter ?? "none"}`,
887
- `Site ${config.deployment.site ?? "not set"}`,
888
- `Search ${config.search.provider}`,
889
- `Redirects ${config.redirects.length}`,
890
- `Sitemap ${config.deployment.site && config.seo.sitemap ? "yes" : sitemapNote}`,
891
- `Robots ${config.seo.robots ? "yes" : "no"}`,
892
- `Agent JSON ${config.seo.agentReadability ? "yes" : "no"}`,
893
- `LLM files ${config.ai.llmsTxt.enabled ? "yes" : "no"}`,
894
- `Server features ${features.length > 0 ? features.join(", ") : "none"}`
895
- ].join(`
896
- `));
897
- await runClientAssetChecks(distDir, args);
898
- if (project.droppedPages > 0) {
899
- logger.warn(`${project.droppedPages} page(s) failed frontmatter validation and are missing from this build.`);
900
- }
901
- logger.success(`Built to ${distDir}`);
902
- };
903
- var buildCommand = defineCommand({
904
- args: {
905
- adapter: {
906
- description: "Server adapter: vercel | node | netlify | cloudflare.",
907
- type: "string"
908
- },
909
- analyze: {
910
- description: "Report client JavaScript bundle sizes after the build.",
911
- type: "boolean"
912
- },
913
- base: {
914
- description: "Base path the site is served under (e.g. /docs).",
915
- type: "string"
916
- },
917
- [BUDGET_CSS]: {
918
- description: "Fail if total client CSS exceeds this many kB.",
919
- type: "string"
920
- },
921
- [BUDGET_JS]: {
922
- description: "Fail if total client JavaScript exceeds this many kB.",
923
- type: "string"
924
- },
925
- isolated: {
926
- description: "Build into an isolated .blume-verify runtime (and its own dist) so a running dev server and the real dist/ are untouched. For verifying changes while `blume dev` runs.",
927
- type: "boolean"
928
- },
929
- output: {
930
- description: "Output mode: static | server.",
931
- type: "string"
932
- },
933
- preview: {
934
- description: "Include drafts and unpublished CMS content.",
935
- type: "boolean"
936
- },
937
- strict: {
938
- default: true,
939
- description: "Fail on error diagnostics (default; pass --no-strict to build anyway, dropping pages that fail validation).",
940
- type: "boolean"
941
- }
942
- },
943
- meta: commandMeta.build,
944
- async run({ args }) {
945
- const root = process.cwd();
946
- const runtimeDir = args.isolated ? ".blume-verify" : process.env.BLUME_RUNTIME_DIR;
947
- refuseIfDevRunning(root, "building", { isolatedHint: true, runtimeDir });
948
- if (args.isolated) {
949
- await ensureGitignore(root, [".blume-verify/"]);
950
- }
951
- if (args.output && args.output !== "static" && args.output !== "server") {
952
- logger.error(`Invalid --output "${args.output}" (use static | server).`);
953
- process.exit(1);
954
- }
955
- if (args.adapter && !isAdapter(args.adapter)) {
956
- logger.error(`Invalid --adapter "${args.adapter}" (use ${ADAPTERS.join(" | ")}).`);
957
- process.exit(1);
958
- }
959
- validateBudgetFlags(args);
960
- const project = await prepareProject({
961
- mode: "build",
962
- overrides: {
963
- adapter: args.adapter,
964
- base: args.base,
965
- output: args.output
966
- },
967
- preview: args.preview,
968
- root,
969
- runtimeDir,
970
- strict: args.strict
971
- });
972
- logger.start(`Building ${project.graph.pages.length} page(s) (${project.config.deployment.output} output)`);
973
- if (!runtimeDir) {
974
- publishBuildProject(project);
975
- }
976
- await build({
977
- logLevel: "info",
978
- root: project.context.outDir
979
- });
980
- await reportCardCache(project, !runtimeDir);
981
- if (runtimeDir) {
982
- if (project.config.deployment.output === "server" && project.config.deployment.adapter === "vercel") {
983
- await checkVercelFunctionBundles(isolatedOutputDir(project.config, project.context), root);
984
- }
985
- await runClientAssetChecks(isolatedStaticDir(project.config, project.context), args);
986
- logger.success(`Isolated build OK — output at ${isolatedOutputDir(project.config, project.context)} (not published).`);
987
- return;
988
- }
989
- const { adapter } = project.config.deployment;
990
- const ignoreDir = adapter ? ADAPTER_IGNORE_DIRS[adapter] : undefined;
991
- if (project.config.deployment.output === "server" && ignoreDir) {
992
- await ensureGitignore(root, [ignoreDir]);
993
- }
994
- const surfaced = await surfaceAdapterOutput(project.config, project.context);
995
- if (surfaced.moved) {
996
- logger.success(`Surfaced ${adapter} output to ${surfaced.to}`);
997
- }
998
- if (project.config.deployment.output === "server" && adapter === "vercel") {
999
- await checkVercelFunctionBundles(join2(root, ".vercel", "output"), root);
1000
- await emitVercelNegotiation(project, markdownRoutePaths(project), root);
1001
- }
1002
- if (project.config.deployment.output === "server" && adapter === "cloudflare") {
1003
- await emitCloudflareNegotiation(project, markdownRoutePaths(project));
1004
- }
1005
- await reportBuild(project, deployStaticDir(project.config, project.context), args);
1006
- }
1007
- });
1008
- export {
1009
- buildCommand,
1010
- isolatedOutputDir,
1011
- isolatedStaticDir,
1012
- runClientAssetChecks
1013
- };
1014
-
1015
- //# debugId=2FD9E13EC3A6144764756E2164756E21
1016
- //# sourceMappingURL=chunk-ex56aa81.js.map