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/deploy/headers.ts
CHANGED
|
@@ -22,8 +22,9 @@ import type { ResolvedConfig } from "../core/schema.ts";
|
|
|
22
22
|
* escape this because they carry `<meta charset>`; the raw endpoints have only
|
|
23
23
|
* the HTTP header. Pinning `charset=utf-8` here matches the Content-Type these
|
|
24
24
|
* same routes already send from the dev/server runtime (see
|
|
25
|
-
* `astro/templates.ts`). Hosts that don't read `_headers`
|
|
26
|
-
* the
|
|
25
|
+
* `astro/templates.ts`). Hosts that don't read `_headers` ignore the file
|
|
26
|
+
* harmlessly; Vercel gets the same rules in `vercel.json` (see
|
|
27
|
+
* {@link buildVercelHeaders}).
|
|
27
28
|
*/
|
|
28
29
|
|
|
29
30
|
/**
|
|
@@ -56,10 +57,30 @@ const HEADER_RULES: readonly {
|
|
|
56
57
|
},
|
|
57
58
|
];
|
|
58
59
|
|
|
60
|
+
/** Where the generated endpoint serves content-source images from. */
|
|
61
|
+
const CONTENT_ASSETS_ROOT = "/blume-assets";
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The policy a content-source SVG is served with: an opaque origin with
|
|
65
|
+
* scripts off, so an uploaded SVG that carries a `<script>` stays inert when
|
|
66
|
+
* opened directly. The endpoint sends it from the server and dev runtimes;
|
|
67
|
+
* {@link headerRules} carries it to static hosts.
|
|
68
|
+
*/
|
|
69
|
+
export const SVG_ASSET_POLICY = "sandbox";
|
|
70
|
+
|
|
59
71
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
|
|
72
|
+
* One static-host header rule: a served path (a `*` glob spanning path
|
|
73
|
+
* segments, or an exact path) and the header it sets there.
|
|
74
|
+
*/
|
|
75
|
+
export interface HeaderRule {
|
|
76
|
+
name: string;
|
|
77
|
+
path: string;
|
|
78
|
+
value: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The header rules every static host should apply, in `_headers` glob syntax.
|
|
83
|
+
* The glob carries the served prefix (`{deployment.base}{basePath}` for the
|
|
63
84
|
* Markdown mirrors, `{deployment.base}` for the root `.txt` files) so the rules
|
|
64
85
|
* still match once the site is mounted under a subpath (`/docs/*.md`); the
|
|
65
86
|
* wildcard spans path segments, so a nested route like `/docs/ja/intro.md`
|
|
@@ -69,46 +90,126 @@ const HEADER_RULES: readonly {
|
|
|
69
90
|
* exact-path rule for the root page advertises the agent-discovery resources —
|
|
70
91
|
* the static-host counterpart of the Vercel routing-config injection.
|
|
71
92
|
*/
|
|
72
|
-
export const
|
|
93
|
+
export const headerRules = (
|
|
73
94
|
config: ResolvedConfig,
|
|
74
95
|
homeLinkHeader?: string | null
|
|
75
|
-
):
|
|
76
|
-
const deployBase = normalizeBasePath(config.deployment.base);
|
|
77
|
-
const rules = HEADER_RULES.map((rule) => {
|
|
96
|
+
): HeaderRule[] => {
|
|
97
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
98
|
+
const rules: HeaderRule[] = HEADER_RULES.map((rule) => {
|
|
78
99
|
const prefix = rule.underBasePath
|
|
79
100
|
? `${deployBase}${config.basePath}`
|
|
80
101
|
: deployBase;
|
|
81
|
-
return
|
|
102
|
+
return {
|
|
103
|
+
name: "Content-Type",
|
|
104
|
+
path: `${prefix}/*.${rule.ext}`,
|
|
105
|
+
value: rule.contentType,
|
|
106
|
+
};
|
|
82
107
|
});
|
|
83
108
|
if (homeLinkHeader) {
|
|
84
|
-
rules.push(`${deployBase}
|
|
109
|
+
rules.push({ name: "Link", path: `${deployBase}/`, value: homeLinkHeader });
|
|
85
110
|
}
|
|
86
111
|
// The well-known discovery files are extensionless, so without an explicit
|
|
87
112
|
// rule a static host serves their registered media types as octet-stream or
|
|
88
113
|
// text/plain.
|
|
89
114
|
if (hasApiCatalog(config)) {
|
|
90
|
-
rules.push(
|
|
91
|
-
|
|
92
|
-
|
|
115
|
+
rules.push({
|
|
116
|
+
name: "Content-Type",
|
|
117
|
+
path: `${deployBase}${API_CATALOG_PATH}`,
|
|
118
|
+
value: API_CATALOG_TYPE,
|
|
119
|
+
});
|
|
93
120
|
}
|
|
94
|
-
if (config.
|
|
95
|
-
rules.push(
|
|
96
|
-
|
|
97
|
-
|
|
121
|
+
if (config.agents.webBotAuth.keys.length > 0) {
|
|
122
|
+
rules.push({
|
|
123
|
+
name: "Content-Type",
|
|
124
|
+
path: `${deployBase}${SIGNATURES_DIRECTORY_PATH}`,
|
|
125
|
+
value: SIGNATURES_DIRECTORY_TYPE,
|
|
126
|
+
});
|
|
98
127
|
}
|
|
99
128
|
// Agent registries fetch the discovery documents cross-origin; a static
|
|
100
129
|
// host sends no CORS header unless told to.
|
|
101
130
|
for (const path of crossOriginDiscoveryPaths(config)) {
|
|
102
|
-
rules.push(
|
|
131
|
+
rules.push({
|
|
132
|
+
name: "Access-Control-Allow-Origin",
|
|
133
|
+
path: `${deployBase}${path}`,
|
|
134
|
+
value: "*",
|
|
135
|
+
});
|
|
103
136
|
}
|
|
104
137
|
// Published skills live at the deployment base, outside `basePath` — the
|
|
105
138
|
// `.md` charset rule above misses them whenever a basePath is set, and the
|
|
106
139
|
// RFC wants archives served as application/gzip explicitly.
|
|
107
|
-
if (config.
|
|
140
|
+
if (config.agents.skills) {
|
|
108
141
|
rules.push(
|
|
109
|
-
|
|
110
|
-
|
|
142
|
+
{
|
|
143
|
+
name: "Content-Type",
|
|
144
|
+
path: `${deployBase}/.well-known/agent-skills/*.md`,
|
|
145
|
+
value: "text/markdown; charset=utf-8",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "Content-Type",
|
|
149
|
+
path: `${deployBase}/.well-known/agent-skills/*.tar.gz`,
|
|
150
|
+
value: "application/gzip",
|
|
151
|
+
}
|
|
111
152
|
);
|
|
112
153
|
}
|
|
113
|
-
|
|
154
|
+
// Images a content source downloads (a CMS upload, a remote page's figure)
|
|
155
|
+
// are served from the docs origin, and an SVG opened directly is a document
|
|
156
|
+
// that can run script. A sandbox policy keeps it inert; an `<img>` that
|
|
157
|
+
// embeds it is unaffected.
|
|
158
|
+
rules.push({
|
|
159
|
+
name: "Content-Security-Policy",
|
|
160
|
+
path: `${deployBase}${CONTENT_ASSETS_ROOT}/*.svg`,
|
|
161
|
+
value: SVG_ASSET_POLICY,
|
|
162
|
+
});
|
|
163
|
+
return rules;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* `_headers` contents: each {@link headerRules} entry as its path with an
|
|
168
|
+
* indented header line, in the two-space format Netlify and Cloudflare read.
|
|
169
|
+
*/
|
|
170
|
+
export const buildNetlifyHeaders = (
|
|
171
|
+
config: ResolvedConfig,
|
|
172
|
+
homeLinkHeader?: string | null
|
|
173
|
+
): string =>
|
|
174
|
+
`${headerRules(config, homeLinkHeader)
|
|
175
|
+
.map((rule) => `${rule.path}\n ${rule.name}: ${rule.value}`)
|
|
176
|
+
.join("\n")}\n`;
|
|
177
|
+
|
|
178
|
+
/** One entry of `vercel.json`'s `headers` array. */
|
|
179
|
+
export interface VercelHeader {
|
|
180
|
+
headers: { key: string; value: string }[];
|
|
181
|
+
source: string;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** The characters `path-to-regexp` would read as syntax in a literal path. */
|
|
185
|
+
const SOURCE_SYNTAX = /[\\(){}?+:]/gu;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* A `_headers` path as a `vercel.json` `source`, which `path-to-regexp` reads:
|
|
189
|
+
* the literal parts are escaped, and a `*` glob becomes the `(.*)` group that
|
|
190
|
+
* spans path segments as the glob does. An exact directory path (the homepage
|
|
191
|
+
* rule's `/docs/`) drops its trailing slash, the URL Vercel serves it at.
|
|
192
|
+
*/
|
|
193
|
+
const vercelSource = (path: string): string => {
|
|
194
|
+
const trimmed =
|
|
195
|
+
path.length > 1 && path.endsWith("/") ? path.slice(0, -1) : path;
|
|
196
|
+
return trimmed
|
|
197
|
+
.split("*")
|
|
198
|
+
.map((part) => part.replaceAll(SOURCE_SYNTAX, String.raw`\$&`))
|
|
199
|
+
.join("(.*)");
|
|
114
200
|
};
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The {@link headerRules} as `vercel.json` `headers` entries. Vercel reads no
|
|
204
|
+
* `_headers` file, so a static deploy of `dist/` carries the same rules here —
|
|
205
|
+
* the charset on the raw Markdown and text files, the homepage `Link` header,
|
|
206
|
+
* and the media types and CORS header of the discovery files.
|
|
207
|
+
*/
|
|
208
|
+
export const buildVercelHeaders = (
|
|
209
|
+
config: ResolvedConfig,
|
|
210
|
+
homeLinkHeader?: string | null
|
|
211
|
+
): VercelHeader[] =>
|
|
212
|
+
headerRules(config, homeLinkHeader).map((rule) => ({
|
|
213
|
+
headers: [{ key: rule.name, value: rule.value }],
|
|
214
|
+
source: vercelSource(rule.path),
|
|
215
|
+
}));
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
|
|
4
|
+
import { join } from "pathe";
|
|
5
|
+
|
|
6
|
+
import { crossOriginDiscoveryPaths } from "../ai/ai-catalog.ts";
|
|
7
|
+
import {
|
|
8
|
+
API_CATALOG_PATH,
|
|
9
|
+
API_CATALOG_TYPE,
|
|
10
|
+
hasApiCatalog,
|
|
11
|
+
} from "../ai/api-catalog.ts";
|
|
12
|
+
import {
|
|
13
|
+
SIGNATURES_DIRECTORY_PATH,
|
|
14
|
+
SIGNATURES_DIRECTORY_TYPE,
|
|
15
|
+
} from "../ai/web-bot-auth.ts";
|
|
16
|
+
import { normalizeBasePath } from "../core/base-path.ts";
|
|
17
|
+
import type { BlumeProject } from "../core/project-graph.ts";
|
|
18
|
+
import type { ResolvedConfig } from "../core/schema.ts";
|
|
19
|
+
import { SVG_ASSET_POLICY } from "./headers.ts";
|
|
20
|
+
import { distDir } from "./platforms/paths.ts";
|
|
21
|
+
import type { BuildLog } from "./platforms/types.ts";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The response headers the Node standalone server can't set itself. Its static
|
|
25
|
+
* handler (`send`) types a file by its extension alone and sends no CORS
|
|
26
|
+
* header, so the extensionless well-known files go out as
|
|
27
|
+
* `application/octet-stream` and a registry reading the discovery documents
|
|
28
|
+
* from another origin is blocked — the half of the `_headers` rules
|
|
29
|
+
* (`deploy/headers.ts`) that a Node server has no file to read from. The Markdown
|
|
30
|
+
* and text charsets need no rule here: `send` already adds `charset=UTF-8` to
|
|
31
|
+
* `text/*` types.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/** The headers one exact served path (deployment base included) gets. */
|
|
35
|
+
export interface NodeHeaderRule {
|
|
36
|
+
headers: Record<string, string>;
|
|
37
|
+
path: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** The server entry `@astrojs/node` writes, which the wrapper takes over. */
|
|
41
|
+
export const NODE_ENTRY_FILE = "entry.mjs";
|
|
42
|
+
/** Where Astro's own entry moves, beside the wrapper that imports it. */
|
|
43
|
+
export const NODE_ASTRO_ENTRY_FILE = "astro-entry.mjs";
|
|
44
|
+
/** First line of the wrapper, so a second pass over the same build is a no-op. */
|
|
45
|
+
const WRAPPER_MARKER = "// blume:node-headers";
|
|
46
|
+
|
|
47
|
+
/** The header rules for this config, merged per path. */
|
|
48
|
+
export const nodeHeaderRules = (config: ResolvedConfig): NodeHeaderRule[] => {
|
|
49
|
+
const deployBase = normalizeBasePath(config.deployment.options.base);
|
|
50
|
+
const byPath = new Map<string, Record<string, string>>();
|
|
51
|
+
const add = (path: string, name: string, value: string): void => {
|
|
52
|
+
byPath.set(path, { ...byPath.get(path), [name]: value });
|
|
53
|
+
};
|
|
54
|
+
if (hasApiCatalog(config)) {
|
|
55
|
+
add(API_CATALOG_PATH, "Content-Type", API_CATALOG_TYPE);
|
|
56
|
+
}
|
|
57
|
+
if (config.agents.webBotAuth.keys.length > 0) {
|
|
58
|
+
add(SIGNATURES_DIRECTORY_PATH, "Content-Type", SIGNATURES_DIRECTORY_TYPE);
|
|
59
|
+
}
|
|
60
|
+
for (const path of crossOriginDiscoveryPaths(config)) {
|
|
61
|
+
add(path, "Access-Control-Allow-Origin", "*");
|
|
62
|
+
}
|
|
63
|
+
return [...byPath].map(([path, headers]) => ({
|
|
64
|
+
headers,
|
|
65
|
+
path: `${deployBase}${path}`,
|
|
66
|
+
}));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** Exact-path rules, as `[path, headers]` pairs for the wrapper's lookup. */
|
|
70
|
+
const exactRules = (
|
|
71
|
+
rules: readonly NodeHeaderRule[]
|
|
72
|
+
): [string, Record<string, string>][] =>
|
|
73
|
+
rules
|
|
74
|
+
.filter((rule) => !rule.path.includes("*"))
|
|
75
|
+
.map((rule) => [rule.path, rule.headers]);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Glob rules (`/blume-assets/*.svg`), as `[prefix, suffix, headers]` — the
|
|
79
|
+
* text before and after the one `*`, which spans path segments.
|
|
80
|
+
*/
|
|
81
|
+
const patternRules = (
|
|
82
|
+
rules: readonly NodeHeaderRule[]
|
|
83
|
+
): [string, string, Record<string, string>][] =>
|
|
84
|
+
rules
|
|
85
|
+
.filter((rule) => rule.path.includes("*"))
|
|
86
|
+
.map((rule) => {
|
|
87
|
+
const star = rule.path.indexOf("*");
|
|
88
|
+
return [
|
|
89
|
+
rule.path.slice(0, star),
|
|
90
|
+
rule.path.slice(star + 1),
|
|
91
|
+
rule.headers,
|
|
92
|
+
];
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The entry that replaces Astro's: it stamps the rules' headers on the
|
|
97
|
+
* response, then hands the request to Astro's handler. `send` leaves a
|
|
98
|
+
* Content-Type that is already set alone, so the registered media type wins.
|
|
99
|
+
*
|
|
100
|
+
* It keeps Astro's contract — the `handler`, `options`, and `startServer`
|
|
101
|
+
* exports `astro preview` and a middleware-mode host import — and its
|
|
102
|
+
* autostart: Astro's entry is imported with autostart off (the env var is read
|
|
103
|
+
* when that module evaluates, so the import has to be dynamic), and the
|
|
104
|
+
* wrapper starts the server itself with its listener in front of Astro's.
|
|
105
|
+
*/
|
|
106
|
+
export const nodeEntryWrapper = (rules: readonly NodeHeaderRule[]): string =>
|
|
107
|
+
`${WRAPPER_MARKER}
|
|
108
|
+
// Written by \`blume build\`: Astro's server entry is ./${NODE_ASTRO_ENTRY_FILE}.
|
|
109
|
+
// This wrapper sets the media types and CORS headers of the .well-known
|
|
110
|
+
// discovery files, which the standalone server's static handler can't, then
|
|
111
|
+
// hands every request to Astro.
|
|
112
|
+
const RULES = new Map(${JSON.stringify(exactRules(rules))});
|
|
113
|
+
const PATTERNS = ${JSON.stringify(patternRules(rules))};
|
|
114
|
+
const applyHeaders = (req, res) => {
|
|
115
|
+
const path = (req.url ?? "").split("?")[0];
|
|
116
|
+
const headers =
|
|
117
|
+
RULES.get(path) ??
|
|
118
|
+
PATTERNS.find(([prefix, suffix]) => path.startsWith(prefix) && path.endsWith(suffix))?.[2];
|
|
119
|
+
if (headers) {
|
|
120
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
121
|
+
res.setHeader(name, value);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const previous = process.env.ASTRO_NODE_AUTOSTART;
|
|
126
|
+
process.env.ASTRO_NODE_AUTOSTART = "disabled";
|
|
127
|
+
const astro = await import("./${NODE_ASTRO_ENTRY_FILE}");
|
|
128
|
+
if (previous === undefined) {
|
|
129
|
+
delete process.env.ASTRO_NODE_AUTOSTART;
|
|
130
|
+
} else {
|
|
131
|
+
process.env.ASTRO_NODE_AUTOSTART = previous;
|
|
132
|
+
}
|
|
133
|
+
export const { options } = astro;
|
|
134
|
+
export const handler = (req, res, ...rest) => {
|
|
135
|
+
applyHeaders(req, res);
|
|
136
|
+
return astro.handler(req, res, ...rest);
|
|
137
|
+
};
|
|
138
|
+
export const startServer = () => {
|
|
139
|
+
const started = astro.startServer();
|
|
140
|
+
// Stamp the headers only where the adapter exposes its HTTP server as
|
|
141
|
+
// expected; a different shape serves the files without them rather than
|
|
142
|
+
// failing to start.
|
|
143
|
+
const httpServer = started?.server?.server;
|
|
144
|
+
if (typeof httpServer?.prependListener === "function") {
|
|
145
|
+
httpServer.prependListener("request", applyHeaders);
|
|
146
|
+
}
|
|
147
|
+
return started;
|
|
148
|
+
};
|
|
149
|
+
if (options.mode === "standalone" && previous !== "disabled") {
|
|
150
|
+
startServer();
|
|
151
|
+
}
|
|
152
|
+
`;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Put the header wrapper in front of a Node server build's entry. A build
|
|
156
|
+
* with no rule (no API catalog, AI catalog, MCP server, signatures directory,
|
|
157
|
+
* or downloaded content assets) leaves Astro's entry alone.
|
|
158
|
+
*/
|
|
159
|
+
export const wrapNodeEntry = async (
|
|
160
|
+
project: BlumeProject,
|
|
161
|
+
log: BuildLog
|
|
162
|
+
): Promise<void> => {
|
|
163
|
+
// Content assets a CMS source downloaded ship as static files, which the
|
|
164
|
+
// standalone server serves without the SVG sandbox static hosts get from
|
|
165
|
+
// `_headers`; only a build that has them needs the rule.
|
|
166
|
+
const assetsDir = join(distDir(project.context), "client", "blume-assets");
|
|
167
|
+
const rules = [
|
|
168
|
+
...nodeHeaderRules(project.config),
|
|
169
|
+
...(existsSync(assetsDir)
|
|
170
|
+
? [
|
|
171
|
+
{
|
|
172
|
+
headers: { "Content-Security-Policy": SVG_ASSET_POLICY },
|
|
173
|
+
path: `${normalizeBasePath(project.config.deployment.options.base)}/blume-assets/*.svg`,
|
|
174
|
+
},
|
|
175
|
+
]
|
|
176
|
+
: []),
|
|
177
|
+
];
|
|
178
|
+
if (rules.length === 0) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const serverDir = join(distDir(project.context), "server");
|
|
182
|
+
const entry = join(serverDir, NODE_ENTRY_FILE);
|
|
183
|
+
if (!existsSync(entry)) {
|
|
184
|
+
log.warn(
|
|
185
|
+
`Could not find the Node server entry at ${entry}, so the .well-known discovery files are served without their media types and CORS headers.`
|
|
186
|
+
);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const source = await readFile(entry, "utf-8");
|
|
190
|
+
if (source.startsWith(WRAPPER_MARKER)) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
await rename(entry, join(serverDir, NODE_ASTRO_ENTRY_FILE));
|
|
194
|
+
await writeFile(entry, nodeEntryWrapper(rules), "utf-8");
|
|
195
|
+
log.success(
|
|
196
|
+
"Wired the .well-known discovery headers into the Node server entry"
|
|
197
|
+
);
|
|
198
|
+
};
|