blume 1.7.3 → 2.0.1
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 +245 -0
- package/README.md +34 -21
- package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
- package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
- package/dist/cli/chunk-5shv93fd.js +39 -0
- package/dist/cli/chunk-5shv93fd.js.map +10 -0
- package/dist/cli/chunk-6crbhc3x.js +361 -0
- package/dist/cli/chunk-6crbhc3x.js.map +14 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
- package/dist/cli/chunk-6hsn950k.js.map +10 -0
- package/dist/cli/chunk-6vm74dry.js +148 -0
- package/dist/cli/chunk-6vm74dry.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
- package/dist/cli/chunk-79jhk4py.js.map +35 -0
- package/dist/cli/chunk-82bbrxdn.js +51 -0
- package/dist/cli/chunk-82bbrxdn.js.map +10 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-ah61y8py.js +75 -0
- package/dist/cli/chunk-ah61y8py.js.map +11 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
- package/dist/cli/chunk-ch6g3ar0.js +102 -0
- package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
- package/dist/cli/chunk-dh8cwk36.js +279 -0
- package/dist/cli/chunk-dh8cwk36.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
- package/dist/cli/chunk-f2z5v128.js +97 -0
- package/dist/cli/chunk-f2z5v128.js.map +10 -0
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
- package/dist/cli/chunk-fs23ddbb.js.map +35 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
- package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
- package/dist/cli/chunk-hdpx1tax.js +91 -0
- package/dist/cli/chunk-hdpx1tax.js.map +10 -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-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
- package/dist/cli/chunk-jwyddg7y.js.map +15 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
- package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
- package/dist/cli/chunk-m3vmjgmq.js +133 -0
- package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
- package/dist/cli/chunk-mb2919y2.js.map +10 -0
- package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
- package/dist/cli/chunk-q5163e60.js.map +11 -0
- package/dist/cli/chunk-qkqwkpte.js +12437 -0
- package/dist/cli/chunk-qkqwkpte.js.map +182 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
- package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
- package/dist/cli/chunk-s1p84fyh.js +261 -0
- package/dist/cli/chunk-s1p84fyh.js.map +10 -0
- package/dist/cli/chunk-s6jhgk0q.js +176 -0
- package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
- package/dist/cli/chunk-vtk4a6dg.js +374 -0
- package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
- package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
- package/dist/cli/chunk-wm7js3j9.js +145 -0
- package/dist/cli/chunk-wm7js3j9.js.map +11 -0
- package/dist/cli/chunk-yt5n7ppj.js +79 -0
- package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
- package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
- package/dist/cli/chunk-zxh4d9vy.js +122 -0
- package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
- 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-context.d.ts +7 -7
- 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 +197 -526
- package/dist/types/core/config.d.ts +61 -35
- 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 +30 -15
- 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 +12 -10
- 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 +2284 -454
- 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/orama-index.d.ts +1 -1
- 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 +52 -28
- package/docs/03-upgrading.mdx +364 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +5 -5
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +22 -10
- 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} +12 -11
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +9 -9
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/assistant.mdx +357 -0
- package/docs/configuration/customization.mdx +16 -10
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/meta.ts +1 -1
- package/docs/configuration/search.mdx +76 -55
- 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 +9 -7
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +11 -6
- 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 +12 -12
- 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 +4 -4
- 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 +23 -10
- 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 +25 -26
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api/paths.ts +1 -1
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-context.ts +7 -7
- package/src/ai/ask-data.ts +3 -3
- package/src/ai/ask.ts +637 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/cors.ts +3 -3
- 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 +5 -2
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +3 -3
- package/src/ai/skills.ts +1 -1
- package/src/ai/visibility.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 +129 -361
- package/src/astro/integration.ts +2 -6
- package/src/astro/module-types.ts +1 -1
- 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 +575 -562
- 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/blume-modules.d.ts +2 -2
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +40 -21
- 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 +92 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +5 -5
- 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 +5 -5
- 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 +39 -12
- 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/copy-feedback.ts +1 -1
- package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
- package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
- package/src/components/islands/hooks.ts +36 -11
- 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 +93 -30
- 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 +58 -11
- package/src/components/layout/Pagination.astro +7 -7
- package/src/components/layout/ReferenceLayout.astro +22 -13
- package/src/components/layout/RootLayout.astro +75 -72
- package/src/components/layout/Search.astro +43 -19
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +73 -16
- 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/description.ts +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/code-fences.ts +1 -1
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +201 -566
- package/src/core/config.ts +131 -42
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +34 -15
- 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 +41 -11
- 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 +528 -745
- package/src/core/server-features.ts +10 -11
- 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 +10 -7
- package/src/core/ui-packs/bg.ts +10 -7
- package/src/core/ui-packs/bn.ts +10 -7
- package/src/core/ui-packs/ca.ts +7 -6
- package/src/core/ui-packs/cs.ts +10 -7
- package/src/core/ui-packs/da.ts +10 -7
- package/src/core/ui-packs/de.ts +10 -7
- package/src/core/ui-packs/el.ts +7 -6
- package/src/core/ui-packs/es.ts +7 -6
- package/src/core/ui-packs/fa.ts +10 -7
- package/src/core/ui-packs/fi.ts +10 -7
- package/src/core/ui-packs/fr.ts +7 -6
- package/src/core/ui-packs/he.ts +10 -7
- package/src/core/ui-packs/hi.ts +10 -7
- package/src/core/ui-packs/hr.ts +10 -7
- package/src/core/ui-packs/hu.ts +10 -7
- package/src/core/ui-packs/id.ts +10 -7
- package/src/core/ui-packs/it.ts +7 -6
- package/src/core/ui-packs/ja.ts +7 -6
- package/src/core/ui-packs/ko.ts +7 -6
- package/src/core/ui-packs/nl.ts +10 -7
- package/src/core/ui-packs/no.ts +10 -7
- package/src/core/ui-packs/pl.ts +10 -7
- package/src/core/ui-packs/pt-br.ts +7 -6
- package/src/core/ui-packs/pt.ts +7 -6
- package/src/core/ui-packs/ro.ts +10 -7
- package/src/core/ui-packs/ru.ts +10 -7
- package/src/core/ui-packs/sk.ts +10 -7
- package/src/core/ui-packs/sr.ts +10 -7
- package/src/core/ui-packs/sv.ts +10 -7
- package/src/core/ui-packs/th.ts +7 -6
- package/src/core/ui-packs/tr.ts +10 -7
- package/src/core/ui-packs/uk.ts +10 -7
- package/src/core/ui-packs/vi.ts +7 -6
- package/src/core/ui-packs/zh-tw.ts +7 -6
- package/src/core/ui-packs/zh.ts +7 -6
- 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 +109 -53
- 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 +8 -2
- package/src/search/orama-index.ts +1 -1
- 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/configuration/ask-ai.mdx +0 -256
- 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-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
|
@@ -1,1016 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import"./chunk-ct47dqpx.js";
|
|
3
|
-
import {
|
|
4
|
-
pageJsonPath,
|
|
5
|
-
API_CATALOG_PATH,
|
|
6
|
-
API_CATALOG_TYPE,
|
|
7
|
-
hasApiCatalog,
|
|
8
|
-
crossOriginDiscoveryPaths
|
|
9
|
-
} from "./chunk-0qymqwzz.js";
|
|
10
|
-
import"./chunk-1jefwnfs.js";
|
|
11
|
-
import {
|
|
12
|
-
packageRoot,
|
|
13
|
-
commandMeta,
|
|
14
|
-
logger
|
|
15
|
-
} from "./index.js";
|
|
16
|
-
import"./chunk-7s8hm3b6.js";
|
|
17
|
-
import"./chunk-bf6bt1xt.js";
|
|
18
|
-
import {
|
|
19
|
-
agentMarkdown,
|
|
20
|
-
markdownTokenCount,
|
|
21
|
-
buildRawMarkdown,
|
|
22
|
-
markdownRoutePaths
|
|
23
|
-
} from "./chunk-js7saxwm.js";
|
|
24
|
-
import {
|
|
25
|
-
SIGNATURES_DIRECTORY_PATH,
|
|
26
|
-
SIGNATURES_DIRECTORY_TYPE,
|
|
27
|
-
publishBuildProject,
|
|
28
|
-
ogCacheDir,
|
|
29
|
-
pruneCardCache,
|
|
30
|
-
cardCacheTally
|
|
31
|
-
} from "./chunk-k79xp7av.js";
|
|
32
|
-
import {
|
|
33
|
-
ADAPTER_IGNORE_DIRS,
|
|
34
|
-
servesClientSubdir,
|
|
35
|
-
deployStaticDir,
|
|
36
|
-
surfaceAdapterOutput,
|
|
37
|
-
buildHomeLinkHeader,
|
|
38
|
-
platformRedirects
|
|
39
|
-
} from "./chunk-ps4m1xh4.js";
|
|
40
|
-
import"./chunk-vrfp10qk.js";
|
|
41
|
-
import {
|
|
42
|
-
ensureGitignore
|
|
43
|
-
} from "./chunk-yzhm0j9q.js";
|
|
44
|
-
import {
|
|
45
|
-
refuseIfDevRunning
|
|
46
|
-
} from "./chunk-vacwm2hv.js";
|
|
47
|
-
import"./chunk-jq5n4avg.js";
|
|
48
|
-
import"./chunk-nn13znc2.js";
|
|
49
|
-
import {
|
|
50
|
-
prepareProject
|
|
51
|
-
} from "./chunk-esphfr8p.js";
|
|
52
|
-
import {
|
|
53
|
-
serverFeatures
|
|
54
|
-
} from "./chunk-garjf5z9.js";
|
|
55
|
-
import {
|
|
56
|
-
normalizePath
|
|
57
|
-
} from "./chunk-2mzebbbz.js";
|
|
58
|
-
|
|
59
|
-
// src/cli/commands/build.ts
|
|
60
|
-
import { existsSync as existsSync2 } from "node:fs";
|
|
61
|
-
import { readdir as readdir2, readFile as readFile2, stat, writeFile } from "node:fs/promises";
|
|
62
|
-
import { build } from "astro";
|
|
63
|
-
import { defineCommand } from "citty";
|
|
64
|
-
import { join as join2 } from "pathe";
|
|
65
|
-
|
|
66
|
-
// src/deploy/cloudflare-negotiation.ts
|
|
67
|
-
var NEGOTIATION_WORKER_FILE = "blume-worker.mjs";
|
|
68
|
-
var MAX_RULES = 100;
|
|
69
|
-
var MAX_RULE_LENGTH = 100;
|
|
70
|
-
var FALLBACK_RULES = [
|
|
71
|
-
"/*",
|
|
72
|
-
"!/_astro/*",
|
|
73
|
-
"!/*.md",
|
|
74
|
-
"!/*.mdx",
|
|
75
|
-
"!/*.txt",
|
|
76
|
-
"!/*.json"
|
|
77
|
-
];
|
|
78
|
-
var basePrefix = (base) => base && base !== "/" ? base.replace(/\/$/u, "") : "";
|
|
79
|
-
var isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
80
|
-
var isJsonString = (value) => typeof value === "string";
|
|
81
|
-
var isNegativeRule = (rule) => rule.startsWith("!");
|
|
82
|
-
var ruleBody = (rule) => isNegativeRule(rule) ? rule.slice(1) : rule;
|
|
83
|
-
var buildRunWorkerFirstRules = (routePaths, base) => {
|
|
84
|
-
const prefix = encodeURI(basePrefix(base));
|
|
85
|
-
if (prefix) {
|
|
86
|
-
return [
|
|
87
|
-
prefix,
|
|
88
|
-
`${prefix}/*`,
|
|
89
|
-
`!${prefix}/*.md`,
|
|
90
|
-
`!${prefix}/*.mdx`,
|
|
91
|
-
`!${prefix}/*.txt`,
|
|
92
|
-
`!${prefix}/*.json`,
|
|
93
|
-
`!${prefix}/_astro/*`
|
|
94
|
-
];
|
|
95
|
-
}
|
|
96
|
-
const groups = new Map;
|
|
97
|
-
let home = false;
|
|
98
|
-
for (const route of routePaths) {
|
|
99
|
-
if (route === "/") {
|
|
100
|
-
home = true;
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
const segments = route.split("/").filter(Boolean);
|
|
104
|
-
const head = segments[0] ?? "";
|
|
105
|
-
const group = groups.get(head) ?? { bare: false, nested: false };
|
|
106
|
-
if (segments.length === 1) {
|
|
107
|
-
group.bare = true;
|
|
108
|
-
} else {
|
|
109
|
-
group.nested = true;
|
|
110
|
-
}
|
|
111
|
-
groups.set(head, group);
|
|
112
|
-
}
|
|
113
|
-
const rules = home ? ["/"] : [];
|
|
114
|
-
const negatives = [];
|
|
115
|
-
for (const [head, group] of groups) {
|
|
116
|
-
const segment = `/${encodeURI(head)}`;
|
|
117
|
-
if (group.bare) {
|
|
118
|
-
rules.push(segment);
|
|
119
|
-
}
|
|
120
|
-
if (group.nested) {
|
|
121
|
-
rules.push(`${segment}/*`);
|
|
122
|
-
negatives.push(`!${segment}/*.md`, `!${segment}/*.mdx`);
|
|
123
|
-
} else {
|
|
124
|
-
rules.push(`${segment}/`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return [...rules, ...negatives];
|
|
128
|
-
};
|
|
129
|
-
var coveredBy = (rule, other) => other !== rule && isNegativeRule(other) === isNegativeRule(rule) && ruleBody(other).endsWith("*") && ruleBody(rule).startsWith(ruleBody(other).slice(0, -1));
|
|
130
|
-
var mergeRunWorkerFirstRules = (existing, added) => {
|
|
131
|
-
if (existing === true) {
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
|
-
const user = Array.isArray(existing) ? existing.filter((rule) => typeof rule === "string") : [];
|
|
135
|
-
const merged = [...user, ...added.filter((rule) => !user.includes(rule))];
|
|
136
|
-
return merged.filter((rule) => !merged.some((other) => coveredBy(rule, other)));
|
|
137
|
-
};
|
|
138
|
-
var withinWranglerLimits = (rules) => rules === true || rules.length <= MAX_RULES && rules.every((rule) => rule.length <= MAX_RULE_LENGTH);
|
|
139
|
-
var buildNegotiationWorker = (options) => {
|
|
140
|
-
const routes = JSON.stringify(options.routePaths);
|
|
141
|
-
const pageJson = JSON.stringify(options.pageJsonPaths ?? []);
|
|
142
|
-
const binding = JSON.stringify(options.assetsBinding);
|
|
143
|
-
const prefix = JSON.stringify(encodeURI(basePrefix(options.base)));
|
|
144
|
-
const homeLinkHeader = JSON.stringify(options.homeLinkHeader ?? null);
|
|
145
|
-
const homeTokens = JSON.stringify(options.homeTokens === undefined ? null : String(options.homeTokens));
|
|
146
|
-
const redirects = JSON.stringify(Object.fromEntries((options.redirects ?? []).map((redirect) => [
|
|
147
|
-
normalizePath(redirect.from),
|
|
148
|
-
[encodeURI(redirect.to), redirect.status]
|
|
149
|
-
])));
|
|
150
|
-
return `// Generated by Blume. Do not edit; this file is recreated on each build.
|
|
151
|
-
//
|
|
152
|
-
// Request-time \`Accept: text/markdown\` negotiation for a Cloudflare server
|
|
153
|
-
// build. \`assets.run_worker_first\` routes content-page requests here instead
|
|
154
|
-
// of the platform's static layer; a client that prefers Markdown gets the
|
|
155
|
-
// page's prerendered \`.md\` mirror from the assets binding, a configured
|
|
156
|
-
// redirect is answered with its exact configured status, and a prerendered
|
|
157
|
-
// per-page JSON document is served from the binding (the Astro Worker would
|
|
158
|
-
// route it to the \`/api/\` catch-all, because Astro resolves a prerendered
|
|
159
|
-
// dynamic route to the first live route on the same path). Every other
|
|
160
|
-
// request is delegated to the Astro Worker untouched. \`_headers\` does not
|
|
161
|
-
// apply to worker-first routes, so the homepage Link header and the Markdown
|
|
162
|
-
// charset are re-stamped here.
|
|
163
|
-
import server from ${JSON.stringify(options.mainSpecifier)};
|
|
164
|
-
|
|
165
|
-
const ROUTES = new Set(${routes});
|
|
166
|
-
const PAGE_JSON = new Set(${pageJson});
|
|
167
|
-
const BASE_PREFIX = ${prefix};
|
|
168
|
-
const ASSETS_BINDING = ${binding};
|
|
169
|
-
const HOME_LINK_HEADER = ${homeLinkHeader};
|
|
170
|
-
const HOME_TOKENS = ${homeTokens};
|
|
171
|
-
const REDIRECTS = ${redirects};
|
|
172
|
-
|
|
173
|
-
// Configured redirects live in \`_redirects\`, which only the static layer
|
|
174
|
-
// reads — a worker-first route never reaches it. Answering from this baked-in
|
|
175
|
-
// copy keeps the exact configured status; delegating instead would let Astro's
|
|
176
|
-
// SSR handler default a GET to a permanent 301.
|
|
177
|
-
const redirectFor = (pathname) => {
|
|
178
|
-
const trimmed =
|
|
179
|
-
pathname !== "/" && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname;
|
|
180
|
-
const path = safeDecode(trimmed);
|
|
181
|
-
return Object.hasOwn(REDIRECTS, path) ? REDIRECTS[path] : null;
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
// The request path with the deployment base removed: the whole path on a
|
|
185
|
-
// root deploy, \`""\` for the bare base, \`null\` for a path outside the base.
|
|
186
|
-
const stripBase = (pathname) => {
|
|
187
|
-
if (!BASE_PREFIX) {
|
|
188
|
-
return pathname;
|
|
189
|
-
}
|
|
190
|
-
if (pathname === BASE_PREFIX) {
|
|
191
|
-
return "";
|
|
192
|
-
}
|
|
193
|
-
return pathname.startsWith(BASE_PREFIX + "/")
|
|
194
|
-
? pathname.slice(BASE_PREFIX.length)
|
|
195
|
-
: null;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
// Decoded for the lookups, which are keyed by decoded paths; a malformed
|
|
199
|
-
// escape keeps the raw path, which simply won't match anything.
|
|
200
|
-
const safeDecode = (path) => {
|
|
201
|
-
try {
|
|
202
|
-
return decodeURIComponent(path);
|
|
203
|
-
} catch {
|
|
204
|
-
return path;
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
// \`_redirects\` semantics, which the static layer applies to these same
|
|
209
|
-
// paths: the request's query string is forwarded unless the destination
|
|
210
|
-
// carries its own, and a destination fragment stays after the query.
|
|
211
|
-
const redirectLocation = (destination, search) => {
|
|
212
|
-
const hashIndex = destination.indexOf("#");
|
|
213
|
-
const bare = hashIndex === -1 ? destination : destination.slice(0, hashIndex);
|
|
214
|
-
if (!search || bare.includes("?")) {
|
|
215
|
-
return destination;
|
|
216
|
-
}
|
|
217
|
-
return hashIndex === -1
|
|
218
|
-
? bare + search
|
|
219
|
-
: bare + search + destination.slice(hashIndex);
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
const parseAccept = (accept) =>
|
|
223
|
-
accept.split(",").map((part) => {
|
|
224
|
-
const segments = part.trim().split(";");
|
|
225
|
-
const type = (segments[0] ?? "").trim().toLowerCase();
|
|
226
|
-
const qSegment = segments
|
|
227
|
-
.slice(1)
|
|
228
|
-
.map((segment) => segment.trim())
|
|
229
|
-
.find((segment) => segment.startsWith("q="));
|
|
230
|
-
const q = qSegment ? Number(qSegment.slice(2)) : 1;
|
|
231
|
-
return { q: Number.isNaN(q) ? 1 : q, type };
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
const prefersMarkdown = (accept) => {
|
|
235
|
-
if (!accept) {
|
|
236
|
-
return false;
|
|
237
|
-
}
|
|
238
|
-
let markdownQ = -1;
|
|
239
|
-
let htmlQ = 0;
|
|
240
|
-
for (const { q, type } of parseAccept(accept)) {
|
|
241
|
-
if (type === "text/markdown" || type === "text/x-markdown") {
|
|
242
|
-
markdownQ = Math.max(markdownQ, q);
|
|
243
|
-
} else if (type === "text/html") {
|
|
244
|
-
htmlQ = Math.max(htmlQ, q);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
return markdownQ > 0 && markdownQ >= htmlQ;
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
const markdownVariantUrl = (rawUrl) => {
|
|
251
|
-
const queryIndex = rawUrl.indexOf("?");
|
|
252
|
-
const query = queryIndex === -1 ? "" : rawUrl.slice(queryIndex);
|
|
253
|
-
const rawPath = queryIndex === -1 ? rawUrl : rawUrl.slice(0, queryIndex);
|
|
254
|
-
const rest = stripBase(rawPath);
|
|
255
|
-
if (rest === null) {
|
|
256
|
-
return null;
|
|
257
|
-
}
|
|
258
|
-
const path = rest || "/";
|
|
259
|
-
const trimmed = path !== "/" && path.endsWith("/") ? path.slice(0, -1) : path;
|
|
260
|
-
const pathname = safeDecode(trimmed);
|
|
261
|
-
if (!ROUTES.has(pathname)) {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
const target = pathname === "/" ? "/index" : pathname;
|
|
265
|
-
return BASE_PREFIX + encodeURI(target) + ".md" + query;
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
// Exactly the per-page JSON documents the build emitted, so a URL the site
|
|
269
|
-
// never generated (a hidden page, a path outside the API) takes the normal
|
|
270
|
-
// route to the Astro Worker and its problem document.
|
|
271
|
-
const isPageJson = (pathname) => {
|
|
272
|
-
const rest = stripBase(pathname);
|
|
273
|
-
return rest !== null && PAGE_JSON.has(safeDecode(rest));
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const isHomePath = (pathname) => {
|
|
277
|
-
const rest = stripBase(pathname);
|
|
278
|
-
return rest === "" || rest === "/";
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
const withHeaders = (response, apply) => {
|
|
282
|
-
const patched = new Response(response.body, response);
|
|
283
|
-
apply(patched.headers);
|
|
284
|
-
return patched;
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
export default {
|
|
288
|
-
async fetch(request, env, context) {
|
|
289
|
-
const url = new URL(request.url);
|
|
290
|
-
// Before the method guard: the static layer applies \`_redirects\` to every
|
|
291
|
-
// method, so the wrapper does too.
|
|
292
|
-
const redirect = redirectFor(url.pathname);
|
|
293
|
-
if (redirect !== null) {
|
|
294
|
-
return new Response(null, {
|
|
295
|
-
headers: { location: redirectLocation(redirect[0], url.search) },
|
|
296
|
-
status: redirect[1],
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
300
|
-
return server.fetch(request, env, context);
|
|
301
|
-
}
|
|
302
|
-
const assets = env[ASSETS_BINDING];
|
|
303
|
-
// The request goes through untouched, so a conditional revalidation
|
|
304
|
-
// reaches the binding and comes back as a 304 — anything but a miss is
|
|
305
|
-
// the document's own answer. A miss falls through to the Astro Worker.
|
|
306
|
-
if (assets !== undefined && isPageJson(url.pathname)) {
|
|
307
|
-
const asset = await assets.fetch(request);
|
|
308
|
-
if (asset.status !== 404) {
|
|
309
|
-
return asset;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
const variant = markdownVariantUrl(url.pathname + url.search);
|
|
313
|
-
const home = isHomePath(url.pathname);
|
|
314
|
-
if (
|
|
315
|
-
variant !== null &&
|
|
316
|
-
assets !== undefined &&
|
|
317
|
-
prefersMarkdown(request.headers.get("accept"))
|
|
318
|
-
) {
|
|
319
|
-
const asset = await assets.fetch(
|
|
320
|
-
new Request(new URL(variant, url), request)
|
|
321
|
-
);
|
|
322
|
-
if (asset.ok) {
|
|
323
|
-
return withHeaders(asset, (headers) => {
|
|
324
|
-
headers.set("content-type", "text/markdown; charset=utf-8");
|
|
325
|
-
headers.append("vary", "Accept");
|
|
326
|
-
if (home) {
|
|
327
|
-
if (HOME_LINK_HEADER !== null) {
|
|
328
|
-
headers.set("link", HOME_LINK_HEADER);
|
|
329
|
-
}
|
|
330
|
-
if (HOME_TOKENS !== null) {
|
|
331
|
-
headers.set("x-markdown-tokens", HOME_TOKENS);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
const response = await server.fetch(request, env, context);
|
|
338
|
-
if (variant === null && !(home && HOME_LINK_HEADER !== null)) {
|
|
339
|
-
return response;
|
|
340
|
-
}
|
|
341
|
-
return withHeaders(response, (headers) => {
|
|
342
|
-
if (variant !== null) {
|
|
343
|
-
headers.append("vary", "Accept");
|
|
344
|
-
}
|
|
345
|
-
if (home && HOME_LINK_HEADER !== null && !headers.has("link")) {
|
|
346
|
-
headers.set("link", HOME_LINK_HEADER);
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
},
|
|
350
|
-
};
|
|
351
|
-
`;
|
|
352
|
-
};
|
|
353
|
-
var injectWorkerNegotiation = (wranglerText, options) => {
|
|
354
|
-
if (options.routePaths.length === 0) {
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
357
|
-
let config;
|
|
358
|
-
try {
|
|
359
|
-
config = JSON.parse(wranglerText);
|
|
360
|
-
} catch {
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
if (!isJsonObject(config)) {
|
|
364
|
-
return null;
|
|
365
|
-
}
|
|
366
|
-
const { main } = config;
|
|
367
|
-
if (!isJsonString(main) || main.length === 0 || main === NEGOTIATION_WORKER_FILE) {
|
|
368
|
-
return null;
|
|
369
|
-
}
|
|
370
|
-
const { assets } = config;
|
|
371
|
-
if (!isJsonObject(assets) || !isJsonString(assets.binding)) {
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
const {
|
|
375
|
-
contentRoutePaths = options.routePaths,
|
|
376
|
-
redirects = [],
|
|
377
|
-
...workerOptions
|
|
378
|
-
} = options;
|
|
379
|
-
const deployPrefix = basePrefix(options.base);
|
|
380
|
-
const guardRoutes = new Set(contentRoutePaths.map((route) => normalizePath(deployPrefix && route !== "/" ? `${deployPrefix}${route}` : deployPrefix || route)));
|
|
381
|
-
const workerRedirects = redirects.filter((redirect) => redirect.from.startsWith("/") && !guardRoutes.has(normalizePath(redirect.from)));
|
|
382
|
-
let rules = mergeRunWorkerFirstRules(assets.run_worker_first, buildRunWorkerFirstRules(options.routePaths, options.base));
|
|
383
|
-
if (!withinWranglerLimits(rules)) {
|
|
384
|
-
rules = mergeRunWorkerFirstRules(assets.run_worker_first, FALLBACK_RULES);
|
|
385
|
-
}
|
|
386
|
-
if (!withinWranglerLimits(rules)) {
|
|
387
|
-
return null;
|
|
388
|
-
}
|
|
389
|
-
if (rules !== true) {
|
|
390
|
-
assets.run_worker_first = rules;
|
|
391
|
-
}
|
|
392
|
-
config.main = NEGOTIATION_WORKER_FILE;
|
|
393
|
-
const mainSpecifier = main.startsWith(".") || main.startsWith("/") ? main : `./${main}`;
|
|
394
|
-
const worker = buildNegotiationWorker({
|
|
395
|
-
...workerOptions,
|
|
396
|
-
assetsBinding: assets.binding,
|
|
397
|
-
mainSpecifier,
|
|
398
|
-
redirects: workerRedirects
|
|
399
|
-
});
|
|
400
|
-
return { worker, wrangler: JSON.stringify(config) };
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
// src/deploy/function-bundle.ts
|
|
404
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
405
|
-
import { readdir, readFile } from "node:fs/promises";
|
|
406
|
-
import { builtinModules } from "node:module";
|
|
407
|
-
import { init, parse } from "es-module-lexer";
|
|
408
|
-
import { dirname, join, relative } from "pathe";
|
|
409
|
-
import { z } from "zod";
|
|
410
|
-
var BUILTINS = new Set(builtinModules);
|
|
411
|
-
var NON_PACKAGE_PREFIXES = ["node:", "astro:", "virtual:", "data:", "\x00"];
|
|
412
|
-
var packageName = (specifier) => {
|
|
413
|
-
if (specifier.startsWith(".") || specifier.startsWith("/") || NON_PACKAGE_PREFIXES.some((prefix) => specifier.startsWith(prefix)) || BUILTINS.has(specifier)) {
|
|
414
|
-
return null;
|
|
415
|
-
}
|
|
416
|
-
const segments = specifier.split("/");
|
|
417
|
-
if (specifier.startsWith("@")) {
|
|
418
|
-
return segments.length >= 2 ? `${segments[0]}/${segments[1]}` : null;
|
|
419
|
-
}
|
|
420
|
-
return segments[0] || null;
|
|
421
|
-
};
|
|
422
|
-
var STATIC_IMPORT = /(?:^|[;\s}])(?:import\s*["'](?<bare>[^"'\n]+)["']|(?:import|export)\s*[\w$*{},\s]*?\s*from\s*["'](?<from>[^"'\n]+)["'])/gu;
|
|
423
|
-
var DYNAMIC_IMPORT = /\bimport\(\s*["'](?<dynamic>[^"'\n]+)["']\s*\)/gu;
|
|
424
|
-
var scannedSpecifiers = (source) => {
|
|
425
|
-
const specifiers = [];
|
|
426
|
-
for (const pattern of [STATIC_IMPORT, DYNAMIC_IMPORT]) {
|
|
427
|
-
for (const match of source.matchAll(pattern)) {
|
|
428
|
-
const groups = match.groups ?? {};
|
|
429
|
-
specifiers.push(groups.bare ?? groups.from ?? groups.dynamic ?? "");
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
return specifiers;
|
|
433
|
-
};
|
|
434
|
-
var lexedSpecifiers = (source, name) => {
|
|
435
|
-
const [imports] = parse(source, name);
|
|
436
|
-
const specifiers = [];
|
|
437
|
-
for (const entry of imports) {
|
|
438
|
-
if (entry.type === "dynamic" && entry.glob) {
|
|
439
|
-
continue;
|
|
440
|
-
}
|
|
441
|
-
if (entry.specifier) {
|
|
442
|
-
specifiers.push(entry.specifier);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return specifiers;
|
|
446
|
-
};
|
|
447
|
-
var importedPackages = async (source, name = "module") => {
|
|
448
|
-
await init();
|
|
449
|
-
let specifiers;
|
|
450
|
-
try {
|
|
451
|
-
specifiers = lexedSpecifiers(source, name);
|
|
452
|
-
} catch {
|
|
453
|
-
specifiers = scannedSpecifiers(source);
|
|
454
|
-
}
|
|
455
|
-
const names = new Set;
|
|
456
|
-
for (const specifier of specifiers) {
|
|
457
|
-
const packageId = packageName(specifier);
|
|
458
|
-
if (packageId) {
|
|
459
|
-
names.add(packageId);
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
return [...names];
|
|
463
|
-
};
|
|
464
|
-
var resolvable = (name, from, root) => {
|
|
465
|
-
let dir = from;
|
|
466
|
-
for (;; ) {
|
|
467
|
-
if (existsSync(join(dir, "node_modules", name, "package.json"))) {
|
|
468
|
-
return true;
|
|
469
|
-
}
|
|
470
|
-
if (dir === root) {
|
|
471
|
-
return false;
|
|
472
|
-
}
|
|
473
|
-
const parent = dirname(dir);
|
|
474
|
-
if (parent === dir) {
|
|
475
|
-
return false;
|
|
476
|
-
}
|
|
477
|
-
dir = parent;
|
|
478
|
-
}
|
|
479
|
-
};
|
|
480
|
-
var MODULE_FILE = /\.(?:m?js|cjs)$/u;
|
|
481
|
-
var vcConfigSchema = z.looseObject({ handler: z.string().optional() });
|
|
482
|
-
var listModules = async (dir) => {
|
|
483
|
-
const files = [];
|
|
484
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
485
|
-
for (const entry of entries) {
|
|
486
|
-
const path = join(dir, entry.name);
|
|
487
|
-
if (entry.isDirectory()) {
|
|
488
|
-
if (entry.name !== "node_modules") {
|
|
489
|
-
files.push(...await listModules(path));
|
|
490
|
-
}
|
|
491
|
-
} else if (entry.isFile() && MODULE_FILE.test(entry.name)) {
|
|
492
|
-
files.push(path);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
return files;
|
|
496
|
-
};
|
|
497
|
-
var auditFunctionBundle = async (funcDir) => {
|
|
498
|
-
const configPath = join(funcDir, ".vc-config.json");
|
|
499
|
-
if (!existsSync(configPath)) {
|
|
500
|
-
return [];
|
|
501
|
-
}
|
|
502
|
-
const config = vcConfigSchema.safeParse(JSON.parse(await readFile(configPath, "utf-8")));
|
|
503
|
-
if (!config.success || !config.data.handler) {
|
|
504
|
-
return [];
|
|
505
|
-
}
|
|
506
|
-
const serverDir = dirname(join(funcDir, config.data.handler));
|
|
507
|
-
if (!existsSync(serverDir)) {
|
|
508
|
-
return [];
|
|
509
|
-
}
|
|
510
|
-
const missing = new Map;
|
|
511
|
-
for (const file of await listModules(serverDir)) {
|
|
512
|
-
const source = await readFile(file, "utf-8");
|
|
513
|
-
for (const name of await importedPackages(source, file)) {
|
|
514
|
-
if (resolvable(name, dirname(file), funcDir)) {
|
|
515
|
-
continue;
|
|
516
|
-
}
|
|
517
|
-
const importers = missing.get(name) ?? [];
|
|
518
|
-
importers.push(relative(funcDir, file));
|
|
519
|
-
missing.set(name, importers);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
return [...missing].map(([name, importers]) => ({ importers, name })).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
523
|
-
};
|
|
524
|
-
var auditVercelFunctions = async (outputDir) => {
|
|
525
|
-
const functionsDir = join(outputDir, "functions");
|
|
526
|
-
if (!existsSync(functionsDir)) {
|
|
527
|
-
return [];
|
|
528
|
-
}
|
|
529
|
-
const audits = [];
|
|
530
|
-
const entries = await readdir(functionsDir, { withFileTypes: true });
|
|
531
|
-
for (const entry of entries.toSorted((a, b) => a.name < b.name ? -1 : 1)) {
|
|
532
|
-
if (!(entry.isDirectory() && entry.name.endsWith(".func"))) {
|
|
533
|
-
continue;
|
|
534
|
-
}
|
|
535
|
-
const dir = join(functionsDir, entry.name);
|
|
536
|
-
const missing = await auditFunctionBundle(dir);
|
|
537
|
-
if (missing.length > 0) {
|
|
538
|
-
audits.push({ dir, missing });
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
return audits;
|
|
542
|
-
};
|
|
543
|
-
var blumeDependencyNames = () => {
|
|
544
|
-
const manifest = JSON.parse(readFileSync(join(packageRoot(), "package.json"), "utf-8"));
|
|
545
|
-
return new Set(Object.keys(manifest.dependencies ?? {}));
|
|
546
|
-
};
|
|
547
|
-
var functionBundleVerdict = (audit, root, ownDependencies) => {
|
|
548
|
-
const names = audit.missing.map((entry) => entry.name);
|
|
549
|
-
const lines = audit.missing.map((entry) => ` - ${entry.name} (imported by ${entry.importers.join(", ")})`);
|
|
550
|
-
const fatal = names.some((name) => ownDependencies.has(name));
|
|
551
|
-
const message = [
|
|
552
|
-
`The Vercel function bundle at ${relative(root, audit.dir) || audit.dir} is missing packages its server code imports, so the deployed function would fail on every request with ERR_MODULE_NOT_FOUND:`,
|
|
553
|
-
...lines,
|
|
554
|
-
"Vercel's dependency trace only includes packages resolvable from the project root; under an isolated linker (pnpm, Bun's isolated mode) Blume's own dependencies are not. Add them to the project's package.json so the trace can find them:",
|
|
555
|
-
` npm install -D ${names.join(" ")}`
|
|
556
|
-
].join(`
|
|
557
|
-
`);
|
|
558
|
-
return { fatal, message };
|
|
559
|
-
};
|
|
560
|
-
|
|
561
|
-
// src/deploy/vercel-negotiation.ts
|
|
562
|
-
var ACCEPT_MARKDOWN_HEADER_VALUE = "(.*,)?\\s*text/(x-)?markdown(\\s*[;,].*)?$";
|
|
563
|
-
var ACCEPT_JSON_HEADER_VALUE = "(.*,)?\\s*application/(problem\\+)?json(\\s*[;,].*)?$";
|
|
564
|
-
var isString = (value) => typeof value === "string";
|
|
565
|
-
var ACCEPT_MARKDOWN_CONDITION = [
|
|
566
|
-
{ key: "accept", type: "header", value: ACCEPT_MARKDOWN_HEADER_VALUE }
|
|
567
|
-
];
|
|
568
|
-
var ACCEPT_JSON_CONDITION = [
|
|
569
|
-
{ key: "accept", type: "header", value: ACCEPT_JSON_HEADER_VALUE }
|
|
570
|
-
];
|
|
571
|
-
var VARY_ACCEPT = { vary: "Accept" };
|
|
572
|
-
var NOT_FOUND_MARKDOWN_DEST = "/404.md";
|
|
573
|
-
var NOT_FOUND_JSON_DEST = "/404.json";
|
|
574
|
-
var NOT_FOUND_HTML_DEST = "/404.html";
|
|
575
|
-
var NOT_FOUND_MARKDOWN_ROUTES = [
|
|
576
|
-
{
|
|
577
|
-
dest: NOT_FOUND_MARKDOWN_DEST,
|
|
578
|
-
has: ACCEPT_MARKDOWN_CONDITION,
|
|
579
|
-
headers: VARY_ACCEPT,
|
|
580
|
-
src: "^/.*$",
|
|
581
|
-
status: 404
|
|
582
|
-
},
|
|
583
|
-
{ dest: NOT_FOUND_MARKDOWN_DEST, src: "^/.*\\.mdx?$", status: 404 }
|
|
584
|
-
];
|
|
585
|
-
var NOT_FOUND_JSON_ROUTES = [
|
|
586
|
-
{
|
|
587
|
-
dest: NOT_FOUND_JSON_DEST,
|
|
588
|
-
has: ACCEPT_JSON_CONDITION,
|
|
589
|
-
headers: VARY_ACCEPT,
|
|
590
|
-
src: "^/.*$",
|
|
591
|
-
status: 404
|
|
592
|
-
},
|
|
593
|
-
{ dest: NOT_FOUND_JSON_DEST, src: "^/.*\\.json$", status: 404 }
|
|
594
|
-
];
|
|
595
|
-
var MAX_ALTERNATION_LENGTH = 3900;
|
|
596
|
-
var REGEX_SPECIALS = /[$()*+.?[\]^{|}\\]/gu;
|
|
597
|
-
var routePattern = (route) => encodeURI(route).replace(REGEX_SPECIALS, "\\$&");
|
|
598
|
-
var chunkPatterns = (patterns) => {
|
|
599
|
-
const chunks = [];
|
|
600
|
-
let current = [];
|
|
601
|
-
let length = 0;
|
|
602
|
-
for (const pattern of patterns) {
|
|
603
|
-
if (current.length > 0 && length + pattern.length + 1 > MAX_ALTERNATION_LENGTH) {
|
|
604
|
-
chunks.push(current);
|
|
605
|
-
current = [];
|
|
606
|
-
length = 0;
|
|
607
|
-
}
|
|
608
|
-
current.push(pattern);
|
|
609
|
-
length += pattern.length + 1;
|
|
610
|
-
}
|
|
611
|
-
if (current.length > 0) {
|
|
612
|
-
chunks.push(current);
|
|
613
|
-
}
|
|
614
|
-
return chunks;
|
|
615
|
-
};
|
|
616
|
-
var buildNegotiationRoutes = (routePaths, homeTokens) => {
|
|
617
|
-
const home = routePaths.includes("/");
|
|
618
|
-
const rest = routePaths.filter((path) => path !== "/").map((path) => routePattern(path));
|
|
619
|
-
const chunks = chunkPatterns(rest);
|
|
620
|
-
const rewriteRoutes = home ? [
|
|
621
|
-
{
|
|
622
|
-
dest: "/index.md",
|
|
623
|
-
has: ACCEPT_MARKDOWN_CONDITION,
|
|
624
|
-
headers: homeTokens === undefined ? VARY_ACCEPT : { ...VARY_ACCEPT, "x-markdown-tokens": String(homeTokens) },
|
|
625
|
-
src: "^/$"
|
|
626
|
-
}
|
|
627
|
-
] : [];
|
|
628
|
-
for (const chunk of chunks) {
|
|
629
|
-
rewriteRoutes.push({
|
|
630
|
-
dest: "$1.md",
|
|
631
|
-
has: ACCEPT_MARKDOWN_CONDITION,
|
|
632
|
-
headers: VARY_ACCEPT,
|
|
633
|
-
src: `^(${chunk.join("|")})/?$`
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
const headerChunks = chunkPatterns(home ? ["/", ...rest] : rest);
|
|
637
|
-
const headerRoutes = headerChunks.map((chunk) => ({
|
|
638
|
-
continue: true,
|
|
639
|
-
headers: VARY_ACCEPT,
|
|
640
|
-
src: `^(?:${chunk.join("|")})/?$`
|
|
641
|
-
}));
|
|
642
|
-
return { headerRoutes, rewriteRoutes };
|
|
643
|
-
};
|
|
644
|
-
var HOME_SRC = "^/$";
|
|
645
|
-
var ALLOW_ANY_ORIGIN = "*";
|
|
646
|
-
var corsRoute = (path) => ({
|
|
647
|
-
continue: true,
|
|
648
|
-
headers: { "access-control-allow-origin": ALLOW_ANY_ORIGIN },
|
|
649
|
-
src: `^${routePattern(path)}$`
|
|
650
|
-
});
|
|
651
|
-
var isCorsRoute = (route) => route.continue === true && route.headers?.["access-control-allow-origin"] === ALLOW_ANY_ORIGIN && isString(route.src) && Object.keys(route).length === 3;
|
|
652
|
-
var isNegotiationRoute = (route) => route.has?.some((condition) => condition.value === ACCEPT_MARKDOWN_HEADER_VALUE) === true || route.dest === NOT_FOUND_MARKDOWN_DEST && route.status === 404 || route.dest === NOT_FOUND_JSON_DEST && route.status === 404 || route.continue === true && route.headers?.vary === "Accept" && isString(route.src) && Object.keys(route).length === 3 || route.continue === true && isString(route.headers?.link) && route.src === HOME_SRC && Object.keys(route).length === 3 || isCorsRoute(route);
|
|
653
|
-
var injectNegotiationRoutes = (configText, routePaths, homeLinkHeader, contentTypeOverrides, homeTokens, notFound = {}, corsPaths = []) => {
|
|
654
|
-
const overrideEntries = Object.entries(contentTypeOverrides ?? {});
|
|
655
|
-
let config;
|
|
656
|
-
try {
|
|
657
|
-
config = JSON.parse(configText);
|
|
658
|
-
} catch {
|
|
659
|
-
return null;
|
|
660
|
-
}
|
|
661
|
-
if (!Array.isArray(config.routes)) {
|
|
662
|
-
return null;
|
|
663
|
-
}
|
|
664
|
-
for (const [path, contentType] of overrideEntries) {
|
|
665
|
-
config.overrides = { ...config.overrides, [path]: { contentType } };
|
|
666
|
-
}
|
|
667
|
-
const routes = config.routes.filter((route) => !isNegotiationRoute(route));
|
|
668
|
-
const filesystemIndex = routes.findIndex((route) => route.handle === "filesystem");
|
|
669
|
-
if (filesystemIndex === -1) {
|
|
670
|
-
return null;
|
|
671
|
-
}
|
|
672
|
-
const { headerRoutes, rewriteRoutes } = buildNegotiationRoutes(routePaths, homeTokens);
|
|
673
|
-
if (homeLinkHeader) {
|
|
674
|
-
headerRoutes.push({
|
|
675
|
-
continue: true,
|
|
676
|
-
headers: { link: homeLinkHeader },
|
|
677
|
-
src: HOME_SRC
|
|
678
|
-
});
|
|
679
|
-
}
|
|
680
|
-
headerRoutes.push(...corsPaths.map(corsRoute));
|
|
681
|
-
routes.splice(filesystemIndex, 0, ...headerRoutes, ...rewriteRoutes);
|
|
682
|
-
const notFoundRoutes = [
|
|
683
|
-
...notFound.markdown ? NOT_FOUND_MARKDOWN_ROUTES : [],
|
|
684
|
-
...notFound.json ? NOT_FOUND_JSON_ROUTES : []
|
|
685
|
-
];
|
|
686
|
-
if (notFoundRoutes.length > 0) {
|
|
687
|
-
const fallbackIndex = routes.findIndex((route) => route.status === 404 && route.dest === NOT_FOUND_HTML_DEST);
|
|
688
|
-
if (fallbackIndex !== -1) {
|
|
689
|
-
routes.splice(fallbackIndex, 0, ...notFoundRoutes);
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
config.routes = routes;
|
|
693
|
-
return `${JSON.stringify(config, null, "\t")}
|
|
694
|
-
`;
|
|
695
|
-
};
|
|
696
|
-
|
|
697
|
-
// src/cli/commands/build.ts
|
|
698
|
-
var ADAPTERS = ["vercel", "node", "netlify", "cloudflare"];
|
|
699
|
-
var isAdapter = (value) => ADAPTERS.some((adapter) => adapter === value);
|
|
700
|
-
var BUDGET_JS = "budget-js";
|
|
701
|
-
var BUDGET_CSS = "budget-css";
|
|
702
|
-
var validateBudgetFlags = (args) => {
|
|
703
|
-
for (const flag of [BUDGET_JS, BUDGET_CSS]) {
|
|
704
|
-
const value = args[flag];
|
|
705
|
-
const parsed = Number(value);
|
|
706
|
-
if (value !== undefined && (Number.isNaN(parsed) || parsed <= 0)) {
|
|
707
|
-
logger.error(`Invalid --${flag} "${value}" (expected a positive number of kB).`);
|
|
708
|
-
process.exit(1);
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
};
|
|
712
|
-
var emitVercelNegotiation = async (project, routePaths, root) => {
|
|
713
|
-
const { config } = project;
|
|
714
|
-
const configPath = join2(root, ".vercel", "output", "config.json");
|
|
715
|
-
if (!existsSync2(configPath)) {
|
|
716
|
-
return;
|
|
717
|
-
}
|
|
718
|
-
const overrides = {};
|
|
719
|
-
if (hasApiCatalog(config)) {
|
|
720
|
-
overrides[API_CATALOG_PATH.slice(1)] = API_CATALOG_TYPE;
|
|
721
|
-
}
|
|
722
|
-
if (config.ai.webBotAuth.keys.length > 0) {
|
|
723
|
-
overrides[SIGNATURES_DIRECTORY_PATH.slice(1)] = SIGNATURES_DIRECTORY_TYPE;
|
|
724
|
-
}
|
|
725
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
726
|
-
const home = rawMarkdown["/"];
|
|
727
|
-
const staticDir = join2(root, ".vercel", "output", "static");
|
|
728
|
-
const injected = injectNegotiationRoutes(await readFile2(configPath, "utf-8"), routePaths, buildHomeLinkHeader(config, routePaths), overrides, home ? markdownTokenCount(agentMarkdown(home)) : undefined, {
|
|
729
|
-
json: existsSync2(join2(staticDir, "404.json")),
|
|
730
|
-
markdown: existsSync2(join2(staticDir, "404.md"))
|
|
731
|
-
}, crossOriginDiscoveryPaths(config));
|
|
732
|
-
if (injected === null) {
|
|
733
|
-
logger.warn("Could not wire Accept: text/markdown negotiation into .vercel/output/config.json — raw Markdown stays available at the .md URLs.");
|
|
734
|
-
return;
|
|
735
|
-
}
|
|
736
|
-
await writeFile(configPath, injected, "utf-8");
|
|
737
|
-
logger.success("Wired Accept: text/markdown negotiation into the Vercel routing config");
|
|
738
|
-
};
|
|
739
|
-
var checkVercelFunctionBundles = async (outputDir, root) => {
|
|
740
|
-
const audits = await auditVercelFunctions(outputDir);
|
|
741
|
-
if (audits.length === 0) {
|
|
742
|
-
return;
|
|
743
|
-
}
|
|
744
|
-
const own = blumeDependencyNames();
|
|
745
|
-
let fatal = false;
|
|
746
|
-
for (const audit of audits) {
|
|
747
|
-
const verdict = functionBundleVerdict(audit, root, own);
|
|
748
|
-
if (verdict.fatal) {
|
|
749
|
-
fatal = true;
|
|
750
|
-
logger.error(verdict.message);
|
|
751
|
-
} else {
|
|
752
|
-
logger.warn(verdict.message);
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
if (fatal) {
|
|
756
|
-
process.exit(1);
|
|
757
|
-
}
|
|
758
|
-
};
|
|
759
|
-
var warnCloudflareNegotiationSkipped = () => logger.warn("Could not wire Accept: text/markdown negotiation into dist/server/wrangler.json — raw Markdown stays available at the .md URLs.");
|
|
760
|
-
var emitCloudflareNegotiation = async (project, routePaths) => {
|
|
761
|
-
const { config, context } = project;
|
|
762
|
-
const serverDir = join2(context.distDir ?? join2(context.root, "dist"), "server");
|
|
763
|
-
const wranglerPath = join2(serverDir, "wrangler.json");
|
|
764
|
-
if (!existsSync2(wranglerPath)) {
|
|
765
|
-
warnCloudflareNegotiationSkipped();
|
|
766
|
-
return;
|
|
767
|
-
}
|
|
768
|
-
const rawMarkdown = await buildRawMarkdown(project);
|
|
769
|
-
const home = rawMarkdown["/"];
|
|
770
|
-
const injected = injectWorkerNegotiation(await readFile2(wranglerPath, "utf-8"), {
|
|
771
|
-
base: config.deployment.base,
|
|
772
|
-
contentRoutePaths: project.manifest.routes.map((route) => route.path),
|
|
773
|
-
homeLinkHeader: buildHomeLinkHeader(config, routePaths),
|
|
774
|
-
homeTokens: home ? markdownTokenCount(agentMarkdown(home)) : undefined,
|
|
775
|
-
pageJsonPaths: config.ai.api ? project.manifest.routes.filter((route) => !route.hidden && rawMarkdown[route.path] !== undefined).map((route) => pageJsonPath(route.path)) : [],
|
|
776
|
-
redirects: platformRedirects(config),
|
|
777
|
-
routePaths
|
|
778
|
-
});
|
|
779
|
-
if (injected === null) {
|
|
780
|
-
warnCloudflareNegotiationSkipped();
|
|
781
|
-
return;
|
|
782
|
-
}
|
|
783
|
-
await writeFile(join2(serverDir, NEGOTIATION_WORKER_FILE), injected.worker, "utf-8");
|
|
784
|
-
await writeFile(wranglerPath, injected.wrangler, "utf-8");
|
|
785
|
-
logger.success("Wired Accept: text/markdown negotiation into the Cloudflare Worker");
|
|
786
|
-
};
|
|
787
|
-
var reportCardCache = async (project, prune) => {
|
|
788
|
-
const cards = cardCacheTally();
|
|
789
|
-
if (!cards) {
|
|
790
|
-
return;
|
|
791
|
-
}
|
|
792
|
-
logger.info(`OG cards: ${cards.hits} reused from the cache, ${cards.misses} rendered`);
|
|
793
|
-
if (prune) {
|
|
794
|
-
await pruneCardCache(ogCacheDir(project.context));
|
|
795
|
-
}
|
|
796
|
-
};
|
|
797
|
-
var formatBytes = (bytes) => {
|
|
798
|
-
if (bytes < 1024) {
|
|
799
|
-
return `${bytes} B`;
|
|
800
|
-
}
|
|
801
|
-
const digits = bytes < 1024 * 100 ? 1 : 0;
|
|
802
|
-
return `${(bytes / 1024).toFixed(digits)} kB`;
|
|
803
|
-
};
|
|
804
|
-
var astroAssets = async (distDir, ext) => {
|
|
805
|
-
const astroDir = join2(distDir, "_astro");
|
|
806
|
-
if (!existsSync2(astroDir)) {
|
|
807
|
-
return [];
|
|
808
|
-
}
|
|
809
|
-
const entries = await readdir2(astroDir);
|
|
810
|
-
const files = entries.filter((name) => name.endsWith(`.${ext}`));
|
|
811
|
-
const sized = await Promise.all(files.map(async (name) => {
|
|
812
|
-
const info = await stat(join2(astroDir, name));
|
|
813
|
-
return { name, size: info.size };
|
|
814
|
-
}));
|
|
815
|
-
return sized.toSorted((a, b) => b.size - a.size);
|
|
816
|
-
};
|
|
817
|
-
var totalSize = (assets) => assets.reduce((sum, asset) => sum + asset.size, 0);
|
|
818
|
-
var reportBundleSizes = async (distDir) => {
|
|
819
|
-
const sized = await astroAssets(distDir, "js");
|
|
820
|
-
if (sized.length === 0) {
|
|
821
|
-
logger.info("No client JavaScript emitted — the site ships zero JS.");
|
|
822
|
-
return;
|
|
823
|
-
}
|
|
824
|
-
const rows = sized.slice(0, 15).map((file) => ` ${formatBytes(file.size).padStart(8)} ${file.name}`);
|
|
825
|
-
logger.box([
|
|
826
|
-
`Client JavaScript — ${sized.length} file(s), ${formatBytes(totalSize(sized))} total`,
|
|
827
|
-
"",
|
|
828
|
-
...rows,
|
|
829
|
-
sized.length > 15 ? ` … and ${sized.length - 15} more` : null
|
|
830
|
-
].filter((line) => line !== null).join(`
|
|
831
|
-
`));
|
|
832
|
-
};
|
|
833
|
-
var enforceBudget = async (distDir, args) => {
|
|
834
|
-
const checks = [
|
|
835
|
-
...args[BUDGET_JS] ? [{ ext: "js", limitKb: Number(args[BUDGET_JS]), name: "JavaScript" }] : [],
|
|
836
|
-
...args[BUDGET_CSS] ? [{ ext: "css", limitKb: Number(args[BUDGET_CSS]), name: "CSS" }] : []
|
|
837
|
-
];
|
|
838
|
-
if (checks.length === 0) {
|
|
839
|
-
return "skip";
|
|
840
|
-
}
|
|
841
|
-
let passed = true;
|
|
842
|
-
for (const check of checks) {
|
|
843
|
-
const total = totalSize(await astroAssets(distDir, check.ext));
|
|
844
|
-
const limit = check.limitKb * 1024;
|
|
845
|
-
if (total > limit) {
|
|
846
|
-
passed = false;
|
|
847
|
-
logger.error(`${check.name} budget exceeded: ${formatBytes(total)} > ${check.limitKb} kB`);
|
|
848
|
-
} else {
|
|
849
|
-
logger.success(`${check.name} budget: ${formatBytes(total)} / ${check.limitKb} kB`);
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
return passed ? "pass" : "fail";
|
|
853
|
-
};
|
|
854
|
-
var runClientAssetChecks = async (staticDir, args) => {
|
|
855
|
-
if (args.analyze) {
|
|
856
|
-
await reportBundleSizes(staticDir);
|
|
857
|
-
}
|
|
858
|
-
if (await enforceBudget(staticDir, args) === "fail") {
|
|
859
|
-
process.exit(1);
|
|
860
|
-
}
|
|
861
|
-
};
|
|
862
|
-
var isolatedOutputDir = (config, context) => {
|
|
863
|
-
const { adapter, output } = config.deployment;
|
|
864
|
-
if (output === "server" && adapter === "vercel") {
|
|
865
|
-
return join2(context.outDir, ".vercel", "output");
|
|
866
|
-
}
|
|
867
|
-
return context.distDir ?? join2(context.outDir, "dist");
|
|
868
|
-
};
|
|
869
|
-
var isolatedStaticDir = (config, context) => {
|
|
870
|
-
const { adapter, output } = config.deployment;
|
|
871
|
-
const outputDir = isolatedOutputDir(config, context);
|
|
872
|
-
if (output === "server" && adapter === "vercel") {
|
|
873
|
-
return join2(outputDir, "static");
|
|
874
|
-
}
|
|
875
|
-
if (servesClientSubdir(config.deployment)) {
|
|
876
|
-
return join2(outputDir, "client");
|
|
877
|
-
}
|
|
878
|
-
return outputDir;
|
|
879
|
-
};
|
|
880
|
-
var reportBuild = async (project, distDir, args) => {
|
|
881
|
-
const { config } = project;
|
|
882
|
-
const features = serverFeatures(config);
|
|
883
|
-
const sitemapNote = config.seo.sitemap ? "no (set deployment.site)" : "no (seo.sitemap is false)";
|
|
884
|
-
logger.box([
|
|
885
|
-
`Output ${config.deployment.output}`,
|
|
886
|
-
`Adapter ${config.deployment.adapter ?? "none"}`,
|
|
887
|
-
`Site ${config.deployment.site ?? "not set"}`,
|
|
888
|
-
`Search ${config.search.provider}`,
|
|
889
|
-
`Redirects ${config.redirects.length}`,
|
|
890
|
-
`Sitemap ${config.deployment.site && config.seo.sitemap ? "yes" : sitemapNote}`,
|
|
891
|
-
`Robots ${config.seo.robots ? "yes" : "no"}`,
|
|
892
|
-
`Agent JSON ${config.seo.agentReadability ? "yes" : "no"}`,
|
|
893
|
-
`LLM files ${config.ai.llmsTxt.enabled ? "yes" : "no"}`,
|
|
894
|
-
`Server features ${features.length > 0 ? features.join(", ") : "none"}`
|
|
895
|
-
].join(`
|
|
896
|
-
`));
|
|
897
|
-
await runClientAssetChecks(distDir, args);
|
|
898
|
-
if (project.droppedPages > 0) {
|
|
899
|
-
logger.warn(`${project.droppedPages} page(s) failed frontmatter validation and are missing from this build.`);
|
|
900
|
-
}
|
|
901
|
-
logger.success(`Built to ${distDir}`);
|
|
902
|
-
};
|
|
903
|
-
var buildCommand = defineCommand({
|
|
904
|
-
args: {
|
|
905
|
-
adapter: {
|
|
906
|
-
description: "Server adapter: vercel | node | netlify | cloudflare.",
|
|
907
|
-
type: "string"
|
|
908
|
-
},
|
|
909
|
-
analyze: {
|
|
910
|
-
description: "Report client JavaScript bundle sizes after the build.",
|
|
911
|
-
type: "boolean"
|
|
912
|
-
},
|
|
913
|
-
base: {
|
|
914
|
-
description: "Base path the site is served under (e.g. /docs).",
|
|
915
|
-
type: "string"
|
|
916
|
-
},
|
|
917
|
-
[BUDGET_CSS]: {
|
|
918
|
-
description: "Fail if total client CSS exceeds this many kB.",
|
|
919
|
-
type: "string"
|
|
920
|
-
},
|
|
921
|
-
[BUDGET_JS]: {
|
|
922
|
-
description: "Fail if total client JavaScript exceeds this many kB.",
|
|
923
|
-
type: "string"
|
|
924
|
-
},
|
|
925
|
-
isolated: {
|
|
926
|
-
description: "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.",
|
|
927
|
-
type: "boolean"
|
|
928
|
-
},
|
|
929
|
-
output: {
|
|
930
|
-
description: "Output mode: static | server.",
|
|
931
|
-
type: "string"
|
|
932
|
-
},
|
|
933
|
-
preview: {
|
|
934
|
-
description: "Include drafts and unpublished CMS content.",
|
|
935
|
-
type: "boolean"
|
|
936
|
-
},
|
|
937
|
-
strict: {
|
|
938
|
-
default: true,
|
|
939
|
-
description: "Fail on error diagnostics (default; pass --no-strict to build anyway, dropping pages that fail validation).",
|
|
940
|
-
type: "boolean"
|
|
941
|
-
}
|
|
942
|
-
},
|
|
943
|
-
meta: commandMeta.build,
|
|
944
|
-
async run({ args }) {
|
|
945
|
-
const root = process.cwd();
|
|
946
|
-
const runtimeDir = args.isolated ? ".blume-verify" : process.env.BLUME_RUNTIME_DIR;
|
|
947
|
-
refuseIfDevRunning(root, "building", { isolatedHint: true, runtimeDir });
|
|
948
|
-
if (args.isolated) {
|
|
949
|
-
await ensureGitignore(root, [".blume-verify/"]);
|
|
950
|
-
}
|
|
951
|
-
if (args.output && args.output !== "static" && args.output !== "server") {
|
|
952
|
-
logger.error(`Invalid --output "${args.output}" (use static | server).`);
|
|
953
|
-
process.exit(1);
|
|
954
|
-
}
|
|
955
|
-
if (args.adapter && !isAdapter(args.adapter)) {
|
|
956
|
-
logger.error(`Invalid --adapter "${args.adapter}" (use ${ADAPTERS.join(" | ")}).`);
|
|
957
|
-
process.exit(1);
|
|
958
|
-
}
|
|
959
|
-
validateBudgetFlags(args);
|
|
960
|
-
const project = await prepareProject({
|
|
961
|
-
mode: "build",
|
|
962
|
-
overrides: {
|
|
963
|
-
adapter: args.adapter,
|
|
964
|
-
base: args.base,
|
|
965
|
-
output: args.output
|
|
966
|
-
},
|
|
967
|
-
preview: args.preview,
|
|
968
|
-
root,
|
|
969
|
-
runtimeDir,
|
|
970
|
-
strict: args.strict
|
|
971
|
-
});
|
|
972
|
-
logger.start(`Building ${project.graph.pages.length} page(s) (${project.config.deployment.output} output)`);
|
|
973
|
-
if (!runtimeDir) {
|
|
974
|
-
publishBuildProject(project);
|
|
975
|
-
}
|
|
976
|
-
await build({
|
|
977
|
-
logLevel: "info",
|
|
978
|
-
root: project.context.outDir
|
|
979
|
-
});
|
|
980
|
-
await reportCardCache(project, !runtimeDir);
|
|
981
|
-
if (runtimeDir) {
|
|
982
|
-
if (project.config.deployment.output === "server" && project.config.deployment.adapter === "vercel") {
|
|
983
|
-
await checkVercelFunctionBundles(isolatedOutputDir(project.config, project.context), root);
|
|
984
|
-
}
|
|
985
|
-
await runClientAssetChecks(isolatedStaticDir(project.config, project.context), args);
|
|
986
|
-
logger.success(`Isolated build OK — output at ${isolatedOutputDir(project.config, project.context)} (not published).`);
|
|
987
|
-
return;
|
|
988
|
-
}
|
|
989
|
-
const { adapter } = project.config.deployment;
|
|
990
|
-
const ignoreDir = adapter ? ADAPTER_IGNORE_DIRS[adapter] : undefined;
|
|
991
|
-
if (project.config.deployment.output === "server" && ignoreDir) {
|
|
992
|
-
await ensureGitignore(root, [ignoreDir]);
|
|
993
|
-
}
|
|
994
|
-
const surfaced = await surfaceAdapterOutput(project.config, project.context);
|
|
995
|
-
if (surfaced.moved) {
|
|
996
|
-
logger.success(`Surfaced ${adapter} output to ${surfaced.to}`);
|
|
997
|
-
}
|
|
998
|
-
if (project.config.deployment.output === "server" && adapter === "vercel") {
|
|
999
|
-
await checkVercelFunctionBundles(join2(root, ".vercel", "output"), root);
|
|
1000
|
-
await emitVercelNegotiation(project, markdownRoutePaths(project), root);
|
|
1001
|
-
}
|
|
1002
|
-
if (project.config.deployment.output === "server" && adapter === "cloudflare") {
|
|
1003
|
-
await emitCloudflareNegotiation(project, markdownRoutePaths(project));
|
|
1004
|
-
}
|
|
1005
|
-
await reportBuild(project, deployStaticDir(project.config, project.context), args);
|
|
1006
|
-
}
|
|
1007
|
-
});
|
|
1008
|
-
export {
|
|
1009
|
-
buildCommand,
|
|
1010
|
-
isolatedOutputDir,
|
|
1011
|
-
isolatedStaticDir,
|
|
1012
|
-
runClientAssetChecks
|
|
1013
|
-
};
|
|
1014
|
-
|
|
1015
|
-
//# debugId=2FD9E13EC3A6144764756E2164756E21
|
|
1016
|
-
//# sourceMappingURL=chunk-ex56aa81.js.map
|