blume 2.0.3 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +142 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
- package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
- package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
- package/dist/cli/chunk-150jk7km.js +52 -0
- package/dist/cli/chunk-150jk7km.js.map +10 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
- package/dist/cli/chunk-313vnn40.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
- package/dist/cli/chunk-3x6x3pph.js.map +10 -0
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
- package/dist/cli/chunk-42t4jxdx.js.map +12 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
- package/dist/cli/chunk-54ztw1nj.js.map +10 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
- package/dist/cli/chunk-66w9j7p6.js +322 -0
- package/dist/cli/chunk-66w9j7p6.js.map +14 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
- package/dist/cli/chunk-7ppf1rva.js.map +10 -0
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
- package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
- package/dist/cli/chunk-cfyg47zg.js.map +10 -0
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
- package/dist/cli/chunk-e6atmn4h.js.map +36 -0
- package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
- package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
- package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
- package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
- package/dist/cli/chunk-ehweg4fr.js.map +218 -0
- package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
- package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
- package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
- package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
- package/dist/cli/chunk-gb420vvz.js.map +17 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
- package/dist/cli/chunk-hebn0tpx.js.map +14 -0
- package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
- package/dist/cli/chunk-htrwgabr.js.map +15 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
- package/dist/cli/chunk-j134vrp2.js +65 -0
- package/dist/cli/chunk-j134vrp2.js.map +10 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
- package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
- package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
- package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
- package/dist/cli/chunk-ncj7w596.js.map +35 -0
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
- package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
- package/dist/cli/chunk-nrns10mj.js.map +10 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
- package/dist/cli/chunk-t2m5j4pr.js +104 -0
- package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
- package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
- package/dist/cli/chunk-tphac74f.js +126 -0
- package/dist/cli/chunk-tphac74f.js.map +11 -0
- package/dist/cli/chunk-w1r4vase.js +18 -0
- package/dist/cli/chunk-w1r4vase.js.map +10 -0
- package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
- package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
- package/dist/cli/index.js +31 -20
- package/dist/cli/index.js.map +5 -5
- package/dist/types/ai/agent-surface.d.ts +8 -7
- package/dist/types/ai/ai-catalog.d.ts +7 -0
- package/dist/types/ai/ask-context.d.ts +26 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/component-markdown.d.ts +2 -0
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/openapi-components.d.ts +4 -1
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +16 -0
- package/dist/types/astro/integration.d.ts +9 -0
- package/dist/types/astro/markdown-negotiation.d.ts +3 -0
- package/dist/types/astro/pages.d.ts +10 -0
- package/dist/types/captcha/hcaptcha.d.ts +27 -0
- package/dist/types/captcha/index.d.ts +28 -0
- package/dist/types/captcha/schema.d.ts +29 -0
- package/dist/types/captcha/turnstile.d.ts +28 -0
- package/dist/types/cli/init/scaffold.d.ts +1 -1
- package/dist/types/components/content/api-field.d.ts +62 -0
- package/dist/types/components/content/api-page.d.ts +100 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/code-samples.d.ts +29 -0
- package/dist/types/components/openapi/helpers.d.ts +158 -0
- package/dist/types/components/openapi/security.d.ts +95 -0
- package/dist/types/components/openapi/snippets.d.ts +60 -0
- package/dist/types/consent/ethyca.d.ts +48 -0
- package/dist/types/consent/index.d.ts +37 -0
- package/dist/types/consent/native.d.ts +28 -0
- package/dist/types/consent/osano.d.ts +42 -0
- package/dist/types/consent/schema.d.ts +110 -0
- package/dist/types/core/changelog-index.d.ts +8 -0
- package/dist/types/core/config-input.d.ts +217 -23
- package/dist/types/core/data.d.ts +53 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +88 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/links.d.ts +8 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/probe.d.ts +2 -0
- package/dist/types/core/project-graph.d.ts +6 -0
- package/dist/types/core/redirect-patterns.d.ts +152 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +670 -56
- package/dist/types/core/sources/cache.d.ts +3 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
- package/dist/types/core/sources/contentful.d.ts +17 -1
- package/dist/types/core/sources/lexical.d.ts +5 -0
- package/dist/types/core/sources/normalize.d.ts +20 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/remote.d.ts +37 -10
- package/dist/types/core/sources/sanity.d.ts +1 -1
- package/dist/types/core/types.d.ts +18 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/adapter-output.d.ts +2 -1
- package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
- package/dist/types/deploy/adapters/node.d.ts +58 -23
- package/dist/types/deploy/adapters/registry.d.ts +10 -0
- package/dist/types/deploy/adapters/types.d.ts +3 -2
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/node.d.ts +3 -1
- package/dist/types/deploy/platforms/types.d.ts +18 -7
- package/dist/types/deploy/platforms/vercel.d.ts +26 -1
- package/dist/types/deploy/redirects.d.ts +55 -11
- package/dist/types/deploy/sitemap.d.ts +2 -1
- package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/features.d.ts +3 -2
- package/dist/types/narration/build.d.ts +70 -0
- package/dist/types/narration/provider.d.ts +26 -0
- package/dist/types/narration/script.d.ts +154 -0
- package/dist/types/openapi/checks.d.ts +27 -0
- package/dist/types/openapi/graphql.d.ts +6 -0
- package/dist/types/openapi/model.d.ts +27 -10
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +16 -0
- package/dist/types/openapi/references.d.ts +30 -4
- package/dist/types/ratelimit/cloudflare.d.ts +39 -0
- package/dist/types/ratelimit/index.d.ts +27 -0
- package/dist/types/ratelimit/memory.d.ts +36 -0
- package/dist/types/ratelimit/schema.d.ts +119 -0
- package/dist/types/ratelimit/upstash.d.ts +46 -0
- package/dist/types/ratelimit/wrangler.d.ts +23 -0
- package/dist/types/reference/asyncapi.d.ts +10 -10
- package/dist/types/reference/graphql.d.ts +89 -11
- package/dist/types/reference/index.d.ts +1 -1
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +82 -6
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +144 -36
- package/dist/types/search/adapters/registry.d.ts +3 -0
- package/dist/types/search/adapters/typesense.d.ts +14 -4
- package/dist/types/search/build.d.ts +3 -1
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +13 -9
- package/dist/types/search/sync/algolia.d.ts +5 -2
- package/dist/types/search/sync/index.d.ts +3 -1
- package/dist/types/search/sync/typesense.d.ts +11 -7
- package/dist/types/seo/metatags.d.ts +20 -0
- package/dist/types/sources/contentful.d.ts +16 -0
- package/dist/types/sources/github-releases.d.ts +8 -1
- package/dist/types/sources/payload.d.ts +2 -0
- package/dist/types/sources/registry.d.ts +54 -0
- package/dist/types/sources/shared.d.ts +3 -0
- package/dist/types/sources/strapi.d.ts +2 -0
- package/docs/01-quickstart.mdx +4 -2
- package/docs/02-deployment.mdx +71 -17
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +13 -2
- package/docs/advanced/skills.mdx +15 -1
- package/docs/cli/audit.mdx +51 -8
- package/docs/cli/doctor.mdx +5 -1
- package/docs/cli/evals.mdx +4 -4
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +1 -0
- package/docs/cli/validate.mdx +4 -3
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +194 -38
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +8 -6
- package/docs/configuration/export.mdx +5 -3
- package/docs/configuration/index.mdx +64 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +90 -0
- package/docs/configuration/search.mdx +63 -12
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +108 -2
- package/docs/content/frontmatter.mdx +80 -2
- package/docs/content/i18n.mdx +39 -4
- package/docs/content/includes.mdx +16 -0
- package/docs/content/meta.mdx +1 -0
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +32 -10
- package/docs/content/sources/contentful.mdx +35 -0
- package/docs/content/sources/custom.mdx +43 -0
- package/docs/content/sources/github-releases.mdx +39 -0
- package/docs/content/sources/index.mdx +91 -0
- package/docs/content/sources/meta.ts +16 -0
- package/docs/content/sources/notion.mdx +32 -0
- package/docs/content/sources/obsidian.mdx +37 -0
- package/docs/content/sources/payload.mdx +31 -0
- package/docs/content/sources/remote-mdx.mdx +44 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +32 -0
- package/docs/content/syntax.mdx +69 -4
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +2 -2
- package/docs/discoverability/json-api.mdx +2 -0
- package/docs/discoverability/llms-txt.mdx +2 -2
- package/docs/discoverability/markdown.mdx +3 -1
- package/docs/discoverability/mcp.mdx +4 -0
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +4 -2
- package/docs/references/graphql.mdx +14 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +148 -7
- package/docs/references/scalar.mdx +3 -1
- package/package.json +43 -8
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +6 -6
- package/skills/blume-migrate/references/docusaurus.md +7 -7
- package/skills/blume-migrate/references/fumadocs.md +17 -13
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +10 -7
- package/skills/blume-migrate/references/starlight.md +11 -8
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +2 -1
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +6 -3
- package/src/ai/ask-context.ts +103 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-limits.ts +13 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +11 -6
- package/src/ai/component-markdown.ts +76 -1
- package/src/ai/cors.ts +14 -3
- package/src/ai/index.ts +12 -0
- package/src/ai/llms.ts +6 -2
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/mcp/query.ts +14 -6
- package/src/ai/openapi-components.ts +36 -6
- package/src/ai/relative-links.ts +4 -38
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +35 -2
- package/src/ai/write-skill.ts +97 -0
- package/src/astro/generate.ts +210 -66
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +42 -4
- package/src/astro/markdown-negotiation.ts +3 -0
- package/src/astro/module-types.ts +9 -1
- package/src/astro/pages.ts +23 -0
- package/src/astro/templates.ts +406 -108
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +38 -3
- package/src/audit/checks/contrast.ts +183 -0
- package/src/audit/checks/i18n.ts +2 -3
- package/src/audit/checks/indexability.ts +2 -3
- package/src/audit/checks/links.ts +19 -13
- package/src/audit/checks/network.ts +110 -6
- package/src/audit/checks/redirects.ts +6 -4
- package/src/audit/checks/robots.ts +58 -2
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +5 -0
- package/src/audit/types.ts +4 -1
- package/src/audit/url.ts +14 -5
- package/src/blume-modules.d.ts +12 -1
- package/src/captcha/client.ts +152 -0
- package/src/captcha/hcaptcha.ts +36 -0
- package/src/captcha/index.ts +28 -0
- package/src/captcha/schema.ts +32 -0
- package/src/captcha/turnstile.ts +38 -0
- package/src/captcha/verify.ts +71 -0
- package/src/cli/args.ts +51 -0
- package/src/cli/build-failure.ts +23 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +10 -1
- package/src/cli/commands/dev.ts +18 -2
- package/src/cli/commands/doctor.ts +67 -28
- package/src/cli/commands/eval.ts +36 -4
- package/src/cli/commands/init.ts +6 -4
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/validate.ts +10 -1
- package/src/cli/index.ts +5 -0
- package/src/cli/init/scaffold.ts +3 -3
- package/src/cli/prepare.ts +6 -3
- package/src/cli/required-secrets.ts +72 -30
- package/src/components/BlumePage.astro +2 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +66 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/FileTree.astro +1 -0
- package/src/components/content/GithubInfo.astro +1 -0
- package/src/components/content/Panel.astro +1 -0
- package/src/components/content/ParamField.astro +25 -0
- package/src/components/content/RequestExample.astro +17 -0
- package/src/components/content/ResponseExample.astro +17 -0
- package/src/components/content/ResponseField.astro +32 -0
- package/src/components/content/Step.astro +1 -0
- package/src/components/content/Tile.astro +1 -0
- package/src/components/content/Tooltip.astro +1 -0
- package/src/components/content/Tree.astro +1 -0
- package/src/components/content/TypeTable.astro +4 -1
- package/src/components/content/View.astro +21 -0
- package/src/components/content/ViewSwitcher.astro +168 -0
- package/src/components/content/api-field.ts +103 -0
- package/src/components/content/api-page.ts +248 -0
- package/src/components/content/mermaid-element.ts +15 -1
- package/src/components/content/view-switcher.ts +71 -0
- package/src/components/index.ts +2 -0
- package/src/components/islands/Assistant.astro +10 -1
- package/src/components/islands/assistant.tsx +104 -14
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +136 -21
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +6 -2
- package/src/components/layout/ConsentBanner.astro +62 -0
- package/src/components/layout/ConsentHead.astro +38 -0
- package/src/components/layout/Directory.astro +94 -0
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +122 -80
- package/src/components/layout/LanguageSwitcher.astro +48 -15
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +33 -7
- package/src/components/layout/PageActions.astro +139 -24
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +71 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +318 -47
- package/src/components/layout/Search.astro +47 -19
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/TableOfContents.astro +24 -17
- package/src/components/layout/consent/native.ts +79 -0
- package/src/components/layout/consent/types.ts +37 -0
- package/src/components/layout/footer-links.ts +53 -0
- package/src/components/layout/footer-socials.ts +87 -0
- package/src/components/layout/head-scripts.ts +6 -1
- package/src/components/layout/locale-redirect.ts +107 -0
- package/src/components/layout/nav-utils.ts +83 -0
- package/src/components/layout/page-feedback.ts +96 -0
- package/src/components/layout/search/algolia.ts +10 -1
- package/src/components/layout/search/analytics.ts +126 -0
- package/src/components/layout/search/endpoint.ts +48 -5
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/pagefind.ts +114 -5
- package/src/components/layout/search/types.ts +32 -0
- package/src/components/layout/search/typesense.ts +19 -3
- package/src/components/openapi/AsyncApiOperation.astro +14 -7
- package/src/components/openapi/Authorization.astro +10 -0
- package/src/components/openapi/GraphqlOperation.astro +5 -0
- package/src/components/openapi/Operation.astro +184 -13
- package/src/components/openapi/ParametersTable.astro +8 -4
- package/src/components/openapi/Playground.astro +7 -1
- package/src/components/openapi/RequestBody.astro +24 -5
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +7 -4
- package/src/components/openapi/SchemaTable.astro +15 -3
- package/src/components/openapi/async-snippets.ts +65 -9
- package/src/components/openapi/async.ts +123 -29
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/graphql-helpers.ts +35 -12
- package/src/components/openapi/helpers.ts +36 -2
- package/src/components/openapi/message-model.ts +54 -11
- package/src/components/openapi/message.ts +14 -4
- package/src/components/openapi/operation-model.ts +16 -7
- package/src/components/openapi/playground-client.ts +24 -5
- package/src/components/openapi/playground-schema.ts +1 -1
- package/src/components/openapi/schema-tree.ts +44 -14
- package/src/components/openapi/security.ts +16 -3
- package/src/components/openapi/snippets.ts +873 -10
- package/src/components/openapi/validate-json.ts +4 -3
- package/src/components/props.ts +6 -0
- package/src/consent/client.ts +95 -0
- package/src/consent/clients.ts +19 -0
- package/src/consent/ethyca.ts +71 -0
- package/src/consent/head.ts +24 -0
- package/src/consent/index.ts +37 -0
- package/src/consent/init.ts +29 -0
- package/src/consent/native.ts +36 -0
- package/src/consent/osano.ts +59 -0
- package/src/consent/schema.ts +30 -0
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/changelog-index.ts +31 -1
- package/src/core/client-address.ts +19 -0
- package/src/core/component-diagnostics.ts +53 -0
- package/src/core/component-overrides.ts +32 -0
- package/src/core/config-input.ts +225 -23
- package/src/core/data.ts +46 -4
- package/src/core/diagnostics.ts +8 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +84 -2
- package/src/core/includes.ts +21 -4
- package/src/core/links.ts +63 -19
- package/src/core/localizable.ts +26 -0
- package/src/core/navigation.ts +43 -12
- package/src/core/page-modes.ts +56 -0
- package/src/core/probe.ts +26 -6
- package/src/core/project-graph.ts +163 -16
- package/src/core/redirect-patterns.ts +520 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +339 -66
- package/src/core/sources/cache.ts +6 -0
- package/src/core/sources/contentful-rich-text.ts +29 -6
- package/src/core/sources/contentful.ts +135 -25
- package/src/core/sources/filesystem.ts +26 -4
- package/src/core/sources/github-releases.ts +12 -1
- package/src/core/sources/lexical.ts +15 -10
- package/src/core/sources/mdx-remote.ts +62 -10
- package/src/core/sources/normalize.ts +228 -41
- package/src/core/sources/notion.ts +7 -1
- package/src/core/sources/obsidian.ts +16 -3
- package/src/core/sources/payload.ts +38 -15
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/remote.ts +72 -15
- package/src/core/sources/resolve.ts +11 -1
- package/src/core/sources/sanity.ts +43 -25
- package/src/core/sources/strapi.ts +2 -2
- package/src/core/types.ts +19 -1
- package/src/core/ui-packs/ar.ts +44 -0
- package/src/core/ui-packs/bg.ts +46 -0
- package/src/core/ui-packs/bn.ts +44 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +45 -0
- package/src/core/ui-packs/da.ts +46 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +46 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +46 -0
- package/src/core/ui-packs/fi.ts +46 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +44 -0
- package/src/core/ui-packs/hi.ts +45 -0
- package/src/core/ui-packs/hr.ts +46 -0
- package/src/core/ui-packs/hu.ts +45 -0
- package/src/core/ui-packs/id.ts +46 -0
- package/src/core/ui-packs/it.ts +46 -0
- package/src/core/ui-packs/ja.ts +46 -0
- package/src/core/ui-packs/ko.ts +45 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +45 -0
- package/src/core/ui-packs/pl.ts +46 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +46 -0
- package/src/core/ui-packs/ro.ts +46 -0
- package/src/core/ui-packs/ru.ts +46 -0
- package/src/core/ui-packs/sk.ts +45 -0
- package/src/core/ui-packs/sr.ts +46 -0
- package/src/core/ui-packs/sv.ts +45 -0
- package/src/core/ui-packs/th.ts +44 -0
- package/src/core/ui-packs/tr.ts +46 -0
- package/src/core/ui-packs/uk.ts +46 -0
- package/src/core/ui-packs/vi.ts +46 -0
- package/src/core/ui-packs/zh-tw.ts +44 -0
- package/src/core/ui-packs/zh.ts +44 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/adapter-output.ts +7 -2
- package/src/deploy/adapters/cloudflare.ts +7 -5
- package/src/deploy/adapters/node.ts +47 -9
- package/src/deploy/adapters/types.ts +7 -3
- package/src/deploy/artifacts.ts +79 -9
- package/src/deploy/cloudflare-negotiation.ts +35 -5
- package/src/deploy/headers.ts +2 -1
- package/src/deploy/node-headers.ts +63 -9
- package/src/deploy/platforms/cloudflare.ts +45 -9
- package/src/deploy/platforms/netlify.ts +35 -2
- package/src/deploy/platforms/node.ts +12 -2
- package/src/deploy/platforms/types.ts +21 -7
- package/src/deploy/platforms/vercel.ts +149 -17
- package/src/deploy/redirects.ts +151 -24
- package/src/deploy/rss.ts +3 -1
- package/src/deploy/sitemap.ts +39 -5
- package/src/deploy/vercel-negotiation.ts +326 -102
- package/src/eval/agents.ts +18 -1
- package/src/eval/prompts.ts +6 -3
- package/src/eval/report.ts +34 -13
- package/src/eval/run.ts +5 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/features.ts +3 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +28 -5
- package/src/markdown/math.ts +4 -4
- package/src/markdown/relative-links.ts +3 -2
- package/src/markdown/variables.ts +56 -0
- package/src/markdown/views.ts +82 -0
- package/src/narration/build.ts +412 -0
- package/src/narration/player.ts +249 -0
- package/src/narration/provider.ts +29 -0
- package/src/narration/script.ts +592 -0
- package/src/og/card.ts +7 -6
- package/src/openapi/checks.ts +273 -0
- package/src/openapi/graphql-build.ts +21 -0
- package/src/openapi/graphql.ts +11 -0
- package/src/openapi/model.ts +72 -27
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +182 -4
- package/src/openapi/references.ts +64 -8
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +40 -15
- package/src/ratelimit/cloudflare.ts +54 -0
- package/src/ratelimit/index.ts +30 -0
- package/src/ratelimit/memory.ts +45 -0
- package/src/ratelimit/runtime.ts +247 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +60 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +20 -3
- package/src/reference/index.ts +1 -0
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +80 -8
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +23 -5
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/locale-scope.ts +30 -0
- package/src/search/adapters/typesense.ts +14 -4
- package/src/search/build.ts +21 -3
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +191 -34
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/source-pages.ts +29 -0
- package/src/search/sync/algolia.ts +111 -10
- package/src/search/sync/index.ts +52 -13
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +76 -26
- package/src/seo/metatags.ts +67 -0
- package/src/sources/contentful.ts +12 -0
- package/src/sources/github-releases.ts +7 -1
- package/src/sources/shared.ts +3 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +85 -6
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +31 -3
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
- package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
- package/dist/cli/chunk-35d4wj9f.js.map +0 -15
- package/dist/cli/chunk-364znk6q.js +0 -75
- package/dist/cli/chunk-364znk6q.js.map +0 -11
- package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
- package/dist/cli/chunk-8ktnccpt.js.map +0 -10
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-b07cmahc.js +0 -145
- package/dist/cli/chunk-b07cmahc.js.map +0 -11
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-e04dxsz1.js +0 -39
- package/dist/cli/chunk-e04dxsz1.js.map +0 -10
- package/dist/cli/chunk-j85vccga.js.map +0 -36
- package/dist/cli/chunk-p3v96n38.js.map +0 -10
- package/dist/cli/chunk-pehfxfta.js.map +0 -10
- package/dist/cli/chunk-pv29h0wf.js.map +0 -190
- package/dist/cli/chunk-q58y5e6a.js.map +0 -10
- package/dist/cli/chunk-vg9r4eb9.js.map +0 -14
- package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
- package/dist/cli/chunk-yfyb25rh.js.map +0 -14
- package/docs/content/sources.mdx +0 -334
- /package/dist/cli/{chunk-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import Description from "./Description.astro";
|
|
3
3
|
import {
|
|
4
4
|
constraints,
|
|
5
|
+
parameterDescription,
|
|
5
6
|
resolveSchema,
|
|
6
7
|
type SchemaLike,
|
|
7
8
|
typeLabel,
|
|
@@ -19,9 +20,11 @@ interface ParamLike {
|
|
|
19
20
|
interface Props {
|
|
20
21
|
parameters: ParamLike[];
|
|
21
22
|
schemas: Record<string, SchemaLike>;
|
|
23
|
+
/** The headings' level: 2 on an operation, deeper inside a callback. */
|
|
24
|
+
level?: number;
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
const { parameters, schemas } = Astro.props;
|
|
27
|
+
const { parameters, schemas, level = 2 } = Astro.props;
|
|
25
28
|
|
|
26
29
|
const SECTIONS: { in: string; title: string }[] = [
|
|
27
30
|
{ in: "path", title: "Path parameters" },
|
|
@@ -42,7 +45,7 @@ const groups = SECTIONS.map((section) => ({
|
|
|
42
45
|
groups.map((group) => (
|
|
43
46
|
<section class="mt-6">
|
|
44
47
|
<div
|
|
45
|
-
aria-level=
|
|
48
|
+
aria-level={level}
|
|
46
49
|
class="mb-2 font-semibold text-foreground text-sm"
|
|
47
50
|
role="heading"
|
|
48
51
|
>
|
|
@@ -54,6 +57,7 @@ const groups = SECTIONS.map((section) => ({
|
|
|
54
57
|
const type = param.schema ? typeLabel(param.schema) : "string";
|
|
55
58
|
const limits = constraints(resolved);
|
|
56
59
|
const enumValues = Array.isArray(resolved.enum) ? resolved.enum : null;
|
|
60
|
+
const description = parameterDescription(param, schemas);
|
|
57
61
|
return (
|
|
58
62
|
<div class="border-border border-t py-4 first:border-t-0">
|
|
59
63
|
<div class="flex flex-wrap items-baseline gap-x-2 gap-y-1">
|
|
@@ -70,8 +74,8 @@ const groups = SECTIONS.map((section) => ({
|
|
|
70
74
|
</span>
|
|
71
75
|
)}
|
|
72
76
|
</div>
|
|
73
|
-
{
|
|
74
|
-
<Description class="mt-2 text-muted-foreground text-sm" text={
|
|
77
|
+
{description && (
|
|
78
|
+
<Description class="mt-2 text-muted-foreground text-sm" text={description} />
|
|
75
79
|
)}
|
|
76
80
|
{limits.length > 0 && (
|
|
77
81
|
<div class="mt-2 text-muted-foreground text-xs">
|
|
@@ -17,12 +17,17 @@ interface Props {
|
|
|
17
17
|
model: PlaygroundModel;
|
|
18
18
|
/** Proxy route for the send, or false to fetch the API directly. */
|
|
19
19
|
proxy: string | false;
|
|
20
|
+
/**
|
|
21
|
+
* Where this panel's proxy is configured, which the CORS message names:
|
|
22
|
+
* an `openapi()` or `graphql()` reference, or `api` for hand-written pages.
|
|
23
|
+
*/
|
|
24
|
+
proxyConfig: "api" | "graphql" | "openapi";
|
|
20
25
|
/** Spec slug + operation key form the per-operation localStorage key. */
|
|
21
26
|
slug: string;
|
|
22
27
|
operation: string;
|
|
23
28
|
}
|
|
24
29
|
|
|
25
|
-
const { model, proxy, slug, operation } = Astro.props;
|
|
30
|
+
const { model, proxy, proxyConfig, slug, operation } = Astro.props;
|
|
26
31
|
|
|
27
32
|
// The built-in proxy route carries the site `basePath` but, like every
|
|
28
33
|
// internal URL in the spec data, not `deployment.base`; `withMountedBase`
|
|
@@ -53,6 +58,7 @@ const CHECKBOX_ROW =
|
|
|
53
58
|
<blume-playground
|
|
54
59
|
class="mb-6 block"
|
|
55
60
|
data-proxy={proxyUrl}
|
|
61
|
+
data-proxy-config={proxyConfig}
|
|
56
62
|
data-storage-key={`blume-playground:${slug}:${operation}`}
|
|
57
63
|
>
|
|
58
64
|
<script
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
import Description from "./Description.astro";
|
|
3
3
|
import type { SchemaLike } from "./helpers.ts";
|
|
4
|
+
import type { SchemaDirection } from "./schema-tree.ts";
|
|
4
5
|
import SchemaTable from "./SchemaTable.astro";
|
|
5
6
|
|
|
6
7
|
interface MediaTypeLike {
|
|
@@ -17,9 +18,22 @@ interface Props {
|
|
|
17
18
|
requestBody: RequestBodyLike;
|
|
18
19
|
schemas: Record<string, SchemaLike>;
|
|
19
20
|
expandAll?: boolean;
|
|
21
|
+
/** The heading's level: 2 on an operation, deeper inside a callback. */
|
|
22
|
+
level?: number;
|
|
23
|
+
/**
|
|
24
|
+
* `request` (the default) leaves out `readOnly` fields; a webhook or
|
|
25
|
+
* callback, which the API sends, reads like a response instead.
|
|
26
|
+
*/
|
|
27
|
+
direction?: SchemaDirection;
|
|
20
28
|
}
|
|
21
29
|
|
|
22
|
-
const {
|
|
30
|
+
const {
|
|
31
|
+
requestBody,
|
|
32
|
+
schemas,
|
|
33
|
+
expandAll = false,
|
|
34
|
+
level = 2,
|
|
35
|
+
direction = "request",
|
|
36
|
+
} = Astro.props;
|
|
23
37
|
|
|
24
38
|
const entries = Object.entries(requestBody.content ?? {});
|
|
25
39
|
const chosen = entries.find(([type]) => type.includes("json")) ?? entries[0];
|
|
@@ -27,11 +41,11 @@ const contentType = chosen?.[0] ?? "application/json";
|
|
|
27
41
|
const schema = chosen?.[1]?.schema ?? {};
|
|
28
42
|
---
|
|
29
43
|
|
|
30
|
-
<section class="mt-8">
|
|
44
|
+
<section class:list={[level > 2 ? "mt-5" : "mt-8"]}>
|
|
31
45
|
<div class="mb-2 flex flex-wrap items-center gap-2">
|
|
32
46
|
<div
|
|
33
|
-
aria-level=
|
|
34
|
-
class="font-semibold text-foreground text-lg"
|
|
47
|
+
aria-level={level}
|
|
48
|
+
class:list={["font-semibold text-foreground", level > 2 ? "text-sm" : "text-lg"]}
|
|
35
49
|
role="heading"
|
|
36
50
|
>
|
|
37
51
|
Request body
|
|
@@ -51,6 +65,11 @@ const schema = chosen?.[1]?.schema ?? {};
|
|
|
51
65
|
)
|
|
52
66
|
}
|
|
53
67
|
<div class="mt-3">
|
|
54
|
-
<SchemaTable
|
|
68
|
+
<SchemaTable
|
|
69
|
+
direction={direction}
|
|
70
|
+
expandAll={expandAll}
|
|
71
|
+
schema={schema}
|
|
72
|
+
schemas={schemas}
|
|
73
|
+
/>
|
|
55
74
|
</div>
|
|
56
75
|
</section>
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
type SpecValue,
|
|
10
10
|
toJson,
|
|
11
11
|
} from "./helpers.ts";
|
|
12
|
+
import type { CustomCodeSample } from "./code-samples.ts";
|
|
12
13
|
import { languageSamplePanels } from "./sample-panels.ts";
|
|
13
14
|
import PanelTabs from "./PanelTabs.astro";
|
|
14
15
|
import type { RequestSample, SampleLanguage } from "./snippets.ts";
|
|
@@ -27,19 +28,69 @@ interface ResponseLike {
|
|
|
27
28
|
interface Props {
|
|
28
29
|
/** The document's `components`, which `$ref`'d examples resolve against. */
|
|
29
30
|
components?: ComponentsLike;
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
/** The spec's hand-written `x-codeSamples`, shown first and never re-rendered live. */
|
|
32
|
+
customSamples?: CustomCodeSample[];
|
|
33
|
+
/**
|
|
34
|
+
* A webhook's body: the rail shows it as a "Payload" example per media
|
|
35
|
+
* type in place of client code, since the API sends the request.
|
|
36
|
+
*/
|
|
37
|
+
payload?: Record<string, MediaTypeLike>;
|
|
38
|
+
sample?: RequestSample;
|
|
39
|
+
languages?: SampleLanguage[];
|
|
32
40
|
responses: Record<string, ResponseLike>;
|
|
33
41
|
schemas: Record<string, SchemaLike>;
|
|
34
42
|
}
|
|
35
43
|
|
|
36
|
-
const {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
const {
|
|
45
|
+
components,
|
|
46
|
+
customSamples = [],
|
|
47
|
+
payload,
|
|
40
48
|
sample,
|
|
41
|
-
|
|
49
|
+
languages = [],
|
|
50
|
+
responses,
|
|
51
|
+
schemas,
|
|
52
|
+
} = Astro.props;
|
|
53
|
+
|
|
54
|
+
/** A media type's example, highlighted, or null when it has none. */
|
|
55
|
+
const highlightExample = async (media: MediaTypeLike, type: string) => {
|
|
56
|
+
const example = responseExample(media, schemas, components);
|
|
57
|
+
if (example === undefined || example === null) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const json = type.includes("json");
|
|
61
|
+
return highlightCode(
|
|
62
|
+
json || typeof example !== "string" ? toJson(example) : example,
|
|
63
|
+
json ? "json" : "text",
|
|
64
|
+
{ icons: false, themes: data.config.codeThemes }
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Hand-written samples carry no `lang` key, so the playground leaves them
|
|
69
|
+
// as written when it re-renders the generated ones from the form.
|
|
70
|
+
const customPanels = await Promise.all(
|
|
71
|
+
customSamples.map(async (custom) => ({
|
|
72
|
+
html: await highlightCode(custom.source, custom.lang, {
|
|
73
|
+
icons: false,
|
|
74
|
+
themes: data.config.codeThemes,
|
|
75
|
+
}),
|
|
76
|
+
key: custom.key,
|
|
77
|
+
label: custom.label,
|
|
78
|
+
}))
|
|
79
|
+
);
|
|
80
|
+
const payloadPanels = await Promise.all(
|
|
81
|
+
Object.entries(payload ?? {}).map(async ([type, media]) => ({
|
|
82
|
+
html: await highlightExample(media, type),
|
|
83
|
+
key: type,
|
|
84
|
+
label: type,
|
|
85
|
+
text: "No example payload.",
|
|
86
|
+
}))
|
|
42
87
|
);
|
|
88
|
+
const requestPanels = [
|
|
89
|
+
...customPanels,
|
|
90
|
+
...(sample
|
|
91
|
+
? await languageSamplePanels(languages, sample, data.config.codeThemes)
|
|
92
|
+
: []),
|
|
93
|
+
];
|
|
43
94
|
|
|
44
95
|
const responsePanels = await Promise.all(
|
|
45
96
|
Object.entries(responses).map(async ([status, response]) => {
|
|
@@ -66,6 +117,7 @@ const responsePanels = await Promise.all(
|
|
|
66
117
|
---
|
|
67
118
|
|
|
68
119
|
<div class="not-prose flex flex-col gap-6">
|
|
120
|
+
<PanelTabs copy heading="Payload" mono panels={payloadPanels} />
|
|
69
121
|
<PanelTabs copy heading="Request" panels={requestPanels} />
|
|
70
122
|
<PanelTabs heading="Response" mono panels={responsePanels} />
|
|
71
123
|
</div>
|
|
@@ -17,19 +17,21 @@ interface Props {
|
|
|
17
17
|
responses: Record<string, ResponseLike>;
|
|
18
18
|
schemas: Record<string, SchemaLike>;
|
|
19
19
|
expandAll?: boolean;
|
|
20
|
+
/** The heading's level: 2 on an operation, deeper inside a callback. */
|
|
21
|
+
level?: number;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
const { responses, schemas, expandAll = false } = Astro.props;
|
|
24
|
+
const { responses, schemas, expandAll = false, level = 2 } = Astro.props;
|
|
23
25
|
|
|
24
26
|
const items = Object.entries(responses);
|
|
25
27
|
---
|
|
26
28
|
|
|
27
29
|
{
|
|
28
30
|
items.length > 0 && (
|
|
29
|
-
<section class="mt-8">
|
|
31
|
+
<section class:list={[level > 2 ? "mt-5" : "mt-8"]}>
|
|
30
32
|
<div
|
|
31
|
-
aria-level=
|
|
32
|
-
class="mb-3 font-semibold text-foreground text-lg"
|
|
33
|
+
aria-level={level}
|
|
34
|
+
class:list={["mb-3 font-semibold text-foreground", level > 2 ? "text-sm" : "text-lg"]}
|
|
33
35
|
role="heading"
|
|
34
36
|
>
|
|
35
37
|
Responses
|
|
@@ -62,6 +64,7 @@ const items = Object.entries(responses);
|
|
|
62
64
|
{schema && (
|
|
63
65
|
<div class="mt-3">
|
|
64
66
|
<SchemaTable
|
|
67
|
+
direction="response"
|
|
65
68
|
expandAll={expandAll}
|
|
66
69
|
schema={schema}
|
|
67
70
|
schemas={schemas}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
import type { SchemaLike } from "./helpers.ts";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
type SchemaDirection,
|
|
5
|
+
type SchemaNode,
|
|
6
|
+
schemaTree,
|
|
7
|
+
} from "./schema-tree.ts";
|
|
4
8
|
import SchemaProperty from "./SchemaProperty.astro";
|
|
5
9
|
|
|
6
10
|
interface Props {
|
|
@@ -10,13 +14,21 @@ interface Props {
|
|
|
10
14
|
node?: SchemaNode;
|
|
11
15
|
schemas: Record<string, SchemaLike>;
|
|
12
16
|
expandAll?: boolean;
|
|
17
|
+
/** Which way the data travels, which decides the fields left out. */
|
|
18
|
+
direction?: SchemaDirection;
|
|
13
19
|
}
|
|
14
20
|
|
|
15
|
-
const {
|
|
21
|
+
const {
|
|
22
|
+
schema = {},
|
|
23
|
+
node: planned,
|
|
24
|
+
schemas,
|
|
25
|
+
expandAll = false,
|
|
26
|
+
direction,
|
|
27
|
+
} = Astro.props;
|
|
16
28
|
|
|
17
29
|
// The whole tree is planned once, at the top-level table, so that which named
|
|
18
30
|
// schemas expand is decided for the tree as a whole (see `schema-tree.ts`).
|
|
19
|
-
const node = planned ?? schemaTree(schema, schemas);
|
|
31
|
+
const node = planned ?? schemaTree(schema, schemas, direction);
|
|
20
32
|
---
|
|
21
33
|
|
|
22
34
|
{
|
|
@@ -25,7 +25,12 @@ export interface MessageSample {
|
|
|
25
25
|
address: string;
|
|
26
26
|
/** Example payload value (undefined when none could be derived). */
|
|
27
27
|
payload?: unknown;
|
|
28
|
-
/**
|
|
28
|
+
/** Example Kafka message key, when the message's binding declares one. */
|
|
29
|
+
key?: string;
|
|
30
|
+
/**
|
|
31
|
+
* First server the channel is available on, if any, its `security` entries
|
|
32
|
+
* resolved to scheme objects.
|
|
33
|
+
*/
|
|
29
34
|
server?: AsyncApiServerObject;
|
|
30
35
|
}
|
|
31
36
|
|
|
@@ -98,12 +103,63 @@ const webSocketSnippet = (sample: MessageSample): string => {
|
|
|
98
103
|
].join("\n");
|
|
99
104
|
};
|
|
100
105
|
|
|
106
|
+
/** librdkafka's `sasl.mechanisms` value for each AsyncAPI SASL scheme type. */
|
|
107
|
+
const SASL_MECHANISMS = new Map([
|
|
108
|
+
["gssapi", "GSSAPI"],
|
|
109
|
+
["plain", "PLAIN"],
|
|
110
|
+
["scramSha256", "SCRAM-SHA-256"],
|
|
111
|
+
["scramSha512", "SCRAM-SHA-512"],
|
|
112
|
+
]);
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The `-X` properties kcat hands librdkafka to reach the server: TLS for
|
|
116
|
+
* `kafka-secure`, and the first SASL scheme the server declares, with its
|
|
117
|
+
* credentials read from the environment (Kerberos brings its own).
|
|
118
|
+
*/
|
|
119
|
+
const kafkaSecurityFlags = (server?: AsyncApiServerObject): string[] => {
|
|
120
|
+
const tls = server?.protocol?.toLowerCase() === "kafka-secure";
|
|
121
|
+
const mechanism = (server?.security ?? [])
|
|
122
|
+
.map((entry) => SASL_MECHANISMS.get(String(entry?.type)))
|
|
123
|
+
.find((value) => value !== undefined);
|
|
124
|
+
if (mechanism === undefined) {
|
|
125
|
+
return tls ? ["-X security.protocol=SSL"] : [];
|
|
126
|
+
}
|
|
127
|
+
const flags = [
|
|
128
|
+
`-X security.protocol=${tls ? "SASL_SSL" : "SASL_PLAINTEXT"}`,
|
|
129
|
+
`-X sasl.mechanisms=${mechanism}`,
|
|
130
|
+
];
|
|
131
|
+
if (mechanism !== "GSSAPI") {
|
|
132
|
+
flags.push(
|
|
133
|
+
'-X sasl.username="$KAFKA_USERNAME"',
|
|
134
|
+
'-X sasl.password="$KAFKA_PASSWORD"'
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
return flags;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The separator between key and value: kcat splits each produced line at its
|
|
142
|
+
* first `|`, and prints consumed keys before one.
|
|
143
|
+
*/
|
|
144
|
+
const KEY_DELIMITER = "|";
|
|
145
|
+
|
|
101
146
|
const kcatSnippet = (sample: MessageSample): string => {
|
|
102
147
|
const broker = sample.server?.host ?? "localhost:9092";
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
? `
|
|
106
|
-
|
|
148
|
+
const mode = sample.action === "receive" ? "-P" : "-C";
|
|
149
|
+
const keyed =
|
|
150
|
+
sample.key === undefined ? "" : ` -K ${shellQuote(KEY_DELIMITER)}`;
|
|
151
|
+
const command = [
|
|
152
|
+
`kcat -b ${shellQuote(broker)} -t ${shellQuote(sample.address)} ${mode}${keyed}`,
|
|
153
|
+
...kafkaSecurityFlags(sample.server),
|
|
154
|
+
].join(" \\\n ");
|
|
155
|
+
if (sample.action !== "receive") {
|
|
156
|
+
return command;
|
|
157
|
+
}
|
|
158
|
+
const line =
|
|
159
|
+
sample.key === undefined
|
|
160
|
+
? payloadInline(sample)
|
|
161
|
+
: `${sample.key}${KEY_DELIMITER}${payloadInline(sample)}`;
|
|
162
|
+
return `echo ${shellQuote(line)} | ${command}`;
|
|
107
163
|
};
|
|
108
164
|
|
|
109
165
|
const mosquittoSnippet = (sample: MessageSample): string => {
|
|
@@ -157,15 +213,15 @@ const ALIASES = new Map<string, ToolId>([
|
|
|
157
213
|
/**
|
|
158
214
|
* The sample tools to render for an operation. The protocol picks the
|
|
159
215
|
* candidate set; a non-empty `codeSamples` config filters and orders it
|
|
160
|
-
* (unknown ids are dropped, aliases accepted).
|
|
161
|
-
* one, or a filter that matches nothing yields no samples.
|
|
216
|
+
* (unknown ids are dropped, aliases accepted). `false`, no protocol, an
|
|
217
|
+
* unsupported one, or a filter that matches nothing yields no samples.
|
|
162
218
|
*/
|
|
163
219
|
export const asyncSampleLanguages = (
|
|
164
|
-
ids: string[],
|
|
220
|
+
ids: string[] | false,
|
|
165
221
|
protocol?: string
|
|
166
222
|
): AsyncSampleLanguage[] => {
|
|
167
223
|
const candidates = PROTOCOL_TOOLS.get(protocol ?? "") ?? [];
|
|
168
|
-
if (candidates.length === 0) {
|
|
224
|
+
if (ids === false || candidates.length === 0) {
|
|
169
225
|
return [];
|
|
170
226
|
}
|
|
171
227
|
if (ids.length === 0) {
|
|
@@ -8,6 +8,8 @@ import type {
|
|
|
8
8
|
} from "../../openapi/asyncapi.ts";
|
|
9
9
|
import type { ParameterLike, SchemaLike } from "./helpers.ts";
|
|
10
10
|
import { resolveComponentRef } from "./helpers.ts";
|
|
11
|
+
import type { OperationSecurity, SecuritySchemeLike } from "./security.ts";
|
|
12
|
+
import { resolveAsyncApiSecurity } from "./security.ts";
|
|
11
13
|
|
|
12
14
|
/**
|
|
13
15
|
* Runtime helpers for the AsyncAPI components — the async counterpart of
|
|
@@ -239,32 +241,61 @@ export const channelParameters = (
|
|
|
239
241
|
|
|
240
242
|
const SERVER_REF = /^#\/servers\/(?<name>[^/]+)$/u;
|
|
241
243
|
|
|
244
|
+
/** A server paired with its key under the document's `servers`. */
|
|
245
|
+
export interface NamedServer {
|
|
246
|
+
name: string;
|
|
247
|
+
server: AsyncApiServerObject;
|
|
248
|
+
}
|
|
249
|
+
|
|
242
250
|
/**
|
|
243
|
-
* The servers a channel is available on: its `servers` refs when
|
|
244
|
-
* else every server the document declares (the spec's default).
|
|
251
|
+
* The servers a channel is available on, by name: its `servers` refs when
|
|
252
|
+
* declared, else every server the document declares (the spec's default).
|
|
245
253
|
*/
|
|
246
|
-
export const
|
|
254
|
+
export const namedChannelServers = (
|
|
247
255
|
channel: AsyncApiChannelObject | undefined,
|
|
248
256
|
document: AsyncApiDocument
|
|
249
|
-
):
|
|
257
|
+
): NamedServer[] => {
|
|
250
258
|
const all = document.servers ?? {};
|
|
251
259
|
const refs = channel?.servers;
|
|
252
260
|
if (!Array.isArray(refs) || refs.length === 0) {
|
|
253
|
-
return Object.
|
|
261
|
+
return Object.entries(all).flatMap(([name, server]) =>
|
|
262
|
+
isObject(server) ? [{ name, server }] : []
|
|
263
|
+
);
|
|
254
264
|
}
|
|
255
|
-
const servers:
|
|
265
|
+
const servers: NamedServer[] = [];
|
|
256
266
|
for (const ref of refs) {
|
|
257
|
-
const
|
|
267
|
+
const pointer = SERVER_REF.exec(
|
|
258
268
|
isObject(ref) && isString(ref.$ref) ? ref.$ref : ""
|
|
259
269
|
)?.groups?.name;
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
270
|
+
const name = pointer === undefined ? undefined : unescapePointer(pointer);
|
|
271
|
+
const server = name === undefined ? undefined : all[name];
|
|
272
|
+
if (name !== undefined && isObject(server)) {
|
|
273
|
+
servers.push({ name, server });
|
|
263
274
|
}
|
|
264
275
|
}
|
|
265
276
|
return servers;
|
|
266
277
|
};
|
|
267
278
|
|
|
279
|
+
/**
|
|
280
|
+
* A server's `security` entries with their `$ref`s into
|
|
281
|
+
* `components.securitySchemes` resolved (non-objects dropped), for the
|
|
282
|
+
* samples, which read the scheme off the server they're built from.
|
|
283
|
+
*/
|
|
284
|
+
export const resolvedServerSecurity = (
|
|
285
|
+
server: AsyncApiServerObject,
|
|
286
|
+
components?: Components
|
|
287
|
+
): AsyncApiRefLike[] =>
|
|
288
|
+
(Array.isArray(server.security) ? server.security : [])
|
|
289
|
+
.filter(isObject)
|
|
290
|
+
.map((entry) => resolveComponentRef(entry, components, "securitySchemes"));
|
|
291
|
+
|
|
292
|
+
/** The servers a channel is available on; see {@link namedChannelServers}. */
|
|
293
|
+
export const channelServers = (
|
|
294
|
+
channel: AsyncApiChannelObject | undefined,
|
|
295
|
+
document: AsyncApiDocument
|
|
296
|
+
): AsyncApiServerObject[] =>
|
|
297
|
+
namedChannelServers(channel, document).map(({ server }) => server);
|
|
298
|
+
|
|
268
299
|
/** A protocol-keyed `bindings` map, whatever object it sits on. */
|
|
269
300
|
type BindingMap = Record<string, AsyncApiSpecValue>;
|
|
270
301
|
|
|
@@ -291,6 +322,34 @@ export const resolveBindings = (
|
|
|
291
322
|
return isObject(target) ? target : undefined;
|
|
292
323
|
};
|
|
293
324
|
|
|
325
|
+
/** The `kafka` object of a bindings map, a `$ref`'d map resolved. */
|
|
326
|
+
const kafkaBinding = (
|
|
327
|
+
bindings: BindingMap | undefined,
|
|
328
|
+
components?: Components
|
|
329
|
+
): Record<string, AsyncApiSpecValue> | undefined => {
|
|
330
|
+
const kafka = resolveBindings(bindings, components)?.kafka;
|
|
331
|
+
return isObject(kafka) ? kafka : undefined;
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* A Kafka channel binding's `topic`, which names the topic when it differs
|
|
336
|
+
* from the channel address. The samples produce to and consume from it.
|
|
337
|
+
*/
|
|
338
|
+
export const kafkaTopic = (
|
|
339
|
+
channel: AsyncApiChannelObject | undefined,
|
|
340
|
+
components?: Components
|
|
341
|
+
): string | undefined => {
|
|
342
|
+
const topic = kafkaBinding(channel?.bindings, components)?.topic;
|
|
343
|
+
return isString(topic) && topic !== "" ? topic : undefined;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
/** The schema of a message's Kafka key (its `kafka` binding's `key`). */
|
|
347
|
+
export const kafkaKeySchema = (
|
|
348
|
+
message: AsyncApiMessageLike | undefined,
|
|
349
|
+
components?: Components
|
|
350
|
+
): SchemaLike | undefined =>
|
|
351
|
+
schemaOf(kafkaBinding(message?.bindings, components)?.key);
|
|
352
|
+
|
|
294
353
|
/** Normalize protocol spellings onto the binding key they document. */
|
|
295
354
|
const PROTOCOL_ALIASES = {
|
|
296
355
|
"kafka-secure": "kafka",
|
|
@@ -326,35 +385,70 @@ export const protocolOf = (
|
|
|
326
385
|
};
|
|
327
386
|
|
|
328
387
|
/**
|
|
329
|
-
* The security
|
|
330
|
-
*
|
|
331
|
-
*
|
|
332
|
-
*
|
|
388
|
+
* The security an operation renders: its own `security` when declared, else
|
|
389
|
+
* the union of its servers' — connecting already requires the server's
|
|
390
|
+
* schemes. Server entries dedupe by `$ref`, so two servers sharing a scheme
|
|
391
|
+
* render it once. Each server's list stands alone, though: when the servers
|
|
392
|
+
* disagree (a production cluster behind SASL beside a local broker with no
|
|
393
|
+
* security), a scheme only some servers declare names them, and
|
|
394
|
+
* `unauthenticatedServers` lists the ones that declare none, rather than one
|
|
395
|
+
* server's scheme reading as required on all of them.
|
|
333
396
|
*/
|
|
334
|
-
export const
|
|
397
|
+
export const asyncApiSecurity = (
|
|
335
398
|
operation: AsyncApiOperationObject | undefined,
|
|
336
|
-
servers:
|
|
337
|
-
|
|
399
|
+
servers: NamedServer[],
|
|
400
|
+
schemes: Record<string, SecuritySchemeLike> | undefined
|
|
401
|
+
): OperationSecurity => {
|
|
338
402
|
if (Array.isArray(operation?.security)) {
|
|
339
|
-
return operation.security;
|
|
403
|
+
return resolveAsyncApiSecurity(operation.security, schemes);
|
|
340
404
|
}
|
|
341
|
-
const entries: AsyncApiRefLike[] = [];
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
405
|
+
const entries: { entry: AsyncApiRefLike; servers: string[] }[] = [];
|
|
406
|
+
const byRef = new Map<string, string[]>();
|
|
407
|
+
const unauthenticated: string[] = [];
|
|
408
|
+
for (const { name, server } of servers) {
|
|
409
|
+
const declared = Array.isArray(server.security)
|
|
410
|
+
? server.security.filter(isObject)
|
|
411
|
+
: [];
|
|
412
|
+
if (declared.length === 0) {
|
|
413
|
+
unauthenticated.push(name);
|
|
414
|
+
}
|
|
415
|
+
for (const entry of declared) {
|
|
416
|
+
const shared = isString(entry.$ref) ? byRef.get(entry.$ref) : undefined;
|
|
417
|
+
if (shared) {
|
|
418
|
+
shared.push(name);
|
|
346
419
|
continue;
|
|
347
420
|
}
|
|
421
|
+
const names = [name];
|
|
348
422
|
if (isString(entry.$ref)) {
|
|
349
|
-
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
seen.add(entry.$ref);
|
|
423
|
+
byRef.set(entry.$ref, names);
|
|
353
424
|
}
|
|
354
|
-
entries.push(entry);
|
|
425
|
+
entries.push({ entry, servers: names });
|
|
355
426
|
}
|
|
356
427
|
}
|
|
357
|
-
|
|
428
|
+
const agree =
|
|
429
|
+
entries.length === 0 ||
|
|
430
|
+
(unauthenticated.length === 0 &&
|
|
431
|
+
entries.every((item) => item.servers.length === servers.length));
|
|
432
|
+
if (agree) {
|
|
433
|
+
return resolveAsyncApiSecurity(
|
|
434
|
+
entries.map(({ entry }) => entry),
|
|
435
|
+
schemes
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
// A scheme every server declares needs no server list of its own.
|
|
440
|
+
alternatives: entries.map(({ entry, servers: names }) =>
|
|
441
|
+
resolveAsyncApiSecurity([entry], schemes)
|
|
442
|
+
.alternatives.flat()
|
|
443
|
+
.map((resolved) =>
|
|
444
|
+
names.length === servers.length
|
|
445
|
+
? resolved
|
|
446
|
+
: { ...resolved, servers: names }
|
|
447
|
+
)
|
|
448
|
+
),
|
|
449
|
+
optional: false,
|
|
450
|
+
unauthenticatedServers: unauthenticated,
|
|
451
|
+
};
|
|
358
452
|
};
|
|
359
453
|
|
|
360
454
|
/** One protocol's binding fields, ready for a key/value table. */
|