blume 1.7.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +217 -0
- package/README.md +34 -21
- package/dist/cli/chunk-11j0384y.js +148 -0
- package/dist/cli/chunk-11j0384y.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
- package/dist/cli/chunk-2q1dwty4.js +75 -0
- package/dist/cli/chunk-2q1dwty4.js.map +11 -0
- package/dist/cli/chunk-41za066z.js +122 -0
- package/dist/cli/chunk-41za066z.js.map +11 -0
- package/dist/cli/chunk-5a2z0198.js +133 -0
- package/dist/cli/chunk-5a2z0198.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
- package/dist/cli/chunk-a9kptbw5.js +361 -0
- package/dist/cli/chunk-a9kptbw5.js.map +14 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-b5aj94ah.js +91 -0
- package/dist/cli/chunk-b5aj94ah.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
- package/dist/cli/chunk-bctazmbk.js.map +10 -0
- package/dist/cli/chunk-beat36xx.js +279 -0
- package/dist/cli/chunk-beat36xx.js.map +10 -0
- package/dist/cli/chunk-bnbmcwfb.js +145 -0
- package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
- package/dist/cli/chunk-by2290sx.js +39 -0
- package/dist/cli/chunk-by2290sx.js.map +10 -0
- package/dist/cli/chunk-d1tadaw7.js +79 -0
- package/dist/cli/chunk-d1tadaw7.js.map +10 -0
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
- package/dist/cli/chunk-d80hr03s.js.map +15 -0
- package/dist/cli/chunk-ernrthtr.js +97 -0
- package/dist/cli/chunk-ernrthtr.js.map +10 -0
- package/dist/cli/chunk-f2972sbt.js +374 -0
- package/dist/cli/chunk-f2972sbt.js.map +10 -0
- package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -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-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
- package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
- package/dist/cli/chunk-nk3ts2xk.js +51 -0
- package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
- package/dist/cli/chunk-pnnvybbk.js +176 -0
- package/dist/cli/chunk-pnnvybbk.js.map +11 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
- package/dist/cli/chunk-xaz13gwg.js +12449 -0
- package/dist/cli/chunk-xaz13gwg.js.map +182 -0
- package/dist/cli/chunk-y3e45rc8.js +102 -0
- package/dist/cli/chunk-y3e45rc8.js.map +10 -0
- package/dist/cli/chunk-z01ze5c1.js +261 -0
- package/dist/cli/chunk-z01ze5c1.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
- 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.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 +186 -515
- package/dist/types/core/config.d.ts +60 -34
- 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 +27 -12
- 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 +6 -2
- 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 +2282 -452
- 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/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 +50 -26
- package/docs/03-upgrading.mdx +351 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +20 -8
- 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} +9 -8
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +1 -1
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/ask-ai.mdx +162 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/search.mdx +75 -54
- 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 +8 -6
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +10 -5
- 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 +11 -11
- 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 +2 -2
- 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 +21 -8
- 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 +21 -22
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-data.ts +1 -1
- package/src/ai/ask.ts +624 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- 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 +4 -1
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +2 -2
- package/src/ai/skills.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 +112 -345
- package/src/astro/integration.ts +2 -6
- 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 +554 -541
- 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/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +39 -20
- 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 +90 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +2 -2
- 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 +2 -2
- 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 +38 -11
- 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/islands/hooks.ts +25 -2
- 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 +83 -20
- 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 +52 -5
- package/src/components/layout/ReferenceLayout.astro +21 -12
- package/src/components/layout/RootLayout.astro +69 -66
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +72 -15
- 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/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +188 -553
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +31 -12
- 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 +6 -2
- 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 +517 -739
- package/src/core/server-features.ts +8 -9
- 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 +6 -2
- package/src/core/ui-packs/bg.ts +6 -2
- package/src/core/ui-packs/bn.ts +6 -2
- package/src/core/ui-packs/ca.ts +3 -1
- package/src/core/ui-packs/cs.ts +6 -2
- package/src/core/ui-packs/da.ts +6 -2
- package/src/core/ui-packs/de.ts +6 -2
- package/src/core/ui-packs/el.ts +3 -1
- package/src/core/ui-packs/es.ts +3 -1
- package/src/core/ui-packs/fa.ts +6 -2
- package/src/core/ui-packs/fi.ts +6 -2
- package/src/core/ui-packs/fr.ts +3 -1
- package/src/core/ui-packs/he.ts +6 -2
- package/src/core/ui-packs/hi.ts +6 -2
- package/src/core/ui-packs/hr.ts +6 -2
- package/src/core/ui-packs/hu.ts +6 -2
- package/src/core/ui-packs/id.ts +6 -2
- package/src/core/ui-packs/it.ts +3 -1
- package/src/core/ui-packs/ja.ts +3 -1
- package/src/core/ui-packs/ko.ts +3 -1
- package/src/core/ui-packs/nl.ts +6 -2
- package/src/core/ui-packs/no.ts +6 -2
- package/src/core/ui-packs/pl.ts +6 -2
- package/src/core/ui-packs/pt-br.ts +3 -1
- package/src/core/ui-packs/pt.ts +3 -1
- package/src/core/ui-packs/ro.ts +6 -2
- package/src/core/ui-packs/ru.ts +6 -2
- package/src/core/ui-packs/sk.ts +6 -2
- package/src/core/ui-packs/sr.ts +6 -2
- package/src/core/ui-packs/sv.ts +6 -2
- package/src/core/ui-packs/th.ts +3 -1
- package/src/core/ui-packs/tr.ts +6 -2
- package/src/core/ui-packs/uk.ts +6 -2
- package/src/core/ui-packs/vi.ts +3 -1
- package/src/core/ui-packs/zh-tw.ts +3 -1
- package/src/core/ui-packs/zh.ts +3 -1
- 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 +97 -42
- 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 +6 -0
- 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/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-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.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
|
+
/** Options for {@link clearbit}. */
|
|
8
|
+
export interface ClearbitOptions {
|
|
9
|
+
/** Publishable API key (`pk_…`). */
|
|
10
|
+
key: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const clearbitOptionsSchema = z.strictObject({
|
|
14
|
+
key: z.string().min(1),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export type ClearbitAdapter = AdapterDescriptor<"clearbit", ClearbitOptions>;
|
|
18
|
+
|
|
19
|
+
export const clearbitAdapterSchema = adapterDescriptorSchema(
|
|
20
|
+
"clearbit",
|
|
21
|
+
clearbitOptionsSchema
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Clearbit's website tag (Reveal and the Clearbit tags it manages). The
|
|
26
|
+
* publishable key is meant for the browser.
|
|
27
|
+
*/
|
|
28
|
+
export const clearbit = (options: ClearbitOptions): ClearbitAdapter => ({
|
|
29
|
+
kind: "clearbit",
|
|
30
|
+
options,
|
|
31
|
+
requiredSecrets: [],
|
|
32
|
+
runtimeDeps: [],
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/** The tag origin; the key picks the tags bundle. */
|
|
36
|
+
export const CLEARBIT_TAG_ORIGIN = "https://tag.clearbitscripts.com/v1/";
|
|
37
|
+
|
|
38
|
+
/** The tag as Clearbit's install snippet renders it. */
|
|
39
|
+
export const clearbitHead = (options: ClearbitOptions): HeadScript[] => [
|
|
40
|
+
{
|
|
41
|
+
attributes: {
|
|
42
|
+
referrerpolicy: "strict-origin-when-cross-origin",
|
|
43
|
+
src: `${CLEARBIT_TAG_ORIGIN}${encodeURIComponent(options.key)}/tags.js`,
|
|
44
|
+
},
|
|
45
|
+
content: null,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
|
|
7
|
+
/** The beacon script Cloudflare's dashboard snippet loads. */
|
|
8
|
+
export const CLOUDFLARE_BEACON_SRC =
|
|
9
|
+
"https://static.cloudflareinsights.com/beacon.min.js";
|
|
10
|
+
|
|
11
|
+
/** The options {@link cloudflare} maps itself. */
|
|
12
|
+
export interface CloudflareNamedOptions {
|
|
13
|
+
/** Site token from the Web Analytics JS snippet (`data-cf-beacon`). */
|
|
14
|
+
token: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Options for {@link cloudflare}: the token plus any other `data-cf-beacon`
|
|
19
|
+
* setting, forwarded verbatim (`spa`, …). JSON values only.
|
|
20
|
+
*/
|
|
21
|
+
export type CloudflareOptions = CloudflareNamedOptions & {
|
|
22
|
+
[option: string]: JsonValue;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const cloudflareOptionsSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
token: z.string().min(1),
|
|
28
|
+
})
|
|
29
|
+
.catchall(z.json());
|
|
30
|
+
|
|
31
|
+
export type CloudflareAdapter = AdapterDescriptor<
|
|
32
|
+
"cloudflare",
|
|
33
|
+
CloudflareOptions
|
|
34
|
+
>;
|
|
35
|
+
|
|
36
|
+
export const cloudflareAdapterSchema = adapterDescriptorSchema(
|
|
37
|
+
"cloudflare",
|
|
38
|
+
cloudflareOptionsSchema
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Cloudflare Web Analytics in manual (JS snippet) mode, for a site Cloudflare
|
|
43
|
+
* doesn't proxy. A proxied zone with automatic RUM injection on needs no
|
|
44
|
+
* adapter at all — listing one there would count every pageview twice.
|
|
45
|
+
*/
|
|
46
|
+
export const cloudflare = (options: CloudflareOptions): CloudflareAdapter => ({
|
|
47
|
+
kind: "cloudflare",
|
|
48
|
+
options,
|
|
49
|
+
requiredSecrets: [],
|
|
50
|
+
runtimeDeps: [],
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The beacon tag exactly as the dashboard's snippet renders it, with the whole
|
|
55
|
+
* option object as its `data-cf-beacon` JSON. The beacon tracks history
|
|
56
|
+
* changes itself, so client-router navigations need no extra hook.
|
|
57
|
+
*/
|
|
58
|
+
export const cloudflareHead = (options: CloudflareOptions): HeadScript[] => [
|
|
59
|
+
{
|
|
60
|
+
attributes: {
|
|
61
|
+
"data-cf-beacon": JSON.stringify(options),
|
|
62
|
+
defer: true,
|
|
63
|
+
src: CLOUDFLARE_BEACON_SRC,
|
|
64
|
+
},
|
|
65
|
+
content: null,
|
|
66
|
+
},
|
|
67
|
+
];
|
|
@@ -0,0 +1,64 @@
|
|
|
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 Fathom's dashboard snippet loads. */
|
|
8
|
+
export const FATHOM_SCRIPT_SRC = "https://cdn.usefathom.com/script.js";
|
|
9
|
+
|
|
10
|
+
/** The options {@link fathom} maps itself. */
|
|
11
|
+
export interface FathomNamedOptions {
|
|
12
|
+
/** Site ID, from the site's script settings. */
|
|
13
|
+
site: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Options for {@link fathom}: the site ID plus any other script setting,
|
|
18
|
+
* forwarded as a `data-` attribute on the tag (`spa` → `data-spa`,
|
|
19
|
+
* `"honor-dnt"` → `data-honor-dnt`, `"excluded-domains"`, `canonical`, …).
|
|
20
|
+
*/
|
|
21
|
+
export type FathomOptions = FathomNamedOptions & {
|
|
22
|
+
[setting: string]: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const fathomOptionsSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
site: z.string().min(1),
|
|
28
|
+
})
|
|
29
|
+
.catchall(z.string());
|
|
30
|
+
|
|
31
|
+
export type FathomAdapter = AdapterDescriptor<"fathom", FathomOptions>;
|
|
32
|
+
|
|
33
|
+
export const fathomAdapterSchema = adapterDescriptorSchema(
|
|
34
|
+
"fathom",
|
|
35
|
+
fathomOptionsSchema
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Fathom Analytics. The site ID is public — it's in the tag on every page.
|
|
40
|
+
*/
|
|
41
|
+
export const fathom = (options: FathomOptions): FathomAdapter => ({
|
|
42
|
+
kind: "fathom",
|
|
43
|
+
options,
|
|
44
|
+
requiredSecrets: [],
|
|
45
|
+
runtimeDeps: [],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The deferred tag from the dashboard, with `site` as `data-site` and every
|
|
50
|
+
* other option as its own `data-` attribute. Fathom only tracks history
|
|
51
|
+
* changes when the tag opts in, so `spa` defaults to `"auto"` — Blume's
|
|
52
|
+
* client router navigates without full loads — and an explicit `spa` wins.
|
|
53
|
+
*/
|
|
54
|
+
export const fathomHead = (options: FathomOptions): HeadScript[] => {
|
|
55
|
+
const { site, ...settings } = { spa: "auto", ...options };
|
|
56
|
+
const attributes: HeadScript["attributes"] = {};
|
|
57
|
+
for (const [setting, value] of Object.entries(settings)) {
|
|
58
|
+
attributes[`data-${setting}`] = value;
|
|
59
|
+
}
|
|
60
|
+
attributes["data-site"] = site;
|
|
61
|
+
attributes.defer = true;
|
|
62
|
+
attributes.src = FATHOM_SCRIPT_SRC;
|
|
63
|
+
return [{ attributes, content: null }];
|
|
64
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
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 options {@link googleAnalytics} maps itself. */
|
|
9
|
+
export interface GoogleAnalyticsNamedOptions {
|
|
10
|
+
/** Measurement ID of the GA4 web data stream (`G-…`). */
|
|
11
|
+
id: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Options for {@link googleAnalytics}: the measurement ID plus any other
|
|
16
|
+
* `gtag('config', …)` parameter, forwarded verbatim (`send_page_view`,
|
|
17
|
+
* `anonymize_ip`, `cookie_domain`, `debug_mode`, …). JSON values only.
|
|
18
|
+
*/
|
|
19
|
+
export type GoogleAnalyticsOptions = GoogleAnalyticsNamedOptions & {
|
|
20
|
+
[parameter: string]: JsonValue;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const googleAnalyticsOptionsSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
id: z.string().min(1),
|
|
26
|
+
})
|
|
27
|
+
.catchall(z.json());
|
|
28
|
+
|
|
29
|
+
export type GoogleAnalyticsAdapter = AdapterDescriptor<
|
|
30
|
+
"google-analytics",
|
|
31
|
+
GoogleAnalyticsOptions
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
export const googleAnalyticsAdapterSchema = adapterDescriptorSchema(
|
|
35
|
+
"google-analytics",
|
|
36
|
+
googleAnalyticsOptionsSchema
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Google Analytics 4 through the Google tag (`gtag.js`). The measurement ID is
|
|
41
|
+
* public; it names the data stream the tag reports to.
|
|
42
|
+
*/
|
|
43
|
+
export const googleAnalytics = (
|
|
44
|
+
options: GoogleAnalyticsOptions
|
|
45
|
+
): GoogleAnalyticsAdapter => ({
|
|
46
|
+
kind: "google-analytics",
|
|
47
|
+
options,
|
|
48
|
+
requiredSecrets: [],
|
|
49
|
+
runtimeDeps: [],
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
/** The Google tag loader; the measurement ID travels in its query string. */
|
|
53
|
+
export const GOOGLE_TAG_SRC = "https://www.googletagmanager.com/gtag/js";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The two tags from the data stream's install instructions: the async loader
|
|
57
|
+
* and the `dataLayer` bootstrap with the `config` call. Extra options ride on
|
|
58
|
+
* the `config` call, and it is emitted bare when there are none, exactly as
|
|
59
|
+
* the instructions print it. GA4's enhanced measurement counts history
|
|
60
|
+
* changes as page views by default, so client-router navigations need no
|
|
61
|
+
* extra hook here.
|
|
62
|
+
*/
|
|
63
|
+
export const googleAnalyticsHead = (
|
|
64
|
+
options: GoogleAnalyticsOptions
|
|
65
|
+
): HeadScript[] => {
|
|
66
|
+
const { id, ...parameters } = options;
|
|
67
|
+
const config =
|
|
68
|
+
Object.keys(parameters).length === 0
|
|
69
|
+
? `gtag("config",${inlineJson(id)});`
|
|
70
|
+
: `gtag("config",${inlineJson(id)},${inlineJson(parameters)});`;
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
attributes: {
|
|
74
|
+
async: true,
|
|
75
|
+
src: `${GOOGLE_TAG_SRC}?id=${encodeURIComponent(id)}`,
|
|
76
|
+
},
|
|
77
|
+
content: null,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
attributes: {},
|
|
81
|
+
content: `window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag("js",new Date());${config}`,
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
import { inlineJson } from "./inline.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link googleTagManager}. */
|
|
9
|
+
export interface GoogleTagManagerOptions {
|
|
10
|
+
/** Name of the data layer global the container reads. Defaults to `dataLayer`. */
|
|
11
|
+
dataLayer?: string;
|
|
12
|
+
/** Container ID (`GTM-…`). */
|
|
13
|
+
id: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const googleTagManagerOptionsSchema = z.strictObject({
|
|
17
|
+
dataLayer: z.string().min(1).optional(),
|
|
18
|
+
id: z.string().min(1),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type GoogleTagManagerAdapter = AdapterDescriptor<
|
|
22
|
+
"google-tag-manager",
|
|
23
|
+
GoogleTagManagerOptions
|
|
24
|
+
>;
|
|
25
|
+
|
|
26
|
+
export const googleTagManagerAdapterSchema = adapterDescriptorSchema(
|
|
27
|
+
"google-tag-manager",
|
|
28
|
+
googleTagManagerOptionsSchema
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Google Tag Manager. Blume loads the container; which tags fire, and on what,
|
|
33
|
+
* is the container's configuration. The container ID is public.
|
|
34
|
+
*/
|
|
35
|
+
export const googleTagManager = (
|
|
36
|
+
options: GoogleTagManagerOptions
|
|
37
|
+
): GoogleTagManagerAdapter => ({
|
|
38
|
+
kind: "google-tag-manager",
|
|
39
|
+
options,
|
|
40
|
+
requiredSecrets: [],
|
|
41
|
+
runtimeDeps: [],
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The container snippet from the workspace's install instructions (the
|
|
46
|
+
* `<head>` half; the `<noscript>` iframe is for browsers without JavaScript,
|
|
47
|
+
* which never run analytics anyway). Client-router navigations reach the
|
|
48
|
+
* container as history changes — fire pageview tags from a History Change
|
|
49
|
+
* trigger rather than the page-load one. The snippet also keeps a reference
|
|
50
|
+
* to its data layer on `window.__blumeGtmLayer`, so `track()` pushes custom
|
|
51
|
+
* events into the layer this container reads rather than the default
|
|
52
|
+
* `dataLayer`.
|
|
53
|
+
*/
|
|
54
|
+
export const googleTagManagerHead = (
|
|
55
|
+
options: GoogleTagManagerOptions
|
|
56
|
+
): HeadScript[] => [
|
|
57
|
+
{
|
|
58
|
+
attributes: {},
|
|
59
|
+
content: `(function(w,d,s,l,i){w[l]=w[l]||[];w.__blumeGtmLayer=w[l];w[l].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!="dataLayer"?"&l="+l:"";j.async=true;j.src="https://www.googletagmanager.com/gtm.js?id="+i+dl;f.parentNode.insertBefore(j,f);})(window,document,"script",${inlineJson(options.dataLayer ?? "dataLayer")},${inlineJson(encodeURIComponent(options.id))});`,
|
|
60
|
+
},
|
|
61
|
+
];
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { adobeHead } from "./adobe.ts";
|
|
2
|
+
import { amplitudeHead } from "./amplitude.ts";
|
|
3
|
+
import { clarityHead } from "./clarity.ts";
|
|
4
|
+
import { clearbitHead } from "./clearbit.ts";
|
|
5
|
+
import { cloudflareHead } from "./cloudflare.ts";
|
|
6
|
+
import { fathomHead } from "./fathom.ts";
|
|
7
|
+
import { googleAnalyticsHead } from "./google-analytics.ts";
|
|
8
|
+
import { googleTagManagerHead } from "./google-tag-manager.ts";
|
|
9
|
+
import { heapHead } from "./heap.ts";
|
|
10
|
+
import { hightouchHead } from "./hightouch.ts";
|
|
11
|
+
import { hotjarHead } from "./hotjar.ts";
|
|
12
|
+
import { logrocketHead } from "./logrocket.ts";
|
|
13
|
+
import { mixpanelHead } from "./mixpanel.ts";
|
|
14
|
+
import { pirschHead } from "./pirsch.ts";
|
|
15
|
+
import { plausibleHead } from "./plausible.ts";
|
|
16
|
+
import { posthogHead } from "./posthog.ts";
|
|
17
|
+
import type { AnalyticsAdapter } from "./schema.ts";
|
|
18
|
+
import { scriptHead } from "./script.ts";
|
|
19
|
+
import { segmentHead } from "./segment.ts";
|
|
20
|
+
import type { VercelOptions } from "./vercel.ts";
|
|
21
|
+
|
|
22
|
+
/** One `<script>` tag an adapter emits into `<head>`. */
|
|
23
|
+
export interface HeadScript {
|
|
24
|
+
/**
|
|
25
|
+
* Attributes on the tag, including `src` for an external script. `true`
|
|
26
|
+
* renders a bare boolean attribute (`async`, `defer`).
|
|
27
|
+
*/
|
|
28
|
+
attributes: Record<string, string | boolean>;
|
|
29
|
+
/** Inline body, or `null` for an external script. */
|
|
30
|
+
content: string | null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* One thing `Analytics.astro` renders, in the adapters' declared order. Vercel
|
|
35
|
+
* is the one adapter that renders a component rather than a tag: the official
|
|
36
|
+
* component injects the first-party script and resolves the deployment's base
|
|
37
|
+
* path itself, so it travels as its props.
|
|
38
|
+
*/
|
|
39
|
+
export type HeadNode =
|
|
40
|
+
| (HeadScript & { type: "script" })
|
|
41
|
+
| { props: VercelOptions; type: "vercel" };
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The tags one adapter emits. Each adapter module owns its snippet; this is
|
|
45
|
+
* the one place that branches on `kind`. A provider whose install snippet is
|
|
46
|
+
* two tags (an SDK plus its init call) emits two.
|
|
47
|
+
*/
|
|
48
|
+
const adapterScripts = (
|
|
49
|
+
adapter: Exclude<AnalyticsAdapter, { kind: "vercel" }>
|
|
50
|
+
): HeadScript[] => {
|
|
51
|
+
switch (adapter.kind) {
|
|
52
|
+
case "adobe": {
|
|
53
|
+
return adobeHead(adapter.options);
|
|
54
|
+
}
|
|
55
|
+
case "amplitude": {
|
|
56
|
+
return amplitudeHead(adapter.options);
|
|
57
|
+
}
|
|
58
|
+
case "clarity": {
|
|
59
|
+
return clarityHead(adapter.options);
|
|
60
|
+
}
|
|
61
|
+
case "clearbit": {
|
|
62
|
+
return clearbitHead(adapter.options);
|
|
63
|
+
}
|
|
64
|
+
case "cloudflare": {
|
|
65
|
+
return cloudflareHead(adapter.options);
|
|
66
|
+
}
|
|
67
|
+
case "fathom": {
|
|
68
|
+
return fathomHead(adapter.options);
|
|
69
|
+
}
|
|
70
|
+
case "google-analytics": {
|
|
71
|
+
return googleAnalyticsHead(adapter.options);
|
|
72
|
+
}
|
|
73
|
+
case "google-tag-manager": {
|
|
74
|
+
return googleTagManagerHead(adapter.options);
|
|
75
|
+
}
|
|
76
|
+
case "heap": {
|
|
77
|
+
return heapHead(adapter.options);
|
|
78
|
+
}
|
|
79
|
+
case "hightouch": {
|
|
80
|
+
return hightouchHead(adapter.options);
|
|
81
|
+
}
|
|
82
|
+
case "hotjar": {
|
|
83
|
+
return hotjarHead(adapter.options);
|
|
84
|
+
}
|
|
85
|
+
case "logrocket": {
|
|
86
|
+
return logrocketHead(adapter.options);
|
|
87
|
+
}
|
|
88
|
+
case "mixpanel": {
|
|
89
|
+
return mixpanelHead(adapter.options);
|
|
90
|
+
}
|
|
91
|
+
case "pirsch": {
|
|
92
|
+
return pirschHead(adapter.options);
|
|
93
|
+
}
|
|
94
|
+
case "plausible": {
|
|
95
|
+
return plausibleHead(adapter.options);
|
|
96
|
+
}
|
|
97
|
+
case "posthog": {
|
|
98
|
+
return posthogHead(adapter.options);
|
|
99
|
+
}
|
|
100
|
+
case "segment": {
|
|
101
|
+
return segmentHead(adapter.options);
|
|
102
|
+
}
|
|
103
|
+
default: {
|
|
104
|
+
return scriptHead(adapter.options);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Map the configured adapters to what `Analytics.astro` renders, in declared
|
|
111
|
+
* order. A second `vercel()` is dropped — two copies of the component would
|
|
112
|
+
* count every pageview twice — so the first one keeps its position.
|
|
113
|
+
*/
|
|
114
|
+
export const analyticsHead = (adapters: AnalyticsAdapter[]): HeadNode[] => {
|
|
115
|
+
const nodes: HeadNode[] = [];
|
|
116
|
+
let hasVercel = false;
|
|
117
|
+
for (const adapter of adapters) {
|
|
118
|
+
if (adapter.kind === "vercel") {
|
|
119
|
+
if (!hasVercel) {
|
|
120
|
+
hasVercel = true;
|
|
121
|
+
nodes.push({ props: adapter.options, type: "vercel" });
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
for (const tag of adapterScripts(adapter)) {
|
|
125
|
+
nodes.push({ ...tag, type: "script" });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return nodes;
|
|
130
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
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 options {@link heap} maps itself. */
|
|
9
|
+
export interface HeapNamedOptions {
|
|
10
|
+
/** App ID (the environment ID), from the project's install settings. */
|
|
11
|
+
id: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Options for {@link heap}: the app ID plus any other `heap.load` config
|
|
16
|
+
* option, forwarded verbatim (`disableTextCapture`, `secureCookie`, …). JSON
|
|
17
|
+
* values only.
|
|
18
|
+
*/
|
|
19
|
+
export type HeapOptions = HeapNamedOptions & {
|
|
20
|
+
[option: string]: JsonValue;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const heapOptionsSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
id: z.string().min(1),
|
|
26
|
+
})
|
|
27
|
+
.catchall(z.json());
|
|
28
|
+
|
|
29
|
+
export type HeapAdapter = AdapterDescriptor<"heap", HeapOptions>;
|
|
30
|
+
|
|
31
|
+
export const heapAdapterSchema = adapterDescriptorSchema(
|
|
32
|
+
"heap",
|
|
33
|
+
heapOptionsSchema
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Heap autocapture analytics. The app ID is public — the tag carries it on
|
|
38
|
+
* every page.
|
|
39
|
+
*/
|
|
40
|
+
export const heap = (options: HeapOptions): HeapAdapter => ({
|
|
41
|
+
kind: "heap",
|
|
42
|
+
options,
|
|
43
|
+
requiredSecrets: [],
|
|
44
|
+
runtimeDeps: [],
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// The install snippet: a `window.heap` queue whose `load` injects the keyed
|
|
48
|
+
// script and stubs the API until it arrives.
|
|
49
|
+
const HEAP_LOADER =
|
|
50
|
+
'window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=document.createElement("script");r.type="text/javascript",r.async=!0,r.src="https://cdn.heapanalytics.com/js/heap-"+e+".js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(r,a);for(var n=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","resetIdentity","removeEventProperty","setEventProperties","track","unsetEventProperty"],o=0;o<p.length;o++)heap[p[o]]=n(p[o])};';
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The loader plus `heap.load` with `id` mapped and everything else forwarded
|
|
54
|
+
* as the config object; the object is left off when there is nothing to pass,
|
|
55
|
+
* as the install snippet prints it. Heap autocaptures history changes as
|
|
56
|
+
* pageviews, so client-router navigations need no extra hook.
|
|
57
|
+
*/
|
|
58
|
+
export const heapHead = (options: HeapOptions): HeadScript[] => {
|
|
59
|
+
const { id, ...config } = options;
|
|
60
|
+
const load =
|
|
61
|
+
Object.keys(config).length === 0
|
|
62
|
+
? `heap.load(${inlineJson(id)});`
|
|
63
|
+
: `heap.load(${inlineJson(id)},${inlineJson(config)});`;
|
|
64
|
+
return [{ attributes: {}, content: `${HEAP_LOADER}${load}` }];
|
|
65
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
/** The events API host `hightouch()` uses when `host` is unset. */
|
|
9
|
+
export const HIGHTOUCH_DEFAULT_HOST = "us-east-1.hightouch-events.com";
|
|
10
|
+
|
|
11
|
+
/** The options {@link hightouch} maps itself. */
|
|
12
|
+
export interface HightouchNamedOptions {
|
|
13
|
+
/** Events API host, without a scheme. Defaults to the US East region. */
|
|
14
|
+
host?: string;
|
|
15
|
+
/** Write key of the event source. */
|
|
16
|
+
key: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Options for {@link hightouch}: the named options plus any other
|
|
21
|
+
* `htevents.load` option, forwarded verbatim. JSON values only.
|
|
22
|
+
*/
|
|
23
|
+
export type HightouchOptions = HightouchNamedOptions & {
|
|
24
|
+
[option: string]: JsonValue;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const hightouchOptionsSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
host: z.string().min(1).optional(),
|
|
30
|
+
key: z.string().min(1),
|
|
31
|
+
})
|
|
32
|
+
.catchall(z.json());
|
|
33
|
+
|
|
34
|
+
export type HightouchAdapter = AdapterDescriptor<"hightouch", HightouchOptions>;
|
|
35
|
+
|
|
36
|
+
export const hightouchAdapterSchema = adapterDescriptorSchema(
|
|
37
|
+
"hightouch",
|
|
38
|
+
hightouchOptionsSchema
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Hightouch Events. The write key is meant for the browser — it identifies
|
|
43
|
+
* the event source the SDK reports to.
|
|
44
|
+
*/
|
|
45
|
+
export const hightouch = (options: HightouchOptions): HightouchAdapter => ({
|
|
46
|
+
kind: "hightouch",
|
|
47
|
+
options,
|
|
48
|
+
requiredSecrets: [],
|
|
49
|
+
runtimeDeps: [],
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// The install snippet: a `window.htevents` queue whose `load` injects the SDK.
|
|
53
|
+
const HIGHTOUCH_LOADER =
|
|
54
|
+
'!function(){var e=window.htevents=window.htevents||[];if(!e.initialize)if(e.invoked)window.console&&console.error&&console.error("Hightouch snippet included twice.");else{e.invoked=!0,e.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"],e.factory=function(t){return function(){var r=Array.prototype.slice.call(arguments);return r.unshift(t),e.push(r),e}};for(var t=0;t<e.methods.length;t++){var r=e.methods[t];e[r]=e.factory(r)}e.load=function(t,r){var n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src="https://cdn.hightouch-events.com/browser/release/v1-latest/events.min.js";var o=document.getElementsByTagName("script")[0];o.parentNode.insertBefore(n,o),e._loadOptions=r,e._writeKey=t},e.SNIPPET_VERSION="0.0.1",';
|
|
55
|
+
|
|
56
|
+
// The SDK sends one `page()` per real page load (the snippet's own call), so
|
|
57
|
+
// client-router swaps are sent here.
|
|
58
|
+
const HIGHTOUCH_SPA_PAGEVIEWS = spaPageviews(
|
|
59
|
+
"__blumeHightouchPath",
|
|
60
|
+
"htevents.page();"
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The loader with `key` mapped to the write key and `host` to `apiHost`;
|
|
65
|
+
* everything else lands in the load options verbatim, after the mapped host
|
|
66
|
+
* so a raw `apiHost` still wins.
|
|
67
|
+
*/
|
|
68
|
+
export const hightouchHead = (options: HightouchOptions): HeadScript[] => {
|
|
69
|
+
const { host, key, ...load } = options;
|
|
70
|
+
const loadOptions = { apiHost: host ?? HIGHTOUCH_DEFAULT_HOST, ...load };
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
attributes: {},
|
|
74
|
+
content: `${HIGHTOUCH_LOADER}e.load(${inlineJson(key)},${inlineJson(loadOptions)}),e.page()}}();${HIGHTOUCH_SPA_PAGEVIEWS}`,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
};
|
|
@@ -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
|
+
];
|