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.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +245 -0
- package/README.md +34 -21
- package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/chunk-5shv93fd.js +39 -0
- package/dist/cli/chunk-5shv93fd.js.map +10 -0
- package/dist/cli/chunk-6crbhc3x.js +361 -0
- package/dist/cli/chunk-6crbhc3x.js.map +14 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/chunk-6vm74dry.js +148 -0
- package/dist/cli/chunk-6vm74dry.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
- package/dist/cli/chunk-79jhk4py.js.map +35 -0
- package/dist/cli/chunk-82bbrxdn.js +51 -0
- package/dist/cli/chunk-82bbrxdn.js.map +10 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-ah61y8py.js +75 -0
- package/dist/cli/chunk-ah61y8py.js.map +11 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/chunk-ch6g3ar0.js +102 -0
- package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
- package/dist/cli/chunk-dh8cwk36.js +279 -0
- package/dist/cli/chunk-dh8cwk36.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
- package/dist/cli/chunk-f2z5v128.js +97 -0
- package/dist/cli/chunk-f2z5v128.js.map +10 -0
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
- package/dist/cli/chunk-fs23ddbb.js.map +35 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
- package/dist/cli/chunk-hdpx1tax.js +91 -0
- package/dist/cli/chunk-hdpx1tax.js.map +10 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
- package/dist/cli/chunk-jwyddg7y.js.map +15 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
- package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
- package/dist/cli/chunk-m3vmjgmq.js +133 -0
- package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
- package/dist/cli/chunk-mb2919y2.js.map +10 -0
- package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
- package/dist/cli/chunk-q5163e60.js.map +11 -0
- package/dist/cli/chunk-qkqwkpte.js +12437 -0
- package/dist/cli/chunk-qkqwkpte.js.map +182 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
- package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
- package/dist/cli/chunk-s1p84fyh.js +261 -0
- package/dist/cli/chunk-s1p84fyh.js.map +10 -0
- package/dist/cli/chunk-s6jhgk0q.js +176 -0
- package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
- package/dist/cli/chunk-vtk4a6dg.js +374 -0
- package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
- package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
- package/dist/cli/chunk-wm7js3j9.js +145 -0
- package/dist/cli/chunk-wm7js3j9.js.map +11 -0
- package/dist/cli/chunk-yt5n7ppj.js +79 -0
- package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
- package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/chunk-zxh4d9vy.js +122 -0
- package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask-context.d.ts +7 -7
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +197 -526
- package/dist/types/core/config.d.ts +61 -35
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +30 -15
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +12 -10
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2284 -454
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/orama-index.d.ts +1 -1
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +52 -28
- package/docs/03-upgrading.mdx +364 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +5 -5
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +22 -10
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +9 -9
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/assistant.mdx +357 -0
- package/docs/configuration/customization.mdx +16 -10
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +76 -55
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +9 -7
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +11 -6
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +12 -12
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +4 -4
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +23 -10
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +25 -26
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +3 -3
- package/src/ai/ask.ts +637 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/cors.ts +3 -3
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +5 -2
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +3 -3
- package/src/ai/skills.ts +1 -1
- package/src/ai/visibility.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +129 -361
- package/src/astro/integration.ts +2 -6
- package/src/astro/module-types.ts +1 -1
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +575 -562
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/blume-modules.d.ts +2 -2
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +40 -21
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +92 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +5 -5
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +5 -5
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +39 -12
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +36 -11
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +93 -30
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +58 -11
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +22 -13
- package/src/components/layout/RootLayout.astro +75 -72
- package/src/components/layout/Search.astro +43 -19
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +73 -16
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/description.ts +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/code-fences.ts +1 -1
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +201 -566
- package/src/core/config.ts +131 -42
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +34 -15
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +41 -11
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +528 -745
- package/src/core/server-features.ts +10 -11
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +10 -7
- package/src/core/ui-packs/bg.ts +10 -7
- package/src/core/ui-packs/bn.ts +10 -7
- package/src/core/ui-packs/ca.ts +7 -6
- package/src/core/ui-packs/cs.ts +10 -7
- package/src/core/ui-packs/da.ts +10 -7
- package/src/core/ui-packs/de.ts +10 -7
- package/src/core/ui-packs/el.ts +7 -6
- package/src/core/ui-packs/es.ts +7 -6
- package/src/core/ui-packs/fa.ts +10 -7
- package/src/core/ui-packs/fi.ts +10 -7
- package/src/core/ui-packs/fr.ts +7 -6
- package/src/core/ui-packs/he.ts +10 -7
- package/src/core/ui-packs/hi.ts +10 -7
- package/src/core/ui-packs/hr.ts +10 -7
- package/src/core/ui-packs/hu.ts +10 -7
- package/src/core/ui-packs/id.ts +10 -7
- package/src/core/ui-packs/it.ts +7 -6
- package/src/core/ui-packs/ja.ts +7 -6
- package/src/core/ui-packs/ko.ts +7 -6
- package/src/core/ui-packs/nl.ts +10 -7
- package/src/core/ui-packs/no.ts +10 -7
- package/src/core/ui-packs/pl.ts +10 -7
- package/src/core/ui-packs/pt-br.ts +7 -6
- package/src/core/ui-packs/pt.ts +7 -6
- package/src/core/ui-packs/ro.ts +10 -7
- package/src/core/ui-packs/ru.ts +10 -7
- package/src/core/ui-packs/sk.ts +10 -7
- package/src/core/ui-packs/sr.ts +10 -7
- package/src/core/ui-packs/sv.ts +10 -7
- package/src/core/ui-packs/th.ts +7 -6
- package/src/core/ui-packs/tr.ts +10 -7
- package/src/core/ui-packs/uk.ts +10 -7
- package/src/core/ui-packs/vi.ts +7 -6
- package/src/core/ui-packs/zh-tw.ts +7 -6
- package/src/core/ui-packs/zh.ts +7 -6
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +109 -53
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +8 -2
- package/src/search/orama-index.ts +1 -1
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/configuration/ask-ai.mdx +0 -256
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
- /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
|
+
};
|