blume 1.7.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Absolute-URL building for the configured `deployment.site`, shared by every
3
+ * emitter that prints site URLs (sitemap, RSS, robots, llms.txt, the MCP and
4
+ * agent-discovery documents). One implementation replaces eight per-file
5
+ * copies that had drifted across three different trailing-slash treatments.
6
+ *
7
+ * Deliberately not `new URL(path, site)`: a root-absolute path would drop the
8
+ * base path of a subpath deployment (`acme.com/docs`). ufo's `joinURL` joins
9
+ * without that footgun; the site is first trimmed with the ReDoS-safe
10
+ * `trimEnd` loop so even a malformed `site` with piled-up trailing slashes
11
+ * joins cleanly.
12
+ */
13
+ /** The configured site with any trailing slashes dropped. */
14
+ export declare const siteRoot: (site: string) => string;
15
+ /** `site` + root-absolute `path` (already carrying any deployment base). */
16
+ export declare const absoluteUrl: (site: string, path: string) => string;
@@ -0,0 +1,36 @@
1
+ import type { Diagnostic } from "../types.ts";
2
+ /** Where to write downloaded assets and how to reference them publicly. */
3
+ export interface AssetContext {
4
+ assetsDir: string;
5
+ assetsBaseUrl: string;
6
+ /** Injected for tests; defaults to the global `fetch`. */
7
+ fetchImpl?: typeof fetch;
8
+ /**
9
+ * Gate for concurrent downloads. A source shares one gate across every page
10
+ * it materializes, so a database of video-heavy pages doesn't open every
11
+ * download at once. Defaults to no gate.
12
+ */
13
+ limit?: <T>(task: () => Promise<T>) => Promise<T>;
14
+ /**
15
+ * Downloads in progress, keyed by asset stem. A source shares one table
16
+ * (alongside `limit`) across every page it materializes, so two pages that
17
+ * reference the same asset share one download instead of racing to publish
18
+ * the same file. Defaults to a table private to this call.
19
+ */
20
+ inFlight?: Map<string, Promise<string>>;
21
+ /** Abort a download that hasn't completed within this many milliseconds. */
22
+ timeoutMs?: number;
23
+ }
24
+ /**
25
+ * Download remote media referenced in a Markdown body into the asset dir and
26
+ * rewrite the reference to the local public path. Markdown images and the
27
+ * `src` of a `<video>` tag are both covered. Remote CMS URLs (notably Notion's
28
+ * signed, expiring links) would otherwise rot a static build. Assets are
29
+ * content-addressed by URL hash, so repeated builds are stable and deduped —
30
+ * and a file already on disk is not fetched again, which keeps a dev poll
31
+ * from re-downloading every video on every tick.
32
+ */
33
+ export declare const materializeAssets: (markdown: string, ctx: AssetContext) => Promise<{
34
+ markdown: string;
35
+ diagnostics: Diagnostic[];
36
+ }>;
@@ -0,0 +1,37 @@
1
+ import type { SourceEntry, SourceLoadResult } from "./types.ts";
2
+ /**
3
+ * Small, stable content hash for cache/HMR bookkeeping — and for staged asset
4
+ * *filenames* (see sources/assets.ts and content-assets.ts), where a collision
5
+ * silently serves the wrong file. 64 bits of SHA-256 keeps those names
6
+ * collision-safe at any realistic asset count; the old 31-bit DJB2 hash had a
7
+ * ~46k-item birthday bound.
8
+ */
9
+ export declare const hashText: (text: string) => string;
10
+ /** A stable digest of a source's entries, for change detection while polling. */
11
+ export declare const entriesDigest: (entries: SourceEntry[]) => string;
12
+ /**
13
+ * Build an opt-in polling watcher for a remote source: re-`load()` on an
14
+ * interval and fire `onChange` only when the entry digest changes, so a remote
15
+ * source can hot-reload in dev without refetching the world on every keystroke.
16
+ *
17
+ * `load` must fetch fresh (bypassing the cache-first dev path) — polling the
18
+ * cache-first loader would serve the identical snapshot on every tick and
19
+ * never observe a remote change. `seed` (the source's regular, cache-first
20
+ * loader) establishes the baseline digest from what dev actually served, so a
21
+ * remote change landing before the first tick still fires.
22
+ */
23
+ export declare const pollingWatch: (load: () => Promise<SourceLoadResult>, intervalSeconds: number, seed?: () => Promise<SourceLoadResult>) => ((onChange: () => void) => () => void);
24
+ /** A per-source snapshot of the last successful fetch, for offline tolerance. */
25
+ export interface SnapshotCache {
26
+ read: () => Promise<SourceEntry[]>;
27
+ write: (entries: SourceEntry[]) => Promise<void>;
28
+ }
29
+ /** Build a JSON snapshot cache under `<cacheDir>/entries.json`. */
30
+ export declare const snapshotCache: (cacheDir: string) => SnapshotCache;
31
+ /**
32
+ * Run a remote `fetchEntries`, caching the result. When `refresh` is false and a
33
+ * snapshot exists, serve it without fetching (cache-first dev). On fetch failure,
34
+ * serve the last-known-good snapshot with a warning so a CMS/network outage
35
+ * doesn't fail the build; if there is no snapshot either, surface a hard error.
36
+ */
37
+ export declare const loadWithCache: (name: string, cache: SnapshotCache, fetchEntries: () => Promise<SourceEntry[]>, refresh?: boolean) => Promise<SourceLoadResult>;
@@ -0,0 +1,28 @@
1
+ import type { ContentSourceAdapter } from "../../sources/registry.ts";
2
+ import type { ResolvedConfig } from "../schema.ts";
3
+ /** Resolve a source `root` against the project root (absolute passes through). */
4
+ export declare const resolveSourceRoot: (projectRoot: string, root: string) => string;
5
+ /** The configured sources of one adapter `kind`, in config order. */
6
+ export declare const sourcesOfKind: <Kind extends ContentSourceAdapter["kind"]>(config: ResolvedConfig, kind: Kind) => Extract<ContentSourceAdapter, {
7
+ kind: Kind;
8
+ }>[];
9
+ /**
10
+ * The generated `docs` glob collection: its base directory and the include /
11
+ * exclude globs applied under it. Astro's glob loader ids each entry by its
12
+ * path relative to `base`, and a filesystem source ids each entry relative to
13
+ * its own root — so the two only agree when the collection is rooted at that
14
+ * source. The collection therefore roots at the first `filesystem()` source
15
+ * (the implicit one, for a zero-config project). Further filesystem sources
16
+ * must share that root and partition it with globs: every filesystem source's
17
+ * `include` feeds the collection, and only a pattern every one of them
18
+ * excludes is excluded, so no source's pages are globbed away. A source
19
+ * rooted elsewhere can't share the base and is caught by the entry-id guard in
20
+ * `scanProject`. With no filesystem source at all the collection globs nothing
21
+ * and its base is the default `docs` directory, which only anchors paths.
22
+ */
23
+ export interface DocsCollection {
24
+ base: string;
25
+ include: string[];
26
+ exclude: string[];
27
+ }
28
+ export declare const resolveDocsCollection: (config: ResolvedConfig, projectRoot: string) => DocsCollection;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Contentful rich text → Markdown. Covers the block, inline, and mark types
3
+ * the Rich Text editor emits; embedded entries fall through to a serializer
4
+ * keyed by content type or are noted in a comment. Links to assets and
5
+ * entries arrive unresolved from the Delivery API (`data.target` is a
6
+ * `sys` link), so the source hands in resolvers over the response's
7
+ * `includes`; a document the SDK already resolved (with `fields` inline)
8
+ * lowers the same way.
9
+ */
10
+ import type { JsonObject } from "./json.ts";
11
+ /** An asset's file as a Markdown image needs it. */
12
+ export interface ContentfulAsset {
13
+ description?: string;
14
+ title?: string;
15
+ url: string;
16
+ }
17
+ export interface ContentfulRichTextOptions {
18
+ /** Resolve an asset link (`data.target.sys.id`) to its file. */
19
+ resolveAsset?: (id: string) => ContentfulAsset | null;
20
+ /** Resolve an entry link to the entry (`sys` plus `fields`). */
21
+ resolveEntry?: (id: string) => JsonObject | null;
22
+ /**
23
+ * Serializers for embedded entries, keyed by content type id; return
24
+ * Markdown or MDX. Setting any writes the source's entries as MDX.
25
+ */
26
+ serializers?: Record<string, (entry: JsonObject) => string>;
27
+ }
28
+ /** The file behind an asset entry, or null when it carries none. */
29
+ export declare const assetFromEntry: (asset: JsonObject) => ContentfulAsset | null;
30
+ /** Serialize a rich text document (`nodeType: "document"`) to Markdown. */
31
+ export declare const contentfulRichTextToMarkdown: (doc: JsonObject, options?: ContentfulRichTextOptions) => string;
@@ -0,0 +1,40 @@
1
+ import type { JsonObject } from "./json.ts";
2
+ import type { RemoteFieldMap } from "./remote.ts";
3
+ import type { ContentSource, SourceContext } from "./types.ts";
4
+ export interface ContentfulSourceOptions {
5
+ name: string;
6
+ prefix?: string;
7
+ /** Space id. */
8
+ space: string;
9
+ /** Environment id; default `master`. */
10
+ environment?: string;
11
+ /** The content type id whose entries become pages. */
12
+ contentType: string;
13
+ /** Locale code to fetch; omit for the space's default locale. */
14
+ locale?: string;
15
+ /**
16
+ * Field ids mapping an entry onto Blume meta + body. Paths resolve against
17
+ * the entry's `fields`, with `sys` reachable as `sys.<key>`. Defaults:
18
+ * `title`, `description`, `slug`, `body`, `sys.updatedAt`.
19
+ */
20
+ fields?: RemoteFieldMap;
21
+ /** Extra query parameters for the entries request (`fields.section: "sdk"`). */
22
+ params?: Record<string, string>;
23
+ /** Serializers for embedded entries, keyed by content type id. */
24
+ serializers?: Record<string, (entry: JsonObject) => string>;
25
+ /** Delivery API token; defaults to `CONTENTFUL_ACCESS_TOKEN`. */
26
+ token?: string;
27
+ /** Preview API token for `--preview`; defaults to `CONTENTFUL_PREVIEW_TOKEN`. */
28
+ previewToken?: string;
29
+ /** Opt-in dev polling interval (seconds); omit to freeze for the session. */
30
+ pollInterval?: number;
31
+ /** Injected for tests; defaults to the global `fetch`. */
32
+ fetchImpl?: typeof fetch;
33
+ }
34
+ /**
35
+ * Contentful content source. Pages through the Delivery API (the Preview API
36
+ * under `--preview`), maps each entry's fields to frontmatter, and lowers its
37
+ * rich text body to Markdown with the page's `includes` resolving asset and
38
+ * entry links.
39
+ */
40
+ export declare const contentfulSource: (options: ContentfulSourceOptions, ctx?: SourceContext) => ContentSource;
@@ -0,0 +1,24 @@
1
+ import type { ContentSource } from "./types.ts";
2
+ /** Options for the built-in filesystem source. */
3
+ export interface FilesystemSourceOptions {
4
+ /** Stable source name; namespaces ids and diagnostics. */
5
+ name: string;
6
+ /** Optional route prefix. */
7
+ prefix?: string;
8
+ /** Content root, absolute or relative to `projectRoot`. */
9
+ root: string;
10
+ include: string[];
11
+ exclude: string[];
12
+ /** Absolute project root, used to resolve a relative `root`. */
13
+ projectRoot: string;
14
+ /** When set, a missing root throws this code instead of the generic one. */
15
+ missingCode?: string;
16
+ }
17
+ /**
18
+ * The built-in content source: discover and read `.md`/`.mdx` files under a
19
+ * content root. This is the extraction of the original `discoverContent()` scan
20
+ * into a `ContentSource`; every other adapter follows the same contract.
21
+ */
22
+ export declare const filesystemSource: (options: FilesystemSourceOptions) => ContentSource & {
23
+ readonly contentRoot: string;
24
+ };
@@ -0,0 +1,31 @@
1
+ import type { ContentSource, SourceContext } from "./types.ts";
2
+ /** Options for the built-in GitHub Releases changelog source. */
3
+ export interface GithubReleasesSourceOptions {
4
+ /** GitHub REST API base; overridable for GitHub Enterprise / tests. */
5
+ baseUrl?: string;
6
+ /** Include draft releases (needs a token with repo write access). Default off. */
7
+ drafts?: boolean;
8
+ /** Injected for tests; defaults to the global `fetch`. */
9
+ fetchImpl?: typeof fetch;
10
+ /** Cap the number of releases materialized, newest-first. Default 100. */
11
+ limit?: number;
12
+ name: string;
13
+ /** Repository owner (user or org). */
14
+ owner: string;
15
+ /** Opt-in dev polling interval (seconds); omit to freeze for the session. */
16
+ pollInterval?: number;
17
+ /** Namespaces the source's routes under `/<prefix>/`; e.g. `changelog`. */
18
+ prefix?: string;
19
+ /** Include prereleases. Default off. */
20
+ prereleases?: boolean;
21
+ /** Repository name. */
22
+ repo: string;
23
+ }
24
+ /**
25
+ * GitHub Releases content source. Pulls a repo's releases from the REST API and
26
+ * materializes each as a `type: changelog` entry, so a project's release notes
27
+ * become its changelog with no files to maintain. A private repo authenticates
28
+ * with `GITHUB_TOKEN`. A snapshot under `.blume/cache/<source>/` keeps rebuilds
29
+ * offline-tolerant.
30
+ */
31
+ export declare const githubReleasesSource: (options: GithubReleasesSourceOptions, ctx: SourceContext) => ContentSource;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The JSON a CMS API returns: arbitrary values a query or REST endpoint
3
+ * hands back, typed as a closed union so a source narrows with predicates
4
+ * instead of casting.
5
+ */
6
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
7
+ [key: string]: JsonValue;
8
+ };
9
+ /** A JSON object: a document, a node in a rich-text tree, an API envelope. */
10
+ export interface JsonObject {
11
+ [key: string]: JsonValue;
12
+ }
13
+ /**
14
+ * A node a dot path can descend into. Arrays pass too (matching their runtime
15
+ * string-key indexing, e.g. `items.0`), so the predicate types them as the
16
+ * keyed form both traverse through.
17
+ */
18
+ export declare const isJsonObject: (value: JsonValue | undefined) => value is JsonObject;
19
+ /** Resolve a dot path (`slug.current`) against a document. */
20
+ export declare const getPath: (doc: JsonObject, path: string) => JsonValue | undefined;
21
+ export declare const isStringValue: (value: JsonValue | undefined) => value is string;
22
+ export declare const asString: (value: JsonValue | undefined) => string | undefined;
23
+ /** The elements of an array value, or none when the value is not an array. */
24
+ export declare const asArray: (value: JsonValue | undefined) => JsonValue[];
25
+ /** The object form of a value, or none when it is a scalar, array, or absent. */
26
+ export declare const asObject: (value: JsonValue | undefined) => JsonObject | undefined;
27
+ export declare const isNumberValue: (value: JsonValue | undefined) => value is number;
28
+ export declare const asNumber: (value: JsonValue | undefined) => number | undefined;
29
+ /** The object elements of an array value; scalars and nested arrays are dropped. */
30
+ export declare const objectsIn: (value: JsonValue | undefined) => JsonObject[];
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lexical (Payload's rich text editor) → Markdown. Covers the nodes Payload's
3
+ * default features emit — paragraphs, headings, lists (bullet, numbered,
4
+ * check), quotes, links, uploads, horizontal rules — and hands `block` /
5
+ * `inlineBlock` nodes to a serializer keyed by their `blockType`, or notes
6
+ * them in a comment.
7
+ */
8
+ import type { JsonObject } from "./json.ts";
9
+ export interface LexicalOptions {
10
+ /** The CMS origin a relative upload URL (`/media/x.png`) resolves against. */
11
+ baseUrl?: string;
12
+ /** Serializers for `block`/`inlineBlock` nodes, keyed by `fields.blockType`. */
13
+ serializers?: Record<string, (fields: JsonObject) => string>;
14
+ }
15
+ /**
16
+ * Serialize a Lexical editor state (`{ root: { children } }`, or the root
17
+ * node itself) to Markdown.
18
+ */
19
+ export declare const lexicalToMarkdown: (state: JsonObject, options?: LexicalOptions) => string;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared primitives for lowering a CMS's rich-text tree to Markdown text.
3
+ * Every rich-text lowerer (Portable Text, Contentful, Lexical, Strapi
4
+ * blocks) renders inline runs, wraps them in block syntax, and joins blocks
5
+ * with blank lines; these helpers keep that Markdown identical across them.
6
+ */
7
+ export declare const escapeMarkdownText: (text: string) => string;
8
+ /** The marks a lowerer can put on an inline run. */
9
+ export interface InlineMarks {
10
+ bold?: boolean;
11
+ code?: boolean;
12
+ italic?: boolean;
13
+ strike?: boolean;
14
+ }
15
+ /**
16
+ * A code span whose delimiter outruns any backtick run inside it, padded with
17
+ * a space on each side when the code starts or ends with a backtick (the
18
+ * CommonMark rule that keeps the padding out of the rendered code).
19
+ */
20
+ export declare const codeSpan: (code: string) => string;
21
+ /**
22
+ * Wrap a text run in the Markdown for its marks. Code stays verbatim inside
23
+ * the backticks (an escape would render as a backslash); everything else is
24
+ * escaped first. Whitespace at either edge moves outside the delimiters,
25
+ * since `** bold **` is not strong emphasis but `**bold**` is — editors
26
+ * routinely bold a word together with the space after it.
27
+ */
28
+ export declare const renderInline: (text: string, marks: InlineMarks) => string;
29
+ /** A link or image destination as Markdown can carry it verbatim. */
30
+ export declare const destination: (url: string) => string;
31
+ /**
32
+ * A Markdown link, or the label alone when the target is missing — or unsafe:
33
+ * CMS content is the editor's, not the site author's, so a destination that
34
+ * isn't a web, mail, or relative address (`javascript:`, `data:`) never
35
+ * becomes a clickable link on the docs site (see `safe-links.ts`).
36
+ */
37
+ export declare const renderLink: (label: string, href?: string) => string;
38
+ /** The ATX prefix for a heading level, clamped to Markdown's six. */
39
+ export declare const headingPrefix: (level: number) => string;
40
+ /** Quote every line of a block. */
41
+ export declare const blockquote: (text: string) => string;
42
+ /**
43
+ * A list item: the marker on the first line, and every continuation line
44
+ * indented to the marker's width so nested blocks stay inside the item.
45
+ */
46
+ export declare const listItem: (marker: string, body: string) => string;
47
+ /** Indent every non-empty line, for a nested list hanging off an item. */
48
+ export declare const indent: (text: string, width: number) => string;
49
+ /** A fenced code block whose fence outruns any backtick run in the code. */
50
+ export declare const codeFence: (code: string, language?: string) => string;
51
+ /** A Markdown image; the alt is escaped so a `]` in a caption can't close it. */
52
+ export declare const image: (alt: string, url: string) => string;
53
+ /**
54
+ * Whether a lowerer's output is written as MDX. Serializers are how a CMS
55
+ * block becomes a Blume component, and components (like directives) only
56
+ * render in MDX, so configuring any serializer switches the source's
57
+ * rich-text bodies to `.mdx`. The escaping above keeps the rest of the
58
+ * lowered text valid there.
59
+ */
60
+ export declare const writesMdx: <Node>(serializers?: Record<string, (node: Node) => string>) => boolean;
61
+ /**
62
+ * A comment marking a node the lowerer has no Markdown for — an MDX comment
63
+ * when the output is MDX, which rejects `<!-- -->`.
64
+ */
65
+ export declare const unsupported: (what: string, mdx?: boolean) => string;
66
+ /** Blocks separated by blank lines; empty blocks are dropped. */
67
+ export declare const joinBlocks: (blocks: string[]) => string;
68
+ /** A whole document: its blocks plus the trailing newline a file ends with. */
69
+ export declare const markdownDocument: (blocks: string[]) => string;
70
+ /**
71
+ * A media URL as a static site can reference it. A protocol-relative
72
+ * Contentful asset (`//images.ctfassets.net/…`) gets `https:`; a path a
73
+ * self-hosted CMS serves (`/uploads/x.png`) resolves against the CMS origin.
74
+ */
75
+ export declare const absoluteUrl: (url: string, base?: string) => string;
@@ -0,0 +1,28 @@
1
+ import type { ContentSource, SourceContext } from "./types.ts";
2
+ /** Options for the built-in remote Markdown/MDX source. */
3
+ export interface MdxRemoteSourceOptions {
4
+ name: string;
5
+ prefix?: string;
6
+ /** Raw base URL for `files`, e.g. `https://raw.githubusercontent.com/o/r/main/docs`. */
7
+ url?: string;
8
+ /** Explicit source-relative file paths to fetch from `url`. */
9
+ files?: string[];
10
+ /** Enumerate a GitHub repo subtree via the git-trees API. */
11
+ github?: {
12
+ owner: string;
13
+ repo: string;
14
+ ref: string;
15
+ path: string;
16
+ };
17
+ include: string[];
18
+ /** Opt-in dev polling interval (seconds); omit to freeze for the session. */
19
+ pollInterval?: number;
20
+ /** Injected for tests; defaults to the global `fetch`. */
21
+ fetchImpl?: typeof fetch;
22
+ }
23
+ /**
24
+ * Remote Markdown/MDX content source. Fetches raw `.md`/`.mdx` over HTTP and
25
+ * passes the text straight through `normalizeEntry`. A snapshot under
26
+ * `.blume/cache/<source>/` makes rebuilds offline-tolerant.
27
+ */
28
+ export declare const mdxRemoteSource: (options: MdxRemoteSourceOptions, ctx: SourceContext) => ContentSource;
@@ -0,0 +1,147 @@
1
+ import type { ResolvedI18nConfig } from "../schema.ts";
2
+ import type { Diagnostic, Heading, PageLink, PageRecord } from "../types.ts";
3
+ import type { NormalizeContext, SourceEntry } from "./types.ts";
4
+ /**
5
+ * Slugify a content/route slug (Sanity, Notion, frontmatter `slug`). Heading
6
+ * anchor ids are *not* slugged here — they use a `github-slugger` in
7
+ * {@link extractHeadings}, matching the renderer (see `markdown/heading-anchors`)
8
+ * so `blume validate` checks anchors against the exact rendered heading ids.
9
+ *
10
+ * The keep-class is Unicode letters/marks/numbers, not `\w`: ASCII slugs are
11
+ * unchanged, but a CJK/Cyrillic/accented slug keeps its characters instead of
12
+ * collapsing to `""` (which forced Sanity/Notion routes onto their opaque
13
+ * document-id fallbacks) or dropping accents (`café` → `caf`). NFC first so a
14
+ * macOS-NFD `é` (e + combining mark) slugs identically to the composed form.
15
+ */
16
+ export declare const slugify: (text: string) => string;
17
+ /**
18
+ * {@link slugify} for a slug that may span path segments (`guides/setup`).
19
+ * `slugify` deletes `/` along with all other punctuation, which would mash
20
+ * `guides/setup` into `guidessetup` — and collide it with a genuine `guidessetup`
21
+ * document. Each segment is slugged on its own and the separators kept.
22
+ */
23
+ export declare const slugifyPath: (text: string) => string;
24
+ export declare const HTML_COMMENT: RegExp;
25
+ export declare const INLINE_CODE: RegExp;
26
+ /** A heading whose trailing `{#id}` marker is unescaped — see `BARE_CURLY_MARKER`. */
27
+ export interface CurlyMarker {
28
+ id: string;
29
+ /** 1-based line of the heading (a setext heading's first text line) in the body. */
30
+ line: number;
31
+ }
32
+ /** Where a heading's text ends in the scanned text, for appending a marker. */
33
+ export interface HeadingSite {
34
+ /** 1-based line (of the text passed to `scanBody`) that any trailing marker ends. */
35
+ line: number;
36
+ /** True when the heading already pins its id with `[#id]`/`{#id}`. */
37
+ pinned: boolean;
38
+ }
39
+ /** Everything one walk over a body yields for the anchor index. */
40
+ export interface BodyScan {
41
+ /**
42
+ * Raw HTML element ids (`<a id="…">`) outside headings, fences, inline
43
+ * code, comments, and `<Prompt>` regions — fragment-link targets that
44
+ * `blume validate` accepts alongside heading slugs. Deduplicated, in
45
+ * document order.
46
+ */
47
+ anchors: string[];
48
+ /** Headings whose trailing `{#id}` marker is unescaped, for `.mdx` pages. */
49
+ curlyMarkers: CurlyMarker[];
50
+ headings: Heading[];
51
+ /** Index-aligned with `headings`: where each one's markers would go. */
52
+ sites: HeadingSite[];
53
+ }
54
+ /**
55
+ * Scan a body for its headings, explicit HTML anchors, and unescaped `{#id}`
56
+ * markers in one fence-aware walk (the same walk `extractHeadings` exposes for
57
+ * headings alone).
58
+ */
59
+ export declare const scanBody: (body: string) => BodyScan;
60
+ export declare const extractHeadings: (body: string) => Heading[];
61
+ export declare const MD_IMAGE: RegExp;
62
+ /** Column (0-based, within `matched`) where a link/image match's target starts. */
63
+ export declare const targetOffsetIn: (matched: string, target: string, title: string | undefined) => number;
64
+ export declare const extractLinks: (body: string, lineOffset?: number) => PageLink[];
65
+ export declare const extractComponentTags: (body: string) => string[];
66
+ /**
67
+ * Height of the frontmatter block stripped from `raw` to produce `body` (0
68
+ * when the raw text is unknown or nothing was stripped). Link positions are
69
+ * extracted from the stripped body, but diagnostics point into the raw
70
+ * document — recorded lines must shift by this offset to match it.
71
+ */
72
+ export declare const strippedLineOffset: (raw: string | undefined, body: string) => number;
73
+ /** Whether a raw frontmatter value is a string (e.g. the `type` override). */
74
+ export declare const isStringValue: (value: SourceEntry["data"][string]) => value is string;
75
+ /** What a route resolution needs from the owning source and the config. */
76
+ export type RouteContext = Pick<NormalizeContext, "i18n" | "versions"> & {
77
+ /** The source's route prefix (`NormalizeContext["source"]["prefix"]`). */
78
+ prefix?: string;
79
+ };
80
+ /** Where an entry's ref places it once its directories are read off. */
81
+ export interface EntryPlacement {
82
+ /**
83
+ * The locale codes the entry publishes in: `[""]` without i18n, one code for
84
+ * a placed file, every configured code for a shared `$` file.
85
+ */
86
+ locales: string[];
87
+ /** The ref with its version and locale directories stripped, prefix-less. */
88
+ navPath: string;
89
+ /** The version snapshot the entry belongs to (`""` for current). */
90
+ version: string;
91
+ }
92
+ /**
93
+ * Read the version and locale directories off an entry's ref. The version is
94
+ * detected first: a snapshot directory is outermost on disk
95
+ * (`v1.0/fr/page.mdx`), so the locale parser must see a version-stripped ref.
96
+ * The current version is `""` and lives at the root. Locale placement comes
97
+ * from the ref (a leading dir, or a filename suffix under the `dot` parser),
98
+ * never the slug — the slug is the logical, locale-agnostic path within a
99
+ * locale. A shared `$` file maps to every locale; a source without i18n
100
+ * placement maps to one.
101
+ */
102
+ export declare const placeEntryRef: (ref: string, ext: string, ctx: Pick<RouteContext, "i18n" | "versions">) => EntryPlacement;
103
+ /** Everything `normalizeEntry` derives from an entry's ref and slug. */
104
+ export interface EntryRoute extends Pick<EntryPlacement, "locales" | "version"> {
105
+ groups: string[];
106
+ /**
107
+ * The version-prefixed, locale-agnostic route — the translation key. Pass it
108
+ * through {@link localizedRoute} for the route one locale publishes at.
109
+ */
110
+ logicalRoute: string;
111
+ /** The prefixed, locale- and version-stripped nav path. */
112
+ navPath: string;
113
+ segments: string[];
114
+ /** The version-agnostic mapped route. */
115
+ versionKey: string;
116
+ }
117
+ /**
118
+ * The canonical route resolution, shared by {@link normalizeEntry} and any
119
+ * source that must predict the route an entry will publish at — the Obsidian
120
+ * source turns `[[Note]]` into a real href, and a second derivation of a route
121
+ * is a second answer.
122
+ *
123
+ * A frontmatter `slug` wins, then the adapter-supplied `entry.slug` (the typed
124
+ * SPI's "logical route input; defaults to ref if omitted"), then the ref. The
125
+ * extension is re-appended so `mapRoute`'s extname strip can't eat a dotted
126
+ * slug segment (`v1.2`). A slug that trims to nothing falls back. The version
127
+ * prefixes the mapped route *after* `mapRoute` runs: the mapped route is the
128
+ * version-agnostic key, the config id is prepended verbatim (never
129
+ * numeric-prefix-stripped), a frontmatter `slug` gets versionized so snapshots
130
+ * can't collide with the live page, and `translationKey` becomes
131
+ * version-specific for free. `basePath` is not applied here — it is outermost,
132
+ * after locale prefixing — so the result reads `{locale?}/{prefix?}/…`.
133
+ */
134
+ export declare const resolveEntryRoute: (entry: Pick<SourceEntry, "ref" | "slug">, ext: string, frontmatterSlug: string | undefined, ctx: RouteContext) => EntryRoute;
135
+ /** The route a logical route publishes at in one locale, base path excluded. */
136
+ export declare const localizedRoute: (logicalRoute: string, locale: string, i18n: ResolvedI18nConfig | undefined) => string;
137
+ /** The per-locale page records and diagnostics from one source entry. */
138
+ export interface NormalizedEntry {
139
+ pages: PageRecord[];
140
+ diagnostics: Diagnostic[];
141
+ }
142
+ /**
143
+ * Normalize one source entry into per-locale `PageRecord`s. This is the single
144
+ * funnel every adapter's entries pass through, so route mapping, heading/link
145
+ * extraction, and meta validation are identical regardless of origin.
146
+ */
147
+ export declare const normalizeEntry: (entry: SourceEntry, ctx: NormalizeContext) => NormalizedEntry;