blume 2.0.3 → 2.1.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 (455) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +48 -0
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-1d7ve1dm.js → chunk-0gz36akr.js} +18 -2
  5. package/dist/cli/{chunk-1d7ve1dm.js.map → chunk-0gz36akr.js.map} +3 -3
  6. package/dist/cli/{chunk-2eytanqx.js → chunk-1n228xqb.js} +2 -2
  7. package/dist/cli/{chunk-yfyb25rh.js → chunk-2f3ndkpw.js} +24 -8
  8. package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
  9. package/dist/cli/{chunk-r20tn01b.js → chunk-2f7n4qzt.js} +8 -2
  10. package/dist/cli/{chunk-r20tn01b.js.map → chunk-2f7n4qzt.js.map} +3 -3
  11. package/dist/cli/{chunk-35d4wj9f.js → chunk-2n4ps1b3.js} +7 -7
  12. package/dist/cli/{chunk-j85vccga.js → chunk-43zcf4gz.js} +97 -57
  13. package/dist/cli/{chunk-j85vccga.js.map → chunk-43zcf4gz.js.map} +6 -6
  14. package/dist/cli/{chunk-e04dxsz1.js → chunk-4ejxbzee.js} +1 -1
  15. package/dist/cli/{chunk-5m5nmvyq.js → chunk-4h8z9vv5.js} +233 -39
  16. package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
  17. package/dist/cli/{chunk-5f86nr5m.js → chunk-5cg2rzgf.js} +18 -16
  18. package/dist/cli/{chunk-5f86nr5m.js.map → chunk-5cg2rzgf.js.map} +2 -2
  19. package/dist/cli/{chunk-tzmab476.js → chunk-5ffywsmb.js} +4 -4
  20. package/dist/cli/{chunk-2z928egk.js → chunk-5wj2qwn2.js} +5 -5
  21. package/dist/cli/chunk-6bm0xpgd.js +18 -0
  22. package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
  23. package/dist/cli/{chunk-vg9r4eb9.js → chunk-713mngdq.js} +12 -5
  24. package/dist/cli/{chunk-vg9r4eb9.js.map → chunk-713mngdq.js.map} +3 -3
  25. package/dist/cli/{chunk-5xvm6tfj.js → chunk-9geymqns.js} +17 -15
  26. package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-9geymqns.js.map} +2 -2
  27. package/dist/cli/{chunk-q58y5e6a.js → chunk-9xr4dgee.js} +26 -17
  28. package/dist/cli/chunk-9xr4dgee.js.map +10 -0
  29. package/dist/cli/{chunk-b07cmahc.js → chunk-amrb6hgh.js} +2 -2
  30. package/dist/cli/chunk-cm89scdv.js +443 -0
  31. package/dist/cli/chunk-cm89scdv.js.map +11 -0
  32. package/dist/cli/{chunk-akbpwfxc.js → chunk-cmtcnh9f.js} +2 -2
  33. package/dist/cli/chunk-cy5bm0j0.js +104 -0
  34. package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
  35. package/dist/cli/{chunk-crgn1q09.js → chunk-e7vvk5ya.js} +4 -4
  36. package/dist/cli/{chunk-pehfxfta.js → chunk-g2z9x01v.js} +6 -98
  37. package/dist/cli/chunk-g2z9x01v.js.map +10 -0
  38. package/dist/cli/{chunk-tkacnehg.js → chunk-gp84za0h.js} +2 -2
  39. package/dist/cli/{chunk-wrr3j9w9.js → chunk-h2a48yhd.js} +186 -63
  40. package/dist/cli/chunk-h2a48yhd.js.map +36 -0
  41. package/dist/cli/{chunk-hm3vjy5s.js → chunk-jnwj5kjj.js} +14 -9
  42. package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-jnwj5kjj.js.map} +4 -4
  43. package/dist/cli/chunk-kwrg63tm.js +31 -0
  44. package/dist/cli/chunk-kwrg63tm.js.map +10 -0
  45. package/dist/cli/{chunk-2hsdwb9n.js → chunk-nd1821sk.js} +18 -16
  46. package/dist/cli/{chunk-2hsdwb9n.js.map → chunk-nd1821sk.js.map} +2 -2
  47. package/dist/cli/{chunk-6dsbexzp.js → chunk-ntv4qrt7.js} +17 -15
  48. package/dist/cli/{chunk-6dsbexzp.js.map → chunk-ntv4qrt7.js.map} +2 -2
  49. package/dist/cli/{chunk-r9rcc4w7.js → chunk-p804f3pe.js} +7 -7
  50. package/dist/cli/{chunk-ey84smr6.js → chunk-py62fewh.js} +6 -6
  51. package/dist/cli/{chunk-ey84smr6.js.map → chunk-py62fewh.js.map} +1 -1
  52. package/dist/cli/chunk-q3wxxq39.js +126 -0
  53. package/dist/cli/chunk-q3wxxq39.js.map +11 -0
  54. package/dist/cli/{chunk-9t7a85s3.js → chunk-rekqz4qg.js} +23 -13
  55. package/dist/cli/chunk-rekqz4qg.js.map +10 -0
  56. package/dist/cli/{chunk-8ktnccpt.js → chunk-ta27feev.js} +1 -1
  57. package/dist/cli/{chunk-pv29h0wf.js → chunk-xkz5xbtv.js} +3476 -822
  58. package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
  59. package/dist/cli/{chunk-a58773jm.js → chunk-y4ykbark.js} +2 -2
  60. package/dist/cli/{chunk-p3v96n38.js → chunk-y5h4r2y0.js} +4 -4
  61. package/dist/cli/{chunk-acanzt5p.js → chunk-yj17vs39.js} +6 -6
  62. package/dist/cli/{chunk-p73c0m7w.js → chunk-yxmk4pec.js} +16 -14
  63. package/dist/cli/{chunk-p73c0m7w.js.map → chunk-yxmk4pec.js.map} +2 -2
  64. package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
  65. package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
  66. package/dist/cli/{chunk-c8chx29p.js → chunk-zf748avv.js} +384 -207
  67. package/dist/cli/chunk-zf748avv.js.map +37 -0
  68. package/dist/cli/{chunk-g4hq16wv.js → chunk-zhvd6adm.js} +16 -14
  69. package/dist/cli/{chunk-g4hq16wv.js.map → chunk-zhvd6adm.js.map} +2 -2
  70. package/dist/cli/index.js +26 -20
  71. package/dist/cli/index.js.map +5 -5
  72. package/dist/types/ai/agent-surface.d.ts +8 -7
  73. package/dist/types/ai/ai-catalog.d.ts +7 -0
  74. package/dist/types/ai/ask-context.d.ts +22 -0
  75. package/dist/types/ai/ask.d.ts +271 -58
  76. package/dist/types/ai/index.d.ts +2 -2
  77. package/dist/types/ai/site-skill.d.ts +26 -0
  78. package/dist/types/ai/skills.d.ts +16 -0
  79. package/dist/types/astro/integration.d.ts +8 -0
  80. package/dist/types/captcha/hcaptcha.d.ts +27 -0
  81. package/dist/types/captcha/index.d.ts +28 -0
  82. package/dist/types/captcha/schema.d.ts +29 -0
  83. package/dist/types/captcha/turnstile.d.ts +28 -0
  84. package/dist/types/components/content/api-field.d.ts +59 -0
  85. package/dist/types/components/content/api-page.d.ts +95 -0
  86. package/dist/types/components/layout/nav-utils.d.ts +26 -0
  87. package/dist/types/components/openapi/helpers.d.ts +137 -0
  88. package/dist/types/components/openapi/security.d.ts +85 -0
  89. package/dist/types/consent/ethyca.d.ts +48 -0
  90. package/dist/types/consent/index.d.ts +37 -0
  91. package/dist/types/consent/native.d.ts +28 -0
  92. package/dist/types/consent/osano.d.ts +42 -0
  93. package/dist/types/consent/schema.d.ts +110 -0
  94. package/dist/types/core/config-input.d.ts +187 -20
  95. package/dist/types/core/data.d.ts +49 -4
  96. package/dist/types/core/footer.d.ts +8 -0
  97. package/dist/types/core/i18n-ui.d.ts +86 -0
  98. package/dist/types/core/includes.d.ts +8 -2
  99. package/dist/types/core/localizable.d.ts +7 -0
  100. package/dist/types/core/page-modes.d.ts +29 -0
  101. package/dist/types/core/redirect-patterns.d.ts +144 -0
  102. package/dist/types/core/related.d.ts +40 -0
  103. package/dist/types/core/schema.d.ts +551 -56
  104. package/dist/types/core/sources/read.d.ts +5 -0
  105. package/dist/types/core/types.d.ts +1 -1
  106. package/dist/types/core/variables.d.ts +42 -0
  107. package/dist/types/deploy/node-headers.d.ts +13 -2
  108. package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
  109. package/dist/types/deploy/platforms/netlify.d.ts +7 -0
  110. package/dist/types/deploy/platforms/vercel.d.ts +6 -0
  111. package/dist/types/deploy/redirects.d.ts +39 -11
  112. package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
  113. package/dist/types/markdown/code-title.d.ts +17 -0
  114. package/dist/types/markdown/features.d.ts +3 -2
  115. package/dist/types/narration/build.d.ts +70 -0
  116. package/dist/types/narration/provider.d.ts +26 -0
  117. package/dist/types/narration/script.d.ts +154 -0
  118. package/dist/types/openapi/model.d.ts +12 -6
  119. package/dist/types/openapi/overlay.d.ts +54 -0
  120. package/dist/types/openapi/parse.d.ts +13 -0
  121. package/dist/types/openapi/references.d.ts +14 -4
  122. package/dist/types/ratelimit/cloudflare.d.ts +39 -0
  123. package/dist/types/ratelimit/index.d.ts +27 -0
  124. package/dist/types/ratelimit/memory.d.ts +36 -0
  125. package/dist/types/ratelimit/schema.d.ts +111 -0
  126. package/dist/types/ratelimit/upstash.d.ts +21 -0
  127. package/dist/types/ratelimit/wrangler.d.ts +23 -0
  128. package/dist/types/reference/asyncapi.d.ts +10 -10
  129. package/dist/types/reference/graphql.d.ts +13 -10
  130. package/dist/types/reference/openapi.d.ts +33 -12
  131. package/dist/types/reference/options.d.ts +45 -5
  132. package/dist/types/reference/scalar.d.ts +13 -0
  133. package/dist/types/reference/schema.d.ts +60 -36
  134. package/dist/types/search/documents.d.ts +12 -1
  135. package/dist/types/search/orama-index.d.ts +4 -0
  136. package/dist/types/seo/metatags.d.ts +20 -0
  137. package/docs/02-deployment.mdx +41 -5
  138. package/docs/03-upgrading.mdx +4 -4
  139. package/docs/04-migrating.mdx +1 -1
  140. package/docs/advanced/changelog.mdx +2 -2
  141. package/docs/advanced/skills.mdx +14 -0
  142. package/docs/cli/audit.mdx +21 -1
  143. package/docs/cli/index.mdx +1 -0
  144. package/docs/configuration/analytics.mdx +3 -1
  145. package/docs/configuration/assistant.mdx +188 -36
  146. package/docs/configuration/consent.mdx +100 -0
  147. package/docs/configuration/customization.mdx +4 -4
  148. package/docs/configuration/index.mdx +63 -5
  149. package/docs/configuration/meta.ts +3 -0
  150. package/docs/configuration/narration.mdx +119 -0
  151. package/docs/configuration/rate-limiting.mdx +69 -0
  152. package/docs/configuration/search.mdx +29 -1
  153. package/docs/configuration/theming.mdx +3 -1
  154. package/docs/content/components.mdx +106 -0
  155. package/docs/content/frontmatter.mdx +76 -0
  156. package/docs/content/i18n.mdx +38 -3
  157. package/docs/content/includes.mdx +16 -0
  158. package/docs/content/meta.mdx +1 -0
  159. package/docs/content/meta.ts +1 -0
  160. package/docs/content/navigation.mdx +28 -6
  161. package/docs/content/sources/contentful.mdx +32 -0
  162. package/docs/content/sources/custom.mdx +39 -0
  163. package/docs/content/sources/github-releases.mdx +31 -0
  164. package/docs/content/sources/index.mdx +91 -0
  165. package/docs/content/sources/meta.ts +16 -0
  166. package/docs/content/sources/notion.mdx +32 -0
  167. package/docs/content/sources/obsidian.mdx +37 -0
  168. package/docs/content/sources/payload.mdx +30 -0
  169. package/docs/content/sources/remote-mdx.mdx +40 -0
  170. package/docs/content/sources/sanity.mdx +29 -0
  171. package/docs/content/sources/strapi.mdx +31 -0
  172. package/docs/content/syntax.mdx +67 -2
  173. package/docs/content/variables.mdx +41 -0
  174. package/docs/discoverability/agent-discovery.mdx +29 -2
  175. package/docs/discoverability/index.mdx +1 -1
  176. package/docs/discoverability/llms-txt.mdx +1 -1
  177. package/docs/discoverability/metadata.mdx +17 -0
  178. package/docs/references/api-pages.mdx +74 -0
  179. package/docs/references/asyncapi.mdx +1 -1
  180. package/docs/references/graphql.mdx +2 -2
  181. package/docs/references/meta.ts +1 -1
  182. package/docs/references/openapi.mdx +102 -3
  183. package/docs/references/scalar.mdx +3 -1
  184. package/package.json +36 -1
  185. package/skills/blume/SKILL.md +3 -0
  186. package/skills/blume-migrate/SKILL.md +5 -5
  187. package/skills/blume-migrate/references/docusaurus.md +3 -3
  188. package/skills/blume-migrate/references/mintlify.md +37 -19
  189. package/skills/blume-migrate/references/nextra.md +2 -2
  190. package/skills/blume-migrate/references/starlight.md +2 -1
  191. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
  192. package/skills/blume-write-skill/SKILL.md +82 -0
  193. package/src/ai/agent-readability.ts +2 -1
  194. package/src/ai/agent-surface.ts +9 -7
  195. package/src/ai/ai-catalog.ts +6 -3
  196. package/src/ai/ask-context.ts +73 -20
  197. package/src/ai/ask-data.ts +6 -0
  198. package/src/ai/ask-tools.ts +142 -0
  199. package/src/ai/ask.ts +354 -76
  200. package/src/ai/component-markdown.ts +75 -0
  201. package/src/ai/cors.ts +2 -0
  202. package/src/ai/index.ts +12 -0
  203. package/src/ai/llms.ts +6 -2
  204. package/src/ai/markdown.ts +2 -1
  205. package/src/ai/mcp/data.ts +6 -0
  206. package/src/ai/openapi-components.ts +9 -3
  207. package/src/ai/site-skill.ts +274 -0
  208. package/src/ai/skills.ts +35 -2
  209. package/src/ai/write-skill.ts +97 -0
  210. package/src/astro/generate.ts +132 -18
  211. package/src/astro/index.ts +1 -0
  212. package/src/astro/integration.ts +35 -0
  213. package/src/astro/module-types.ts +6 -0
  214. package/src/astro/templates.ts +283 -30
  215. package/src/astro/variables.ts +31 -0
  216. package/src/audit/catalog.ts +19 -0
  217. package/src/audit/checks/contrast.ts +183 -0
  218. package/src/audit/checks/i18n.ts +2 -3
  219. package/src/audit/checks/indexability.ts +2 -3
  220. package/src/audit/checks/links.ts +5 -12
  221. package/src/audit/checks/sitemap.ts +2 -3
  222. package/src/audit/redirects.ts +46 -15
  223. package/src/audit/run.ts +2 -0
  224. package/src/audit/types.ts +2 -1
  225. package/src/blume-modules.d.ts +7 -0
  226. package/src/captcha/client.ts +152 -0
  227. package/src/captcha/hcaptcha.ts +36 -0
  228. package/src/captcha/index.ts +28 -0
  229. package/src/captcha/schema.ts +32 -0
  230. package/src/captcha/turnstile.ts +38 -0
  231. package/src/captcha/verify.ts +71 -0
  232. package/src/cli/command-meta.ts +5 -0
  233. package/src/cli/commands/doctor.ts +22 -16
  234. package/src/cli/commands/skill.ts +96 -0
  235. package/src/cli/index.ts +5 -0
  236. package/src/cli/required-secrets.ts +71 -29
  237. package/src/components/BlumePage.astro +2 -0
  238. package/src/components/content/ApiEndpoint.astro +18 -0
  239. package/src/components/content/ApiField.astro +79 -0
  240. package/src/components/content/ApiPlayground.astro +62 -0
  241. package/src/components/content/ApiRail.astro +19 -0
  242. package/src/components/content/Color.astro +1 -0
  243. package/src/components/content/FileTree.astro +1 -0
  244. package/src/components/content/GithubInfo.astro +1 -0
  245. package/src/components/content/Panel.astro +1 -0
  246. package/src/components/content/ParamField.astro +25 -0
  247. package/src/components/content/RequestExample.astro +17 -0
  248. package/src/components/content/ResponseExample.astro +17 -0
  249. package/src/components/content/ResponseField.astro +32 -0
  250. package/src/components/content/Step.astro +1 -0
  251. package/src/components/content/Tile.astro +1 -0
  252. package/src/components/content/Tooltip.astro +1 -0
  253. package/src/components/content/Tree.astro +1 -0
  254. package/src/components/content/TypeTable.astro +4 -1
  255. package/src/components/content/View.astro +21 -0
  256. package/src/components/content/ViewSwitcher.astro +168 -0
  257. package/src/components/content/api-field.ts +100 -0
  258. package/src/components/content/api-page.ts +224 -0
  259. package/src/components/content/view-switcher.ts +71 -0
  260. package/src/components/index.ts +2 -0
  261. package/src/components/islands/Assistant.astro +10 -1
  262. package/src/components/islands/assistant.tsx +104 -14
  263. package/src/components/islands/code-question.ts +62 -0
  264. package/src/components/islands/hooks.ts +110 -21
  265. package/src/components/islands/support-link.ts +68 -0
  266. package/src/components/layout/Analytics.astro +11 -2
  267. package/src/components/layout/Banner.astro +14 -10
  268. package/src/components/layout/Breadcrumbs.astro +6 -2
  269. package/src/components/layout/ConsentBanner.astro +62 -0
  270. package/src/components/layout/ConsentHead.astro +38 -0
  271. package/src/components/layout/Directory.astro +94 -0
  272. package/src/components/layout/DrawerSwitchers.astro +51 -0
  273. package/src/components/layout/Empty.astro +2 -2
  274. package/src/components/layout/Header.astro +122 -80
  275. package/src/components/layout/LanguageSwitcher.astro +48 -15
  276. package/src/components/layout/NarrationPlayer.astro +1085 -0
  277. package/src/components/layout/NavSelector.astro +33 -7
  278. package/src/components/layout/PageFeedback.astro +54 -49
  279. package/src/components/layout/PageLayout.astro +71 -3
  280. package/src/components/layout/ReferenceLayout.astro +17 -6
  281. package/src/components/layout/RelatedPages.astro +42 -0
  282. package/src/components/layout/RootLayout.astro +308 -45
  283. package/src/components/layout/Search.astro +31 -17
  284. package/src/components/layout/SiteFooter.astro +124 -0
  285. package/src/components/layout/SiteMetatags.astro +16 -0
  286. package/src/components/layout/consent/native.ts +79 -0
  287. package/src/components/layout/consent/types.ts +37 -0
  288. package/src/components/layout/footer-links.ts +53 -0
  289. package/src/components/layout/footer-socials.ts +87 -0
  290. package/src/components/layout/locale-redirect.ts +107 -0
  291. package/src/components/layout/nav-utils.ts +83 -0
  292. package/src/components/layout/page-feedback.ts +96 -0
  293. package/src/components/layout/search/analytics.ts +98 -0
  294. package/src/components/layout/search/flexsearch.ts +17 -5
  295. package/src/components/layout/search/orama-cloud.ts +26 -14
  296. package/src/components/layout/search/types.ts +20 -0
  297. package/src/components/layout/search/typesense.ts +5 -1
  298. package/src/components/openapi/Operation.astro +161 -13
  299. package/src/components/openapi/RequestBody.astro +6 -4
  300. package/src/components/openapi/RequestPanel.astro +59 -7
  301. package/src/components/openapi/Responses.astro +6 -4
  302. package/src/components/openapi/async-snippets.ts +4 -4
  303. package/src/components/openapi/code-samples.ts +97 -0
  304. package/src/components/openapi/security.ts +6 -3
  305. package/src/components/openapi/snippets.ts +869 -8
  306. package/src/components/props.ts +6 -0
  307. package/src/consent/client.ts +95 -0
  308. package/src/consent/clients.ts +19 -0
  309. package/src/consent/ethyca.ts +71 -0
  310. package/src/consent/head.ts +24 -0
  311. package/src/consent/index.ts +37 -0
  312. package/src/consent/init.ts +29 -0
  313. package/src/consent/native.ts +36 -0
  314. package/src/consent/osano.ts +59 -0
  315. package/src/consent/schema.ts +30 -0
  316. package/src/core/builtin-tags.ts +5 -0
  317. package/src/core/client-address.ts +19 -0
  318. package/src/core/config-input.ts +194 -20
  319. package/src/core/data.ts +44 -4
  320. package/src/core/diagnostics.ts +3 -2
  321. package/src/core/footer.ts +26 -0
  322. package/src/core/graph.ts +39 -36
  323. package/src/core/i18n-ui.ts +82 -2
  324. package/src/core/includes.ts +20 -3
  325. package/src/core/links.ts +16 -2
  326. package/src/core/localizable.ts +26 -0
  327. package/src/core/navigation.ts +43 -12
  328. package/src/core/page-modes.ts +56 -0
  329. package/src/core/project-graph.ts +111 -5
  330. package/src/core/redirect-patterns.ts +491 -0
  331. package/src/core/related.ts +131 -0
  332. package/src/core/schema.ts +318 -64
  333. package/src/core/sources/normalize.ts +2 -1
  334. package/src/core/sources/read.ts +8 -3
  335. package/src/core/types.ts +1 -1
  336. package/src/core/ui-packs/ar.ts +43 -0
  337. package/src/core/ui-packs/bg.ts +45 -0
  338. package/src/core/ui-packs/bn.ts +43 -0
  339. package/src/core/ui-packs/ca.ts +46 -0
  340. package/src/core/ui-packs/cs.ts +44 -0
  341. package/src/core/ui-packs/da.ts +45 -0
  342. package/src/core/ui-packs/de.ts +46 -0
  343. package/src/core/ui-packs/el.ts +45 -0
  344. package/src/core/ui-packs/es.ts +46 -0
  345. package/src/core/ui-packs/fa.ts +45 -0
  346. package/src/core/ui-packs/fi.ts +45 -0
  347. package/src/core/ui-packs/fr.ts +46 -0
  348. package/src/core/ui-packs/he.ts +43 -0
  349. package/src/core/ui-packs/hi.ts +44 -0
  350. package/src/core/ui-packs/hr.ts +45 -0
  351. package/src/core/ui-packs/hu.ts +44 -0
  352. package/src/core/ui-packs/id.ts +45 -0
  353. package/src/core/ui-packs/it.ts +45 -0
  354. package/src/core/ui-packs/ja.ts +45 -0
  355. package/src/core/ui-packs/ko.ts +44 -0
  356. package/src/core/ui-packs/nl.ts +46 -0
  357. package/src/core/ui-packs/no.ts +44 -0
  358. package/src/core/ui-packs/pl.ts +45 -0
  359. package/src/core/ui-packs/pt-br.ts +46 -0
  360. package/src/core/ui-packs/pt.ts +45 -0
  361. package/src/core/ui-packs/ro.ts +45 -0
  362. package/src/core/ui-packs/ru.ts +45 -0
  363. package/src/core/ui-packs/sk.ts +44 -0
  364. package/src/core/ui-packs/sr.ts +45 -0
  365. package/src/core/ui-packs/sv.ts +44 -0
  366. package/src/core/ui-packs/th.ts +43 -0
  367. package/src/core/ui-packs/tr.ts +45 -0
  368. package/src/core/ui-packs/uk.ts +45 -0
  369. package/src/core/ui-packs/vi.ts +45 -0
  370. package/src/core/ui-packs/zh-tw.ts +43 -0
  371. package/src/core/ui-packs/zh.ts +43 -0
  372. package/src/core/variables.ts +103 -0
  373. package/src/deploy/artifacts.ts +77 -8
  374. package/src/deploy/cloudflare-negotiation.ts +35 -5
  375. package/src/deploy/headers.ts +2 -1
  376. package/src/deploy/node-headers.ts +63 -9
  377. package/src/deploy/platforms/cloudflare.ts +32 -0
  378. package/src/deploy/platforms/netlify.ts +33 -1
  379. package/src/deploy/platforms/vercel.ts +37 -2
  380. package/src/deploy/redirects.ts +91 -24
  381. package/src/deploy/vercel-negotiation.ts +36 -0
  382. package/src/markdown/api-rail.ts +259 -0
  383. package/src/markdown/code-title.ts +35 -9
  384. package/src/markdown/features.ts +3 -2
  385. package/src/markdown/fence-meta.ts +2 -0
  386. package/src/markdown/include.ts +11 -1
  387. package/src/markdown/index.ts +28 -5
  388. package/src/markdown/math.ts +4 -4
  389. package/src/markdown/variables.ts +56 -0
  390. package/src/markdown/views.ts +82 -0
  391. package/src/narration/build.ts +412 -0
  392. package/src/narration/player.ts +249 -0
  393. package/src/narration/provider.ts +29 -0
  394. package/src/narration/script.ts +592 -0
  395. package/src/og/card.ts +7 -6
  396. package/src/openapi/model.ts +57 -24
  397. package/src/openapi/overlay.ts +256 -0
  398. package/src/openapi/parse.ts +55 -2
  399. package/src/openapi/references.ts +21 -5
  400. package/src/openapi/render-mdx.ts +5 -1
  401. package/src/openapi/scalar.ts +40 -6
  402. package/src/openapi/source.ts +1 -1
  403. package/src/ratelimit/cloudflare.ts +54 -0
  404. package/src/ratelimit/index.ts +30 -0
  405. package/src/ratelimit/memory.ts +45 -0
  406. package/src/ratelimit/runtime.ts +229 -0
  407. package/src/ratelimit/schema.ts +28 -0
  408. package/src/ratelimit/upstash.ts +30 -0
  409. package/src/ratelimit/wrangler.ts +70 -0
  410. package/src/reference/asyncapi.ts +2 -2
  411. package/src/reference/graphql.ts +5 -2
  412. package/src/reference/openapi.ts +21 -7
  413. package/src/reference/options.ts +51 -7
  414. package/src/reference/scalar.ts +33 -8
  415. package/src/registry/eject.ts +20 -4
  416. package/src/registry/registry.ts +7 -0
  417. package/src/search/documents.ts +26 -2
  418. package/src/search/orama-index.ts +28 -3
  419. package/src/search/pagefind-ranking.ts +39 -0
  420. package/src/search/sync/algolia.ts +15 -4
  421. package/src/search/sync/orama-cloud.ts +3 -0
  422. package/src/search/sync/typesense.ts +5 -0
  423. package/src/seo/metatags.ts +67 -0
  424. package/src/theme/chrome-icons.ts +1 -0
  425. package/src/theme/color.ts +500 -0
  426. package/src/theme/entry.ts +56 -3
  427. package/src/theme/palette.ts +121 -45
  428. package/src/translate/prompts.ts +1 -0
  429. package/src/translate/validate.ts +8 -2
  430. package/src/upgrade/upgrade.ts +4 -171
  431. package/dist/cli/chunk-364znk6q.js +0 -75
  432. package/dist/cli/chunk-364znk6q.js.map +0 -11
  433. package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
  434. package/dist/cli/chunk-9t7a85s3.js.map +0 -10
  435. package/dist/cli/chunk-c8chx29p.js.map +0 -36
  436. package/dist/cli/chunk-pehfxfta.js.map +0 -10
  437. package/dist/cli/chunk-pv29h0wf.js.map +0 -190
  438. package/dist/cli/chunk-q58y5e6a.js.map +0 -10
  439. package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
  440. package/dist/cli/chunk-yfyb25rh.js.map +0 -14
  441. package/docs/content/sources.mdx +0 -334
  442. /package/dist/cli/{chunk-2eytanqx.js.map → chunk-1n228xqb.js.map} +0 -0
  443. /package/dist/cli/{chunk-35d4wj9f.js.map → chunk-2n4ps1b3.js.map} +0 -0
  444. /package/dist/cli/{chunk-e04dxsz1.js.map → chunk-4ejxbzee.js.map} +0 -0
  445. /package/dist/cli/{chunk-tzmab476.js.map → chunk-5ffywsmb.js.map} +0 -0
  446. /package/dist/cli/{chunk-2z928egk.js.map → chunk-5wj2qwn2.js.map} +0 -0
  447. /package/dist/cli/{chunk-b07cmahc.js.map → chunk-amrb6hgh.js.map} +0 -0
  448. /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-cmtcnh9f.js.map} +0 -0
  449. /package/dist/cli/{chunk-crgn1q09.js.map → chunk-e7vvk5ya.js.map} +0 -0
  450. /package/dist/cli/{chunk-tkacnehg.js.map → chunk-gp84za0h.js.map} +0 -0
  451. /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-p804f3pe.js.map} +0 -0
  452. /package/dist/cli/{chunk-8ktnccpt.js.map → chunk-ta27feev.js.map} +0 -0
  453. /package/dist/cli/{chunk-a58773jm.js.map → chunk-y4ykbark.js.map} +0 -0
  454. /package/dist/cli/{chunk-p3v96n38.js.map → chunk-y5h4r2y0.js.map} +0 -0
  455. /package/dist/cli/{chunk-acanzt5p.js.map → chunk-yj17vs39.js.map} +0 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * The props `<ParamField>` and `<ResponseField>` take, in Mintlify's shape: a
3
+ * parameter names its location with the attribute that carries its name
4
+ * (`<ParamField query="limit">`), and both take `type`, `required`,
5
+ * `deprecated`, and `default`; a response field adds `pre` and `post` labels
6
+ * around its name. Pure, so the Markdown downlevel and the playground can
7
+ * read fields the way the components render them.
8
+ */
9
+ /** Where a `<ParamField>` parameter goes, in the order the attributes are checked. */
10
+ export declare const PARAM_LOCATIONS: readonly ["path", "query", "header", "body"];
11
+ /** A parameter's location. */
12
+ export type ParamLocation = (typeof PARAM_LOCATIONS)[number];
13
+ /** A literal value as MDX passes it: a string attribute, or an expression's data. */
14
+ export type FieldValue = string | number | boolean | null | undefined | FieldValue[] | {
15
+ [key: string]: FieldValue;
16
+ };
17
+ /** A boolean prop: MDX shorthand (`required`) is `true`, `required="true"` a string. */
18
+ export type FlagProp = boolean | string;
19
+ /** What both field components take. */
20
+ export interface FieldProps {
21
+ /** The value used when none is given. */
22
+ default?: FieldValue;
23
+ deprecated?: FlagProp;
24
+ required?: FlagProp;
25
+ /** Free text: `string`, `integer`, `string[]`, `object`. */
26
+ type?: string;
27
+ }
28
+ /** `<ParamField>`: a request parameter, named by its location attribute. */
29
+ export interface ParamFieldProps extends FieldProps {
30
+ body?: string;
31
+ header?: string;
32
+ /** The name, for a field with no location attribute. */
33
+ name?: string;
34
+ path?: string;
35
+ /** Placeholder text for the parameter's playground input. */
36
+ placeholder?: string;
37
+ query?: string;
38
+ }
39
+ /** `<ResponseField>`: a field of the response. */
40
+ export interface ResponseFieldProps extends FieldProps {
41
+ name: string;
42
+ /** Labels after the name. */
43
+ post?: string | string[];
44
+ /** Labels before the name. */
45
+ pre?: string | string[];
46
+ }
47
+ /** Whether a flag prop is on. */
48
+ export declare const isOn: (value?: FlagProp) => boolean;
49
+ /** Where a parameter goes, and what it's called. */
50
+ export interface ParamFieldName {
51
+ location?: ParamLocation;
52
+ name?: string;
53
+ }
54
+ /** A parameter's location and name: the first location attribute set, else `name`. */
55
+ export declare const paramField: (props: ParamFieldProps) => ParamFieldName;
56
+ /** A default value as shown: text as written, anything else as JSON; `null` when there is none. */
57
+ export declare const defaultLabel: (value?: FieldValue) => string | null;
58
+ /** `pre`/`post` labels as a list, whether one was written or several. */
59
+ export declare const fieldLabels: (value?: string | string[]) => string[];
@@ -0,0 +1,95 @@
1
+ import type { ParameterLike, SchemaLike } from "../openapi/helpers.ts";
2
+ import type { OperationSecurity } from "../openapi/security.ts";
3
+ import type { FieldValue, ParamLocation } from "./api-field.ts";
4
+ /**
5
+ * A hand-written API page's endpoint, as its `api` frontmatter and its
6
+ * `<ParamField>`s describe it, turned into the OpenAPI-shaped pieces the
7
+ * operation playground and code samples are built from: a page with
8
+ * `api: "POST /v1/users"` gets the same Try it panel and request samples as
9
+ * a spec'd operation, with no spec. Mintlify's frontmatter, so migrated pages
10
+ * keep it as written.
11
+ */
12
+ /** How a hand-written endpoint authenticates (`authMethod`, `api.auth.method`). */
13
+ export declare const AUTH_METHODS: readonly ["bearer", "basic", "key", "none"];
14
+ export type AuthMethod = (typeof AUTH_METHODS)[number];
15
+ /** What a page's playground shows: all of it, the samples only, or none. */
16
+ export declare const PLAYGROUND_MODES: readonly ["interactive", "simple", "none"];
17
+ export type PlaygroundMode = (typeof PLAYGROUND_MODES)[number];
18
+ /** `api` frontmatter: an HTTP method, then a path or a full URL. */
19
+ export declare const API_ENDPOINT: RegExp;
20
+ /** The site's default auth for hand-written endpoints (`api.auth`). */
21
+ export interface EndpointAuth {
22
+ method: AuthMethod;
23
+ /** The header an API key goes in. */
24
+ name?: string;
25
+ }
26
+ /** One `<ParamField>`, as the page's plugin collected it. */
27
+ export interface EndpointField {
28
+ default?: FieldValue;
29
+ deprecated?: boolean;
30
+ /** Body fields nested in this one's `<Expandable>`. */
31
+ fields?: EndpointField[];
32
+ location: ParamLocation;
33
+ name: string;
34
+ placeholder?: string;
35
+ required?: boolean;
36
+ type?: string;
37
+ }
38
+ /** What the page's plugin hands the endpoint components. */
39
+ export interface EndpointSpec {
40
+ authMethod?: AuthMethod;
41
+ fields: EndpointField[];
42
+ method: string;
43
+ playground?: PlaygroundMode;
44
+ /** The page has a `<RequestExample>`, which stands in for generated samples. */
45
+ requestExample: boolean;
46
+ /** The `api` target as written: a path, or a full URL. */
47
+ target: string;
48
+ }
49
+ /** The method and target of an `api` value, or `null` when it isn't one. */
50
+ export declare const parseApiEndpoint: (value: string) => {
51
+ method: string;
52
+ target: string;
53
+ } | null;
54
+ /** An endpoint's target, split the way the operation model takes it. */
55
+ export interface EndpointTarget {
56
+ path: string;
57
+ servers: {
58
+ url: string;
59
+ }[];
60
+ }
61
+ /**
62
+ * The target split into a server and a path: a full URL is its own server,
63
+ * and a path joins the site's `api.server`, or stays relative to the docs
64
+ * when there is none.
65
+ */
66
+ export declare const endpointTarget: (target: string, server?: string) => EndpointTarget;
67
+ /**
68
+ * A field's JSON schema from its `type`: `string[]` an array of strings, a
69
+ * field with nested fields an object with those properties, and anything
70
+ * that isn't a JSON type (`enum<string>`, `Date`) a string, which is what it
71
+ * goes over the wire as. A default and placeholder carry over, the
72
+ * placeholder as the example the samples show.
73
+ */
74
+ export declare const fieldSchema: (field: EndpointField) => SchemaLike;
75
+ /** The path, query, and header fields as OpenAPI parameters. */
76
+ export declare const endpointParameters: (fields: EndpointField[]) => ParameterLike[];
77
+ /** The body fields as a JSON request body, or `undefined` when there are none. */
78
+ export declare const endpointBody: (fields: EndpointField[]) => {
79
+ content: {
80
+ "application/json": {
81
+ schema: SchemaLike;
82
+ };
83
+ };
84
+ } | undefined;
85
+ /**
86
+ * The security an endpoint enforces: its page's `authMethod`, else the
87
+ * site's `api.auth`, else none. An API key goes in the configured header,
88
+ * `x-api-key` when none is named.
89
+ */
90
+ export declare const endpointSecurity: (authMethod?: AuthMethod, siteAuth?: EndpointAuth) => OperationSecurity;
91
+ /**
92
+ * The endpoint spec the page's plugin wrote into the `spec` attribute of
93
+ * `<ApiEndpoint>` and `<ApiPlayground>`.
94
+ */
95
+ export declare const readEndpointSpec: (json: string) => EndpointSpec;
@@ -69,6 +69,32 @@ export declare const getPagination: (flat: FlatPage[], route: string) => {
69
69
  next: FlatPage | null;
70
70
  prev: FlatPage | null;
71
71
  };
72
+ /** A group node in the sidebar tree. */
73
+ export type NavGroup = Extract<NavNode, {
74
+ kind: "group";
75
+ }>;
76
+ /**
77
+ * The group whose own page `route` is, when that page lists the group's
78
+ * pages: its `directory` (inherited when the group sets none) is `card` or
79
+ * `accordion`. `null` on every other page.
80
+ */
81
+ export declare const directoryGroupForRoute: (nodes: NavNode[], route: string) => NavGroup | null;
82
+ /** One entry in a group page's directory: a page, or a subgroup and its pages. */
83
+ export interface DirectoryEntry {
84
+ description?: string;
85
+ /** The page, or the subgroup's own page (its first page when it has none). */
86
+ href: string;
87
+ icon?: string;
88
+ label: string;
89
+ /** A subgroup's pages in sidebar order, its own page first; absent for a page. */
90
+ pages?: FlatPage[];
91
+ }
92
+ /**
93
+ * What a group's page lists: the group's pages and subgroups, in sidebar
94
+ * order, without the page itself or external links. A subgroup is described
95
+ * by its own page, and one with no page to link to is left out.
96
+ */
97
+ export declare const directoryEntries: (group: NavGroup) => DirectoryEntry[];
72
98
  /**
73
99
  * A stable id for every group in a sidebar — `g<n>` by pre-order position in
74
100
  * the full tree. The layout hands `NavTree` a scoped view of that tree (a
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Runtime helpers for the OpenAPI components. These operate on the parsed spec
3
+ * behind the `blume:openapi` alias — resolving `$ref`s (kept intact at parse
4
+ * time to avoid circular graphs), labelling types, and generating request
5
+ * examples and code samples. Browser-safe (no server-only imports); example
6
+ * values come from openapi-sampler, which is likewise browser-safe.
7
+ */
8
+ /** Any value a parsed OpenAPI document can hold: JSON, nested schemas included. */
9
+ export type SpecValue = string | number | boolean | null | undefined | SpecValue[] | {
10
+ [key: string]: SpecValue;
11
+ };
12
+ /** A permissive view of an OpenAPI 3.1 schema — only the fields we render. */
13
+ export interface SchemaLike {
14
+ $ref?: string;
15
+ type?: string | string[];
16
+ format?: string;
17
+ title?: string;
18
+ description?: string;
19
+ properties?: Record<string, SchemaLike>;
20
+ required?: string[];
21
+ items?: SchemaLike;
22
+ enum?: SpecValue[];
23
+ const?: SpecValue;
24
+ default?: SpecValue;
25
+ example?: SpecValue;
26
+ examples?: SpecValue[];
27
+ allOf?: SchemaLike[];
28
+ oneOf?: SchemaLike[];
29
+ anyOf?: SchemaLike[];
30
+ additionalProperties?: boolean | SchemaLike;
31
+ nullable?: boolean;
32
+ deprecated?: boolean;
33
+ readOnly?: boolean;
34
+ writeOnly?: boolean;
35
+ minimum?: number;
36
+ maximum?: number;
37
+ minLength?: number;
38
+ maxLength?: number;
39
+ minItems?: number;
40
+ maxItems?: number;
41
+ pattern?: string;
42
+ [key: string]: SpecValue;
43
+ }
44
+ /** A permissive view of an operation parameter — only the fields we render. */
45
+ export interface ParameterLike {
46
+ $ref?: string;
47
+ name?: string;
48
+ in?: string;
49
+ description?: string;
50
+ required?: boolean;
51
+ deprecated?: boolean;
52
+ schema?: SchemaLike;
53
+ example?: SpecValue;
54
+ [key: string]: SpecValue;
55
+ }
56
+ /** The `components` object of a parsed spec: section name → named-node table. */
57
+ export type ComponentsLike = Record<string, Record<string, SpecValue> | undefined>;
58
+ /**
59
+ * Resolve one level of `$ref` against a named `components` section
60
+ * (`parameters`, `requestBodies`, `responses`). Mirrors {@link resolveSchema}:
61
+ * an unknown ref — or one pointing into a different section — is returned
62
+ * as-is.
63
+ */
64
+ export declare const resolveComponentRef: <T extends {
65
+ $ref?: string;
66
+ }>(node: T, components: ComponentsLike | undefined, section: string) => T;
67
+ /**
68
+ * Path-level and operation-level parameters merged into one render list.
69
+ * `$ref`s resolve against `components.parameters` first; then an operation
70
+ * parameter overrides a path-level one with the same `name` + `in` (the
71
+ * OpenAPI override rule), so a re-declared parameter appears once.
72
+ */
73
+ export declare const mergeParameters: (pathParameters: ParameterLike[] | undefined, operationParameters: ParameterLike[] | undefined, components?: ComponentsLike) => ParameterLike[];
74
+ /** The display name of a `$ref`, e.g. `#/components/schemas/Pet` -> `Pet`. */
75
+ export declare const refName: (ref: string) => string;
76
+ /** Resolve one level of `$ref` against the document's component schemas. */
77
+ export declare const resolveSchema: (schemas: Record<string, SchemaLike>, schema?: SchemaLike) => SchemaLike;
78
+ /**
79
+ * A short, human-readable type label for a schema row. `$ref`s label by name
80
+ * (`Pet`, `Pet[]`) without resolving — which also means circular refs through
81
+ * array items can't recurse forever. A `null` member stays out of a union's
82
+ * label: rows mark it with {@link isNullable}, as they do `type: [T, "null"]`.
83
+ */
84
+ export declare const typeLabel: (schema: SchemaLike) => string;
85
+ /**
86
+ * Whether this schema is nullable: 3.0 `nullable`, a 3.1 `"null"` in `type`,
87
+ * or a `{ type: "null" }` member of a `oneOf`/`anyOf` union.
88
+ */
89
+ export declare const isNullable: (schema: SchemaLike) => boolean;
90
+ /** Human-readable validation constraints for a schema, in display order. */
91
+ export declare const constraints: (schema: SchemaLike) => string[];
92
+ /** The merged property list and required set a schema exposes. */
93
+ export interface ObjectPropertySet {
94
+ properties: [string, SchemaLike][];
95
+ required: Set<string>;
96
+ }
97
+ /**
98
+ * The object properties a schema exposes, merging `allOf` branches so an
99
+ * `allOf`-composed model still lists every field. Returns the properties plus
100
+ * the merged required set.
101
+ */
102
+ export declare const objectProperties: (schema: SchemaLike, schemas: Record<string, SchemaLike>) => ObjectPropertySet;
103
+ /**
104
+ * Build a representative example value for a schema via openapi-sampler
105
+ * (Redoc's generator): declared `example`/`const`/`default`/`enum` values
106
+ * win, formats produce realistic placeholders (`email`, `uuid`, `date-time`),
107
+ * and circular `$ref` chains — which keeping refs intact allows — terminate
108
+ * safely. A request sample skips `readOnly` fields (a server-generated field
109
+ * has no place in one); a response sample skips `writeOnly` fields (a
110
+ * password the client sends never comes back) and keeps the `readOnly` ones.
111
+ */
112
+ export declare const exampleValue: (schema: SchemaLike | undefined, schemas: Record<string, SchemaLike>, direction?: "request" | "response") => SpecValue;
113
+ /** Where an author can declare an example: a parameter or a media type. */
114
+ export interface ExampleCarrier {
115
+ example?: SpecValue;
116
+ examples?: SpecValue;
117
+ }
118
+ /**
119
+ * The example a parameter or media type declares: its `example`, else the
120
+ * first `value` in its `examples` map — inline, or behind a `$ref` to
121
+ * `#/components/examples`, resolved against `components`. Scalar's upgrade
122
+ * moves every OpenAPI 3.0 and Swagger 2.0 `example` into
123
+ * `examples.default.value`, and 3.1 authors write that map directly, so
124
+ * reading `example` alone would drop them all. `undefined` when nothing is
125
+ * declared.
126
+ */
127
+ export declare const declaredExample: (carrier: ExampleCarrier, components?: ComponentsLike) => SpecValue;
128
+ /**
129
+ * A response media type's example for the Response panel: the declared one,
130
+ * else a sample built for the response direction (`readOnly` kept,
131
+ * `writeOnly` skipped).
132
+ */
133
+ export declare const responseExample: (media: ExampleCarrier & {
134
+ schema?: SchemaLike;
135
+ }, schemas: Record<string, SchemaLike>, components?: ComponentsLike) => SpecValue;
136
+ /** Pretty-print a JSON value for an example/code block. */
137
+ export declare const toJson: <T>(value: T) => string;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Security (authorization) resolution for the OpenAPI components. An operation
3
+ * enforces its own `security` when declared — an empty array explicitly makes
4
+ * it public — and inherits the document's root `security` otherwise. Within the
5
+ * resolved list, each requirement object is one way to authorize (OR between
6
+ * entries), and every scheme named inside a single requirement is needed
7
+ * together (AND). Pure and dependency-free like `helpers.ts`, so it runs in the
8
+ * browser build with no server-only imports.
9
+ */
10
+ /** A permissive view of an OpenAPI security scheme — only the fields we render. */
11
+ export interface SecuritySchemeLike {
12
+ type?: string;
13
+ description?: string;
14
+ /** `apiKey`: the parameter name the key is sent as. */
15
+ name?: string;
16
+ /** `apiKey`: where the key goes — `header`, `query`, or `cookie`. */
17
+ in?: string;
18
+ /** `http`: the HTTP auth scheme, e.g. `bearer` or `basic`. */
19
+ scheme?: string;
20
+ /** `http` bearer: a hint at the token format, e.g. `JWT`. */
21
+ bearerFormat?: string;
22
+ }
23
+ /** One security requirement: scheme name -> required scopes (empty outside OAuth). */
24
+ export type SecurityRequirementLike = Record<string, string[]>;
25
+ /** A scheme resolved out of `components.securitySchemes`, with its scopes. */
26
+ export interface ResolvedScheme {
27
+ /** The scheme's component name, e.g. `bearerAuth`. */
28
+ key: string;
29
+ /** The scheme object; undefined when the requirement names an unknown one. */
30
+ scheme?: SecuritySchemeLike;
31
+ scopes: string[];
32
+ }
33
+ /** The security state one operation renders. */
34
+ export interface OperationSecurity {
35
+ /** Ways to authorize (OR); every scheme within one entry is required (AND). */
36
+ alternatives: ResolvedScheme[][];
37
+ /** True when an empty requirement also allows unauthenticated calls. */
38
+ optional: boolean;
39
+ }
40
+ /**
41
+ * The requirement list an operation actually enforces: its own `security` when
42
+ * declared — the OpenAPI override rule, where `[]` removes the default and
43
+ * makes the operation public — else the document's root `security`. A webhook
44
+ * takes only its own: the API sends it, so the root requirements, which guard
45
+ * calls to the API, say nothing about what the receiving endpoint checks.
46
+ */
47
+ export declare const effectiveSecurity: (operation?: SecurityRequirementLike[], document?: SecurityRequirementLike[], webhook?: boolean) => SecurityRequirementLike[];
48
+ /**
49
+ * Resolve requirement names against `components.securitySchemes`. A name with
50
+ * no matching component is kept (with `scheme` undefined) so an inconsistent
51
+ * spec still renders the requirement instead of silently dropping it. An empty
52
+ * requirement object — the spec idiom for "auth optional" — contributes no
53
+ * alternative and flips `optional` instead.
54
+ */
55
+ export declare const resolveSecurity: (requirements: SecurityRequirementLike[], schemes: Record<string, SecuritySchemeLike> | undefined) => OperationSecurity;
56
+ /**
57
+ * One AsyncAPI 3.x security entry: a `$ref` into
58
+ * `components.securitySchemes`, or an inline scheme object (the shape the
59
+ * official 2.x converter emits for scoped requirements, `scopes` on the
60
+ * scheme itself).
61
+ */
62
+ export interface AsyncApiSecurityEntryLike {
63
+ $ref?: string;
64
+ type?: string;
65
+ scopes?: unknown;
66
+ }
67
+ /**
68
+ * Resolve an AsyncAPI 3.x security list. Unlike OpenAPI's requirement maps,
69
+ * each entry names a single scheme and any one entry satisfies the operation
70
+ * — so every entry becomes its own one-scheme "or" alternative. A `$ref`
71
+ * pointing at an undeclared scheme is kept (with `scheme` undefined),
72
+ * matching {@link resolveSecurity}'s render-don't-drop rule.
73
+ */
74
+ export declare const resolveAsyncApiSecurity: (entries: AsyncApiSecurityEntryLike[], schemes: Record<string, SecuritySchemeLike> | undefined) => OperationSecurity;
75
+ /** A short human label for a scheme row, e.g. `Bearer token` or `API key`. */
76
+ export declare const schemeLabel: (resolved: ResolvedScheme) => string;
77
+ /**
78
+ * Where the credential travels: the header/query/cookie parameter it occupies.
79
+ * Undefined for schemes with no request parameter (mutual TLS) and for unknown
80
+ * refs, where guessing a location would be misleading.
81
+ */
82
+ export declare const schemeCarrier: (resolved: ResolvedScheme) => {
83
+ name: string;
84
+ in: string;
85
+ } | undefined;
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ import type { HeadScript } from "../analytics/head.ts";
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ /** Options for {@link ethyca}. */
5
+ export interface EthycaOptions {
6
+ /**
7
+ * The key of the privacy notice that covers analytics, as you named it in
8
+ * Fides. Defaults to `analytics`.
9
+ */
10
+ notice?: string;
11
+ /** Your Fides privacy center's origin, which serves `fides.js`. */
12
+ privacyCenter: string;
13
+ /** The Fides property to load, when you have more than one. */
14
+ propertyId?: string;
15
+ }
16
+ export declare const ethycaOptionsSchema: z.ZodObject<{
17
+ notice: z.ZodOptional<z.ZodString>;
18
+ privacyCenter: z.ZodURL;
19
+ propertyId: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ export type EthycaAdapter = AdapterDescriptor<"ethyca", EthycaOptions>;
22
+ export declare const ethycaAdapterSchema: z.ZodObject<{
23
+ kind: z.ZodLiteral<"ethyca">;
24
+ options: z.ZodObject<{
25
+ notice: z.ZodOptional<z.ZodString>;
26
+ privacyCenter: z.ZodURL;
27
+ propertyId: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strict>;
29
+ requiredSecrets: z.ZodArray<z.ZodString>;
30
+ runtimeDeps: z.ZodArray<z.ZodString>;
31
+ }, z.core.$strict>;
32
+ /**
33
+ * Ethyca's Fides consent manager, loaded from your privacy center. Fides
34
+ * shows its own banner and modal, set up in Fides, and Blume runs the
35
+ * analytics once the reader's analytics notice is on. Nothing here is
36
+ * secret.
37
+ */
38
+ export declare const ethyca: (options: EthycaOptions) => EthycaAdapter;
39
+ /**
40
+ * Reports the analytics notice to `window.blumeConsent` when Fides is ready
41
+ * and whenever the reader saves a change, and reopens Fides' modal from the
42
+ * Cookie settings link. The notice key rides in as `data-notice`. It counts
43
+ * as allowed when on (`true`), opted in, or a notice that only asks for
44
+ * acknowledgment.
45
+ */
46
+ export declare const ETHYCA_BRIDGE = "(()=>{const c=window.blumeConsent;if(!c){return;}const k=document.currentScript?.dataset.notice??\"analytics\";const sync=(e)=>{const v=(e?.detail?.consent??window.Fides?.consent??{})[k];c.set({analytics:v===true||v===\"opt_in\"||v===\"acknowledge\"});};c.open=()=>window.Fides?.showModal();addEventListener(\"FidesReady\",sync);addEventListener(\"FidesUpdated\",sync);if(window.Fides?.initialized){sync();}})();";
47
+ /** Fides' script from the privacy center, then the bridge. */
48
+ export declare const ethycaHead: (options: EthycaOptions) => HeadScript[];
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Consent adapters for `blume.config.ts`:
3
+ *
4
+ * ```ts
5
+ * import { defineConfig } from "blume";
6
+ * import { googleAnalytics } from "blume/analytics";
7
+ * import { native } from "blume/consent";
8
+ *
9
+ * export default defineConfig({
10
+ * analytics: [googleAnalytics({ id: "G-XXXXXXXXXX" })],
11
+ * consent: native({ policy: "/privacy" }),
12
+ * });
13
+ * ```
14
+ *
15
+ * With `consent` set, analytics waits for the reader: every adapter's tags are
16
+ * held until the consent adapter reports that analytics is allowed. Each
17
+ * factory returns a plain descriptor (see `core/adapter.ts`).
18
+ *
19
+ * Adding a consent manager: a factory and option schema in its own module,
20
+ * and a member of `consentAdapterSchema` (`schema.ts`). Then connect it to
21
+ * `window.blumeConsent` (see `init.ts` for the contract): report the reader's
22
+ * choice with `set({ analytics })` on load and on every change, and set
23
+ * `open` to reopen the manager's preferences. A hosted manager does that
24
+ * with tags in `consentHead` (`head.ts`): its loader, then a constant bridge
25
+ * script (`osano.ts` is an example). A manager that ships as an npm package
26
+ * does it in a browser module instead, registered in `clients.ts`, with its
27
+ * packages in the factory's `runtimeDeps` (`native()`'s banner is the
28
+ * example).
29
+ */
30
+ export type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
31
+ export { ethyca } from "./ethyca.ts";
32
+ export type { EthycaAdapter, EthycaOptions } from "./ethyca.ts";
33
+ export { native } from "./native.ts";
34
+ export type { NativeAdapter, NativeOptions } from "./native.ts";
35
+ export { osano } from "./osano.ts";
36
+ export type { OsanoAdapter, OsanoOptions } from "./osano.ts";
37
+ export type { ConsentAdapter } from "./schema.ts";
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import type { AdapterDescriptor } from "../core/adapter.ts";
3
+ /** Options for {@link native}. */
4
+ export interface NativeOptions {
5
+ /** Where the banner's privacy policy link goes: a page route or a URL. */
6
+ policy?: string;
7
+ }
8
+ export declare const nativeOptionsSchema: z.ZodObject<{
9
+ policy: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strict>;
11
+ export type NativeAdapter = AdapterDescriptor<"native", NativeOptions>;
12
+ export declare const nativeAdapterSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"native">;
14
+ options: z.ZodObject<{
15
+ policy: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strict>;
17
+ requiredSecrets: z.ZodArray<z.ZodString>;
18
+ runtimeDeps: z.ZodArray<z.ZodString>;
19
+ }, z.core.$strict>;
20
+ /**
21
+ * Blume's own consent banner: a card at the foot of the page asking to use
22
+ * analytics cookies, with Accept and Decline side by side and an optional
23
+ * link to your privacy policy. The answer stays in the reader's browser, and
24
+ * the footer's Cookie settings link brings the banner back to change it. Its
25
+ * text comes from the `consent` UI strings, translated in every built-in
26
+ * language.
27
+ */
28
+ export declare const native: (options?: NativeOptions) => NativeAdapter;
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import type { HeadScript } from "../analytics/head.ts";
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ /** Options for {@link osano}. */
5
+ export interface OsanoOptions {
6
+ /** The configuration ID from the script tag Osano gives you. */
7
+ configId: string;
8
+ /** The customer ID from the script tag Osano gives you. */
9
+ customerId: string;
10
+ }
11
+ export declare const osanoOptionsSchema: z.ZodObject<{
12
+ configId: z.ZodString;
13
+ customerId: z.ZodString;
14
+ }, z.core.$strict>;
15
+ export type OsanoAdapter = AdapterDescriptor<"osano", OsanoOptions>;
16
+ export declare const osanoAdapterSchema: z.ZodObject<{
17
+ kind: z.ZodLiteral<"osano">;
18
+ options: z.ZodObject<{
19
+ configId: z.ZodString;
20
+ customerId: z.ZodString;
21
+ }, z.core.$strict>;
22
+ requiredSecrets: z.ZodArray<z.ZodString>;
23
+ runtimeDeps: z.ZodArray<z.ZodString>;
24
+ }, z.core.$strict>;
25
+ /**
26
+ * Osano Cookie Consent. Osano shows its own banner and drawer, set up in the
27
+ * Osano dashboard, and Blume runs the analytics once Osano reports the
28
+ * reader's `ANALYTICS` consent. Both IDs come from the script tag Osano
29
+ * gives you, and neither is secret.
30
+ */
31
+ export declare const osano: (options: OsanoOptions) => OsanoAdapter;
32
+ /**
33
+ * Reports Osano's analytics consent to `window.blumeConsent` now (`Osano.cm`
34
+ * is ready as soon as its script ran) and on every Osano consent event, and
35
+ * reopens Osano's drawer from the Cookie settings link.
36
+ */
37
+ export declare const OSANO_BRIDGE = "(()=>{const o=window.Osano?.cm;const c=window.blumeConsent;if(!o||!c){return;}const sync=()=>c.set({analytics:o.analytics===true});c.open=()=>o.showDrawer();for(const e of [\"osano-cm-initialized\",\"osano-cm-consent-saved\",\"osano-cm-consent-changed\"]){o.addEventListener(e,sync);}sync();})();";
38
+ /**
39
+ * Osano's loader, synchronous as its install guide requires, then the
40
+ * bridge. The IDs are path segments, so each is encoded.
41
+ */
42
+ export declare const osanoHead: (options: OsanoOptions) => HeadScript[];