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
package/src/astro/integration.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { AstroIntegration } from "astro";
|
|
|
5
5
|
import { join, relative, resolve } from "pathe";
|
|
6
6
|
|
|
7
7
|
import { loadEnvFiles } from "../cli/env.ts";
|
|
8
|
+
import type { CustomPageRoute } from "../core/custom-pages.ts";
|
|
8
9
|
import { enrichDiagnostic } from "../core/diagnostics.ts";
|
|
9
10
|
import { scanProject } from "../core/project-graph.ts";
|
|
10
11
|
import type { BlumeProject } from "../core/project-graph.ts";
|
|
@@ -221,12 +222,7 @@ export const showBlumeErrorOverlay = (diagnostics: Diagnostic[]): void => {
|
|
|
221
222
|
};
|
|
222
223
|
|
|
223
224
|
/** A user page mounted into the generated runtime. */
|
|
224
|
-
export
|
|
225
|
-
/** Route pattern, e.g. `/changelog` or `/examples/[slug]`. */
|
|
226
|
-
pattern: string;
|
|
227
|
-
/** Absolute path to the user's `.astro` page file. */
|
|
228
|
-
entrypoint: string;
|
|
229
|
-
}
|
|
225
|
+
export type BlumePageRoute = CustomPageRoute;
|
|
230
226
|
|
|
231
227
|
export interface BlumeIntegrationOptions {
|
|
232
228
|
pages: BlumePageRoute[];
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
export const runtimeModuleDeclarations = (
|
|
15
15
|
examplesModule: string
|
|
16
16
|
): string => `declare module "blume:ask" {
|
|
17
|
-
const Ask: typeof import("blume/components/islands/
|
|
17
|
+
const Ask: typeof import("blume/components/islands/Assistant.astro").default;
|
|
18
18
|
export default Ask;
|
|
19
19
|
}
|
|
20
20
|
|
package/src/astro/pages.ts
CHANGED
|
@@ -1,62 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
CHANGELOG_INDEX_ROUTE,
|
|
3
|
+
hasChangelogIndex,
|
|
4
|
+
} from "../core/changelog-index.ts";
|
|
5
|
+
import { staticSegments } from "../core/custom-pages.ts";
|
|
4
6
|
import type { BlumeProject } from "../core/project-graph.ts";
|
|
5
7
|
import type { BlumePageRoute } from "./integration.ts";
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* built into a route. Blume injects pages itself, so it must reproduce the same
|
|
13
|
-
* exclusion or every `pages/_home/Hero.astro`-style component ships as an HTML
|
|
14
|
-
* page.
|
|
15
|
-
*/
|
|
16
|
-
const isPrivatePage = (rel: string): boolean =>
|
|
17
|
-
rel.split("/").some((segment) => segment.startsWith("_"));
|
|
18
|
-
|
|
19
|
-
/** Map discovered page files to routes; shared by the async/sync discoverers. */
|
|
20
|
-
const toPageRoutes = (pagesRoot: string, files: string[]): BlumePageRoute[] => {
|
|
21
|
-
files.sort();
|
|
22
|
-
const routes: BlumePageRoute[] = [];
|
|
23
|
-
for (const file of files) {
|
|
24
|
-
const rel = relative(pagesRoot, file);
|
|
25
|
-
if (isPrivatePage(rel)) {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
const withoutExt = rel.slice(0, rel.length - extname(rel).length);
|
|
29
|
-
const parts = withoutExt.split("/");
|
|
30
|
-
// Only a trailing `index` maps to its parent dir; a folder literally named
|
|
31
|
-
// `index` (e.g. `index/foo.astro`) must keep its segment.
|
|
32
|
-
if (parts.at(-1) === "index") {
|
|
33
|
-
parts.pop();
|
|
34
|
-
}
|
|
35
|
-
const pattern = parts.length === 0 ? "/" : `/${parts.join("/")}`;
|
|
36
|
-
routes.push({ entrypoint: file, pattern });
|
|
37
|
-
}
|
|
38
|
-
return routes;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Discover user `.astro` pages and map them to route patterns. Files keep their
|
|
43
|
-
* original location; only the route pattern is derived (index -> parent,
|
|
44
|
-
* dynamic `[param]` segments preserved).
|
|
45
|
-
*/
|
|
46
|
-
export const discoverPages = async (
|
|
47
|
-
pagesRoot: string
|
|
48
|
-
): Promise<BlumePageRoute[]> =>
|
|
49
|
-
toPageRoutes(
|
|
50
|
-
pagesRoot,
|
|
51
|
-
await glob(PAGE_GLOB, { absolute: true, cwd: pagesRoot, onlyFiles: true })
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
/** {@link discoverPages} for synchronous callers (e.g. the sitemap builder). */
|
|
55
|
-
export const discoverPagesSync = (pagesRoot: string): BlumePageRoute[] =>
|
|
56
|
-
toPageRoutes(
|
|
57
|
-
pagesRoot,
|
|
58
|
-
globSync(PAGE_GLOB, { absolute: true, cwd: pagesRoot, onlyFiles: true })
|
|
59
|
-
);
|
|
9
|
+
export {
|
|
10
|
+
customStaticRoutes,
|
|
11
|
+
discoverPages,
|
|
12
|
+
discoverPagesSync,
|
|
13
|
+
} from "../core/custom-pages.ts";
|
|
60
14
|
|
|
61
15
|
/**
|
|
62
16
|
* Whether the project already owns `route` — through a custom `.astro` page
|
|
@@ -80,37 +34,6 @@ export interface OgCustomRoute {
|
|
|
80
34
|
title: string;
|
|
81
35
|
}
|
|
82
36
|
|
|
83
|
-
/** Skip private (`_partial`, `.well-known`) and Astro dynamic (`[param]`) parts. */
|
|
84
|
-
const PRIVATE_SEGMENT = /^[._]/u;
|
|
85
|
-
|
|
86
|
-
/** Segments of a static, shareable page pattern; null for dynamic/private ones. */
|
|
87
|
-
const staticSegments = (pattern: string): string[] | null => {
|
|
88
|
-
const segments = pattern.split("/").filter(Boolean);
|
|
89
|
-
return segments.some(
|
|
90
|
-
(part) => PRIVATE_SEGMENT.test(part) || part.includes("[")
|
|
91
|
-
)
|
|
92
|
-
? null
|
|
93
|
-
: segments;
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* The static routes served by custom `.astro` pages — the same filtering as
|
|
98
|
-
* {@link customOgRoutes}, but yielding the routes themselves. Feeds the route
|
|
99
|
-
* sets that must know every servable page beyond the content graph (the link
|
|
100
|
-
* checker, the sitemap); dynamic (`[param]`) and private segments are skipped
|
|
101
|
-
* because their concrete URLs can't be enumerated statically.
|
|
102
|
-
*/
|
|
103
|
-
export const customStaticRoutes = (pages: { pattern: string }[]): string[] => {
|
|
104
|
-
const routes = new Set<string>();
|
|
105
|
-
for (const { pattern } of pages) {
|
|
106
|
-
const segments = staticSegments(pattern);
|
|
107
|
-
if (segments !== null) {
|
|
108
|
-
routes.add(segments.length === 0 ? "/" : `/${segments.join("/")}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return [...routes];
|
|
112
|
-
};
|
|
113
|
-
|
|
114
37
|
/**
|
|
115
38
|
* Whether the generated `/changelog` index route exists for this project —
|
|
116
39
|
* `generate.ts` (which writes the page) and the sitemap/link validator all
|
|
@@ -121,20 +44,9 @@ export const customStaticRoutes = (pages: { pattern: string }[]): string[] => {
|
|
|
121
44
|
export const hasGeneratedChangelog = (
|
|
122
45
|
project: BlumeProject,
|
|
123
46
|
userPages: { pattern: string }[]
|
|
124
|
-
): boolean =>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
page.contentType === "changelog" &&
|
|
128
|
-
!(page.meta.draft || page.meta.sidebar.hidden)
|
|
129
|
-
);
|
|
130
|
-
const hasChangelogSource = (project.config.content.sources ?? []).some(
|
|
131
|
-
(source) => source.type === "github-releases"
|
|
132
|
-
);
|
|
133
|
-
return (
|
|
134
|
-
(hasChangelog || hasChangelogSource) &&
|
|
135
|
-
!routeIsTaken(userPages, project.graph.pages, "/changelog")
|
|
136
|
-
);
|
|
137
|
-
};
|
|
47
|
+
): boolean =>
|
|
48
|
+
hasChangelogIndex(project.graph.pages, project.config) &&
|
|
49
|
+
!routeIsTaken(userPages, project.graph.pages, CHANGELOG_INDEX_ROUTE);
|
|
138
50
|
|
|
139
51
|
const humanizeSegment = (segment: string): string =>
|
|
140
52
|
segment
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
2
|
+
import {
|
|
3
|
+
lstat,
|
|
4
|
+
mkdir,
|
|
5
|
+
readdir,
|
|
6
|
+
readlink,
|
|
7
|
+
realpath,
|
|
8
|
+
rm,
|
|
9
|
+
symlink,
|
|
10
|
+
} from "node:fs/promises";
|
|
11
|
+
import { isBuiltin } from "node:module";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
basename,
|
|
15
|
+
dirname,
|
|
16
|
+
isAbsolute,
|
|
17
|
+
join,
|
|
18
|
+
normalize,
|
|
19
|
+
relative,
|
|
20
|
+
resolve,
|
|
21
|
+
} from "pathe";
|
|
22
|
+
|
|
23
|
+
import { packageRoot } from "../core/package-root.ts";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The two places an installer can put Blume's dependencies:
|
|
27
|
+
* - `<blume>/node_modules` — deps nested under the package (workspace source,
|
|
28
|
+
* or npm nesting them away from a conflicting hoisted copy)
|
|
29
|
+
* - `dirname(<blume>)` — deps as siblings in the store (isolated/pnpm)
|
|
30
|
+
*
|
|
31
|
+
* `packageRoot()` resolves to Blume's real on-disk path (Node follows the
|
|
32
|
+
* install symlink), so its parent is the store's package directory where the
|
|
33
|
+
* isolated linker places the siblings.
|
|
34
|
+
*/
|
|
35
|
+
export const depsCandidates = (pkgDir: string): string[] => [
|
|
36
|
+
join(pkgDir, "node_modules"),
|
|
37
|
+
dirname(pkgDir),
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/** First dependency candidate containing the package dir `segments`, or null. */
|
|
41
|
+
export const candidateHolding = (
|
|
42
|
+
pkgDir: string,
|
|
43
|
+
...segments: string[]
|
|
44
|
+
): string | null =>
|
|
45
|
+
depsCandidates(pkgDir).find((dir) => existsSync(join(dir, ...segments))) ??
|
|
46
|
+
null;
|
|
47
|
+
|
|
48
|
+
const holdsAstro = (dir: string): boolean => existsSync(join(dir, "astro"));
|
|
49
|
+
const holdsMdx = (dir: string): boolean =>
|
|
50
|
+
existsSync(join(dir, "@astrojs", "mdx"));
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Locate the directory that holds Blume's installed dependencies (Astro and its
|
|
54
|
+
* integrations).
|
|
55
|
+
*
|
|
56
|
+
* With a clean hoisted install this is moot — the deps sit in a `node_modules`
|
|
57
|
+
* the generated `.blume/` already walks up into. But under isolated linkers
|
|
58
|
+
* (Bun's `isolated` mode, pnpm) Blume's deps are NOT hoisted into the project;
|
|
59
|
+
* they live beside the Blume package in a virtual store, invisible to the
|
|
60
|
+
* upward walk from `.blume/` — so probe the {@link depsCandidates}.
|
|
61
|
+
*
|
|
62
|
+
* Astro alone is a bad probe: an npm split install (an `overrides` pin plus an
|
|
63
|
+
* incremental install) hoists `astro` to the project root while Blume's other
|
|
64
|
+
* deps stay nested, and probing for astro then picks the root directory — one
|
|
65
|
+
* that holds none of them. Prefer a candidate with the full set (astro beside
|
|
66
|
+
* `@astrojs/mdx`, the integration every generated runtime declares), then one
|
|
67
|
+
* with the integrations (astro hoisted away — the rest of Blume's deps sit
|
|
68
|
+
* there too), then one with astro alone.
|
|
69
|
+
*/
|
|
70
|
+
export const blumeDepsDir = (pkgDir: string = packageRoot()): string | null => {
|
|
71
|
+
const candidates = depsCandidates(pkgDir);
|
|
72
|
+
return (
|
|
73
|
+
candidates.find((dir) => holdsAstro(dir) && holdsMdx(dir)) ??
|
|
74
|
+
candidates.find(holdsMdx) ??
|
|
75
|
+
candidates.find(holdsAstro) ??
|
|
76
|
+
null
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The package a bare specifier names (`@scope/name` or `name`, whatever
|
|
82
|
+
* subpath follows), or null for a Node builtin.
|
|
83
|
+
*/
|
|
84
|
+
export const packageNameOf = (specifier: string): string | null => {
|
|
85
|
+
if (isBuiltin(specifier)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const [first = "", second] = specifier.split("/");
|
|
89
|
+
if (!first.startsWith("@")) {
|
|
90
|
+
return first || null;
|
|
91
|
+
}
|
|
92
|
+
return second ? `${first}/${second}` : null;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The directory an import of package `name` loads from when resolved from
|
|
97
|
+
* `fromDir`: the first `node_modules/<name>` up the physical ancestors — the
|
|
98
|
+
* walk Node itself performs — as a real path, or null when none holds it.
|
|
99
|
+
*/
|
|
100
|
+
export const packageDirFrom = (
|
|
101
|
+
name: string,
|
|
102
|
+
fromDir: string
|
|
103
|
+
): string | null => {
|
|
104
|
+
let dir = normalize(fromDir);
|
|
105
|
+
while (true) {
|
|
106
|
+
const candidate = join(dir, "node_modules", name);
|
|
107
|
+
if (existsSync(join(candidate, "package.json"))) {
|
|
108
|
+
return normalize(realpathSync(candidate));
|
|
109
|
+
}
|
|
110
|
+
const parent = dirname(dir);
|
|
111
|
+
if (parent === dir) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
dir = parent;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/** Whether `child` is `parent` or sits somewhere under it. */
|
|
119
|
+
const isWithin = (parent: string, child: string): boolean => {
|
|
120
|
+
const path = relative(parent, child);
|
|
121
|
+
return path === "" || !(path.startsWith("..") || isAbsolute(path));
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Point `link` at the package directory `target`, replacing a link to anything
|
|
126
|
+
* else and leaving a real directory alone. The link is relative, so it keeps
|
|
127
|
+
* working when the project moves as a whole (a server build shipped with its
|
|
128
|
+
* `node_modules`); without symlink privilege on Windows it falls back to a
|
|
129
|
+
* junction, which must be absolute.
|
|
130
|
+
*/
|
|
131
|
+
const linkPackageDir = async (link: string, target: string): Promise<void> => {
|
|
132
|
+
await mkdir(dirname(link), { recursive: true });
|
|
133
|
+
// A relative link resolves from its folder's real path, which differs from
|
|
134
|
+
// the logical one under a symlinked parent (macOS's `/var` → `/private/var`),
|
|
135
|
+
// so the relative target is computed from the real path.
|
|
136
|
+
const from = normalize(await realpath(dirname(link)));
|
|
137
|
+
let existing: Awaited<ReturnType<typeof lstat>> | null;
|
|
138
|
+
try {
|
|
139
|
+
existing = await lstat(link);
|
|
140
|
+
} catch {
|
|
141
|
+
existing = null;
|
|
142
|
+
}
|
|
143
|
+
if (existing) {
|
|
144
|
+
if (!existing.isSymbolicLink()) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
// Both sides in one separator style: Windows hands back `\\` paths.
|
|
149
|
+
if (resolve(from, await readlink(link)) === normalize(target)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
} catch {
|
|
153
|
+
// An unreadable link is replaced below.
|
|
154
|
+
}
|
|
155
|
+
await rm(link, { force: true });
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
await symlink(relative(from, target), link, "dir");
|
|
159
|
+
} catch {
|
|
160
|
+
await symlink(target, link, "junction");
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/** The package names a `node_modules` directory holds, scoped ones included. */
|
|
165
|
+
const packageNames = async (modulesDir: string): Promise<string[]> => {
|
|
166
|
+
const entries = await readdir(modulesDir);
|
|
167
|
+
const grouped = await Promise.all(
|
|
168
|
+
entries
|
|
169
|
+
.filter((entry) => !entry.startsWith("."))
|
|
170
|
+
.map(async (entry) => {
|
|
171
|
+
if (!entry.startsWith("@")) {
|
|
172
|
+
return [entry];
|
|
173
|
+
}
|
|
174
|
+
const scoped = await readdir(join(modulesDir, entry));
|
|
175
|
+
return scoped.map((name) => `${entry}/${name}`);
|
|
176
|
+
})
|
|
177
|
+
);
|
|
178
|
+
return grouped.flat();
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Give a server-side build output its own `node_modules`: one link per package
|
|
183
|
+
* its bundles import by bare name, each to the copy the importing module
|
|
184
|
+
* resolves. A render bundle mixes code from Blume, Astro, and the adapters
|
|
185
|
+
* into one set of chunks, and its bare imports resolve by walking up from the
|
|
186
|
+
* chunk — so without these links the copy the package manager happened to
|
|
187
|
+
* hoist wins, not the one the importer declared. A root `js-yaml@4` (pulled in
|
|
188
|
+
* by the Netlify or Cloudflare adapter) then breaks Blume's `js-yaml@5`
|
|
189
|
+
* import, a Yarn-hoisted `cookie@0.7` breaks Astro's `cookie@2` import, and
|
|
190
|
+
* under pnpm the server bundle can't reach Blume's dependencies at all.
|
|
191
|
+
*
|
|
192
|
+
* Under an isolated linker the links also cover the rest of Blume's own
|
|
193
|
+
* dependencies, which the upward walk can't reach from the output, so a
|
|
194
|
+
* specifier the build never saw (loaded by a dependency at runtime) still
|
|
195
|
+
* resolves as it did before.
|
|
196
|
+
*/
|
|
197
|
+
export const linkRenderDeps = async (
|
|
198
|
+
dir: string,
|
|
199
|
+
imported: ReadonlyMap<string, string>,
|
|
200
|
+
pkgDir: string = packageRoot()
|
|
201
|
+
): Promise<void> => {
|
|
202
|
+
const modulesDir = join(dir, "node_modules");
|
|
203
|
+
// An earlier release linked the whole directory here; per-package links
|
|
204
|
+
// need a real directory in its place.
|
|
205
|
+
try {
|
|
206
|
+
const existing = await lstat(modulesDir);
|
|
207
|
+
if (existing.isSymbolicLink()) {
|
|
208
|
+
await rm(modulesDir, { force: true });
|
|
209
|
+
}
|
|
210
|
+
} catch {
|
|
211
|
+
// Nothing there yet.
|
|
212
|
+
}
|
|
213
|
+
const links = new Map(imported);
|
|
214
|
+
const depsDir = blumeDepsDir(pkgDir);
|
|
215
|
+
if (
|
|
216
|
+
depsDir &&
|
|
217
|
+
!(basename(depsDir) === "node_modules" && isWithin(dirname(depsDir), dir))
|
|
218
|
+
) {
|
|
219
|
+
for (const name of await packageNames(depsDir)) {
|
|
220
|
+
if (!links.has(name)) {
|
|
221
|
+
links.set(name, normalize(realpathSync(join(depsDir, name))));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
await Promise.all(
|
|
226
|
+
[...links].map(([name, target]) =>
|
|
227
|
+
linkPackageDir(join(modulesDir, name), target)
|
|
228
|
+
)
|
|
229
|
+
);
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
/** The Vite environment a hook runs in (`client`, `ssr`, `prerender`). */
|
|
233
|
+
interface PluginEnvironment {
|
|
234
|
+
name: string;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/** What `this.resolve` returns: the resolved id, and whether it's external. */
|
|
238
|
+
interface ResolvedModule {
|
|
239
|
+
external?: boolean | "absolute" | "relative";
|
|
240
|
+
id: string;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** The `resolveId` hook options this plugin forwards to `this.resolve`. */
|
|
244
|
+
interface ResolveIdOptions {
|
|
245
|
+
attributes?: Record<string, string>;
|
|
246
|
+
isEntry?: boolean;
|
|
247
|
+
kind?: string;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** The slice of the plugin context the `resolveId` hook uses. */
|
|
251
|
+
interface ResolveContext {
|
|
252
|
+
environment?: PluginEnvironment;
|
|
253
|
+
resolve: (
|
|
254
|
+
source: string,
|
|
255
|
+
importer: string | undefined,
|
|
256
|
+
options: ResolveIdOptions & { skipSelf: boolean }
|
|
257
|
+
) => Promise<ResolvedModule | null>;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** The Vite plugin {@link prerenderDepsPlugin} returns. */
|
|
261
|
+
export interface PrerenderDepsPlugin {
|
|
262
|
+
apply: "build";
|
|
263
|
+
configResolved: (config: { root: string }) => void;
|
|
264
|
+
enforce: "pre";
|
|
265
|
+
name: string;
|
|
266
|
+
resolveId: {
|
|
267
|
+
filter: { id: RegExp };
|
|
268
|
+
handler: (
|
|
269
|
+
this: ResolveContext,
|
|
270
|
+
source: string,
|
|
271
|
+
importer: string | undefined,
|
|
272
|
+
options: ResolveIdOptions
|
|
273
|
+
) => Promise<ResolvedModule | null>;
|
|
274
|
+
};
|
|
275
|
+
writeBundle: (
|
|
276
|
+
this: { environment?: PluginEnvironment } | undefined,
|
|
277
|
+
options: { dir?: string }
|
|
278
|
+
) => Promise<void>;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* A specifier that could name a package: not relative, absolute, virtual
|
|
283
|
+
* (`\0`), or carrying a scheme or drive letter (`node:`, `virtual:`, `C:`).
|
|
284
|
+
*/
|
|
285
|
+
const BARE_SPECIFIER = /^[^\0./\\][^:]*$/u;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The directory a module id's imports resolve from, or undefined for an id
|
|
289
|
+
* that isn't a file (a virtual module).
|
|
290
|
+
*/
|
|
291
|
+
const importerDir = (importer: string | undefined): string | undefined => {
|
|
292
|
+
const [path = ""] = (importer ?? "").split("?");
|
|
293
|
+
return isAbsolute(path) ? dirname(path) : undefined;
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Vite plugin that makes a server-side build's externalized imports resolve
|
|
298
|
+
* to the copies their importers declared, for the static prerender bundle
|
|
299
|
+
* Astro imports to write the HTML and for a server build's output alike.
|
|
300
|
+
*
|
|
301
|
+
* While each server-side environment (`ssr`, `prerender`) builds, it records
|
|
302
|
+
* every import Vite leaves external together with the package directory that
|
|
303
|
+
* import resolves to from the module that makes it. Once the environment's
|
|
304
|
+
* bundle is written, {@link linkRenderDeps} gives the output directory a
|
|
305
|
+
* `node_modules` of links to exactly those directories. Astro deletes the
|
|
306
|
+
* prerender output once generation finishes — `fs.rm` unlinks the links
|
|
307
|
+
* without following them — while a server build ships its links, relative so
|
|
308
|
+
* they survive the project moving as a whole, and a deploy adapter's file
|
|
309
|
+
* trace follows them to the real files.
|
|
310
|
+
*
|
|
311
|
+
* Outside an environment-aware build (a direct call, as in the tests) only a
|
|
312
|
+
* `.prerender` output is handled. The client build is never touched.
|
|
313
|
+
*/
|
|
314
|
+
export const prerenderDepsPlugin = (
|
|
315
|
+
pkgDir: string = packageRoot()
|
|
316
|
+
): PrerenderDepsPlugin => {
|
|
317
|
+
const imported = new Map<string, Map<string, string>>();
|
|
318
|
+
let root: string | undefined;
|
|
319
|
+
|
|
320
|
+
const record = (
|
|
321
|
+
environment: string,
|
|
322
|
+
source: string,
|
|
323
|
+
importer: string | undefined
|
|
324
|
+
): void => {
|
|
325
|
+
const name = packageNameOf(source);
|
|
326
|
+
const packages = imported.get(environment) ?? new Map<string, string>();
|
|
327
|
+
imported.set(environment, packages);
|
|
328
|
+
if (!name || packages.has(name)) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const from = importerDir(importer) ?? root;
|
|
332
|
+
const target = from === undefined ? null : packageDirFrom(name, from);
|
|
333
|
+
if (target) {
|
|
334
|
+
packages.set(name, target);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
return {
|
|
339
|
+
apply: "build",
|
|
340
|
+
configResolved: (config) => {
|
|
341
|
+
({ root } = config);
|
|
342
|
+
},
|
|
343
|
+
enforce: "pre",
|
|
344
|
+
name: "blume:prerender-deps",
|
|
345
|
+
resolveId: {
|
|
346
|
+
filter: { id: BARE_SPECIFIER },
|
|
347
|
+
async handler(source, importer, options) {
|
|
348
|
+
const environment = this.environment?.name;
|
|
349
|
+
if (environment === undefined || environment === "client") {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
const resolved = await this.resolve(source, importer, {
|
|
353
|
+
...options,
|
|
354
|
+
skipSelf: true,
|
|
355
|
+
});
|
|
356
|
+
if (resolved?.external) {
|
|
357
|
+
record(environment, source, importer);
|
|
358
|
+
}
|
|
359
|
+
return resolved;
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
async writeBundle(options) {
|
|
363
|
+
const environment = this?.environment?.name;
|
|
364
|
+
const { dir } = options;
|
|
365
|
+
const serverSide =
|
|
366
|
+
environment === undefined
|
|
367
|
+
? dir !== undefined && basename(dir) === ".prerender"
|
|
368
|
+
: environment !== "client";
|
|
369
|
+
if (!dir || !serverSide) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
await linkRenderDeps(
|
|
373
|
+
dir,
|
|
374
|
+
imported.get(environment ?? "") ?? new Map<string, string>(),
|
|
375
|
+
pkgDir
|
|
376
|
+
);
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
};
|