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
package/src/core/config.ts
CHANGED
|
@@ -4,7 +4,11 @@ import { z } from "zod";
|
|
|
4
4
|
|
|
5
5
|
import type { BlumeConfig } from "./config-input.ts";
|
|
6
6
|
import { applyDeploymentEnv } from "./deployment-env.ts";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
BlumeError,
|
|
9
|
+
diagnosticsFromIssues,
|
|
10
|
+
diagnosticsFromZod,
|
|
11
|
+
} from "./diagnostics.ts";
|
|
8
12
|
import { createModuleLoader } from "./load-module.ts";
|
|
9
13
|
import { findConfigFile } from "./project.ts";
|
|
10
14
|
import { blumeConfigSchema } from "./schema.ts";
|
|
@@ -45,10 +49,12 @@ import type { Diagnostic } from "./types.ts";
|
|
|
45
49
|
* dismissible }`.
|
|
46
50
|
*
|
|
47
51
|
* **Content & navigation**
|
|
48
|
-
* - `content` — where content lives
|
|
49
|
-
* `sources` (filesystem
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
+
* - `content` — where content lives: adapters from `blume/sources` under
|
|
53
|
+
* `sources` (`filesystem({ root })`, `mdxRemote({…})`, `githubReleases({…})`,
|
|
54
|
+
* `sanity({…})`, `notion({…})`, `contentful({…})`, `payload({…})`,
|
|
55
|
+
* `strapi({…})`, `obsidian({…})`, or `custom(source)`), or the
|
|
56
|
+
* zero-config shorthand `root`/`include`/`exclude`, which desugars to one
|
|
57
|
+
* `filesystem()` source and can't be combined with `sources`.
|
|
52
58
|
* - `navigation` — sidebar, header `tabs`, `selectors` (version/language/product
|
|
53
59
|
* switchers), pinned `featured` links, header `actions` and the one `cta`,
|
|
54
60
|
* and the `repo` link (a toggle, or a URL). Omit `sidebar` to generate it
|
|
@@ -70,35 +76,41 @@ import type { Diagnostic } from "./types.ts";
|
|
|
70
76
|
* - `export` — reader-facing PDF/EPUB export actions (off by default).
|
|
71
77
|
*
|
|
72
78
|
* **Reference docs**
|
|
73
|
-
* - `
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* are normalized to 3.x
|
|
79
|
+
* - `reference` — API references as a list of adapters from
|
|
80
|
+
* `blume/reference`: `openapi({…})` and `asyncapi({…})` render native pages
|
|
81
|
+
* (one real page per operation, woven into the sidebar and search; AsyncAPI
|
|
82
|
+
* 2.x specs are normalized to 3.x), `graphql({…})` renders a schema, and
|
|
83
|
+
* `scalar({…})` embeds the Scalar reference instead.
|
|
77
84
|
*
|
|
78
|
-
* **Search &
|
|
79
|
-
* - `search` — search
|
|
80
|
-
* `
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
85
|
+
* **Search, AI & agents**
|
|
86
|
+
* - `search` — a search adapter from `blume/search` (`orama()` by default;
|
|
87
|
+
* `flexsearch()`, `pagefind()`, `algolia({…})`, `oramaCloud({…})`,
|
|
88
|
+
* `typesense({…})`, `mixedbread({…})`, or `false`), or `{ provider,
|
|
89
|
+
* popular, indexing }` to add curated links and indexing settings.
|
|
90
|
+
* - `ai` — what faces a model at read time: `ask` (the Ask AI assistant, with
|
|
91
|
+
* a provider adapter from `blume/ai` such as `gateway()` or `openrouter()`)
|
|
92
|
+
* and `openInChat` (the "Open in chat" page action).
|
|
93
|
+
* - `agents` — the machine-readable surface: `llmsTxt`, the JSON `api`, the
|
|
94
|
+
* `mcp` server, published `skills`, `markdownComponents` (Markdown
|
|
95
|
+
* serializers for custom components), the `catalog` manifests,
|
|
96
|
+
* `agentReadability`, robots `contentSignals`, `webmcp`, and `webBotAuth`.
|
|
86
97
|
*
|
|
87
98
|
* **SEO, feeds & analytics**
|
|
88
|
-
* - `seo` — `og` images, `sitemap`, `robots`, `rss` feeds,
|
|
89
|
-
* JSON-LD
|
|
90
|
-
* - `analytics` —
|
|
91
|
-
*
|
|
99
|
+
* - `seo` — `og` images, `sitemap`, `robots`, `rss` feeds, and
|
|
100
|
+
* `structuredData` JSON-LD.
|
|
101
|
+
* - `analytics` — a list of adapters from `blume/analytics`, one per provider
|
|
102
|
+
* (`posthog()`, `googleAnalytics()`, `plausible()`, `fathom()`, `vercel()`,
|
|
103
|
+
* `cloudflare()`, …), or `script()` for anything without one.
|
|
92
104
|
*
|
|
93
105
|
* **Astro**
|
|
94
106
|
* - `integrations` — Astro integrations appended after Blume's built-ins, in
|
|
95
107
|
* declaration order. Install and maintain each integration in the site.
|
|
96
108
|
*
|
|
97
109
|
* **Deployment & i18n**
|
|
98
|
-
* - `deployment` —
|
|
99
|
-
* `
|
|
100
|
-
*
|
|
101
|
-
* Cloudflare from the platform env.
|
|
110
|
+
* - `deployment` — a host adapter from `blume/deploy` (`vercel()`, `node()`,
|
|
111
|
+
* `netlify()`, `cloudflare()`) for a server build, each taking `site`,
|
|
112
|
+
* `base`, and `output`; or `{ site, base }` for a static build anywhere.
|
|
113
|
+
* `site` is auto-detected on Vercel/Netlify/Cloudflare from the platform env.
|
|
102
114
|
* - `i18n` — opt-in multi-locale: `locales`, `defaultLocale`, `parser`
|
|
103
115
|
* (`dir` vs filename `dot` suffix), and per-locale UI overrides.
|
|
104
116
|
*
|
|
@@ -113,33 +125,41 @@ import type { Diagnostic } from "./types.ts";
|
|
|
113
125
|
*
|
|
114
126
|
* @example A production docs site with theming, search, and deployment.
|
|
115
127
|
* ```ts
|
|
128
|
+
* import { vercel } from "blume/deploy";
|
|
129
|
+
* import { orama } from "blume/search";
|
|
130
|
+
*
|
|
116
131
|
* export default defineConfig({
|
|
117
132
|
* title: "Acme Docs",
|
|
118
133
|
* description: "Build faster with Acme.",
|
|
119
134
|
* logo: { image: "/logo.svg", text: "Acme" },
|
|
120
135
|
* github: { owner: "acme", repo: "acme" },
|
|
121
|
-
* theme: { accent: "
|
|
136
|
+
* theme: { accent: "purple", fonts: { body: "inter" }, radius: "lg" },
|
|
122
137
|
* navigation: {
|
|
123
138
|
* tabs: [
|
|
124
139
|
* { label: "Guides", path: "/guides" },
|
|
125
140
|
* { label: "API", path: "/api" },
|
|
126
141
|
* ],
|
|
127
142
|
* },
|
|
128
|
-
* search:
|
|
129
|
-
*
|
|
143
|
+
* search: orama(),
|
|
144
|
+
* // A server build on Vercel.
|
|
145
|
+
* deployment: vercel({ site: "https://docs.acme.com" }),
|
|
130
146
|
* });
|
|
131
147
|
* ```
|
|
132
148
|
*
|
|
133
149
|
* @example An OpenAPI reference with the Ask AI assistant enabled.
|
|
134
150
|
* ```ts
|
|
151
|
+
* import { openapi } from "blume/reference";
|
|
152
|
+
*
|
|
135
153
|
* export default defineConfig({
|
|
136
154
|
* title: "Acme API",
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
155
|
+
* reference: [
|
|
156
|
+
* openapi({
|
|
157
|
+
* route: "/reference",
|
|
158
|
+
* sources: [{ label: "Core", spec: "./openapi.json" }],
|
|
159
|
+
* }),
|
|
160
|
+
* ],
|
|
161
|
+
* agents: { llmsTxt: true },
|
|
162
|
+
* ai: { ask: { enabled: true } },
|
|
143
163
|
* });
|
|
144
164
|
* ```
|
|
145
165
|
*
|
|
@@ -149,6 +169,21 @@ import type { Diagnostic } from "./types.ts";
|
|
|
149
169
|
*/
|
|
150
170
|
export const defineConfig = (config: BlumeConfig): BlumeConfig => config;
|
|
151
171
|
|
|
172
|
+
/**
|
|
173
|
+
* A config that fails validation. `diagnostic` folds every issue into the one
|
|
174
|
+
* message a command prints; `issues` keeps each on its own, with its own
|
|
175
|
+
* line, for `blume upgrade`, which lists them one by one.
|
|
176
|
+
*/
|
|
177
|
+
export class ConfigValidationError extends BlumeError {
|
|
178
|
+
readonly issues: Diagnostic[];
|
|
179
|
+
|
|
180
|
+
constructor(diagnostic: Diagnostic, issues: Diagnostic[]) {
|
|
181
|
+
super(diagnostic);
|
|
182
|
+
this.name = "ConfigValidationError";
|
|
183
|
+
this.issues = issues;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
152
187
|
/** Result of loading + validating a project config. */
|
|
153
188
|
export interface ConfigLoadResult {
|
|
154
189
|
config: ResolvedConfig;
|
|
@@ -169,12 +204,62 @@ const importConfigModule = createModuleLoader();
|
|
|
169
204
|
/**
|
|
170
205
|
* The slice of a user config module probed before schema defaults apply:
|
|
171
206
|
* whether `theme.fonts` was actually set. `looseObject` keeps every other key
|
|
172
|
-
* out of scope; a non-object at either level simply fails the probe.
|
|
207
|
+
* out of scope; a non-object at either level simply fails the probe. `fonts`
|
|
208
|
+
* is optional here — Zod 4 treats a bare `z.unknown()` key as required, which
|
|
209
|
+
* would fail the probe for every `theme` that doesn't set fonts.
|
|
173
210
|
*/
|
|
174
211
|
const themeFontsProbeSchema = z.looseObject({
|
|
175
|
-
theme: z.looseObject({ fonts: z.unknown() }).optional(),
|
|
212
|
+
theme: z.looseObject({ fonts: z.unknown().optional() }).optional(),
|
|
176
213
|
});
|
|
177
214
|
|
|
215
|
+
const isPathSegment = (segment: PropertyKey): segment is string | number =>
|
|
216
|
+
typeof segment !== "symbol";
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Where an issue is located in the config source: its own path, except that
|
|
220
|
+
* an unknown key — which Zod reports on its parent's path — is located at the
|
|
221
|
+
* key itself, so a removed field points at the line that sets it.
|
|
222
|
+
*/
|
|
223
|
+
const locationPath = (issue: z.core.$ZodIssue): (string | number)[] => [
|
|
224
|
+
...issue.path.filter(isPathSegment),
|
|
225
|
+
...(issue.code === "unrecognized_keys" ? issue.keys.slice(0, 1) : []),
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
/** Sort key for a config issue: the line that set the field, else last. */
|
|
229
|
+
const lineRank = (diagnostic: Diagnostic): number =>
|
|
230
|
+
diagnostic.line ?? Number.MAX_SAFE_INTEGER;
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* One diagnostic per config issue, each anchored to the config file and, when
|
|
234
|
+
* the source is on disk, to the line and column that set the field. Issues on
|
|
235
|
+
* the config's own top level (a removed top-level block) lead, since they name
|
|
236
|
+
* the biggest moves; the rest read top to bottom, in source order.
|
|
237
|
+
*/
|
|
238
|
+
const configIssues = (
|
|
239
|
+
error: z.ZodError,
|
|
240
|
+
options: { file?: string; source?: string }
|
|
241
|
+
): Diagnostic[] => {
|
|
242
|
+
const code = "BLUME_CONFIG_INVALID";
|
|
243
|
+
const located = diagnosticsFromIssues(
|
|
244
|
+
error.issues.map((issue) => ({
|
|
245
|
+
message: issue.message,
|
|
246
|
+
path: locationPath(issue),
|
|
247
|
+
})),
|
|
248
|
+
{ code, source: options.source }
|
|
249
|
+
);
|
|
250
|
+
return diagnosticsFromZod(error, { code, ...options })
|
|
251
|
+
.map((diagnostic, index) => ({
|
|
252
|
+
...diagnostic,
|
|
253
|
+
column: located[index]?.column,
|
|
254
|
+
line: located[index]?.line,
|
|
255
|
+
}))
|
|
256
|
+
.toSorted(
|
|
257
|
+
(a, b) =>
|
|
258
|
+
Number(Boolean(a.schemaPath)) - Number(Boolean(b.schemaPath)) ||
|
|
259
|
+
lineRank(a) - lineRank(b)
|
|
260
|
+
);
|
|
261
|
+
};
|
|
262
|
+
|
|
178
263
|
/**
|
|
179
264
|
* Load and validate the project config. When no config file exists, schema
|
|
180
265
|
* defaults produce a fully resolved config so the zero-boilerplate path works.
|
|
@@ -219,8 +304,7 @@ export const loadConfig = async (
|
|
|
219
304
|
configFile && existsSync(configFile)
|
|
220
305
|
? readFileSync(configFile, "utf-8")
|
|
221
306
|
: undefined;
|
|
222
|
-
const diagnostics =
|
|
223
|
-
code: "BLUME_CONFIG_INVALID",
|
|
307
|
+
const diagnostics = configIssues(parsed.error, {
|
|
224
308
|
file: configFile ?? undefined,
|
|
225
309
|
source,
|
|
226
310
|
});
|
|
@@ -241,14 +325,14 @@ export const loadConfig = async (
|
|
|
241
325
|
message: `${primary.message}\n${rest.length} more config issue(s):\n${moreIssues}`,
|
|
242
326
|
}
|
|
243
327
|
: primary;
|
|
244
|
-
throw new
|
|
328
|
+
throw new ConfigValidationError(detail, diagnostics);
|
|
245
329
|
}
|
|
246
330
|
|
|
247
331
|
// Resolve the canonical site URL, then SEO defaults that depend on it.
|
|
248
332
|
// Precedence: explicit config > platform env (Vercel/Netlify/Cloudflare, via
|
|
249
333
|
// applyDeploymentEnv) > the local dev server URL (dev only).
|
|
250
334
|
const config = applyDeploymentEnv(parsed.data);
|
|
251
|
-
const site = config.deployment.site ?? options.devServerUrl;
|
|
335
|
+
const site = config.deployment.options.site ?? options.devServerUrl;
|
|
252
336
|
|
|
253
337
|
// OG images need an absolute `og:image`, so they default on once a site URL
|
|
254
338
|
// is known and off otherwise. An explicit `seo.og.enabled` always wins.
|
|
@@ -257,7 +341,12 @@ export const loadConfig = async (
|
|
|
257
341
|
return {
|
|
258
342
|
config: {
|
|
259
343
|
...config,
|
|
260
|
-
deployment:
|
|
344
|
+
deployment: site
|
|
345
|
+
? {
|
|
346
|
+
...config.deployment,
|
|
347
|
+
options: { ...config.deployment.options, site },
|
|
348
|
+
}
|
|
349
|
+
: config.deployment,
|
|
261
350
|
seo: { ...config.seo, og: { ...config.seo.og, enabled: ogEnabled } },
|
|
262
351
|
},
|
|
263
352
|
configFile,
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { extname, relative } from "pathe";
|
|
2
|
+
import { glob, globSync } from "tinyglobby";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Custom `.astro` pages (the `pages/` folder): discovery and the routes they
|
|
6
|
+
* serve. Lives in core so the content graph can see them too — a header tab or
|
|
7
|
+
* brand link that points at a custom page must know the page exists only at
|
|
8
|
+
* its own path, not under every locale prefix.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** A user `.astro` page and the route pattern Blume injects it at. */
|
|
12
|
+
export interface CustomPageRoute {
|
|
13
|
+
/** Route pattern, e.g. `/changelog` or `/examples/[slug]`. */
|
|
14
|
+
pattern: string;
|
|
15
|
+
/** Absolute path to the user's `.astro` page file. */
|
|
16
|
+
entrypoint: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const PAGE_GLOB = ["**/*.astro"];
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Astro's routing convention: a file or folder whose name starts with `_` is a
|
|
23
|
+
* private partial — importable (shared layouts, home-page sections), but never
|
|
24
|
+
* built into a route. Blume injects pages itself, so it must reproduce the same
|
|
25
|
+
* exclusion or every `pages/_home/Hero.astro`-style component ships as an HTML
|
|
26
|
+
* page.
|
|
27
|
+
*/
|
|
28
|
+
const isPrivatePage = (rel: string): boolean =>
|
|
29
|
+
rel.split("/").some((segment) => segment.startsWith("_"));
|
|
30
|
+
|
|
31
|
+
/** Map discovered page files to routes; shared by the async/sync discoverers. */
|
|
32
|
+
const toPageRoutes = (
|
|
33
|
+
pagesRoot: string,
|
|
34
|
+
files: string[]
|
|
35
|
+
): CustomPageRoute[] => {
|
|
36
|
+
files.sort();
|
|
37
|
+
const routes: CustomPageRoute[] = [];
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const rel = relative(pagesRoot, file);
|
|
40
|
+
if (isPrivatePage(rel)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const withoutExt = rel.slice(0, rel.length - extname(rel).length);
|
|
44
|
+
const parts = withoutExt.split("/");
|
|
45
|
+
// Only a trailing `index` maps to its parent dir; a folder literally named
|
|
46
|
+
// `index` (e.g. `index/foo.astro`) must keep its segment.
|
|
47
|
+
if (parts.at(-1) === "index") {
|
|
48
|
+
parts.pop();
|
|
49
|
+
}
|
|
50
|
+
const pattern = parts.length === 0 ? "/" : `/${parts.join("/")}`;
|
|
51
|
+
routes.push({ entrypoint: file, pattern });
|
|
52
|
+
}
|
|
53
|
+
return routes;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Discover user `.astro` pages and map them to route patterns. Files keep their
|
|
58
|
+
* original location; only the route pattern is derived (index -> parent,
|
|
59
|
+
* dynamic `[param]` segments preserved).
|
|
60
|
+
*/
|
|
61
|
+
export const discoverPages = async (
|
|
62
|
+
pagesRoot: string
|
|
63
|
+
): Promise<CustomPageRoute[]> =>
|
|
64
|
+
toPageRoutes(
|
|
65
|
+
pagesRoot,
|
|
66
|
+
await glob(PAGE_GLOB, { absolute: true, cwd: pagesRoot, onlyFiles: true })
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
/** {@link discoverPages} for synchronous callers (e.g. the sitemap builder). */
|
|
70
|
+
export const discoverPagesSync = (pagesRoot: string): CustomPageRoute[] =>
|
|
71
|
+
toPageRoutes(
|
|
72
|
+
pagesRoot,
|
|
73
|
+
globSync(PAGE_GLOB, { absolute: true, cwd: pagesRoot, onlyFiles: true })
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
/** Skip private (`_partial`, `.well-known`) and Astro dynamic (`[param]`) parts. */
|
|
77
|
+
const PRIVATE_SEGMENT = /^[._]/u;
|
|
78
|
+
|
|
79
|
+
/** Segments of a static, shareable page pattern; null for dynamic/private ones. */
|
|
80
|
+
export const staticSegments = (pattern: string): string[] | null => {
|
|
81
|
+
const segments = pattern.split("/").filter(Boolean);
|
|
82
|
+
return segments.some(
|
|
83
|
+
(part) => PRIVATE_SEGMENT.test(part) || part.includes("[")
|
|
84
|
+
)
|
|
85
|
+
? null
|
|
86
|
+
: segments;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The static routes served by custom `.astro` pages — the same filtering as
|
|
91
|
+
* the generated OG cards, but yielding the routes themselves. Feeds the route
|
|
92
|
+
* sets that must know every servable page beyond the content graph (the link
|
|
93
|
+
* checker, the sitemap); dynamic (`[param]`) and private segments are skipped
|
|
94
|
+
* because their concrete URLs can't be enumerated statically.
|
|
95
|
+
*/
|
|
96
|
+
export const customStaticRoutes = (pages: { pattern: string }[]): string[] => {
|
|
97
|
+
const routes = new Set<string>();
|
|
98
|
+
for (const { pattern } of pages) {
|
|
99
|
+
const segments = staticSegments(pattern);
|
|
100
|
+
if (segments !== null) {
|
|
101
|
+
routes.add(segments.length === 0 ? "/" : `/${segments.join("/")}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [...routes];
|
|
105
|
+
};
|
package/src/core/data.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { SearchAdapterKind } from "../search/adapters/registry.ts";
|
|
1
2
|
import type { StructuredDataIdentity } from "../seo/jsonld.ts";
|
|
2
3
|
import type { FontHead } from "../theme/fonts.ts";
|
|
3
4
|
import type { UIStrings } from "./i18n-ui.ts";
|
|
4
|
-
import type { ResolvedConfig
|
|
5
|
+
import type { ResolvedConfig } from "./schema.ts";
|
|
5
6
|
import type { Navigation, RouteAlternate, VersionAlternate } from "./types.ts";
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -98,6 +99,11 @@ export interface BlumeRoute {
|
|
|
98
99
|
lastModified: string | null;
|
|
99
100
|
/** Resolved locale code (the default locale when not under i18n). */
|
|
100
101
|
locale: string;
|
|
102
|
+
/**
|
|
103
|
+
* True when the page's source publishes one language only (GitHub
|
|
104
|
+
* Releases), so the page renders without a language switcher.
|
|
105
|
+
*/
|
|
106
|
+
monolingual: boolean;
|
|
101
107
|
path: string;
|
|
102
108
|
title: string;
|
|
103
109
|
/** Resolved docs version (`""` for the current docs). */
|
|
@@ -112,7 +118,8 @@ export interface BlumeRoute {
|
|
|
112
118
|
|
|
113
119
|
/** Site-wide settings derived from `blume.config` — the `config` field of {@link BlumeData}. */
|
|
114
120
|
export interface BlumeDataConfig {
|
|
115
|
-
|
|
121
|
+
/** Analytics adapter descriptors, in configured order; empty when none. */
|
|
122
|
+
analytics: ResolvedConfig["analytics"];
|
|
116
123
|
/** Apple touch icon, or `null` when none is configured/detected. */
|
|
117
124
|
appleIcon: BlumeFavicon | null;
|
|
118
125
|
/** Ask AI empty-state suggestions, or `null` when Ask AI is off. */
|
|
@@ -123,24 +130,25 @@ export interface BlumeDataConfig {
|
|
|
123
130
|
banner: BlumeBanner | null;
|
|
124
131
|
/** Site-wide route mount point, normalized to `""` or `/seg` (see config). */
|
|
125
132
|
basePath: string;
|
|
126
|
-
/** `markdown.
|
|
127
|
-
codeThemes: ResolvedConfig["markdown"]["
|
|
133
|
+
/** `markdown.code.theme`: light/dark Shiki themes for code surfaces. */
|
|
134
|
+
codeThemes: ResolvedConfig["markdown"]["code"]["theme"];
|
|
128
135
|
/** `markdown.code.wrap`: wrap long code lines instead of scrolling. */
|
|
129
136
|
codeWrap: boolean;
|
|
130
137
|
/** `dateFormat`: `Intl.DateTimeFormat` options for the date stamps. */
|
|
131
138
|
dateFormat: ResolvedConfig["dateFormat"];
|
|
132
139
|
description: string | undefined;
|
|
133
140
|
/**
|
|
134
|
-
* Which agent-discovery resources exist for
|
|
135
|
-
* page's `<head>` (`
|
|
136
|
-
*
|
|
137
|
-
*
|
|
141
|
+
* Which agent-discovery resources exist for every layout to advertise in its
|
|
142
|
+
* page's `<head>` (`agents.agentReadability`, `agents.llmsTxt.enabled`) via
|
|
143
|
+
* the shared `DiscoveryLinks.astro` partial — the HTML counterpart of the
|
|
144
|
+
* homepage-only HTTP `Link` header, for agents that enter on a deep page
|
|
145
|
+
* (see `ai/link-headers.ts`). `sitemap` (`seo.sitemap` with a
|
|
138
146
|
* `deployment.site`, the condition under which one is emitted) feeds the
|
|
139
147
|
* 404 page's recovery links rather than the head.
|
|
140
148
|
*/
|
|
141
149
|
discovery: {
|
|
142
150
|
agentReadability: boolean;
|
|
143
|
-
/** Whether the AI Catalog / ARD manifest is published (`
|
|
151
|
+
/** Whether the AI Catalog / ARD manifest is published (`agents.catalog`). */
|
|
144
152
|
aiCatalog: boolean;
|
|
145
153
|
/** Whether the JSON docs API and its `/openapi.json` are published. */
|
|
146
154
|
api: boolean;
|
|
@@ -203,7 +211,8 @@ export interface BlumeDataConfig {
|
|
|
203
211
|
enabled: boolean;
|
|
204
212
|
/** Resolved empty-state links; empty when unset (Search falls back to sidebar). */
|
|
205
213
|
popular: { icon?: string; label: string; route: string }[];
|
|
206
|
-
|
|
214
|
+
/** The configured adapter's kind (`none` when search is disabled). */
|
|
215
|
+
provider: SearchAdapterKind;
|
|
207
216
|
};
|
|
208
217
|
/** Deployment site URL, or `null` when none is configured/detected. */
|
|
209
218
|
site: string | null;
|
|
@@ -213,8 +222,8 @@ export interface BlumeDataConfig {
|
|
|
213
222
|
/** Table-of-contents settings: whether to show it and the heading range. */
|
|
214
223
|
toc: ResolvedConfig["toc"];
|
|
215
224
|
/**
|
|
216
|
-
* WebMCP in-page tools (`
|
|
217
|
-
* list tool to fetch (`
|
|
225
|
+
* WebMCP in-page tools (`agents.webmcp`), plus whether llms.txt exists for the
|
|
226
|
+
* list tool to fetch (`agents.llmsTxt.enabled`).
|
|
218
227
|
*/
|
|
219
228
|
/** Docs versioning config; `null` when the site is unversioned. */
|
|
220
229
|
versions: NonNullable<ResolvedConfig["versions"]> | null;
|
|
@@ -223,6 +232,16 @@ export interface BlumeDataConfig {
|
|
|
223
232
|
x: { creator?: string; handle?: string };
|
|
224
233
|
}
|
|
225
234
|
|
|
235
|
+
/**
|
|
236
|
+
* The `discovery` flags the head partial (`components/layout/DiscoveryLinks.astro`)
|
|
237
|
+
* advertises — every layout's `discovery` prop is typed from here so a renamed
|
|
238
|
+
* or added flag surfaces in the shells at typecheck instead of drifting.
|
|
239
|
+
*/
|
|
240
|
+
export type DiscoveryHeadLinks = Pick<
|
|
241
|
+
BlumeDataConfig["discovery"],
|
|
242
|
+
"agentReadability" | "aiCatalog" | "llmsTxt"
|
|
243
|
+
>;
|
|
244
|
+
|
|
226
245
|
/**
|
|
227
246
|
* The compact snapshot the layout serializes into the page for React island
|
|
228
247
|
* hooks (`blume/hooks`). Islands hydrate independently, so this is read from a
|
|
@@ -19,22 +19,25 @@ export interface IslandDescriptor {
|
|
|
19
19
|
// oxlint-disable-next-line anti-slop/no-unknown-type-aliases -- inherits the untyped `ComponentReference` above
|
|
20
20
|
export type ComponentOverride = ComponentReference | IslandDescriptor;
|
|
21
21
|
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* User-authored component overrides, grouped by surface. Blume reads this file
|
|
24
|
+
* statically (never executing it), so every entry must be an imported
|
|
25
|
+
* identifier, a path string, or a `{ component, client, media }` object literal
|
|
26
|
+
* — an entry with a `client` mode is an island, hydrated through a generated
|
|
27
|
+
* wrapper.
|
|
28
|
+
*/
|
|
23
29
|
// oxlint-disable anti-slop/no-unsafe-dictionary-type -- `ComponentOverride` is untyped by
|
|
24
30
|
// design: user configs pass imported components from any framework (React
|
|
25
31
|
// functions, Svelte classes, Vue SFC objects), which share no structural type.
|
|
26
32
|
// `resolveSlot` and the generated components map are the runtime boundary.
|
|
27
33
|
export interface ComponentOverrides {
|
|
28
|
-
/**
|
|
29
|
-
* Interactive framework components made available in every `.mdx` page. Like
|
|
30
|
-
* `mdx`, but hydrated: entries default to `client: "visible"`. Shorthand for
|
|
31
|
-
* an `mdx` descriptor with a client mode, and the config-file equivalent of
|
|
32
|
-
* dropping a component in the `islands/` folder.
|
|
33
|
-
*/
|
|
34
|
-
islands?: Record<string, ComponentOverride>;
|
|
35
34
|
/** Layout slot overrides (`Header`, `Sidebar`, `Footer`, ...). */
|
|
36
35
|
layout?: Record<string, ComponentOverride>;
|
|
37
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* MDX component map overrides (`Callout`, `Card`, ...) and additions,
|
|
38
|
+
* available in every `.mdx` page. Give an entry a `client` mode to hydrate
|
|
39
|
+
* it — the config-file equivalent of dropping a component in `islands/`.
|
|
40
|
+
*/
|
|
38
41
|
mdx?: Record<string, ComponentOverride>;
|
|
39
42
|
}
|
|
40
43
|
// oxlint-enable anti-slop/no-unsafe-dictionary-type
|
|
@@ -1,87 +1,31 @@
|
|
|
1
|
+
import { inferDeploymentSite } from "../deploy/platforms/index.ts";
|
|
1
2
|
import type { ResolvedConfig } from "./schema.ts";
|
|
2
3
|
|
|
3
|
-
/** The deployment platforms Blume can infer from runtime/CI env vars. */
|
|
4
|
-
type DeploymentAdapter = NonNullable<ResolvedConfig["deployment"]["adapter"]>;
|
|
5
|
-
|
|
6
|
-
interface Platform {
|
|
7
|
-
/** Astro adapter to use when building for server output on this platform. */
|
|
8
|
-
adapter: DeploymentAdapter;
|
|
9
|
-
/** True when the env indicates the build is running on this platform. */
|
|
10
|
-
detect: (env: NodeJS.ProcessEnv) => boolean;
|
|
11
|
-
/** Resolve the canonical site URL from the platform's env vars, or null. */
|
|
12
|
-
site: (env: NodeJS.ProcessEnv) => string | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Prefix a bare host with `https://`; pass values that are already absolute. */
|
|
16
|
-
const toUrl = (value: string | undefined): string | null => {
|
|
17
|
-
const trimmed = value?.trim();
|
|
18
|
-
if (!trimmed) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
return /^https?:\/\//u.test(trimmed) ? trimmed : `https://${trimmed}`;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Platforms checked in order; the first whose `detect` matches wins. Site URLs
|
|
26
|
-
* prefer the stable production domain over per-deployment preview URLs so the
|
|
27
|
-
* inferred origin (sitemap, OG, RSS) stays put across deploys.
|
|
28
|
-
*/
|
|
29
|
-
const PLATFORMS: Platform[] = [
|
|
30
|
-
{
|
|
31
|
-
adapter: "vercel",
|
|
32
|
-
detect: (env) => Boolean(env.VERCEL),
|
|
33
|
-
// Fall through per *resolved* value, not per variable — a platform can set
|
|
34
|
-
// a var to the empty string, which `??` on the raw values treats as
|
|
35
|
-
// present, dead-ending the chain and silently losing the site URL.
|
|
36
|
-
site: (env) =>
|
|
37
|
-
toUrl(env.VERCEL_PROJECT_PRODUCTION_URL) ?? toUrl(env.VERCEL_URL),
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
adapter: "netlify",
|
|
41
|
-
detect: (env) => Boolean(env.NETLIFY),
|
|
42
|
-
site: (env) =>
|
|
43
|
-
toUrl(env.URL) ?? toUrl(env.DEPLOY_PRIME_URL) ?? toUrl(env.DEPLOY_URL),
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
adapter: "cloudflare",
|
|
47
|
-
detect: (env) => Boolean(env.CF_PAGES),
|
|
48
|
-
site: (env) => toUrl(env.CF_PAGES_URL),
|
|
49
|
-
},
|
|
50
|
-
];
|
|
51
|
-
|
|
52
4
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Fill in `deployment.adapter` and `deployment.site` from platform env vars
|
|
63
|
-
* (Vercel, Netlify, Cloudflare Pages) when the user hasn't set them. Explicit
|
|
64
|
-
* config always wins, and the adapter is only inferred for server output (it
|
|
65
|
-
* has no effect on static builds). Mirrors Astro's platform auto-detection so a
|
|
66
|
-
* project deployed to a known host gets a working canonical origin for free.
|
|
5
|
+
* Fill in the deployment `site` from platform env vars (Vercel, Netlify,
|
|
6
|
+
* Cloudflare Pages) when the config hasn't set one. Explicit config always
|
|
7
|
+
* wins. Each adapter's platform declares its own detection and URL vars (see
|
|
8
|
+
* `deploy/platforms/*`); the configured adapter is asked first, then every
|
|
9
|
+
* other platform, so a static build deployed to a known host gets a working
|
|
10
|
+
* canonical origin for free, mirroring Astro's platform auto-detection.
|
|
67
11
|
*/
|
|
68
12
|
export const applyDeploymentEnv = (
|
|
69
13
|
config: ResolvedConfig,
|
|
70
14
|
env: NodeJS.ProcessEnv = process.env
|
|
71
15
|
): ResolvedConfig => {
|
|
72
|
-
const
|
|
73
|
-
if (
|
|
16
|
+
const { deployment } = config;
|
|
17
|
+
if (deployment.options.site) {
|
|
74
18
|
return config;
|
|
75
19
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const adapter =
|
|
79
|
-
deployment.adapter ??
|
|
80
|
-
(deployment.output === "server" ? platform.adapter : null);
|
|
81
|
-
const site = deployment.site ?? platform.site(env) ?? undefined;
|
|
82
|
-
|
|
83
|
-
if (adapter === deployment.adapter && site === deployment.site) {
|
|
20
|
+
const site = inferDeploymentSite(deployment, env);
|
|
21
|
+
if (!site) {
|
|
84
22
|
return config;
|
|
85
23
|
}
|
|
86
|
-
return {
|
|
24
|
+
return {
|
|
25
|
+
...config,
|
|
26
|
+
deployment: {
|
|
27
|
+
...deployment,
|
|
28
|
+
options: { ...deployment.options, site },
|
|
29
|
+
},
|
|
30
|
+
};
|
|
87
31
|
};
|