blume 1.7.2 → 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 +227 -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-xhtpx3ff.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-xhtpx3ff.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-9he6crym.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-9he6crym.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-mt76t7dj.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-3w7b2vcx.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-688e0dde.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-hs3gbh8p.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-9bkjd11x.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-9bkjd11x.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-t3tj0dgr.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-exeeb35e.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-12dxjqk7.js → chunk-fh5hj5jt.js} +44 -21
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-8cd8tj54.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/chunk-jts8mvcz.js +106 -0
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ejjx8znq.js → chunk-mnqj32sj.js} +505 -536
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-196vjxp9.js → chunk-mwt1k8n7.js} +100 -372
- 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-n9sra6sy.js → chunk-pat2zzwc.js} +10 -14
- package/dist/cli/{chunk-n9sra6sy.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-cvky9gb2.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-eevwt1sc.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-eevwt1sc.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-5n7t497w.js → chunk-z1f5arsg.js} +247 -755
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-hdm2dkd2.js → chunk-zg2gtj10.js} +1086 -2596
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-ppfvdcd4.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 +209 -505
- 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 +28 -11
- 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 +2291 -441
- 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 +20 -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 +176 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +52 -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 +37 -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 +12 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +26 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +91 -10
- package/docs/discoverability/index.mdx +5 -5
- 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 +26 -22
- package/src/ai/ai-catalog.ts +259 -0
- 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 +19 -6
- package/src/ai/llms.ts +26 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/mcp/discovery.ts +1 -1
- 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 +114 -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 -314
- 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 +75 -3
- 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 -43
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +101 -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 +212 -543
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +32 -11
- 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 +137 -19
- 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 +531 -721
- 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 +20 -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 +67 -28
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +129 -22
- 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 +27 -4
- 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 +33 -7
- 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 +47 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-12dxjqk7.js.map +0 -10
- package/dist/cli/chunk-196vjxp9.js.map +0 -13
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-30e87n55.js +0 -108
- package/dist/cli/chunk-30e87n55.js.map +0 -10
- package/dist/cli/chunk-450a7rcr.js +0 -185
- package/dist/cli/chunk-450a7rcr.js.map +0 -11
- package/dist/cli/chunk-5n7t497w.js.map +0 -40
- package/dist/cli/chunk-61j18dwk.js +0 -5342
- package/dist/cli/chunk-61j18dwk.js.map +0 -58
- package/dist/cli/chunk-88by27n5.js +0 -17
- package/dist/cli/chunk-88by27n5.js.map +0 -10
- package/dist/cli/chunk-8cd8tj54.js.map +0 -34
- package/dist/cli/chunk-aztttvb3.js +0 -381
- package/dist/cli/chunk-aztttvb3.js.map +0 -12
- package/dist/cli/chunk-cvky9gb2.js.map +0 -11
- package/dist/cli/chunk-ejjx8znq.js.map +0 -15
- package/dist/cli/chunk-fmceyezb.js +0 -1007
- package/dist/cli/chunk-fmceyezb.js.map +0 -13
- package/dist/cli/chunk-hdm2dkd2.js.map +0 -48
- package/dist/cli/chunk-hs3gbh8p.js.map +0 -10
- package/dist/cli/chunk-jbj4qhfw.js +0 -30
- package/dist/cli/chunk-jbj4qhfw.js.map +0 -10
- package/dist/cli/chunk-mqb2ka8m.js +0 -68
- package/dist/cli/chunk-mqb2ka8m.js.map +0 -10
- package/dist/cli/chunk-mt76t7dj.js.map +0 -11
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-ra1v2nc2.js +0 -35
- package/dist/cli/chunk-ra1v2nc2.js.map +0 -10
- package/dist/cli/chunk-t3tj0dgr.js.map +0 -15
- package/dist/cli/chunk-tqa1s0k8.js +0 -69
- package/dist/cli/chunk-tqa1s0k8.js.map +0 -11
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vkrsvbr5.js +0 -107
- package/dist/cli/chunk-vkrsvbr5.js.map +0 -11
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-wjt80jps.js +0 -1049
- package/dist/cli/chunk-wjt80jps.js.map +0 -24
- 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-3w7b2vcx.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-688e0dde.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-exeeb35e.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-ppfvdcd4.js.map → chunk-zxccj738.js.map} +0 -0
package/src/openapi/source.ts
CHANGED
|
@@ -27,9 +27,10 @@ import {
|
|
|
27
27
|
parseGraphqlSpec,
|
|
28
28
|
parseSpec,
|
|
29
29
|
} from "./parse.ts";
|
|
30
|
-
import type {
|
|
30
|
+
import type { BlumeReferenceSource } from "./references.ts";
|
|
31
31
|
import { operationMdx, overviewMdx } from "./render-mdx.ts";
|
|
32
32
|
import type { RenderedPage } from "./render-mdx.ts";
|
|
33
|
+
import { SpecDependencyError } from "./spec-dependency-error.ts";
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* The staged content source behind Blume's own API reference renderer (OpenAPI
|
|
@@ -38,7 +39,7 @@ import type { RenderedPage } from "./render-mdx.ts";
|
|
|
38
39
|
* first-class Blume pages (real routes, sidebar, search, i18n, OG) and the
|
|
39
40
|
* parsed documents are handed to the generated `blume:openapi` module for the
|
|
40
41
|
* UI components to render. The source keeps its historical `openapi` name for
|
|
41
|
-
* both kinds — downstream consumers (`
|
|
42
|
+
* both kinds — downstream consumers (`agents.llmsTxt.openapi`, the llms noindex
|
|
42
43
|
* exemption) key on it as "the generated API reference source".
|
|
43
44
|
*/
|
|
44
45
|
|
|
@@ -63,14 +64,14 @@ const KIND_LABELS = {
|
|
|
63
64
|
asyncapi: "AsyncAPI",
|
|
64
65
|
graphql: "GraphQL",
|
|
65
66
|
openapi: "OpenAPI",
|
|
66
|
-
} satisfies Record<
|
|
67
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
67
68
|
|
|
68
69
|
/** Diagnostic-code prefix per spec kind. */
|
|
69
70
|
const CODE_PREFIXES = {
|
|
70
71
|
asyncapi: "BLUME_ASYNCAPI",
|
|
71
72
|
graphql: "BLUME_GRAPHQL",
|
|
72
73
|
openapi: "BLUME_OPENAPI",
|
|
73
|
-
} satisfies Record<
|
|
74
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
74
75
|
|
|
75
76
|
/**
|
|
76
77
|
* Parse-level warning code per kind: an offline cache fallback for any kind,
|
|
@@ -81,7 +82,7 @@ const SPEC_WARNING_CODES = {
|
|
|
81
82
|
asyncapi: "BLUME_ASYNCAPI_SPEC_WARNING",
|
|
82
83
|
graphql: "BLUME_GRAPHQL_SPEC_WARNING",
|
|
83
84
|
openapi: "BLUME_OPENAPI_STALE",
|
|
84
|
-
} satisfies Record<
|
|
85
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
85
86
|
|
|
86
87
|
/**
|
|
87
88
|
* Extract-level skip code per kind. OpenAPI keeps its historical code (the
|
|
@@ -92,7 +93,7 @@ const SKIPPED_CODES = {
|
|
|
92
93
|
asyncapi: "BLUME_ASYNCAPI_SKIPPED_OPERATION",
|
|
93
94
|
graphql: "BLUME_GRAPHQL_SKIPPED",
|
|
94
95
|
openapi: "BLUME_OPENAPI_REF_PATH_ITEM",
|
|
95
|
-
} satisfies Record<
|
|
96
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
96
97
|
|
|
97
98
|
/** `_EMPTY` diagnostic suggestion per kind. */
|
|
98
99
|
const EMPTY_SUGGESTIONS = {
|
|
@@ -102,7 +103,7 @@ const EMPTY_SUGGESTIONS = {
|
|
|
102
103
|
"Check the spec points at a GraphQL schema (SDL or introspection JSON) whose root types declare fields.",
|
|
103
104
|
openapi:
|
|
104
105
|
"Check the spec points at an OpenAPI document with operations under `paths`.",
|
|
105
|
-
} satisfies Record<
|
|
106
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
106
107
|
|
|
107
108
|
/** `_UNAVAILABLE` suggestion for a readable-but-invalid spec, per kind. */
|
|
108
109
|
const INVALID_SUGGESTIONS = {
|
|
@@ -112,7 +113,26 @@ const INVALID_SUGGESTIONS = {
|
|
|
112
113
|
"Point the spec at a GraphQL schema — SDL text or an introspection JSON result.",
|
|
113
114
|
openapi:
|
|
114
115
|
"Point the spec at an OpenAPI document (a YAML or JSON file with an object at the top level).",
|
|
115
|
-
} satisfies Record<
|
|
116
|
+
} satisfies Record<BlumeReferenceSource["kind"], string>;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* What to suggest for a spec that failed to load: the install command when
|
|
120
|
+
* reading it needs a package the project lacks, a fix to the file when it
|
|
121
|
+
* isn't a spec of its kind, and reachability for everything else (a fetch or
|
|
122
|
+
* read failure).
|
|
123
|
+
*/
|
|
124
|
+
const failureSuggestion = (
|
|
125
|
+
error: Error,
|
|
126
|
+
kind: BlumeReferenceSource["kind"]
|
|
127
|
+
): string => {
|
|
128
|
+
if (error instanceof SpecDependencyError) {
|
|
129
|
+
return error.suggestion;
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof InvalidSpecError) {
|
|
132
|
+
return INVALID_SUGGESTIONS[kind];
|
|
133
|
+
}
|
|
134
|
+
return "Check the spec URL/path is reachable from the build environment; behind a proxy, set HTTP(S)_PROXY.";
|
|
135
|
+
};
|
|
116
136
|
|
|
117
137
|
const toEntry = (rendered: RenderedPage, ref: string): SourceEntry => {
|
|
118
138
|
const raw = matter.stringify(`${rendered.body}\n`, rendered.data);
|
|
@@ -131,7 +151,7 @@ const toEntry = (rendered: RenderedPage, ref: string): SourceEntry => {
|
|
|
131
151
|
const specEntries = (
|
|
132
152
|
spec: ApiSpecData,
|
|
133
153
|
operations: ApiOperationRef[],
|
|
134
|
-
reference:
|
|
154
|
+
reference: BlumeReferenceSource
|
|
135
155
|
): SourceEntry[] => {
|
|
136
156
|
const entries = operations.map((operation) =>
|
|
137
157
|
toEntry(
|
|
@@ -193,7 +213,7 @@ interface ParsedReference {
|
|
|
193
213
|
}
|
|
194
214
|
|
|
195
215
|
const parseReference = async (
|
|
196
|
-
reference:
|
|
216
|
+
reference: BlumeReferenceSource,
|
|
197
217
|
ctx: SourceContext
|
|
198
218
|
): Promise<ParsedReference> => {
|
|
199
219
|
const options = { cacheDir: ctx.cacheDir, refresh: ctx.refresh };
|
|
@@ -243,13 +263,13 @@ const parseReference = async (
|
|
|
243
263
|
};
|
|
244
264
|
|
|
245
265
|
export const openApiSource = (
|
|
246
|
-
references:
|
|
266
|
+
references: BlumeReferenceSource[],
|
|
247
267
|
ctx: SourceContext
|
|
248
268
|
): OpenApiContentSource => {
|
|
249
269
|
let parsed: OpenApiData = {};
|
|
250
270
|
|
|
251
271
|
const loadReference = async (
|
|
252
|
-
reference:
|
|
272
|
+
reference: BlumeReferenceSource
|
|
253
273
|
): Promise<LoadedSpec | Diagnostic> => {
|
|
254
274
|
// Human label and diagnostic-code prefix for the spec's kind, so an
|
|
255
275
|
// AsyncAPI failure never reads as an OpenAPI one.
|
|
@@ -335,21 +355,17 @@ export const openApiSource = (
|
|
|
335
355
|
spec,
|
|
336
356
|
};
|
|
337
357
|
} catch (error) {
|
|
358
|
+
// SAFETY: spec loading fails with Error instances (fetch, read, parse,
|
|
359
|
+
// and missing-package errors alike).
|
|
360
|
+
const failure = error as Error;
|
|
338
361
|
return {
|
|
339
362
|
code: `${codePrefix}_UNAVAILABLE`,
|
|
340
|
-
|
|
341
|
-
// parse errors alike); only the message is read for the diagnostic.
|
|
342
|
-
message: `Could not load ${kindLabel} spec "${reference.spec}" for ${reference.route} (${(error as Error).message}); its reference pages were skipped.`,
|
|
363
|
+
message: `Could not load ${kindLabel} spec "${reference.spec}" for ${reference.route} (${failure.message}); its reference pages were skipped.`,
|
|
343
364
|
// A configured-but-unloadable spec ships a dead nav tab (a 404 route),
|
|
344
365
|
// so fail loudly in build (blocks under --strict) while staying a warning
|
|
345
366
|
// in dev so offline work still runs.
|
|
346
367
|
severity: ctx.mode === "build" ? "error" : "warning",
|
|
347
|
-
|
|
348
|
-
// only point at reachability for actual fetch/read failures.
|
|
349
|
-
suggestion:
|
|
350
|
-
error instanceof InvalidSpecError
|
|
351
|
-
? INVALID_SUGGESTIONS[reference.kind]
|
|
352
|
-
: "Check the spec URL/path is reachable from the build environment; behind a proxy, set HTTP(S)_PROXY.",
|
|
368
|
+
suggestion: failureSuggestion(failure, reference.kind),
|
|
353
369
|
};
|
|
354
370
|
}
|
|
355
371
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a spec needs an optional package the project hasn't installed (the
|
|
3
|
+
* AsyncAPI converter, for a pre-3.0 document). Carries its own suggestion —
|
|
4
|
+
* the install command — because neither of the other spec failures fits: the
|
|
5
|
+
* file is fine and so is the network.
|
|
6
|
+
*/
|
|
7
|
+
export class SpecDependencyError extends Error {
|
|
8
|
+
readonly suggestion: string;
|
|
9
|
+
|
|
10
|
+
constructor(message: string, suggestion: string) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "SpecDependencyError";
|
|
13
|
+
this.suggestion = suggestion;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import {
|
|
6
|
+
liftSpec,
|
|
7
|
+
referenceSourceSchema,
|
|
8
|
+
hasSources,
|
|
9
|
+
missingSourcesIssue,
|
|
10
|
+
rendererRemovedHint,
|
|
11
|
+
sharedOptions,
|
|
12
|
+
} from "./options.ts";
|
|
13
|
+
import type { PlaygroundOptions, ReferenceSourceOptions } from "./options.ts";
|
|
14
|
+
|
|
15
|
+
/** Options for {@link asyncapi}. */
|
|
16
|
+
export interface AsyncApiOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Code-sample tools shown per operation (Blume renderer). Defaults to every
|
|
19
|
+
* tool appropriate to the operation's protocol binding.
|
|
20
|
+
*/
|
|
21
|
+
codeSamples?: string[];
|
|
22
|
+
/** Start nested schema rows expanded rather than collapsed (Blume renderer). Defaults to `false`. */
|
|
23
|
+
expandSchemas?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The "Try it" message composer (Blume renderer). On by default; `false`
|
|
26
|
+
* hides it. `proxy` is accepted for parity but doesn't apply to event
|
|
27
|
+
* operations — a WebSocket connect goes straight from the browser.
|
|
28
|
+
*/
|
|
29
|
+
playground?: PlaygroundOptions;
|
|
30
|
+
/** Where the reference mounts. Defaults to `/events`. */
|
|
31
|
+
route?: string;
|
|
32
|
+
/** One or more specs; each renders on its own route by default. */
|
|
33
|
+
sources?: ReferenceSourceOptions[];
|
|
34
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
35
|
+
spec?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const asyncapiOptionsSchema = z
|
|
39
|
+
.strictObject(
|
|
40
|
+
{
|
|
41
|
+
// Empty `codeSamples` means every tool the operation's protocol binding
|
|
42
|
+
// suggests.
|
|
43
|
+
...sharedOptions({ codeSamples: [], route: "/events" }),
|
|
44
|
+
/** Start nested schema rows expanded rather than collapsed (Blume renderer). */
|
|
45
|
+
expandSchemas: z.boolean().default(false),
|
|
46
|
+
/** One or more specs; each renders on its own route by default. */
|
|
47
|
+
sources: z.array(referenceSourceSchema).default([]),
|
|
48
|
+
},
|
|
49
|
+
rendererRemovedHint
|
|
50
|
+
)
|
|
51
|
+
.transform(liftSpec(referenceSourceSchema))
|
|
52
|
+
.refine(hasSources, missingSourcesIssue("asyncapi"));
|
|
53
|
+
|
|
54
|
+
/** `asyncapi()` options with every default applied and `spec` folded into `sources`. */
|
|
55
|
+
export type ResolvedAsyncApiOptions = z.output<typeof asyncapiOptionsSchema>;
|
|
56
|
+
|
|
57
|
+
export type AsyncApiAdapter = AdapterDescriptor<"asyncapi", AsyncApiOptions>;
|
|
58
|
+
|
|
59
|
+
/** An `asyncapi()` descriptor as the config schema resolves it. */
|
|
60
|
+
export type ResolvedAsyncApiAdapter = AdapterDescriptor<
|
|
61
|
+
"asyncapi",
|
|
62
|
+
ResolvedAsyncApiOptions
|
|
63
|
+
>;
|
|
64
|
+
|
|
65
|
+
export const asyncapiAdapterSchema = adapterDescriptorSchema(
|
|
66
|
+
"asyncapi",
|
|
67
|
+
asyncapiOptionsSchema
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* An AsyncAPI reference. Blume normalizes the spec to AsyncAPI 3.x and renders
|
|
72
|
+
* its own UI — one real page per operation, in the sidebar, search, llms.txt,
|
|
73
|
+
* and OG; a `scalar()` adapter is the embedded-SPA alternative. Only the
|
|
74
|
+
* defaults differ from `openapi()`: the reference mounts at `/events`, and
|
|
75
|
+
* empty `codeSamples` means every tool the operation's protocol binding
|
|
76
|
+
* suggests.
|
|
77
|
+
*/
|
|
78
|
+
export const asyncapi = (options: AsyncApiOptions): AsyncApiAdapter => ({
|
|
79
|
+
kind: "asyncapi",
|
|
80
|
+
options,
|
|
81
|
+
requiredSecrets: [],
|
|
82
|
+
runtimeDeps: [],
|
|
83
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import {
|
|
6
|
+
graphqlSourceSchema,
|
|
7
|
+
liftSpec,
|
|
8
|
+
hasSources,
|
|
9
|
+
missingSourcesIssue,
|
|
10
|
+
sharedOptions,
|
|
11
|
+
} from "./options.ts";
|
|
12
|
+
import type { GraphqlSourceOptions, PlaygroundOptions } from "./options.ts";
|
|
13
|
+
|
|
14
|
+
/** Options for {@link graphql}. */
|
|
15
|
+
export interface GraphqlOptions {
|
|
16
|
+
/** Code-sample languages shown per operation. Defaults to `["curl", "js", "python"]`. */
|
|
17
|
+
codeSamples?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* URL of the live GraphQL endpoint the playground and code samples target —
|
|
20
|
+
* a schema, unlike an OpenAPI document, names no server. Applies to every
|
|
21
|
+
* source; a per-source `endpoint` wins.
|
|
22
|
+
*/
|
|
23
|
+
endpoint?: string;
|
|
24
|
+
/**
|
|
25
|
+
* The interactive "Try it" panel. On by default; `false` hides it. The
|
|
26
|
+
* object form sets `proxy`, the CORS escape hatch the Send button routes
|
|
27
|
+
* requests through: a proxy URL, or `true` for the built-in `/_api-proxy`
|
|
28
|
+
* endpoint (which needs server output: a host adapter such as `vercel()` in
|
|
29
|
+
* `deployment`).
|
|
30
|
+
*/
|
|
31
|
+
playground?: PlaygroundOptions;
|
|
32
|
+
/** Where the reference mounts. Defaults to `/graphql`. */
|
|
33
|
+
route?: string;
|
|
34
|
+
/** One or more schemas; each renders on its own route by default. */
|
|
35
|
+
sources?: GraphqlSourceOptions[];
|
|
36
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
37
|
+
spec?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* No `expandSchemas` (GraphQL field tables have no nesting) — everything
|
|
42
|
+
* else, the playground normalization included, is the shared reference
|
|
43
|
+
* shape. There is no Scalar counterpart: the Scalar embed reads OpenAPI and
|
|
44
|
+
* AsyncAPI documents only.
|
|
45
|
+
*/
|
|
46
|
+
export const graphqlOptionsSchema = z
|
|
47
|
+
.strictObject({
|
|
48
|
+
...sharedOptions({
|
|
49
|
+
codeSamples: ["curl", "js", "python"],
|
|
50
|
+
route: "/graphql",
|
|
51
|
+
}),
|
|
52
|
+
/** Default live endpoint URL for every source (per-source `endpoint` wins). */
|
|
53
|
+
endpoint: z.string().optional(),
|
|
54
|
+
/** One or more schemas; each renders on its own route by default. */
|
|
55
|
+
sources: z.array(graphqlSourceSchema).default([]),
|
|
56
|
+
})
|
|
57
|
+
.transform(liftSpec(graphqlSourceSchema))
|
|
58
|
+
.refine(hasSources, missingSourcesIssue("graphql"));
|
|
59
|
+
|
|
60
|
+
/** `graphql()` options with every default applied and `spec` folded into `sources`. */
|
|
61
|
+
export type ResolvedGraphqlOptions = z.output<typeof graphqlOptionsSchema>;
|
|
62
|
+
|
|
63
|
+
export type GraphqlAdapter = AdapterDescriptor<"graphql", GraphqlOptions>;
|
|
64
|
+
|
|
65
|
+
/** A `graphql()` descriptor as the config schema resolves it. */
|
|
66
|
+
export type ResolvedGraphqlAdapter = AdapterDescriptor<
|
|
67
|
+
"graphql",
|
|
68
|
+
ResolvedGraphqlOptions
|
|
69
|
+
>;
|
|
70
|
+
|
|
71
|
+
export const graphqlAdapterSchema = adapterDescriptorSchema(
|
|
72
|
+
"graphql",
|
|
73
|
+
graphqlOptionsSchema
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A GraphQL reference. Blume lowers the schema (SDL or introspection JSON) to
|
|
78
|
+
* one real page per root field — grouped as Queries/Mutations/Subscriptions —
|
|
79
|
+
* plus one page per named type (Objects, Input Objects, Enums, Interfaces,
|
|
80
|
+
* Unions, Scalars), all included in the sidebar, search, llms.txt, and OG.
|
|
81
|
+
* Always Blume-rendered: the Scalar embed reads OpenAPI and AsyncAPI
|
|
82
|
+
* documents only, so there is no `scalar()` counterpart.
|
|
83
|
+
*/
|
|
84
|
+
export const graphql = (options: GraphqlOptions): GraphqlAdapter => ({
|
|
85
|
+
kind: "graphql",
|
|
86
|
+
options,
|
|
87
|
+
requiredSecrets: [],
|
|
88
|
+
runtimeDeps: [],
|
|
89
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API reference adapters for `blume.config.ts`:
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defineConfig } from "blume";
|
|
6
|
+
* import { asyncapi, graphql, openapi, scalar } from "blume/reference";
|
|
7
|
+
*
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* reference: [
|
|
10
|
+
* openapi({ spec: "./openapi.yaml" }),
|
|
11
|
+
* asyncapi({ spec: "./asyncapi.yaml" }),
|
|
12
|
+
* graphql({ spec: "./schema.graphql", endpoint: "https://api.example.com/graphql" }),
|
|
13
|
+
* scalar({ spec: "./legacy.yaml", route: "/legacy", theme: "purple" }),
|
|
14
|
+
* ],
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Each factory returns a plain descriptor (see `core/adapter.ts`) that the
|
|
19
|
+
* schema validates and the generated site reads as a literal; nothing here
|
|
20
|
+
* runs in the browser.
|
|
21
|
+
*/
|
|
22
|
+
export type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
|
|
23
|
+
export { asyncapi } from "./asyncapi.ts";
|
|
24
|
+
export type { AsyncApiAdapter, AsyncApiOptions } from "./asyncapi.ts";
|
|
25
|
+
export { graphql } from "./graphql.ts";
|
|
26
|
+
export type { GraphqlAdapter, GraphqlOptions } from "./graphql.ts";
|
|
27
|
+
export { openapi } from "./openapi.ts";
|
|
28
|
+
export type { OpenApiAdapter, OpenApiOptions } from "./openapi.ts";
|
|
29
|
+
export type {
|
|
30
|
+
GraphqlSourceOptions,
|
|
31
|
+
PlaygroundOptions,
|
|
32
|
+
ReferenceSourceOptions,
|
|
33
|
+
} from "./options.ts";
|
|
34
|
+
export { scalar } from "./scalar.ts";
|
|
35
|
+
export type {
|
|
36
|
+
ScalarAdapter,
|
|
37
|
+
ScalarOptions,
|
|
38
|
+
ScalarSourceOptions,
|
|
39
|
+
} from "./scalar.ts";
|
|
40
|
+
export type { ReferenceAdapter, ResolvedReferenceAdapter } from "./schema.ts";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import {
|
|
6
|
+
liftSpec,
|
|
7
|
+
referenceSourceSchema,
|
|
8
|
+
hasSources,
|
|
9
|
+
missingSourcesIssue,
|
|
10
|
+
rendererRemovedHint,
|
|
11
|
+
sharedOptions,
|
|
12
|
+
} from "./options.ts";
|
|
13
|
+
import type { PlaygroundOptions, ReferenceSourceOptions } from "./options.ts";
|
|
14
|
+
|
|
15
|
+
/** Options for {@link openapi}. */
|
|
16
|
+
export interface OpenApiOptions {
|
|
17
|
+
/** Code-sample languages shown per operation (Blume renderer). Defaults to `["curl", "js", "python"]`. */
|
|
18
|
+
codeSamples?: string[];
|
|
19
|
+
/** Start nested schema rows expanded rather than collapsed (Blume renderer). Defaults to `false`. */
|
|
20
|
+
expandSchemas?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The interactive "Try it" panel (Blume renderer). On by default; `false`
|
|
23
|
+
* hides it. The object form sets `proxy`, the CORS escape hatch the Send
|
|
24
|
+
* button routes requests through: a proxy URL, or `true` for the built-in
|
|
25
|
+
* `/_api-proxy` endpoint (which needs server output: a host adapter such as
|
|
26
|
+
* `vercel()` in `deployment`).
|
|
27
|
+
*/
|
|
28
|
+
playground?: PlaygroundOptions;
|
|
29
|
+
/** Where the reference mounts. Defaults to `/reference`. */
|
|
30
|
+
route?: string;
|
|
31
|
+
/** One or more specs; each renders on its own route by default. */
|
|
32
|
+
sources?: ReferenceSourceOptions[];
|
|
33
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
34
|
+
spec?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const openapiOptionsSchema = z
|
|
38
|
+
.strictObject(
|
|
39
|
+
{
|
|
40
|
+
...sharedOptions({
|
|
41
|
+
codeSamples: ["curl", "js", "python"],
|
|
42
|
+
route: "/reference",
|
|
43
|
+
}),
|
|
44
|
+
/** Start nested schema rows expanded rather than collapsed (Blume renderer). */
|
|
45
|
+
expandSchemas: z.boolean().default(false),
|
|
46
|
+
/** One or more specs; each renders on its own route by default. */
|
|
47
|
+
sources: z.array(referenceSourceSchema).default([]),
|
|
48
|
+
},
|
|
49
|
+
rendererRemovedHint
|
|
50
|
+
)
|
|
51
|
+
.transform(liftSpec(referenceSourceSchema))
|
|
52
|
+
.refine(hasSources, missingSourcesIssue("openapi"));
|
|
53
|
+
|
|
54
|
+
/** `openapi()` options with every default applied and `spec` folded into `sources`. */
|
|
55
|
+
export type ResolvedOpenApiOptions = z.output<typeof openapiOptionsSchema>;
|
|
56
|
+
|
|
57
|
+
export type OpenApiAdapter = AdapterDescriptor<"openapi", OpenApiOptions>;
|
|
58
|
+
|
|
59
|
+
/** An `openapi()` descriptor as the config schema resolves it. */
|
|
60
|
+
export type ResolvedOpenApiAdapter = AdapterDescriptor<
|
|
61
|
+
"openapi",
|
|
62
|
+
ResolvedOpenApiOptions
|
|
63
|
+
>;
|
|
64
|
+
|
|
65
|
+
export const openapiAdapterSchema = adapterDescriptorSchema(
|
|
66
|
+
"openapi",
|
|
67
|
+
openapiOptionsSchema
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* An OpenAPI reference. Blume parses the spec with Scalar's parser and renders
|
|
72
|
+
* its own UI: one real page per operation, grouped by tag in the sidebar and
|
|
73
|
+
* included in site search, llms.txt, and OG. To embed the Scalar SPA instead
|
|
74
|
+
* (a single self-contained route that doesn't weave into the sidebar or
|
|
75
|
+
* search), list a `scalar()` adapter. Blume's renderer parses at generate
|
|
76
|
+
* time and needs no runtime dependency.
|
|
77
|
+
*/
|
|
78
|
+
export const openapi = (options: OpenApiOptions): OpenApiAdapter => ({
|
|
79
|
+
kind: "openapi",
|
|
80
|
+
options,
|
|
81
|
+
requiredSecrets: [],
|
|
82
|
+
runtimeDeps: [],
|
|
83
|
+
});
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { unrecognizedKeysMessage } from "../core/unrecognized-keys.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The option pieces every reference adapter shares: a spec source, the "Try
|
|
7
|
+
* it" playground normalization, and the `spec` shorthand that folds into
|
|
8
|
+
* `sources` at parse. Kept apart from the kind modules so `openapi()`,
|
|
9
|
+
* `asyncapi()`, and `graphql()` validate one definition of each.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const isBoolean = <Value>(value: Value): value is Value & boolean =>
|
|
13
|
+
typeof value === "boolean";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A single spec rendered by a reference. `spec` is a local path or an
|
|
17
|
+
* `http(s)` URL (an OpenAPI document for `openapi()`, an AsyncAPI document
|
|
18
|
+
* for `asyncapi()`, SDL or introspection JSON for `graphql()`).
|
|
19
|
+
*/
|
|
20
|
+
export const referenceSourceSchema = z.strictObject({
|
|
21
|
+
/** Include generated pages from this spec in llms.txt/llms-full.txt. */
|
|
22
|
+
includeInLlms: z.boolean().default(true),
|
|
23
|
+
/** Include generated pages from this spec in site search. */
|
|
24
|
+
includeInSearch: z.boolean().default(true),
|
|
25
|
+
/** Nav/section label for this source. */
|
|
26
|
+
label: z.string().optional(),
|
|
27
|
+
/** Emit noindex metadata and omit generated pages from the sitemap. */
|
|
28
|
+
noindex: z.boolean().default(false),
|
|
29
|
+
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
30
|
+
route: z.string().optional(),
|
|
31
|
+
/**
|
|
32
|
+
* Append the English "Reference for the … endpoint in the … API." sentence
|
|
33
|
+
* to every generated operation page's meta description. On by default, so
|
|
34
|
+
* terse specs still ship distinct, snippet-length descriptions; set to
|
|
35
|
+
* `false` on a non-English site to describe pages with the spec's own prose
|
|
36
|
+
* alone (falling back to the page title when an operation has none).
|
|
37
|
+
*/
|
|
38
|
+
seoDescriptionSuffix: z.boolean().default(true),
|
|
39
|
+
/** Local path or `http(s)` URL to the spec. */
|
|
40
|
+
spec: z.string(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/** One spec source, as `openapi()` and `asyncapi()` accept it. */
|
|
44
|
+
export interface ReferenceSourceOptions {
|
|
45
|
+
/** Include generated pages from this spec in llms.txt/llms-full.txt. Defaults to `true`. */
|
|
46
|
+
includeInLlms?: boolean;
|
|
47
|
+
/** Include generated pages from this spec in site search. Defaults to `true`. */
|
|
48
|
+
includeInSearch?: boolean;
|
|
49
|
+
/** Nav/section label for this source. */
|
|
50
|
+
label?: string;
|
|
51
|
+
/** Emit noindex metadata and omit generated pages from the sitemap. Defaults to `false`. */
|
|
52
|
+
noindex?: boolean;
|
|
53
|
+
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
54
|
+
route?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Append the generated English "Reference for …" sentence to every
|
|
57
|
+
* operation page's meta description. Defaults to `true`; set `false` on a
|
|
58
|
+
* non-English site to keep the spec's own prose alone.
|
|
59
|
+
*/
|
|
60
|
+
seoDescriptionSuffix?: boolean;
|
|
61
|
+
/** Local path or `http(s)` URL to the spec. */
|
|
62
|
+
spec: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A spec source with every default applied. */
|
|
66
|
+
export type ResolvedReferenceSource = z.output<typeof referenceSourceSchema>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A single GraphQL schema: the shared source shape plus `endpoint`, the live
|
|
70
|
+
* GraphQL API URL the playground and code samples target (a schema, unlike an
|
|
71
|
+
* OpenAPI document, names no server).
|
|
72
|
+
*/
|
|
73
|
+
export const graphqlSourceSchema = referenceSourceSchema.extend({
|
|
74
|
+
/** URL of the live GraphQL endpoint (playground + code samples). */
|
|
75
|
+
endpoint: z.string().optional(),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
/** One schema source, as `graphql()` accepts it. */
|
|
79
|
+
export interface GraphqlSourceOptions extends ReferenceSourceOptions {
|
|
80
|
+
/** URL of the live GraphQL endpoint (playground + code samples); wins over the adapter's `endpoint`. */
|
|
81
|
+
endpoint?: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** A GraphQL schema source with every default applied. */
|
|
85
|
+
export type ResolvedGraphqlSource = z.output<typeof graphqlSourceSchema>;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The interactive "Try it" panel on operation pages (Blume renderer). On by
|
|
89
|
+
* default; `false` hides it. The object form keeps it on and sets `proxy`,
|
|
90
|
+
* the CORS escape hatch the Send button routes requests through: a proxy URL,
|
|
91
|
+
* or `true` for the built-in `/_api-proxy` endpoint (which needs server
|
|
92
|
+
* output: a host adapter such as `vercel()` in `deployment`). Booleans
|
|
93
|
+
* normalize to the object shape so consumers read `{ enabled, proxy }`
|
|
94
|
+
* directly. `proxy` applies to the HTTP-posting playgrounds (OpenAPI, GraphQL)
|
|
95
|
+
* — an event composer's WebSocket connect is direct. One schema for every
|
|
96
|
+
* reference kind, so the normalization can never drift between them.
|
|
97
|
+
*/
|
|
98
|
+
export const playgroundSchema = z
|
|
99
|
+
.union([
|
|
100
|
+
z.boolean(),
|
|
101
|
+
z.strictObject({
|
|
102
|
+
enabled: z.boolean().default(true),
|
|
103
|
+
proxy: z.union([z.boolean(), z.string()]).default(false),
|
|
104
|
+
}),
|
|
105
|
+
])
|
|
106
|
+
.default(true)
|
|
107
|
+
.transform((value) =>
|
|
108
|
+
isBoolean(value) ? { enabled: value, proxy: false } : value
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
/** The `playground` option as a factory accepts it. */
|
|
112
|
+
export type PlaygroundOptions =
|
|
113
|
+
| boolean
|
|
114
|
+
| {
|
|
115
|
+
/** Render the panel. Defaults to `true`. */
|
|
116
|
+
enabled?: boolean;
|
|
117
|
+
/** CORS proxy: a URL, or `true` for the built-in `/_api-proxy` route. Defaults to `false`. */
|
|
118
|
+
proxy?: boolean | string;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/** The playground with its booleans normalized: `{ enabled, proxy }`. */
|
|
122
|
+
export type ResolvedPlayground = z.output<typeof playgroundSchema>;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The message a config still passing `renderer` to `openapi()`/`asyncapi()`
|
|
126
|
+
* gets: Scalar is its own adapter now, so the option has no home.
|
|
127
|
+
*/
|
|
128
|
+
export const RENDERER_REMOVED_HINT =
|
|
129
|
+
'`renderer` was removed: the Scalar embed is its own adapter. Replace `openapi({ spec, renderer: "scalar", theme })` with a separate `scalar({ spec, theme })` entry in `reference`, imported from "blume/reference" — `route`, `sources`, `label`, and `noindex` carry over, and the native display options (`codeSamples`, `expandSchemas`, `playground`) don\'t apply to the embed.';
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Error params for the `openapi()`/`asyncapi()` option objects: a leftover
|
|
133
|
+
* `renderer` key names its replacement instead of Zod's bare "Unrecognized
|
|
134
|
+
* key"; any other unknown key keeps the default message, beside the hint.
|
|
135
|
+
*/
|
|
136
|
+
export const rendererRemovedHint = {
|
|
137
|
+
error: (issue: z.core.$ZodRawIssue): string | undefined => {
|
|
138
|
+
if (
|
|
139
|
+
issue.code !== "unrecognized_keys" ||
|
|
140
|
+
!issue.keys.includes("renderer")
|
|
141
|
+
) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const others = issue.keys.filter((key) => key !== "renderer");
|
|
145
|
+
return others.length > 0
|
|
146
|
+
? `${RENDERER_REMOVED_HINT} ${unrecognizedKeysMessage(others)}`
|
|
147
|
+
: RENDERER_REMOVED_HINT;
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The options every kind shares, with that kind's defaults for the mount
|
|
153
|
+
* route and code-sample set. `spec` is the single-source shorthand; the kind
|
|
154
|
+
* schema folds it into `sources` with {@link liftSpec}.
|
|
155
|
+
*/
|
|
156
|
+
export const sharedOptions = (defaults: {
|
|
157
|
+
codeSamples: string[];
|
|
158
|
+
route: string;
|
|
159
|
+
}) => ({
|
|
160
|
+
/** Code-sample languages/tools shown per operation (Blume renderer). */
|
|
161
|
+
codeSamples: z.array(z.string()).default(defaults.codeSamples),
|
|
162
|
+
/** The "Try it" panel; see {@link playgroundSchema}. */
|
|
163
|
+
playground: playgroundSchema,
|
|
164
|
+
/** Where the reference mounts. */
|
|
165
|
+
route: z.string().default(defaults.route),
|
|
166
|
+
/** Shorthand for a single source: `sources: [{ spec }]`. */
|
|
167
|
+
spec: z.string().optional(),
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Resolve the `spec` shorthand into `sources` so downstream code reads one
|
|
172
|
+
* field: the shorthand becomes the first source (with the source defaults
|
|
173
|
+
* applied through the source schema itself, so the two can never drift) and
|
|
174
|
+
* the `spec` key is dropped. An adapter with neither renders nothing, which
|
|
175
|
+
* is a config mistake rather than a choice — `refine` it away with
|
|
176
|
+
* {@link hasSources}.
|
|
177
|
+
*/
|
|
178
|
+
export const liftSpec =
|
|
179
|
+
<Source extends { spec: string }>(
|
|
180
|
+
sourceSchema: z.ZodType<Source, { spec: string }>
|
|
181
|
+
) =>
|
|
182
|
+
<Options extends { sources: Source[]; spec?: string }>({
|
|
183
|
+
spec,
|
|
184
|
+
...options
|
|
185
|
+
}: Options): Omit<Options, "spec"> => ({
|
|
186
|
+
...options,
|
|
187
|
+
sources:
|
|
188
|
+
spec === undefined
|
|
189
|
+
? options.sources
|
|
190
|
+
: [sourceSchema.parse({ spec }), ...options.sources],
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
/** Whether an adapter has anything to render; pairs with {@link missingSourcesIssue}. */
|
|
194
|
+
export const hasSources = (options: { sources: { spec: string }[] }): boolean =>
|
|
195
|
+
options.sources.length > 0;
|
|
196
|
+
|
|
197
|
+
/** The refinement issue for a source-less adapter, naming its factory. */
|
|
198
|
+
export const missingSourcesIssue = (factory: string) => ({
|
|
199
|
+
message: `${factory}() renders nothing without a spec — set \`spec\` or at least one \`sources\` entry.`,
|
|
200
|
+
path: ["sources"],
|
|
201
|
+
});
|