blume 2.1.3 → 2.2.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 (377) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +126 -0
  3. package/README.md +4 -4
  4. package/dist/cli/{chunk-74wfhv79.js → chunk-05f21r8h.js} +1 -1
  5. package/dist/cli/{chunk-9qzgg6mj.js → chunk-1cm0h819.js} +3 -3
  6. package/dist/cli/{chunk-nbyvgnnm.js → chunk-1rkxzg3n.js} +104 -47
  7. package/dist/cli/chunk-1rkxzg3n.js.map +36 -0
  8. package/dist/cli/{chunk-desvm72z.js → chunk-2nr29y95.js} +22 -26
  9. package/dist/cli/chunk-2nr29y95.js.map +13 -0
  10. package/dist/cli/{chunk-32khwcb6.js → chunk-49r370mb.js} +42 -69
  11. package/dist/cli/{chunk-32khwcb6.js.map → chunk-49r370mb.js.map} +9 -10
  12. package/dist/cli/{chunk-ms9z66nz.js → chunk-4rftmttv.js} +2 -2
  13. package/dist/cli/{chunk-s0bdnc7v.js → chunk-79bzzkx4.js} +5 -4
  14. package/dist/cli/chunk-79bzzkx4.js.map +10 -0
  15. package/dist/cli/{chunk-hvcxng5f.js → chunk-7tekknev.js} +6 -6
  16. package/dist/cli/{chunk-dv2z0rzf.js → chunk-8b489v1b.js} +38 -13
  17. package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-8b489v1b.js.map} +5 -4
  18. package/dist/cli/{chunk-0pmb4tr4.js → chunk-8f8xw4x2.js} +1195 -222
  19. package/dist/cli/chunk-8f8xw4x2.js.map +44 -0
  20. package/dist/cli/chunk-96snx8yy.js +329 -0
  21. package/dist/cli/chunk-96snx8yy.js.map +13 -0
  22. package/dist/cli/{chunk-ckrcm08h.js → chunk-a3ydrqny.js} +48 -62
  23. package/dist/cli/{chunk-ckrcm08h.js.map → chunk-a3ydrqny.js.map} +4 -5
  24. package/dist/cli/{chunk-bxwhtvw8.js → chunk-ahc5gc9h.js} +5 -5
  25. package/dist/cli/{chunk-dpy8qdjf.js → chunk-as09pafp.js} +73 -182
  26. package/dist/cli/chunk-as09pafp.js.map +18 -0
  27. package/dist/cli/{chunk-tfycddbt.js → chunk-bjk964fp.js} +2 -2
  28. package/dist/cli/{chunk-gfc5fqvf.js → chunk-br0n8n3e.js} +18 -18
  29. package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-br0n8n3e.js.map} +1 -1
  30. package/dist/cli/{chunk-297ajdcv.js → chunk-c69tw29j.js} +6 -6
  31. package/dist/cli/{chunk-297ajdcv.js.map → chunk-c69tw29j.js.map} +3 -3
  32. package/dist/cli/chunk-cn3dy3hz.js +146 -0
  33. package/dist/cli/chunk-cn3dy3hz.js.map +11 -0
  34. package/dist/cli/{chunk-124fvmzq.js → chunk-dm4mg9bj.js} +11064 -8742
  35. package/dist/cli/{chunk-124fvmzq.js.map → chunk-dm4mg9bj.js.map} +78 -64
  36. package/dist/cli/{chunk-dqhg54mr.js → chunk-dmx6cezx.js} +1 -1
  37. package/dist/cli/{chunk-60hz265r.js → chunk-dpcahcrb.js} +24 -11
  38. package/dist/cli/chunk-dpcahcrb.js.map +10 -0
  39. package/dist/cli/{chunk-a57yh0h9.js → chunk-dyk3r7jw.js} +7 -7
  40. package/dist/cli/{chunk-a57yh0h9.js.map → chunk-dyk3r7jw.js.map} +1 -1
  41. package/dist/cli/{chunk-twy7psdz.js → chunk-enk76qd5.js} +14 -10
  42. package/dist/cli/chunk-enk76qd5.js.map +10 -0
  43. package/dist/cli/{chunk-k3gr1nm9.js → chunk-fqy4n3q2.js} +13 -16
  44. package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-fqy4n3q2.js.map} +3 -3
  45. package/dist/cli/{chunk-sc93apfs.js → chunk-frk2wdq1.js} +17 -17
  46. package/dist/cli/{chunk-sc93apfs.js.map → chunk-frk2wdq1.js.map} +2 -2
  47. package/dist/cli/{chunk-kdpzw38a.js → chunk-gprwej7h.js} +95 -7
  48. package/dist/cli/chunk-gprwej7h.js.map +11 -0
  49. package/dist/cli/chunk-kkrteb15.js +157 -0
  50. package/dist/cli/chunk-kkrteb15.js.map +10 -0
  51. package/dist/cli/{chunk-ave1wcbr.js → chunk-m9bp2hc1.js} +1 -1
  52. package/dist/cli/{chunk-58bt3hag.js → chunk-mrvh4c88.js} +4 -4
  53. package/dist/cli/{chunk-5cmts6dv.js → chunk-p8zg3a2h.js} +7 -7
  54. package/dist/cli/{chunk-5cmts6dv.js.map → chunk-p8zg3a2h.js.map} +1 -1
  55. package/dist/cli/{chunk-0w6hs479.js → chunk-rkqae7kh.js} +30 -18
  56. package/dist/cli/chunk-rkqae7kh.js.map +10 -0
  57. package/dist/cli/{chunk-bqxaqn5p.js → chunk-t5xx74rd.js} +8 -8
  58. package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-t5xx74rd.js.map} +1 -1
  59. package/dist/cli/{chunk-1f882900.js → chunk-th0pgaj5.js} +2 -2
  60. package/dist/cli/{chunk-dhwtqnnd.js → chunk-vnbvhgmd.js} +2 -2
  61. package/dist/cli/{chunk-gxtg6ed2.js → chunk-vzy9rh6y.js} +21 -21
  62. package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-vzy9rh6y.js.map} +3 -3
  63. package/dist/cli/{chunk-j1x92mx9.js → chunk-w6e455pz.js} +1 -1
  64. package/dist/cli/chunk-wehv26ry.js +155 -0
  65. package/dist/cli/chunk-wehv26ry.js.map +11 -0
  66. package/dist/cli/{chunk-y4msrwm9.js → chunk-xgq4eytj.js} +15 -15
  67. package/dist/cli/{chunk-36bxs9c7.js → chunk-xt0qvz1t.js} +27 -23
  68. package/dist/cli/chunk-xt0qvz1t.js.map +10 -0
  69. package/dist/cli/index.js +78 -42
  70. package/dist/cli/index.js.map +7 -6
  71. package/dist/types/ai/changelog-components.d.ts +18 -0
  72. package/dist/types/ai/changelog-markdown.d.ts +12 -0
  73. package/dist/types/ai/openapi-components.d.ts +7 -7
  74. package/dist/types/ai/operation-details.d.ts +39 -0
  75. package/dist/types/ai/relative-links.d.ts +3 -1
  76. package/dist/types/ai/serializers.d.ts +6 -4
  77. package/dist/types/analytics/head.d.ts +4 -2
  78. package/dist/types/analytics/script.d.ts +8 -2
  79. package/dist/types/components/content/youtube.d.ts +20 -0
  80. package/dist/types/components/layout/nav-utils.d.ts +8 -0
  81. package/dist/types/components/openapi/example-panels.d.ts +33 -0
  82. package/dist/types/components/openapi/helpers.d.ts +53 -11
  83. package/dist/types/components/openapi/snippets.d.ts +7 -1
  84. package/dist/types/core/alert-diagnostics.d.ts +10 -0
  85. package/dist/types/core/builtin-tags.d.ts +16 -0
  86. package/dist/types/core/changelog-list.d.ts +48 -0
  87. package/dist/types/core/closest-match.d.ts +6 -0
  88. package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
  89. package/dist/types/core/code-fences.d.ts +8 -1
  90. package/dist/types/core/config-input.d.ts +1 -1
  91. package/dist/types/core/content-assets.d.ts +16 -18
  92. package/dist/types/core/diagnostics.d.ts +14 -0
  93. package/dist/types/core/directive-diagnostics.d.ts +22 -8
  94. package/dist/types/core/former-routes.d.ts +14 -0
  95. package/dist/types/core/github.d.ts +5 -4
  96. package/dist/types/core/heading-markers.d.ts +65 -2
  97. package/dist/types/core/hidden-pages.d.ts +3 -0
  98. package/dist/types/core/includes.d.ts +23 -0
  99. package/dist/types/core/last-modified.d.ts +18 -6
  100. package/dist/types/core/links.d.ts +42 -2
  101. package/dist/types/core/load-module.d.ts +19 -4
  102. package/dist/types/core/manifest.d.ts +14 -1
  103. package/dist/types/core/markdown-mirrors.d.ts +22 -0
  104. package/dist/types/core/mdx-elements.d.ts +32 -0
  105. package/dist/types/core/mdx-syntax.d.ts +100 -0
  106. package/dist/types/core/meta-diagnostics.d.ts +7 -0
  107. package/dist/types/core/meta.d.ts +32 -5
  108. package/dist/types/core/nav-diagnostics.d.ts +9 -2
  109. package/dist/types/core/navigation.d.ts +13 -0
  110. package/dist/types/core/ordering-prefix.d.ts +6 -0
  111. package/dist/types/core/pinned-ids.d.ts +23 -0
  112. package/dist/types/core/project-graph.d.ts +9 -1
  113. package/dist/types/core/redirect-patterns.d.ts +18 -0
  114. package/dist/types/core/relative-files.d.ts +31 -0
  115. package/dist/types/core/schema.d.ts +267 -7
  116. package/dist/types/core/sources/normalize.d.ts +101 -9
  117. package/dist/types/core/sources/types.d.ts +16 -0
  118. package/dist/types/core/static-files.d.ts +10 -0
  119. package/dist/types/core/static-host.d.ts +42 -0
  120. package/dist/types/core/svg-images.d.ts +26 -0
  121. package/dist/types/core/syntax-diagnostics.d.ts +14 -0
  122. package/dist/types/core/types.d.ts +42 -1
  123. package/dist/types/deploy/generated-files.d.ts +41 -0
  124. package/dist/types/deploy/redirects.d.ts +21 -7
  125. package/dist/types/markdown/code-title.d.ts +9 -5
  126. package/dist/types/markdown/directives.d.ts +8 -0
  127. package/dist/types/markdown/fence-language.d.ts +51 -0
  128. package/dist/types/markdown/fence-meta.d.ts +5 -0
  129. package/dist/types/markdown/github-alerts.d.ts +35 -0
  130. package/dist/types/openapi/asyncapi.d.ts +6 -5
  131. package/dist/types/openapi/checks.d.ts +10 -5
  132. package/dist/types/openapi/model.d.ts +55 -8
  133. package/dist/types/openapi/parse.d.ts +4 -1
  134. package/dist/types/sources/filesystem.d.ts +14 -4
  135. package/dist/types/sources/mdx-remote.d.ts +6 -3
  136. package/dist/types/sources/registry.d.ts +3 -3
  137. package/dist/types/theme/color.d.ts +33 -0
  138. package/dist/types/theme/palette.d.ts +122 -0
  139. package/docs/01-quickstart.mdx +1 -1
  140. package/docs/02-deployment.mdx +23 -8
  141. package/docs/04-migrating.mdx +16 -4
  142. package/docs/advanced/changelog.mdx +27 -1
  143. package/docs/advanced/skills.mdx +1 -1
  144. package/docs/cli/audit.mdx +1 -1
  145. package/docs/cli/doctor.mdx +2 -2
  146. package/docs/cli/evals.mdx +1 -1
  147. package/docs/cli/index.mdx +4 -2
  148. package/docs/cli/validate.mdx +10 -7
  149. package/docs/configuration/analytics.mdx +2 -0
  150. package/docs/configuration/customization.mdx +3 -1
  151. package/docs/configuration/index.mdx +2 -2
  152. package/docs/configuration/theming.mdx +5 -1
  153. package/docs/content/components.mdx +26 -6
  154. package/docs/content/frontmatter.mdx +1 -1
  155. package/docs/content/includes.mdx +6 -2
  156. package/docs/content/index.mdx +11 -1
  157. package/docs/content/islands.mdx +2 -0
  158. package/docs/content/meta.mdx +9 -3
  159. package/docs/content/navigation.mdx +14 -6
  160. package/docs/content/sources/obsidian.mdx +1 -1
  161. package/docs/content/sources/remote-mdx.mdx +3 -1
  162. package/docs/content/syntax.mdx +76 -8
  163. package/docs/content/variables.mdx +3 -1
  164. package/docs/discoverability/agent-discovery.mdx +1 -1
  165. package/docs/discoverability/json-api.mdx +1 -1
  166. package/docs/discoverability/llms-txt.mdx +1 -1
  167. package/docs/discoverability/markdown.mdx +2 -2
  168. package/docs/discoverability/open-graph.mdx +1 -1
  169. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  170. package/docs/references/graphql.mdx +2 -0
  171. package/docs/references/openapi.mdx +45 -7
  172. package/package.json +4 -4
  173. package/skills/blume/SKILL.md +2 -2
  174. package/skills/blume-migrate/SKILL.md +49 -27
  175. package/skills/blume-migrate/references/docsify.md +262 -0
  176. package/skills/blume-migrate/references/docus.md +298 -0
  177. package/skills/blume-migrate/references/docusaurus.md +3 -3
  178. package/skills/blume-migrate/references/fern.md +327 -0
  179. package/skills/blume-migrate/references/fumadocs.md +1 -1
  180. package/skills/blume-migrate/references/gitbook.md +267 -0
  181. package/skills/blume-migrate/references/github-wiki.md +259 -0
  182. package/skills/blume-migrate/references/jekyll.md +253 -0
  183. package/skills/blume-migrate/references/mdbook.md +256 -0
  184. package/skills/blume-migrate/references/mintlify.md +5 -5
  185. package/skills/blume-migrate/references/mkdocs.md +236 -0
  186. package/skills/blume-migrate/references/monorepo.md +20 -8
  187. package/skills/blume-migrate/references/nextra.md +2 -2
  188. package/skills/blume-migrate/references/readme.md +257 -0
  189. package/skills/blume-migrate/references/redocly.md +198 -0
  190. package/skills/blume-migrate/references/starlight.md +3 -3
  191. package/skills/blume-migrate/references/vitepress.md +204 -0
  192. package/skills/blume-migrate/references/vuepress.md +271 -0
  193. package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
  194. package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
  195. package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
  196. package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
  197. package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
  198. package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
  199. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
  200. package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
  201. package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
  202. package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
  203. package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
  204. package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
  205. package/src/ai/changelog-components.ts +24 -0
  206. package/src/ai/changelog-markdown.ts +45 -41
  207. package/src/ai/component-markdown.ts +22 -9
  208. package/src/ai/llms.ts +36 -5
  209. package/src/ai/markdown.ts +2 -2
  210. package/src/ai/openapi-components.ts +25 -9
  211. package/src/ai/operation-details.ts +208 -0
  212. package/src/ai/relative-links.ts +48 -8
  213. package/src/ai/serializers.ts +7 -6
  214. package/src/ai/site-skill.ts +6 -2
  215. package/src/analytics/head.ts +11 -5
  216. package/src/analytics/script.ts +13 -3
  217. package/src/astro/generate.ts +32 -6
  218. package/src/astro/index.ts +1 -0
  219. package/src/astro/integration.ts +27 -1
  220. package/src/astro/mdx-source-errors.ts +46 -0
  221. package/src/astro/templates.ts +89 -185
  222. package/src/audit/checks/redirects.ts +5 -1
  223. package/src/audit/redirects.ts +36 -19
  224. package/src/audit/report.ts +22 -9
  225. package/src/audit/run.ts +12 -28
  226. package/src/audit/terms.ts +23 -0
  227. package/src/audit/url.ts +2 -2
  228. package/src/cli/build-failure.ts +256 -7
  229. package/src/cli/command-meta.ts +1 -1
  230. package/src/cli/commands/audit.ts +1 -1
  231. package/src/cli/commands/build.ts +12 -3
  232. package/src/cli/commands/check.ts +13 -2
  233. package/src/cli/commands/dev.ts +1 -1
  234. package/src/cli/commands/doctor.ts +4 -2
  235. package/src/cli/commands/init.ts +3 -3
  236. package/src/cli/commands/preview.ts +17 -1
  237. package/src/cli/commands/validate.ts +22 -10
  238. package/src/cli/prepare.ts +1 -1
  239. package/src/cli/preview-pages.ts +161 -0
  240. package/src/cli/unknown-flags.ts +1 -42
  241. package/src/components/code-copy.ts +51 -0
  242. package/src/components/code-language.ts +75 -0
  243. package/src/components/content/AccordionItem.astro +16 -1
  244. package/src/components/content/Callout.astro +11 -1
  245. package/src/components/content/Changelog.astro +189 -0
  246. package/src/components/content/CodeBlock.astro +8 -11
  247. package/src/components/content/Tabs.astro +16 -2
  248. package/src/components/content/YouTube.astro +6 -4
  249. package/src/components/content/code-block.ts +33 -0
  250. package/src/components/content/content-strings.ts +5 -1
  251. package/src/components/content/inline-markdown.ts +35 -8
  252. package/src/components/content/youtube.ts +49 -7
  253. package/src/components/layout/Analytics.astro +5 -1
  254. package/src/components/layout/NavTree.astro +8 -3
  255. package/src/components/layout/RootLayout.astro +18 -31
  256. package/src/components/layout/nav-utils.ts +14 -0
  257. package/src/components/layout/search/pagefind.ts +2 -1
  258. package/src/components/openapi/Operation.astro +4 -0
  259. package/src/components/openapi/PanelTabs.astro +9 -3
  260. package/src/components/openapi/RequestBody.astro +42 -8
  261. package/src/components/openapi/RequestPanel.astro +34 -53
  262. package/src/components/openapi/example-panels.ts +110 -0
  263. package/src/components/openapi/helpers.ts +195 -20
  264. package/src/components/openapi/operation-model.ts +63 -26
  265. package/src/components/openapi/request.ts +13 -0
  266. package/src/components/openapi/snippets.ts +14 -2
  267. package/src/core/alert-diagnostics.ts +89 -0
  268. package/src/core/builtin-tags.ts +76 -0
  269. package/src/core/changelog-list.ts +87 -0
  270. package/src/core/closest-match.ts +41 -0
  271. package/src/core/code-fence-diagnostics.ts +267 -0
  272. package/src/core/code-fences.ts +43 -7
  273. package/src/core/component-diagnostics.ts +65 -12
  274. package/src/core/config-input.ts +1 -1
  275. package/src/core/config.ts +46 -1
  276. package/src/core/content-assets.ts +64 -144
  277. package/src/core/diagnostics.ts +36 -3
  278. package/src/core/directive-diagnostics.ts +265 -47
  279. package/src/core/former-routes.ts +46 -0
  280. package/src/core/git-ignored.ts +53 -0
  281. package/src/core/github.ts +5 -4
  282. package/src/core/heading-markers.ts +156 -2
  283. package/src/core/hidden-pages.ts +64 -0
  284. package/src/core/includes.ts +181 -41
  285. package/src/core/last-modified.ts +47 -10
  286. package/src/core/links.ts +438 -83
  287. package/src/core/load-module.ts +98 -9
  288. package/src/core/manifest.ts +12 -9
  289. package/src/core/markdown-mirrors.ts +52 -0
  290. package/src/core/mdx-elements.ts +153 -0
  291. package/src/core/mdx-syntax.ts +377 -0
  292. package/src/core/meta-diagnostics.ts +134 -0
  293. package/src/core/meta.ts +154 -55
  294. package/src/core/nav-diagnostics.ts +16 -4
  295. package/src/core/navigation.ts +70 -10
  296. package/src/core/ordering-prefix.ts +22 -2
  297. package/src/core/pinned-ids.ts +141 -0
  298. package/src/core/project-graph.ts +221 -29
  299. package/src/core/redirect-patterns.ts +41 -0
  300. package/src/core/relative-files.ts +145 -0
  301. package/src/core/schema.ts +17 -3
  302. package/src/core/sources/mdx-remote.ts +75 -14
  303. package/src/core/sources/normalize.ts +885 -179
  304. package/src/core/sources/notion.ts +5 -4
  305. package/src/core/sources/obsidian.ts +2 -5
  306. package/src/core/sources/types.ts +17 -0
  307. package/src/core/static-files.ts +40 -0
  308. package/src/core/static-host.ts +125 -0
  309. package/src/core/svg-images.ts +98 -0
  310. package/src/core/syntax-diagnostics.ts +491 -0
  311. package/src/core/types.ts +43 -1
  312. package/src/deploy/artifacts.ts +2 -28
  313. package/src/deploy/generated-files.ts +128 -0
  314. package/src/deploy/platforms/vercel.ts +25 -1
  315. package/src/deploy/redirects.ts +43 -16
  316. package/src/deploy/sitemap.ts +2 -1
  317. package/src/markdown/base-links.ts +87 -6
  318. package/src/markdown/code-title.ts +29 -13
  319. package/src/markdown/content-assets.ts +210 -0
  320. package/src/markdown/directives.ts +69 -5
  321. package/src/markdown/fence-language.ts +106 -0
  322. package/src/markdown/fence-meta.ts +42 -0
  323. package/src/markdown/github-alerts.ts +172 -0
  324. package/src/markdown/heading-anchors.ts +265 -56
  325. package/src/markdown/include.ts +30 -3
  326. package/src/markdown/index.ts +145 -40
  327. package/src/markdown/prompt-text.ts +95 -0
  328. package/src/markdown/relative-links.ts +37 -2
  329. package/src/markdown/route-snapshot.ts +22 -12
  330. package/src/markdown/svg-fallback.ts +51 -0
  331. package/src/markdown/title-heading.ts +134 -0
  332. package/src/migrate/migrate.ts +127 -2
  333. package/src/og/card.ts +14 -4
  334. package/src/openapi/asyncapi.ts +14 -6
  335. package/src/openapi/checks.ts +160 -15
  336. package/src/openapi/model.ts +172 -33
  337. package/src/openapi/parse.ts +13 -4
  338. package/src/openapi/render-mdx.ts +55 -9
  339. package/src/openapi/source.ts +87 -6
  340. package/src/registry/eject.ts +0 -1
  341. package/src/search/documents.ts +10 -2
  342. package/src/sources/filesystem.ts +28 -3
  343. package/src/sources/mdx-remote.ts +7 -15
  344. package/src/theme/color.ts +14 -0
  345. package/src/theme/entry.ts +22 -1
  346. package/src/theme/palette.ts +74 -1
  347. package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
  348. package/dist/cli/chunk-0w6hs479.js.map +0 -10
  349. package/dist/cli/chunk-150jk7km.js +0 -52
  350. package/dist/cli/chunk-150jk7km.js.map +0 -10
  351. package/dist/cli/chunk-36bxs9c7.js.map +0 -10
  352. package/dist/cli/chunk-53jqw8z0.js +0 -89
  353. package/dist/cli/chunk-53jqw8z0.js.map +0 -10
  354. package/dist/cli/chunk-60hz265r.js.map +0 -10
  355. package/dist/cli/chunk-desvm72z.js.map +0 -14
  356. package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
  357. package/dist/cli/chunk-es8h0v3j.js +0 -441
  358. package/dist/cli/chunk-es8h0v3j.js.map +0 -11
  359. package/dist/cli/chunk-kdpzw38a.js.map +0 -11
  360. package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
  361. package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
  362. package/dist/cli/chunk-twy7psdz.js.map +0 -10
  363. package/dist/cli/chunk-ydp3065p.js +0 -64
  364. package/dist/cli/chunk-ydp3065p.js.map +0 -10
  365. /package/dist/cli/{chunk-74wfhv79.js.map → chunk-05f21r8h.js.map} +0 -0
  366. /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-1cm0h819.js.map} +0 -0
  367. /package/dist/cli/{chunk-ms9z66nz.js.map → chunk-4rftmttv.js.map} +0 -0
  368. /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-7tekknev.js.map} +0 -0
  369. /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-ahc5gc9h.js.map} +0 -0
  370. /package/dist/cli/{chunk-tfycddbt.js.map → chunk-bjk964fp.js.map} +0 -0
  371. /package/dist/cli/{chunk-dqhg54mr.js.map → chunk-dmx6cezx.js.map} +0 -0
  372. /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-m9bp2hc1.js.map} +0 -0
  373. /package/dist/cli/{chunk-58bt3hag.js.map → chunk-mrvh4c88.js.map} +0 -0
  374. /package/dist/cli/{chunk-1f882900.js.map → chunk-th0pgaj5.js.map} +0 -0
  375. /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-vnbvhgmd.js.map} +0 -0
  376. /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-w6e455pz.js.map} +0 -0
  377. /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-xgq4eytj.js.map} +0 -0
@@ -1,16 +1,100 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+
1
4
  import { createJiti } from "jiti";
5
+ import type { Jiti, JitiOptions } from "jiti";
6
+ import { join } from "pathe";
7
+ import { z } from "zod";
8
+
9
+ import { packageRoot } from "./package-root.ts";
10
+
11
+ /**
12
+ * Blume's own `exports` map, each entry reduced to the file it runs from: the
13
+ * target itself, or a conditions object's `default` (its `types` is only for
14
+ * the consumer's typechecker).
15
+ */
16
+ const blumeExportsSchema = z.object({
17
+ exports: z.record(
18
+ z.string(),
19
+ z.union([
20
+ z.string(),
21
+ z.object({ default: z.string() }).transform((target) => target.default),
22
+ ])
23
+ ),
24
+ });
25
+
26
+ let aliases: Record<string, string> | undefined;
27
+
28
+ /**
29
+ * jiti aliases that resolve `blume` and every subpath it exports to the
30
+ * running Blume package, read from its own `exports` map. Without them a user
31
+ * module resolves `blume` by walking up from its own folder, so a `meta.ts`
32
+ * under a content root outside the project (`content.root: "../docs"`, a
33
+ * sibling workspace package) or a file `blume.config.ts` imports from beside
34
+ * the project can't find the `blume` installed in the project. A wildcard
35
+ * export (`./core/*`) becomes a prefix alias (`blume/core/`), which jiti
36
+ * extends with the rest of the specifier.
37
+ */
38
+ export const blumeModuleAliases = (): Record<string, string> => {
39
+ if (!aliases) {
40
+ const root = packageRoot();
41
+ const { exports } = blumeExportsSchema.parse(
42
+ JSON.parse(readFileSync(join(root, "package.json"), "utf-8"))
43
+ );
44
+ aliases = Object.fromEntries(
45
+ Object.entries(exports).map(([subpath, target]) => [
46
+ join("blume", subpath).replace(/\*$/u, ""),
47
+ join(root, target).replace(/\*$/u, ""),
48
+ ])
49
+ );
50
+ }
51
+ return aliases;
52
+ };
53
+
54
+ /**
55
+ * An import through one jiti instance for every file a loader is called with,
56
+ * created on its first call so that importing this module (the `blume` barrel
57
+ * reaches it through `defineConfig`) reads nothing from disk. `moduleCache:
58
+ * false` ensures edits are picked up on each load, which is what makes
59
+ * dev-server regeneration reflect config/meta changes.
60
+ *
61
+ * Each import leaves `Error.prepareStackTrace` as it found it. The first file
62
+ * jiti compiles loads its bundled Babel, which wraps that formatter for the
63
+ * whole process to hide its own frames. Under Bun the wrapper hands off to
64
+ * Bun's native formatter, which throws for an object that isn't a native
65
+ * `Error`, and Vite's bundled follow-redirects captures a stack trace on one
66
+ * as it loads, so importing Astro or Vite after a compiled config or meta file
67
+ * would crash.
68
+ */
69
+ const lazyImport = (
70
+ options: JitiOptions
71
+ ): ((file: string) => Promise<{ default?: unknown }>) => {
72
+ let jiti: Jiti | undefined;
73
+ return async (file) => {
74
+ jiti ??= createJiti(import.meta.url, {
75
+ ...options,
76
+ alias: blumeModuleAliases(),
77
+ moduleCache: false,
78
+ });
79
+ const { prepareStackTrace } = Error;
80
+ try {
81
+ return await jiti.import<{ default?: unknown }>(file);
82
+ } finally {
83
+ Error.prepareStackTrace = prepareStackTrace;
84
+ }
85
+ };
86
+ };
2
87
 
3
88
  /**
4
89
  * Create a loader for user-authored ESM/TS modules (`blume.config.ts`,
5
- * `meta.ts`). One jiti instance is reused across every file the returned loader
6
- * is called with. `moduleCache: false` ensures edits are picked up on each load,
7
- * which is what makes dev-server regeneration reflect config/meta changes.
90
+ * `meta.ts`), in which `blume` resolves to the running package wherever the
91
+ * module lives (see {@link blumeModuleAliases}).
8
92
  */
9
93
  // oxlint-disable-next-line anti-slop/no-unknown-returns -- user-authored modules can export anything; callers validate the loaded value at their own boundary
10
94
  export const createModuleLoader = (): ((file: string) => Promise<unknown>) => {
11
- const jiti = createJiti(import.meta.url, { moduleCache: false });
95
+ const load = lazyImport({});
12
96
  return async (file: string) => {
13
- const loaded = await jiti.import<{ default?: unknown }>(file);
97
+ const loaded = await load(file);
14
98
  return loaded?.default ?? loaded;
15
99
  };
16
100
  };
@@ -22,15 +106,20 @@ export const createModuleLoader = (): ((file: string) => Promise<unknown>) => {
22
106
  * exports `null`/`undefined`, resolves to `undefined` so the caller can say
23
107
  * so, instead of validating `{}` (a bare `defineConfig({…})` call) or
24
108
  * `{ config }` (a named export). jiti's default interop is off because it
25
- * throws on `export default null`.
109
+ * throws on `export default null`. Turning it off changes how jiti compiles
110
+ * every module the config reaches, Blume's own source included, but jiti keys
111
+ * its disk cache by file and source alone, so this loader keeps a cache of its
112
+ * own: sharing one, it would run code compiled for {@link createModuleLoader}
113
+ * (and that loader, code compiled for this one), whichever loaded the file
114
+ * first.
26
115
  */
27
116
  export const createDefaultExportLoader: typeof createModuleLoader = () => {
28
- const jiti = createJiti(import.meta.url, {
117
+ const load = lazyImport({
118
+ fsCache: join(tmpdir(), "jiti-blume-default-export"),
29
119
  interopDefault: false,
30
- moduleCache: false,
31
120
  });
32
121
  return async (file: string) => {
33
- const loaded = await jiti.import<{ default?: unknown }>(file);
122
+ const loaded = await load(file);
34
123
  return loaded.default ?? undefined;
35
124
  };
36
125
  };
@@ -1,4 +1,5 @@
1
1
  import { mountBasePath } from "./base-path.ts";
2
+ import { isHiddenPage } from "./hidden-pages.ts";
2
3
  import { localizeRoute, resolveFallbackLocale } from "./i18n.ts";
3
4
  import type { ResolvedConfig } from "./schema.ts";
4
5
  import type {
@@ -52,10 +53,11 @@ export const MANIFEST_VERSION = 1;
52
53
  */
53
54
  export const contentIndexable = (
54
55
  page: PageRecord,
55
- config: ResolvedConfig
56
+ config: ResolvedConfig,
57
+ graph: ContentGraph
56
58
  ): boolean =>
57
59
  !page.meta.search.exclude &&
58
- (!page.meta.sidebar.hidden || config.search.indexing.includeHiddenPages);
60
+ (!isHiddenPage(page, graph) || config.search.indexing.includeHiddenPages);
59
61
 
60
62
  /**
61
63
  * Fallback materialization: render the fallback locale's content at the
@@ -66,9 +68,10 @@ export const contentIndexable = (
66
68
  /**
67
69
  * The description a page's `<head>` emits — `seo.description` over the front
68
70
  * matter `description` — mirrored onto its route so the OG card's subtitle
69
- * matches the page's `og:description`.
71
+ * matches the page's `og:description`, and the summary page indexes like
72
+ * `llms.txt` give it.
70
73
  */
71
- const routeDescription = (page: PageRecord): string | undefined =>
74
+ export const metaDescription = (page: PageRecord): string | undefined =>
72
75
  page.meta.seo.description ?? page.description;
73
76
 
74
77
  const buildFallbackRoutes = (
@@ -121,12 +124,12 @@ const buildFallbackRoutes = (
121
124
  alternates: alternatesByKey.get(key) ?? [],
122
125
  collection: source.collection ?? "docs",
123
126
  contentType: source.contentType,
124
- description: routeDescription(source),
127
+ description: metaDescription(source),
125
128
  draft: source.meta.draft,
126
129
  editUrl: source.editUrl,
127
130
  entryId: source.entryId ?? source.source.ref,
128
131
  fallback: true,
129
- hidden: source.meta.sidebar.hidden,
132
+ hidden: isHiddenPage(source, graph),
130
133
  id: source.id,
131
134
  indexable: false,
132
135
  lastModified: source.lastModified,
@@ -187,13 +190,13 @@ export const buildManifest = (options: {
187
190
  alternates: alternatesByKey.get(page.translationKey) ?? [],
188
191
  collection: page.collection ?? "docs",
189
192
  contentType: page.contentType,
190
- description: routeDescription(page),
193
+ description: metaDescription(page),
191
194
  draft: page.meta.draft,
192
195
  editUrl: page.editUrl,
193
196
  entryId: page.entryId ?? page.source.ref,
194
- hidden: page.meta.sidebar.hidden,
197
+ hidden: isHiddenPage(page, graph),
195
198
  id: page.id,
196
- indexable: searchEnabled && contentIndexable(page, config),
199
+ indexable: searchEnabled && contentIndexable(page, config, graph),
197
200
  lastModified: page.lastModified,
198
201
  locale: page.locale,
199
202
  monolingual: page.monolingual,
@@ -0,0 +1,52 @@
1
+ import { servesRoute } from "./locale-links.ts";
2
+ import type { RouteSet } from "./locale-links.ts";
3
+
4
+ /**
5
+ * Where Blume serves each page's raw Markdown: a copy beside the page, named
6
+ * for its route (`/guide.md`, `/guide.mdx`; see `rawMarkdownEndpointTemplate`).
7
+ */
8
+
9
+ /** The extensions every page's Markdown copies are served at. */
10
+ export const MIRROR_EXTENSIONS = [".md", ".mdx"] as const;
11
+
12
+ /**
13
+ * The name the root's copies are served under (`/index.md`). They always are:
14
+ * with no page at `/`, the llms.txt index stands in (see `buildRawMarkdown`).
15
+ */
16
+ const ROOT_MIRROR = "/index";
17
+
18
+ /** A path naming a Markdown copy: the name it's served under, then `.md(x)`. */
19
+ const MIRROR_PATH = /^(?<name>\/.+)\.mdx?$/u;
20
+
21
+ /** The name a page's Markdown copies are served under, from its route. */
22
+ export const mirrorName = (route: string): string =>
23
+ route === "/" ? ROOT_MIRROR : route;
24
+
25
+ /**
26
+ * The page whose Markdown copies are served under `name`, if any are: the
27
+ * root's under `/index`, and a page's under its own route. `/index` is no
28
+ * page's route, yet it names the root's copies, so a path that isn't a page
29
+ * can still name a served copy.
30
+ */
31
+ export const mirrorOwner = (
32
+ pages: RouteSet,
33
+ name: string
34
+ ): string | undefined => {
35
+ if (name === ROOT_MIRROR) {
36
+ return "/";
37
+ }
38
+ return servesRoute(pages, name) ? name : undefined;
39
+ };
40
+
41
+ /**
42
+ * The page a served Markdown copy at `path` belongs to (`/guide.md` the page
43
+ * `/guide`'s, `/index.mdx` the root's), or `undefined` when `path` is no
44
+ * served copy.
45
+ */
46
+ export const mirroredPage = (
47
+ pages: RouteSet,
48
+ path: string
49
+ ): string | undefined => {
50
+ const name = MIRROR_PATH.exec(path)?.groups?.name;
51
+ return name === undefined ? undefined : mirrorOwner(pages, name);
52
+ };
@@ -0,0 +1,153 @@
1
+ import type { Nodes } from "mdast";
2
+ import { mdxToMdast } from "satteri";
3
+
4
+ import { MDX_BODY_FEATURES } from "../markdown/features.ts";
5
+ import { BUILTIN_CHILD_PROPS } from "./builtin-tags.ts";
6
+ import type { ElementUse } from "./types.ts";
7
+
8
+ /**
9
+ * JSX elements in an `.mdx` body whose props don't render as written:
10
+ *
11
+ * - `handler`: an HTML element with a JavaScript event handler
12
+ * (`<button onClick={() => …}>`). The page is static HTML, so the function
13
+ * is written into the attribute as text and never runs. A string handler
14
+ * (`onclick="…"`) is inline script the browser does run, and is left alone.
15
+ * - `prop`: a built-in that shows its children (see `BUILTIN_CHILD_PROPS`),
16
+ * used without any, with props it doesn't take. Those are ignored, so the
17
+ * element renders without the content they carry.
18
+ */
19
+
20
+ type JsxElement = Extract<
21
+ Nodes,
22
+ { type: "mdxJsxFlowElement" | "mdxJsxTextElement" }
23
+ >;
24
+ type AttributeValue = Extract<
25
+ JsxElement["attributes"][number],
26
+ { type: "mdxJsxAttribute" }
27
+ >["value"];
28
+ type ExpressionValue = Extract<AttributeValue, { type: string }>;
29
+
30
+ /** Whether an attribute's value is a `{…}` expression, not a string or nothing. */
31
+ export const isExpression = (value: AttributeValue): value is ExpressionValue =>
32
+ typeof value === "object" && value !== null;
33
+
34
+ // An `on*` prop, and a body that may hold one with an expression value.
35
+ const EVENT_HANDLER = /^on[A-Z]/u;
36
+ const HANDLER_HINT = /\son[A-Z]\w*\s*=\s*\{/u;
37
+ // An expression that is only a string literal, which renders as that string.
38
+ const STRING_LITERAL = /^\s*(?<quote>["'`])[\s\S]*\k<quote>\s*$/u;
39
+ // An intrinsic element: a lowercase name, not a member like `motion.div`.
40
+ const HTML_ELEMENT = /^[a-z][\w-]*$/u;
41
+
42
+ // A built-in that shows its children, opened with props and either closed at
43
+ // once or closed with nothing between the tags. Attribute values may hold
44
+ // `>`, so quoted strings and one level of braces are skipped whole.
45
+ const CHILDLESS_HINT = new RegExp(
46
+ String.raw`<(?<tag>${[...BUILTIN_CHILD_PROPS.keys()].join("|")})\s(?:[^<>"'{}]|"[^"]*"|'[^']*'|\{[^{}]*\})*(?:\/>|>\s*<\/\k<tag>>)`,
47
+ "u"
48
+ );
49
+
50
+ /** Whether an element has nothing to show between its tags. */
51
+ const isChildless = (node: JsxElement): boolean =>
52
+ node.children.every(
53
+ (child) => child.type === "text" && child.value.trim() === ""
54
+ );
55
+
56
+ /** The handler props on an HTML element that hold a JavaScript value. */
57
+ const handlerProps = (node: JsxElement): string[] =>
58
+ node.attributes.flatMap((attribute) =>
59
+ attribute.type === "mdxJsxAttribute" &&
60
+ EVENT_HANDLER.test(attribute.name) &&
61
+ isExpression(attribute.value) &&
62
+ !STRING_LITERAL.test(attribute.value.value)
63
+ ? [attribute.name]
64
+ : []
65
+ );
66
+
67
+ /**
68
+ * The props a childless built-in gets but doesn't take. A spread
69
+ * (`{...props}`) could pass anything, so it counts as none; an Astro
70
+ * directive (`client:load`, `set:html`) isn't a prop.
71
+ */
72
+ const unknownProps = (node: JsxElement, accepted: readonly string[]) => {
73
+ if (
74
+ !isChildless(node) ||
75
+ node.attributes.some((attribute) => attribute.type !== "mdxJsxAttribute")
76
+ ) {
77
+ return [];
78
+ }
79
+ return node.attributes.flatMap((attribute) =>
80
+ attribute.type === "mdxJsxAttribute" &&
81
+ !attribute.name.includes(":") &&
82
+ !accepted.includes(attribute.name)
83
+ ? [attribute.name]
84
+ : []
85
+ );
86
+ };
87
+
88
+ /** What `node` carries that doesn't render as written, if anything. */
89
+ const elementUse = (
90
+ node: JsxElement,
91
+ lineOffset: number
92
+ ): ElementUse | undefined => {
93
+ const tag = node.name ?? "";
94
+ const accepted = BUILTIN_CHILD_PROPS.get(tag);
95
+ let kind: ElementUse["kind"] = "prop";
96
+ let props: string[] = [];
97
+ if (HTML_ELEMENT.test(tag)) {
98
+ kind = "handler";
99
+ props = handlerProps(node);
100
+ } else if (accepted) {
101
+ props = unknownProps(node, accepted);
102
+ }
103
+ const start = node.position?.start;
104
+ return props.length > 0
105
+ ? {
106
+ column: start?.column ?? 1,
107
+ kind,
108
+ line: (start?.line ?? 1) + lineOffset,
109
+ props,
110
+ tag,
111
+ }
112
+ : undefined;
113
+ };
114
+
115
+ /**
116
+ * Every element in an `.mdx` body whose props don't render as written (see
117
+ * the module comment), in source order, its line shifted by `lineOffset`. The
118
+ * body is parsed only when a cheap test finds a suspect, and a body MDX can't
119
+ * parse fails to render with its own error, so it yields none.
120
+ */
121
+ export const extractElementUses = (
122
+ body: string,
123
+ lineOffset = 0
124
+ ): ElementUse[] => {
125
+ if (!(HANDLER_HINT.test(body) || CHILDLESS_HINT.test(body))) {
126
+ return [];
127
+ }
128
+ let tree: Nodes;
129
+ try {
130
+ tree = mdxToMdast(body, { features: MDX_BODY_FEATURES });
131
+ } catch {
132
+ return [];
133
+ }
134
+ const uses: ElementUse[] = [];
135
+ const walk = (node: Nodes): void => {
136
+ if (
137
+ node.type === "mdxJsxFlowElement" ||
138
+ node.type === "mdxJsxTextElement"
139
+ ) {
140
+ const use = elementUse(node, lineOffset);
141
+ if (use) {
142
+ uses.push(use);
143
+ }
144
+ }
145
+ if ("children" in node) {
146
+ for (const child of node.children) {
147
+ walk(child);
148
+ }
149
+ }
150
+ };
151
+ walk(tree);
152
+ return uses;
153
+ };