blume 2.0.2 → 2.1.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 +1 -0
- package/CHANGELOG.md +113 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-6k4ftwze.js → chunk-0gz36akr.js} +18 -2
- package/dist/cli/{chunk-6k4ftwze.js.map → chunk-0gz36akr.js.map} +3 -3
- package/dist/cli/{chunk-zp79m0ts.js → chunk-1n228xqb.js} +2 -2
- package/dist/cli/{chunk-ddndchfr.js → chunk-2f3ndkpw.js} +57 -29
- package/dist/cli/chunk-2f3ndkpw.js.map +14 -0
- package/dist/cli/{chunk-fsmrqk8a.js → chunk-2f7n4qzt.js} +8 -2
- package/dist/cli/{chunk-fsmrqk8a.js.map → chunk-2f7n4qzt.js.map} +3 -3
- package/dist/cli/{chunk-ppzjqwx2.js → chunk-2n4ps1b3.js} +17 -18
- package/dist/cli/{chunk-ppzjqwx2.js.map → chunk-2n4ps1b3.js.map} +3 -3
- package/dist/cli/{chunk-5r8g91qn.js → chunk-43zcf4gz.js} +398 -159
- package/dist/cli/chunk-43zcf4gz.js.map +36 -0
- package/dist/cli/chunk-4ejxbzee.js +39 -0
- package/dist/cli/chunk-4ejxbzee.js.map +10 -0
- package/dist/cli/{chunk-hr8ne106.js → chunk-4h8z9vv5.js} +296 -77
- package/dist/cli/chunk-4h8z9vv5.js.map +16 -0
- package/dist/cli/{chunk-k7pj68a8.js → chunk-5cg2rzgf.js} +18 -16
- package/dist/cli/{chunk-k7pj68a8.js.map → chunk-5cg2rzgf.js.map} +2 -2
- package/dist/cli/{chunk-h2ez8dzb.js → chunk-5ffywsmb.js} +4 -4
- package/dist/cli/{chunk-g698a744.js → chunk-5wj2qwn2.js} +5 -5
- package/dist/cli/chunk-6bm0xpgd.js +18 -0
- package/dist/cli/chunk-6bm0xpgd.js.map +10 -0
- package/dist/cli/{chunk-3yce002v.js → chunk-713mngdq.js} +15 -8
- package/dist/cli/chunk-713mngdq.js.map +14 -0
- package/dist/cli/{chunk-91ws1n6j.js → chunk-9geymqns.js} +17 -15
- package/dist/cli/{chunk-91ws1n6j.js.map → chunk-9geymqns.js.map} +2 -2
- package/dist/cli/{chunk-6dtt0zfn.js → chunk-9xr4dgee.js} +27 -18
- package/dist/cli/chunk-9xr4dgee.js.map +10 -0
- package/dist/cli/{chunk-sqw4ekg1.js → chunk-amrb6hgh.js} +2 -2
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-wdrt2k2v.js → chunk-cmtcnh9f.js} +90 -26
- package/dist/cli/chunk-cmtcnh9f.js.map +10 -0
- package/dist/cli/chunk-cy5bm0j0.js +104 -0
- package/dist/cli/chunk-cy5bm0j0.js.map +11 -0
- package/dist/cli/{chunk-7mbqtmgb.js → chunk-e7vvk5ya.js} +21 -12
- package/dist/cli/chunk-e7vvk5ya.js.map +10 -0
- package/dist/cli/{chunk-qkb5a8sa.js → chunk-g2z9x01v.js} +6 -98
- package/dist/cli/chunk-g2z9x01v.js.map +10 -0
- package/dist/cli/{chunk-273ygyr4.js → chunk-ga0pf4aj.js} +7 -7
- package/dist/cli/{chunk-273ygyr4.js.map → chunk-ga0pf4aj.js.map} +3 -3
- package/dist/cli/{chunk-h7k3nq3v.js → chunk-gp84za0h.js} +2 -2
- package/dist/cli/{chunk-hqp2ajnh.js → chunk-h2a48yhd.js} +195 -73
- package/dist/cli/chunk-h2a48yhd.js.map +36 -0
- package/dist/cli/{chunk-pbg5a4s3.js → chunk-jnwj5kjj.js} +71 -47
- package/dist/cli/chunk-jnwj5kjj.js.map +19 -0
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-8g8ytmgx.js → chunk-nd1821sk.js} +21 -19
- package/dist/cli/{chunk-8g8ytmgx.js.map → chunk-nd1821sk.js.map} +2 -2
- package/dist/cli/{chunk-w4bxdvsa.js → chunk-ntv4qrt7.js} +17 -15
- package/dist/cli/{chunk-w4bxdvsa.js.map → chunk-ntv4qrt7.js.map} +2 -2
- package/dist/cli/{chunk-bfwp9vp6.js → chunk-p804f3pe.js} +7 -7
- package/dist/cli/{chunk-4e9b9ra6.js → chunk-py62fewh.js} +6 -6
- package/dist/cli/{chunk-4e9b9ra6.js.map → chunk-py62fewh.js.map} +1 -1
- package/dist/cli/chunk-q3wxxq39.js +126 -0
- package/dist/cli/chunk-q3wxxq39.js.map +11 -0
- package/dist/cli/{chunk-j85scx15.js → chunk-rekqz4qg.js} +142 -46
- package/dist/cli/chunk-rekqz4qg.js.map +10 -0
- package/dist/cli/{chunk-00gs3wqs.js → chunk-ta27feev.js} +1 -1
- package/dist/cli/{chunk-v6ya5kcb.js → chunk-xkz5xbtv.js} +4031 -1132
- package/dist/cli/chunk-xkz5xbtv.js.map +213 -0
- package/dist/cli/{chunk-bbnwccaz.js → chunk-y4ykbark.js} +2 -2
- package/dist/cli/{chunk-n1yg3tj3.js → chunk-y5h4r2y0.js} +6 -6
- package/dist/cli/{chunk-n1yg3tj3.js.map → chunk-y5h4r2y0.js.map} +3 -3
- package/dist/cli/{chunk-nfcyttvj.js → chunk-yj17vs39.js} +9 -9
- package/dist/cli/{chunk-nfcyttvj.js.map → chunk-yj17vs39.js.map} +1 -1
- package/dist/cli/{chunk-7vtckvaw.js → chunk-yxmk4pec.js} +16 -14
- package/dist/cli/{chunk-7vtckvaw.js.map → chunk-yxmk4pec.js.map} +2 -2
- package/dist/cli/{chunk-gs7r695n.js → chunk-zccbjcj0.js} +22 -8
- package/dist/cli/{chunk-gs7r695n.js.map → chunk-zccbjcj0.js.map} +3 -3
- package/dist/cli/{chunk-xh43dwgw.js → chunk-zf748avv.js} +415 -225
- package/dist/cli/chunk-zf748avv.js.map +37 -0
- package/dist/cli/{chunk-d1v5rhy0.js → chunk-zhvd6adm.js} +16 -14
- package/dist/cli/{chunk-d1v5rhy0.js.map → chunk-zhvd6adm.js.map} +2 -2
- package/dist/cli/index.js +28 -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 +22 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/link-headers.d.ts +8 -1
- package/dist/types/ai/openapi-components.d.ts +5 -2
- package/dist/types/ai/relative-links.d.ts +9 -7
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +20 -1
- package/dist/types/ai/tar.d.ts +1 -3
- package/dist/types/analytics/index.d.ts +2 -0
- package/dist/types/analytics/one-dollar-stats.d.ts +48 -0
- package/dist/types/analytics/schema.d.ts +14 -0
- package/dist/types/astro/integration.d.ts +11 -2
- 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/components/content/api-field.d.ts +59 -0
- package/dist/types/components/content/api-page.d.ts +95 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/helpers.d.ts +137 -0
- package/dist/types/components/openapi/security.d.ts +85 -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/base-path.d.ts +21 -7
- package/dist/types/core/config-input.d.ts +196 -27
- package/dist/types/core/data.d.ts +49 -4
- package/dist/types/core/directive-diagnostics.d.ts +12 -0
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/heading-markers.d.ts +5 -7
- package/dist/types/core/i18n-ui.d.ts +86 -0
- package/dist/types/core/i18n.d.ts +2 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/last-modified.d.ts +10 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/meta.d.ts +8 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/redirect-patterns.d.ts +144 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +558 -56
- package/dist/types/core/sources/lower.d.ts +29 -16
- package/dist/types/core/sources/normalize.d.ts +13 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/watch.d.ts +12 -5
- package/dist/types/core/standard-schema.d.ts +5 -0
- package/dist/types/core/types.d.ts +1 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/artifacts.d.ts +6 -4
- package/dist/types/deploy/headers.d.ts +5 -0
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +5 -0
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/types.d.ts +8 -0
- package/dist/types/deploy/platforms/vercel.d.ts +6 -0
- package/dist/types/deploy/redirects.d.ts +61 -22
- package/dist/types/deploy/vercel-negotiation.d.ts +9 -0
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/directives.d.ts +62 -0
- package/dist/types/markdown/features.d.ts +24 -2
- package/dist/types/markdown/mdast.d.ts +63 -0
- 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/asyncapi.d.ts +4 -2
- package/dist/types/openapi/model.d.ts +12 -6
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +13 -0
- package/dist/types/openapi/references.d.ts +14 -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 +111 -0
- package/dist/types/ratelimit/upstash.d.ts +21 -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 +13 -10
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +45 -5
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +60 -36
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +4 -0
- package/dist/types/seo/metatags.d.ts +20 -0
- package/docs/02-deployment.mdx +44 -6
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/08-faq.mdx +1 -1
- package/docs/advanced/changelog.mdx +2 -2
- package/docs/advanced/custom-pages.mdx +3 -3
- package/docs/advanced/skills.mdx +14 -0
- package/docs/cli/audit.mdx +38 -2
- package/docs/cli/evals.mdx +3 -3
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +3 -3
- package/docs/cli/version.mdx +1 -1
- package/docs/configuration/analytics.mdx +22 -1
- package/docs/configuration/assistant.mdx +188 -36
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +6 -4
- package/docs/configuration/index.mdx +63 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +69 -0
- package/docs/configuration/search.mdx +30 -2
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +107 -1
- package/docs/content/frontmatter.mdx +77 -1
- package/docs/content/i18n.mdx +40 -3
- package/docs/content/includes.mdx +16 -0
- package/docs/content/index.mdx +4 -2
- package/docs/content/islands.mdx +1 -1
- package/docs/content/meta.mdx +4 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +28 -6
- package/docs/content/sources/contentful.mdx +32 -0
- package/docs/content/sources/custom.mdx +39 -0
- package/docs/content/sources/github-releases.mdx +31 -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 +30 -0
- package/docs/content/sources/remote-mdx.mdx +40 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +31 -0
- package/docs/content/syntax.mdx +81 -2
- package/docs/content/variables.mdx +41 -0
- package/docs/content/versioning.mdx +1 -1
- package/docs/discoverability/agent-discovery.mdx +30 -3
- package/docs/discoverability/index.mdx +3 -2
- package/docs/discoverability/llms-txt.mdx +1 -1
- package/docs/discoverability/markdown.mdx +2 -2
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/open-graph.mdx +5 -3
- package/docs/discoverability/rss.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +2 -2
- package/docs/references/graphql.mdx +3 -3
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +106 -5
- package/docs/references/scalar.mdx +3 -1
- package/package.json +36 -1
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +5 -5
- package/skills/blume-migrate/references/docusaurus.md +3 -3
- package/skills/blume-migrate/references/fumadocs.md +1 -1
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +3 -3
- package/skills/blume-migrate/references/starlight.md +2 -1
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +67 -16
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +4 -3
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +12 -5
- package/src/ai/api/handlers.ts +2 -2
- package/src/ai/api/spec.ts +2 -2
- package/src/ai/api-catalog.ts +6 -2
- package/src/ai/ask-context.ts +73 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +2 -2
- package/src/ai/component-markdown.ts +75 -0
- package/src/ai/cors.ts +2 -0
- package/src/ai/index.ts +12 -0
- package/src/ai/link-headers.ts +14 -5
- package/src/ai/llms.ts +24 -9
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/mcp/discovery.ts +2 -2
- package/src/ai/mcp/query.ts +2 -2
- package/src/ai/mcp/server.ts +2 -2
- package/src/ai/openapi-components.ts +31 -9
- package/src/ai/relative-links.ts +42 -26
- package/src/ai/serializers.ts +2 -1
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +49 -3
- package/src/ai/tar.ts +139 -12
- package/src/ai/write-skill.ts +97 -0
- package/src/analytics/head.ts +4 -0
- package/src/analytics/index.ts +5 -0
- package/src/analytics/one-dollar-stats.ts +86 -0
- package/src/analytics/schema.ts +2 -0
- package/src/astro/generate.ts +133 -19
- package/src/astro/include-hmr.ts +31 -12
- package/src/astro/include-refresh.ts +19 -8
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +143 -14
- package/src/astro/module-types.ts +6 -0
- package/src/astro/runtime-modules.ts +28 -13
- package/src/astro/templates.ts +364 -67
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +19 -0
- 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 +13 -13
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/graph.ts +3 -1
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +14 -9
- package/src/audit/snapshot.ts +5 -0
- package/src/audit/types.ts +2 -1
- package/src/blume-modules.d.ts +7 -0
- 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 +32 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +4 -1
- package/src/cli/commands/doctor.ts +25 -17
- package/src/cli/commands/eval.ts +19 -11
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/translate.ts +9 -12
- package/src/cli/commands/validate.ts +3 -1
- package/src/cli/dev-lock.ts +157 -37
- package/src/cli/index.ts +5 -0
- package/src/cli/report-format.ts +11 -6
- package/src/cli/required-secrets.ts +71 -29
- package/src/components/BlumePage.astro +2 -0
- package/src/components/colors.ts +19 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +62 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Badge.astro +5 -3
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/Component.astro +2 -2
- 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/Tab.astro +0 -1
- package/src/components/content/Tabs.astro +4 -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 +100 -0
- package/src/components/content/api-page.ts +224 -0
- package/src/components/content/badge-color.ts +5 -2
- package/src/components/content/base-href.ts +13 -36
- 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 +125 -18
- package/src/components/islands/base-path.ts +47 -10
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +145 -40
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/islands/webmcp.ts +4 -2
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +11 -4
- 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/DiscoveryLinks.astro +9 -5
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +124 -82
- package/src/components/layout/LanguageSwitcher.astro +50 -17
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +35 -9
- package/src/components/layout/NavTabMenu.astro +3 -3
- package/src/components/layout/NavTree.astro +16 -6
- package/src/components/layout/PageActions.astro +4 -3
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +78 -9
- package/src/components/layout/Pagination.astro +3 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +313 -50
- package/src/components/layout/Search.astro +64 -30
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/VersionBanner.astro +2 -2
- package/src/components/layout/analytics-client.ts +12 -0
- 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/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/analytics.ts +98 -0
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/types.ts +20 -0
- package/src/components/layout/search/typesense.ts +5 -1
- package/src/components/layout/toc-active.ts +41 -0
- package/src/components/layout/toc-element.ts +8 -14
- package/src/components/openapi/ApiTagOperations.astro +2 -2
- package/src/components/openapi/AsyncApiOperation.astro +7 -4
- package/src/components/openapi/GraphqlChip.astro +2 -2
- package/src/components/openapi/Operation.astro +163 -13
- package/src/components/openapi/Playground.astro +4 -4
- package/src/components/openapi/RequestBody.astro +6 -4
- package/src/components/openapi/RequestPanel.astro +63 -8
- package/src/components/openapi/Responses.astro +6 -4
- package/src/components/openapi/SchemaTable.astro +7 -0
- package/src/components/openapi/async-snippets.ts +4 -4
- package/src/components/openapi/async.ts +38 -6
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/helpers.ts +19 -9
- package/src/components/openapi/message-composer.ts +6 -1
- package/src/components/openapi/message.ts +17 -2
- package/src/components/openapi/operation-model.ts +81 -11
- package/src/components/openapi/panel.ts +4 -2
- package/src/components/openapi/param-style.ts +181 -0
- package/src/components/openapi/playground-client.ts +73 -16
- package/src/components/openapi/request.ts +190 -26
- package/src/components/openapi/schema-tree.ts +30 -24
- package/src/components/openapi/security.ts +6 -3
- package/src/components/openapi/snippets.ts +953 -13
- package/src/components/openapi/ws-client.ts +18 -2
- 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/base-path.ts +62 -16
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/client-address.ts +19 -0
- package/src/core/config-input.ts +203 -27
- package/src/core/data.ts +44 -4
- package/src/core/diagnostics.ts +5 -2
- package/src/core/directive-diagnostics.ts +99 -0
- package/src/core/footer.ts +26 -0
- package/src/core/frontmatter.ts +21 -18
- package/src/core/graph.ts +39 -36
- package/src/core/heading-markers.ts +5 -18
- package/src/core/i18n-ui.ts +82 -2
- package/src/core/i18n.ts +31 -3
- package/src/core/includes.ts +20 -3
- package/src/core/last-modified.ts +25 -3
- package/src/core/links.ts +16 -2
- package/src/core/locale-links.ts +5 -1
- package/src/core/localizable.ts +26 -0
- package/src/core/meta.ts +33 -19
- package/src/core/navigation.ts +71 -20
- package/src/core/page-modes.ts +56 -0
- package/src/core/project-graph.ts +138 -10
- package/src/core/redirect-patterns.ts +491 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +342 -68
- package/src/core/sources/contentful-rich-text.ts +27 -20
- package/src/core/sources/filesystem.ts +20 -2
- package/src/core/sources/github-releases.ts +25 -6
- package/src/core/sources/lexical.ts +23 -18
- package/src/core/sources/lower.ts +201 -34
- package/src/core/sources/mdx-remote.ts +51 -16
- package/src/core/sources/normalize.ts +327 -91
- package/src/core/sources/notion.ts +52 -25
- package/src/core/sources/obsidian.ts +23 -6
- package/src/core/sources/portable-text.ts +38 -21
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/strapi-blocks.ts +20 -16
- package/src/core/sources/watch.ts +20 -7
- package/src/core/standard-schema.ts +10 -6
- package/src/core/types.ts +1 -1
- package/src/core/ui-packs/ar.ts +43 -0
- package/src/core/ui-packs/bg.ts +45 -0
- package/src/core/ui-packs/bn.ts +43 -0
- package/src/core/ui-packs/ca.ts +46 -0
- package/src/core/ui-packs/cs.ts +44 -0
- package/src/core/ui-packs/da.ts +45 -0
- package/src/core/ui-packs/de.ts +46 -0
- package/src/core/ui-packs/el.ts +45 -0
- package/src/core/ui-packs/es.ts +46 -0
- package/src/core/ui-packs/fa.ts +45 -0
- package/src/core/ui-packs/fi.ts +45 -0
- package/src/core/ui-packs/fr.ts +46 -0
- package/src/core/ui-packs/he.ts +43 -0
- package/src/core/ui-packs/hi.ts +44 -0
- package/src/core/ui-packs/hr.ts +45 -0
- package/src/core/ui-packs/hu.ts +44 -0
- package/src/core/ui-packs/id.ts +45 -0
- package/src/core/ui-packs/it.ts +45 -0
- package/src/core/ui-packs/ja.ts +45 -0
- package/src/core/ui-packs/ko.ts +44 -0
- package/src/core/ui-packs/nl.ts +46 -0
- package/src/core/ui-packs/no.ts +44 -0
- package/src/core/ui-packs/pl.ts +45 -0
- package/src/core/ui-packs/pt-br.ts +46 -0
- package/src/core/ui-packs/pt.ts +45 -0
- package/src/core/ui-packs/ro.ts +45 -0
- package/src/core/ui-packs/ru.ts +45 -0
- package/src/core/ui-packs/sk.ts +44 -0
- package/src/core/ui-packs/sr.ts +45 -0
- package/src/core/ui-packs/sv.ts +44 -0
- package/src/core/ui-packs/th.ts +43 -0
- package/src/core/ui-packs/tr.ts +45 -0
- package/src/core/ui-packs/uk.ts +45 -0
- package/src/core/ui-packs/vi.ts +45 -0
- package/src/core/ui-packs/zh-tw.ts +43 -0
- package/src/core/ui-packs/zh.ts +43 -0
- package/src/core/variables.ts +103 -0
- package/src/core/version-cut.ts +52 -15
- package/src/deploy/artifacts.ts +104 -14
- package/src/deploy/cloudflare-negotiation.ts +39 -17
- package/src/deploy/headers.ts +10 -5
- package/src/deploy/node-headers.ts +64 -10
- package/src/deploy/platforms/cloudflare.ts +44 -3
- package/src/deploy/platforms/netlify.ts +34 -1
- package/src/deploy/platforms/node.ts +1 -0
- package/src/deploy/platforms/static.ts +1 -0
- package/src/deploy/platforms/types.ts +8 -0
- package/src/deploy/platforms/vercel.ts +38 -2
- package/src/deploy/redirects.ts +139 -36
- package/src/deploy/robots.ts +2 -2
- package/src/deploy/rss.ts +4 -3
- package/src/deploy/sitemap.ts +7 -5
- package/src/deploy/vercel-negotiation.ts +36 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/base-links.ts +34 -36
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/directives.ts +242 -36
- package/src/markdown/features.ts +20 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +35 -11
- package/src/markdown/math.ts +4 -4
- package/src/markdown/mdast.ts +5 -2
- package/src/markdown/relative-links.ts +12 -4
- 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 +136 -11
- package/src/og/derive.ts +41 -31
- package/src/og/index.ts +1 -0
- package/src/openapi/asyncapi.ts +4 -2
- package/src/openapi/model.ts +77 -36
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +55 -2
- package/src/openapi/proxy.ts +63 -10
- package/src/openapi/references.ts +21 -5
- package/src/openapi/render-mdx.ts +46 -3
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +1 -1
- 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 +229 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +30 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +5 -2
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +51 -7
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +201 -28
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/version-scope.ts +30 -0
- package/src/search/documents.ts +93 -28
- package/src/search/orama-index.ts +28 -3
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/popular.ts +2 -1
- package/src/search/sync/algolia.ts +15 -4
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +5 -0
- package/src/seo/jsonld.ts +7 -3
- package/src/seo/metatags.ts +67 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +56 -3
- package/src/theme/palette.ts +121 -45
- package/src/translate/meta.ts +68 -24
- package/src/translate/prompts.ts +1 -0
- package/src/translate/run.ts +3 -3
- package/src/translate/validate.ts +12 -3
- package/src/translate/work-list.ts +56 -17
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-3yce002v.js.map +0 -14
- package/dist/cli/chunk-5r8g91qn.js.map +0 -34
- package/dist/cli/chunk-6dtt0zfn.js.map +0 -10
- package/dist/cli/chunk-7mbqtmgb.js.map +0 -10
- package/dist/cli/chunk-ddndchfr.js.map +0 -14
- package/dist/cli/chunk-esh98wmb.js +0 -23
- package/dist/cli/chunk-esh98wmb.js.map +0 -10
- package/dist/cli/chunk-hqp2ajnh.js.map +0 -35
- package/dist/cli/chunk-hr8ne106.js.map +0 -13
- package/dist/cli/chunk-j85scx15.js.map +0 -10
- package/dist/cli/chunk-mqc662a6.js +0 -75
- package/dist/cli/chunk-mqc662a6.js.map +0 -11
- package/dist/cli/chunk-pbg5a4s3.js.map +0 -19
- package/dist/cli/chunk-qkb5a8sa.js.map +0 -10
- package/dist/cli/chunk-v6ya5kcb.js.map +0 -189
- package/dist/cli/chunk-wdrt2k2v.js.map +0 -10
- package/dist/cli/chunk-xh43dwgw.js.map +0 -36
- package/docs/content/sources.mdx +0 -338
- /package/dist/cli/{chunk-zp79m0ts.js.map → chunk-1n228xqb.js.map} +0 -0
- /package/dist/cli/{chunk-h2ez8dzb.js.map → chunk-5ffywsmb.js.map} +0 -0
- /package/dist/cli/{chunk-g698a744.js.map → chunk-5wj2qwn2.js.map} +0 -0
- /package/dist/cli/{chunk-sqw4ekg1.js.map → chunk-amrb6hgh.js.map} +0 -0
- /package/dist/cli/{chunk-h7k3nq3v.js.map → chunk-gp84za0h.js.map} +0 -0
- /package/dist/cli/{chunk-bfwp9vp6.js.map → chunk-p804f3pe.js.map} +0 -0
- /package/dist/cli/{chunk-00gs3wqs.js.map → chunk-ta27feev.js.map} +0 -0
- /package/dist/cli/{chunk-bbnwccaz.js.map → chunk-y4ykbark.js.map} +0 -0
package/src/reference/scalar.ts
CHANGED
|
@@ -2,7 +2,13 @@ import { z } from "zod";
|
|
|
2
2
|
|
|
3
3
|
import type { AdapterDescriptor, JsonValue } from "../core/adapter.ts";
|
|
4
4
|
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
hasSources,
|
|
7
|
+
missingSourcesIssue,
|
|
8
|
+
overlaysHaveSpec,
|
|
9
|
+
overlaysNeedSpecIssue,
|
|
10
|
+
overlaysSchema,
|
|
11
|
+
} from "./options.ts";
|
|
6
12
|
|
|
7
13
|
/**
|
|
8
14
|
* What the generated Scalar page imports. Declared on every `scalar()`
|
|
@@ -22,6 +28,11 @@ export const scalarSourceSchema = z.strictObject({
|
|
|
22
28
|
label: z.string().optional(),
|
|
23
29
|
/** Emit noindex metadata and omit the page from the sitemap. */
|
|
24
30
|
noindex: z.boolean().default(false),
|
|
31
|
+
/**
|
|
32
|
+
* OpenAPI Overlay documents applied in order to the document before it's
|
|
33
|
+
* embedded (inlined, so a remote spec with overlays is fetched at build).
|
|
34
|
+
*/
|
|
35
|
+
overlays: overlaysSchema,
|
|
25
36
|
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
26
37
|
route: z.string().optional(),
|
|
27
38
|
/** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
|
|
@@ -34,6 +45,8 @@ export interface ScalarSourceOptions {
|
|
|
34
45
|
label?: string;
|
|
35
46
|
/** Emit noindex metadata and omit the page from the sitemap. Defaults to `false`. */
|
|
36
47
|
noindex?: boolean;
|
|
48
|
+
/** OpenAPI Overlay documents applied in order to the document before it's embedded. */
|
|
49
|
+
overlays?: string[];
|
|
37
50
|
/** Per-source route; defaults to the adapter's `route` (or a derived path). */
|
|
38
51
|
route?: string;
|
|
39
52
|
/** Local path or `http(s)` URL to the OpenAPI or AsyncAPI document. */
|
|
@@ -55,6 +68,8 @@ export type ResolvedScalarOptions = {
|
|
|
55
68
|
|
|
56
69
|
/** The options {@link scalar} maps itself. */
|
|
57
70
|
export interface ScalarNamedOptions {
|
|
71
|
+
/** OpenAPI Overlay documents for `spec`; with `sources`, each takes its own. */
|
|
72
|
+
overlays?: string[];
|
|
58
73
|
/** Where the reference mounts. Defaults to `/reference`. */
|
|
59
74
|
route?: string;
|
|
60
75
|
/** One or more documents; each renders on its own route by default. */
|
|
@@ -87,6 +102,8 @@ export type ScalarOptions = ScalarNamedOptions & {
|
|
|
87
102
|
*/
|
|
88
103
|
export const scalarOptionsSchema = z
|
|
89
104
|
.object({
|
|
105
|
+
/** Overlays for the `spec` shorthand. */
|
|
106
|
+
overlays: z.array(z.string()).optional(),
|
|
90
107
|
/** Where the reference mounts. */
|
|
91
108
|
route: z.string().default("/reference"),
|
|
92
109
|
/** One or more documents; each renders on its own route by default. */
|
|
@@ -97,13 +114,21 @@ export const scalarOptionsSchema = z
|
|
|
97
114
|
theme: z.string().optional(),
|
|
98
115
|
})
|
|
99
116
|
.catchall(z.json())
|
|
100
|
-
.
|
|
101
|
-
|
|
102
|
-
sources:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
117
|
+
.refine(overlaysHaveSpec, overlaysNeedSpecIssue)
|
|
118
|
+
.transform(
|
|
119
|
+
({ overlays, spec, sources, ...options }): ResolvedScalarOptions => ({
|
|
120
|
+
...options,
|
|
121
|
+
sources:
|
|
122
|
+
spec === undefined
|
|
123
|
+
? sources
|
|
124
|
+
: [
|
|
125
|
+
scalarSourceSchema.parse(
|
|
126
|
+
overlays ? { overlays, spec } : { spec }
|
|
127
|
+
),
|
|
128
|
+
...sources,
|
|
129
|
+
],
|
|
130
|
+
})
|
|
131
|
+
)
|
|
107
132
|
.refine(hasSources, missingSourcesIssue("scalar"));
|
|
108
133
|
|
|
109
134
|
export type ScalarAdapter = AdapterDescriptor<"scalar", ScalarOptions>;
|
package/src/registry/eject.ts
CHANGED
|
@@ -3,10 +3,13 @@ import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
|
3
3
|
|
|
4
4
|
import { join, relative } from "pathe";
|
|
5
5
|
|
|
6
|
+
import { OPENAPI_PATH } from "../ai/api/paths.ts";
|
|
7
|
+
import { buildApiSpec } from "../ai/api/spec.ts";
|
|
6
8
|
import { buildAskData } from "../ai/ask-data.ts";
|
|
7
9
|
import { resolveAskBackend } from "../ai/ask.ts";
|
|
8
10
|
import { buildRawMarkdown } from "../ai/markdown.ts";
|
|
9
11
|
import { buildMcpData } from "../ai/mcp/data.ts";
|
|
12
|
+
import type { McpData } from "../ai/mcp/data.ts";
|
|
10
13
|
import { buildMcpDiscovery, buildMcpServerCard } from "../ai/mcp/discovery.ts";
|
|
11
14
|
import { planComponentSlots } from "../astro/component-slots.ts";
|
|
12
15
|
import {
|
|
@@ -31,6 +34,11 @@ import {
|
|
|
31
34
|
import { discoverIslands } from "../astro/islands.ts";
|
|
32
35
|
import { customOgRoutes, discoverPages, routeIsTaken } from "../astro/pages.ts";
|
|
33
36
|
import {
|
|
37
|
+
apiNavigationTemplate,
|
|
38
|
+
apiNotFoundTemplate,
|
|
39
|
+
apiPagesIndexTemplate,
|
|
40
|
+
apiPageTemplate,
|
|
41
|
+
apiSearchTemplate,
|
|
34
42
|
askComponentTemplate,
|
|
35
43
|
askEndpointTemplate,
|
|
36
44
|
astroConfigTemplate,
|
|
@@ -46,6 +54,8 @@ import {
|
|
|
46
54
|
mcpEndpointTemplate,
|
|
47
55
|
mcpPageFile,
|
|
48
56
|
mixedbreadSearchEndpointTemplate,
|
|
57
|
+
notFoundJsonTemplate,
|
|
58
|
+
notFoundMarkdownTemplate,
|
|
49
59
|
notFoundPageTemplate,
|
|
50
60
|
ogEndpointTemplate,
|
|
51
61
|
playgroundProxyTemplate,
|
|
@@ -53,6 +63,7 @@ import {
|
|
|
53
63
|
rssEndpointTemplate,
|
|
54
64
|
runtimeDependencies,
|
|
55
65
|
runtimeTsconfigTemplate,
|
|
66
|
+
consentClientTemplate,
|
|
56
67
|
searchClientTemplate,
|
|
57
68
|
searchEndpointTemplate,
|
|
58
69
|
staticJsonEndpointTemplate,
|
|
@@ -68,6 +79,7 @@ import {
|
|
|
68
79
|
} from "../core/sources/collection.ts";
|
|
69
80
|
import type { ProjectContext } from "../core/types.ts";
|
|
70
81
|
import { buildRssFeeds, renderRssFeed } from "../deploy/rss.ts";
|
|
82
|
+
import { resolveOgFonts } from "../og/derive.ts";
|
|
71
83
|
import type { OpenApiData } from "../openapi/model.ts";
|
|
72
84
|
import {
|
|
73
85
|
hasScalarReferences,
|
|
@@ -80,6 +92,7 @@ import {
|
|
|
80
92
|
examplesEntryTemplate,
|
|
81
93
|
tailwindEntryTemplate,
|
|
82
94
|
} from "../theme/entry.ts";
|
|
95
|
+
import { fontLocaleCodes } from "../theme/fonts.ts";
|
|
83
96
|
import { buildThemeCss } from "../theme/palette.ts";
|
|
84
97
|
import { rebaseSourceDirectives } from "../theme/sources.ts";
|
|
85
98
|
import { twoslashCss } from "../theme/twoslash.ts";
|
|
@@ -150,9 +163,12 @@ const askFiles = async (
|
|
|
150
163
|
const files = [
|
|
151
164
|
{
|
|
152
165
|
content: askEndpointTemplate(backend, {
|
|
166
|
+
captcha: assistant.captcha,
|
|
153
167
|
cors: assistant.cors,
|
|
154
168
|
instructions: assistant.instructions,
|
|
169
|
+
rateLimit: project.config.rateLimit,
|
|
155
170
|
retrieval: assistant.retrieval,
|
|
171
|
+
tools: assistant.tools ?? backend.toolsByDefault,
|
|
156
172
|
}),
|
|
157
173
|
path: join(srcDir, "pages", "api", "ask.ts"),
|
|
158
174
|
},
|
|
@@ -231,28 +247,43 @@ const playgroundProxyFiles = (
|
|
|
231
247
|
needsPlaygroundProxy(config)
|
|
232
248
|
? [
|
|
233
249
|
{
|
|
234
|
-
content: playgroundProxyTemplate(
|
|
250
|
+
content: playgroundProxyTemplate(
|
|
251
|
+
specOrigins(openApiData),
|
|
252
|
+
config.rateLimit
|
|
253
|
+
),
|
|
235
254
|
path: join(srcDir, PLAYGROUND_PROXY_ENTRY),
|
|
236
255
|
},
|
|
237
256
|
]
|
|
238
257
|
: [];
|
|
239
258
|
|
|
240
259
|
/**
|
|
241
|
-
* The
|
|
242
|
-
*
|
|
243
|
-
* is
|
|
260
|
+
* The agent data snapshot (`blume:mcp-data`) behind the MCP server and the
|
|
261
|
+
* JSON docs API, mirroring `publishAgentData` in generate.ts: built when
|
|
262
|
+
* either is on, null when neither needs it.
|
|
263
|
+
*/
|
|
264
|
+
const ejectAgentData = async (
|
|
265
|
+
project: BlumeProject,
|
|
266
|
+
userPages: { pattern: string }[]
|
|
267
|
+
): Promise<McpData | null> =>
|
|
268
|
+
hostsMcp(project, userPages) || project.config.agents.api
|
|
269
|
+
? await buildMcpData(project)
|
|
270
|
+
: null;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* The MCP server endpoint and `.well-known` discovery documents, mirroring
|
|
274
|
+
* `writeMcpFiles` in generate.ts. Empty when the server is disabled or its
|
|
275
|
+
* route is already owned by a page.
|
|
244
276
|
*/
|
|
245
|
-
const mcpFiles =
|
|
277
|
+
const mcpFiles = (
|
|
246
278
|
project: BlumeProject,
|
|
247
279
|
userPages: { pattern: string }[],
|
|
248
280
|
srcDir: string,
|
|
249
|
-
|
|
250
|
-
):
|
|
251
|
-
if (!hostsMcp(project, userPages)) {
|
|
281
|
+
data: McpData | null
|
|
282
|
+
): { content: string; path: string }[] => {
|
|
283
|
+
if (!(data && hostsMcp(project, userPages))) {
|
|
252
284
|
return [];
|
|
253
285
|
}
|
|
254
286
|
const { route } = project.config.agents.mcp;
|
|
255
|
-
const data = await buildMcpData(project);
|
|
256
287
|
const discoveryInput = {
|
|
257
288
|
base: data.base,
|
|
258
289
|
name: data.name,
|
|
@@ -261,10 +292,6 @@ const mcpFiles = async (
|
|
|
261
292
|
version: data.version,
|
|
262
293
|
};
|
|
263
294
|
return [
|
|
264
|
-
{
|
|
265
|
-
content: `${JSON.stringify(data)}\n`,
|
|
266
|
-
path: join(genDir, "mcp-data.json"),
|
|
267
|
-
},
|
|
268
295
|
{
|
|
269
296
|
content: mcpEndpointTemplate(),
|
|
270
297
|
path: join(srcDir, "pages", mcpPageFile(route)),
|
|
@@ -280,6 +307,87 @@ const mcpFiles = async (
|
|
|
280
307
|
];
|
|
281
308
|
};
|
|
282
309
|
|
|
310
|
+
/**
|
|
311
|
+
* The JSON docs API, mirroring `planApi` and `writeApiFiles` in generate.ts:
|
|
312
|
+
* the prerendered page index, per-page documents, and navigation; on server
|
|
313
|
+
* output the search endpoint and, unless a user page or a content page already
|
|
314
|
+
* lives under `/api/`, the JSON 404 catch-all; and `/openapi.json`, unless a
|
|
315
|
+
* `public/openapi.json` or a page owns that route. The ejected `llms.txt`,
|
|
316
|
+
* homepage `Link` header, and 404 page advertise these routes, so the ejected
|
|
317
|
+
* app serves them. Empty when `agents.api` is off.
|
|
318
|
+
*/
|
|
319
|
+
const apiFiles = (
|
|
320
|
+
project: BlumeProject,
|
|
321
|
+
userPages: { pattern: string }[],
|
|
322
|
+
root: string,
|
|
323
|
+
srcDir: string,
|
|
324
|
+
data: McpData | null
|
|
325
|
+
): { content: string; path: string }[] => {
|
|
326
|
+
const { config } = project;
|
|
327
|
+
if (!(data && config.agents.api)) {
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
const server = config.deployment.options.output === "server";
|
|
331
|
+
const apiDir = join(srcDir, "pages", "api");
|
|
332
|
+
const files = [
|
|
333
|
+
{
|
|
334
|
+
content: apiPagesIndexTemplate(),
|
|
335
|
+
path: join(apiDir, "docs", "pages.json.ts"),
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
content: apiPageTemplate(),
|
|
339
|
+
path: join(apiDir, "docs", "pages", "[...route].json.ts"),
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
content: apiNavigationTemplate(),
|
|
343
|
+
path: join(apiDir, "docs", "navigation.json.ts"),
|
|
344
|
+
},
|
|
345
|
+
];
|
|
346
|
+
if (server) {
|
|
347
|
+
files.push({
|
|
348
|
+
content: apiSearchTemplate(),
|
|
349
|
+
path: join(apiDir, "docs", "search.ts"),
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
const apiOwned =
|
|
353
|
+
userPages.some((page) => page.pattern.startsWith("/api/[")) ||
|
|
354
|
+
project.graph.pages.some(
|
|
355
|
+
(page) => page.route === "/api" || page.route.startsWith("/api/")
|
|
356
|
+
);
|
|
357
|
+
if (server && !apiOwned) {
|
|
358
|
+
files.push({
|
|
359
|
+
content: apiNotFoundTemplate({ base: data.base, site: data.site }),
|
|
360
|
+
path: join(apiDir, "[...path].ts"),
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
if (
|
|
364
|
+
!(
|
|
365
|
+
routeIsTaken(userPages, project.graph.pages, OPENAPI_PATH) ||
|
|
366
|
+
existsSync(join(root, "public", "openapi.json"))
|
|
367
|
+
)
|
|
368
|
+
) {
|
|
369
|
+
files.push({
|
|
370
|
+
content: staticJsonEndpointTemplate(
|
|
371
|
+
buildApiSpec({
|
|
372
|
+
agentReadability: config.agents.agentReadability,
|
|
373
|
+
base: data.base,
|
|
374
|
+
description: config.description,
|
|
375
|
+
llmsTxt: config.agents.llmsTxt.enabled,
|
|
376
|
+
mcpRoute: hostsMcp(project, userPages)
|
|
377
|
+
? config.agents.mcp.route
|
|
378
|
+
: null,
|
|
379
|
+
name: config.title,
|
|
380
|
+
search: server,
|
|
381
|
+
site: data.site,
|
|
382
|
+
version: data.version,
|
|
383
|
+
})
|
|
384
|
+
),
|
|
385
|
+
path: join(srcDir, "pages", "openapi.json.ts"),
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
return files;
|
|
389
|
+
};
|
|
390
|
+
|
|
283
391
|
/**
|
|
284
392
|
* The `/changelog` index page, mirroring `shouldGenerateChangelog` in
|
|
285
393
|
* generate.ts: emitted when `type: changelog` entries or a release-backed
|
|
@@ -346,6 +454,25 @@ const contentAssetFiles = async (
|
|
|
346
454
|
];
|
|
347
455
|
};
|
|
348
456
|
|
|
457
|
+
/**
|
|
458
|
+
* The partial → including-pages map with every path relative to the project
|
|
459
|
+
* root, like every other path in the ejected app, so it holds in any checkout.
|
|
460
|
+
* Its readers (`includeHmrPlugin`, `withIncludeRefresh`) resolve each path
|
|
461
|
+
* against the app's root, which after eject is the project itself.
|
|
462
|
+
*/
|
|
463
|
+
const portableIncludeGraph = (
|
|
464
|
+
project: BlumeProject,
|
|
465
|
+
root: string
|
|
466
|
+
): Record<string, string[]> =>
|
|
467
|
+
Object.fromEntries(
|
|
468
|
+
Object.entries(buildIncludeGraph(project.graph.pages)).map(
|
|
469
|
+
([partial, includers]) => [
|
|
470
|
+
toPosix(relative(root, partial)),
|
|
471
|
+
includers.map((page) => toPosix(relative(root, page))),
|
|
472
|
+
]
|
|
473
|
+
)
|
|
474
|
+
);
|
|
475
|
+
|
|
349
476
|
/** Contents of the configured `examples.css`, or `""` when unset/absent. */
|
|
350
477
|
/**
|
|
351
478
|
* Read a user stylesheet that eject inlines into a generated entry under
|
|
@@ -547,6 +674,7 @@ export const eject = async (
|
|
|
547
674
|
content: astroConfigTemplate({
|
|
548
675
|
askPath: "./src/generated/Ask.astro",
|
|
549
676
|
config,
|
|
677
|
+
consentClientPath: "./src/generated/consent-client.ts",
|
|
550
678
|
contentRoot: relContext.contentRoot,
|
|
551
679
|
contentRoutes: project.manifest.routes.map((route) => route.path),
|
|
552
680
|
context: relContext,
|
|
@@ -655,7 +783,7 @@ export const eject = async (
|
|
|
655
783
|
// hot update's read would silently no-op and partial edits would serve
|
|
656
784
|
// stale pages. A snapshot like the rest of `src/generated`: the ejected
|
|
657
785
|
// app owns (and may regenerate or prune) it.
|
|
658
|
-
content: `${JSON.stringify(
|
|
786
|
+
content: `${JSON.stringify(portableIncludeGraph(project, root))}\n`,
|
|
659
787
|
path: join(genDir, "includes.json"),
|
|
660
788
|
},
|
|
661
789
|
{
|
|
@@ -684,36 +812,74 @@ export const eject = async (
|
|
|
684
812
|
});
|
|
685
813
|
|
|
686
814
|
if (config.seo.og.enabled) {
|
|
815
|
+
// The default script fallbacks ride along (Google family names, nothing
|
|
816
|
+
// machine-specific), so a non-Latin card still renders after eject. An
|
|
817
|
+
// explicit seo.og.fonts replaces them, and isn't carried over.
|
|
818
|
+
const { fallbacks, families } = resolveOgFonts(
|
|
819
|
+
{
|
|
820
|
+
locales: fontLocaleCodes(config.i18n),
|
|
821
|
+
ogFonts: config.seo.og.fonts,
|
|
822
|
+
themeFonts: config.theme.fonts,
|
|
823
|
+
themeFontsConfigured: false,
|
|
824
|
+
},
|
|
825
|
+
root
|
|
826
|
+
);
|
|
687
827
|
files.push({
|
|
688
828
|
content: ogEndpointTemplate(
|
|
689
829
|
customOgRoutes(pages, config.title, config.seo.og.titles),
|
|
690
|
-
{
|
|
830
|
+
{
|
|
831
|
+
fallbacks,
|
|
832
|
+
families,
|
|
833
|
+
pageDescriptions: config.seo.og.description !== false,
|
|
834
|
+
},
|
|
691
835
|
changelog.length > 0
|
|
692
836
|
),
|
|
693
837
|
path: join(srcDir, "pages", "og", "[...slug].png.ts"),
|
|
694
838
|
});
|
|
695
839
|
}
|
|
696
840
|
|
|
697
|
-
// The hosted MCP server and the playground's built-in
|
|
698
|
-
// the generated runtime (`[]` when each is off).
|
|
841
|
+
// The hosted MCP server, the JSON docs API, and the playground's built-in
|
|
842
|
+
// proxy, mirrored from the generated runtime (`[]` when each is off). The
|
|
843
|
+
// server and the API share one agent data snapshot.
|
|
844
|
+
const agentData = await ejectAgentData(project, pages);
|
|
845
|
+
if (agentData) {
|
|
846
|
+
files.push({
|
|
847
|
+
content: `${JSON.stringify(agentData)}\n`,
|
|
848
|
+
path: join(genDir, "mcp-data.json"),
|
|
849
|
+
});
|
|
850
|
+
}
|
|
699
851
|
files.push(
|
|
700
|
-
...
|
|
852
|
+
...mcpFiles(project, pages, srcDir, agentData),
|
|
853
|
+
...apiFiles(project, pages, root, srcDir, agentData),
|
|
701
854
|
...changelog,
|
|
702
855
|
...playgroundProxyFiles(config, openApiData, srcDir)
|
|
703
856
|
);
|
|
704
857
|
|
|
705
|
-
// Default 404 page
|
|
706
|
-
//
|
|
707
|
-
//
|
|
858
|
+
// Default 404 page and its Markdown (`/404.md`) and JSON (`/404.json`)
|
|
859
|
+
// twins, mirroring `writeNotFoundPage` in generate.ts: all three are skipped
|
|
860
|
+
// when the project already owns `/404` (a custom `pages/404.astro` or a
|
|
861
|
+
// `404.md` content page). The ejected project owns the files afterwards and
|
|
862
|
+
// can edit or remove them.
|
|
708
863
|
if (!routeIsTaken(pages, project.graph.pages, "/404")) {
|
|
709
|
-
files.push(
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
864
|
+
files.push(
|
|
865
|
+
{
|
|
866
|
+
content: notFoundPageTemplate(),
|
|
867
|
+
path: join(srcDir, "pages", "404.astro"),
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
content: notFoundMarkdownTemplate(),
|
|
871
|
+
path: join(srcDir, "pages", "404.md.ts"),
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
content: notFoundJsonTemplate(),
|
|
875
|
+
path: join(srcDir, "pages", "404.json.ts"),
|
|
876
|
+
}
|
|
877
|
+
);
|
|
713
878
|
}
|
|
714
879
|
|
|
715
|
-
// The client-feature loaders behind the `blume:features` alias,
|
|
716
|
-
// provider-specific client loader behind `blume:search-client
|
|
880
|
+
// The client-feature loaders behind the `blume:features` alias, the
|
|
881
|
+
// provider-specific client loader behind `blume:search-client`, and the
|
|
882
|
+
// consent adapter's browser module behind `blume:consent-client`.
|
|
717
883
|
files.push(
|
|
718
884
|
{
|
|
719
885
|
content: featuresTemplate(features),
|
|
@@ -722,6 +888,10 @@ export const eject = async (
|
|
|
722
888
|
{
|
|
723
889
|
content: searchClientTemplate(config),
|
|
724
890
|
path: join(genDir, "search-client.ts"),
|
|
891
|
+
},
|
|
892
|
+
{
|
|
893
|
+
content: consentClientTemplate(config.consent),
|
|
894
|
+
path: join(genDir, "consent-client.ts"),
|
|
725
895
|
}
|
|
726
896
|
);
|
|
727
897
|
|
|
@@ -742,7 +912,10 @@ export const eject = async (
|
|
|
742
912
|
|
|
743
913
|
if (searchAdapter.kind === "mixedbread") {
|
|
744
914
|
files.push({
|
|
745
|
-
content: mixedbreadSearchEndpointTemplate(
|
|
915
|
+
content: mixedbreadSearchEndpointTemplate(
|
|
916
|
+
searchAdapter.options,
|
|
917
|
+
config.rateLimit
|
|
918
|
+
),
|
|
746
919
|
path: join(srcDir, "pages", "api", "search.ts"),
|
|
747
920
|
});
|
|
748
921
|
}
|
package/src/registry/registry.ts
CHANGED
|
@@ -262,6 +262,13 @@ export const registry: RegistryItem[] = [
|
|
|
262
262
|
name: "feedback",
|
|
263
263
|
slot: "Feedback",
|
|
264
264
|
}),
|
|
265
|
+
layoutComponent({
|
|
266
|
+
description:
|
|
267
|
+
"The site footer: a row of links, social icons, the theme toggle, and the Cookie settings link.",
|
|
268
|
+
file: "SiteFooter.astro",
|
|
269
|
+
name: "footer",
|
|
270
|
+
slot: "Footer",
|
|
271
|
+
}),
|
|
265
272
|
...CONTENT_COMPONENTS.map(contentComponent),
|
|
266
273
|
];
|
|
267
274
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SearchAdapterKind } from "./registry.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether each adapter's client can filter results to one docs version. The
|
|
5
|
+
* source-built indexes (Orama, FlexSearch) store every document's `version`,
|
|
6
|
+
* and the Algolia and Typesense syncs upload it as a facet their clients
|
|
7
|
+
* filter on. Pagefind indexes the built HTML with no version metadata, the
|
|
8
|
+
* Orama Cloud sync uploads no `version`, and the Mixedbread endpoint takes no
|
|
9
|
+
* filter, so those always search every version. Keyed by every kind so a new
|
|
10
|
+
* adapter has to decide.
|
|
11
|
+
*/
|
|
12
|
+
const SCOPES_VERSIONS = {
|
|
13
|
+
algolia: true,
|
|
14
|
+
flexsearch: true,
|
|
15
|
+
mixedbread: false,
|
|
16
|
+
none: false,
|
|
17
|
+
orama: true,
|
|
18
|
+
"orama-cloud": false,
|
|
19
|
+
pagefind: false,
|
|
20
|
+
typesense: true,
|
|
21
|
+
} satisfies Record<SearchAdapterKind, boolean>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Whether the configured search adapter scopes results to the viewed docs
|
|
25
|
+
* version. The search dialog offers its "All versions" toggle only when it
|
|
26
|
+
* does: on the others the toggle would change nothing, and every query
|
|
27
|
+
* already spans all versions.
|
|
28
|
+
*/
|
|
29
|
+
export const scopesVersions = (kind: SearchAdapterKind): boolean =>
|
|
30
|
+
SCOPES_VERSIONS[kind];
|