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
@@ -1,1049 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- frontmatter_default,
4
- parseHeadingMarkers,
5
- HTML_COMMENT,
6
- contentIndexable,
7
- specOf,
8
- operationOf,
9
- specAddresses,
10
- operationSignature,
11
- isOpenApiSource,
12
- parseYouTubeId
13
- } from "./chunk-hdm2dkd2.js";
14
- import {
15
- readExpandedEntryText,
16
- rewriteRelativeImages
17
- } from "./chunk-450a7rcr.js";
18
- import {
19
- siteRoot,
20
- absoluteUrl
21
- } from "./chunk-88by27n5.js";
22
- import {
23
- OPENAPI_PATH,
24
- API_PAGES_PATH,
25
- API_CATALOG_PATH,
26
- hasApiCatalog
27
- } from "./chunk-tqa1s0k8.js";
28
- import {
29
- normalizeBasePath,
30
- withBasePath
31
- } from "./chunk-2mzebbbz.js";
32
-
33
- // src/ai/markdown.ts
34
- import { readFile } from "node:fs/promises";
35
-
36
- // src/ai/component-markdown.ts
37
- import { markdownTable } from "markdown-table";
38
- import { mdxToMdast } from "satteri";
39
-
40
- // src/markdown/features.ts
41
- var MARKDOWN_FEATURES = {
42
- subscript: true,
43
- superscript: true
44
- };
45
- var MDX_FEATURES = {
46
- ...MARKDOWN_FEATURES,
47
- directive: true,
48
- math: { singleDollarTextMath: false }
49
- };
50
-
51
- // src/ai/component-markdown.ts
52
- var isString = (value) => typeof value === "string";
53
- var isNumber = (value) => typeof value === "number";
54
- var evaluateExpression = (raw, frontmatter) => {
55
- try {
56
- const value = new Function("frontmatter", `"use strict"; return (${raw});`)(frontmatter);
57
- return { ok: true, value };
58
- } catch {
59
- return { ok: false, value: undefined };
60
- }
61
- };
62
- var readProps = (node, frontmatter) => {
63
- const props = {};
64
- let lossy = false;
65
- for (const attribute of node.attributes ?? []) {
66
- if (attribute.type !== "mdxJsxAttribute" || !attribute.name) {
67
- lossy = true;
68
- continue;
69
- }
70
- if (attribute.value === null || attribute.value === undefined) {
71
- props[attribute.name] = true;
72
- } else if (isString(attribute.value)) {
73
- props[attribute.name] = attribute.value;
74
- } else {
75
- const result = evaluateExpression(attribute.value.value, frontmatter);
76
- if (result.ok) {
77
- props[attribute.name] = result.value;
78
- } else {
79
- lossy = true;
80
- }
81
- }
82
- }
83
- return { lossy, props };
84
- };
85
- var hasOffsets = (node) => typeof node.position?.start?.offset === "number" && typeof node.position?.end?.offset === "number";
86
- var applySplices = (text, splices) => {
87
- let result = text;
88
- for (const splice of [...splices].toSorted((a, b) => b.start - a.start)) {
89
- const lineStart = result.lastIndexOf(`
90
- `, splice.start - 1) + 1;
91
- const prefix = result.slice(lineStart, splice.start);
92
- const indent = /^[\t ]+$/u.test(prefix) ? prefix : "";
93
- const replacement = indent ? splice.text.split(`
94
- `).map((line, index) => index === 0 || line === "" ? line : `${indent}${line}`).join(`
95
- `) : splice.text;
96
- result = result.slice(0, splice.start) + replacement + result.slice(splice.end);
97
- }
98
- return result;
99
- };
100
- var dedent = (text) => {
101
- const lines = text.split(`
102
- `);
103
- const rest = lines.slice(1).filter((line) => line.trim() !== "");
104
- if (rest.length === 0) {
105
- return text;
106
- }
107
- const indent = Math.min(...rest.map((line) => line.length - line.trimStart().length));
108
- if (indent === 0) {
109
- return text;
110
- }
111
- return [
112
- lines[0],
113
- ...lines.slice(1).map((line) => line.trim() === "" ? "" : line.slice(indent))
114
- ].join(`
115
- `);
116
- };
117
- var isJsxElement = (node) => node.type === "mdxJsxFlowElement" || node.type === "mdxJsxTextElement";
118
- var cellText = (value) => String(value ?? "").replaceAll(/\s*\n\s*/gu, " ").replaceAll("|", "\\|").trim();
119
- var cellCode = (value) => {
120
- const text = cellText(value);
121
- return text && !text.includes("`") ? `\`${text}\`` : text;
122
- };
123
- var isTypeEntryMap = (value) => typeof value === "object" && value !== null;
124
- var typeTable = ({ children, props }) => {
125
- const { type } = props;
126
- if (!isTypeEntryMap(type)) {
127
- return null;
128
- }
129
- const entries = Object.entries(type);
130
- const rows = entries.map(([name, info]) => {
131
- const prop = cellCode(`${name}${info.required ? "" : "?"}`);
132
- const typeCell = info.typeDescriptionLink ? `[${cellCode(info.type)}](${cellText(info.typeDescriptionLink)})` : cellCode(info.type);
133
- const defaultCell = info.default === undefined ? "-" : cellCode(info.default);
134
- const description = cellText([info.description, info.typeDescription].filter((part) => isString(part) && part !== "").join(" "));
135
- return [prop, typeCell, defaultCell, description];
136
- });
137
- const table = rows.length > 0 ? markdownTable([["Prop", "Type", "Default", "Description"], ...rows], {
138
- alignDelimiters: false
139
- }) : "";
140
- return [table, children].filter(Boolean).join(`
141
-
142
- `);
143
- };
144
- var callout = ({ children, props }) => {
145
- const type = isString(props.type) ? props.type : "info";
146
- const label = isString(props.title) && props.title !== "" ? props.title : type.charAt(0).toUpperCase() + type.slice(1);
147
- if (!children) {
148
- return `> **${label}**`;
149
- }
150
- const body = children.split(`
151
- `).map((line) => line.trim() === "" ? ">" : `> ${line}`).join(`
152
- `);
153
- return `> **${label}**
154
- >
155
- ${body}`;
156
- };
157
- var listItem = (index, content) => {
158
- const marker = `${index}. `;
159
- return content.split(`
160
- `).map((line, lineIndex) => {
161
- if (lineIndex === 0) {
162
- return `${marker}${line}`;
163
- }
164
- return line === "" ? "" : ` ${line}`;
165
- }).join(`
166
- `);
167
- };
168
- var steps = ({ childComponents, children }) => {
169
- const items = childComponents("Step");
170
- if (items.length === 0) {
171
- return children;
172
- }
173
- return items.map((step, index) => {
174
- const title = isString(step.props.title) && step.props.title !== "" ? `**${step.props.title}**` : "";
175
- const content = [title, step.children].filter(Boolean).join(`
176
-
177
- `);
178
- return listItem(index + 1, content);
179
- }).join(`
180
-
181
- `);
182
- };
183
- var tabs = ({ childComponents, children }) => {
184
- const items = childComponents("Tab");
185
- if (items.length === 0) {
186
- return children;
187
- }
188
- return items.map((tab, index) => {
189
- const title = isString(tab.props.title) && tab.props.title !== "" ? tab.props.title : `Tab ${index + 1}`;
190
- return tab.children ? `**${title}**
191
-
192
- ${tab.children}` : `**${title}**`;
193
- }).join(`
194
-
195
- `);
196
- };
197
- var linkText = (value) => value.replaceAll(/[[\]]/gu, String.raw`\$&`);
198
- var linkDestination = (href) => /[\s()<>]/u.test(href) ? `<${href.replaceAll(/[<>]/gu, String.raw`\$&`)}>` : href;
199
- var textProp = (value) => {
200
- if (isString(value)) {
201
- return value.trim();
202
- }
203
- return isNumber(value) ? String(value) : "";
204
- };
205
- var card = ({ children, lossy, props }) => {
206
- if (lossy) {
207
- return null;
208
- }
209
- const title = textProp(props.title);
210
- const href = isString(props.href) ? props.href.trim() : "";
211
- const body = children.trim();
212
- const cta = textProp(props.cta);
213
- const label = title || href;
214
- if (label === "") {
215
- const rest = [body, cta].filter(Boolean).join(`
216
-
217
- `);
218
- return rest === "" ? null : rest;
219
- }
220
- const head = href === "" ? `**${label}**` : `**[${linkText(label)}](${linkDestination(href)})**`;
221
- return [head, body, cta].filter(Boolean).join(`
222
-
223
- `);
224
- };
225
- var cardGroup = ({ childBlocks }) => childBlocks().map((block) => block.markdown).join(`
226
-
227
- `);
228
- var youtube = ({ props }) => {
229
- let input = "";
230
- if (isString(props.id)) {
231
- input = props.id;
232
- } else if (isString(props.url)) {
233
- input = props.url;
234
- }
235
- const videoId = parseYouTubeId(input);
236
- if (!videoId) {
237
- return null;
238
- }
239
- const start = isNumber(props.start) && props.start > 0 ? `&t=${Math.floor(props.start)}s` : "";
240
- const title = isString(props.title) && props.title !== "" ? props.title : "Watch on YouTube";
241
- return `[${title}](https://www.youtube.com/watch?v=${videoId}${start})`;
242
- };
243
- var inlineCode = (text) => {
244
- const runs = text.match(/`+/gu);
245
- const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
246
- const delimiter = "`".repeat(longest + 1);
247
- const padded = text.startsWith("`") || text.endsWith("`") ? ` ${text} ` : text;
248
- return `${delimiter}${padded}${delimiter}`;
249
- };
250
- var fencedBlock = (lang, code) => {
251
- const trimmed = code.replace(/(?<!\n)\n+$/u, "");
252
- const runs = trimmed.match(/`+/gu);
253
- const longest = runs ? Math.max(...runs.map((run) => run.length)) : 0;
254
- const fence = "`".repeat(Math.max(3, longest + 1));
255
- return `${fence}${lang}
256
- ${trimmed}
257
- ${fence}`;
258
- };
259
- var exampleComponentSerializers = (examples) => ({
260
- Component: ({ props }) => {
261
- const path = isString(props.path) ? props.path : undefined;
262
- const example = path === undefined ? undefined : examples[path];
263
- return example ? fencedBlock(example.lang, example.source) : null;
264
- }
265
- });
266
- var SERIALIZERS = {
267
- Callout: callout,
268
- Card: card,
269
- CardGroup: cardGroup,
270
- Steps: steps,
271
- Tabs: tabs,
272
- TypeTable: typeTable,
273
- YouTube: youtube
274
- };
275
- var escapeRegExp = (value) => value.replaceAll(/[$()*+.?[\\\]^{|}]/gu, String.raw`\$&`);
276
- var componentHint = (registry) => new RegExp(`<(?:${Object.keys(registry).map(escapeRegExp).join("|")})[\\s/>]`, "u");
277
- var BUILT_IN_HINT = componentHint(SERIALIZERS);
278
- var componentRegistry = (components) => components && Object.keys(components).length > 0 ? { ...SERIALIZERS, ...components } : SERIALIZERS;
279
- var renderSlice = (walk, start, end, nodes) => {
280
- const splices = [];
281
- collectSplices(walk, nodes, splices);
282
- const spliced = applySplices(walk.source.slice(start, end), splices.map((splice) => ({
283
- ...splice,
284
- end: splice.end - start,
285
- start: splice.start - start
286
- })));
287
- return dedent(spliced).trim();
288
- };
289
- var renderChildren = (walk, node) => {
290
- const children = (node.children ?? []).filter(hasOffsets);
291
- const [first] = children;
292
- if (!first) {
293
- return "";
294
- }
295
- const start = first.position.start.offset;
296
- return renderSlice(walk, start, children.at(-1)?.position.end.offset ?? start, children);
297
- };
298
- var renderBlock = (walk, node) => {
299
- const serializer = isJsxElement(node) && node.name ? walk.registry[node.name] : undefined;
300
- const text = serializer ? serializeElement(serializer, walk, node) : null;
301
- return text ?? renderSlice(walk, node.position.start.offset, node.position.end.offset, node.children ?? []);
302
- };
303
- var serializeElement = (serializer, walk, node) => serializer({
304
- ...readProps(node, walk.frontmatter),
305
- childBlocks: () => (node.children ?? []).filter(hasOffsets).map((child) => ({
306
- markdown: renderBlock(walk, child),
307
- name: isJsxElement(child) ? child.name : undefined
308
- })),
309
- childComponents: (name) => (node.children ?? []).filter((child) => isJsxElement(child) && child.name === name).map((child) => ({
310
- ...readProps(child, walk.frontmatter),
311
- children: renderChildren(walk, child)
312
- })),
313
- children: renderChildren(walk, node),
314
- frontmatter: walk.frontmatter ?? {}
315
- });
316
- var downlevelComponentNode = (node, walk) => {
317
- const serializer = node.type === "mdxJsxFlowElement" && node.name ? walk.registry[node.name] : undefined;
318
- return serializer && hasOffsets(node) ? serializeElement(serializer, walk, node) : null;
319
- };
320
- var collectSplices = (walk, nodes, out) => {
321
- for (const node of nodes) {
322
- const text = hasOffsets(node) ? downlevelComponentNode(node, walk) : null;
323
- if (text !== null && hasOffsets(node)) {
324
- out.push({
325
- end: node.position.end.offset,
326
- start: node.position.start.offset,
327
- text
328
- });
329
- continue;
330
- }
331
- collectSplices(walk, node.children ?? [], out);
332
- }
333
- };
334
- var downlevelComponents = (source, components, frontmatter) => {
335
- const registry = componentRegistry(components);
336
- const hint = registry === SERIALIZERS ? BUILT_IN_HINT : componentHint(registry);
337
- if (!hint.test(source)) {
338
- return source;
339
- }
340
- let tree;
341
- try {
342
- tree = mdxToMdast(source, { features: MDX_FEATURES });
343
- } catch {
344
- return source;
345
- }
346
- const splices = [];
347
- collectSplices({ frontmatter, registry, source }, tree.children ?? [], splices);
348
- return splices.length > 0 ? applySplices(source, splices) : source;
349
- };
350
-
351
- // src/deploy/rss.ts
352
- import { escape as escapeXml } from "html-escaper";
353
- var capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
354
- var pageDate = (page) => {
355
- const raw = page.meta.date ?? page.meta.changelog?.date;
356
- if (!raw) {
357
- return;
358
- }
359
- const date = new Date(raw);
360
- return Number.isNaN(date.getTime()) ? undefined : date;
361
- };
362
- var buildRssFeeds = (project) => {
363
- const { config } = project;
364
- const { rss } = config.seo;
365
- const { site } = config.deployment;
366
- if (!(rss.enabled && site)) {
367
- return [];
368
- }
369
- const base = siteRoot(site);
370
- const deployBase = normalizeBasePath(config.deployment.base);
371
- const rootLink = `${base}${deployBase}`;
372
- const feeds = [];
373
- for (const type of rss.types) {
374
- const pages = project.graph.pages.filter((page) => page.contentType === type && !(page.meta.draft || page.meta.sidebar.hidden));
375
- if (pages.length === 0) {
376
- continue;
377
- }
378
- const items = pages.map((page) => ({
379
- date: pageDate(page),
380
- description: page.description,
381
- link: encodeURI(`${base}${withBasePath(deployBase, page.route)}`),
382
- title: page.title
383
- })).toSorted((a, b) => (b.date?.getTime() ?? 0) - (a.date?.getTime() ?? 0)).slice(0, rss.limit);
384
- feeds.push({
385
- description: config.description,
386
- items,
387
- link: rootLink,
388
- path: `/${type}/rss.xml`,
389
- title: `${config.title} — ${capitalize(type)}`,
390
- type
391
- });
392
- }
393
- return feeds;
394
- };
395
- var renderItem = (item) => {
396
- const parts = [
397
- ` <title>${escapeXml(item.title)}</title>`,
398
- ` <link>${escapeXml(item.link)}</link>`,
399
- ` <guid isPermaLink="true">${escapeXml(item.link)}</guid>`
400
- ];
401
- if (item.description) {
402
- parts.push(` <description>${escapeXml(item.description)}</description>`);
403
- }
404
- if (item.date) {
405
- parts.push(` <pubDate>${item.date.toUTCString()}</pubDate>`);
406
- }
407
- return ` <item>
408
- ${parts.join(`
409
- `)}
410
- </item>`;
411
- };
412
- var renderRssFeed = (feed) => {
413
- const feedSelfHref = `${feed.link}${feed.path}`;
414
- const channel = [
415
- ` <title>${escapeXml(feed.title)}</title>`,
416
- ` <link>${escapeXml(feed.link)}</link>`,
417
- ` <description>${escapeXml(feed.description ?? feed.title)}</description>`,
418
- ` <atom:link href="${escapeXml(feedSelfHref)}" rel="self" type="application/rss+xml" />`
419
- ];
420
- const items = feed.items.map(renderItem).join(`
421
- `);
422
- return `<?xml version="1.0" encoding="UTF-8"?>
423
- <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
424
- <channel>
425
- ${channel.join(`
426
- `)}
427
- ${items}
428
- </channel>
429
- </rss>
430
- `;
431
- };
432
-
433
- // src/ai/openapi-components.ts
434
- var inlineText = (text) => text.trim().replaceAll(/\s+/gu, " ").replaceAll(/[\\`*_[\]<>~]/gu, String.raw`\$&`);
435
- var listItem2 = (signature, operation) => {
436
- const tail = [
437
- inlineText(operation.summary),
438
- operation.deprecated ? "Deprecated." : ""
439
- ].filter(Boolean).join(" ");
440
- return `- [${inlineCode(signature)}](${linkDestination(operation.route)})${tail ? ` — ${tail}` : ""}`;
441
- };
442
- var openapiComponentSerializers = (specs) => {
443
- const spec = (source) => isString(source) ? specOf(specs, source) : undefined;
444
- return {
445
- ApiOverview: ({ props }) => {
446
- const data = spec(props.source);
447
- if (!data) {
448
- return null;
449
- }
450
- const { addresses, label } = specAddresses(data);
451
- const lines = [
452
- data.version ? `Version ${inlineText(data.version)}` : "",
453
- addresses.length > 0 ? `${label}: ${addresses.map(inlineCode).join(", ")}` : ""
454
- ].filter(Boolean);
455
- return lines.length > 0 ? lines.join(`
456
-
457
- `) : null;
458
- },
459
- ApiTagOperations: ({ props }) => {
460
- const { tag } = props;
461
- const data = spec(props.source);
462
- if (!(data && isString(tag))) {
463
- return null;
464
- }
465
- const items = Object.values(data.operations).filter((operation) => operation.tagSlug === tag).map((operation) => listItem2(operationSignature(data, operation), operation));
466
- return items.length > 0 ? items.join(`
467
- `) : null;
468
- },
469
- Operation: ({ props }) => {
470
- const { id } = props;
471
- const data = spec(props.source);
472
- if (!(data && isString(id))) {
473
- return null;
474
- }
475
- const operation = operationOf(data, id);
476
- if (!operation) {
477
- return null;
478
- }
479
- const signature = inlineCode(operationSignature(data, operation));
480
- return operation.deprecated ? `${signature}
481
-
482
- **Deprecated.**` : signature;
483
- }
484
- };
485
- };
486
-
487
- // src/ai/serializers.ts
488
- var projectComponentSerializers = (project) => ({
489
- ...exampleComponentSerializers(project.examples ?? {}),
490
- ...openapiComponentSerializers(project.sources.find(isOpenApiSource)?.openApiData() ?? {}),
491
- ...project.config.ai.markdownComponents
492
- });
493
-
494
- // src/ai/skills.ts
495
- import { join } from "pathe";
496
-
497
- // src/ai/tar.ts
498
- import { createTar } from "nanotar";
499
- var encoder = new TextEncoder;
500
-
501
- // src/ai/skills.ts
502
- var AGENT_SKILLS_DIR = "/.well-known/agent-skills";
503
- var AGENT_SKILLS_INDEX_PATH = "/.well-known/agent-skills/index.json";
504
-
505
- // src/ai/visibility.ts
506
- var CODE_FENCE_BLOCK = /^(?<fence>`{3,}|~{3,})[^\n]*\n[\s\S]*?^\k<fence>[^\n]*(?=\n|$)/gmu;
507
- var FENCE_TOKEN = /\u0000blume-fence-(?<index>\d+)\u0000/gu;
508
- var visibilityBlock = (audience) => new RegExp(`<Visibility\\s+for\\s*=\\s*(?:"${audience}"|'${audience}')\\s*>(?<inner>[\\s\\S]*?)</Visibility\\s*>`, "gu");
509
- var BLOCKS = {
510
- agents: visibilityBlock("agents"),
511
- web: visibilityBlock("web")
512
- };
513
- var applyAudienceVisibility = (markdown, audience) => {
514
- const fences = [];
515
- const masked = markdown.replace(CODE_FENCE_BLOCK, (block) => {
516
- fences.push(block);
517
- return `\x00blume-fence-${fences.length - 1}\x00`;
518
- });
519
- let touched = false;
520
- const filtered = masked.replaceAll(BLOCKS[audience === "agents" ? "web" : "agents"], () => {
521
- touched = true;
522
- return "";
523
- }).replaceAll(BLOCKS[audience], (_match, inner) => {
524
- touched = true;
525
- return inner;
526
- });
527
- const tidied = touched ? filtered.replaceAll(/\n{3,}/gu, `
528
-
529
- `) : filtered;
530
- return tidied.replaceAll(FENCE_TOKEN, (token, index) => fences[Number(index)] ?? token);
531
- };
532
- var applyAgentVisibility = (markdown) => applyAudienceVisibility(markdown, "agents");
533
-
534
- // src/ai/llms.ts
535
- var pageUrl = (route, site, base = "") => {
536
- const path = withBasePath(base, route);
537
- return encodeURI(site ? absoluteUrl(site, path) : path);
538
- };
539
- var oneLine = (text) => text.replaceAll(/\s+/gu, " ").trim();
540
- var agentResourceLines = (project) => {
541
- const { config } = project;
542
- const { site } = config.deployment;
543
- const url = (path) => pageUrl(path, site, normalizeBasePath(config.deployment.base));
544
- const lines = [
545
- `- [llms-full.txt](${url("/llms-full.txt")}): The full Markdown of every page in one file.`,
546
- `- [Page Markdown](${url("/index.md")}): Append \`.md\` to any page URL to fetch that page as raw Markdown.`
547
- ];
548
- if (config.ai.api) {
549
- lines.push(`- [JSON API](${url(API_PAGES_PATH)}): Page index of the JSON docs API; each entry links the page's JSON and Markdown forms. Described by the OpenAPI document at ${url(OPENAPI_PATH)}.`);
550
- }
551
- if (config.ai.mcp.enabled) {
552
- lines.push(`- [MCP server](${url(config.ai.mcp.route)}): Streamable HTTP Model Context Protocol server with search_docs, get_page, list_pages, and get_navigation tools, plus every page as a resource. Discovery document: ${url("/.well-known/mcp.json")}`);
553
- }
554
- if (config.ai.skills) {
555
- lines.push(`- [Agent skills](${url(AGENT_SKILLS_INDEX_PATH)}): Agent Skills discovery index of the skills this site publishes.`);
556
- }
557
- if (hasApiCatalog(config)) {
558
- lines.push(`- [API catalog](${url(API_CATALOG_PATH)}): RFC 9727 linkset of the APIs documented here.`);
559
- }
560
- if (config.seo.agentReadability) {
561
- lines.push(`- [agent-readability.json](${url("/agent-readability.json")}): Manifest of every agent-facing artifact on this site.`);
562
- }
563
- if (site && config.seo.sitemap) {
564
- lines.push(`- [Sitemap](${url("/sitemap.xml")}): Every indexable page URL with its last-modified date.`);
565
- }
566
- return lines;
567
- };
568
- var eligiblePages = (project, options = {}) => project.graph.pages.filter((page) => !(page.meta.ai.exclude || page.meta.draft || page.meta.sidebar.hidden || page.meta.seo.noindex && page.source.name !== "openapi" || options.versions === "current" && page.version !== "") && (project.config.ai.llmsTxt.openapi || page.source.name !== "openapi"));
569
- var indexedNavigations = (project) => {
570
- const { i18n, versions } = project.config;
571
- const current = i18n ? i18n.locales.flatMap(({ code, label }) => {
572
- const nav = project.graph.navigationByLocale[code];
573
- if (!nav) {
574
- return [];
575
- }
576
- return [
577
- { label: code === i18n.defaultLocale ? undefined : label, nav }
578
- ];
579
- }) : [{ nav: project.graph.navigation }];
580
- const archived = (versions?.archived ?? []).flatMap((version) => {
581
- const byLocale = project.graph.navigationByVersion[version.id] ?? {};
582
- const versionLabel = `${version.label ?? version.id} (archived)`;
583
- return Object.entries(byLocale).flatMap(([code, nav]) => {
584
- const locale = i18n?.locales.find((entry) => entry.code === code);
585
- const label = locale && code !== i18n?.defaultLocale ? `${locale.label} — ${versionLabel}` : versionLabel;
586
- return [{ label, nav }];
587
- });
588
- });
589
- return [...current, ...archived];
590
- };
591
- var buildLlmsIndex = (project, options = {}) => {
592
- const { config } = project;
593
- const { site } = config.deployment;
594
- const base = normalizeBasePath(config.deployment.base);
595
- const eligible = eligiblePages(project);
596
- const byRoute = new Map(eligible.map((page) => [page.route, page]));
597
- const seen = new Set;
598
- const line = (page) => {
599
- seen.add(page.route);
600
- const summary = page.description ? `: ${page.description}` : "";
601
- return `- [${page.title}](${pageUrl(page.route, site, base)})${summary}`;
602
- };
603
- const renderLevel = (nodes, depth) => {
604
- const list = [];
605
- const groupBlocks = [];
606
- for (const node of nodes) {
607
- if (node.kind === "page") {
608
- const page = byRoute.get(node.route);
609
- if (page && !seen.has(page.route)) {
610
- list.push(line(page));
611
- }
612
- continue;
613
- }
614
- const rootPage = node.route ? byRoute.get(node.route) : undefined;
615
- const blocks = renderLevel(node.children, depth + 1);
616
- if (rootPage && !seen.has(rootPage.route)) {
617
- blocks.unshift(line(rootPage));
618
- }
619
- if (blocks.length > 0) {
620
- groupBlocks.push(`${"#".repeat(Math.min(depth, 6))} ${node.label}`, ...blocks);
621
- }
622
- }
623
- return list.length > 0 ? [list.join(`
624
- `), ...groupBlocks] : groupBlocks;
625
- };
626
- const renderNav = (nav, depth) => {
627
- const loose = nav.sidebar.filter((node) => node.kind === "page");
628
- const groups = nav.sidebar.filter((node) => node.kind === "group");
629
- const looseBlocks = renderLevel(loose, depth + 1);
630
- return [
631
- ...looseBlocks.length > 0 ? [`${"#".repeat(depth)} Docs`, ...looseBlocks] : [],
632
- ...renderLevel(groups, depth)
633
- ];
634
- };
635
- const blocks = [];
636
- for (const { label, nav } of indexedNavigations(project)) {
637
- if (label) {
638
- const localized = renderNav(nav, 3);
639
- if (localized.length > 0) {
640
- blocks.push(`## ${label}`, ...localized);
641
- }
642
- continue;
643
- }
644
- blocks.push(...renderNav(nav, 2));
645
- }
646
- const leftover = eligible.filter((page) => !seen.has(page.route)).toSorted((a, b) => a.route.localeCompare(b.route));
647
- if (leftover.length > 0) {
648
- blocks.push(blocks.length > 0 ? "## Other" : "## Docs", leftover.map(line).join(`
649
- `));
650
- }
651
- const feeds = buildRssFeeds(project);
652
- if (feeds.length > 0) {
653
- blocks.push("## RSS Feeds", feeds.map((feed) => `- [${feed.title}](${pageUrl(feed.path, site, base)})`).join(`
654
- `));
655
- }
656
- const skills = options.skills ?? [];
657
- if (skills.length > 0) {
658
- blocks.push("## Agent skills", skills.map((skill) => `- [${skill.name}](${pageUrl(`${AGENT_SKILLS_DIR}/${skill.path}`, site, base)}): ${oneLine(skill.description)}`).join(`
659
- `));
660
- }
661
- blocks.push("## Agent resources", agentResourceLines(project).join(`
662
- `));
663
- const header = config.description ? `# ${config.title}
664
-
665
- > ${config.description}` : `# ${config.title}`;
666
- const { details } = config.ai.llmsTxt;
667
- const lead = details ? `${header}
668
-
669
- ${details}` : header;
670
- return `${[lead, ...blocks].join(`
671
-
672
- `)}
673
- `;
674
- };
675
-
676
- // src/ai/markdown.ts
677
- var agentMarkdown = (entry) => entry.md ?? entry.mdx;
678
- var markdownTokenCount = (text) => Math.ceil(text.length / 4);
679
- var buildRawMarkdown = async (project) => {
680
- const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));
681
- const components = projectComponentSerializers(project);
682
- const readRoute = async (route) => {
683
- const page = pageById.get(route.id);
684
- if (page) {
685
- return await readExpandedEntryText(project, page);
686
- }
687
- return route.sourcePath ? await readFile(route.sourcePath, "utf-8") : "";
688
- };
689
- const entries = await Promise.all(project.manifest.routes.map(async (route) => {
690
- let text = await readRoute(route);
691
- if (route.sourcePath) {
692
- text = rewriteRelativeImages({
693
- deployBase: project.config.deployment.base,
694
- projectRoot: project.context.root,
695
- source: text,
696
- sourcePath: route.sourcePath
697
- });
698
- }
699
- const source = applyAgentVisibility(text);
700
- const md = downlevelComponents(source, components, frontmatter_default(source).data);
701
- const entry = md === source ? { mdx: source } : { md, mdx: source };
702
- return [route.path, entry];
703
- }));
704
- const map = Object.fromEntries(entries);
705
- if (!map["/"]) {
706
- map["/"] = { mdx: buildLlmsIndex(project) };
707
- }
708
- return map;
709
- };
710
- var markdownRoutePaths = (project) => {
711
- const paths = project.manifest.routes.map((route) => route.path);
712
- return paths.includes("/") ? paths : [...paths, "/"];
713
- };
714
-
715
- // src/search/documents.ts
716
- import { markdownToMdast, mdxToMdast as mdxToMdast2 } from "satteri";
717
-
718
- // src/markdown/fence-meta.ts
719
- var QUOTED_ATTR = /[\w-]+=(?:"[^"]*"|'[^']*')/gu;
720
- var LINE_RANGE = /\{[^}]*\}/u;
721
- var META_TOKEN = new RegExp(`${QUOTED_ATTR.source}|${LINE_RANGE.source}|\\S+`, "gu");
722
- var metaTokens = (meta) => meta?.match(META_TOKEN) ?? [];
723
- var RESERVED_META_KEYWORDS = new Set([
724
- "lineNumbers",
725
- "ts2js",
726
- "twoslash"
727
- ]);
728
- var isLineRange = (token) => token.startsWith("{");
729
-
730
- // src/markdown/code-title.ts
731
- var TITLE_ATTR = /(?:^|\s)title=(?:"(?<dq>[^"]*)"|'(?<sq>[^']*)')/u;
732
- var isTitleToken = (token) => token.length > 0 && !isLineRange(token) && !token.includes("=") && !RESERVED_META_KEYWORDS.has(token);
733
- var parseCodeTitle = (raw) => {
734
- if (!raw) {
735
- return;
736
- }
737
- const scrubbed = raw.replace(QUOTED_ATTR, (attr) => attr.startsWith("title=") ? attr : " ");
738
- const explicit = scrubbed.match(TITLE_ATTR);
739
- const attrTitle = explicit?.groups?.dq ?? explicit?.groups?.sq;
740
- if (attrTitle) {
741
- return attrTitle;
742
- }
743
- return metaTokens(raw).find(isTitleToken);
744
- };
745
-
746
- // src/search/facets.ts
747
- var isFacetValue = (value) => typeof value === "string" || typeof value === "number" || typeof value === "boolean";
748
- var pageFacets = (page, config) => {
749
- const declared = config.content.types[page.contentType]?.facets;
750
- if (!declared || declared.length === 0 || !page.custom) {
751
- return;
752
- }
753
- const facets = {};
754
- for (const key of declared) {
755
- const value = page.custom[key];
756
- if (isFacetValue(value)) {
757
- facets[key] = String(value);
758
- }
759
- }
760
- return Object.keys(facets).length > 0 ? facets : undefined;
761
- };
762
-
763
- // src/search/documents.ts
764
- var HTML_OR_JSX = /<\/?[a-zA-Z][^\n<>]*>|<\/?>/gu;
765
- var WHITESPACE = /\s+/gu;
766
- var INLINE_PARENTS = new Set([
767
- "delete",
768
- "emphasis",
769
- "footnoteReference",
770
- "link",
771
- "linkReference",
772
- "mdxJsxTextElement",
773
- "strong",
774
- "subscript",
775
- "superscript",
776
- "textDirective"
777
- ]);
778
- var NON_PROSE = new Set([
779
- "image",
780
- "imageReference",
781
- "inlineMath",
782
- "math",
783
- "mdxFlowExpression",
784
- "mdxTextExpression",
785
- "mdxjsEsm"
786
- ]);
787
- var MD_PARSE = { features: { ...MARKDOWN_FEATURES, frontmatter: false } };
788
- var MDX_PARSE = { features: { ...MDX_FEATURES, frontmatter: false } };
789
- var parseMdx = (markdown) => {
790
- try {
791
- return mdxToMdast2(markdown, MDX_PARSE);
792
- } catch {
793
- return;
794
- }
795
- };
796
- var parseMarkdown = (markdown, format) => format === "mdx" ? parseMdx(markdown) : markdownToMdast(markdown, MD_PARSE);
797
- var collectCode = (node, out, walk) => {
798
- if (!walk.includeCodeBlocks) {
799
- return;
800
- }
801
- const title = parseCodeTitle(node.meta ?? undefined);
802
- if (title) {
803
- out.push(title, " ");
804
- }
805
- out.push(node.value, " ");
806
- };
807
- var separatesWords = (node) => !INLINE_PARENTS.has(node.type) || node.children.length === 0;
808
- var collectText = (node, out, walk) => {
809
- if (NON_PROSE.has(node.type)) {
810
- return;
811
- }
812
- switch (node.type) {
813
- case "code": {
814
- collectCode(node, out, walk);
815
- return;
816
- }
817
- case "mdxJsxFlowElement": {
818
- const text = downlevelComponentNode(node, walk.downlevel);
819
- if (text !== null) {
820
- collectText(markdownToMdast(text, MD_PARSE), out, walk);
821
- return;
822
- }
823
- break;
824
- }
825
- case "inlineCode": {
826
- out.push(node.value);
827
- return;
828
- }
829
- case "html": {
830
- out.push(node.value.replaceAll(HTML_COMMENT, " ").replaceAll(HTML_OR_JSX, " "), " ");
831
- return;
832
- }
833
- case "break": {
834
- out.push(" ");
835
- return;
836
- }
837
- case "heading": {
838
- const last = node.children.at(-1);
839
- const trailing = last?.type === "text" ? last : undefined;
840
- const inner = [];
841
- const kept = trailing ? node.children.slice(0, -1) : node.children;
842
- for (const child of kept) {
843
- collectText(child, inner, walk);
844
- }
845
- if (trailing) {
846
- const stripped = parseHeadingMarkers(trailing.value).text;
847
- const literal = stripped === "" && node.children.length === 1;
848
- inner.push(literal ? trailing.value : stripped);
849
- }
850
- out.push(inner.join("").trimEnd(), " ");
851
- return;
852
- }
853
- default: {
854
- break;
855
- }
856
- }
857
- if ("value" in node) {
858
- out.push(node.value);
859
- return;
860
- }
861
- if ("children" in node) {
862
- for (const child of node.children) {
863
- collectText(child, out, walk);
864
- }
865
- if (separatesWords(node)) {
866
- out.push(" ");
867
- }
868
- }
869
- };
870
- var toPlainText = (markdown, format, walk) => {
871
- const tree = parseMarkdown(markdown, format);
872
- if (!tree) {
873
- return "";
874
- }
875
- const out = [];
876
- collectText(tree, out, walk);
877
- return out.join("").replaceAll(WHITESPACE, " ").trim();
878
- };
879
- var buildCrumbIndex = (sidebar) => {
880
- const index = new Map;
881
- const groupRoutes = new Map;
882
- const walk = (nodes, trail) => {
883
- for (const node of nodes) {
884
- if (node.kind === "group") {
885
- if (node.route && !groupRoutes.has(node.route)) {
886
- groupRoutes.set(node.route, {
887
- breadcrumb: [...trail, node.label],
888
- section: node.label
889
- });
890
- }
891
- walk(node.children, [...trail, node.label]);
892
- } else if (node.route) {
893
- index.set(node.route, {
894
- breadcrumb: trail,
895
- section: trail.at(-1) ?? ""
896
- });
897
- }
898
- }
899
- };
900
- walk(sidebar, []);
901
- for (const [route, crumbs] of groupRoutes) {
902
- if (!index.has(route)) {
903
- index.set(route, crumbs);
904
- }
905
- }
906
- return index;
907
- };
908
- var pageBody = async (project, page, options, components) => {
909
- if (!page) {
910
- return "";
911
- }
912
- const parsed = frontmatter_default(await readExpandedEntryText(project, page));
913
- const visible = applyAudienceVisibility(parsed.content, options?.audience ?? "web");
914
- if (options?.content === "markdown") {
915
- return downlevelComponents(visible.trim(), components, parsed.data);
916
- }
917
- return toPlainText(visible, page.format, {
918
- downlevel: {
919
- frontmatter: parsed.data,
920
- registry: componentRegistry(components),
921
- source: visible
922
- },
923
- includeCodeBlocks: project.config.search.indexing.includeCodeBlocks
924
- });
925
- };
926
- var buildSearchDocuments = async (project, options) => {
927
- const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));
928
- const byLocale = Object.values(project.graph.navigationByLocale ?? {});
929
- const byVersion = Object.values(project.graph.navigationByVersion ?? {}).flatMap((locales) => Object.values(locales)).map((nav) => nav.sidebar);
930
- const sidebars = [
931
- ...byLocale.length > 0 ? byLocale.map((nav) => nav.sidebar) : [project.graph.navigation?.sidebar ?? []],
932
- ...byVersion
933
- ];
934
- const crumbs = new Map;
935
- for (const sidebar of sidebars) {
936
- for (const [route, crumb] of buildCrumbIndex(sidebar)) {
937
- crumbs.set(route, crumb);
938
- }
939
- }
940
- const indexable = project.manifest.routes.filter((route) => {
941
- if (!options?.includeWhenDisabled) {
942
- return route.indexable;
943
- }
944
- const page = pageById.get(route.id);
945
- return page ? contentIndexable(page, project.config) : false;
946
- });
947
- const components = projectComponentSerializers(project);
948
- return await Promise.all(indexable.map(async (route) => {
949
- const page = pageById.get(route.id);
950
- const body = await pageBody(project, page, options, components);
951
- const tags = page?.meta?.search?.tags;
952
- const crumb = crumbs.get(route.path);
953
- const facets = page ? pageFacets(page, project.config) : undefined;
954
- const document = {
955
- breadcrumb: crumb?.breadcrumb ?? [],
956
- content: body,
957
- contentType: route.contentType,
958
- description: page?.description ?? "",
959
- locale: route.locale,
960
- route: route.path,
961
- section: crumb?.section || "Docs",
962
- tags: tags && tags.length > 0 ? tags : undefined,
963
- title: route.title,
964
- version: route.version
965
- };
966
- if (facets) {
967
- document.facets = facets;
968
- }
969
- return document;
970
- }));
971
- };
972
-
973
- // src/ai/mcp/data.ts
974
- var buildMcpData = async (project) => {
975
- const { config, graph, manifest } = project;
976
- const [documents, rawMarkdown] = await Promise.all([
977
- buildSearchDocuments(project, {
978
- audience: "agents",
979
- includeWhenDisabled: true
980
- }),
981
- buildRawMarkdown(project)
982
- ]);
983
- const pages = Object.fromEntries(Object.entries(rawMarkdown).map(([route, entry]) => [
984
- route,
985
- agentMarkdown(entry)
986
- ]));
987
- const pageById = new Map(graph.pages.map((page) => [page.id, page]));
988
- const routes = [];
989
- for (const route of manifest.routes) {
990
- if (route.hidden) {
991
- continue;
992
- }
993
- const page = pageById.get(route.id);
994
- const facets = page ? pageFacets(page, config) : undefined;
995
- const entry = {
996
- contentType: route.contentType,
997
- description: page?.description,
998
- indexable: route.indexable,
999
- lastModified: route.lastModified ?? null,
1000
- locale: route.locale,
1001
- route: route.path,
1002
- title: route.title,
1003
- version: route.version
1004
- };
1005
- if (facets) {
1006
- entry.facets = facets;
1007
- }
1008
- routes.push(entry);
1009
- }
1010
- const data = {
1011
- base: normalizeBasePath(config.deployment.base),
1012
- defaultLocale: config.i18n?.defaultLocale,
1013
- documents: documents.map((doc) => {
1014
- const document = {
1015
- content: doc.content,
1016
- contentType: doc.contentType,
1017
- description: doc.description,
1018
- locale: doc.locale,
1019
- route: doc.route,
1020
- title: doc.title,
1021
- version: doc.version
1022
- };
1023
- if (doc.facets) {
1024
- document.facets = doc.facets;
1025
- }
1026
- return document;
1027
- }),
1028
- instructions: config.ai.mcp.instructions,
1029
- name: config.ai.mcp.name ?? config.title,
1030
- navigation: graph.navigation,
1031
- pages,
1032
- routes,
1033
- site: config.deployment.site ?? null,
1034
- version: manifest.blumeVersion
1035
- };
1036
- if (config.versions) {
1037
- data.archivedVersions = config.versions.archived.map((version) => version.id);
1038
- data.navigationByVersion = graph.navigationByVersion;
1039
- }
1040
- if (config.i18n) {
1041
- data.navigationByLocale = graph.navigationByLocale;
1042
- }
1043
- return data;
1044
- };
1045
-
1046
- export { buildRssFeeds, renderRssFeed, agentMarkdown, markdownTokenCount, buildRawMarkdown, markdownRoutePaths, buildSearchDocuments, buildMcpData };
1047
-
1048
- //# debugId=C8F15B2ECD8107F364756E2164756E21
1049
- //# sourceMappingURL=chunk-wjt80jps.js.map