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,136 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import { hasSources, missingSourcesIssue } from "./options.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* What the generated Scalar page imports. Declared on every `scalar()`
|
|
9
|
+
* descriptor so the generated project lists it, which is what lets Astro's
|
|
10
|
+
* framework-package crawl bundle the embed.
|
|
11
|
+
*/
|
|
12
|
+
export const SCALAR_RUNTIME_DEPS: readonly string[] = ["@scalar/astro"];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A single document rendered by a `scalar()` reference. Scalar reads OpenAPI
|
|
16
|
+
* and AsyncAPI documents and detects which it was given, so there is one
|
|
17
|
+
* source shape for both. The embed sits outside Blume's search and llms.txt,
|
|
18
|
+
* so of the native per-source controls only `noindex` applies here.
|
|
19
|
+
*/
|
|
20
|
+
export const scalarSourceSchema = z.strictObject({
|
|
21
|
+
/** Nav/section label for this source. */
|
|
22
|
+
label: z.string().optional(),
|
|
23
|
+
/** Emit noindex metadata and omit the page from the sitemap. */
|
|
24
|
+
noindex: z.boolean().default(false),
|
|
25
|
+
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
26
|
+
route: z.string().optional(),
|
|
27
|
+
/** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
|
|
28
|
+
spec: z.string(),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/** One document source, as `scalar()` accepts it. */
|
|
32
|
+
export interface ScalarSourceOptions {
|
|
33
|
+
/** Nav/section label for this source. */
|
|
34
|
+
label?: string;
|
|
35
|
+
/** Emit noindex metadata and omit the page from the sitemap. Defaults to `false`. */
|
|
36
|
+
noindex?: boolean;
|
|
37
|
+
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
38
|
+
route?: string;
|
|
39
|
+
/** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
|
|
40
|
+
spec: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A source with every default applied. */
|
|
44
|
+
export type ResolvedScalarSource = z.output<typeof scalarSourceSchema>;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* `scalar()` options with every default applied and `spec` folded into
|
|
48
|
+
* `sources`; every key beyond the named ones is forwarded Scalar config.
|
|
49
|
+
*/
|
|
50
|
+
export type ResolvedScalarOptions = {
|
|
51
|
+
route: string;
|
|
52
|
+
sources: ResolvedScalarSource[];
|
|
53
|
+
theme?: string;
|
|
54
|
+
} & { [option: string]: JsonValue };
|
|
55
|
+
|
|
56
|
+
/** The options {@link scalar} maps itself. */
|
|
57
|
+
export interface ScalarNamedOptions {
|
|
58
|
+
/** Where the reference mounts. Defaults to `/reference`. */
|
|
59
|
+
route?: string;
|
|
60
|
+
/** One or more documents; each renders on its own route by default. */
|
|
61
|
+
sources?: ScalarSourceOptions[];
|
|
62
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
63
|
+
spec?: string;
|
|
64
|
+
/** A Scalar theme name (`purple`, `moon`, …). Unset keeps Scalar's default theme with Blume's accent and radius layered on top. */
|
|
65
|
+
theme?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Options for {@link scalar}: the source, route, and `theme` Blume maps, plus
|
|
70
|
+
* any other [Scalar configuration](https://github.com/scalar/scalar/blob/main/documentation/configuration.md)
|
|
71
|
+
* key, forwarded verbatim to the embedded `<ScalarComponent>` (`localization`,
|
|
72
|
+
* `agent`, `hideTestRequestButton`, `orderSchemaPropertiesBy`, …). Blume
|
|
73
|
+
* doesn't mirror Scalar's config surface, so this is a full escape hatch: a
|
|
74
|
+
* forwarded key wins over Blume's own derived spec/theme config. JSON values
|
|
75
|
+
* only — the configuration is inlined into the generated page. `sources` is
|
|
76
|
+
* Blume's (one page per document); Scalar's own multi-document `sources`
|
|
77
|
+
* can't be forwarded.
|
|
78
|
+
*/
|
|
79
|
+
export type ScalarOptions = ScalarNamedOptions & {
|
|
80
|
+
[option: string]: JsonValue;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* `spec` is the single-source shorthand and folds into `sources` at parse
|
|
85
|
+
* (through the source schema, so the two can never drift); every key beyond
|
|
86
|
+
* the named ones is Scalar configuration and passes through untouched.
|
|
87
|
+
*/
|
|
88
|
+
export const scalarOptionsSchema = z
|
|
89
|
+
.object({
|
|
90
|
+
/** Where the reference mounts. */
|
|
91
|
+
route: z.string().default("/reference"),
|
|
92
|
+
/** One or more documents; each renders on its own route by default. */
|
|
93
|
+
sources: z.array(scalarSourceSchema).default([]),
|
|
94
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
95
|
+
spec: z.string().optional(),
|
|
96
|
+
/** A Scalar theme name; unset layers Blume's accent and radius on Scalar's default theme. */
|
|
97
|
+
theme: z.string().optional(),
|
|
98
|
+
})
|
|
99
|
+
.catchall(z.json())
|
|
100
|
+
.transform(({ spec, sources, ...options }): ResolvedScalarOptions => ({
|
|
101
|
+
...options,
|
|
102
|
+
sources:
|
|
103
|
+
spec === undefined
|
|
104
|
+
? sources
|
|
105
|
+
: [scalarSourceSchema.parse({ spec }), ...sources],
|
|
106
|
+
}))
|
|
107
|
+
.refine(hasSources, missingSourcesIssue("scalar"));
|
|
108
|
+
|
|
109
|
+
export type ScalarAdapter = AdapterDescriptor<"scalar", ScalarOptions>;
|
|
110
|
+
|
|
111
|
+
/** A `scalar()` descriptor as the config schema resolves it. */
|
|
112
|
+
export type ResolvedScalarAdapter = AdapterDescriptor<
|
|
113
|
+
"scalar",
|
|
114
|
+
ResolvedScalarOptions
|
|
115
|
+
>;
|
|
116
|
+
|
|
117
|
+
export const scalarAdapterSchema = adapterDescriptorSchema(
|
|
118
|
+
"scalar",
|
|
119
|
+
scalarOptionsSchema
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* An API reference rendered by [Scalar](https://scalar.com)'s self-contained
|
|
124
|
+
* UI — its own sidebar, search, theme, and request client on a single route —
|
|
125
|
+
* instead of Blume's native operation pages. Takes an OpenAPI or AsyncAPI
|
|
126
|
+
* document (Scalar detects which); a GraphQL schema has no Scalar embed.
|
|
127
|
+
* Blume's per-page controls don't apply: the embed doesn't weave into the
|
|
128
|
+
* sidebar, search, or llms.txt, and it brings its own request client in place
|
|
129
|
+
* of the Try it playground.
|
|
130
|
+
*/
|
|
131
|
+
export const scalar = (options: ScalarOptions): ScalarAdapter => ({
|
|
132
|
+
kind: "scalar",
|
|
133
|
+
options,
|
|
134
|
+
requiredSecrets: [],
|
|
135
|
+
runtimeDeps: [...SCALAR_RUNTIME_DEPS],
|
|
136
|
+
});
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { unrecognizedKeysMessage } from "../core/unrecognized-keys.ts";
|
|
4
|
+
import { asyncapiAdapterSchema } from "./asyncapi.ts";
|
|
5
|
+
import type { AsyncApiAdapter, ResolvedAsyncApiAdapter } from "./asyncapi.ts";
|
|
6
|
+
import { graphqlAdapterSchema } from "./graphql.ts";
|
|
7
|
+
import type { GraphqlAdapter, ResolvedGraphqlAdapter } from "./graphql.ts";
|
|
8
|
+
import { openapiAdapterSchema } from "./openapi.ts";
|
|
9
|
+
import type { OpenApiAdapter, ResolvedOpenApiAdapter } from "./openapi.ts";
|
|
10
|
+
import { SCALAR_RUNTIME_DEPS, scalarAdapterSchema } from "./scalar.ts";
|
|
11
|
+
import type { ResolvedScalarAdapter, ScalarAdapter } from "./scalar.ts";
|
|
12
|
+
|
|
13
|
+
/** Every descriptor a `blume/reference` factory can return. */
|
|
14
|
+
export type ReferenceAdapter =
|
|
15
|
+
| AsyncApiAdapter
|
|
16
|
+
| GraphqlAdapter
|
|
17
|
+
| OpenApiAdapter
|
|
18
|
+
| ScalarAdapter;
|
|
19
|
+
|
|
20
|
+
/** What `config.reference` holds: each descriptor with its options resolved. */
|
|
21
|
+
export type ResolvedReferenceAdapter =
|
|
22
|
+
| ResolvedAsyncApiAdapter
|
|
23
|
+
| ResolvedGraphqlAdapter
|
|
24
|
+
| ResolvedOpenApiAdapter
|
|
25
|
+
| ResolvedScalarAdapter;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* One configured reference adapter, as its factory returned it. Only `kind`
|
|
29
|
+
* and `options` carry information — the metadata lists are validated for
|
|
30
|
+
* shape, then re-derived from the resolved options so a descriptor that went
|
|
31
|
+
* through JSON resolves to the same canonical metadata the factory ships.
|
|
32
|
+
*/
|
|
33
|
+
export const referenceAdapterSchema = z
|
|
34
|
+
.discriminatedUnion("kind", [
|
|
35
|
+
asyncapiAdapterSchema,
|
|
36
|
+
graphqlAdapterSchema,
|
|
37
|
+
openapiAdapterSchema,
|
|
38
|
+
scalarAdapterSchema,
|
|
39
|
+
])
|
|
40
|
+
.transform((value): ResolvedReferenceAdapter => ({
|
|
41
|
+
...value,
|
|
42
|
+
requiredSecrets: [],
|
|
43
|
+
// Blume's own renderer parses at generate time and needs nothing; the
|
|
44
|
+
// Scalar embed is imported by its generated page.
|
|
45
|
+
runtimeDeps: value.kind === "scalar" ? [...SCALAR_RUNTIME_DEPS] : [],
|
|
46
|
+
}));
|
|
47
|
+
|
|
48
|
+
const LIST_HINT =
|
|
49
|
+
'reference is a list of adapters — e.g. `reference: [openapi({ spec }), asyncapi({ spec }), graphql({ spec, endpoint }), scalar({ spec })]`, imported from "blume/reference".';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* `blume.config.reference`: the API references to render, in order. Unset
|
|
53
|
+
* means none. A non-array fails with the list hint; element errors keep their
|
|
54
|
+
* own messages.
|
|
55
|
+
*/
|
|
56
|
+
export const referenceConfigSchema = z
|
|
57
|
+
.array(referenceAdapterSchema, {
|
|
58
|
+
error: (issue) => (issue.code === "invalid_type" ? LIST_HINT : undefined),
|
|
59
|
+
})
|
|
60
|
+
.default([]);
|
|
61
|
+
|
|
62
|
+
/** The top-level keys the `reference` list replaced. */
|
|
63
|
+
const REMOVED_KEYS: readonly string[] = ["asyncapi", "graphql", "openapi"];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The hint for a config still carrying the 1.x `openapi`/`asyncapi`/`graphql`
|
|
67
|
+
* blocks, or `undefined` when none of the unrecognized keys is one of them
|
|
68
|
+
* (so the default "unrecognized key" message applies). Wired into the root
|
|
69
|
+
* config object's error hook: the keys are gone from the schema, so without
|
|
70
|
+
* this a migrating site would see only "Unrecognized key". Any other unknown
|
|
71
|
+
* key keeps Zod's wording beside the hint, and the rest of the config is
|
|
72
|
+
* still validated in the same run.
|
|
73
|
+
*/
|
|
74
|
+
export const removedReferenceKeysHint = (
|
|
75
|
+
keys: string[]
|
|
76
|
+
): string | undefined => {
|
|
77
|
+
const removed = REMOVED_KEYS.filter((key) => keys.includes(key));
|
|
78
|
+
if (removed.length === 0) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const list = removed.map((key) => `\`${key}\``).join(", ");
|
|
82
|
+
const factories = removed.map((key) => `${key}({ … })`).join(", ");
|
|
83
|
+
const hint = `The top-level ${list} config was replaced by \`reference\`, a list of adapters imported from "blume/reference": \`reference: [${factories}]\`. Each block's options move onto its factory unchanged (\`enabled\` is gone — an adapter in the list is enabled), and a block with \`renderer: "scalar"\` becomes its own \`scalar({ spec, theme, …scalar })\` adapter in the list.`;
|
|
84
|
+
const others = keys.filter((key) => !REMOVED_KEYS.includes(key));
|
|
85
|
+
return others.length > 0
|
|
86
|
+
? `${hint} ${unrecognizedKeysMessage(others)}`
|
|
87
|
+
: hint;
|
|
88
|
+
};
|
package/src/registry/eject.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
exampleScanRoots,
|
|
17
17
|
} from "../astro/examples.ts";
|
|
18
18
|
import {
|
|
19
|
+
analyzeComponentsFile,
|
|
19
20
|
buildRuntimeData,
|
|
20
21
|
clientFeaturesFor,
|
|
21
22
|
collectStaged,
|
|
@@ -37,8 +38,6 @@ import {
|
|
|
37
38
|
examplesPageTemplate,
|
|
38
39
|
exampleWrapperTemplate,
|
|
39
40
|
featuresTemplate,
|
|
40
|
-
islandMapTemplate,
|
|
41
|
-
islandWrapperTemplate,
|
|
42
41
|
mcpEndpointTemplate,
|
|
43
42
|
mcpPageFile,
|
|
44
43
|
mixedbreadSearchEndpointTemplate,
|
|
@@ -46,6 +45,7 @@ import {
|
|
|
46
45
|
ogEndpointTemplate,
|
|
47
46
|
rawMarkdownEndpointTemplate,
|
|
48
47
|
rssEndpointTemplate,
|
|
48
|
+
runtimeDependencies,
|
|
49
49
|
runtimeTsconfigTemplate,
|
|
50
50
|
searchClientTemplate,
|
|
51
51
|
searchEndpointTemplate,
|
|
@@ -55,6 +55,10 @@ import { buildIncludeGraph } from "../core/includes.ts";
|
|
|
55
55
|
import { packageRoot } from "../core/package-root.ts";
|
|
56
56
|
import { scanProject } from "../core/project-graph.ts";
|
|
57
57
|
import type { BlumeProject } from "../core/project-graph.ts";
|
|
58
|
+
import {
|
|
59
|
+
resolveDocsCollection,
|
|
60
|
+
sourcesOfKind,
|
|
61
|
+
} from "../core/sources/collection.ts";
|
|
58
62
|
import type { ProjectContext } from "../core/types.ts";
|
|
59
63
|
import { buildRssFeeds, renderRssFeed } from "../deploy/rss.ts";
|
|
60
64
|
import type { OpenApiData } from "../openapi/model.ts";
|
|
@@ -62,7 +66,6 @@ import { hasScalarReferences } from "../openapi/references.ts";
|
|
|
62
66
|
import { buildReferenceFiles } from "../openapi/scalar.ts";
|
|
63
67
|
import { isOpenApiSource } from "../openapi/source.ts";
|
|
64
68
|
import { buildSearchDocuments } from "../search/documents.ts";
|
|
65
|
-
import { servesStaticIndex } from "../search/providers.ts";
|
|
66
69
|
import {
|
|
67
70
|
examplesEntryTemplate,
|
|
68
71
|
tailwindEntryTemplate,
|
|
@@ -113,16 +116,16 @@ const ejectOpenApiData = (project: BlumeProject): OpenApiData => {
|
|
|
113
116
|
};
|
|
114
117
|
|
|
115
118
|
/**
|
|
116
|
-
* The
|
|
117
|
-
* its grounding snapshot. Empty when
|
|
119
|
+
* The assistant endpoint plus, unless the backend runs its own retrieval (Inkeep),
|
|
120
|
+
* its grounding snapshot. Empty when the assistant is disabled.
|
|
118
121
|
*/
|
|
119
122
|
const askFiles = async (
|
|
120
123
|
project: BlumeProject,
|
|
121
124
|
srcDir: string,
|
|
122
125
|
genDir: string
|
|
123
126
|
): Promise<{ content: string; path: string }[]> => {
|
|
124
|
-
const {
|
|
125
|
-
if (!(
|
|
127
|
+
const { assistant } = project.config.ai;
|
|
128
|
+
if (!(assistant?.enabled && !assistant.endpoint)) {
|
|
126
129
|
const endpointPath = join(srcDir, "pages", "api", "ask.ts");
|
|
127
130
|
if (existsSync(endpointPath)) {
|
|
128
131
|
const content = await readFile(endpointPath, "utf-8");
|
|
@@ -133,19 +136,18 @@ const askFiles = async (
|
|
|
133
136
|
await rm(join(genDir, "ask-data.json"), { force: true });
|
|
134
137
|
return [];
|
|
135
138
|
}
|
|
136
|
-
const
|
|
139
|
+
const backend = resolveAskBackend(assistant.provider);
|
|
137
140
|
const files = [
|
|
138
141
|
{
|
|
139
|
-
content: askEndpointTemplate(
|
|
140
|
-
cors:
|
|
141
|
-
instructions:
|
|
142
|
-
|
|
143
|
-
retrieval: ask.retrieval,
|
|
142
|
+
content: askEndpointTemplate(backend, {
|
|
143
|
+
cors: assistant.cors,
|
|
144
|
+
instructions: assistant.instructions,
|
|
145
|
+
retrieval: assistant.retrieval,
|
|
144
146
|
}),
|
|
145
147
|
path: join(srcDir, "pages", "api", "ask.ts"),
|
|
146
148
|
},
|
|
147
149
|
];
|
|
148
|
-
if (grounded) {
|
|
150
|
+
if (backend.grounded) {
|
|
149
151
|
files.push({
|
|
150
152
|
content: `${JSON.stringify(await buildAskData(project))}\n`,
|
|
151
153
|
path: join(genDir, "ask-data.json"),
|
|
@@ -159,8 +161,12 @@ const hostsMcp = (
|
|
|
159
161
|
project: BlumeProject,
|
|
160
162
|
userPages: { pattern: string }[]
|
|
161
163
|
): boolean =>
|
|
162
|
-
project.config.
|
|
163
|
-
!routeIsTaken(
|
|
164
|
+
project.config.agents.mcp.enabled &&
|
|
165
|
+
!routeIsTaken(
|
|
166
|
+
userPages,
|
|
167
|
+
project.graph.pages,
|
|
168
|
+
project.config.agents.mcp.route
|
|
169
|
+
);
|
|
164
170
|
|
|
165
171
|
/**
|
|
166
172
|
* The `.well-known` MCP discovery routes, injected as prerendered pages
|
|
@@ -198,7 +204,7 @@ const mcpFiles = async (
|
|
|
198
204
|
if (!hostsMcp(project, userPages)) {
|
|
199
205
|
return [];
|
|
200
206
|
}
|
|
201
|
-
const { route } = project.config.
|
|
207
|
+
const { route } = project.config.agents.mcp;
|
|
202
208
|
const data = await buildMcpData(project);
|
|
203
209
|
const discoveryInput = {
|
|
204
210
|
base: data.base,
|
|
@@ -243,9 +249,8 @@ const changelogFiles = (
|
|
|
243
249
|
page.contentType === "changelog" &&
|
|
244
250
|
!(page.meta.draft || page.meta.sidebar.hidden)
|
|
245
251
|
);
|
|
246
|
-
const hasChangelogSource =
|
|
247
|
-
(
|
|
248
|
-
);
|
|
252
|
+
const hasChangelogSource =
|
|
253
|
+
sourcesOfKind(project.config, "github-releases").length > 0;
|
|
249
254
|
if (
|
|
250
255
|
!(hasChangelog || hasChangelogSource) ||
|
|
251
256
|
routeIsTaken(userPages, project.graph.pages, "/changelog")
|
|
@@ -302,6 +307,36 @@ const examplesPreviewFiles = (
|
|
|
302
307
|
]
|
|
303
308
|
: [];
|
|
304
309
|
|
|
310
|
+
/**
|
|
311
|
+
* The packages the ejected app imports by bare name: Astro, Tailwind's Vite
|
|
312
|
+
* plugin, `blume` itself, the integrations the config wires in, whatever the
|
|
313
|
+
* configured adapters declare, and React when islands, examples, or the assistant
|
|
314
|
+
* render with it (Blume ships React, so projects rarely list it). They have
|
|
315
|
+
* to be the project's own dependencies after eject — under a strict linker
|
|
316
|
+
* such as pnpm nothing else makes them resolvable, and `astro build` fails.
|
|
317
|
+
* The hidden runtime reaches the same packages through its `node_modules`
|
|
318
|
+
* junction into Blume's own, so only eject declares the ones its generated
|
|
319
|
+
* files import directly: the AI SDK the assistant route streams through (unless
|
|
320
|
+
* `ai.assistant.endpoint` points elsewhere, when no route is written) and the EPUB
|
|
321
|
+
* generator's browser bundle `features.ts` loads.
|
|
322
|
+
*/
|
|
323
|
+
const ejectDependencies = (
|
|
324
|
+
options: Parameters<typeof runtimeDependencies>[0]
|
|
325
|
+
): string[] => {
|
|
326
|
+
const { assistant } = options.config.ai;
|
|
327
|
+
return [
|
|
328
|
+
...new Set([
|
|
329
|
+
"astro",
|
|
330
|
+
"@tailwindcss/vite",
|
|
331
|
+
"blume",
|
|
332
|
+
...runtimeDependencies(options),
|
|
333
|
+
...(options.needsReact ? ["react", "react-dom"] : []),
|
|
334
|
+
...(assistant?.enabled && !assistant.endpoint ? ["ai"] : []),
|
|
335
|
+
...(options.config.export.epub ? ["epub-gen-memory"] : []),
|
|
336
|
+
]),
|
|
337
|
+
];
|
|
338
|
+
};
|
|
339
|
+
|
|
305
340
|
const ejectIntegrationBridge = (
|
|
306
341
|
config: BlumeProject["config"],
|
|
307
342
|
root: string,
|
|
@@ -318,17 +353,18 @@ const ejectIntegrationBridge = (
|
|
|
318
353
|
*
|
|
319
354
|
* Returns the written files plus non-fatal warnings, mirroring the generated
|
|
320
355
|
* runtime (e.g. a Scalar reference spec that wasn't found, or a reference
|
|
321
|
-
* route colliding with a content page)
|
|
356
|
+
* route colliding with a content page), and the packages the ejected app
|
|
357
|
+
* imports by bare name, for the caller to add to package.json.
|
|
322
358
|
*/
|
|
323
359
|
export const eject = async (
|
|
324
360
|
root: string
|
|
325
|
-
): Promise<{ files: string[]; warnings: string[] }> => {
|
|
361
|
+
): Promise<{ dependencies: string[]; files: string[]; warnings: string[] }> => {
|
|
326
362
|
const project = await scanProject(root, { mode: "build" });
|
|
327
363
|
const { context, config } = project;
|
|
328
364
|
|
|
329
365
|
const srcDir = join(root, "src");
|
|
330
366
|
const genDir = join(srcDir, "generated");
|
|
331
|
-
const
|
|
367
|
+
const assistantEnabled = config.ai.assistant?.enabled ?? false;
|
|
332
368
|
const exportPdf = config.export.pdf;
|
|
333
369
|
const exportEpub = config.export.epub;
|
|
334
370
|
|
|
@@ -345,6 +381,7 @@ export const eject = async (
|
|
|
345
381
|
userExamplesCss,
|
|
346
382
|
rawMarkdown,
|
|
347
383
|
islands,
|
|
384
|
+
overrideAnalysis,
|
|
348
385
|
] = await Promise.all([
|
|
349
386
|
context.pagesRoot ? discoverPages(context.pagesRoot) : Promise.resolve([]),
|
|
350
387
|
detectNeedsReact(root),
|
|
@@ -356,14 +393,23 @@ export const eject = async (
|
|
|
356
393
|
),
|
|
357
394
|
buildRawMarkdown(project),
|
|
358
395
|
discoverIslands(root),
|
|
396
|
+
analyzeComponentsFile(context.componentsFile),
|
|
359
397
|
]);
|
|
360
|
-
//
|
|
361
|
-
//
|
|
398
|
+
// The `islands/` convention and `components.ts` share the same static plan
|
|
399
|
+
// the CLI uses, with every import written relative to its generated file so
|
|
400
|
+
// the ejected app builds from any checkout (like the example wrappers below).
|
|
401
|
+
const slotPlan = planComponentSlots(islands.islands, overrideAnalysis, {
|
|
402
|
+
relativeTo: genDir,
|
|
403
|
+
});
|
|
404
|
+
// Island/example/override frameworks drive which Astro renderers the ejected
|
|
405
|
+
// config wires in; React also switches on for project `.tsx`/`.jsx` and the assistant.
|
|
362
406
|
const frameworks = new Set<string>([
|
|
363
407
|
...islands.islands.map((island) => island.framework),
|
|
364
408
|
...examples.examples.map((example) => example.framework),
|
|
409
|
+
...slotPlan.frameworks,
|
|
365
410
|
]);
|
|
366
|
-
const needsReact =
|
|
411
|
+
const needsReact =
|
|
412
|
+
needsReactRaw || assistantEnabled || frameworks.has("react");
|
|
367
413
|
const needsVue = frameworks.has("vue");
|
|
368
414
|
const needsSvelte = frameworks.has("svelte");
|
|
369
415
|
|
|
@@ -371,13 +417,22 @@ export const eject = async (
|
|
|
371
417
|
const relContext: ProjectContext = {
|
|
372
418
|
...context,
|
|
373
419
|
contentRoot: toPosix(relative(root, context.contentRoot)),
|
|
420
|
+
distDir: "./dist",
|
|
374
421
|
outDir: ".",
|
|
422
|
+
pagesRoot: context.pagesRoot
|
|
423
|
+
? `./${toPosix(relative(root, context.pagesRoot))}`
|
|
424
|
+
: null,
|
|
375
425
|
root: ".",
|
|
376
426
|
};
|
|
427
|
+
// The `docs` collection resolves its base against the real project root and
|
|
428
|
+
// is then relativized like everything else, so the ejected content config
|
|
429
|
+
// never bakes in the absolute path `eject` happened to run from.
|
|
430
|
+
const docsCollection = resolveDocsCollection(config, root);
|
|
431
|
+
const relCollection = {
|
|
432
|
+
...docsCollection,
|
|
433
|
+
base: toPosix(relative(root, docsCollection.base)),
|
|
434
|
+
};
|
|
377
435
|
|
|
378
|
-
const componentsImport = context.componentsFile
|
|
379
|
-
? `../../${toPosix(relative(root, context.componentsFile))}`
|
|
380
|
-
: null;
|
|
381
436
|
const relPages = [
|
|
382
437
|
...pages.map((page) => ({
|
|
383
438
|
entrypoint: toPosix(relative(root, page.entrypoint)),
|
|
@@ -437,6 +492,7 @@ export const eject = async (
|
|
|
437
492
|
},
|
|
438
493
|
{
|
|
439
494
|
content: contentConfigTemplate({
|
|
495
|
+
collection: relCollection,
|
|
440
496
|
config,
|
|
441
497
|
context: relContext,
|
|
442
498
|
staged: hasStaged,
|
|
@@ -454,18 +510,11 @@ export const eject = async (
|
|
|
454
510
|
path: join(srcDir, "pages", "[...slug].astro"),
|
|
455
511
|
},
|
|
456
512
|
{
|
|
457
|
-
|
|
458
|
-
// components file); hydration/island wrappers would need machine-specific
|
|
459
|
-
// absolute paths, so the ejected app owns and wires those itself.
|
|
460
|
-
content: planComponentSlots(componentsImport, null).module,
|
|
513
|
+
content: slotPlan.module,
|
|
461
514
|
path: join(genDir, "components.ts"),
|
|
462
515
|
},
|
|
463
|
-
//
|
|
464
|
-
//
|
|
465
|
-
{
|
|
466
|
-
content: islandMapTemplate(islands.islands),
|
|
467
|
-
path: join(genDir, "islands.ts"),
|
|
468
|
-
},
|
|
516
|
+
// The example map the catch-all imports; written even when empty so the
|
|
517
|
+
// `blume:examples` alias always resolves.
|
|
469
518
|
{
|
|
470
519
|
content: exampleMapTemplate(examples.examples, config.basePath),
|
|
471
520
|
path: join(genDir, "examples.ts"),
|
|
@@ -502,7 +551,7 @@ export const eject = async (
|
|
|
502
551
|
// The header's Ask trigger behind the `blume:ask` alias. Always written — it
|
|
503
552
|
// renders nothing when Ask is off — so the alias always resolves.
|
|
504
553
|
{
|
|
505
|
-
content: askComponentTemplate(
|
|
554
|
+
content: askComponentTemplate(assistantEnabled),
|
|
506
555
|
path: join(genDir, "Ask.astro"),
|
|
507
556
|
},
|
|
508
557
|
{
|
|
@@ -532,7 +581,7 @@ export const eject = async (
|
|
|
532
581
|
},
|
|
533
582
|
];
|
|
534
583
|
|
|
535
|
-
if (
|
|
584
|
+
if (assistantEnabled) {
|
|
536
585
|
files.push(...(await askFiles(project, srcDir, genDir)));
|
|
537
586
|
}
|
|
538
587
|
|
|
@@ -553,7 +602,6 @@ export const eject = async (
|
|
|
553
602
|
...changelogFiles(project, pages, srcDir, {
|
|
554
603
|
exportEpub,
|
|
555
604
|
exportPdf,
|
|
556
|
-
mathEnabled: usesMath,
|
|
557
605
|
needsReact,
|
|
558
606
|
staged: hasStaged,
|
|
559
607
|
})
|
|
@@ -582,7 +630,8 @@ export const eject = async (
|
|
|
582
630
|
}
|
|
583
631
|
);
|
|
584
632
|
|
|
585
|
-
|
|
633
|
+
const searchAdapter = config.search.provider;
|
|
634
|
+
if (searchAdapter.mode === "static") {
|
|
586
635
|
const documents = await buildSearchDocuments(project);
|
|
587
636
|
files.push(
|
|
588
637
|
{
|
|
@@ -596,11 +645,9 @@ export const eject = async (
|
|
|
596
645
|
);
|
|
597
646
|
}
|
|
598
647
|
|
|
599
|
-
if (
|
|
648
|
+
if (searchAdapter.kind === "mixedbread") {
|
|
600
649
|
files.push({
|
|
601
|
-
content: mixedbreadSearchEndpointTemplate(
|
|
602
|
-
config.search.mixedbread?.storeId ?? ""
|
|
603
|
-
),
|
|
650
|
+
content: mixedbreadSearchEndpointTemplate(searchAdapter.options),
|
|
604
651
|
path: join(srcDir, "pages", "api", "search.ts"),
|
|
605
652
|
});
|
|
606
653
|
}
|
|
@@ -642,14 +689,14 @@ export const eject = async (
|
|
|
642
689
|
}
|
|
643
690
|
}
|
|
644
691
|
|
|
645
|
-
// Per-
|
|
692
|
+
// Per-override and per-example live wrappers referenced by the maps above.
|
|
646
693
|
files.push(
|
|
647
|
-
...
|
|
648
|
-
content:
|
|
649
|
-
path: join(genDir, "
|
|
694
|
+
...slotPlan.wrappers.map((wrapper) => ({
|
|
695
|
+
content: wrapper.content,
|
|
696
|
+
path: join(genDir, "component-slots", `${wrapper.name}.astro`),
|
|
650
697
|
})),
|
|
651
698
|
...examples.examples.map((example) => ({
|
|
652
|
-
content: exampleWrapperTemplate(example),
|
|
699
|
+
content: exampleWrapperTemplate(example, join(genDir, "examples")),
|
|
653
700
|
path: join(genDir, "examples", `${exampleSlug(example.path)}.astro`),
|
|
654
701
|
})),
|
|
655
702
|
...examplesPreviewFiles(
|
|
@@ -688,5 +735,14 @@ export const eject = async (
|
|
|
688
735
|
// The hidden runtime is no longer the source of truth.
|
|
689
736
|
await rm(context.outDir, { force: true, recursive: true });
|
|
690
737
|
|
|
691
|
-
return {
|
|
738
|
+
return {
|
|
739
|
+
dependencies: ejectDependencies({
|
|
740
|
+
config,
|
|
741
|
+
needsReact,
|
|
742
|
+
needsSvelte,
|
|
743
|
+
needsVue,
|
|
744
|
+
}),
|
|
745
|
+
files: written.map((file) => file.path),
|
|
746
|
+
warnings,
|
|
747
|
+
};
|
|
692
748
|
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { JsonValue } from "../../core/adapter.ts";
|
|
4
|
+
import type { SearchAdapter } from "./types.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Public Algolia credentials. The browser queries the index with the
|
|
8
|
+
* search-only `apiKey`; the build-time sync replaces the index with the admin
|
|
9
|
+
* key from `ALGOLIA_ADMIN_API_KEY`, which never enters the config.
|
|
10
|
+
*/
|
|
11
|
+
export interface AlgoliaNamedOptions {
|
|
12
|
+
appId: string;
|
|
13
|
+
/** The search-only API key (public — it ships to the browser). */
|
|
14
|
+
apiKey: string;
|
|
15
|
+
indexName: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Options for {@link algolia}: the named options plus any other client
|
|
20
|
+
* option, forwarded to the browser verbatim. JSON values only.
|
|
21
|
+
*/
|
|
22
|
+
export type AlgoliaOptions = AlgoliaNamedOptions & {
|
|
23
|
+
[option: string]: JsonValue;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type AlgoliaAdapter = SearchAdapter<"algolia", "hosted", AlgoliaOptions>;
|
|
27
|
+
|
|
28
|
+
export const algoliaOptionsSchema = z
|
|
29
|
+
.object({
|
|
30
|
+
apiKey: z.string(),
|
|
31
|
+
appId: z.string(),
|
|
32
|
+
indexName: z.string(),
|
|
33
|
+
})
|
|
34
|
+
.catchall(z.json());
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Hosted search on Algolia. Each `blume build` replaces the whole index with
|
|
38
|
+
* the current records, so deleted or renamed pages don't linger as stale hits.
|
|
39
|
+
*/
|
|
40
|
+
export const algolia = (options: AlgoliaOptions): AlgoliaAdapter => ({
|
|
41
|
+
kind: "algolia",
|
|
42
|
+
mode: "hosted",
|
|
43
|
+
options,
|
|
44
|
+
requiredSecrets: [],
|
|
45
|
+
runtimeDeps: ["algoliasearch"],
|
|
46
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { KeylessSearchOptions, SearchAdapter } from "./types.ts";
|
|
4
|
+
|
|
5
|
+
/** FlexSearch takes no options; unknown keys fail config validation. */
|
|
6
|
+
export type FlexsearchOptions = KeylessSearchOptions;
|
|
7
|
+
|
|
8
|
+
export type FlexsearchAdapter = SearchAdapter<
|
|
9
|
+
"flexsearch",
|
|
10
|
+
"static",
|
|
11
|
+
FlexsearchOptions
|
|
12
|
+
>;
|
|
13
|
+
|
|
14
|
+
export const flexsearchOptionsSchema = z.strictObject({});
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A second keyless, client-side engine. It loads the same `/blume-search.json`
|
|
18
|
+
* index Orama ships and builds a FlexSearch document index in the browser.
|
|
19
|
+
* No locale-aware tokenizer, so prefer Orama for non-Latin scripts.
|
|
20
|
+
*/
|
|
21
|
+
export const flexsearch = (
|
|
22
|
+
options: FlexsearchOptions = {}
|
|
23
|
+
): FlexsearchAdapter => ({
|
|
24
|
+
kind: "flexsearch",
|
|
25
|
+
mode: "static",
|
|
26
|
+
options,
|
|
27
|
+
requiredSecrets: [],
|
|
28
|
+
runtimeDeps: ["flexsearch"],
|
|
29
|
+
});
|