blume 1.7.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +217 -0
- package/README.md +34 -21
- package/dist/cli/chunk-11j0384y.js +148 -0
- package/dist/cli/chunk-11j0384y.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
- package/dist/cli/chunk-2q1dwty4.js +75 -0
- package/dist/cli/chunk-2q1dwty4.js.map +11 -0
- package/dist/cli/chunk-41za066z.js +122 -0
- package/dist/cli/chunk-41za066z.js.map +11 -0
- package/dist/cli/chunk-5a2z0198.js +133 -0
- package/dist/cli/chunk-5a2z0198.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
- package/dist/cli/chunk-a9kptbw5.js +361 -0
- package/dist/cli/chunk-a9kptbw5.js.map +14 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-b5aj94ah.js +91 -0
- package/dist/cli/chunk-b5aj94ah.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
- package/dist/cli/chunk-bctazmbk.js.map +10 -0
- package/dist/cli/chunk-beat36xx.js +279 -0
- package/dist/cli/chunk-beat36xx.js.map +10 -0
- package/dist/cli/chunk-bnbmcwfb.js +145 -0
- package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
- package/dist/cli/chunk-by2290sx.js +39 -0
- package/dist/cli/chunk-by2290sx.js.map +10 -0
- package/dist/cli/chunk-d1tadaw7.js +79 -0
- package/dist/cli/chunk-d1tadaw7.js.map +10 -0
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
- package/dist/cli/chunk-d80hr03s.js.map +15 -0
- package/dist/cli/chunk-ernrthtr.js +97 -0
- package/dist/cli/chunk-ernrthtr.js.map +10 -0
- package/dist/cli/chunk-f2972sbt.js +374 -0
- package/dist/cli/chunk-f2972sbt.js.map +10 -0
- package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
- package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
- package/dist/cli/chunk-nk3ts2xk.js +51 -0
- package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
- package/dist/cli/chunk-pnnvybbk.js +176 -0
- package/dist/cli/chunk-pnnvybbk.js.map +11 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
- package/dist/cli/chunk-xaz13gwg.js +12449 -0
- package/dist/cli/chunk-xaz13gwg.js.map +182 -0
- package/dist/cli/chunk-y3e45rc8.js +102 -0
- package/dist/cli/chunk-y3e45rc8.js.map +10 -0
- package/dist/cli/chunk-z01ze5c1.js +261 -0
- package/dist/cli/chunk-z01ze5c1.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +186 -515
- package/dist/types/core/config.d.ts +60 -34
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +27 -12
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +6 -2
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2282 -452
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +50 -26
- package/docs/03-upgrading.mdx +351 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +20 -8
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +1 -1
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/ask-ai.mdx +162 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/search.mdx +75 -54
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +8 -6
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +10 -5
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +11 -11
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +2 -2
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +21 -8
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +21 -22
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-data.ts +1 -1
- package/src/ai/ask.ts +624 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +4 -1
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +2 -2
- package/src/ai/skills.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +112 -345
- package/src/astro/integration.ts +2 -6
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +554 -541
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +39 -20
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +90 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +2 -2
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +2 -2
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +38 -11
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/islands/hooks.ts +25 -2
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +83 -20
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +52 -5
- package/src/components/layout/ReferenceLayout.astro +21 -12
- package/src/components/layout/RootLayout.astro +69 -66
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +72 -15
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +188 -553
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +31 -12
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +6 -2
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +517 -739
- package/src/core/server-features.ts +8 -9
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +6 -2
- package/src/core/ui-packs/bg.ts +6 -2
- package/src/core/ui-packs/bn.ts +6 -2
- package/src/core/ui-packs/ca.ts +3 -1
- package/src/core/ui-packs/cs.ts +6 -2
- package/src/core/ui-packs/da.ts +6 -2
- package/src/core/ui-packs/de.ts +6 -2
- package/src/core/ui-packs/el.ts +3 -1
- package/src/core/ui-packs/es.ts +3 -1
- package/src/core/ui-packs/fa.ts +6 -2
- package/src/core/ui-packs/fi.ts +6 -2
- package/src/core/ui-packs/fr.ts +3 -1
- package/src/core/ui-packs/he.ts +6 -2
- package/src/core/ui-packs/hi.ts +6 -2
- package/src/core/ui-packs/hr.ts +6 -2
- package/src/core/ui-packs/hu.ts +6 -2
- package/src/core/ui-packs/id.ts +6 -2
- package/src/core/ui-packs/it.ts +3 -1
- package/src/core/ui-packs/ja.ts +3 -1
- package/src/core/ui-packs/ko.ts +3 -1
- package/src/core/ui-packs/nl.ts +6 -2
- package/src/core/ui-packs/no.ts +6 -2
- package/src/core/ui-packs/pl.ts +6 -2
- package/src/core/ui-packs/pt-br.ts +3 -1
- package/src/core/ui-packs/pt.ts +3 -1
- package/src/core/ui-packs/ro.ts +6 -2
- package/src/core/ui-packs/ru.ts +6 -2
- package/src/core/ui-packs/sk.ts +6 -2
- package/src/core/ui-packs/sr.ts +6 -2
- package/src/core/ui-packs/sv.ts +6 -2
- package/src/core/ui-packs/th.ts +3 -1
- package/src/core/ui-packs/tr.ts +6 -2
- package/src/core/ui-packs/uk.ts +6 -2
- package/src/core/ui-packs/vi.ts +3 -1
- package/src/core/ui-packs/zh-tw.ts +3 -1
- package/src/core/ui-packs/zh.ts +3 -1
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +97 -42
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +6 -0
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
|
@@ -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,
|
|
@@ -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(ask.provider);
|
|
137
140
|
const files = [
|
|
138
141
|
{
|
|
139
|
-
content: askEndpointTemplate(
|
|
142
|
+
content: askEndpointTemplate(backend, {
|
|
140
143
|
cors: ask.cors,
|
|
141
144
|
instructions: ask.instructions,
|
|
142
|
-
reasoning: ask.reasoning,
|
|
143
145
|
retrieval: ask.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 Ask AI
|
|
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 Ask AI route streams through (unless
|
|
320
|
+
* `ai.ask.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 { ask } = 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
|
+
...(ask?.enabled && !ask.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,11 +353,12 @@ 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
|
|
|
@@ -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,12 +393,20 @@ 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 Ask AI.
|
|
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
411
|
const needsReact = needsReactRaw || askEnabled || frameworks.has("react");
|
|
367
412
|
const needsVue = frameworks.has("vue");
|
|
@@ -371,13 +416,22 @@ export const eject = async (
|
|
|
371
416
|
const relContext: ProjectContext = {
|
|
372
417
|
...context,
|
|
373
418
|
contentRoot: toPosix(relative(root, context.contentRoot)),
|
|
419
|
+
distDir: "./dist",
|
|
374
420
|
outDir: ".",
|
|
421
|
+
pagesRoot: context.pagesRoot
|
|
422
|
+
? `./${toPosix(relative(root, context.pagesRoot))}`
|
|
423
|
+
: null,
|
|
375
424
|
root: ".",
|
|
376
425
|
};
|
|
426
|
+
// The `docs` collection resolves its base against the real project root and
|
|
427
|
+
// is then relativized like everything else, so the ejected content config
|
|
428
|
+
// never bakes in the absolute path `eject` happened to run from.
|
|
429
|
+
const docsCollection = resolveDocsCollection(config, root);
|
|
430
|
+
const relCollection = {
|
|
431
|
+
...docsCollection,
|
|
432
|
+
base: toPosix(relative(root, docsCollection.base)),
|
|
433
|
+
};
|
|
377
434
|
|
|
378
|
-
const componentsImport = context.componentsFile
|
|
379
|
-
? `../../${toPosix(relative(root, context.componentsFile))}`
|
|
380
|
-
: null;
|
|
381
435
|
const relPages = [
|
|
382
436
|
...pages.map((page) => ({
|
|
383
437
|
entrypoint: toPosix(relative(root, page.entrypoint)),
|
|
@@ -437,6 +491,7 @@ export const eject = async (
|
|
|
437
491
|
},
|
|
438
492
|
{
|
|
439
493
|
content: contentConfigTemplate({
|
|
494
|
+
collection: relCollection,
|
|
440
495
|
config,
|
|
441
496
|
context: relContext,
|
|
442
497
|
staged: hasStaged,
|
|
@@ -454,18 +509,11 @@ export const eject = async (
|
|
|
454
509
|
path: join(srcDir, "pages", "[...slug].astro"),
|
|
455
510
|
},
|
|
456
511
|
{
|
|
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,
|
|
512
|
+
content: slotPlan.module,
|
|
461
513
|
path: join(genDir, "components.ts"),
|
|
462
514
|
},
|
|
463
|
-
//
|
|
464
|
-
//
|
|
465
|
-
{
|
|
466
|
-
content: islandMapTemplate(islands.islands),
|
|
467
|
-
path: join(genDir, "islands.ts"),
|
|
468
|
-
},
|
|
515
|
+
// The example map the catch-all imports; written even when empty so the
|
|
516
|
+
// `blume:examples` alias always resolves.
|
|
469
517
|
{
|
|
470
518
|
content: exampleMapTemplate(examples.examples, config.basePath),
|
|
471
519
|
path: join(genDir, "examples.ts"),
|
|
@@ -553,7 +601,6 @@ export const eject = async (
|
|
|
553
601
|
...changelogFiles(project, pages, srcDir, {
|
|
554
602
|
exportEpub,
|
|
555
603
|
exportPdf,
|
|
556
|
-
mathEnabled: usesMath,
|
|
557
604
|
needsReact,
|
|
558
605
|
staged: hasStaged,
|
|
559
606
|
})
|
|
@@ -582,7 +629,8 @@ export const eject = async (
|
|
|
582
629
|
}
|
|
583
630
|
);
|
|
584
631
|
|
|
585
|
-
|
|
632
|
+
const searchAdapter = config.search.provider;
|
|
633
|
+
if (searchAdapter.mode === "static") {
|
|
586
634
|
const documents = await buildSearchDocuments(project);
|
|
587
635
|
files.push(
|
|
588
636
|
{
|
|
@@ -596,11 +644,9 @@ export const eject = async (
|
|
|
596
644
|
);
|
|
597
645
|
}
|
|
598
646
|
|
|
599
|
-
if (
|
|
647
|
+
if (searchAdapter.kind === "mixedbread") {
|
|
600
648
|
files.push({
|
|
601
|
-
content: mixedbreadSearchEndpointTemplate(
|
|
602
|
-
config.search.mixedbread?.storeId ?? ""
|
|
603
|
-
),
|
|
649
|
+
content: mixedbreadSearchEndpointTemplate(searchAdapter.options),
|
|
604
650
|
path: join(srcDir, "pages", "api", "search.ts"),
|
|
605
651
|
});
|
|
606
652
|
}
|
|
@@ -642,14 +688,14 @@ export const eject = async (
|
|
|
642
688
|
}
|
|
643
689
|
}
|
|
644
690
|
|
|
645
|
-
// Per-
|
|
691
|
+
// Per-override and per-example live wrappers referenced by the maps above.
|
|
646
692
|
files.push(
|
|
647
|
-
...
|
|
648
|
-
content:
|
|
649
|
-
path: join(genDir, "
|
|
693
|
+
...slotPlan.wrappers.map((wrapper) => ({
|
|
694
|
+
content: wrapper.content,
|
|
695
|
+
path: join(genDir, "component-slots", `${wrapper.name}.astro`),
|
|
650
696
|
})),
|
|
651
697
|
...examples.examples.map((example) => ({
|
|
652
|
-
content: exampleWrapperTemplate(example),
|
|
698
|
+
content: exampleWrapperTemplate(example, join(genDir, "examples")),
|
|
653
699
|
path: join(genDir, "examples", `${exampleSlug(example.path)}.astro`),
|
|
654
700
|
})),
|
|
655
701
|
...examplesPreviewFiles(
|
|
@@ -688,5 +734,14 @@ export const eject = async (
|
|
|
688
734
|
// The hidden runtime is no longer the source of truth.
|
|
689
735
|
await rm(context.outDir, { force: true, recursive: true });
|
|
690
736
|
|
|
691
|
-
return {
|
|
737
|
+
return {
|
|
738
|
+
dependencies: ejectDependencies({
|
|
739
|
+
config,
|
|
740
|
+
needsReact,
|
|
741
|
+
needsSvelte,
|
|
742
|
+
needsVue,
|
|
743
|
+
}),
|
|
744
|
+
files: written.map((file) => file.path),
|
|
745
|
+
warnings,
|
|
746
|
+
};
|
|
692
747
|
};
|
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search adapters for `blume.config.ts`:
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defineConfig } from "blume";
|
|
6
|
+
* import { algolia } from "blume/search";
|
|
7
|
+
*
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* search: algolia({ appId: "…", apiKey: "…", indexName: "docs" }),
|
|
10
|
+
* });
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* Each factory returns a plain, JSON-serializable descriptor — never a live
|
|
14
|
+
* client — that the generated runtime inlines as a literal.
|
|
15
|
+
*/
|
|
16
|
+
export { algolia } from "./algolia.ts";
|
|
17
|
+
export type { AlgoliaAdapter, AlgoliaOptions } from "./algolia.ts";
|
|
18
|
+
export { flexsearch } from "./flexsearch.ts";
|
|
19
|
+
export type { FlexsearchAdapter, FlexsearchOptions } from "./flexsearch.ts";
|
|
20
|
+
export { mixedbread } from "./mixedbread.ts";
|
|
21
|
+
export type { MixedbreadAdapter, MixedbreadOptions } from "./mixedbread.ts";
|
|
22
|
+
export { orama } from "./orama.ts";
|
|
23
|
+
export type { OramaAdapter, OramaOptions } from "./orama.ts";
|
|
24
|
+
export { oramaCloud } from "./orama-cloud.ts";
|
|
25
|
+
export type { OramaCloudAdapter, OramaCloudOptions } from "./orama-cloud.ts";
|
|
26
|
+
export { pagefind } from "./pagefind.ts";
|
|
27
|
+
export type { PagefindAdapter, PagefindOptions } from "./pagefind.ts";
|
|
28
|
+
export type {
|
|
29
|
+
AnySearchAdapter,
|
|
30
|
+
ResolvedSearchAdapter,
|
|
31
|
+
SearchAdapterKind,
|
|
32
|
+
} from "./registry.ts";
|
|
33
|
+
export type {
|
|
34
|
+
KeylessSearchOptions,
|
|
35
|
+
SearchAdapter,
|
|
36
|
+
SearchAdapterMode,
|
|
37
|
+
} from "./types.ts";
|
|
38
|
+
export { typesense } from "./typesense.ts";
|
|
39
|
+
export type { TypesenseAdapter, TypesenseOptions } from "./typesense.ts";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { JsonValue } from "../../core/adapter.ts";
|
|
4
|
+
import type { SearchAdapter } from "./types.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The Mixedbread store the generated `/api/search` endpoint queries, plus any
|
|
8
|
+
* other option, forwarded to the endpoint verbatim. JSON values only.
|
|
9
|
+
*/
|
|
10
|
+
export interface MixedbreadOptions {
|
|
11
|
+
storeId: string;
|
|
12
|
+
[option: string]: JsonValue;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type MixedbreadAdapter = SearchAdapter<
|
|
16
|
+
"mixedbread",
|
|
17
|
+
"server",
|
|
18
|
+
MixedbreadOptions
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
export const mixedbreadOptionsSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
storeId: z.string(),
|
|
24
|
+
})
|
|
25
|
+
.catchall(z.json());
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Semantic search on Mixedbread. Queries go through a generated `/api/search`
|
|
29
|
+
* endpoint that holds `MIXEDBREAD_API_KEY`, so the adapter requires server
|
|
30
|
+
* output. Content is synced to the store out-of-band with the `mxbai` CLI,
|
|
31
|
+
* not by the build.
|
|
32
|
+
*/
|
|
33
|
+
export const mixedbread = (options: MixedbreadOptions): MixedbreadAdapter => ({
|
|
34
|
+
kind: "mixedbread",
|
|
35
|
+
mode: "server",
|
|
36
|
+
options,
|
|
37
|
+
requiredSecrets: ["MIXEDBREAD_API_KEY"],
|
|
38
|
+
runtimeDeps: ["@mixedbread/sdk"],
|
|
39
|
+
});
|