blume 1.7.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+
7
+ /** The tracking-code version (`hjsv`) `hotjar()` uses when `version` is unset. */
8
+ export const HOTJAR_DEFAULT_VERSION = 6;
9
+
10
+ /** Options for {@link hotjar}. */
11
+ export interface HotjarOptions {
12
+ /** Site ID (`hjid`), from the site's tracking code. */
13
+ id: number;
14
+ /** Tracking-code version (`hjsv`). Defaults to the current one. */
15
+ version?: number;
16
+ }
17
+
18
+ export const hotjarOptionsSchema = z.strictObject({
19
+ id: z.number().int().positive(),
20
+ version: z.number().int().positive().optional(),
21
+ });
22
+
23
+ export type HotjarAdapter = AdapterDescriptor<"hotjar", HotjarOptions>;
24
+
25
+ export const hotjarAdapterSchema = adapterDescriptorSchema(
26
+ "hotjar",
27
+ hotjarOptionsSchema
28
+ );
29
+
30
+ /**
31
+ * Hotjar heatmaps and recordings. The site ID is public — it's in the tracking
32
+ * code on every page.
33
+ */
34
+ export const hotjar = (options: HotjarOptions): HotjarAdapter => ({
35
+ kind: "hotjar",
36
+ options,
37
+ requiredSecrets: [],
38
+ runtimeDeps: [],
39
+ });
40
+
41
+ /** The tracking code as the site's install instructions render it. */
42
+ export const hotjarHead = (options: HotjarOptions): HeadScript[] => [
43
+ {
44
+ attributes: {},
45
+ content: `(function(h,o,t,j,a,r){h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};h._hjSettings={hjid:${options.id},hjsv:${options.version ?? HOTJAR_DEFAULT_VERSION}};a=o.getElementsByTagName("head")[0];r=o.createElement("script");r.async=1;r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;a.appendChild(r);})(window,document,"https://static.hotjar.com/c/hotjar-",".js?sv=");`,
46
+ },
47
+ ];
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Analytics adapters for `blume.config.ts`:
3
+ *
4
+ * ```ts
5
+ * import { defineConfig } from "blume";
6
+ * import { plausible, posthog, script, vercel } from "blume/analytics";
7
+ *
8
+ * export default defineConfig({
9
+ * analytics: [
10
+ * posthog({ key: "phc_…" }),
11
+ * vercel(),
12
+ * plausible({ domain: "docs.example.com" }),
13
+ * script({ src: "…" }),
14
+ * ],
15
+ * });
16
+ * ```
17
+ *
18
+ * Each factory returns a plain descriptor (see `core/adapter.ts`) that the
19
+ * schema validates and the generated site inlines as a literal; nothing here
20
+ * runs in the browser.
21
+ */
22
+ export type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
23
+ export { adobe } from "./adobe.ts";
24
+ export type { AdobeAdapter, AdobeOptions } from "./adobe.ts";
25
+ export { amplitude } from "./amplitude.ts";
26
+ export type { AmplitudeAdapter, AmplitudeOptions } from "./amplitude.ts";
27
+ export { clarity } from "./clarity.ts";
28
+ export type { ClarityAdapter, ClarityOptions } from "./clarity.ts";
29
+ export { clearbit } from "./clearbit.ts";
30
+ export type { ClearbitAdapter, ClearbitOptions } from "./clearbit.ts";
31
+ export { cloudflare } from "./cloudflare.ts";
32
+ export type { CloudflareAdapter, CloudflareOptions } from "./cloudflare.ts";
33
+ export { fathom } from "./fathom.ts";
34
+ export type { FathomAdapter, FathomOptions } from "./fathom.ts";
35
+ export { googleAnalytics } from "./google-analytics.ts";
36
+ export type {
37
+ GoogleAnalyticsAdapter,
38
+ GoogleAnalyticsOptions,
39
+ } from "./google-analytics.ts";
40
+ export { googleTagManager } from "./google-tag-manager.ts";
41
+ export type {
42
+ GoogleTagManagerAdapter,
43
+ GoogleTagManagerOptions,
44
+ } from "./google-tag-manager.ts";
45
+ export { heap } from "./heap.ts";
46
+ export type { HeapAdapter, HeapOptions } from "./heap.ts";
47
+ export { hightouch } from "./hightouch.ts";
48
+ export type { HightouchAdapter, HightouchOptions } from "./hightouch.ts";
49
+ export { hotjar } from "./hotjar.ts";
50
+ export type { HotjarAdapter, HotjarOptions } from "./hotjar.ts";
51
+ export { logrocket } from "./logrocket.ts";
52
+ export type { LogrocketAdapter, LogrocketOptions } from "./logrocket.ts";
53
+ export { mixpanel } from "./mixpanel.ts";
54
+ export type {
55
+ MixpanelAdapter,
56
+ MixpanelOptions,
57
+ MixpanelRegion,
58
+ } from "./mixpanel.ts";
59
+ export { pirsch } from "./pirsch.ts";
60
+ export type { PirschAdapter, PirschOptions } from "./pirsch.ts";
61
+ export { plausible } from "./plausible.ts";
62
+ export type { PlausibleAdapter, PlausibleOptions } from "./plausible.ts";
63
+ export { posthog } from "./posthog.ts";
64
+ export type { PosthogAdapter, PosthogOptions } from "./posthog.ts";
65
+ export type { AnalyticsAdapter } from "./schema.ts";
66
+ export { script } from "./script.ts";
67
+ export type { ScriptAdapter, ScriptOptions } from "./script.ts";
68
+ export { segment } from "./segment.ts";
69
+ export type { SegmentAdapter, SegmentOptions } from "./segment.ts";
70
+ export { vercel } from "./vercel.ts";
71
+ export type { VercelAdapter, VercelOptions } from "./vercel.ts";
@@ -0,0 +1,21 @@
1
+ import type { JsonValue } from "../core/adapter.ts";
2
+
3
+ /**
4
+ * JSON for an inline `<script>` body. `JSON.stringify` leaves `<` alone, so a
5
+ * value like `</script>` would end the script element early; escape it the way
6
+ * the layouts do for their JSON.
7
+ */
8
+ export const inlineJson = (value: JsonValue): string =>
9
+ JSON.stringify(value).replaceAll("<", "\\u003c");
10
+
11
+ /**
12
+ * A snippet that re-sends a pageview on every client-router navigation, for a
13
+ * provider whose loader only counts real page loads. Keyed off
14
+ * `astro:page-load` with a path-plus-query guard held in `window[slot]`, so the
15
+ * initial load (which the loader already counted) and same-page hash moves
16
+ * aren't double-counted, while a query-only navigation (`?tab=a` → `?tab=b`)
17
+ * still is. Each adapter passes its own slot: two adapters sharing one would
18
+ * see the second always match the first's update and never fire.
19
+ */
20
+ export const spaPageviews = (slot: string, capture: string): string =>
21
+ `document.addEventListener("astro:page-load",function(){var p=window.${slot},c=location.pathname+location.search;window.${slot}=c;if(p!==undefined&&p!==c){${capture}}});`;
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+ import { inlineJson } from "./inline.ts";
7
+
8
+ /** The SDK script LogRocket's install snippet loads. */
9
+ export const LOGROCKET_SCRIPT_SRC = "https://cdn.logrocket.io/LogRocket.min.js";
10
+
11
+ /** The options {@link logrocket} maps itself. */
12
+ export interface LogrocketNamedOptions {
13
+ /** App ID (`org/app`), from the project's settings. */
14
+ id: string;
15
+ }
16
+
17
+ /**
18
+ * Options for {@link logrocket}: the app ID plus any other `LogRocket.init`
19
+ * option, forwarded verbatim (`release`, `console`, `network`, `dom`, …). JSON
20
+ * values only; a sanitizer function can't travel through config — call
21
+ * `LogRocket.init` yourself from a `script()` adapter for those.
22
+ */
23
+ export type LogrocketOptions = LogrocketNamedOptions & {
24
+ [option: string]: JsonValue;
25
+ };
26
+
27
+ export const logrocketOptionsSchema = z
28
+ .object({
29
+ id: z.string().min(1),
30
+ })
31
+ .catchall(z.json());
32
+
33
+ export type LogrocketAdapter = AdapterDescriptor<"logrocket", LogrocketOptions>;
34
+
35
+ export const logrocketAdapterSchema = adapterDescriptorSchema(
36
+ "logrocket",
37
+ logrocketOptionsSchema
38
+ );
39
+
40
+ /**
41
+ * LogRocket session replay. The app ID is public — it's what the SDK reports
42
+ * under.
43
+ */
44
+ export const logrocket = (options: LogrocketOptions): LogrocketAdapter => ({
45
+ kind: "logrocket",
46
+ options,
47
+ requiredSecrets: [],
48
+ runtimeDeps: [],
49
+ });
50
+
51
+ /**
52
+ * The two tags from the install snippet: the SDK (synchronous, so
53
+ * `window.LogRocket` exists for the next tag) and the guarded `init` call,
54
+ * with `id` mapped and everything else forwarded to `init` verbatim; the
55
+ * options object is left off when there is nothing to pass, as the snippet
56
+ * prints it. A session spans client-router navigations on its own.
57
+ */
58
+ export const logrocketHead = (options: LogrocketOptions): HeadScript[] => {
59
+ const { id, ...init } = options;
60
+ const call =
61
+ Object.keys(init).length === 0
62
+ ? `window.LogRocket.init(${inlineJson(id)})`
63
+ : `window.LogRocket.init(${inlineJson(id)},${inlineJson(init)})`;
64
+ return [
65
+ {
66
+ attributes: { crossorigin: "anonymous", src: LOGROCKET_SCRIPT_SRC },
67
+ content: null,
68
+ },
69
+ { attributes: {}, content: `window.LogRocket&&${call};` },
70
+ ];
71
+ };
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+ import { inlineJson } from "./inline.ts";
7
+
8
+ /** Mixpanel's data residency regions and the ingestion host each one uses. */
9
+ export const MIXPANEL_REGION_HOSTS = {
10
+ eu: "https://api-eu.mixpanel.com",
11
+ in: "https://api-in.mixpanel.com",
12
+ us: "https://api.mixpanel.com",
13
+ } as const;
14
+
15
+ export type MixpanelRegion = keyof typeof MIXPANEL_REGION_HOSTS;
16
+
17
+ /** The options {@link mixpanel} maps itself. */
18
+ export interface MixpanelNamedOptions {
19
+ /** Data residency region of the project. Defaults to US. */
20
+ region?: MixpanelRegion;
21
+ /** Project token. */
22
+ token: string;
23
+ }
24
+
25
+ /**
26
+ * Options for {@link mixpanel}: the named options plus any other
27
+ * `mixpanel.init` option, forwarded verbatim (`persistence`, `autocapture`,
28
+ * `record_sessions_percent`, `debug`, …). JSON values only.
29
+ */
30
+ export type MixpanelOptions = MixpanelNamedOptions & {
31
+ [option: string]: JsonValue;
32
+ };
33
+
34
+ export const mixpanelOptionsSchema = z
35
+ .object({
36
+ region: z.enum(["us", "eu", "in"]).optional(),
37
+ token: z.string().min(1),
38
+ })
39
+ .catchall(z.json());
40
+
41
+ export type MixpanelAdapter = AdapterDescriptor<"mixpanel", MixpanelOptions>;
42
+
43
+ export const mixpanelAdapterSchema = adapterDescriptorSchema(
44
+ "mixpanel",
45
+ mixpanelOptionsSchema
46
+ );
47
+
48
+ /**
49
+ * Mixpanel product analytics. The project token is public — it's what every
50
+ * browser event carries.
51
+ */
52
+ export const mixpanel = (options: MixpanelOptions): MixpanelAdapter => ({
53
+ kind: "mixpanel",
54
+ options,
55
+ requiredSecrets: [],
56
+ runtimeDeps: [],
57
+ });
58
+
59
+ // The official loader snippet: a `window.mixpanel` stub that queues calls and
60
+ // injects the library.
61
+ const MIXPANEL_LOADER =
62
+ '(function(f,b){if(!b.__SV){var e,g,i,h;window.mixpanel=b;b._i=[];b.init=function(e,f,c){function g(a,d){var b=d.split(".");2==b.length&&(a=a[b[0]],d=b[1]);a[d]=function(){a.push([d].concat(Array.prototype.slice.call(arguments,0)))}}var a=b;"undefined"!==typeof c?a=b[c]=[]:c="mixpanel";a.people=a.people||[];a.toString=function(a){var d="mixpanel";"mixpanel"!==c&&(d+="."+c);a||(d+=" (stub)");return d};a.people.toString=function(){return a.toString(1)+".people (stub)"};i="disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split(" ");for(h=0;h<i.length;h++)g(a,i[h]);var j="set set_once union unset remove delete".split(" ");a.get_group=function(){function b(c){d[c]=function(){call2_args=arguments;call2=[c].concat(Array.prototype.slice.call(call2_args,0));a.push([e,call2])}}for(var d={},e=["get_group"].concat(Array.prototype.slice.call(arguments,0)),c=0;c<j.length;c++)b(j[c]);return d};b._i.push([e,f,c])};b.__SV=1.2;e=f.createElement("script");e.type="text/javascript";e.async=!0;e.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:"file:"===f.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\\/\\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";g=f.getElementsByTagName("script")[0];g.parentNode.insertBefore(e,g)}})(document,window.mixpanel||[]);';
63
+
64
+ /**
65
+ * The init options `mixpanel()` starts from. The library counts one pageview
66
+ * per real page load with `track_pageview: true`; this mode has it track each
67
+ * path-or-query change too, so client-router navigations count without any
68
+ * extra hook. A passthrough option overrides it.
69
+ */
70
+ export const MIXPANEL_DEFAULT_INIT = {
71
+ track_pageview: "url-with-path-and-query-string",
72
+ };
73
+
74
+ /**
75
+ * The loader plus `mixpanel.init` with `token` mapped and `region` mapped to
76
+ * `api_host` (the US host when unset); everything else lands in the init
77
+ * options verbatim, after the mapped host so a raw `api_host` still wins.
78
+ */
79
+ export const mixpanelHead = (options: MixpanelOptions): HeadScript[] => {
80
+ const { region, token, ...init } = options;
81
+ const initOptions = {
82
+ ...MIXPANEL_DEFAULT_INIT,
83
+ api_host: MIXPANEL_REGION_HOSTS[region ?? "us"],
84
+ ...init,
85
+ };
86
+ return [
87
+ {
88
+ attributes: {},
89
+ content: `${MIXPANEL_LOADER}mixpanel.init(${inlineJson(token)},${inlineJson(initOptions)});`,
90
+ },
91
+ ];
92
+ };
@@ -0,0 +1,66 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+
7
+ /** The script Pirsch's dashboard snippet loads. */
8
+ export const PIRSCH_SCRIPT_SRC = "https://api.pirsch.io/pa.js";
9
+
10
+ /** The options {@link pirsch} maps itself. */
11
+ export interface PirschNamedOptions {
12
+ /** Identification code, from Settings → Developer → Identification Code. */
13
+ code: string;
14
+ }
15
+
16
+ /**
17
+ * Options for {@link pirsch}: the identification code plus any other script
18
+ * setting, forwarded as a `data-` attribute on the tag (`dev` → `data-dev`,
19
+ * `exclude`, `include`, `domain`, `endpoint`, …).
20
+ */
21
+ export type PirschOptions = PirschNamedOptions & {
22
+ [setting: string]: string;
23
+ };
24
+
25
+ export const pirschOptionsSchema = z
26
+ .object({
27
+ code: z.string().min(1),
28
+ })
29
+ .catchall(z.string());
30
+
31
+ export type PirschAdapter = AdapterDescriptor<"pirsch", PirschOptions>;
32
+
33
+ export const pirschAdapterSchema = adapterDescriptorSchema(
34
+ "pirsch",
35
+ pirschOptionsSchema
36
+ );
37
+
38
+ /**
39
+ * Pirsch Analytics. The identification code is public — it's in the tag on
40
+ * every page.
41
+ */
42
+ export const pirsch = (options: PirschOptions): PirschAdapter => ({
43
+ kind: "pirsch",
44
+ options,
45
+ requiredSecrets: [],
46
+ runtimeDeps: [],
47
+ });
48
+
49
+ /**
50
+ * The deferred tag from the dashboard, with `code` as `data-code`, every other
51
+ * option as its own `data-` attribute, and the `pianjs` id the script finds
52
+ * itself by. Pirsch's script tracks history changes on its own, so
53
+ * client-router navigations need no extra hook.
54
+ */
55
+ export const pirschHead = (options: PirschOptions): HeadScript[] => {
56
+ const { code, ...settings } = options;
57
+ const attributes: HeadScript["attributes"] = {};
58
+ for (const [setting, value] of Object.entries(settings)) {
59
+ attributes[`data-${setting}`] = value;
60
+ }
61
+ attributes["data-code"] = code;
62
+ attributes.defer = true;
63
+ attributes.id = "pianjs";
64
+ attributes.src = PIRSCH_SCRIPT_SRC;
65
+ return [{ attributes, content: null }];
66
+ };
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+
7
+ /** Plausible Cloud, the origin `plausible()` loads the script from when `host` is unset. */
8
+ export const PLAUSIBLE_DEFAULT_HOST = "https://plausible.io";
9
+
10
+ /** The options {@link plausible} maps itself. */
11
+ export interface PlausibleNamedOptions {
12
+ /** The site's domain as added in Plausible, e.g. `docs.example.com`. */
13
+ domain: string;
14
+ /**
15
+ * Origin of a self-hosted (or proxied) Plausible instance, e.g.
16
+ * `https://plausible.example.com`. Defaults to Plausible Cloud.
17
+ */
18
+ host?: string;
19
+ }
20
+
21
+ /**
22
+ * Options for {@link plausible}: the named options plus any other script
23
+ * setting, forwarded as a `data-` attribute on the tag (`api` → `data-api`,
24
+ * `"exclude"`, `"include"`, …).
25
+ */
26
+ export type PlausibleOptions = PlausibleNamedOptions & {
27
+ [setting: string]: string;
28
+ };
29
+
30
+ export const plausibleOptionsSchema = z
31
+ .object({
32
+ domain: z.string().min(1),
33
+ host: z.string().min(1).optional(),
34
+ })
35
+ .catchall(z.string());
36
+
37
+ export type PlausibleAdapter = AdapterDescriptor<"plausible", PlausibleOptions>;
38
+
39
+ export const plausibleAdapterSchema = adapterDescriptorSchema(
40
+ "plausible",
41
+ plausibleOptionsSchema
42
+ );
43
+
44
+ /**
45
+ * Plausible Analytics. Nothing here is secret: the tag names the site and
46
+ * where to send events.
47
+ */
48
+ export const plausible = (options: PlausibleOptions): PlausibleAdapter => ({
49
+ kind: "plausible",
50
+ options,
51
+ requiredSecrets: [],
52
+ runtimeDeps: [],
53
+ });
54
+
55
+ /**
56
+ * The queue stub from Plausible's custom-events guide: `plausible()` calls
57
+ * made before the deferred script lands are buffered on `plausible.q` and
58
+ * replayed once it loads, so an early `track()` isn't lost.
59
+ */
60
+ export const PLAUSIBLE_QUEUE =
61
+ "window.plausible=window.plausible||function(){(window.plausible.q=window.plausible.q||[]).push(arguments)}";
62
+
63
+ /**
64
+ * The deferred tag from the site's install instructions, with `domain` as
65
+ * `data-domain`, `host` as the script origin, and every other option as its
66
+ * own `data-` attribute, followed by the custom-event queue stub. Plausible's
67
+ * script tracks history changes on its own, so client-router navigations
68
+ * need no extra hook.
69
+ */
70
+ export const plausibleHead = (options: PlausibleOptions): HeadScript[] => {
71
+ const { domain, host, ...settings } = options;
72
+ const attributes: HeadScript["attributes"] = {};
73
+ for (const [setting, value] of Object.entries(settings)) {
74
+ attributes[`data-${setting}`] = value;
75
+ }
76
+ attributes["data-domain"] = domain;
77
+ attributes.defer = true;
78
+ attributes.src = `${(host ?? PLAUSIBLE_DEFAULT_HOST).replace(/\/+$/u, "")}/js/script.js`;
79
+ return [
80
+ { attributes, content: null },
81
+ { attributes: {}, content: PLAUSIBLE_QUEUE },
82
+ ];
83
+ };
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+ import { inlineJson, spaPageviews } from "./inline.ts";
7
+
8
+ /** PostHog Cloud US, the ingestion host `posthog()` uses when `host` is unset. */
9
+ export const POSTHOG_DEFAULT_HOST = "https://us.i.posthog.com";
10
+
11
+ /** The options {@link posthog} maps itself. */
12
+ export interface PosthogNamedOptions {
13
+ /** API host (for self-hosted / EU). Defaults to PostHog Cloud US. */
14
+ host?: string;
15
+ /** Project API key. */
16
+ key: string;
17
+ }
18
+
19
+ /**
20
+ * Options for {@link posthog}: the named options plus any other `posthog.init`
21
+ * option, forwarded verbatim (`persistence`, `capture_pageview`,
22
+ * `autocapture`, …). JSON values only.
23
+ */
24
+ export type PosthogOptions = PosthogNamedOptions & {
25
+ [option: string]: JsonValue;
26
+ };
27
+
28
+ export const posthogOptionsSchema = z
29
+ .object({
30
+ host: z.string().optional(),
31
+ key: z.string().min(1),
32
+ })
33
+ .catchall(z.json());
34
+
35
+ export type PosthogAdapter = AdapterDescriptor<"posthog", PosthogOptions>;
36
+
37
+ export const posthogAdapterSchema = adapterDescriptorSchema(
38
+ "posthog",
39
+ posthogOptionsSchema
40
+ );
41
+
42
+ /**
43
+ * PostHog product analytics. The project API key is public and write-only, so
44
+ * it is safe to ship to the browser.
45
+ */
46
+ export const posthog = (options: PosthogOptions): PosthogAdapter => ({
47
+ kind: "posthog",
48
+ options,
49
+ requiredSecrets: [],
50
+ runtimeDeps: [],
51
+ });
52
+
53
+ // The official array.js loader snippet.
54
+ const POSTHOG_LOADER =
55
+ '!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);';
56
+
57
+ // PostHog's loader only captures a pageview per real page load, so the client
58
+ // router's in-place swaps are captured here.
59
+ const POSTHOG_SPA_PAGEVIEWS = spaPageviews(
60
+ "__blumePosthogPath",
61
+ 'posthog.capture("$pageview");'
62
+ );
63
+
64
+ /**
65
+ * The inline loader-plus-init snippet. `key` and `host` are the options Blume
66
+ * maps (`host` becomes `api_host`); everything else lands in `posthog.init`'s
67
+ * options verbatim, after the mapped host so a raw `api_host` still wins.
68
+ */
69
+ export const posthogHead = (options: PosthogOptions): HeadScript[] => {
70
+ const { host, key, ...init } = options;
71
+ const initOptions = { api_host: host ?? POSTHOG_DEFAULT_HOST, ...init };
72
+ return [
73
+ {
74
+ attributes: {},
75
+ content: `${POSTHOG_LOADER}posthog.init(${inlineJson(key)},${inlineJson(initOptions)});${POSTHOG_SPA_PAGEVIEWS}`,
76
+ },
77
+ ];
78
+ };
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+
3
+ import { adobeAdapterSchema } from "./adobe.ts";
4
+ import { amplitudeAdapterSchema } from "./amplitude.ts";
5
+ import { clarityAdapterSchema } from "./clarity.ts";
6
+ import { clearbitAdapterSchema } from "./clearbit.ts";
7
+ import { cloudflareAdapterSchema } from "./cloudflare.ts";
8
+ import { fathomAdapterSchema } from "./fathom.ts";
9
+ import { googleAnalyticsAdapterSchema } from "./google-analytics.ts";
10
+ import { googleTagManagerAdapterSchema } from "./google-tag-manager.ts";
11
+ import { heapAdapterSchema } from "./heap.ts";
12
+ import { hightouchAdapterSchema } from "./hightouch.ts";
13
+ import { hotjarAdapterSchema } from "./hotjar.ts";
14
+ import { logrocketAdapterSchema } from "./logrocket.ts";
15
+ import { mixpanelAdapterSchema } from "./mixpanel.ts";
16
+ import { pirschAdapterSchema } from "./pirsch.ts";
17
+ import { plausibleAdapterSchema } from "./plausible.ts";
18
+ import { posthogAdapterSchema } from "./posthog.ts";
19
+ import { scriptAdapterSchema } from "./script.ts";
20
+ import { segmentAdapterSchema } from "./segment.ts";
21
+ import { vercelAdapterSchema } from "./vercel.ts";
22
+
23
+ /** One configured analytics adapter, as its factory returned it. */
24
+ export const analyticsAdapterSchema = z.discriminatedUnion("kind", [
25
+ adobeAdapterSchema,
26
+ amplitudeAdapterSchema,
27
+ clarityAdapterSchema,
28
+ clearbitAdapterSchema,
29
+ cloudflareAdapterSchema,
30
+ fathomAdapterSchema,
31
+ googleAnalyticsAdapterSchema,
32
+ googleTagManagerAdapterSchema,
33
+ heapAdapterSchema,
34
+ hightouchAdapterSchema,
35
+ hotjarAdapterSchema,
36
+ logrocketAdapterSchema,
37
+ mixpanelAdapterSchema,
38
+ pirschAdapterSchema,
39
+ plausibleAdapterSchema,
40
+ posthogAdapterSchema,
41
+ scriptAdapterSchema,
42
+ segmentAdapterSchema,
43
+ vercelAdapterSchema,
44
+ ]);
45
+
46
+ export type AnalyticsAdapter = z.output<typeof analyticsAdapterSchema>;
47
+
48
+ const ARRAY_HINT =
49
+ 'analytics is a list of adapters — e.g. `analytics: [posthog({ key }), vercel(), plausible({ domain }), script({ src })]`, imported from "blume/analytics".';
50
+
51
+ /**
52
+ * `blume.config.analytics`: the adapters to emit, in order. Unset means none.
53
+ * A non-array (the pre-adapter object form, say) fails with the list hint;
54
+ * element errors keep their own messages.
55
+ */
56
+ export const analyticsConfigSchema = z
57
+ .array(analyticsAdapterSchema, {
58
+ error: (issue) => (issue.code === "invalid_type" ? ARRAY_HINT : undefined),
59
+ })
60
+ .default([]);
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+
3
+ import type { AdapterDescriptor } from "../core/adapter.ts";
4
+ import { adapterDescriptorSchema } from "../core/adapter.ts";
5
+ import type { HeadScript } from "./head.ts";
6
+
7
+ /** Options for {@link script}; set exactly one of `src` or `content`. */
8
+ export interface ScriptOptions {
9
+ /** Extra attributes spread onto the `<script>` (e.g. `data-domain`, `id`). */
10
+ attributes?: Record<string, string>;
11
+ /** Inline script body. Mutually exclusive with `src`. */
12
+ content?: string;
13
+ /** External script URL. Mutually exclusive with `content`. */
14
+ src?: string;
15
+ /** Load strategy for an external script. */
16
+ strategy?: "async" | "defer";
17
+ }
18
+
19
+ export const scriptOptionsSchema = z
20
+ .strictObject({
21
+ attributes: z.record(z.string(), z.string()).optional(),
22
+ content: z.string().optional(),
23
+ src: z.string().optional(),
24
+ strategy: z.enum(["async", "defer"]).optional(),
25
+ })
26
+ .refine((value) => Boolean(value.src) !== Boolean(value.content), {
27
+ message: "An analytics script must set exactly one of `src` or `content`.",
28
+ });
29
+
30
+ export type ScriptAdapter = AdapterDescriptor<"script", ScriptOptions>;
31
+
32
+ export const scriptAdapterSchema = adapterDescriptorSchema(
33
+ "script",
34
+ scriptOptionsSchema
35
+ );
36
+
37
+ /**
38
+ * Any other provider (Plausible, Fathom, GA, Umami, …) as one `<script>` tag:
39
+ * external via `src`, inline via `content`. `attributes` is the verbatim
40
+ * passthrough here — every entry lands on the tag as-is.
41
+ */
42
+ export const script = (options: ScriptOptions): ScriptAdapter => ({
43
+ kind: "script",
44
+ options,
45
+ requiredSecrets: [],
46
+ runtimeDeps: [],
47
+ });
48
+
49
+ /** The tag. Explicit `src`/`strategy` win over a same-named spread attribute. */
50
+ export const scriptHead = (options: ScriptOptions): HeadScript[] => {
51
+ const attributes: HeadScript["attributes"] = { ...options.attributes };
52
+ if (!options.src) {
53
+ return [{ attributes, content: options.content ?? "" }];
54
+ }
55
+ if (options.strategy) {
56
+ attributes[options.strategy] = true;
57
+ }
58
+ attributes.src = options.src;
59
+ return [{ attributes, content: null }];
60
+ };