blume 1.7.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +227 -0
  3. package/README.md +34 -21
  4. package/dist/cli/chunk-11j0384y.js +148 -0
  5. package/dist/cli/chunk-11j0384y.js.map +10 -0
  6. package/dist/cli/{chunk-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
  7. package/dist/cli/{chunk-xhtpx3ff.js.map → chunk-1w8dp3qb.js.map} +3 -3
  8. package/dist/cli/chunk-2q1dwty4.js +75 -0
  9. package/dist/cli/chunk-2q1dwty4.js.map +11 -0
  10. package/dist/cli/chunk-41za066z.js +122 -0
  11. package/dist/cli/chunk-41za066z.js.map +11 -0
  12. package/dist/cli/chunk-5a2z0198.js +133 -0
  13. package/dist/cli/chunk-5a2z0198.js.map +10 -0
  14. package/dist/cli/{chunk-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
  15. package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
  16. package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
  17. package/dist/cli/chunk-79njf86q.js.map +11 -0
  18. package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
  19. package/dist/cli/{chunk-688e0dde.js → chunk-88cpgt6h.js} +1 -1
  20. package/dist/cli/chunk-a9kptbw5.js +361 -0
  21. package/dist/cli/chunk-a9kptbw5.js.map +14 -0
  22. package/dist/cli/chunk-abh8yjkn.js +31 -0
  23. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  24. package/dist/cli/chunk-b5aj94ah.js +91 -0
  25. package/dist/cli/chunk-b5aj94ah.js.map +10 -0
  26. package/dist/cli/{chunk-hs3gbh8p.js → chunk-bctazmbk.js} +9 -5
  27. package/dist/cli/chunk-bctazmbk.js.map +10 -0
  28. package/dist/cli/chunk-beat36xx.js +279 -0
  29. package/dist/cli/chunk-beat36xx.js.map +10 -0
  30. package/dist/cli/chunk-bnbmcwfb.js +145 -0
  31. package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
  32. package/dist/cli/{chunk-9bkjd11x.js → chunk-bw22s759.js} +15 -5
  33. package/dist/cli/{chunk-9bkjd11x.js.map → chunk-bw22s759.js.map} +4 -4
  34. package/dist/cli/chunk-by2290sx.js +39 -0
  35. package/dist/cli/chunk-by2290sx.js.map +10 -0
  36. package/dist/cli/chunk-d1tadaw7.js +79 -0
  37. package/dist/cli/chunk-d1tadaw7.js.map +10 -0
  38. package/dist/cli/{chunk-t3tj0dgr.js → chunk-d80hr03s.js} +24 -19
  39. package/dist/cli/chunk-d80hr03s.js.map +15 -0
  40. package/dist/cli/chunk-ernrthtr.js +97 -0
  41. package/dist/cli/chunk-ernrthtr.js.map +10 -0
  42. package/dist/cli/chunk-f2972sbt.js +374 -0
  43. package/dist/cli/chunk-f2972sbt.js.map +10 -0
  44. package/dist/cli/{chunk-exeeb35e.js → chunk-f7t03s3g.js} +2 -2
  45. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  46. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  47. package/dist/cli/{chunk-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
  48. package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
  49. package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
  50. package/dist/cli/chunk-j8mw0za6.js.map +35 -0
  51. package/dist/cli/chunk-jts8mvcz.js +106 -0
  52. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  53. package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
  54. package/dist/cli/chunk-mnqj32sj.js.map +12 -0
  55. package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
  56. package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
  57. package/dist/cli/chunk-nk3ts2xk.js +51 -0
  58. package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
  59. package/dist/cli/{chunk-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
  60. package/dist/cli/{chunk-n9sra6sy.js.map → chunk-pat2zzwc.js.map} +2 -2
  61. package/dist/cli/chunk-pnnvybbk.js +176 -0
  62. package/dist/cli/chunk-pnnvybbk.js.map +11 -0
  63. package/dist/cli/{chunk-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
  64. package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
  65. package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
  66. package/dist/cli/{chunk-eevwt1sc.js.map → chunk-tzne8qfq.js.map} +1 -1
  67. package/dist/cli/chunk-xaz13gwg.js +12449 -0
  68. package/dist/cli/chunk-xaz13gwg.js.map +182 -0
  69. package/dist/cli/chunk-y3e45rc8.js +102 -0
  70. package/dist/cli/chunk-y3e45rc8.js.map +10 -0
  71. package/dist/cli/chunk-z01ze5c1.js +261 -0
  72. package/dist/cli/chunk-z01ze5c1.js.map +10 -0
  73. package/dist/cli/{chunk-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
  74. package/dist/cli/chunk-z1f5arsg.js.map +36 -0
  75. package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
  76. package/dist/cli/chunk-zg2gtj10.js.map +35 -0
  77. package/dist/cli/{chunk-ppfvdcd4.js → chunk-zxccj738.js} +1 -1
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask.d.ts +368 -0
  85. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  86. package/dist/types/ai/component-markdown.d.ts +2 -2
  87. package/dist/types/ai/index.d.ts +24 -0
  88. package/dist/types/ai/link-headers.d.ts +24 -0
  89. package/dist/types/ai/llms.d.ts +25 -0
  90. package/dist/types/ai/markdown.d.ts +45 -0
  91. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  92. package/dist/types/ai/mcp/tools.d.ts +16 -0
  93. package/dist/types/ai/openapi-components.d.ts +43 -0
  94. package/dist/types/ai/relative-links.d.ts +26 -0
  95. package/dist/types/ai/serializers.d.ts +15 -0
  96. package/dist/types/ai/skills.d.ts +42 -0
  97. package/dist/types/ai/tar.d.ts +25 -0
  98. package/dist/types/ai/visibility.d.ts +17 -0
  99. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  100. package/dist/types/analytics/adobe.d.ts +35 -0
  101. package/dist/types/analytics/amplitude.d.ts +50 -0
  102. package/dist/types/analytics/clarity.d.ts +31 -0
  103. package/dist/types/analytics/clearbit.d.ts +29 -0
  104. package/dist/types/analytics/cloudflare.d.ts +41 -0
  105. package/dist/types/analytics/fathom.d.ts +41 -0
  106. package/dist/types/analytics/google-analytics.d.ts +44 -0
  107. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  108. package/dist/types/analytics/head.d.ts +30 -0
  109. package/dist/types/analytics/heap.d.ts +40 -0
  110. package/dist/types/analytics/hightouch.d.ts +44 -0
  111. package/dist/types/analytics/hotjar.d.ts +33 -0
  112. package/dist/types/analytics/index.d.ts +61 -0
  113. package/dist/types/analytics/inline.d.ts +17 -0
  114. package/dist/types/analytics/logrocket.d.ts +44 -0
  115. package/dist/types/analytics/mixpanel.d.ts +67 -0
  116. package/dist/types/analytics/pirsch.d.ts +42 -0
  117. package/dist/types/analytics/plausible.d.ts +56 -0
  118. package/dist/types/analytics/posthog.d.ts +45 -0
  119. package/dist/types/analytics/schema.d.ts +320 -0
  120. package/dist/types/analytics/script.d.ts +46 -0
  121. package/dist/types/analytics/segment.d.ts +50 -0
  122. package/dist/types/analytics/vercel.d.ts +48 -0
  123. package/dist/types/astro/integration.d.ts +76 -0
  124. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  125. package/dist/types/astro/module-types.d.ts +14 -0
  126. package/dist/types/astro/pages.d.ts +44 -0
  127. package/dist/types/cli/env.d.ts +12 -0
  128. package/dist/types/cli/init/scaffold.d.ts +154 -0
  129. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  130. package/dist/types/core/adapter.d.ts +47 -0
  131. package/dist/types/core/api-name.d.ts +7 -0
  132. package/dist/types/core/changelog-index.d.ts +13 -0
  133. package/dist/types/core/config-input.d.ts +209 -505
  134. package/dist/types/core/config.d.ts +60 -34
  135. package/dist/types/core/content-assets.d.ts +76 -0
  136. package/dist/types/core/custom-pages.d.ts +33 -0
  137. package/dist/types/core/data.d.ts +28 -11
  138. package/dist/types/core/define-components.d.ts +12 -9
  139. package/dist/types/core/deployment-env.d.ts +6 -11
  140. package/dist/types/core/frontmatter.d.ts +10 -0
  141. package/dist/types/core/graph.d.ts +18 -0
  142. package/dist/types/core/heading-markers.d.ts +54 -0
  143. package/dist/types/core/i18n-ui.d.ts +6 -2
  144. package/dist/types/core/i18n.d.ts +87 -0
  145. package/dist/types/core/includes.d.ts +138 -0
  146. package/dist/types/core/last-modified.d.ts +47 -0
  147. package/dist/types/core/links.d.ts +95 -0
  148. package/dist/types/core/locale-links.d.ts +60 -0
  149. package/dist/types/core/manifest.d.ts +17 -0
  150. package/dist/types/core/meta.d.ts +38 -0
  151. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  152. package/dist/types/core/navigation.d.ts +6 -0
  153. package/dist/types/core/node-require.d.ts +19 -0
  154. package/dist/types/core/package-json.d.ts +13 -0
  155. package/dist/types/core/probe.d.ts +42 -0
  156. package/dist/types/core/project-graph.d.ts +51 -0
  157. package/dist/types/core/project.d.ts +2 -0
  158. package/dist/types/core/safe-href.d.ts +2 -0
  159. package/dist/types/core/safe-links.d.ts +26 -0
  160. package/dist/types/core/schema.d.ts +2291 -441
  161. package/dist/types/core/site-url.d.ts +16 -0
  162. package/dist/types/core/sources/assets.d.ts +36 -0
  163. package/dist/types/core/sources/cache.d.ts +37 -0
  164. package/dist/types/core/sources/collection.d.ts +28 -0
  165. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  166. package/dist/types/core/sources/contentful.d.ts +40 -0
  167. package/dist/types/core/sources/filesystem.d.ts +24 -0
  168. package/dist/types/core/sources/github-releases.d.ts +31 -0
  169. package/dist/types/core/sources/json.d.ts +30 -0
  170. package/dist/types/core/sources/lexical.d.ts +19 -0
  171. package/dist/types/core/sources/lower.d.ts +75 -0
  172. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  173. package/dist/types/core/sources/normalize.d.ts +147 -0
  174. package/dist/types/core/sources/notion.d.ts +131 -0
  175. package/dist/types/core/sources/obsidian.d.ts +46 -0
  176. package/dist/types/core/sources/payload.d.ts +39 -0
  177. package/dist/types/core/sources/portable-text.d.ts +42 -0
  178. package/dist/types/core/sources/read.d.ts +23 -0
  179. package/dist/types/core/sources/remote.d.ts +74 -0
  180. package/dist/types/core/sources/resolve.d.ts +19 -0
  181. package/dist/types/core/sources/sanity.d.ts +43 -0
  182. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  183. package/dist/types/core/sources/strapi.d.ts +33 -0
  184. package/dist/types/core/sources/types.d.ts +7 -0
  185. package/dist/types/core/sources/watch.d.ts +45 -0
  186. package/dist/types/core/text-width.d.ts +11 -0
  187. package/dist/types/core/types.d.ts +20 -1
  188. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  189. package/dist/types/core/versions.d.ts +72 -0
  190. package/dist/types/core/yaml.d.ts +9 -0
  191. package/dist/types/deploy/adapter-output.d.ts +45 -0
  192. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  193. package/dist/types/deploy/adapters/index.d.ts +29 -0
  194. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  195. package/dist/types/deploy/adapters/node.d.ts +37 -0
  196. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  197. package/dist/types/deploy/adapters/types.d.ts +71 -0
  198. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  199. package/dist/types/deploy/artifacts.d.ts +65 -0
  200. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  201. package/dist/types/deploy/function-bundle.d.ts +80 -0
  202. package/dist/types/deploy/headers.d.ts +50 -0
  203. package/dist/types/deploy/node-headers.d.ts +42 -0
  204. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  205. package/dist/types/deploy/platforms/index.d.ts +18 -0
  206. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  207. package/dist/types/deploy/platforms/node.d.ts +11 -0
  208. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  209. package/dist/types/deploy/platforms/static.d.ts +10 -0
  210. package/dist/types/deploy/platforms/types.d.ts +104 -0
  211. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  212. package/dist/types/deploy/redirects.d.ts +53 -0
  213. package/dist/types/deploy/robots.d.ts +8 -0
  214. package/dist/types/deploy/rss.d.ts +31 -0
  215. package/dist/types/deploy/sitemap.d.ts +21 -0
  216. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  217. package/dist/types/markdown/code-title.d.ts +32 -0
  218. package/dist/types/markdown/fence-meta.d.ts +23 -0
  219. package/dist/types/markdown/themes.d.ts +3 -3
  220. package/dist/types/openapi/asyncapi.d.ts +129 -0
  221. package/dist/types/openapi/graphql-build.d.ts +8 -0
  222. package/dist/types/openapi/graphql.d.ts +122 -0
  223. package/dist/types/openapi/model.d.ts +158 -0
  224. package/dist/types/openapi/parse.d.ts +57 -0
  225. package/dist/types/openapi/references.d.ts +37 -25
  226. package/dist/types/openapi/render-mdx.d.ts +33 -0
  227. package/dist/types/openapi/sentence.d.ts +7 -0
  228. package/dist/types/openapi/signature.d.ts +10 -0
  229. package/dist/types/openapi/source.d.ts +22 -0
  230. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  231. package/dist/types/reference/asyncapi.d.ts +166 -0
  232. package/dist/types/reference/graphql.d.ts +181 -0
  233. package/dist/types/reference/index.d.ts +32 -0
  234. package/dist/types/reference/openapi.d.ts +165 -0
  235. package/dist/types/reference/options.d.ts +157 -0
  236. package/dist/types/reference/scalar.d.ts +136 -0
  237. package/dist/types/reference/schema.d.ts +630 -0
  238. package/dist/types/search/adapters/algolia.d.ts +32 -0
  239. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  240. package/dist/types/search/adapters/index.d.ts +31 -0
  241. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  242. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  243. package/dist/types/search/adapters/orama.d.ts +13 -0
  244. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  245. package/dist/types/search/adapters/registry.d.ts +228 -0
  246. package/dist/types/search/adapters/types.d.ts +34 -0
  247. package/dist/types/search/adapters/typesense.d.ts +42 -0
  248. package/dist/types/search/build.d.ts +23 -0
  249. package/dist/types/search/documents.d.ts +90 -0
  250. package/dist/types/search/facets.d.ts +3 -0
  251. package/dist/types/search/sync/algolia.d.ts +14 -0
  252. package/dist/types/search/sync/index.d.ts +14 -0
  253. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  254. package/dist/types/search/sync/typesense.d.ts +14 -0
  255. package/dist/types/sources/contentful.d.ts +68 -0
  256. package/dist/types/sources/custom.d.ts +20 -0
  257. package/dist/types/sources/filesystem.d.ts +42 -0
  258. package/dist/types/sources/github-releases.d.ts +46 -0
  259. package/dist/types/sources/index.d.ts +48 -0
  260. package/dist/types/sources/mdx-remote.d.ts +63 -0
  261. package/dist/types/sources/notion.d.ts +65 -0
  262. package/dist/types/sources/obsidian.d.ts +34 -0
  263. package/dist/types/sources/payload.d.ts +68 -0
  264. package/dist/types/sources/registry.d.ts +1414 -0
  265. package/dist/types/sources/sanity.d.ts +69 -0
  266. package/dist/types/sources/shared.d.ts +46 -0
  267. package/dist/types/sources/strapi.d.ts +66 -0
  268. package/dist/types/theme/icon-kind.d.ts +11 -0
  269. package/dist/types/theme/icons.d.ts +20 -0
  270. package/docs/01-quickstart.mdx +18 -18
  271. package/docs/02-deployment.mdx +50 -26
  272. package/docs/03-upgrading.mdx +351 -0
  273. package/docs/04-migrating.mdx +58 -0
  274. package/docs/08-faq.mdx +3 -3
  275. package/docs/advanced/blog.mdx +13 -6
  276. package/docs/advanced/changelog.mdx +23 -35
  277. package/docs/advanced/custom-pages.mdx +20 -8
  278. package/docs/advanced/meta.ts +1 -8
  279. package/docs/advanced/skills.mdx +8 -0
  280. package/docs/cli/audit.mdx +646 -0
  281. package/docs/cli/doctor.mdx +29 -0
  282. package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
  283. package/docs/cli/index.mdx +105 -0
  284. package/docs/cli/meta.ts +7 -0
  285. package/docs/{reference → cli}/translate.mdx +1 -1
  286. package/docs/cli/validate.mdx +41 -0
  287. package/docs/cli/version.mdx +40 -0
  288. package/docs/configuration/analytics.mdx +350 -59
  289. package/docs/configuration/ask-ai.mdx +176 -61
  290. package/docs/configuration/customization.mdx +15 -9
  291. package/docs/configuration/index.mdx +52 -31
  292. package/docs/configuration/search.mdx +75 -54
  293. package/docs/configuration/theming.mdx +24 -15
  294. package/docs/content/components.mdx +21 -5
  295. package/docs/{reference → content}/frontmatter.mdx +37 -1
  296. package/docs/content/i18n.mdx +8 -6
  297. package/docs/content/includes.mdx +2 -4
  298. package/docs/content/index.mdx +1 -1
  299. package/docs/content/islands.mdx +10 -5
  300. package/docs/content/meta.mdx +1 -1
  301. package/docs/content/meta.ts +1 -0
  302. package/docs/content/navigation.mdx +12 -7
  303. package/docs/content/sources.mdx +145 -50
  304. package/docs/content/syntax.mdx +26 -12
  305. package/docs/content/versioning.mdx +3 -3
  306. package/docs/discoverability/agent-discovery.mdx +91 -10
  307. package/docs/discoverability/index.mdx +5 -5
  308. package/docs/discoverability/json-api.mdx +4 -4
  309. package/docs/discoverability/llms-txt.mdx +6 -6
  310. package/docs/discoverability/markdown.mdx +4 -4
  311. package/docs/discoverability/mcp.mdx +11 -11
  312. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  313. package/docs/index.mdx +2 -2
  314. package/docs/references/asyncapi.mdx +59 -0
  315. package/docs/{advanced → references}/graphql.mdx +45 -32
  316. package/docs/{reference → references}/meta.ts +2 -2
  317. package/docs/references/openapi.mdx +171 -0
  318. package/docs/references/scalar.mdx +64 -0
  319. package/package.json +42 -8
  320. package/skills/blume/SKILL.md +21 -8
  321. package/skills/blume-migrate/SKILL.md +22 -21
  322. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  323. package/skills/blume-migrate/references/docusaurus.md +5 -4
  324. package/skills/blume-migrate/references/fumadocs.md +4 -4
  325. package/skills/blume-migrate/references/mintlify.md +23 -8
  326. package/skills/blume-migrate/references/monorepo.md +6 -6
  327. package/skills/blume-migrate/references/starlight.md +4 -4
  328. package/src/ai/agent-readability.ts +26 -22
  329. package/src/ai/ai-catalog.ts +259 -0
  330. package/src/ai/api/handlers.ts +46 -11
  331. package/src/ai/api-catalog.ts +8 -8
  332. package/src/ai/ask-data.ts +1 -1
  333. package/src/ai/ask.ts +624 -100
  334. package/src/ai/changelog-markdown.ts +91 -0
  335. package/src/ai/component-markdown.ts +328 -12
  336. package/src/ai/index.ts +45 -0
  337. package/src/ai/link-headers.ts +19 -6
  338. package/src/ai/llms.ts +26 -15
  339. package/src/ai/markdown.ts +35 -5
  340. package/src/ai/mcp/data.ts +9 -5
  341. package/src/ai/mcp/discovery.ts +1 -1
  342. package/src/ai/openapi-components.ts +4 -1
  343. package/src/ai/relative-links.ts +170 -0
  344. package/src/ai/serializers.ts +2 -2
  345. package/src/ai/skills.ts +1 -1
  346. package/src/ai/web-bot-auth.ts +2 -2
  347. package/src/analytics/adobe.ts +46 -0
  348. package/src/analytics/amplitude.ts +79 -0
  349. package/src/analytics/clarity.ts +46 -0
  350. package/src/analytics/clearbit.ts +47 -0
  351. package/src/analytics/cloudflare.ts +67 -0
  352. package/src/analytics/fathom.ts +64 -0
  353. package/src/analytics/google-analytics.ts +84 -0
  354. package/src/analytics/google-tag-manager.ts +61 -0
  355. package/src/analytics/head.ts +130 -0
  356. package/src/analytics/heap.ts +65 -0
  357. package/src/analytics/hightouch.ts +77 -0
  358. package/src/analytics/hotjar.ts +47 -0
  359. package/src/analytics/index.ts +71 -0
  360. package/src/analytics/inline.ts +21 -0
  361. package/src/analytics/logrocket.ts +71 -0
  362. package/src/analytics/mixpanel.ts +92 -0
  363. package/src/analytics/pirsch.ts +66 -0
  364. package/src/analytics/plausible.ts +83 -0
  365. package/src/analytics/posthog.ts +78 -0
  366. package/src/analytics/schema.ts +60 -0
  367. package/src/analytics/script.ts +60 -0
  368. package/src/analytics/segment.ts +85 -0
  369. package/src/analytics/vercel.ts +50 -0
  370. package/src/astro/adapter-root.ts +7 -9
  371. package/src/astro/component-slots.ts +131 -91
  372. package/src/astro/generate.ts +114 -345
  373. package/src/astro/integration.ts +2 -6
  374. package/src/astro/pages.ts +13 -101
  375. package/src/astro/render-deps.ts +379 -0
  376. package/src/astro/runtime-deps.ts +201 -0
  377. package/src/astro/templates.ts +554 -541
  378. package/src/audit/agent.ts +24 -0
  379. package/src/audit/catalog.ts +2 -2
  380. package/src/audit/checks/assets.ts +2 -2
  381. package/src/audit/checks/dns-aid.ts +1 -1
  382. package/src/audit/checks/duplicates.ts +3 -1
  383. package/src/audit/checks/i18n.ts +1 -1
  384. package/src/audit/checks/indexability.ts +7 -7
  385. package/src/audit/checks/links.ts +2 -2
  386. package/src/audit/checks/llms.ts +6 -6
  387. package/src/audit/checks/network.ts +3 -3
  388. package/src/audit/checks/og-image.ts +2 -2
  389. package/src/audit/checks/robots.ts +1 -1
  390. package/src/audit/checks/sitemap.ts +2 -2
  391. package/src/audit/checks/social.ts +1 -1
  392. package/src/audit/run.ts +4 -3
  393. package/src/audit/terms.ts +31 -0
  394. package/src/audit/url.ts +13 -13
  395. package/src/cli/command-meta.ts +10 -0
  396. package/src/cli/commands/audit.ts +39 -20
  397. package/src/cli/commands/build.ts +71 -314
  398. package/src/cli/commands/check.ts +1 -0
  399. package/src/cli/commands/dev.ts +40 -1
  400. package/src/cli/commands/doctor.ts +90 -14
  401. package/src/cli/commands/eject.ts +44 -7
  402. package/src/cli/commands/eval.ts +2 -2
  403. package/src/cli/commands/init.ts +161 -41
  404. package/src/cli/commands/migrate.ts +121 -0
  405. package/src/cli/commands/preview.ts +7 -1
  406. package/src/cli/commands/translate.ts +2 -2
  407. package/src/cli/commands/upgrade.ts +141 -0
  408. package/src/cli/commands/version.ts +57 -44
  409. package/src/cli/eject-scripts.ts +121 -6
  410. package/src/cli/index.ts +11 -1
  411. package/src/cli/init/install.ts +70 -0
  412. package/src/cli/init/questions.ts +7 -0
  413. package/src/cli/init/scaffold.ts +459 -75
  414. package/src/cli/lazy-command.ts +37 -1
  415. package/src/cli/prepare.ts +40 -6
  416. package/src/cli/required-secrets.ts +38 -11
  417. package/src/cli/unknown-flags.ts +266 -0
  418. package/src/cli/yarn-pnp.ts +52 -0
  419. package/src/components/content/AccordionItem.astro +7 -1
  420. package/src/components/content/Card.astro +4 -3
  421. package/src/components/content/ColorItem.astro +22 -4
  422. package/src/components/content/GithubInfo.astro +2 -2
  423. package/src/components/content/Prompt.astro +25 -25
  424. package/src/components/content/Tabs.astro +3 -1
  425. package/src/components/content/Tile.astro +2 -3
  426. package/src/components/content/Tooltip.astro +57 -9
  427. package/src/components/content/content-strings.ts +34 -0
  428. package/src/components/content/diff.ts +1 -1
  429. package/src/components/content/mermaid-element.ts +13 -2
  430. package/src/components/content/prompt-markdown.ts +292 -0
  431. package/src/components/content/tooltip-id.ts +41 -0
  432. package/src/components/islands/hooks.ts +75 -3
  433. package/src/components/layout/Analytics.astro +21 -79
  434. package/src/components/layout/Banner.astro +3 -1
  435. package/src/components/layout/DiscoveryLinks.astro +69 -0
  436. package/src/components/layout/Header.astro +83 -20
  437. package/src/components/layout/LanguageSwitcher.astro +4 -1
  438. package/src/components/layout/Logo.astro +23 -2
  439. package/src/components/layout/NavSelector.astro +13 -2
  440. package/src/components/layout/NavTree.astro +12 -3
  441. package/src/components/layout/NavTreeScript.astro +17 -3
  442. package/src/components/layout/PageActions.astro +3 -3
  443. package/src/components/layout/PageFeedback.astro +11 -1
  444. package/src/components/layout/PageLayout.astro +52 -5
  445. package/src/components/layout/ReferenceLayout.astro +21 -12
  446. package/src/components/layout/RootLayout.astro +69 -43
  447. package/src/components/layout/Search.astro +30 -6
  448. package/src/components/layout/WebMcp.astro +1 -1
  449. package/src/components/layout/analytics-client.ts +101 -15
  450. package/src/components/layout/drawer-inert.ts +113 -15
  451. package/src/components/layout/dropdown-clamp.ts +105 -0
  452. package/src/components/layout/head-scripts.ts +15 -6
  453. package/src/components/layout/nav-utils.ts +17 -0
  454. package/src/components/layout/search/algolia.ts +8 -8
  455. package/src/components/layout/search/orama-cloud.ts +9 -7
  456. package/src/components/layout/search/typesense.ts +11 -17
  457. package/src/components/openapi/MessageComposer.astro +2 -2
  458. package/src/components/openapi/Playground.astro +2 -2
  459. package/src/components/openapi/playground-client.ts +79 -10
  460. package/src/core/changelog-index.ts +24 -0
  461. package/src/core/component-overrides.ts +399 -154
  462. package/src/core/config-input.ts +212 -543
  463. package/src/core/config.ts +130 -41
  464. package/src/core/custom-pages.ts +105 -0
  465. package/src/core/data.ts +32 -11
  466. package/src/core/define-components.ts +12 -9
  467. package/src/core/deployment-env.ts +18 -74
  468. package/src/core/diagnostics.ts +14 -7
  469. package/src/core/graph.ts +69 -25
  470. package/src/core/i18n-ui.ts +6 -2
  471. package/src/core/i18n.ts +17 -0
  472. package/src/core/includes.ts +156 -38
  473. package/src/core/last-modified.ts +6 -11
  474. package/src/core/links.ts +166 -2
  475. package/src/core/manifest.ts +10 -3
  476. package/src/core/navigation.ts +137 -19
  477. package/src/core/new-tab.ts +35 -0
  478. package/src/core/node-require.ts +21 -0
  479. package/src/core/project-graph.ts +42 -26
  480. package/src/core/project.ts +9 -4
  481. package/src/core/request-body.ts +61 -0
  482. package/src/core/safe-href.ts +28 -0
  483. package/src/core/safe-links.ts +68 -0
  484. package/src/core/schema.ts +531 -721
  485. package/src/core/server-features.ts +8 -9
  486. package/src/core/sources/assets.ts +47 -11
  487. package/src/core/sources/collection.ts +67 -0
  488. package/src/core/sources/contentful-rich-text.ts +285 -0
  489. package/src/core/sources/contentful.ts +173 -0
  490. package/src/core/sources/github-releases.ts +51 -1
  491. package/src/core/sources/json.ts +71 -0
  492. package/src/core/sources/lexical.ts +195 -0
  493. package/src/core/sources/lower.ts +226 -0
  494. package/src/core/sources/normalize.ts +52 -2
  495. package/src/core/sources/notion.ts +39 -28
  496. package/src/core/sources/payload.ts +135 -0
  497. package/src/core/sources/portable-text.ts +11 -16
  498. package/src/core/sources/remote.ts +226 -0
  499. package/src/core/sources/resolve.ts +104 -166
  500. package/src/core/sources/sanity.ts +16 -49
  501. package/src/core/sources/strapi-blocks.ts +124 -0
  502. package/src/core/sources/strapi.ts +191 -0
  503. package/src/core/sources/types.ts +12 -1
  504. package/src/core/types.ts +20 -1
  505. package/src/core/ui-packs/ar.ts +6 -2
  506. package/src/core/ui-packs/bg.ts +6 -2
  507. package/src/core/ui-packs/bn.ts +6 -2
  508. package/src/core/ui-packs/ca.ts +3 -1
  509. package/src/core/ui-packs/cs.ts +6 -2
  510. package/src/core/ui-packs/da.ts +6 -2
  511. package/src/core/ui-packs/de.ts +6 -2
  512. package/src/core/ui-packs/el.ts +3 -1
  513. package/src/core/ui-packs/es.ts +3 -1
  514. package/src/core/ui-packs/fa.ts +6 -2
  515. package/src/core/ui-packs/fi.ts +6 -2
  516. package/src/core/ui-packs/fr.ts +3 -1
  517. package/src/core/ui-packs/he.ts +6 -2
  518. package/src/core/ui-packs/hi.ts +6 -2
  519. package/src/core/ui-packs/hr.ts +6 -2
  520. package/src/core/ui-packs/hu.ts +6 -2
  521. package/src/core/ui-packs/id.ts +6 -2
  522. package/src/core/ui-packs/it.ts +3 -1
  523. package/src/core/ui-packs/ja.ts +3 -1
  524. package/src/core/ui-packs/ko.ts +3 -1
  525. package/src/core/ui-packs/nl.ts +6 -2
  526. package/src/core/ui-packs/no.ts +6 -2
  527. package/src/core/ui-packs/pl.ts +6 -2
  528. package/src/core/ui-packs/pt-br.ts +3 -1
  529. package/src/core/ui-packs/pt.ts +3 -1
  530. package/src/core/ui-packs/ro.ts +6 -2
  531. package/src/core/ui-packs/ru.ts +6 -2
  532. package/src/core/ui-packs/sk.ts +6 -2
  533. package/src/core/ui-packs/sr.ts +6 -2
  534. package/src/core/ui-packs/sv.ts +6 -2
  535. package/src/core/ui-packs/th.ts +3 -1
  536. package/src/core/ui-packs/tr.ts +6 -2
  537. package/src/core/ui-packs/uk.ts +6 -2
  538. package/src/core/ui-packs/vi.ts +3 -1
  539. package/src/core/ui-packs/zh-tw.ts +3 -1
  540. package/src/core/ui-packs/zh.ts +3 -1
  541. package/src/core/unrecognized-keys.ts +10 -0
  542. package/src/core/version-cut.ts +116 -8
  543. package/src/deploy/adapter-output.ts +57 -97
  544. package/src/deploy/adapters/cloudflare.ts +39 -0
  545. package/src/deploy/adapters/index.ts +41 -0
  546. package/src/deploy/adapters/netlify.ts +34 -0
  547. package/src/deploy/adapters/node.ts +34 -0
  548. package/src/deploy/adapters/registry.ts +127 -0
  549. package/src/deploy/adapters/types.ts +92 -0
  550. package/src/deploy/adapters/vercel.ts +35 -0
  551. package/src/deploy/artifacts.ts +67 -28
  552. package/src/deploy/cloudflare-negotiation.ts +179 -100
  553. package/src/deploy/function-bundle.ts +18 -3
  554. package/src/deploy/headers.ts +129 -22
  555. package/src/deploy/node-headers.ts +198 -0
  556. package/src/deploy/platforms/cloudflare.ts +312 -0
  557. package/src/deploy/platforms/index.ts +67 -0
  558. package/src/deploy/platforms/netlify.ts +52 -0
  559. package/src/deploy/platforms/node.ts +40 -0
  560. package/src/deploy/platforms/paths.ts +42 -0
  561. package/src/deploy/platforms/static.ts +29 -0
  562. package/src/deploy/platforms/types.ts +112 -0
  563. package/src/deploy/platforms/vercel.ts +193 -0
  564. package/src/deploy/redirects.ts +30 -18
  565. package/src/deploy/robots.ts +3 -3
  566. package/src/deploy/rss.ts +2 -2
  567. package/src/deploy/sitemap.ts +2 -2
  568. package/src/deploy/vercel-negotiation.ts +27 -4
  569. package/src/eval/agents.ts +32 -1
  570. package/src/eval/findings.ts +19 -11
  571. package/src/eval/report.ts +10 -2
  572. package/src/markdown/external-links.ts +65 -0
  573. package/src/markdown/include.ts +45 -27
  574. package/src/markdown/index.ts +34 -9
  575. package/src/markdown/inline-code.ts +12 -6
  576. package/src/markdown/relative-links.ts +324 -0
  577. package/src/markdown/themes.ts +3 -3
  578. package/src/migrate/migrate.ts +149 -0
  579. package/src/openapi/parse.ts +64 -16
  580. package/src/openapi/proxy.ts +62 -10
  581. package/src/openapi/references.ts +147 -147
  582. package/src/openapi/render-mdx.ts +32 -10
  583. package/src/openapi/scalar.ts +15 -13
  584. package/src/openapi/sentence.ts +14 -0
  585. package/src/openapi/source.ts +37 -21
  586. package/src/openapi/spec-dependency-error.ts +15 -0
  587. package/src/reference/asyncapi.ts +83 -0
  588. package/src/reference/graphql.ts +89 -0
  589. package/src/reference/index.ts +40 -0
  590. package/src/reference/openapi.ts +83 -0
  591. package/src/reference/options.ts +201 -0
  592. package/src/reference/scalar.ts +136 -0
  593. package/src/reference/schema.ts +88 -0
  594. package/src/registry/eject.ts +97 -42
  595. package/src/search/adapters/algolia.ts +46 -0
  596. package/src/search/adapters/flexsearch.ts +29 -0
  597. package/src/search/adapters/index.ts +39 -0
  598. package/src/search/adapters/mixedbread.ts +39 -0
  599. package/src/search/adapters/orama-cloud.ts +51 -0
  600. package/src/search/adapters/orama.ts +24 -0
  601. package/src/search/adapters/pagefind.ts +27 -0
  602. package/src/search/adapters/registry.ts +131 -0
  603. package/src/search/adapters/types.ts +46 -0
  604. package/src/search/adapters/typesense.ts +57 -0
  605. package/src/search/build.ts +33 -7
  606. package/src/search/documents.ts +6 -0
  607. package/src/search/sync/algolia.ts +12 -11
  608. package/src/search/sync/index.ts +35 -20
  609. package/src/search/sync/orama-cloud.ts +12 -9
  610. package/src/search/sync/typesense.ts +15 -13
  611. package/src/sources/contentful.ts +63 -0
  612. package/src/sources/custom.ts +38 -0
  613. package/src/sources/filesystem.ts +51 -0
  614. package/src/sources/github-releases.ts +52 -0
  615. package/src/sources/index.ts +60 -0
  616. package/src/sources/mdx-remote.ts +76 -0
  617. package/src/sources/notion.ts +63 -0
  618. package/src/sources/obsidian.ts +38 -0
  619. package/src/sources/payload.ts +60 -0
  620. package/src/sources/registry.ts +182 -0
  621. package/src/sources/sanity.ts +66 -0
  622. package/src/sources/shared.ts +52 -0
  623. package/src/sources/strapi.ts +58 -0
  624. package/src/theme/entry.ts +47 -2
  625. package/src/translate/report.ts +40 -7
  626. package/src/upgrade/upgrade.ts +499 -0
  627. package/dist/cli/chunk-12dxjqk7.js.map +0 -10
  628. package/dist/cli/chunk-196vjxp9.js.map +0 -13
  629. package/dist/cli/chunk-2mzebbbz.js +0 -69
  630. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  631. package/dist/cli/chunk-30e87n55.js +0 -108
  632. package/dist/cli/chunk-30e87n55.js.map +0 -10
  633. package/dist/cli/chunk-450a7rcr.js +0 -185
  634. package/dist/cli/chunk-450a7rcr.js.map +0 -11
  635. package/dist/cli/chunk-5n7t497w.js.map +0 -40
  636. package/dist/cli/chunk-61j18dwk.js +0 -5342
  637. package/dist/cli/chunk-61j18dwk.js.map +0 -58
  638. package/dist/cli/chunk-88by27n5.js +0 -17
  639. package/dist/cli/chunk-88by27n5.js.map +0 -10
  640. package/dist/cli/chunk-8cd8tj54.js.map +0 -34
  641. package/dist/cli/chunk-aztttvb3.js +0 -381
  642. package/dist/cli/chunk-aztttvb3.js.map +0 -12
  643. package/dist/cli/chunk-cvky9gb2.js.map +0 -11
  644. package/dist/cli/chunk-ejjx8znq.js.map +0 -15
  645. package/dist/cli/chunk-fmceyezb.js +0 -1007
  646. package/dist/cli/chunk-fmceyezb.js.map +0 -13
  647. package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
  648. package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
  649. package/dist/cli/chunk-jbj4qhfw.js +0 -30
  650. package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
  651. package/dist/cli/chunk-mqb2ka8m.js +0 -68
  652. package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
  653. package/dist/cli/chunk-mt76t7dj.js.map +0 -11
  654. package/dist/cli/chunk-q4rae3bg.js +0 -60
  655. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  656. package/dist/cli/chunk-ra1v2nc2.js +0 -35
  657. package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
  658. package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
  659. package/dist/cli/chunk-tqa1s0k8.js +0 -69
  660. package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
  661. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  662. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  663. package/dist/cli/chunk-vkrsvbr5.js +0 -107
  664. package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
  665. package/dist/cli/chunk-vrfp10qk.js +0 -81
  666. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  667. package/dist/cli/chunk-wjt80jps.js +0 -1049
  668. package/dist/cli/chunk-wjt80jps.js.map +0 -24
  669. package/docs/advanced/api-reference.mdx +0 -240
  670. package/docs/reference/cli.mdx +0 -197
  671. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  672. package/src/components/content/changelog-element.ts +0 -69
  673. package/src/search/providers.ts +0 -91
  674. /package/dist/cli/{chunk-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
  675. /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
  676. /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
  677. /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
@@ -22,7 +22,7 @@ export const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>
22
22
  const DOCS_BASE = "https://useblume.dev";
23
23
 
24
24
  const DOCS_DEPLOYMENT = "/docs/deployment";
25
- const DOCS_REFERENCE_CLI = "/docs/reference/cli";
25
+ const DOCS_CLI_VALIDATE = "/docs/cli/validate";
26
26
  const DOCS_CONTENT_SOURCES = "/docs/content/sources";
27
27
  const DOCS_CONTENT_NAVIGATION = "/docs/content/navigation";
28
28
  const DOCS_CONTENT_INCLUDES = "/docs/content/includes";
@@ -31,19 +31,22 @@ const DOCS_CONTENT_INCLUDES = "/docs/content/includes";
31
31
  const DOCS_PATHS = new Map(
32
32
  Object.entries({
33
33
  BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,
34
- BLUME_ASSETS_UNCHECKED: DOCS_REFERENCE_CLI,
34
+ BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,
35
35
  BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,
36
- BLUME_BROKEN_ANCHOR: DOCS_REFERENCE_CLI,
37
- BLUME_BROKEN_ASSET: DOCS_REFERENCE_CLI,
38
- BLUME_BROKEN_LINK: DOCS_REFERENCE_CLI,
36
+ BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,
37
+ BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,
38
+ BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,
39
+ BLUME_COMPONENTS_INVALID: "/docs/configuration/customization",
39
40
  BLUME_CONFIG_INVALID: "/docs/configuration",
40
41
  BLUME_CONFIG_LOAD_FAILED: "/docs/configuration",
41
42
  BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,
42
- BLUME_DEAD_LINK: DOCS_REFERENCE_CLI,
43
+ BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,
44
+ BLUME_DEPENDENCY_MISSING: "/docs/cli/doctor",
43
45
  BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,
44
46
  BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,
45
- BLUME_FRONTMATTER_INVALID: "/docs/reference/frontmatter",
47
+ BLUME_FRONTMATTER_INVALID: "/docs/content/frontmatter",
46
48
  BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,
49
+ BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,
47
50
  BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,
48
51
  BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,
49
52
  BLUME_MDX_CURLY_ANCHOR: "/docs/content/syntax",
@@ -63,10 +66,14 @@ const DOCS_PATHS = new Map(
63
66
  BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,
64
67
  BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,
65
68
  BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,
69
+ BLUME_TRANSLATE_MISSING: "/docs/cli/translate",
70
+ BLUME_TRANSLATE_STALE: "/docs/cli/translate",
66
71
  BLUME_UNKNOWN_COMPONENT: "/docs/configuration/customization",
67
72
  BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,
73
+ BLUME_UNKNOWN_OPTION: "/docs/cli",
68
74
  BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,
69
75
  BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,
76
+ BLUME_YARN_PNP: "/docs/quickstart",
70
77
  })
71
78
  );
72
79
 
package/src/core/graph.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import { withBasePath } from "./base-path.ts";
2
- import { localizeRoute, resolveFallbackLocale } from "./i18n.ts";
2
+ import {
3
+ localizeInternalPath,
4
+ localizeRoute,
5
+ resolveFallbackLocale,
6
+ } from "./i18n.ts";
3
7
  import { validateNavIcons, validateNavStructure } from "./nav-diagnostics.ts";
4
8
  import { buildNavigation } from "./navigation.ts";
5
9
  import type {
@@ -21,6 +25,10 @@ import { versionizeRoute } from "./versions.ts";
21
25
  interface BuildContentGraphOptions {
22
26
  /** Site-wide route mount point (`""` or `/seg`); invisible to the nav tree. */
23
27
  basePath?: string;
28
+ /** The header brand link as configured (`logo.href`, default `/`). */
29
+ brandHref?: string;
30
+ /** Routes served outside the content tree that tabs may link to directly. */
31
+ extraRoutes?: ReadonlySet<string>;
24
32
  folderMeta: Map<string, FolderMeta>;
25
33
  sharedFolderMeta?: Map<string, FolderMeta>;
26
34
  navigation: ResolvedConfig["navigation"];
@@ -138,17 +146,54 @@ const buildLocaleNavigation = (
138
146
  diagnostics: Diagnostic[],
139
147
  version = ""
140
148
  ): Navigation => {
141
- // Localize internal tab paths — the tab's own and its dropdown items' — so a
142
- // header tab points to its in-locale route (e.g. `/docs` -> `/fr/docs`);
143
- // external paths pass through. Selectors are left alone: a language
144
- // selector's items intentionally target specific locales.
145
- // `//host/path` is protocol-relative — an external URL that happens to start
146
- // with a slash, so it must not pick up a locale prefix. `withBasePath` draws
147
- // the same line for the same reason.
148
- const localizePath = (path: string): string =>
149
- path.startsWith("/") && !path.startsWith("//")
150
- ? localizeRoute(path, code, i18n)
149
+ const basePath = options.basePath ?? "";
150
+ const real = pages.filter((page) => page.locale === code);
151
+ const localePages = localePagesFor(
152
+ code,
153
+ real,
154
+ fallback,
155
+ fallbackByKey,
156
+ i18n,
157
+ basePath
158
+ );
159
+ // Every route the build serves: each locale's pages (this locale's fallback
160
+ // copies included) plus the routes outside the content tree — custom pages
161
+ // and the generated changelog index, which mount outside `basePath`.
162
+ const pageRoutes = [
163
+ ...new Set([...pages, ...localePages].map((page) => page.route)),
164
+ ];
165
+ const extraRoutes = options.extraRoutes ?? new Set<string>();
166
+ // Whether `path` (authored at root, like a tab path) is served — exactly, or
167
+ // with `section`, as the prefix of a served page (a tab resolves to its
168
+ // section's first page, a plain link doesn't).
169
+ const serves = (path: string, section: boolean): boolean => {
170
+ if (extraRoutes.has(path)) {
171
+ return true;
172
+ }
173
+ const based = withBasePath(basePath, path);
174
+ const prefix = based === "/" ? "/" : `${based}/`;
175
+ return pageRoutes.some(
176
+ (route) => route === based || (section && route.startsWith(prefix))
177
+ );
178
+ };
179
+ // Localize an internal link so it points to its in-locale route (e.g. `/docs`
180
+ // -> `/fr/docs`); external paths pass through. A route this locale doesn't
181
+ // serve while the default one does — a custom page, the generated changelog
182
+ // index — exists only at its own path, so the link stays there instead of
183
+ // 404ing. Tab paths (and their dropdown items') resolve to a section's first
184
+ // page, so a translated section counts; hrefs must be served exactly.
185
+ // Selectors are left alone: a language selector's items intentionally target
186
+ // specific locales. The header's brand link resolves the same way, so the
187
+ // logo and the tabs beside it always agree on the reader's locale.
188
+ const localizeServed = (path: string, section: boolean): string => {
189
+ const localized = localizeInternalPath(path, code, i18n);
190
+ return localized === path ||
191
+ serves(localized, section) ||
192
+ !serves(path, section)
193
+ ? localized
151
194
  : path;
195
+ };
196
+ const localizePath = (path: string): string => localizeServed(path, true);
152
197
  const tabs = resolveTabLabels(
153
198
  options.navigation.tabs,
154
199
  code,
@@ -163,19 +208,10 @@ const buildLocaleNavigation = (
163
208
  path: localizePath(tab.path),
164
209
  };
165
210
  if (localized.href) {
166
- localized.href = localizePath(localized.href);
211
+ localized.href = localizeServed(localized.href, false);
167
212
  }
168
213
  return localized;
169
214
  });
170
- const real = pages.filter((page) => page.locale === code);
171
- const localePages = localePagesFor(
172
- code,
173
- real,
174
- fallback,
175
- fallbackByKey,
176
- i18n,
177
- options.basePath ?? ""
178
- );
179
215
  // Meta files live in locale directories only under the `dir` parser
180
216
  // (`fr/guides/meta.ts` -> key `fr/guides`). Under `dot`, translations sit
181
217
  // next to the originals and `guides/meta.ts` applies to every locale —
@@ -188,16 +224,17 @@ const buildLocaleNavigation = (
188
224
  // locale, not kick them back to the default one.
189
225
  const localizeHref = <T extends { href: string }>(item: T): T => ({
190
226
  ...item,
191
- href: localizePath(item.href),
227
+ href: localizeServed(item.href, false),
192
228
  });
193
229
  const { actions, cta, featured } = options.navigation;
194
230
 
195
- return buildNavigation(localePages, {
231
+ const navigation = buildNavigation(localePages, {
196
232
  actions: actions?.map(localizeHref),
197
- basePath: options.basePath ?? "",
233
+ basePath,
198
234
  cta: cta ? localizeHref(cta) : null,
199
235
  diagnostics,
200
236
  display: options.navigation.sidebar.display,
237
+ extraRoutes: options.extraRoutes,
201
238
  featured: featured?.map(localizeHref),
202
239
  folderMeta: options.folderMeta,
203
240
  // The localized tree root ("/" for the hidden default, "/fr" otherwise;
@@ -217,6 +254,9 @@ const buildLocaleNavigation = (
217
254
  sidebar: version ? undefined : options.navigation.sidebar.items,
218
255
  tabs,
219
256
  });
257
+ return options.brandHref === undefined
258
+ ? navigation
259
+ : { ...navigation, brandHref: localizeServed(options.brandHref, false) };
220
260
  };
221
261
 
222
262
  /**
@@ -234,10 +274,12 @@ const buildI18nNavigation = (
234
274
  // Pages of the fallback locale, by translation key — used to fill in a
235
275
  // locale's sidebar for pages it hasn't translated yet.
236
276
  const fallback = resolveFallbackLocale(i18n);
277
+ // Monolingual pages (GitHub releases) are left out: they aren't served at the
278
+ // other locales' URLs (see the route manifest), so no sidebar may link there.
237
279
  const fallbackByKey = new Map<string, PageRecord>();
238
280
  if (fallback) {
239
281
  for (const page of pages) {
240
- if (page.locale === fallback) {
282
+ if (page.locale === fallback && !page.monolingual) {
241
283
  fallbackByKey.set(page.translationKey, page);
242
284
  }
243
285
  }
@@ -298,6 +340,7 @@ const buildVersionNavigation = (
298
340
  cta: options.navigation.cta,
299
341
  diagnostics,
300
342
  display: options.navigation.sidebar.display,
343
+ extraRoutes: options.extraRoutes,
301
344
  featured: options.navigation.featured,
302
345
  folderMeta: options.folderMeta,
303
346
  localizedRoot: versionizeRoute("/", id),
@@ -345,6 +388,7 @@ export const buildContentGraph = (
345
388
  cta: options.navigation.cta,
346
389
  diagnostics,
347
390
  display: options.navigation.sidebar.display,
391
+ extraRoutes: options.extraRoutes,
348
392
  featured: options.navigation.featured,
349
393
  folderMeta: options.folderMeta,
350
394
  selectors: options.navigation.selectors,
@@ -68,13 +68,15 @@ const uiStringsObject = z.object({
68
68
  .default(
69
69
  "Product updates, new features, and fixes from every release."
70
70
  ),
71
- // `{version}` is replaced with the major line ("2.x") at render time.
72
- showReleases: z.string().default("Show {version} releases"),
73
71
  title: z.string().default("Changelog"),
74
72
  })
75
73
  .prefault({}),
76
74
  content: z
77
75
  .object({
76
+ // A `<Color.Item>` swatch's accessible name; `{name}` and `{value}` are
77
+ // replaced with the color's name and the value it shows.
78
+ copyColor: z.string().default("Copy {name} color {value}"),
79
+ copyPrompt: z.string().default("Copy prompt"),
78
80
  diagramError: z.string().default("Could not render this diagram."),
79
81
  })
80
82
  .prefault({}),
@@ -101,6 +103,8 @@ const uiStringsObject = z.object({
101
103
  featured: z.string().default("Featured"),
102
104
  githubRepository: z.string().default("GitHub repository"),
103
105
  navigation: z.string().default("Navigation"),
106
+ // The screen-reader description every new-tab link points at.
107
+ opensInNewTab: z.string().default("Opens in a new tab"),
104
108
  primary: z.string().default("Primary"),
105
109
  sections: z.string().default("Sections"),
106
110
  toggleNavigation: z.string().default("Toggle navigation"),
package/src/core/i18n.ts CHANGED
@@ -79,6 +79,23 @@ export const localizeRoute = (
79
79
  return logicalRoute === "/" ? prefix : `${prefix}${logicalRoute}`;
80
80
  };
81
81
 
82
+ /**
83
+ * Localize a configured link target the way header tabs are: a root-relative
84
+ * internal path (`/`, `/docs`) moves into `code`'s prefix, and anything else —
85
+ * an absolute URL, a fragment, a relative path — passes through. `//host/path`
86
+ * is protocol-relative, an external URL that happens to start with a slash, so
87
+ * it must not pick up a locale prefix (`withBasePath` draws the same line).
88
+ * With no i18n (`null`) the path is returned as-is.
89
+ */
90
+ export const localizeInternalPath = (
91
+ path: string,
92
+ code: string,
93
+ i18n: LocaleRouting | null
94
+ ): string =>
95
+ i18n && path.startsWith("/") && !path.startsWith("//")
96
+ ? localizeRoute(path, code, i18n)
97
+ : path;
98
+
82
99
  /**
83
100
  * Detect a leading non-default locale directory in a path's segments. The
84
101
  * default locale lives at the content root, so only non-default codes are
@@ -141,6 +141,100 @@ export const parseIncludeStatement = (
141
141
  export const parseIncludeLine = (line: string): IncludeStatement | null =>
142
142
  INDENTED_CODE.test(line) ? null : parseIncludeStatement(line.trim());
143
143
 
144
+ /** A line that opens an include statement: `<include`, then a space, `>`, or its end. */
145
+ const INCLUDE_OPEN = /^<include(?:[\s>]|$)/u;
146
+
147
+ /** A line that closes one. */
148
+ const INCLUDE_CLOSE = /<\/include\s*>$/u;
149
+
150
+ /**
151
+ * How many lines a wrapped statement may span: room for a formatter that puts
152
+ * every attribute on its own line, short enough that an unclosed `<include`
153
+ * can't reach across a page.
154
+ */
155
+ const MAX_STATEMENT_LINES = 8;
156
+
157
+ /** What a line that may open an include statement turned out to be. */
158
+ export type IncludeMatch =
159
+ /** A statement, ending on line `end` (the same line when it isn't wrapped). */
160
+ | { kind: "statement"; end: number; statement: IncludeStatement }
161
+ /** A line that opens `<include` but no statement Blume can read. */
162
+ | { kind: "malformed" }
163
+ /** Not an include statement at all. */
164
+ | { kind: "none" };
165
+
166
+ /**
167
+ * Read the include statement opening at `lines[index]`, if any. A statement
168
+ * sits on a line of its own, or — as a formatter wraps a long one — runs from a
169
+ * line opening `<include` to the next line closing `</include>`, with no blank
170
+ * line between (the path on its own line, attributes on one line or several):
171
+ *
172
+ * ```mdx
173
+ * <include lang="ts" meta='title="config.ts"'>
174
+ * ./examples/config.ts
175
+ * </include>
176
+ * ```
177
+ *
178
+ * The lines' trimmed text joins into the one-line form, so both parse by the
179
+ * same rules. In `.md` a first line indented like code is a code block, never
180
+ * a statement. A line that opens `<include` but doesn't close into a
181
+ * statement is `malformed`, so the author hears about it instead of the page
182
+ * rendering the raw tag. Shared by the string-level scanner and the render
183
+ * plugin so they splice exactly the same statements.
184
+ */
185
+ export const matchIncludeStatement = (
186
+ lines: readonly string[],
187
+ index: number,
188
+ format: "md" | "mdx"
189
+ ): IncludeMatch => {
190
+ const first = lines[index] ?? "";
191
+ if (format === "md" && INDENTED_CODE.test(first)) {
192
+ return { kind: "none" };
193
+ }
194
+ const opening = first.trim();
195
+ if (!INCLUDE_OPEN.test(opening)) {
196
+ return { kind: "none" };
197
+ }
198
+ const single = parseIncludeStatement(opening);
199
+ if (single) {
200
+ return { end: index, kind: "statement", statement: single };
201
+ }
202
+ const parts = [opening];
203
+ const last = Math.min(lines.length, index + MAX_STATEMENT_LINES) - 1;
204
+ for (let end = index + 1; end <= last; end += 1) {
205
+ const part = (lines[end] ?? "").trim();
206
+ if (part === "") {
207
+ break;
208
+ }
209
+ parts.push(part);
210
+ if (INCLUDE_CLOSE.test(part)) {
211
+ const statement = parseIncludeStatement(parts.join(" "));
212
+ return statement
213
+ ? { end, kind: "statement", statement }
214
+ : { kind: "malformed" };
215
+ }
216
+ }
217
+ return { kind: "malformed" };
218
+ };
219
+
220
+ /**
221
+ * The warning for a line that opens `<include` but isn't a statement Blume can
222
+ * read — it renders as written, so a silent miss would ship a raw tag.
223
+ */
224
+ export const malformedIncludeDiagnostic = (
225
+ file: string,
226
+ line: number
227
+ ): Diagnostic => ({
228
+ code: "BLUME_INCLUDE_MALFORMED",
229
+ file,
230
+ line,
231
+ message:
232
+ "This <include> isn't a statement Blume can read, so the page shows it as written.",
233
+ severity: "warning",
234
+ suggestion:
235
+ "Write <include>./path.mdx</include> on a line of its own, or wrap it with the path on its own line and no blank lines; only lang and meta attributes are read.",
236
+ });
237
+
144
238
  /**
145
239
  * Advance the HTML comment state across one `.md` line — the render plugin's
146
240
  * half of the comment rule (a statement inside `<!-- -->` never splices),
@@ -432,67 +526,82 @@ const expandStatement = async (
432
526
  };
433
527
 
434
528
  /**
435
- * Walk a document's lines, replacing each include statement (outside fenced
436
- * code, comments, and — in `.md` — indented code blocks) with the target's
437
- * expanded lines. Statements that error stay verbatim so downstream surfaces
438
- * show what the author wrote; a blank line is padded around each splice so a
439
- * partial can't merge into an adjacent paragraph.
529
+ * Pass 1 of {@link expandLines}: find each include statement (outside fenced
530
+ * code, comments, and — in `.md` — indented code blocks), indexed by the line
531
+ * it opens on. A commented-out statement never renders, so expanding it would
532
+ * leak the partial into search/mirror surfaces the page doesn't show.
533
+ * Indented code and setext underlines only exist in `.md` (MDX has neither,
534
+ * and an indented `<include>` there is still JSX flow the renderer splices).
440
535
  */
441
- const expandLines = async (
442
- body: string,
443
- filePath: string,
444
- lineOffset: number,
445
- ctx: ExpandContext,
446
- stack: readonly string[]
447
- ): Promise<ExpandedLines> => {
448
- const sourceLines = body.split("\n");
449
- const isMdx = extname(filePath).toLowerCase() === ".mdx";
536
+ const scanStatements = (
537
+ sourceLines: string[],
538
+ isMdx: boolean
539
+ ): (IncludeMatch | null)[] => {
450
540
  const delimiters = COMMENT_DELIMITERS[isMdx ? "mdx" : "md"];
451
-
452
- // Pass 1: statement detection per line, tracking fenced code and comments —
453
- // a commented-out statement never renders, so expanding it would leak the
454
- // partial into search/mirror surfaces the page doesn't show. Indented code
455
- // and setext underlines only exist in `.md` (MDX has neither, and an
456
- // indented `<include>` there is still JSX flow the renderer splices).
541
+ const format = isMdx ? "mdx" : "md";
542
+ const matches: (IncludeMatch | null)[] = sourceLines.map(() => null);
457
543
  let fence: FenceState = null;
458
544
  let inComment = false;
459
- const statements = sourceLines.map((line, index) => {
545
+ for (let index = 0; index < sourceLines.length; index += 1) {
546
+ const line = sourceLines[index] ?? "";
460
547
  if (inComment) {
461
548
  inComment = advanceCommentState(line, delimiters, true);
462
- return null;
549
+ continue;
463
550
  }
464
551
  const next = nextFenceState(line, fence);
465
552
  const inFence = fence !== null || next !== null;
466
553
  fence = next;
467
554
  if (inFence) {
468
- return null;
555
+ continue;
469
556
  }
470
557
  inComment = advanceCommentState(line, delimiters, false);
471
558
  if (inComment || !hasIncludeStatements(line)) {
472
- return null;
559
+ continue;
473
560
  }
474
- const statement = isMdx
475
- ? parseIncludeStatement(line.trim())
476
- : parseIncludeLine(line);
477
- // A setext underline directly below folds the statement line into a
478
- // heading — the renderer shows a heading, not a splice, so skip it.
561
+ const match = matchIncludeStatement(sourceLines, index, format);
562
+ // A setext underline directly below folds the statement into a heading —
563
+ // the renderer shows a heading, not a splice, so skip it.
479
564
  if (
480
- statement &&
565
+ match.kind === "statement" &&
481
566
  !isMdx &&
482
- SETEXT_UNDERLINE.test(sourceLines[index + 1] ?? "")
567
+ SETEXT_UNDERLINE.test(sourceLines[match.end + 1] ?? "")
483
568
  ) {
484
- return null;
569
+ continue;
485
570
  }
486
- return statement;
487
- });
571
+ matches[index] = match;
572
+ if (match.kind === "statement") {
573
+ // A wrapped statement's remaining lines belong to it.
574
+ index = match.end;
575
+ }
576
+ }
577
+ return matches;
578
+ };
579
+
580
+ /**
581
+ * Walk a document's lines, replacing each include statement (outside fenced
582
+ * code, comments, and — in `.md` — indented code blocks) with the target's
583
+ * expanded lines. Statements that error stay verbatim so downstream surfaces
584
+ * show what the author wrote; a blank line is padded around each splice so a
585
+ * partial can't merge into an adjacent paragraph.
586
+ */
587
+ const expandLines = async (
588
+ body: string,
589
+ filePath: string,
590
+ lineOffset: number,
591
+ ctx: ExpandContext,
592
+ stack: readonly string[]
593
+ ): Promise<ExpandedLines> => {
594
+ const sourceLines = body.split("\n");
595
+ const isMdx = extname(filePath).toLowerCase() === ".mdx";
596
+ const matches = scanStatements(sourceLines, isMdx);
488
597
 
489
598
  // Pass 2: expand every statement concurrently — reads are independent, and
490
599
  // each branch carries its own cycle stack.
491
600
  const expansions = await Promise.all(
492
- statements.map((statement, index) =>
493
- statement
601
+ matches.map((match, index) =>
602
+ match?.kind === "statement"
494
603
  ? expandStatement(
495
- statement,
604
+ match.statement,
496
605
  filePath,
497
606
  lineOffset + index + 1,
498
607
  ctx,
@@ -506,9 +615,14 @@ const expandLines = async (
506
615
  // accumulated output, and error order should follow document order.
507
616
  const lines: string[] = [];
508
617
  const origins: LineOrigin[] = [];
509
- for (const [index, line] of sourceLines.entries()) {
618
+ for (let index = 0; index < sourceLines.length; index += 1) {
619
+ const line = sourceLines[index] ?? "";
510
620
  const rawLine = lineOffset + index + 1;
621
+ const match = matches[index];
511
622
  const expanded = expansions[index];
623
+ if (match?.kind === "malformed") {
624
+ ctx.errors.push(malformedIncludeDiagnostic(filePath, rawLine));
625
+ }
512
626
  if (!expanded || "error" in expanded) {
513
627
  if (expanded) {
514
628
  ctx.errors.push(expanded.error);
@@ -526,6 +640,10 @@ const expandLines = async (
526
640
  }
527
641
  lines.push(...expanded.lines);
528
642
  origins.push(...expanded.origins);
643
+ // A wrapped statement's remaining lines were spliced with it.
644
+ if (match?.kind === "statement") {
645
+ index = match.end;
646
+ }
529
647
  if (sourceLines[index + 1]?.trim()) {
530
648
  pad();
531
649
  }
@@ -31,18 +31,13 @@ const gitEnv = (): NodeJS.ProcessEnv =>
31
31
  Object.entries(process.env).filter(([key]) => !GIT_LOCATION_VARS.has(key))
32
32
  );
33
33
 
34
- /** Normalize the `lastModified` config union into `{ enabled, source }`. */
34
+ /** Normalize the `lastModified` config (`false | "git" | "frontmatter"`) into `{ enabled, source }`. */
35
35
  export const resolveLastModifiedConfig = (
36
- value: boolean | { type: "git" | "frontmatter" }
37
- ): ResolvedLastModified => {
38
- if (value === false) {
39
- return { enabled: false, source: "git" };
40
- }
41
- if (value === true) {
42
- return { enabled: true, source: "git" };
43
- }
44
- return { enabled: true, source: value.type };
45
- };
36
+ value: false | "git" | "frontmatter"
37
+ ): ResolvedLastModified =>
38
+ value === false
39
+ ? { enabled: false, source: "git" }
40
+ : { enabled: true, source: value };
46
41
 
47
42
  /**
48
43
  * Parse `git log --format=%x00%cI --name-only` output into a map of