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
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/deploy/adapter-output.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { existsSync } from \"node:fs\";\nimport { cp, mkdir, rm } from \"node:fs/promises\";\n\nimport { dirname, join } from \"pathe\";\n\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport type { ProjectContext } from \"../core/types.ts\";\nimport type { ResolvedDeployment } from \"./adapters/registry.ts\";\nimport { deployPlatform } from \"./platforms/index.ts\";\nimport { distDir } from \"./platforms/paths.ts\";\n\n/**\n * Where a build's output lands. Every static build and most server builds\n * write to Astro's `outDir`; the Vercel adapter writes its Build Output tree\n * beside it instead. Each platform declares its own (see `deploy/platforms`).\n */\nexport const deployOutputDir = (\n config: ResolvedConfig,\n context: ProjectContext\n): string => {\n const { deployment } = config;\n return deployment.options.output === \"server\"\n ? deployPlatform(deployment).serverOutputDir(context)\n : distDir(context);\n};\n\n/**\n * Directory whose contents the deploy platform serves as static files. Build\n * artifacts (robots.txt, sitemap.xml, llms.txt, …) must be written here to be\n * served. A static build serves `dist/` wherever it lands; a server build\n * serves what its platform declares — the Build Output tree's `static/` half\n * on Vercel, Astro's `build.client` dir (`dist/client/`) on Node and\n * Cloudflare, `dist/` on Netlify.\n */\nexport const deployStaticDir = (\n config: ResolvedConfig,\n context: ProjectContext\n): string => {\n const { deployment } = config;\n return deployment.options.output === \"server\"\n ? deployPlatform(deployment).serverStaticDir(context)\n : distDir(context);\n};\n\n/**\n * Whether the platform applies a `_headers` file to the static assets it\n * serves — true where Netlify or Cloudflare read one, including a Cloudflare\n * **server** build (the Worker serves `dist/client` through its ASSETS\n * binding, which honors `_headers` exactly as Pages does), and for a static\n * build with no named host. Deliberately false where the file would be inert:\n * Node's standalone server has its own static handler with no `_headers`\n * support, and Vercel's headers arrive through the routing config instead.\n * Reporting a header that is not applied is worse than omitting it.\n */\nexport const readsHeaderFiles = (deployment: ResolvedDeployment): boolean =>\n deployPlatform(deployment).readsHeaderFiles[deployment.options.output];\n\n/** Outcome of {@link surfaceAdapterOutput}, for logging. */\nexport type SurfaceResult =\n | { moved: false }\n | { from: string; moved: true; to: string };\n\n/**\n * Move a server adapter's deploy bundle out of the hidden `.blume` runtime and\n * up to the project root, where the deploy platform expects it. A no-op for\n * static builds, for platforms whose bundle already lands where they look\n * (`hiddenRuntime.surfacePath` is null), and when the expected output is\n * absent.\n */\nexport const surfaceAdapterOutput = async (\n config: ResolvedConfig,\n context: ProjectContext\n): Promise<SurfaceResult> => {\n const { deployment } = config;\n if (deployment.options.output !== \"server\") {\n return { moved: false };\n }\n const rel = deployPlatform(deployment).hiddenRuntime.surfacePath;\n if (!rel) {\n return { moved: false };\n }\n const from = join(context.outDir, rel);\n const to = join(context.root, rel);\n if (!existsSync(from)) {\n return { moved: false };\n }\n await mkdir(dirname(to), { recursive: true });\n await rm(to, { force: true, recursive: true });\n // `verbatimSymlinks` keeps each symlink's target text as written. Without it,\n // `cp` resolves every relative target against the *source*, rewriting it to an\n // absolute path under `.blume` — which this function then deletes. Adapters\n // that trace dependencies into their function bundle link one package to\n // another that way (under an isolated linker — Bun's `isolated` mode, pnpm —\n // that is every external dependency the function imports), so the resolved\n // links leave the deployed function dying on its first external import with\n // ERR_MODULE_NOT_FOUND. Verbatim, the links stay relative and internal to the\n // bundle, surviving both this move and the platform's own (Vercel mounts the\n // bundle at `/var/task`).\n try {\n await cp(from, to, { recursive: true, verbatimSymlinks: true });\n } catch (error) {\n // SAFETY: a rejected `cp` always yields a Node system error, whose `code`\n // is the only field read here.\n if ((error as NodeJS.ErrnoException).code !== \"EPERM\") {\n throw error;\n }\n // `EPERM` is Windows refusing to create a symlink without Developer Mode\n // or admin rights (the same answer `symlinkDir` handles for the deps\n // link). Copy through the links instead: each becomes an ordinary\n // directory holding its target's files — bigger, but self-contained.\n await rm(to, { force: true, recursive: true });\n await cp(from, to, { dereference: true, recursive: true });\n }\n await rm(from, { force: true, recursive: true });\n return { from, moved: true, to };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;AAAA;AACA;AAEA;AAaO,IAAM,kBAAkB,CAC7B,QACA,YACW;AAAA,EACX,QAAQ,eAAe;AAAA,EACvB,OAAO,WAAW,QAAQ,WAAW,WACjC,eAAe,UAAU,EAAE,gBAAgB,OAAO,IAClD,QAAQ,OAAO;AAAA;AAWd,IAAM,kBAAkB,CAC7B,QACA,YACW;AAAA,EACX,QAAQ,eAAe;AAAA,EACvB,OAAO,WAAW,QAAQ,WAAW,WACjC,eAAe,UAAU,EAAE,gBAAgB,OAAO,IAClD,QAAQ,OAAO;AAAA;AA4Bd,IAAM,uBAAuB,OAClC,QACA,YAC2B;AAAA,EAC3B,QAAQ,eAAe;AAAA,EACvB,IAAI,WAAW,QAAQ,WAAW,UAAU;AAAA,IAC1C,OAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAAA,EACA,MAAM,MAAM,eAAe,UAAU,EAAE,cAAc;AAAA,EACrD,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAAA,EACA,MAAM,OAAO,KAAK,QAAQ,QAAQ,GAAG;AAAA,EACrC,MAAM,KAAK,KAAK,QAAQ,MAAM,GAAG;AAAA,EACjC,IAAI,CAAC,WAAW,IAAI,GAAG;AAAA,IACrB,OAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAAA,EACA,MAAM,MAAM,QAAQ,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C,MAAM,GAAG,IAAI,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EAW7C,IAAI;AAAA,IACF,MAAM,GAAG,MAAM,IAAI,EAAE,WAAW,MAAM,kBAAkB,KAAK,CAAC;AAAA,IAC9D,OAAO,OAAO;AAAA,IAGd,IAAK,MAAgC,SAAS,SAAS;AAAA,MACrD,MAAM;AAAA,IACR;AAAA,IAKA,MAAM,GAAG,IAAI,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,IAC7C,MAAM,GAAG,MAAM,IAAI,EAAE,aAAa,MAAM,WAAW,KAAK,CAAC;AAAA;AAAA,EAE3D,MAAM,GAAG,MAAM,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EAC/C,OAAO,EAAE,MAAM,OAAO,MAAM,GAAG;AAAA;",
|
|
8
|
+
"debugId": "8B79889B6B3550F964756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/core/sources/watch.ts
|
|
4
|
+
var BLUME_IGNORE_DIRS = [
|
|
5
|
+
".blume",
|
|
6
|
+
".blume-verify",
|
|
7
|
+
".cache",
|
|
8
|
+
".git",
|
|
9
|
+
".next",
|
|
10
|
+
".turbo",
|
|
11
|
+
".vercel",
|
|
12
|
+
"dist",
|
|
13
|
+
"node_modules"
|
|
14
|
+
];
|
|
15
|
+
var baselineScanIgnore = () => BLUME_IGNORE_DIRS.map((dir) => `**/${dir}/**`);
|
|
16
|
+
var BLUME_WATCH_IGNORE_DIRS = BLUME_IGNORE_DIRS;
|
|
17
|
+
var excludeDirSegments = (patterns) => patterns.map((pattern) => /^(?<dir>[^*/]+)\/\*\*$/u.exec(pattern)?.groups?.dir).filter((dir) => dir !== undefined);
|
|
18
|
+
var ignoringWatchListener = (onChange, ignoreDirs = BLUME_WATCH_IGNORE_DIRS, ignoreSegment = () => false) => {
|
|
19
|
+
const ignore = new Set(ignoreDirs);
|
|
20
|
+
return (_event, filename) => {
|
|
21
|
+
if (filename !== null && filename.split(/[/\\]/u).some((segment) => ignore.has(segment) || ignoreSegment(segment))) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
onChange();
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { BLUME_IGNORE_DIRS, baselineScanIgnore, BLUME_WATCH_IGNORE_DIRS, excludeDirSegments, ignoringWatchListener };
|
|
29
|
+
|
|
30
|
+
//# debugId=E327C8C451E6563064756E2164756E21
|
|
31
|
+
//# sourceMappingURL=chunk-abh8yjkn.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/sources/watch.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { WatchListener } from \"node:fs\";\n\n/**\n * Directory segments that are never authored content: VCS, dependency trees,\n * Blume's own generated project and build output, and framework/deploy caches.\n * Both the content scan and the dev watcher skip these unconditionally, on top\n * of the user's `content.exclude`.\n *\n * The scan needs them because a broadly-scoped `content.root` — `\".\"` or an app\n * dir that also holds `node_modules`/`dist`, the common shape when migrating a\n * docs app that lives at the repo or app root — would otherwise glob thousands\n * of stray markdown files out of dependencies and build artifacts. `content.root`\n * defaults to `docs/` where this rarely bites, but any wider root hits it.\n *\n * The watcher needs them because a recursive `fs.watch` rooted at the project\n * also sees Blume's own `.blume/` output, which the dev server rewrites on every\n * render (e.g. `.blume/.astro/data-store.json`). Left unfiltered, each such write\n * re-triggers a rescan + runtime regeneration whose writes land back under\n * `.blume/` and fire the watcher again: a self-sustaining loop that stalls page\n * renders and floods the console. `fs.watch` has no ignore option, so we filter\n * by the changed path in the callback.\n */\nexport const BLUME_IGNORE_DIRS = [\n \".blume\",\n // The isolated `blume check --isolated` runtime. A sibling of `.blume`, it is\n // written while a dev server runs; without this the content-layer watcher (or\n // a `.`-rooted fs.watch) would treat its generation as a content change and\n // reload — the very thing `--isolated` promises not to do.\n \".blume-verify\",\n \".cache\",\n \".git\",\n \".next\",\n \".turbo\",\n \".vercel\",\n \"dist\",\n \"node_modules\",\n];\n\n/**\n * Baseline scan-ignore globs applied to every filesystem source, unioned with\n * the user's `content.exclude`. Kept in sync with the watcher via the shared\n * {@link BLUME_IGNORE_DIRS} so `load()` and `watch()` never disagree on what is\n * content. `**\\/<dir>/**` matches the directory at the content root or nested.\n */\nexport const baselineScanIgnore = (): string[] =>\n BLUME_IGNORE_DIRS.map((dir) => `**/${dir}/**`);\n\n/**\n * Alias retained for the dev watcher's call site and its tests; the watcher and\n * the scan share the same never-content directory set.\n */\nexport const BLUME_WATCH_IGNORE_DIRS = BLUME_IGNORE_DIRS;\n\n/** Extract single-segment ignore dirs (`foo`) from `foo/**`-style excludes. */\nexport const excludeDirSegments = (patterns: readonly string[]): string[] =>\n patterns\n .map((pattern) => /^(?<dir>[^*/]+)\\/\\*\\*$/u.exec(pattern)?.groups?.dir)\n .filter((dir): dir is string => dir !== undefined);\n\n/**\n * Build a recursive-watch listener that fires `onChange` for content changes but\n * ignores events whose path crosses an ignored directory segment — one in\n * `ignoreDirs`, or one `ignoreSegment` rejects, for a scan whose skip rule is\n * a shape (every dot-name) rather than a list. A missing `filename` — rare;\n * the platform couldn't name the changed path — falls through to `onChange`\n * rather than silently dropping a real edit. Exported for testing.\n */\nexport const ignoringWatchListener = (\n onChange: () => void,\n ignoreDirs: Iterable<string> = BLUME_WATCH_IGNORE_DIRS,\n ignoreSegment: (segment: string) => boolean = () => false\n): WatchListener<string> => {\n const ignore = new Set(ignoreDirs);\n return (_event, filename) => {\n if (\n filename !== null &&\n filename\n .split(/[/\\\\]/u)\n .some((segment) => ignore.has(segment) || ignoreSegment(segment))\n ) {\n return;\n }\n onChange();\n };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;AAsBO,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,IAAM,qBAAqB,MAChC,kBAAkB,IAAI,CAAC,QAAQ,MAAM,QAAQ;AAMxC,IAAM,0BAA0B;AAGhC,IAAM,qBAAqB,CAAC,aACjC,SACG,IAAI,CAAC,YAAY,0BAA0B,KAAK,OAAO,GAAG,QAAQ,GAAG,EACrE,OAAO,CAAC,QAAuB,QAAQ,SAAS;AAU9C,IAAM,wBAAwB,CACnC,UACA,aAA+B,yBAC/B,gBAA8C,MAAM,UAC1B;AAAA,EAC1B,MAAM,SAAS,IAAI,IAAI,UAAU;AAAA,EACjC,OAAO,CAAC,QAAQ,aAAa;AAAA,IAC3B,IACE,aAAa,QACb,SACG,MAAM,QAAQ,EACd,KAAK,CAAC,YAAY,OAAO,IAAI,OAAO,KAAK,cAAc,OAAO,CAAC,GAClE;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA;",
|
|
8
|
+
"debugId": "E327C8C451E6563064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
needsPlaygroundProxy,
|
|
4
|
+
resolveAskBackend
|
|
5
|
+
} from "./chunk-qkqwkpte.js";
|
|
6
|
+
|
|
7
|
+
// src/core/server-features.ts
|
|
8
|
+
var serverFeatures = (config) => {
|
|
9
|
+
const features = [];
|
|
10
|
+
if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {
|
|
11
|
+
features.push("Assistant");
|
|
12
|
+
}
|
|
13
|
+
if (config.agents.mcp.enabled) {
|
|
14
|
+
features.push("MCP server");
|
|
15
|
+
}
|
|
16
|
+
if (needsPlaygroundProxy(config)) {
|
|
17
|
+
features.push("API playground proxy");
|
|
18
|
+
}
|
|
19
|
+
if (config.search.provider.mode === "server") {
|
|
20
|
+
features.push(`Search (${config.search.provider.kind})`);
|
|
21
|
+
}
|
|
22
|
+
return features;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/cli/required-secrets.ts
|
|
26
|
+
var checkRequiredSecrets = (config) => {
|
|
27
|
+
const diagnostics = [];
|
|
28
|
+
const requireSecret = (feature, env, note) => {
|
|
29
|
+
if (process.env[env]) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const noteSuffix = note ? ` (${note})` : "";
|
|
33
|
+
diagnostics.push({
|
|
34
|
+
code: "BLUME_MISSING_SECRET",
|
|
35
|
+
message: `${feature} is enabled but ${env} is not set${noteSuffix}.`,
|
|
36
|
+
severity: "warning",
|
|
37
|
+
suggestion: `Set ${env} in .env.local for local dev, or in your host's environment for production.`
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {
|
|
41
|
+
const { provider } = config.ai.assistant;
|
|
42
|
+
const backend = resolveAskBackend(provider);
|
|
43
|
+
for (const env of provider.requiredSecrets) {
|
|
44
|
+
requireSecret(`Assistant (${backend.label})`, env, backend.secretNote);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const { provider } = config.search;
|
|
48
|
+
for (const env of provider.requiredSecrets) {
|
|
49
|
+
requireSecret(`Search (${provider.kind})`, env);
|
|
50
|
+
}
|
|
51
|
+
for (const adapter of config.analytics) {
|
|
52
|
+
for (const env of adapter.requiredSecrets) {
|
|
53
|
+
requireSecret(`Analytics (${adapter.kind})`, env);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const source of config.content.sources) {
|
|
57
|
+
for (const env of source.requiredSecrets) {
|
|
58
|
+
requireSecret(`Content source (${source.kind})`, env);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const adapter of config.reference) {
|
|
62
|
+
for (const env of adapter.requiredSecrets) {
|
|
63
|
+
requireSecret(`API reference (${adapter.kind})`, env);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
for (const env of config.deployment.requiredSecrets) {
|
|
67
|
+
requireSecret(`Deployment (${config.deployment.kind})`, env);
|
|
68
|
+
}
|
|
69
|
+
return diagnostics;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export { serverFeatures, checkRequiredSecrets };
|
|
73
|
+
|
|
74
|
+
//# debugId=26CFBC953FC234CC64756E2164756E21
|
|
75
|
+
//# sourceMappingURL=chunk-ah61y8py.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/server-features.ts", "../src/cli/required-secrets.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { needsPlaygroundProxy } from \"../openapi/references.ts\";\nimport type { ResolvedConfig } from \"./schema.ts\";\n\n/**\n * List the enabled features that require Astro server output. Static builds\n * fail clearly when any of these are enabled.\n */\nexport const serverFeatures = (config: ResolvedConfig): string[] => {\n const features: string[] = [];\n if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {\n features.push(\"Assistant\");\n }\n // The hosted MCP server is a live JSON-RPC endpoint, so it needs a runtime.\n if (config.agents.mcp.enabled) {\n features.push(\"MCP server\");\n }\n // The built-in playground proxy (`playground.proxy: true` on an `openapi()`\n // or `graphql()` adapter) is a live fetch endpoint at `/_api-proxy`; an\n // external proxy URL (string) or a proxy-less playground stays fully static.\n if (needsPlaygroundProxy(config)) {\n features.push(\"API playground proxy\");\n }\n // A `server` adapter (Mixedbread) proxies queries through a secret server\n // endpoint, so it can't run on a static build.\n if (config.search.provider.mode === \"server\") {\n features.push(`Search (${config.search.provider.kind})`);\n }\n return features;\n};\n",
|
|
6
|
+
"import { resolveAskBackend } from \"../ai/ask.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/**\n * Warn early when an enabled feature needs a secret env var that isn't set, so\n * the failure surfaces at `blume dev`/`build` instead of at the first request in\n * production. These are runtime secrets (the endpoint reads them on the server),\n * so this warns rather than hard-fails — the value may live only in the deploy\n * environment. Build-time secrets (search-index sync) already warn during sync.\n */\nexport const checkRequiredSecrets = (config: ResolvedConfig): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const requireSecret = (feature: string, env: string, note?: string): void => {\n if (process.env[env]) {\n return;\n }\n const noteSuffix = note ? ` (${note})` : \"\";\n diagnostics.push({\n code: \"BLUME_MISSING_SECRET\",\n message: `${feature} is enabled but ${env} is not set${noteSuffix}.`,\n severity: \"warning\",\n suggestion: `Set ${env} in .env.local for local dev, or in your host's environment for production.`,\n });\n };\n\n if (config.ai.assistant?.enabled && !config.ai.assistant.endpoint) {\n // The adapter descriptor names the env vars its route reads.\n const { provider } = config.ai.assistant;\n const backend = resolveAskBackend(provider);\n for (const env of provider.requiredSecrets) {\n requireSecret(`Assistant (${backend.label})`, env, backend.secretNote);\n }\n }\n\n // Each search adapter declares the secrets its generated runtime reads.\n const { provider } = config.search;\n for (const env of provider.requiredSecrets) {\n requireSecret(`Search (${provider.kind})`, env);\n }\n\n // Adapters name their own secrets; the built-in analytics adapters ship\n // public tokens in the page and declare none.\n for (const adapter of config.analytics) {\n for (const env of adapter.requiredSecrets) {\n requireSecret(`Analytics (${adapter.kind})`, env);\n }\n }\n\n // Each content source adapter declares the env vars its fetch reads.\n for (const source of config.content.sources) {\n for (const env of source.requiredSecrets) {\n requireSecret(`Content source (${source.kind})`, env);\n }\n }\n\n // Adapters name their own secrets; the built-in reference adapters read\n // public specs and declare none.\n for (const adapter of config.reference) {\n for (const env of adapter.requiredSecrets) {\n requireSecret(`API reference (${adapter.kind})`, env);\n }\n }\n\n // The deployment adapter names its own secrets; the built-in host adapters\n // read platform-injected env and declare none.\n for (const env of config.deployment.requiredSecrets) {\n requireSecret(`Deployment (${config.deployment.kind})`, env);\n }\n\n return diagnostics;\n};\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": ";;;;;;;AAOO,IAAM,iBAAiB,CAAC,WAAqC;AAAA,EAClE,MAAM,WAAqB,CAAC;AAAA,EAC5B,IAAI,OAAO,GAAG,WAAW,WAAW,CAAC,OAAO,GAAG,UAAU,UAAU;AAAA,IACjE,SAAS,KAAK,WAAW;AAAA,EAC3B;AAAA,EAEA,IAAI,OAAO,OAAO,IAAI,SAAS;AAAA,IAC7B,SAAS,KAAK,YAAY;AAAA,EAC5B;AAAA,EAIA,IAAI,qBAAqB,MAAM,GAAG;AAAA,IAChC,SAAS,KAAK,sBAAsB;AAAA,EACtC;AAAA,EAGA,IAAI,OAAO,OAAO,SAAS,SAAS,UAAU;AAAA,IAC5C,SAAS,KAAK,WAAW,OAAO,OAAO,SAAS,OAAO;AAAA,EACzD;AAAA,EACA,OAAO;AAAA;;;AChBF,IAAM,uBAAuB,CAAC,WAAyC;AAAA,EAC5E,MAAM,cAA4B,CAAC;AAAA,EACnC,MAAM,gBAAgB,CAAC,SAAiB,KAAa,SAAwB;AAAA,IAC3E,IAAI,QAAQ,IAAI,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,MAAM,aAAa,OAAO,KAAK,UAAU;AAAA,IACzC,YAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,SAAS,GAAG,0BAA0B,iBAAiB;AAAA,MACvD,UAAU;AAAA,MACV,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA;AAAA,EAGH,IAAI,OAAO,GAAG,WAAW,WAAW,CAAC,OAAO,GAAG,UAAU,UAAU;AAAA,IAEjE,QAAQ,aAAa,OAAO,GAAG;AAAA,IAC/B,MAAM,UAAU,kBAAkB,QAAQ;AAAA,IAC1C,WAAW,OAAO,SAAS,iBAAiB;AAAA,MAC1C,cAAc,cAAc,QAAQ,UAAU,KAAK,QAAQ,UAAU;AAAA,IACvE;AAAA,EACF;AAAA,EAGA,QAAQ,aAAa,OAAO;AAAA,EAC5B,WAAW,OAAO,SAAS,iBAAiB;AAAA,IAC1C,cAAc,WAAW,SAAS,SAAS,GAAG;AAAA,EAChD;AAAA,EAIA,WAAW,WAAW,OAAO,WAAW;AAAA,IACtC,WAAW,OAAO,QAAQ,iBAAiB;AAAA,MACzC,cAAc,cAAc,QAAQ,SAAS,GAAG;AAAA,IAClD;AAAA,EACF;AAAA,EAGA,WAAW,UAAU,OAAO,QAAQ,SAAS;AAAA,IAC3C,WAAW,OAAO,OAAO,iBAAiB;AAAA,MACxC,cAAc,mBAAmB,OAAO,SAAS,GAAG;AAAA,IACtD;AAAA,EACF;AAAA,EAIA,WAAW,WAAW,OAAO,WAAW;AAAA,IACtC,WAAW,OAAO,QAAQ,iBAAiB;AAAA,MACzC,cAAc,kBAAkB,QAAQ,SAAS,GAAG;AAAA,IACtD;AAAA,EACF;AAAA,EAIA,WAAW,OAAO,OAAO,WAAW,iBAAiB;AAAA,IACnD,cAAc,eAAe,OAAO,WAAW,SAAS,GAAG;AAAA,EAC7D;AAAA,EAEA,OAAO;AAAA;",
|
|
9
|
+
"debugId": "26CFBC953FC234CC64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
discoverPages,
|
|
4
|
+
customStaticRoutes,
|
|
5
|
+
hasGeneratedChangelog,
|
|
6
|
+
validateLinks
|
|
7
|
+
} from "./chunk-qkqwkpte.js";
|
|
8
|
+
import {
|
|
9
|
+
commandMeta,
|
|
10
|
+
reportInternalError,
|
|
11
|
+
BlumeError,
|
|
12
|
+
logger,
|
|
13
|
+
flushStdout,
|
|
14
|
+
reportDiagnosticsJson,
|
|
15
|
+
reportDiagnostics
|
|
16
|
+
} from "./index.js";
|
|
17
|
+
import"./chunk-jts8mvcz.js";
|
|
18
|
+
import {
|
|
19
|
+
buildManifest,
|
|
20
|
+
scanProject
|
|
21
|
+
} from "./chunk-fs23ddbb.js";
|
|
22
|
+
|
|
23
|
+
// src/cli/commands/validate.ts
|
|
24
|
+
import { existsSync } from "node:fs";
|
|
25
|
+
import { defineCommand } from "citty";
|
|
26
|
+
import { join } from "pathe";
|
|
27
|
+
var validateCommand = defineCommand({
|
|
28
|
+
args: {
|
|
29
|
+
external: {
|
|
30
|
+
description: "Check external (HTTP) links over the network.",
|
|
31
|
+
type: "boolean"
|
|
32
|
+
},
|
|
33
|
+
json: {
|
|
34
|
+
description: "Emit diagnostics as JSON on stdout (for CI/editors).",
|
|
35
|
+
type: "boolean"
|
|
36
|
+
},
|
|
37
|
+
strict: {
|
|
38
|
+
description: "Treat warnings as errors.",
|
|
39
|
+
type: "boolean"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
meta: commandMeta.validate,
|
|
43
|
+
async run({ args }) {
|
|
44
|
+
const root = process.cwd();
|
|
45
|
+
const diagnostics = [];
|
|
46
|
+
try {
|
|
47
|
+
const project = await scanProject(root, { mode: "build" });
|
|
48
|
+
diagnostics.push(...project.diagnostics);
|
|
49
|
+
const userPages = project.context.pagesRoot ? await discoverPages(project.context.pagesRoot) : [];
|
|
50
|
+
const extraRoutes = customStaticRoutes(userPages);
|
|
51
|
+
if (hasGeneratedChangelog(project, userPages)) {
|
|
52
|
+
extraRoutes.push("/changelog");
|
|
53
|
+
}
|
|
54
|
+
if (project.config.i18n) {
|
|
55
|
+
const manifest = buildManifest({
|
|
56
|
+
config: project.config,
|
|
57
|
+
context: project.context,
|
|
58
|
+
graph: project.graph
|
|
59
|
+
});
|
|
60
|
+
extraRoutes.push(...manifest.routes.flatMap((route) => route.fallback ? [route.path] : []));
|
|
61
|
+
}
|
|
62
|
+
const publicDir = join(root, "public");
|
|
63
|
+
diagnostics.push(...await validateLinks(project.graph, {
|
|
64
|
+
basePath: project.config.basePath,
|
|
65
|
+
checkExternal: Boolean(args.external),
|
|
66
|
+
extraRoutes,
|
|
67
|
+
i18n: project.config.i18n,
|
|
68
|
+
publicDir: existsSync(publicDir) ? publicDir : null,
|
|
69
|
+
redirects: project.config.redirects
|
|
70
|
+
}));
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (error instanceof BlumeError) {
|
|
73
|
+
diagnostics.push(error.diagnostic);
|
|
74
|
+
} else {
|
|
75
|
+
reportInternalError(error);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const strictFailure = Boolean(args.strict) && diagnostics.some((diagnostic) => diagnostic.severity !== "info");
|
|
80
|
+
if (args.json) {
|
|
81
|
+
const hadErrors = reportDiagnosticsJson(diagnostics, root);
|
|
82
|
+
if (hadErrors || strictFailure) {
|
|
83
|
+
await flushStdout();
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const hadErrors = reportDiagnostics(diagnostics, root);
|
|
89
|
+
if (diagnostics.length === 0) {
|
|
90
|
+
logger.success("No broken links found.");
|
|
91
|
+
}
|
|
92
|
+
if (hadErrors || strictFailure) {
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
export {
|
|
98
|
+
validateCommand
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
//# debugId=1EEBE4960D9C18F364756E2164756E21
|
|
102
|
+
//# sourceMappingURL=chunk-ch6g3ar0.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/commands/validate.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { existsSync } from \"node:fs\";\n\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport {\n customStaticRoutes,\n discoverPages,\n hasGeneratedChangelog,\n} from \"../../astro/pages.ts\";\nimport { BlumeError } from \"../../core/diagnostics.ts\";\nimport { validateLinks } from \"../../core/links.ts\";\nimport { buildManifest } from \"../../core/manifest.ts\";\nimport { scanProject } from \"../../core/project-graph.ts\";\nimport type { Diagnostic } from \"../../core/types.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { reportInternalError } from \"../internal-error.ts\";\nimport {\n flushStdout,\n logger,\n reportDiagnostics,\n reportDiagnosticsJson,\n} from \"../log.ts\";\n\nexport const validateCommand = defineCommand({\n args: {\n external: {\n description: \"Check external (HTTP) links over the network.\",\n type: \"boolean\",\n },\n json: {\n description: \"Emit diagnostics as JSON on stdout (for CI/editors).\",\n type: \"boolean\",\n },\n strict: {\n description: \"Treat warnings as errors.\",\n type: \"boolean\",\n },\n },\n meta: commandMeta.validate,\n async run({ args }) {\n const root = process.cwd();\n const diagnostics: Diagnostic[] = [];\n\n try {\n const project = await scanProject(root, { mode: \"build\" });\n // Surface content/graph problems too: a page that fails to parse is a\n // link-validation blind spot, so silently passing would be misleading.\n diagnostics.push(...project.diagnostics);\n\n // Custom `.astro` pages and the generated changelog index are servable\n // routes the content graph can't see — without them, a docs link to e.g.\n // a custom landing page fails as BLUME_BROKEN_LINK.\n const userPages = project.context.pagesRoot\n ? await discoverPages(project.context.pagesRoot)\n : [];\n const extraRoutes = customStaticRoutes(userPages);\n if (hasGeneratedChangelog(project, userPages)) {\n extraRoutes.push(\"/changelog\");\n }\n\n // Fallback-materialized locale routes (an untranslated page prerendered\n // at its localized URL) are servable but absent from the content graph —\n // without them a link to an untranslated sibling under a non-default\n // locale fails as BLUME_BROKEN_LINK even though the built site serves it.\n if (project.config.i18n) {\n const manifest = buildManifest({\n config: project.config,\n context: project.context,\n graph: project.graph,\n });\n extraRoutes.push(\n ...manifest.routes.flatMap((route) =>\n route.fallback ? [route.path] : []\n )\n );\n }\n\n const publicDir = join(root, \"public\");\n diagnostics.push(\n ...(await validateLinks(project.graph, {\n basePath: project.config.basePath,\n checkExternal: Boolean(args.external),\n extraRoutes,\n i18n: project.config.i18n,\n publicDir: existsSync(publicDir) ? publicDir : null,\n redirects: project.config.redirects,\n }))\n );\n } catch (error) {\n if (error instanceof BlumeError) {\n diagnostics.push(error.diagnostic);\n } else {\n reportInternalError(error);\n process.exit(1);\n }\n }\n\n // `--strict` escalates warnings to failures; info-level notes (e.g.\n // BLUME_ASSETS_UNCHECKED when there is no public/ dir) stay advisory.\n const strictFailure =\n Boolean(args.strict) &&\n diagnostics.some((diagnostic) => diagnostic.severity !== \"info\");\n\n if (args.json) {\n // Drain stdout before exiting non-zero: `process.exit` would otherwise\n // truncate the JSON payload mid-write when stdout is a pipe — exactly how\n // `--json` is consumed in CI/editors.\n const hadErrors = reportDiagnosticsJson(diagnostics, root);\n if (hadErrors || strictFailure) {\n await flushStdout();\n process.exit(1);\n }\n return;\n }\n\n const hadErrors = reportDiagnostics(diagnostics, root);\n if (diagnostics.length === 0) {\n logger.success(\"No broken links found.\");\n }\n if (hadErrors || strictFailure) {\n process.exit(1);\n }\n },\n});\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA;AACA;AAqBO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,UAAU;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,YAAY;AAAA,OACZ,IAAG,GAAG,QAAQ;AAAA,IAClB,MAAM,OAAO,QAAQ,IAAI;AAAA,IACzB,MAAM,cAA4B,CAAC;AAAA,IAEnC,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,YAAY,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,MAGzD,YAAY,KAAK,GAAG,QAAQ,WAAW;AAAA,MAKvC,MAAM,YAAY,QAAQ,QAAQ,YAC9B,MAAM,cAAc,QAAQ,QAAQ,SAAS,IAC7C,CAAC;AAAA,MACL,MAAM,cAAc,mBAAmB,SAAS;AAAA,MAChD,IAAI,sBAAsB,SAAS,SAAS,GAAG;AAAA,QAC7C,YAAY,KAAK,YAAY;AAAA,MAC/B;AAAA,MAMA,IAAI,QAAQ,OAAO,MAAM;AAAA,QACvB,MAAM,WAAW,cAAc;AAAA,UAC7B,QAAQ,QAAQ;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ;AAAA,QACjB,CAAC;AAAA,QACD,YAAY,KACV,GAAG,SAAS,OAAO,QAAQ,CAAC,UAC1B,MAAM,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,CACnC,CACF;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,KAAK,MAAM,QAAQ;AAAA,MACrC,YAAY,KACV,GAAI,MAAM,cAAc,QAAQ,OAAO;AAAA,QACrC,UAAU,QAAQ,OAAO;AAAA,QACzB,eAAe,QAAQ,KAAK,QAAQ;AAAA,QACpC;AAAA,QACA,MAAM,QAAQ,OAAO;AAAA,QACrB,WAAW,WAAW,SAAS,IAAI,YAAY;AAAA,QAC/C,WAAW,QAAQ,OAAO;AAAA,MAC5B,CAAC,CACH;AAAA,MACA,OAAO,OAAO;AAAA,MACd,IAAI,iBAAiB,YAAY;AAAA,QAC/B,YAAY,KAAK,MAAM,UAAU;AAAA,MACnC,EAAO;AAAA,QACL,oBAAoB,KAAK;AAAA,QACzB,QAAQ,KAAK,CAAC;AAAA;AAAA;AAAA,IAMlB,MAAM,gBACJ,QAAQ,KAAK,MAAM,KACnB,YAAY,KAAK,CAAC,eAAe,WAAW,aAAa,MAAM;AAAA,IAEjE,IAAI,KAAK,MAAM;AAAA,MAIb,MAAM,YAAY,sBAAsB,aAAa,IAAI;AAAA,MACzD,IAAI,aAAa,eAAe;AAAA,QAC9B,MAAM,YAAY;AAAA,QAClB,QAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,kBAAkB,aAAa,IAAI;AAAA,IACrD,IAAI,YAAY,WAAW,GAAG;AAAA,MAC5B,OAAO,QAAQ,wBAAwB;AAAA,IACzC;AAAA,IACA,IAAI,aAAa,eAAe;AAAA,MAC9B,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA;AAEJ,CAAC;",
|
|
8
|
+
"debugId": "1EEBE4960D9C18F364756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
BlumeError,
|
|
4
|
+
locateFrontmatterKey
|
|
5
|
+
} from "./index.js";
|
|
6
|
+
import {
|
|
7
|
+
ComponentOverridesError,
|
|
8
|
+
analyzeComponentOverrides
|
|
9
|
+
} from "./chunk-vtk4a6dg.js";
|
|
10
|
+
import {
|
|
11
|
+
frontmatter_default,
|
|
12
|
+
DEFAULT_CONTENT_INCLUDE,
|
|
13
|
+
DEFAULT_CONTENT_EXCLUDE,
|
|
14
|
+
pageMetaSchema,
|
|
15
|
+
createModuleLoader,
|
|
16
|
+
findConfigFile,
|
|
17
|
+
findComponentsFile,
|
|
18
|
+
ConfigValidationError,
|
|
19
|
+
loadConfig
|
|
20
|
+
} from "./chunk-qkqwkpte.js";
|
|
21
|
+
import {
|
|
22
|
+
baselineScanIgnore
|
|
23
|
+
} from "./chunk-abh8yjkn.js";
|
|
24
|
+
|
|
25
|
+
// src/upgrade/upgrade.ts
|
|
26
|
+
import { existsSync } from "node:fs";
|
|
27
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
28
|
+
import { join, relative, resolve } from "pathe";
|
|
29
|
+
import { glob } from "tinyglobby";
|
|
30
|
+
import { z } from "zod";
|
|
31
|
+
var UPGRADE_GUIDE_URL = "https://useblume.dev/docs/upgrading";
|
|
32
|
+
var UPGRADE_GUIDE_FILE = join("docs", "03-upgrading.mdx");
|
|
33
|
+
var DEPENDENCY_FIELDS = [
|
|
34
|
+
"dependencies",
|
|
35
|
+
"devDependencies"
|
|
36
|
+
];
|
|
37
|
+
var RANGE_MAJOR = /^[\s<=>^~v]*(?<major>\d+)/u;
|
|
38
|
+
var rangeMajor = (range) => {
|
|
39
|
+
const major = RANGE_MAJOR.exec(range)?.groups?.major;
|
|
40
|
+
return major === undefined ? null : Number(major);
|
|
41
|
+
};
|
|
42
|
+
var INDENT = /^(?<indent>[ \t]+)"/mu;
|
|
43
|
+
var REGEXP_SPECIAL = /[$()*+.?[\\\]^{|}]/gu;
|
|
44
|
+
var escapeRegExp = (value) => value.replaceAll(REGEXP_SPECIAL, String.raw`\$&`);
|
|
45
|
+
var replaceRange = (text, field, from, to) => {
|
|
46
|
+
const value = JSON.stringify(from);
|
|
47
|
+
const entry = new RegExp(`"blume"\\s*:\\s*${escapeRegExp(value)}`, "gu");
|
|
48
|
+
entry.lastIndex = Math.max(text.indexOf(JSON.stringify(field)), 0);
|
|
49
|
+
const match = entry.exec(text);
|
|
50
|
+
if (!match) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const end = match.index + match[0].length;
|
|
54
|
+
return `${text.slice(0, end - value.length)}${JSON.stringify(to)}${text.slice(end)}`;
|
|
55
|
+
};
|
|
56
|
+
var bumpBlumeDependency = async (root, version) => {
|
|
57
|
+
const path = join(root, "package.json");
|
|
58
|
+
if (!existsSync(path)) {
|
|
59
|
+
return { status: "missing" };
|
|
60
|
+
}
|
|
61
|
+
const text = await readFile(path, "utf-8");
|
|
62
|
+
const pkg = JSON.parse(text);
|
|
63
|
+
const field = DEPENDENCY_FIELDS.find((name) => pkg[name]?.blume !== undefined);
|
|
64
|
+
const from = field ? pkg[field]?.blume : undefined;
|
|
65
|
+
if (!(field && from)) {
|
|
66
|
+
return { status: "missing" };
|
|
67
|
+
}
|
|
68
|
+
const current = rangeMajor(from);
|
|
69
|
+
const target = rangeMajor(version);
|
|
70
|
+
if (current === null || target === null || current >= target) {
|
|
71
|
+
return { range: from, status: "current" };
|
|
72
|
+
}
|
|
73
|
+
const to = `^${version}`;
|
|
74
|
+
const indent = INDENT.exec(text)?.groups?.indent ?? " ";
|
|
75
|
+
const updated = { ...pkg, [field]: { ...pkg[field], blume: to } };
|
|
76
|
+
await writeFile(path, replaceRange(text, field, from, to) ?? `${JSON.stringify(updated, null, indent)}
|
|
77
|
+
`);
|
|
78
|
+
return { field, from, status: "bumped", to };
|
|
79
|
+
};
|
|
80
|
+
var isOutsideBlumeProject = (root, bump) => bump.status === "missing" && findConfigFile(root) === null;
|
|
81
|
+
var REMOVED_BUILD_FLAG = /^--(?<flag>adapter|base|output)(?:=|$)/u;
|
|
82
|
+
var removedBuildFlags = (args) => [
|
|
83
|
+
...new Set(args.flatMap((arg) => {
|
|
84
|
+
const flag = REMOVED_BUILD_FLAG.exec(arg)?.groups?.flag;
|
|
85
|
+
return flag ? [flag] : [];
|
|
86
|
+
}))
|
|
87
|
+
];
|
|
88
|
+
var flagList = (flags) => flags.map((flag) => `--${flag}`).join(", ");
|
|
89
|
+
var removedBuildFlagsAdvice = (flags) => {
|
|
90
|
+
const advice = [];
|
|
91
|
+
if (flags.includes("adapter") || flags.includes("output")) {
|
|
92
|
+
advice.push('name the host in blume.config.ts with `deployment: vercel()` (or `netlify()`, `cloudflare()`, `node()`) from "blume/deploy" — a host adapter builds for the server, and `output: "static"` keeps it static');
|
|
93
|
+
}
|
|
94
|
+
if (flags.includes("base")) {
|
|
95
|
+
advice.push('set the subpath with `deployment: { base: "/docs" }`, or the host adapter\'s `base` option');
|
|
96
|
+
}
|
|
97
|
+
return `Drop ${flagList(flags)} and ${advice.join("; ")}.`;
|
|
98
|
+
};
|
|
99
|
+
var BLUME_BIN = /(?:^|[/\\])blume(?:@\S+)?$/u;
|
|
100
|
+
var COMMAND_SEPARATOR = /&&|\|\||[;|]/u;
|
|
101
|
+
var WHITESPACE = /\s+/u;
|
|
102
|
+
var buildArgs = (script) => script.split(COMMAND_SEPARATOR).flatMap((command) => {
|
|
103
|
+
const words = command.trim().split(WHITESPACE);
|
|
104
|
+
const at = words.findIndex((word, index) => BLUME_BIN.test(word) && words[index + 1] === "build");
|
|
105
|
+
return at === -1 ? [] : words.slice(at + 2);
|
|
106
|
+
});
|
|
107
|
+
var scriptsSchema = z.looseObject({
|
|
108
|
+
scripts: z.record(z.string(), z.string()).default({})
|
|
109
|
+
});
|
|
110
|
+
var lineOf = (text, index) => text.slice(0, index).split(`
|
|
111
|
+
`).length;
|
|
112
|
+
var scriptFindings = async (root) => {
|
|
113
|
+
const path = join(root, "package.json");
|
|
114
|
+
if (!existsSync(path)) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
const text = await readFile(path, "utf-8");
|
|
118
|
+
const pkg = scriptsSchema.safeParse(JSON.parse(text));
|
|
119
|
+
const scripts = pkg.success ? pkg.data.scripts : {};
|
|
120
|
+
const scriptsAt = text.indexOf('"scripts"');
|
|
121
|
+
return Object.entries(scripts).flatMap(([name, script]) => {
|
|
122
|
+
const flags = removedBuildFlags(buildArgs(script));
|
|
123
|
+
if (flags.length === 0) {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const at = text.indexOf(JSON.stringify(name), scriptsAt);
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
code: "BLUME_BUILD_FLAG_REMOVED",
|
|
130
|
+
file: path,
|
|
131
|
+
line: at === -1 ? undefined : lineOf(text, at),
|
|
132
|
+
message: `The "${name}" script passes ${flagList(flags)} to \`blume build\`, which Blume 2 removed.`,
|
|
133
|
+
severity: "error",
|
|
134
|
+
suggestion: removedBuildFlagsAdvice(flags)
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
var globFields = {
|
|
140
|
+
exclude: z.array(z.string()).optional(),
|
|
141
|
+
include: z.array(z.string()).optional(),
|
|
142
|
+
root: z.string().optional()
|
|
143
|
+
};
|
|
144
|
+
var rawFilesystemSourceSchema = z.union([
|
|
145
|
+
z.looseObject({
|
|
146
|
+
kind: z.literal("filesystem"),
|
|
147
|
+
options: z.looseObject(globFields).default({})
|
|
148
|
+
}).transform((source) => source.options),
|
|
149
|
+
z.looseObject({ type: z.literal("filesystem"), ...globFields })
|
|
150
|
+
]);
|
|
151
|
+
var rawContentSchema = z.looseObject({
|
|
152
|
+
content: z.looseObject({ ...globFields, sources: z.array(z.unknown()).optional() }).optional()
|
|
153
|
+
});
|
|
154
|
+
var contentGlobs = ({
|
|
155
|
+
content
|
|
156
|
+
}) => {
|
|
157
|
+
const sources = (content?.sources ?? []).flatMap((source) => {
|
|
158
|
+
const filesystem = rawFilesystemSourceSchema.safeParse(source);
|
|
159
|
+
return filesystem.success ? [filesystem.data] : [];
|
|
160
|
+
});
|
|
161
|
+
return (sources.length > 0 ? sources : [content ?? {}]).map((globs) => ({
|
|
162
|
+
exclude: globs.exclude ?? DEFAULT_CONTENT_EXCLUDE,
|
|
163
|
+
include: globs.include ?? DEFAULT_CONTENT_INCLUDE,
|
|
164
|
+
root: globs.root ?? "docs"
|
|
165
|
+
}));
|
|
166
|
+
};
|
|
167
|
+
var configContentGlobs = async (root) => {
|
|
168
|
+
const file = findConfigFile(root);
|
|
169
|
+
let raw = {};
|
|
170
|
+
if (file) {
|
|
171
|
+
try {
|
|
172
|
+
const parsed = rawContentSchema.safeParse(await createModuleLoader()(file));
|
|
173
|
+
raw = parsed.success ? parsed.data : {};
|
|
174
|
+
} catch {}
|
|
175
|
+
}
|
|
176
|
+
return contentGlobs(raw);
|
|
177
|
+
};
|
|
178
|
+
var isPathKey = (segment) => typeof segment !== "symbol";
|
|
179
|
+
var PLAIN_UNKNOWN_KEY = "Unrecognized key";
|
|
180
|
+
var removedFieldFindings = (file, text, issues) => issues.flatMap((issue) => {
|
|
181
|
+
if (issue.code !== "unrecognized_keys" || issue.message.startsWith(PLAIN_UNKNOWN_KEY)) {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
const path = issue.path.filter(isPathKey);
|
|
185
|
+
const position = locateFrontmatterKey(text, [...path, ...issue.keys.slice(0, 1)]) ?? locateFrontmatterKey(text, path);
|
|
186
|
+
return [
|
|
187
|
+
{
|
|
188
|
+
code: "BLUME_FRONTMATTER_INVALID",
|
|
189
|
+
column: position?.column,
|
|
190
|
+
file,
|
|
191
|
+
line: position?.line,
|
|
192
|
+
message: issue.message,
|
|
193
|
+
severity: "error"
|
|
194
|
+
}
|
|
195
|
+
];
|
|
196
|
+
});
|
|
197
|
+
var pageFindings = async (file) => {
|
|
198
|
+
const text = await readFile(file, "utf-8");
|
|
199
|
+
let parsed;
|
|
200
|
+
try {
|
|
201
|
+
parsed = pageMetaSchema.safeParse(frontmatter_default(text).data);
|
|
202
|
+
} catch {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
return parsed.success ? [] : removedFieldFindings(file, text, parsed.error.issues);
|
|
206
|
+
};
|
|
207
|
+
var frontmatterFindings = async (root) => {
|
|
208
|
+
const roots = await configContentGlobs(root);
|
|
209
|
+
const matches = await Promise.all(roots.map((globs) => {
|
|
210
|
+
const cwd = resolve(root, globs.root);
|
|
211
|
+
return existsSync(cwd) ? glob(globs.include, {
|
|
212
|
+
absolute: true,
|
|
213
|
+
cwd,
|
|
214
|
+
ignore: [...globs.exclude, ...baselineScanIgnore()],
|
|
215
|
+
onlyFiles: true
|
|
216
|
+
}) : [];
|
|
217
|
+
}));
|
|
218
|
+
const files = [...new Set(matches.flat())].toSorted();
|
|
219
|
+
const findings = await Promise.all(files.map(pageFindings));
|
|
220
|
+
return findings.flat();
|
|
221
|
+
};
|
|
222
|
+
var findingsOf = async (check) => {
|
|
223
|
+
try {
|
|
224
|
+
await check();
|
|
225
|
+
return [];
|
|
226
|
+
} catch (error) {
|
|
227
|
+
if (error instanceof ConfigValidationError || error instanceof ComponentOverridesError) {
|
|
228
|
+
return error.issues;
|
|
229
|
+
}
|
|
230
|
+
if (error instanceof BlumeError) {
|
|
231
|
+
return [error.diagnostic];
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
var collectUpgradeFindings = async (root) => {
|
|
237
|
+
const componentsFile = findComponentsFile(root);
|
|
238
|
+
return [
|
|
239
|
+
...await findingsOf(async () => {
|
|
240
|
+
await loadConfig(root);
|
|
241
|
+
}),
|
|
242
|
+
...componentsFile ? await findingsOf(async () => {
|
|
243
|
+
analyzeComponentOverrides(await readFile(componentsFile, "utf-8"), componentsFile);
|
|
244
|
+
}) : [],
|
|
245
|
+
...await frontmatterFindings(root),
|
|
246
|
+
...await scriptFindings(root)
|
|
247
|
+
];
|
|
248
|
+
};
|
|
249
|
+
var plainFinding = (finding, root) => {
|
|
250
|
+
const where = finding.file ? `${relative(root, finding.file)}${finding.line === undefined ? "" : `:${finding.line}`}` : "blume.config.ts";
|
|
251
|
+
const fix = finding.suggestion ? `
|
|
252
|
+
Fix: ${finding.suggestion}` : "";
|
|
253
|
+
return `- ${where} (${finding.code})
|
|
254
|
+
${finding.message.replaceAll(`
|
|
255
|
+
`, `
|
|
256
|
+
`)}${fix}`;
|
|
257
|
+
};
|
|
258
|
+
var upgradePrompt = (options) => `Upgrade this Blume project to Blume ${options.version}. \`blume upgrade\` has bumped the \`blume\` dependency in package.json where it could; what's left is the config.
|
|
259
|
+
|
|
260
|
+
The upgrade guide is at ${options.guidePath} (online at ${UPGRADE_GUIDE_URL}). It covers every change between Blume 1 and 2 with before-and-after examples: search, deployment, content sources, API references, analytics, and the assistant's model provider become adapters imported from \`blume/*\` subpaths; the machine-readable settings move from \`ai\` to \`agents\`; Ask AI is renamed the assistant, so \`ai.ask\` becomes \`ai.assistant\`; and \`components.ts\` entries must be one of the static forms.
|
|
261
|
+
|
|
262
|
+
\`blume upgrade\` found:
|
|
263
|
+
|
|
264
|
+
${options.findings.map((finding) => plainFinding(finding, options.root)).join(`
|
|
265
|
+
|
|
266
|
+
`)}
|
|
267
|
+
|
|
268
|
+
Work through every finding:
|
|
269
|
+
1. Read the guide section for each change before editing.
|
|
270
|
+
2. Rewrite the config to the Blume 2 form, adding the adapter imports it needs. Keep the site's behavior the same: the same content, routes, search backend, deployment target, analytics, and credentials (keep reading secrets from the same environment variables).
|
|
271
|
+
3. The config loader reports every invalid field at once, but some changes only surface once earlier ones are fixed, so rerun \`${options.runner} blume doctor\` after each round of edits.
|
|
272
|
+
4. Never delete content, or remove a setting only to silence an error; if something needs a human decision, leave it and say so in your summary.
|
|
273
|
+
|
|
274
|
+
When \`${options.runner} blume doctor\` reports no errors, run \`${options.runner} blume build\` and fix anything it reports until it succeeds.`;
|
|
275
|
+
|
|
276
|
+
export { UPGRADE_GUIDE_URL, UPGRADE_GUIDE_FILE, bumpBlumeDependency, isOutsideBlumeProject, removedBuildFlags, flagList, removedBuildFlagsAdvice, collectUpgradeFindings, upgradePrompt };
|
|
277
|
+
|
|
278
|
+
//# debugId=9BE967FC7391289164756E2164756E21
|
|
279
|
+
//# sourceMappingURL=chunk-dh8cwk36.js.map
|