blume 1.7.2 → 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 +227 -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-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-xhtpx3ff.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-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-688e0dde.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-hs3gbh8p.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-9bkjd11x.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-9bkjd11x.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-t3tj0dgr.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-exeeb35e.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-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/chunk-jts8mvcz.js +106 -0
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
- 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-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
- package/dist/cli/{chunk-n9sra6sy.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-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-eevwt1sc.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-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-ppfvdcd4.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 +209 -505
- 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 +28 -11
- 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 +2291 -441
- 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 +20 -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 +176 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +52 -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 +37 -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 +12 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +26 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +91 -10
- package/docs/discoverability/index.mdx +5 -5
- 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 +26 -22
- package/src/ai/ai-catalog.ts +259 -0
- 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 +19 -6
- package/src/ai/llms.ts +26 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/mcp/discovery.ts +1 -1
- 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 +114 -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 -314
- 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 +75 -3
- 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 -43
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +101 -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 +212 -543
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +32 -11
- 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 +137 -19
- 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 +531 -721
- 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 +20 -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 +67 -28
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +129 -22
- 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 +27 -4
- 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 +33 -7
- 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 +47 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-12dxjqk7.js.map +0 -10
- package/dist/cli/chunk-196vjxp9.js.map +0 -13
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-30e87n55.js +0 -108
- package/dist/cli/chunk-30e87n55.js.map +0 -10
- package/dist/cli/chunk-450a7rcr.js +0 -185
- package/dist/cli/chunk-450a7rcr.js.map +0 -11
- package/dist/cli/chunk-5n7t497w.js.map +0 -40
- package/dist/cli/chunk-61j18dwk.js +0 -5342
- package/dist/cli/chunk-61j18dwk.js.map +0 -58
- package/dist/cli/chunk-88by27n5.js +0 -17
- package/dist/cli/chunk-88by27n5.js.map +0 -10
- package/dist/cli/chunk-8cd8tj54.js.map +0 -34
- package/dist/cli/chunk-aztttvb3.js +0 -381
- package/dist/cli/chunk-aztttvb3.js.map +0 -12
- package/dist/cli/chunk-cvky9gb2.js.map +0 -11
- package/dist/cli/chunk-ejjx8znq.js.map +0 -15
- package/dist/cli/chunk-fmceyezb.js +0 -1007
- package/dist/cli/chunk-fmceyezb.js.map +0 -13
- package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
- package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
- package/dist/cli/chunk-jbj4qhfw.js +0 -30
- package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
- package/dist/cli/chunk-mqb2ka8m.js +0 -68
- package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
- package/dist/cli/chunk-mt76t7dj.js.map +0 -11
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-ra1v2nc2.js +0 -35
- package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
- package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
- package/dist/cli/chunk-tqa1s0k8.js +0 -69
- package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vkrsvbr5.js +0 -107
- package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-wjt80jps.js +0 -1049
- package/dist/cli/chunk-wjt80jps.js.map +0 -24
- 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-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
|
@@ -1,61 +1,32 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { readdir,
|
|
2
|
+
import { readdir, stat } from "node:fs/promises";
|
|
3
3
|
|
|
4
4
|
import { build } from "astro";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
import { join } from "pathe";
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
API_CATALOG_PATH,
|
|
10
|
-
API_CATALOG_TYPE,
|
|
11
|
-
hasApiCatalog,
|
|
12
|
-
} from "../../ai/api-catalog.ts";
|
|
13
|
-
import { pageJsonPath } from "../../ai/api/paths.ts";
|
|
14
|
-
import { buildHomeLinkHeader } from "../../ai/link-headers.ts";
|
|
15
|
-
import {
|
|
16
|
-
agentMarkdown,
|
|
17
|
-
buildRawMarkdown,
|
|
18
|
-
markdownRoutePaths,
|
|
19
|
-
markdownTokenCount,
|
|
20
|
-
} from "../../ai/markdown.ts";
|
|
21
|
-
import {
|
|
22
|
-
SIGNATURES_DIRECTORY_PATH,
|
|
23
|
-
SIGNATURES_DIRECTORY_TYPE,
|
|
24
|
-
} from "../../ai/web-bot-auth.ts";
|
|
25
8
|
import { publishBuildProject } from "../../astro/integration.ts";
|
|
26
9
|
import { ensureGitignore } from "../../core/gitignore.ts";
|
|
27
10
|
import type { BlumeProject } from "../../core/project-graph.ts";
|
|
28
|
-
import type { ResolvedConfig } from "../../core/schema.ts";
|
|
29
11
|
import { serverFeatures } from "../../core/server-features.ts";
|
|
30
|
-
import type { ProjectContext } from "../../core/types.ts";
|
|
31
12
|
import {
|
|
32
|
-
|
|
13
|
+
deployOutputDir,
|
|
33
14
|
deployStaticDir,
|
|
34
|
-
servesClientSubdir,
|
|
35
15
|
surfaceAdapterOutput,
|
|
36
16
|
} from "../../deploy/adapter-output.ts";
|
|
37
|
-
import {
|
|
38
|
-
injectWorkerNegotiation,
|
|
39
|
-
NEGOTIATION_WORKER_FILE,
|
|
40
|
-
} from "../../deploy/cloudflare-negotiation.ts";
|
|
41
|
-
import {
|
|
42
|
-
auditVercelFunctions,
|
|
43
|
-
blumeDependencyNames,
|
|
44
|
-
functionBundleVerdict,
|
|
45
|
-
} from "../../deploy/function-bundle.ts";
|
|
46
|
-
import { platformRedirects } from "../../deploy/redirects.ts";
|
|
47
|
-
import { injectNegotiationRoutes } from "../../deploy/vercel-negotiation.ts";
|
|
17
|
+
import { deployPlatform } from "../../deploy/platforms/index.ts";
|
|
48
18
|
import { cardCacheTally, ogCacheDir, pruneCardCache } from "../../og/cache.ts";
|
|
19
|
+
import {
|
|
20
|
+
flagList,
|
|
21
|
+
removedBuildFlags,
|
|
22
|
+
removedBuildFlagsAdvice,
|
|
23
|
+
} from "../../upgrade/upgrade.ts";
|
|
49
24
|
import { commandMeta } from "../command-meta.ts";
|
|
50
25
|
import { refuseIfDevRunning } from "../dev-lock.ts";
|
|
26
|
+
import { refuseIfEjected } from "../eject-scripts.ts";
|
|
51
27
|
import { logger } from "../log.ts";
|
|
52
28
|
import { prepareProject } from "../prepare.ts";
|
|
53
29
|
|
|
54
|
-
const ADAPTERS = ["vercel", "node", "netlify", "cloudflare"] as const;
|
|
55
|
-
|
|
56
|
-
const isAdapter = (value: string): value is (typeof ADAPTERS)[number] =>
|
|
57
|
-
ADAPTERS.some((adapter) => adapter === value);
|
|
58
|
-
|
|
59
30
|
const BUDGET_JS = "budget-js";
|
|
60
31
|
const BUDGET_CSS = "budget-css";
|
|
61
32
|
|
|
@@ -85,170 +56,6 @@ const validateBudgetFlags = (args: BudgetArgs): void => {
|
|
|
85
56
|
}
|
|
86
57
|
};
|
|
87
58
|
|
|
88
|
-
/**
|
|
89
|
-
* Splice `Accept: text/markdown` negotiation routes into the Vercel adapter's
|
|
90
|
-
* Build Output config, so a content-page request that prefers Markdown gets the
|
|
91
|
-
* page's prerendered `.md` mirror (content pages are prerendered even in server
|
|
92
|
-
* output, so Astro middleware never sees them — the routing layer is the only
|
|
93
|
-
* request-time hook). Vercel server builds only; the adapter writes the config
|
|
94
|
-
* straight to the project root (see `withAdapterRoot`).
|
|
95
|
-
*/
|
|
96
|
-
const emitVercelNegotiation = async (
|
|
97
|
-
project: BlumeProject,
|
|
98
|
-
routePaths: string[],
|
|
99
|
-
root: string
|
|
100
|
-
): Promise<void> => {
|
|
101
|
-
const { config } = project;
|
|
102
|
-
const configPath = join(root, ".vercel", "output", "config.json");
|
|
103
|
-
if (!existsSync(configPath)) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
const overrides: Record<string, string> = {};
|
|
107
|
-
if (hasApiCatalog(config)) {
|
|
108
|
-
overrides[API_CATALOG_PATH.slice(1)] = API_CATALOG_TYPE;
|
|
109
|
-
}
|
|
110
|
-
if (config.ai.webBotAuth.keys.length > 0) {
|
|
111
|
-
overrides[SIGNATURES_DIRECTORY_PATH.slice(1)] = SIGNATURES_DIRECTORY_TYPE;
|
|
112
|
-
}
|
|
113
|
-
// The homepage rewrite serves `/index.md` from the static layer, so its
|
|
114
|
-
// `x-markdown-tokens` estimate has to ride the routing config; the runtime
|
|
115
|
-
// endpoint stamps it on dev/server-rendered responses itself.
|
|
116
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
117
|
-
const home = rawMarkdown["/"];
|
|
118
|
-
// The Markdown and JSON 404 routes point at the prerendered twins; only
|
|
119
|
-
// wire each when the build actually emitted it (a project that owns `/404`
|
|
120
|
-
// gets none).
|
|
121
|
-
const staticDir = join(root, ".vercel", "output", "static");
|
|
122
|
-
const injected = injectNegotiationRoutes(
|
|
123
|
-
await readFile(configPath, "utf-8"),
|
|
124
|
-
routePaths,
|
|
125
|
-
buildHomeLinkHeader(config, routePaths),
|
|
126
|
-
overrides,
|
|
127
|
-
home ? markdownTokenCount(agentMarkdown(home)) : undefined,
|
|
128
|
-
{
|
|
129
|
-
json: existsSync(join(staticDir, "404.json")),
|
|
130
|
-
markdown: existsSync(join(staticDir, "404.md")),
|
|
131
|
-
}
|
|
132
|
-
);
|
|
133
|
-
if (injected === null) {
|
|
134
|
-
logger.warn(
|
|
135
|
-
"Could not wire Accept: text/markdown negotiation into .vercel/output/config.json — raw Markdown stays available at the .md URLs."
|
|
136
|
-
);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
await writeFile(configPath, injected, "utf-8");
|
|
140
|
-
logger.success(
|
|
141
|
-
"Wired Accept: text/markdown negotiation into the Vercel routing config"
|
|
142
|
-
);
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Refuse to ship a Vercel function bundle that would crash at runtime: a bare
|
|
147
|
-
* import the adapter's dependency trace silently dropped (see
|
|
148
|
-
* `deploy/function-bundle.ts`). A missing package that is one of Blume's own
|
|
149
|
-
* dependencies is fatal — the generated runtime imports it, so every request
|
|
150
|
-
* would die; a project's own external import is reported as a warning and left
|
|
151
|
-
* to the author.
|
|
152
|
-
*/
|
|
153
|
-
const checkVercelFunctionBundles = async (
|
|
154
|
-
outputDir: string,
|
|
155
|
-
root: string
|
|
156
|
-
): Promise<void> => {
|
|
157
|
-
const audits = await auditVercelFunctions(outputDir);
|
|
158
|
-
if (audits.length === 0) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
const own = blumeDependencyNames();
|
|
162
|
-
let fatal = false;
|
|
163
|
-
for (const audit of audits) {
|
|
164
|
-
const verdict = functionBundleVerdict(audit, root, own);
|
|
165
|
-
if (verdict.fatal) {
|
|
166
|
-
fatal = true;
|
|
167
|
-
logger.error(verdict.message);
|
|
168
|
-
} else {
|
|
169
|
-
logger.warn(verdict.message);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
if (fatal) {
|
|
173
|
-
process.exit(1);
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const warnCloudflareNegotiationSkipped = (): void =>
|
|
178
|
-
logger.warn(
|
|
179
|
-
"Could not wire Accept: text/markdown negotiation into dist/server/wrangler.json — raw Markdown stays available at the .md URLs."
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Wire `Accept: text/markdown` negotiation into a Cloudflare server build. The
|
|
184
|
-
* ASSETS binding serves the prerendered content pages before the Worker runs —
|
|
185
|
-
* and even a request that reaches the Worker is answered by the adapter's
|
|
186
|
-
* handler from that binding, ahead of the only place middleware runs — so the
|
|
187
|
-
* negotiation lives in a generated wrapper Worker, routed to by
|
|
188
|
-
* `assets.run_worker_first` (see `deploy/cloudflare-negotiation.ts`). Both
|
|
189
|
-
* pieces are spliced into the adapter's emitted `dist/server` bundle.
|
|
190
|
-
*/
|
|
191
|
-
const emitCloudflareNegotiation = async (
|
|
192
|
-
project: BlumeProject,
|
|
193
|
-
routePaths: string[]
|
|
194
|
-
): Promise<void> => {
|
|
195
|
-
const { config, context } = project;
|
|
196
|
-
const serverDir = join(
|
|
197
|
-
context.distDir ?? join(context.root, "dist"),
|
|
198
|
-
"server"
|
|
199
|
-
);
|
|
200
|
-
const wranglerPath = join(serverDir, "wrangler.json");
|
|
201
|
-
if (!existsSync(wranglerPath)) {
|
|
202
|
-
warnCloudflareNegotiationSkipped();
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
// The homepage mirror is served from the static layer, so its
|
|
206
|
-
// `x-markdown-tokens` estimate rides the wrapper Worker, mirroring the
|
|
207
|
-
// Vercel routing config.
|
|
208
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
209
|
-
const home = rawMarkdown["/"];
|
|
210
|
-
const injected = injectWorkerNegotiation(
|
|
211
|
-
await readFile(wranglerPath, "utf-8"),
|
|
212
|
-
{
|
|
213
|
-
base: config.deployment.base,
|
|
214
|
-
// The manifest routes guard the wrapper's redirect table; `routePaths`
|
|
215
|
-
// also carries the synthesized homepage mirror, which must not block a
|
|
216
|
-
// configured root redirect.
|
|
217
|
-
contentRoutePaths: project.manifest.routes.map((route) => route.path),
|
|
218
|
-
homeLinkHeader: buildHomeLinkHeader(config, routePaths),
|
|
219
|
-
homeTokens: home ? markdownTokenCount(agentMarkdown(home)) : undefined,
|
|
220
|
-
// Exactly the per-page JSON documents the API emits (see `pageParams`):
|
|
221
|
-
// the non-hidden routes with agent Markdown, when the API is on.
|
|
222
|
-
pageJsonPaths: config.ai.api
|
|
223
|
-
? project.manifest.routes
|
|
224
|
-
.filter(
|
|
225
|
-
(route) => !route.hidden && rawMarkdown[route.path] !== undefined
|
|
226
|
-
)
|
|
227
|
-
.map((route) => pageJsonPath(route.path))
|
|
228
|
-
: [],
|
|
229
|
-
// The wrapper Worker matches full served URLs, so the redirects are
|
|
230
|
-
// based the same way the platform files are — it answers any the
|
|
231
|
-
// worker-first rules claim, where `_redirects` is never consulted and
|
|
232
|
-
// Astro would default their status.
|
|
233
|
-
redirects: platformRedirects(config),
|
|
234
|
-
routePaths,
|
|
235
|
-
}
|
|
236
|
-
);
|
|
237
|
-
if (injected === null) {
|
|
238
|
-
warnCloudflareNegotiationSkipped();
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
await writeFile(
|
|
242
|
-
join(serverDir, NEGOTIATION_WORKER_FILE),
|
|
243
|
-
injected.worker,
|
|
244
|
-
"utf-8"
|
|
245
|
-
);
|
|
246
|
-
await writeFile(wranglerPath, injected.wrangler, "utf-8");
|
|
247
|
-
logger.success(
|
|
248
|
-
"Wired Accept: text/markdown negotiation into the Cloudflare Worker"
|
|
249
|
-
);
|
|
250
|
-
};
|
|
251
|
-
|
|
252
59
|
/**
|
|
253
60
|
* Report how many OG cards the build read back from the on-disk cache against
|
|
254
61
|
* how many it rendered (the endpoint tallies both), so a warm rebuild shows
|
|
@@ -388,46 +195,6 @@ export const runClientAssetChecks = async (
|
|
|
388
195
|
}
|
|
389
196
|
};
|
|
390
197
|
|
|
391
|
-
/**
|
|
392
|
-
* Root of an isolated build's output. The runtime-local `dist/`, except for a
|
|
393
|
-
* Vercel server build, whose deploy bundle lands at `<runtime>/.vercel/output`
|
|
394
|
-
* and is never surfaced to the project root.
|
|
395
|
-
*/
|
|
396
|
-
export const isolatedOutputDir = (
|
|
397
|
-
config: ResolvedConfig,
|
|
398
|
-
context: ProjectContext
|
|
399
|
-
): string => {
|
|
400
|
-
const { adapter, output } = config.deployment;
|
|
401
|
-
if (output === "server" && adapter === "vercel") {
|
|
402
|
-
return join(context.outDir, ".vercel", "output");
|
|
403
|
-
}
|
|
404
|
-
return context.distDir ?? join(context.outDir, "dist");
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
* Directory holding an isolated build's client `_astro/` assets. Mirrors
|
|
409
|
-
* `deployStaticDir`, except that an isolated build never surfaces the adapter
|
|
410
|
-
* bundle to the project root — a Vercel server build's static output stays at
|
|
411
|
-
* `<runtime>/.vercel/output/static`, where `deployStaticDir` would instead
|
|
412
|
-
* point at the project-root copy (a previous real build's assets, or nothing).
|
|
413
|
-
* Node and Cloudflare server builds serve one level down, at `client/` — see
|
|
414
|
-
* {@link servesClientSubdir}.
|
|
415
|
-
*/
|
|
416
|
-
export const isolatedStaticDir = (
|
|
417
|
-
config: ResolvedConfig,
|
|
418
|
-
context: ProjectContext
|
|
419
|
-
): string => {
|
|
420
|
-
const { adapter, output } = config.deployment;
|
|
421
|
-
const outputDir = isolatedOutputDir(config, context);
|
|
422
|
-
if (output === "server" && adapter === "vercel") {
|
|
423
|
-
return join(outputDir, "static");
|
|
424
|
-
}
|
|
425
|
-
if (servesClientSubdir(config.deployment)) {
|
|
426
|
-
return join(outputDir, "client");
|
|
427
|
-
}
|
|
428
|
-
return outputDir;
|
|
429
|
-
};
|
|
430
|
-
|
|
431
198
|
/**
|
|
432
199
|
* Print the build summary box and run the optional bundle report / budget
|
|
433
200
|
* gate against the served static dir. The deploy artifacts themselves
|
|
@@ -448,19 +215,29 @@ const reportBuild = async (
|
|
|
448
215
|
const sitemapNote = config.seo.sitemap
|
|
449
216
|
? "no (set deployment.site)"
|
|
450
217
|
: "no (seo.sitemap is false)";
|
|
451
|
-
|
|
218
|
+
const rows: [label: string, value: string | number][] = [
|
|
219
|
+
["Output", config.deployment.options.output],
|
|
220
|
+
["Adapter", config.deployment.kind],
|
|
221
|
+
["Site", config.deployment.options.site ?? "not set"],
|
|
222
|
+
["Search", config.search.provider.kind],
|
|
223
|
+
["Redirects", config.redirects.length],
|
|
452
224
|
[
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
225
|
+
"Sitemap",
|
|
226
|
+
config.deployment.options.site && config.seo.sitemap
|
|
227
|
+
? "yes"
|
|
228
|
+
: sitemapNote,
|
|
229
|
+
],
|
|
230
|
+
["Robots", config.seo.robots ? "yes" : "no"],
|
|
231
|
+
["Agent JSON", config.agents.agentReadability ? "yes" : "no"],
|
|
232
|
+
["LLM files", config.agents.llmsTxt.enabled ? "yes" : "no"],
|
|
233
|
+
["Server features", features.length > 0 ? features.join(", ") : "none"],
|
|
234
|
+
];
|
|
235
|
+
// One label column for every row, sized by the longest label.
|
|
236
|
+
const labelWidth = Math.max(...rows.map(([label]) => label.length)) + 2;
|
|
237
|
+
logger.box(
|
|
238
|
+
rows
|
|
239
|
+
.map(([label, value]) => `${label.padEnd(labelWidth)}${value}`)
|
|
240
|
+
.join("\n")
|
|
464
241
|
);
|
|
465
242
|
|
|
466
243
|
await runClientAssetChecks(distDir, args);
|
|
@@ -477,18 +254,10 @@ const reportBuild = async (
|
|
|
477
254
|
|
|
478
255
|
export const buildCommand = defineCommand({
|
|
479
256
|
args: {
|
|
480
|
-
adapter: {
|
|
481
|
-
description: "Server adapter: vercel | node | netlify | cloudflare.",
|
|
482
|
-
type: "string",
|
|
483
|
-
},
|
|
484
257
|
analyze: {
|
|
485
258
|
description: "Report client JavaScript bundle sizes after the build.",
|
|
486
259
|
type: "boolean",
|
|
487
260
|
},
|
|
488
|
-
base: {
|
|
489
|
-
description: "Base path the site is served under (e.g. /docs).",
|
|
490
|
-
type: "string",
|
|
491
|
-
},
|
|
492
261
|
[BUDGET_CSS]: {
|
|
493
262
|
description: "Fail if total client CSS exceeds this many kB.",
|
|
494
263
|
type: "string",
|
|
@@ -502,10 +271,6 @@ export const buildCommand = defineCommand({
|
|
|
502
271
|
"Build into an isolated .blume-verify runtime (and its own dist) so a running dev server and the real dist/ are untouched. For verifying changes while `blume dev` runs.",
|
|
503
272
|
type: "boolean",
|
|
504
273
|
},
|
|
505
|
-
output: {
|
|
506
|
-
description: "Output mode: static | server.",
|
|
507
|
-
type: "string",
|
|
508
|
-
},
|
|
509
274
|
preview: {
|
|
510
275
|
description: "Include drafts and unpublished CMS content.",
|
|
511
276
|
type: "boolean",
|
|
@@ -518,9 +283,20 @@ export const buildCommand = defineCommand({
|
|
|
518
283
|
},
|
|
519
284
|
},
|
|
520
285
|
meta: commandMeta.build,
|
|
521
|
-
async run({ args }) {
|
|
286
|
+
async run({ args, rawArgs }) {
|
|
522
287
|
const root = process.cwd();
|
|
523
288
|
|
|
289
|
+
// citty accepts unknown flags, so a Blume 1 `--adapter vercel --output
|
|
290
|
+
// server` would otherwise build a static site without a word.
|
|
291
|
+
const removed = removedBuildFlags(rawArgs);
|
|
292
|
+
if (removed.length > 0) {
|
|
293
|
+
logger.error(
|
|
294
|
+
`blume build no longer takes ${flagList(removed)}. ${removedBuildFlagsAdvice(removed)}`
|
|
295
|
+
);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
await refuseIfEjected(root, "build");
|
|
299
|
+
|
|
524
300
|
// `--isolated` (or BLUME_RUNTIME_DIR) relocates the whole runtime to a
|
|
525
301
|
// sibling dir so this build never touches a live dev server's `.blume/` or
|
|
526
302
|
// the user's real `dist/`. A non-default runtime dir has no dev lock, so the
|
|
@@ -533,29 +309,10 @@ export const buildCommand = defineCommand({
|
|
|
533
309
|
await ensureGitignore(root, [".blume-verify/"]);
|
|
534
310
|
}
|
|
535
311
|
|
|
536
|
-
if (args.output && args.output !== "static" && args.output !== "server") {
|
|
537
|
-
logger.error(`Invalid --output "${args.output}" (use static | server).`);
|
|
538
|
-
process.exit(1);
|
|
539
|
-
}
|
|
540
|
-
if (args.adapter && !isAdapter(args.adapter)) {
|
|
541
|
-
logger.error(
|
|
542
|
-
`Invalid --adapter "${args.adapter}" (use ${ADAPTERS.join(" | ")}).`
|
|
543
|
-
);
|
|
544
|
-
process.exit(1);
|
|
545
|
-
}
|
|
546
312
|
validateBudgetFlags(args);
|
|
547
313
|
|
|
548
314
|
const project = await prepareProject({
|
|
549
315
|
mode: "build",
|
|
550
|
-
overrides: {
|
|
551
|
-
// SAFETY: an invalid --adapter exited above; a set flag is an ADAPTERS
|
|
552
|
-
// member.
|
|
553
|
-
adapter: args.adapter as (typeof ADAPTERS)[number] | undefined,
|
|
554
|
-
base: args.base,
|
|
555
|
-
// SAFETY: an invalid --output exited above; a set flag is static or
|
|
556
|
-
// server.
|
|
557
|
-
output: args.output as "server" | "static" | undefined,
|
|
558
|
-
},
|
|
559
316
|
preview: args.preview,
|
|
560
317
|
root,
|
|
561
318
|
runtimeDir,
|
|
@@ -563,7 +320,7 @@ export const buildCommand = defineCommand({
|
|
|
563
320
|
});
|
|
564
321
|
|
|
565
322
|
logger.start(
|
|
566
|
-
`Building ${project.graph.pages.length} page(s) (${project.config.deployment.output} output)`
|
|
323
|
+
`Building ${project.graph.pages.length} page(s) (${project.config.deployment.options.output} output)`
|
|
567
324
|
);
|
|
568
325
|
|
|
569
326
|
// Hand the scanned project to the integration: its `astro:build:done`
|
|
@@ -585,25 +342,36 @@ export const buildCommand = defineCommand({
|
|
|
585
342
|
// cards a live dev server is still serving.
|
|
586
343
|
await reportCardCache(project, !runtimeDir);
|
|
587
344
|
|
|
588
|
-
//
|
|
589
|
-
//
|
|
590
|
-
//
|
|
591
|
-
|
|
345
|
+
// Everything the deploy target does differently after `astro build` comes
|
|
346
|
+
// off its platform (see `deploy/platforms/*`): a server build's post-build
|
|
347
|
+
// step (Vercel's function-bundle audit and negotiation routes, Cloudflare's
|
|
348
|
+
// wrapper Worker), and where its bundle and static assets landed.
|
|
349
|
+
const { deployment } = project.config;
|
|
350
|
+
const platform = deployPlatform(deployment);
|
|
351
|
+
const server = deployment.options.output === "server";
|
|
352
|
+
const finalize = async (isolated: boolean): Promise<void> => {
|
|
592
353
|
if (
|
|
593
|
-
|
|
594
|
-
|
|
354
|
+
server &&
|
|
355
|
+
platform.finalizeBuild &&
|
|
356
|
+
!(await platform.finalizeBuild({ isolated, log: logger, project }))
|
|
595
357
|
) {
|
|
596
|
-
|
|
597
|
-
isolatedOutputDir(project.config, project.context),
|
|
598
|
-
root
|
|
599
|
-
);
|
|
358
|
+
process.exit(1);
|
|
600
359
|
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// The bundle report and budget gate still run for an isolated build —
|
|
363
|
+
// `blume build --isolated --budget-js 100` exiting 0 without measuring
|
|
364
|
+
// anything would be a silent false pass in CI. An isolated build never
|
|
365
|
+
// surfaces the adapter bundle to the project root, so its output dirs
|
|
366
|
+
// resolve under the relocated runtime.
|
|
367
|
+
if (runtimeDir) {
|
|
368
|
+
await finalize(true);
|
|
601
369
|
await runClientAssetChecks(
|
|
602
|
-
|
|
370
|
+
deployStaticDir(project.config, project.context),
|
|
603
371
|
args
|
|
604
372
|
);
|
|
605
373
|
logger.success(
|
|
606
|
-
`Isolated build OK — output at ${
|
|
374
|
+
`Isolated build OK — output at ${deployOutputDir(project.config, project.context)} (not published).`
|
|
607
375
|
);
|
|
608
376
|
return;
|
|
609
377
|
}
|
|
@@ -612,9 +380,8 @@ export const buildCommand = defineCommand({
|
|
|
612
380
|
// version control (Vercel's own CLI ignores `.vercel/` for the same reason).
|
|
613
381
|
// Ignoring it is independent of whether the bundle had to be moved below:
|
|
614
382
|
// Vercel writes straight to the project root, Netlify does not.
|
|
615
|
-
const {
|
|
616
|
-
|
|
617
|
-
if (project.config.deployment.output === "server" && ignoreDir) {
|
|
383
|
+
const { ignoreDir } = platform.hiddenRuntime;
|
|
384
|
+
if (server && ignoreDir) {
|
|
618
385
|
await ensureGitignore(root, [ignoreDir]);
|
|
619
386
|
}
|
|
620
387
|
|
|
@@ -627,20 +394,10 @@ export const buildCommand = defineCommand({
|
|
|
627
394
|
project.context
|
|
628
395
|
);
|
|
629
396
|
if (surfaced.moved) {
|
|
630
|
-
logger.success(`Surfaced ${
|
|
397
|
+
logger.success(`Surfaced ${deployment.kind} output to ${surfaced.to}`);
|
|
631
398
|
}
|
|
632
399
|
|
|
633
|
-
|
|
634
|
-
await checkVercelFunctionBundles(join(root, ".vercel", "output"), root);
|
|
635
|
-
await emitVercelNegotiation(project, markdownRoutePaths(project), root);
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
if (
|
|
639
|
-
project.config.deployment.output === "server" &&
|
|
640
|
-
adapter === "cloudflare"
|
|
641
|
-
) {
|
|
642
|
-
await emitCloudflareNegotiation(project, markdownRoutePaths(project));
|
|
643
|
-
}
|
|
400
|
+
await finalize(false);
|
|
644
401
|
|
|
645
402
|
await reportBuild(
|
|
646
403
|
project,
|
package/src/cli/commands/dev.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
refreshBlumeContent,
|
|
9
9
|
showBlumeErrorOverlay,
|
|
10
10
|
} from "../../astro/integration.ts";
|
|
11
|
+
import { BlumeError } from "../../core/diagnostics.ts";
|
|
11
12
|
import { scanProject } from "../../core/project-graph.ts";
|
|
12
13
|
import { resolveRuntimeDir } from "../../core/project.ts";
|
|
13
14
|
import { parsePort } from "../args.ts";
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
DevLockHeldError,
|
|
19
20
|
updateDevLockPort,
|
|
20
21
|
} from "../dev-lock.ts";
|
|
22
|
+
import { refuseIfEjected } from "../eject-scripts.ts";
|
|
21
23
|
import { normalizeHost } from "../host-args.ts";
|
|
22
24
|
import { logger, reportDiagnostics } from "../log.ts";
|
|
23
25
|
import { prepareProject } from "../prepare.ts";
|
|
@@ -36,6 +38,33 @@ const routeSignature = (
|
|
|
36
38
|
.toSorted()
|
|
37
39
|
.join("\n");
|
|
38
40
|
|
|
41
|
+
/**
|
|
42
|
+
* The port the dev server actually bound. Astro snapshots `address` when the
|
|
43
|
+
* server first listens, but a config restart that lands during startup leaves
|
|
44
|
+
* that snapshot null: the `astro.config.mjs` written just before the server
|
|
45
|
+
* started can reach Astro's watcher late, and Astro restarts in place before
|
|
46
|
+
* it ever listens. The live resolved URLs follow the restarted server, so read
|
|
47
|
+
* the port from those, then fall back to the one that was asked for.
|
|
48
|
+
*/
|
|
49
|
+
const boundPortOf = (
|
|
50
|
+
server: Awaited<ReturnType<typeof dev>>,
|
|
51
|
+
requested: number
|
|
52
|
+
): number => {
|
|
53
|
+
// SAFETY: Astro types `address` as always set, but it is null at runtime
|
|
54
|
+
// when a restart replaced the server before its first listen (see above).
|
|
55
|
+
const address = server.address as typeof server.address | null;
|
|
56
|
+
if (address) {
|
|
57
|
+
return address.port;
|
|
58
|
+
}
|
|
59
|
+
for (const url of server.resolvedUrls.local) {
|
|
60
|
+
const port = Number(new URL(url).port);
|
|
61
|
+
if (port > 0) {
|
|
62
|
+
return port;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return requested;
|
|
66
|
+
};
|
|
67
|
+
|
|
39
68
|
export const devCommand = defineCommand({
|
|
40
69
|
args: {
|
|
41
70
|
"content-dir": {
|
|
@@ -58,6 +87,7 @@ export const devCommand = defineCommand({
|
|
|
58
87
|
meta: commandMeta.dev,
|
|
59
88
|
async run({ args }) {
|
|
60
89
|
const root = process.cwd();
|
|
90
|
+
await refuseIfEjected(root, "dev");
|
|
61
91
|
const preview = args.preview ?? false;
|
|
62
92
|
const overrides = args["content-dir"]
|
|
63
93
|
? { contentRoot: args["content-dir"] }
|
|
@@ -117,7 +147,7 @@ export const devCommand = defineCommand({
|
|
|
117
147
|
// second invocation tells its caller to reuse. The site fallback baked
|
|
118
148
|
// into the runtime also carries the port, so it must follow suit (below,
|
|
119
149
|
// once the regeneration closure exists).
|
|
120
|
-
const boundPort = server
|
|
150
|
+
const boundPort = boundPortOf(server, port);
|
|
121
151
|
if (boundPort !== port) {
|
|
122
152
|
updateDevLockPort(outDir, boundPort);
|
|
123
153
|
devServerUrl = `http://localhost:${boundPort}`;
|
|
@@ -175,6 +205,15 @@ export const devCommand = defineCommand({
|
|
|
175
205
|
reportDiagnostics(next.diagnostics, root);
|
|
176
206
|
showBlumeErrorOverlay(next.diagnostics);
|
|
177
207
|
} catch (error) {
|
|
208
|
+
// A config error the generator raised (an unplannable `components.ts`
|
|
209
|
+
// override, a missing font file) is a diagnostic: report it in the
|
|
210
|
+
// terminal and the browser overlay like a scan-time error, so the fix
|
|
211
|
+
// is visible where the edit happened.
|
|
212
|
+
if (error instanceof BlumeError) {
|
|
213
|
+
reportDiagnostics([error.diagnostic], root);
|
|
214
|
+
showBlumeErrorOverlay([error.diagnostic]);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
178
217
|
// SAFETY: regeneration failures come from the generator and Astro's
|
|
179
218
|
// server API, which raise Error instances; only the message is shown.
|
|
180
219
|
logger.error(`Regeneration failed: ${(error as Error).message}`);
|