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
|
@@ -1,62 +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 { crossOriginDiscoveryPaths } from "../../ai/ai-catalog.ts";
|
|
9
|
-
import {
|
|
10
|
-
API_CATALOG_PATH,
|
|
11
|
-
API_CATALOG_TYPE,
|
|
12
|
-
hasApiCatalog,
|
|
13
|
-
} from "../../ai/api-catalog.ts";
|
|
14
|
-
import { pageJsonPath } from "../../ai/api/paths.ts";
|
|
15
|
-
import { buildHomeLinkHeader } from "../../ai/link-headers.ts";
|
|
16
|
-
import {
|
|
17
|
-
agentMarkdown,
|
|
18
|
-
buildRawMarkdown,
|
|
19
|
-
markdownRoutePaths,
|
|
20
|
-
markdownTokenCount,
|
|
21
|
-
} from "../../ai/markdown.ts";
|
|
22
|
-
import {
|
|
23
|
-
SIGNATURES_DIRECTORY_PATH,
|
|
24
|
-
SIGNATURES_DIRECTORY_TYPE,
|
|
25
|
-
} from "../../ai/web-bot-auth.ts";
|
|
26
8
|
import { publishBuildProject } from "../../astro/integration.ts";
|
|
27
9
|
import { ensureGitignore } from "../../core/gitignore.ts";
|
|
28
10
|
import type { BlumeProject } from "../../core/project-graph.ts";
|
|
29
|
-
import type { ResolvedConfig } from "../../core/schema.ts";
|
|
30
11
|
import { serverFeatures } from "../../core/server-features.ts";
|
|
31
|
-
import type { ProjectContext } from "../../core/types.ts";
|
|
32
12
|
import {
|
|
33
|
-
|
|
13
|
+
deployOutputDir,
|
|
34
14
|
deployStaticDir,
|
|
35
|
-
servesClientSubdir,
|
|
36
15
|
surfaceAdapterOutput,
|
|
37
16
|
} from "../../deploy/adapter-output.ts";
|
|
38
|
-
import {
|
|
39
|
-
injectWorkerNegotiation,
|
|
40
|
-
NEGOTIATION_WORKER_FILE,
|
|
41
|
-
} from "../../deploy/cloudflare-negotiation.ts";
|
|
42
|
-
import {
|
|
43
|
-
auditVercelFunctions,
|
|
44
|
-
blumeDependencyNames,
|
|
45
|
-
functionBundleVerdict,
|
|
46
|
-
} from "../../deploy/function-bundle.ts";
|
|
47
|
-
import { platformRedirects } from "../../deploy/redirects.ts";
|
|
48
|
-
import { injectNegotiationRoutes } from "../../deploy/vercel-negotiation.ts";
|
|
17
|
+
import { deployPlatform } from "../../deploy/platforms/index.ts";
|
|
49
18
|
import { cardCacheTally, ogCacheDir, pruneCardCache } from "../../og/cache.ts";
|
|
19
|
+
import {
|
|
20
|
+
flagList,
|
|
21
|
+
removedBuildFlags,
|
|
22
|
+
removedBuildFlagsAdvice,
|
|
23
|
+
} from "../../upgrade/upgrade.ts";
|
|
50
24
|
import { commandMeta } from "../command-meta.ts";
|
|
51
25
|
import { refuseIfDevRunning } from "../dev-lock.ts";
|
|
26
|
+
import { refuseIfEjected } from "../eject-scripts.ts";
|
|
52
27
|
import { logger } from "../log.ts";
|
|
53
28
|
import { prepareProject } from "../prepare.ts";
|
|
54
29
|
|
|
55
|
-
const ADAPTERS = ["vercel", "node", "netlify", "cloudflare"] as const;
|
|
56
|
-
|
|
57
|
-
const isAdapter = (value: string): value is (typeof ADAPTERS)[number] =>
|
|
58
|
-
ADAPTERS.some((adapter) => adapter === value);
|
|
59
|
-
|
|
60
30
|
const BUDGET_JS = "budget-js";
|
|
61
31
|
const BUDGET_CSS = "budget-css";
|
|
62
32
|
|
|
@@ -86,171 +56,6 @@ const validateBudgetFlags = (args: BudgetArgs): void => {
|
|
|
86
56
|
}
|
|
87
57
|
};
|
|
88
58
|
|
|
89
|
-
/**
|
|
90
|
-
* Splice `Accept: text/markdown` negotiation routes into the Vercel adapter's
|
|
91
|
-
* Build Output config, so a content-page request that prefers Markdown gets the
|
|
92
|
-
* page's prerendered `.md` mirror (content pages are prerendered even in server
|
|
93
|
-
* output, so Astro middleware never sees them — the routing layer is the only
|
|
94
|
-
* request-time hook). Vercel server builds only; the adapter writes the config
|
|
95
|
-
* straight to the project root (see `withAdapterRoot`).
|
|
96
|
-
*/
|
|
97
|
-
const emitVercelNegotiation = async (
|
|
98
|
-
project: BlumeProject,
|
|
99
|
-
routePaths: string[],
|
|
100
|
-
root: string
|
|
101
|
-
): Promise<void> => {
|
|
102
|
-
const { config } = project;
|
|
103
|
-
const configPath = join(root, ".vercel", "output", "config.json");
|
|
104
|
-
if (!existsSync(configPath)) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
const overrides: Record<string, string> = {};
|
|
108
|
-
if (hasApiCatalog(config)) {
|
|
109
|
-
overrides[API_CATALOG_PATH.slice(1)] = API_CATALOG_TYPE;
|
|
110
|
-
}
|
|
111
|
-
if (config.ai.webBotAuth.keys.length > 0) {
|
|
112
|
-
overrides[SIGNATURES_DIRECTORY_PATH.slice(1)] = SIGNATURES_DIRECTORY_TYPE;
|
|
113
|
-
}
|
|
114
|
-
// The homepage rewrite serves `/index.md` from the static layer, so its
|
|
115
|
-
// `x-markdown-tokens` estimate has to ride the routing config; the runtime
|
|
116
|
-
// endpoint stamps it on dev/server-rendered responses itself.
|
|
117
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
118
|
-
const home = rawMarkdown["/"];
|
|
119
|
-
// The Markdown and JSON 404 routes point at the prerendered twins; only
|
|
120
|
-
// wire each when the build actually emitted it (a project that owns `/404`
|
|
121
|
-
// gets none).
|
|
122
|
-
const staticDir = join(root, ".vercel", "output", "static");
|
|
123
|
-
const injected = injectNegotiationRoutes(
|
|
124
|
-
await readFile(configPath, "utf-8"),
|
|
125
|
-
routePaths,
|
|
126
|
-
buildHomeLinkHeader(config, routePaths),
|
|
127
|
-
overrides,
|
|
128
|
-
home ? markdownTokenCount(agentMarkdown(home)) : undefined,
|
|
129
|
-
{
|
|
130
|
-
json: existsSync(join(staticDir, "404.json")),
|
|
131
|
-
markdown: existsSync(join(staticDir, "404.md")),
|
|
132
|
-
},
|
|
133
|
-
crossOriginDiscoveryPaths(config)
|
|
134
|
-
);
|
|
135
|
-
if (injected === null) {
|
|
136
|
-
logger.warn(
|
|
137
|
-
"Could not wire Accept: text/markdown negotiation into .vercel/output/config.json — raw Markdown stays available at the .md URLs."
|
|
138
|
-
);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
await writeFile(configPath, injected, "utf-8");
|
|
142
|
-
logger.success(
|
|
143
|
-
"Wired Accept: text/markdown negotiation into the Vercel routing config"
|
|
144
|
-
);
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Refuse to ship a Vercel function bundle that would crash at runtime: a bare
|
|
149
|
-
* import the adapter's dependency trace silently dropped (see
|
|
150
|
-
* `deploy/function-bundle.ts`). A missing package that is one of Blume's own
|
|
151
|
-
* dependencies is fatal — the generated runtime imports it, so every request
|
|
152
|
-
* would die; a project's own external import is reported as a warning and left
|
|
153
|
-
* to the author.
|
|
154
|
-
*/
|
|
155
|
-
const checkVercelFunctionBundles = async (
|
|
156
|
-
outputDir: string,
|
|
157
|
-
root: string
|
|
158
|
-
): Promise<void> => {
|
|
159
|
-
const audits = await auditVercelFunctions(outputDir);
|
|
160
|
-
if (audits.length === 0) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
const own = blumeDependencyNames();
|
|
164
|
-
let fatal = false;
|
|
165
|
-
for (const audit of audits) {
|
|
166
|
-
const verdict = functionBundleVerdict(audit, root, own);
|
|
167
|
-
if (verdict.fatal) {
|
|
168
|
-
fatal = true;
|
|
169
|
-
logger.error(verdict.message);
|
|
170
|
-
} else {
|
|
171
|
-
logger.warn(verdict.message);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
if (fatal) {
|
|
175
|
-
process.exit(1);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const warnCloudflareNegotiationSkipped = (): void =>
|
|
180
|
-
logger.warn(
|
|
181
|
-
"Could not wire Accept: text/markdown negotiation into dist/server/wrangler.json — raw Markdown stays available at the .md URLs."
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Wire `Accept: text/markdown` negotiation into a Cloudflare server build. The
|
|
186
|
-
* ASSETS binding serves the prerendered content pages before the Worker runs —
|
|
187
|
-
* and even a request that reaches the Worker is answered by the adapter's
|
|
188
|
-
* handler from that binding, ahead of the only place middleware runs — so the
|
|
189
|
-
* negotiation lives in a generated wrapper Worker, routed to by
|
|
190
|
-
* `assets.run_worker_first` (see `deploy/cloudflare-negotiation.ts`). Both
|
|
191
|
-
* pieces are spliced into the adapter's emitted `dist/server` bundle.
|
|
192
|
-
*/
|
|
193
|
-
const emitCloudflareNegotiation = async (
|
|
194
|
-
project: BlumeProject,
|
|
195
|
-
routePaths: string[]
|
|
196
|
-
): Promise<void> => {
|
|
197
|
-
const { config, context } = project;
|
|
198
|
-
const serverDir = join(
|
|
199
|
-
context.distDir ?? join(context.root, "dist"),
|
|
200
|
-
"server"
|
|
201
|
-
);
|
|
202
|
-
const wranglerPath = join(serverDir, "wrangler.json");
|
|
203
|
-
if (!existsSync(wranglerPath)) {
|
|
204
|
-
warnCloudflareNegotiationSkipped();
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
// The homepage mirror is served from the static layer, so its
|
|
208
|
-
// `x-markdown-tokens` estimate rides the wrapper Worker, mirroring the
|
|
209
|
-
// Vercel routing config.
|
|
210
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
211
|
-
const home = rawMarkdown["/"];
|
|
212
|
-
const injected = injectWorkerNegotiation(
|
|
213
|
-
await readFile(wranglerPath, "utf-8"),
|
|
214
|
-
{
|
|
215
|
-
base: config.deployment.base,
|
|
216
|
-
// The manifest routes guard the wrapper's redirect table; `routePaths`
|
|
217
|
-
// also carries the synthesized homepage mirror, which must not block a
|
|
218
|
-
// configured root redirect.
|
|
219
|
-
contentRoutePaths: project.manifest.routes.map((route) => route.path),
|
|
220
|
-
homeLinkHeader: buildHomeLinkHeader(config, routePaths),
|
|
221
|
-
homeTokens: home ? markdownTokenCount(agentMarkdown(home)) : undefined,
|
|
222
|
-
// Exactly the per-page JSON documents the API emits (see `pageParams`):
|
|
223
|
-
// the non-hidden routes with agent Markdown, when the API is on.
|
|
224
|
-
pageJsonPaths: config.ai.api
|
|
225
|
-
? project.manifest.routes
|
|
226
|
-
.filter(
|
|
227
|
-
(route) => !route.hidden && rawMarkdown[route.path] !== undefined
|
|
228
|
-
)
|
|
229
|
-
.map((route) => pageJsonPath(route.path))
|
|
230
|
-
: [],
|
|
231
|
-
// The wrapper Worker matches full served URLs, so the redirects are
|
|
232
|
-
// based the same way the platform files are — it answers any the
|
|
233
|
-
// worker-first rules claim, where `_redirects` is never consulted and
|
|
234
|
-
// Astro would default their status.
|
|
235
|
-
redirects: platformRedirects(config),
|
|
236
|
-
routePaths,
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
if (injected === null) {
|
|
240
|
-
warnCloudflareNegotiationSkipped();
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
await writeFile(
|
|
244
|
-
join(serverDir, NEGOTIATION_WORKER_FILE),
|
|
245
|
-
injected.worker,
|
|
246
|
-
"utf-8"
|
|
247
|
-
);
|
|
248
|
-
await writeFile(wranglerPath, injected.wrangler, "utf-8");
|
|
249
|
-
logger.success(
|
|
250
|
-
"Wired Accept: text/markdown negotiation into the Cloudflare Worker"
|
|
251
|
-
);
|
|
252
|
-
};
|
|
253
|
-
|
|
254
59
|
/**
|
|
255
60
|
* Report how many OG cards the build read back from the on-disk cache against
|
|
256
61
|
* how many it rendered (the endpoint tallies both), so a warm rebuild shows
|
|
@@ -390,46 +195,6 @@ export const runClientAssetChecks = async (
|
|
|
390
195
|
}
|
|
391
196
|
};
|
|
392
197
|
|
|
393
|
-
/**
|
|
394
|
-
* Root of an isolated build's output. The runtime-local `dist/`, except for a
|
|
395
|
-
* Vercel server build, whose deploy bundle lands at `<runtime>/.vercel/output`
|
|
396
|
-
* and is never surfaced to the project root.
|
|
397
|
-
*/
|
|
398
|
-
export const isolatedOutputDir = (
|
|
399
|
-
config: ResolvedConfig,
|
|
400
|
-
context: ProjectContext
|
|
401
|
-
): string => {
|
|
402
|
-
const { adapter, output } = config.deployment;
|
|
403
|
-
if (output === "server" && adapter === "vercel") {
|
|
404
|
-
return join(context.outDir, ".vercel", "output");
|
|
405
|
-
}
|
|
406
|
-
return context.distDir ?? join(context.outDir, "dist");
|
|
407
|
-
};
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* Directory holding an isolated build's client `_astro/` assets. Mirrors
|
|
411
|
-
* `deployStaticDir`, except that an isolated build never surfaces the adapter
|
|
412
|
-
* bundle to the project root — a Vercel server build's static output stays at
|
|
413
|
-
* `<runtime>/.vercel/output/static`, where `deployStaticDir` would instead
|
|
414
|
-
* point at the project-root copy (a previous real build's assets, or nothing).
|
|
415
|
-
* Node and Cloudflare server builds serve one level down, at `client/` — see
|
|
416
|
-
* {@link servesClientSubdir}.
|
|
417
|
-
*/
|
|
418
|
-
export const isolatedStaticDir = (
|
|
419
|
-
config: ResolvedConfig,
|
|
420
|
-
context: ProjectContext
|
|
421
|
-
): string => {
|
|
422
|
-
const { adapter, output } = config.deployment;
|
|
423
|
-
const outputDir = isolatedOutputDir(config, context);
|
|
424
|
-
if (output === "server" && adapter === "vercel") {
|
|
425
|
-
return join(outputDir, "static");
|
|
426
|
-
}
|
|
427
|
-
if (servesClientSubdir(config.deployment)) {
|
|
428
|
-
return join(outputDir, "client");
|
|
429
|
-
}
|
|
430
|
-
return outputDir;
|
|
431
|
-
};
|
|
432
|
-
|
|
433
198
|
/**
|
|
434
199
|
* Print the build summary box and run the optional bundle report / budget
|
|
435
200
|
* gate against the served static dir. The deploy artifacts themselves
|
|
@@ -450,19 +215,29 @@ const reportBuild = async (
|
|
|
450
215
|
const sitemapNote = config.seo.sitemap
|
|
451
216
|
? "no (set deployment.site)"
|
|
452
217
|
: "no (seo.sitemap is false)";
|
|
453
|
-
|
|
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],
|
|
454
224
|
[
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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")
|
|
466
241
|
);
|
|
467
242
|
|
|
468
243
|
await runClientAssetChecks(distDir, args);
|
|
@@ -479,18 +254,10 @@ const reportBuild = async (
|
|
|
479
254
|
|
|
480
255
|
export const buildCommand = defineCommand({
|
|
481
256
|
args: {
|
|
482
|
-
adapter: {
|
|
483
|
-
description: "Server adapter: vercel | node | netlify | cloudflare.",
|
|
484
|
-
type: "string",
|
|
485
|
-
},
|
|
486
257
|
analyze: {
|
|
487
258
|
description: "Report client JavaScript bundle sizes after the build.",
|
|
488
259
|
type: "boolean",
|
|
489
260
|
},
|
|
490
|
-
base: {
|
|
491
|
-
description: "Base path the site is served under (e.g. /docs).",
|
|
492
|
-
type: "string",
|
|
493
|
-
},
|
|
494
261
|
[BUDGET_CSS]: {
|
|
495
262
|
description: "Fail if total client CSS exceeds this many kB.",
|
|
496
263
|
type: "string",
|
|
@@ -504,10 +271,6 @@ export const buildCommand = defineCommand({
|
|
|
504
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.",
|
|
505
272
|
type: "boolean",
|
|
506
273
|
},
|
|
507
|
-
output: {
|
|
508
|
-
description: "Output mode: static | server.",
|
|
509
|
-
type: "string",
|
|
510
|
-
},
|
|
511
274
|
preview: {
|
|
512
275
|
description: "Include drafts and unpublished CMS content.",
|
|
513
276
|
type: "boolean",
|
|
@@ -520,9 +283,20 @@ export const buildCommand = defineCommand({
|
|
|
520
283
|
},
|
|
521
284
|
},
|
|
522
285
|
meta: commandMeta.build,
|
|
523
|
-
async run({ args }) {
|
|
286
|
+
async run({ args, rawArgs }) {
|
|
524
287
|
const root = process.cwd();
|
|
525
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
|
+
|
|
526
300
|
// `--isolated` (or BLUME_RUNTIME_DIR) relocates the whole runtime to a
|
|
527
301
|
// sibling dir so this build never touches a live dev server's `.blume/` or
|
|
528
302
|
// the user's real `dist/`. A non-default runtime dir has no dev lock, so the
|
|
@@ -535,29 +309,10 @@ export const buildCommand = defineCommand({
|
|
|
535
309
|
await ensureGitignore(root, [".blume-verify/"]);
|
|
536
310
|
}
|
|
537
311
|
|
|
538
|
-
if (args.output && args.output !== "static" && args.output !== "server") {
|
|
539
|
-
logger.error(`Invalid --output "${args.output}" (use static | server).`);
|
|
540
|
-
process.exit(1);
|
|
541
|
-
}
|
|
542
|
-
if (args.adapter && !isAdapter(args.adapter)) {
|
|
543
|
-
logger.error(
|
|
544
|
-
`Invalid --adapter "${args.adapter}" (use ${ADAPTERS.join(" | ")}).`
|
|
545
|
-
);
|
|
546
|
-
process.exit(1);
|
|
547
|
-
}
|
|
548
312
|
validateBudgetFlags(args);
|
|
549
313
|
|
|
550
314
|
const project = await prepareProject({
|
|
551
315
|
mode: "build",
|
|
552
|
-
overrides: {
|
|
553
|
-
// SAFETY: an invalid --adapter exited above; a set flag is an ADAPTERS
|
|
554
|
-
// member.
|
|
555
|
-
adapter: args.adapter as (typeof ADAPTERS)[number] | undefined,
|
|
556
|
-
base: args.base,
|
|
557
|
-
// SAFETY: an invalid --output exited above; a set flag is static or
|
|
558
|
-
// server.
|
|
559
|
-
output: args.output as "server" | "static" | undefined,
|
|
560
|
-
},
|
|
561
316
|
preview: args.preview,
|
|
562
317
|
root,
|
|
563
318
|
runtimeDir,
|
|
@@ -565,7 +320,7 @@ export const buildCommand = defineCommand({
|
|
|
565
320
|
});
|
|
566
321
|
|
|
567
322
|
logger.start(
|
|
568
|
-
`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)`
|
|
569
324
|
);
|
|
570
325
|
|
|
571
326
|
// Hand the scanned project to the integration: its `astro:build:done`
|
|
@@ -587,25 +342,36 @@ export const buildCommand = defineCommand({
|
|
|
587
342
|
// cards a live dev server is still serving.
|
|
588
343
|
await reportCardCache(project, !runtimeDir);
|
|
589
344
|
|
|
590
|
-
//
|
|
591
|
-
//
|
|
592
|
-
//
|
|
593
|
-
|
|
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> => {
|
|
594
353
|
if (
|
|
595
|
-
|
|
596
|
-
|
|
354
|
+
server &&
|
|
355
|
+
platform.finalizeBuild &&
|
|
356
|
+
!(await platform.finalizeBuild({ isolated, log: logger, project }))
|
|
597
357
|
) {
|
|
598
|
-
|
|
599
|
-
isolatedOutputDir(project.config, project.context),
|
|
600
|
-
root
|
|
601
|
-
);
|
|
358
|
+
process.exit(1);
|
|
602
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);
|
|
603
369
|
await runClientAssetChecks(
|
|
604
|
-
|
|
370
|
+
deployStaticDir(project.config, project.context),
|
|
605
371
|
args
|
|
606
372
|
);
|
|
607
373
|
logger.success(
|
|
608
|
-
`Isolated build OK — output at ${
|
|
374
|
+
`Isolated build OK — output at ${deployOutputDir(project.config, project.context)} (not published).`
|
|
609
375
|
);
|
|
610
376
|
return;
|
|
611
377
|
}
|
|
@@ -614,9 +380,8 @@ export const buildCommand = defineCommand({
|
|
|
614
380
|
// version control (Vercel's own CLI ignores `.vercel/` for the same reason).
|
|
615
381
|
// Ignoring it is independent of whether the bundle had to be moved below:
|
|
616
382
|
// Vercel writes straight to the project root, Netlify does not.
|
|
617
|
-
const {
|
|
618
|
-
|
|
619
|
-
if (project.config.deployment.output === "server" && ignoreDir) {
|
|
383
|
+
const { ignoreDir } = platform.hiddenRuntime;
|
|
384
|
+
if (server && ignoreDir) {
|
|
620
385
|
await ensureGitignore(root, [ignoreDir]);
|
|
621
386
|
}
|
|
622
387
|
|
|
@@ -629,20 +394,10 @@ export const buildCommand = defineCommand({
|
|
|
629
394
|
project.context
|
|
630
395
|
);
|
|
631
396
|
if (surfaced.moved) {
|
|
632
|
-
logger.success(`Surfaced ${
|
|
397
|
+
logger.success(`Surfaced ${deployment.kind} output to ${surfaced.to}`);
|
|
633
398
|
}
|
|
634
399
|
|
|
635
|
-
|
|
636
|
-
await checkVercelFunctionBundles(join(root, ".vercel", "output"), root);
|
|
637
|
-
await emitVercelNegotiation(project, markdownRoutePaths(project), root);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
if (
|
|
641
|
-
project.config.deployment.output === "server" &&
|
|
642
|
-
adapter === "cloudflare"
|
|
643
|
-
) {
|
|
644
|
-
await emitCloudflareNegotiation(project, markdownRoutePaths(project));
|
|
645
|
-
}
|
|
400
|
+
await finalize(false);
|
|
646
401
|
|
|
647
402
|
await reportBuild(
|
|
648
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}`);
|