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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { HeadScript } from "./head.ts";
|
|
6
|
+
|
|
7
|
+
/** The script OneDollarStats' install snippet loads. */
|
|
8
|
+
export const ONE_DOLLAR_STATS_SCRIPT_SRC =
|
|
9
|
+
"https://assets.onedollarstats.com/stonks.js";
|
|
10
|
+
|
|
11
|
+
/** The options {@link oneDollarStats} checks itself. */
|
|
12
|
+
export interface OneDollarStatsNamedOptions {
|
|
13
|
+
/**
|
|
14
|
+
* A bare host name, e.g. `docs.example.com`. The tracker reports every
|
|
15
|
+
* event under it on every host, not just `localhost`.
|
|
16
|
+
*/
|
|
17
|
+
hostname?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Options for {@link oneDollarStats}: any tracker setting, forwarded as a
|
|
22
|
+
* `data-` attribute on the tag (`hostname` → `data-hostname`, `devmode`,
|
|
23
|
+
* `url`, `autocollect`, `"hash-routing"`, …).
|
|
24
|
+
*/
|
|
25
|
+
export type OneDollarStatsOptions = OneDollarStatsNamedOptions & {
|
|
26
|
+
[setting: string]: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const oneDollarStatsOptionsSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
hostname: z
|
|
32
|
+
.string()
|
|
33
|
+
.regex(/^[\p{L}\p{N}-]+(?:\.[\p{L}\p{N}-]+)*(?::\d+)?$/u, {
|
|
34
|
+
message:
|
|
35
|
+
"`hostname` must be a bare host name like `docs.example.com`, without `https://`, a path, a query, or a fragment.",
|
|
36
|
+
})
|
|
37
|
+
.optional(),
|
|
38
|
+
})
|
|
39
|
+
.catchall(z.string());
|
|
40
|
+
|
|
41
|
+
export type OneDollarStatsAdapter = AdapterDescriptor<
|
|
42
|
+
"one-dollar-stats",
|
|
43
|
+
OneDollarStatsOptions
|
|
44
|
+
>;
|
|
45
|
+
|
|
46
|
+
export const oneDollarStatsAdapterSchema = adapterDescriptorSchema(
|
|
47
|
+
"one-dollar-stats",
|
|
48
|
+
oneDollarStatsOptionsSchema
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* OneDollarStats. Needs no keys — the dashboard matches events to a site by
|
|
53
|
+
* the domain they come from.
|
|
54
|
+
*/
|
|
55
|
+
export const oneDollarStats = (
|
|
56
|
+
options: OneDollarStatsOptions = {}
|
|
57
|
+
): OneDollarStatsAdapter => ({
|
|
58
|
+
kind: "one-dollar-stats",
|
|
59
|
+
options,
|
|
60
|
+
requiredSecrets: [],
|
|
61
|
+
runtimeDeps: [],
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The deferred tag from the install instructions, with every option as its
|
|
66
|
+
* own `data-` attribute. The tracker reads them from `document.currentScript`,
|
|
67
|
+
* so the tag stays a classic external script. It hooks `pushState` and
|
|
68
|
+
* `popstate` itself, so client-router navigations need no extra hook.
|
|
69
|
+
*
|
|
70
|
+
* The tracker turns hash routing on whenever `data-hash-routing` is present,
|
|
71
|
+
* whatever its value, so `"hash-routing": "false"` leaves the attribute off.
|
|
72
|
+
*/
|
|
73
|
+
export const oneDollarStatsHead = (
|
|
74
|
+
options: OneDollarStatsOptions
|
|
75
|
+
): HeadScript[] => {
|
|
76
|
+
const attributes: HeadScript["attributes"] = {};
|
|
77
|
+
for (const [setting, value] of Object.entries(options)) {
|
|
78
|
+
if (setting === "hash-routing" && value === "false") {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
attributes[`data-${setting}`] = value;
|
|
82
|
+
}
|
|
83
|
+
attributes.defer = true;
|
|
84
|
+
attributes.src = ONE_DOLLAR_STATS_SCRIPT_SRC;
|
|
85
|
+
return [{ attributes, content: null }];
|
|
86
|
+
};
|
package/src/analytics/schema.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { hightouchAdapterSchema } from "./hightouch.ts";
|
|
|
14
14
|
import { hotjarAdapterSchema } from "./hotjar.ts";
|
|
15
15
|
import { logrocketAdapterSchema } from "./logrocket.ts";
|
|
16
16
|
import { mixpanelAdapterSchema } from "./mixpanel.ts";
|
|
17
|
+
import { oneDollarStatsAdapterSchema } from "./one-dollar-stats.ts";
|
|
17
18
|
import { pirschAdapterSchema } from "./pirsch.ts";
|
|
18
19
|
import { plausibleAdapterSchema } from "./plausible.ts";
|
|
19
20
|
import { posthogAdapterSchema } from "./posthog.ts";
|
|
@@ -37,6 +38,7 @@ export const analyticsAdapterSchema = z.discriminatedUnion("kind", [
|
|
|
37
38
|
hotjarAdapterSchema,
|
|
38
39
|
logrocketAdapterSchema,
|
|
39
40
|
mixpanelAdapterSchema,
|
|
41
|
+
oneDollarStatsAdapterSchema,
|
|
40
42
|
pirschAdapterSchema,
|
|
41
43
|
plausibleAdapterSchema,
|
|
42
44
|
posthogAdapterSchema,
|
package/src/astro/generate.ts
CHANGED
|
@@ -27,6 +27,8 @@ import type { RawMarkdownEntry } from "../ai/markdown.ts";
|
|
|
27
27
|
import { buildMcpData } from "../ai/mcp/data.ts";
|
|
28
28
|
import type { McpData } from "../ai/mcp/data.ts";
|
|
29
29
|
import { buildMcpDiscovery, buildMcpServerCard } from "../ai/mcp/discovery.ts";
|
|
30
|
+
import { captchaSettings } from "../captcha/schema.ts";
|
|
31
|
+
import { parseApiEndpoint } from "../components/content/api-page.ts";
|
|
30
32
|
import {
|
|
31
33
|
hasDeferrableGroups,
|
|
32
34
|
navVariants,
|
|
@@ -44,6 +46,7 @@ import {
|
|
|
44
46
|
} from "../core/content-assets.ts";
|
|
45
47
|
import type {
|
|
46
48
|
BlumeBanner,
|
|
49
|
+
BlumeDataConfig,
|
|
47
50
|
BlumeData,
|
|
48
51
|
BlumeFavicon,
|
|
49
52
|
BlumeLogo,
|
|
@@ -58,6 +61,7 @@ import {
|
|
|
58
61
|
import { EN_UI, resolveUIStrings } from "../core/i18n-ui.ts";
|
|
59
62
|
import { resolveFallbackLocale } from "../core/i18n.ts";
|
|
60
63
|
import { buildIncludeGraph } from "../core/includes.ts";
|
|
64
|
+
import { resolveLocalizable } from "../core/localizable.ts";
|
|
61
65
|
import {
|
|
62
66
|
validateNavTargets,
|
|
63
67
|
validateSearchPopularIcons,
|
|
@@ -85,6 +89,7 @@ import type { AsyncApiSpecValue } from "../openapi/asyncapi.ts";
|
|
|
85
89
|
import type { ApiSpecData, HttpMethod, OpenApiData } from "../openapi/model.ts";
|
|
86
90
|
import { HTTP_METHODS, withServerDefaults } from "../openapi/model.ts";
|
|
87
91
|
import {
|
|
92
|
+
apiPagesUseBuiltinProxy,
|
|
88
93
|
builtinProxyReferences,
|
|
89
94
|
hasScalarReferences,
|
|
90
95
|
needsPlaygroundProxy,
|
|
@@ -159,6 +164,7 @@ import {
|
|
|
159
164
|
runtimeTsconfigTemplate,
|
|
160
165
|
featuresTemplate,
|
|
161
166
|
navFragmentTemplate,
|
|
167
|
+
consentClientTemplate,
|
|
162
168
|
searchClientTemplate,
|
|
163
169
|
searchEndpointTemplate,
|
|
164
170
|
stagedContentDir,
|
|
@@ -749,12 +755,12 @@ const isStringShorthand = <T>(value: T | string): value is string =>
|
|
|
749
755
|
typeof value === "string";
|
|
750
756
|
|
|
751
757
|
/**
|
|
752
|
-
* The URL behind the
|
|
753
|
-
* drives the per-page edit link, the
|
|
758
|
+
* The URL behind the footer's repo mark. A string is used as-is: `github`
|
|
759
|
+
* drives the per-page edit link, the footer mark and the manifest's
|
|
754
760
|
* `repository` together, so a project whose docs repo is private has to unset
|
|
755
761
|
* all three, and would otherwise have no way to point the mark at anything.
|
|
756
762
|
*/
|
|
757
|
-
const
|
|
763
|
+
const footerRepoUrl = (
|
|
758
764
|
repo: boolean | string,
|
|
759
765
|
derived: string | null
|
|
760
766
|
): string | null => {
|
|
@@ -961,11 +967,53 @@ const resolveBanner = (config: ResolvedConfig): BlumeBanner | null => {
|
|
|
961
967
|
return {
|
|
962
968
|
content: banner.content,
|
|
963
969
|
dismissible: banner.dismissible,
|
|
964
|
-
key:
|
|
970
|
+
key:
|
|
971
|
+
banner.id ??
|
|
972
|
+
resolveLocalizable(banner.content, undefined, config.i18n?.defaultLocale),
|
|
965
973
|
link: banner.link,
|
|
966
974
|
};
|
|
967
975
|
};
|
|
968
976
|
|
|
977
|
+
/** The URL the built-in proxy is injected at (see {@link planPlaygroundProxy}). */
|
|
978
|
+
export const playgroundProxyPattern = (config: ResolvedConfig): string =>
|
|
979
|
+
withBasePath(config.basePath, "/_api-proxy");
|
|
980
|
+
|
|
981
|
+
/**
|
|
982
|
+
* The hand-written endpoint defaults for the runtime, the playground's
|
|
983
|
+
* `proxy: true` resolved to the built-in route's URL, as an OpenAPI
|
|
984
|
+
* reference's is.
|
|
985
|
+
*/
|
|
986
|
+
const resolveApiPages = (config: ResolvedConfig): BlumeDataConfig["api"] => {
|
|
987
|
+
const { auth, playground, server } = config.api;
|
|
988
|
+
const resolved: BlumeDataConfig["api"] = {
|
|
989
|
+
playground: {
|
|
990
|
+
enabled: playground.enabled,
|
|
991
|
+
proxy:
|
|
992
|
+
playground.proxy === true
|
|
993
|
+
? playgroundProxyPattern(config)
|
|
994
|
+
: playground.proxy,
|
|
995
|
+
},
|
|
996
|
+
};
|
|
997
|
+
if (auth) {
|
|
998
|
+
resolved.auth = auth;
|
|
999
|
+
}
|
|
1000
|
+
if (server) {
|
|
1001
|
+
resolved.server = server;
|
|
1002
|
+
}
|
|
1003
|
+
return resolved;
|
|
1004
|
+
};
|
|
1005
|
+
|
|
1006
|
+
/** The footer config for the runtime: `null` when unset or empty, so no bare border renders. */
|
|
1007
|
+
const resolveFooter = (
|
|
1008
|
+
config: ResolvedConfig
|
|
1009
|
+
): ResolvedConfig["footer"] | null => {
|
|
1010
|
+
const { footer } = config;
|
|
1011
|
+
return footer &&
|
|
1012
|
+
(footer.links.length > 0 || Object.keys(footer.socials).length > 0)
|
|
1013
|
+
? footer
|
|
1014
|
+
: null;
|
|
1015
|
+
};
|
|
1016
|
+
|
|
969
1017
|
/**
|
|
970
1018
|
* The OG card's brand mark: a `seo.og.logo` of `false` opts out of any mark,
|
|
971
1019
|
* a configured SVG wins over the site logo, and a non-SVG value resolves to
|
|
@@ -1036,6 +1084,22 @@ const resolveGithubData = (
|
|
|
1036
1084
|
}
|
|
1037
1085
|
: null;
|
|
1038
1086
|
|
|
1087
|
+
/** The assistant's snapshot: what the panel needs, never a secret. */
|
|
1088
|
+
const resolveAssistant = (
|
|
1089
|
+
config: ResolvedConfig
|
|
1090
|
+
): BlumeDataConfig["assistant"] => {
|
|
1091
|
+
const { assistant } = config.ai;
|
|
1092
|
+
if (!assistant?.enabled) {
|
|
1093
|
+
return null;
|
|
1094
|
+
}
|
|
1095
|
+
return {
|
|
1096
|
+
captcha: assistant.captcha ? captchaSettings(assistant.captcha) : null,
|
|
1097
|
+
endpoint: assistant.endpoint ?? null,
|
|
1098
|
+
suggestions: assistant.suggestions,
|
|
1099
|
+
support: assistant.support ?? null,
|
|
1100
|
+
};
|
|
1101
|
+
};
|
|
1102
|
+
|
|
1039
1103
|
/** Serialize the content graph into the data module the runtime consumes. */
|
|
1040
1104
|
export const buildRuntimeData = (project: BlumeProject): string => {
|
|
1041
1105
|
const { config, context, graph, manifest } = project;
|
|
@@ -1067,10 +1131,10 @@ export const buildRuntimeData = (project: BlumeProject): string => {
|
|
|
1067
1131
|
|
|
1068
1132
|
const { i18n } = config;
|
|
1069
1133
|
|
|
1070
|
-
// Resolve the
|
|
1134
|
+
// Resolve the footer's repo link per locale. API references no longer add a tab
|
|
1071
1135
|
// automatically — authors point a `navigation.tabs` entry at the reference
|
|
1072
1136
|
// route to surface it (see `referenceRoutes`).
|
|
1073
|
-
const markUrl =
|
|
1137
|
+
const markUrl = footerRepoUrl(config.navigation.repo, repoUrl);
|
|
1074
1138
|
const withRepoUrl = (nav: Navigation): Navigation => ({
|
|
1075
1139
|
...nav,
|
|
1076
1140
|
repoUrl: markUrl,
|
|
@@ -1117,17 +1181,14 @@ export const buildRuntimeData = (project: BlumeProject): string => {
|
|
|
1117
1181
|
const data: BlumeData = {
|
|
1118
1182
|
config: {
|
|
1119
1183
|
analytics: config.analytics,
|
|
1184
|
+
api: resolveApiPages(config),
|
|
1120
1185
|
appleIcon: resolveAppleIcon(project),
|
|
1121
|
-
assistant: config
|
|
1122
|
-
? {
|
|
1123
|
-
endpoint: config.ai.assistant.endpoint ?? null,
|
|
1124
|
-
suggestions: config.ai.assistant.suggestions,
|
|
1125
|
-
}
|
|
1126
|
-
: null,
|
|
1186
|
+
assistant: resolveAssistant(config),
|
|
1127
1187
|
banner: resolveBanner(config),
|
|
1128
1188
|
basePath: config.basePath,
|
|
1129
1189
|
codeThemes: config.markdown.code.theme,
|
|
1130
1190
|
codeWrap: config.markdown.code.wrap,
|
|
1191
|
+
consent: config.consent,
|
|
1131
1192
|
dateFormat: config.dateFormat,
|
|
1132
1193
|
description: config.description,
|
|
1133
1194
|
discovery: {
|
|
@@ -1139,7 +1200,9 @@ export const buildRuntimeData = (project: BlumeProject): string => {
|
|
|
1139
1200
|
sitemap: config.seo.sitemap && Boolean(config.deployment.options.site),
|
|
1140
1201
|
},
|
|
1141
1202
|
favicon: resolveFavicon(project),
|
|
1142
|
-
feedback: config.feedback,
|
|
1203
|
+
feedback: config.feedback.enabled,
|
|
1204
|
+
feedbackComments: config.feedback.comments,
|
|
1205
|
+
footer: resolveFooter(config),
|
|
1143
1206
|
github: resolveGithubData(github),
|
|
1144
1207
|
i18n: i18n
|
|
1145
1208
|
? {
|
|
@@ -1153,6 +1216,7 @@ export const buildRuntimeData = (project: BlumeProject): string => {
|
|
|
1153
1216
|
dir,
|
|
1154
1217
|
label,
|
|
1155
1218
|
})),
|
|
1219
|
+
routeByBrowserLanguage: i18n.routeByBrowserLanguage,
|
|
1156
1220
|
}
|
|
1157
1221
|
: null,
|
|
1158
1222
|
// `undefined` members drop out of the JSON snapshot; the null keeps the
|
|
@@ -1172,6 +1236,10 @@ export const buildRuntimeData = (project: BlumeProject): string => {
|
|
|
1172
1236
|
route: config.agents.mcp.route,
|
|
1173
1237
|
}
|
|
1174
1238
|
: null,
|
|
1239
|
+
metatags: config.seo.metatags ?? null,
|
|
1240
|
+
narration: config.narration.enabled
|
|
1241
|
+
? { generated: config.narration.provider !== null }
|
|
1242
|
+
: null,
|
|
1175
1243
|
// `og.enabled` is resolved to a definite boolean in `loadConfig`; coerce
|
|
1176
1244
|
// the optional schema type so the serialized shape stays `boolean`.
|
|
1177
1245
|
// Card fonts are baked into the generated OG endpoint (they can carry
|
|
@@ -1496,10 +1564,6 @@ const writeApiFiles = async (
|
|
|
1496
1564
|
/** The proxy endpoint's file under the Astro `src/` dir (eject writes it too). */
|
|
1497
1565
|
export const PLAYGROUND_PROXY_ENTRY = join("blume-openapi", "api-proxy.ts");
|
|
1498
1566
|
|
|
1499
|
-
/** The URL the built-in proxy is injected at (see {@link planPlaygroundProxy}). */
|
|
1500
|
-
export const playgroundProxyPattern = (config: ResolvedConfig): string =>
|
|
1501
|
-
withBasePath(config.basePath, "/_api-proxy");
|
|
1502
|
-
|
|
1503
1567
|
/**
|
|
1504
1568
|
* Decide whether to generate the playground's built-in CORS proxy endpoint.
|
|
1505
1569
|
* Only the Blume renderer's playground with `proxy: true` needs it — a proxy
|
|
@@ -1592,6 +1656,47 @@ type DocumentPathItem = { servers?: DocumentServer[] } & Partial<
|
|
|
1592
1656
|
export const specOrigins = (data: OpenApiData): string[] =>
|
|
1593
1657
|
[...new Set(Object.values(data).flatMap(specOriginsOf))].toSorted();
|
|
1594
1658
|
|
|
1659
|
+
/** The origin of an absolute URL, or `null` for a path or anything unparsable. */
|
|
1660
|
+
const originOf = (url: string): string | null => {
|
|
1661
|
+
try {
|
|
1662
|
+
return new URL(url).origin;
|
|
1663
|
+
} catch {
|
|
1664
|
+
return null;
|
|
1665
|
+
}
|
|
1666
|
+
};
|
|
1667
|
+
|
|
1668
|
+
/**
|
|
1669
|
+
* The origins hand-written endpoint pages send to through the built-in
|
|
1670
|
+
* proxy: the site's `api.server`, and every page whose `api` names a full
|
|
1671
|
+
* URL. Empty unless those pages use the built-in proxy.
|
|
1672
|
+
*/
|
|
1673
|
+
export const apiPageOrigins = (project: BlumeProject): string[] => {
|
|
1674
|
+
const { config } = project;
|
|
1675
|
+
if (!apiPagesUseBuiltinProxy(config)) {
|
|
1676
|
+
return [];
|
|
1677
|
+
}
|
|
1678
|
+
const targets = project.graph.pages.map(
|
|
1679
|
+
(page) => parseApiEndpoint(page.meta.api ?? "")?.target ?? ""
|
|
1680
|
+
);
|
|
1681
|
+
return [config.api.server ?? "", ...targets].flatMap((target) => {
|
|
1682
|
+
const origin = originOf(target);
|
|
1683
|
+
return origin ? [origin] : [];
|
|
1684
|
+
});
|
|
1685
|
+
};
|
|
1686
|
+
|
|
1687
|
+
/**
|
|
1688
|
+
* A warning when the hand-written endpoint pages send through the built-in
|
|
1689
|
+
* proxy but name no absolute origin for it to allow, so it would refuse every
|
|
1690
|
+
* request they send.
|
|
1691
|
+
*/
|
|
1692
|
+
export const apiPageProxyWarnings = (project: BlumeProject): string[] =>
|
|
1693
|
+
apiPagesUseBuiltinProxy(project.config) &&
|
|
1694
|
+
apiPageOrigins(project).length === 0
|
|
1695
|
+
? [
|
|
1696
|
+
"api.playground.proxy is true, but api.server isn't an absolute URL and no page's api frontmatter names one, so the built-in proxy has no origin to allow and will refuse every request the endpoint pages send. Set api.server to the API's URL, like https://api.acme.com/v1.",
|
|
1697
|
+
]
|
|
1698
|
+
: [];
|
|
1699
|
+
|
|
1595
1700
|
/**
|
|
1596
1701
|
* Build-time diagnostics for playground sends the built-in proxy would refuse.
|
|
1597
1702
|
* The baked-in allowlist pools every documented origin, but each spec's
|
|
@@ -1644,9 +1749,12 @@ const writeAskFiles = async (
|
|
|
1644
1749
|
await write(
|
|
1645
1750
|
join(srcDir, "pages", "api", "ask.ts"),
|
|
1646
1751
|
askEndpointTemplate(backend, {
|
|
1752
|
+
captcha: assistant.captcha,
|
|
1647
1753
|
cors: assistant.cors,
|
|
1648
1754
|
instructions: assistant.instructions,
|
|
1755
|
+
rateLimit: project.config.rateLimit,
|
|
1649
1756
|
retrieval: assistant.retrieval,
|
|
1757
|
+
tools: assistant.tools ?? backend.toolsByDefault,
|
|
1650
1758
|
})
|
|
1651
1759
|
);
|
|
1652
1760
|
};
|
|
@@ -1863,6 +1971,7 @@ export const generateRuntime = async (
|
|
|
1863
1971
|
const askPath = join(srcDir, "generated", "Ask.astro");
|
|
1864
1972
|
const themePath = join(srcDir, "generated", "app.css");
|
|
1865
1973
|
const searchClientPath = join(srcDir, "generated", "search-client.ts");
|
|
1974
|
+
const consentClientPath = join(srcDir, "generated", "consent-client.ts");
|
|
1866
1975
|
const featuresPath = join(srcDir, "generated", "features.ts");
|
|
1867
1976
|
const examplesPath = join(srcDir, "generated", "examples.ts");
|
|
1868
1977
|
const examplesThemePath = join(srcDir, "generated", "examples.css");
|
|
@@ -1887,7 +1996,7 @@ export const generateRuntime = async (
|
|
|
1887
1996
|
// `astro.config.mjs` — which would restart the dev server in place.
|
|
1888
1997
|
const contentRoutes = markdownRoutePaths(project);
|
|
1889
1998
|
const homeLinkHeader =
|
|
1890
|
-
buildHomeLinkHeader(config, contentRoutes) ?? undefined;
|
|
1999
|
+
buildHomeLinkHeader(config, contentRoutes, "dev") ?? undefined;
|
|
1891
2000
|
|
|
1892
2001
|
const assistantEnabled = config.ai.assistant?.enabled ?? false;
|
|
1893
2002
|
const exportPdf = config.export.pdf;
|
|
@@ -2000,7 +2109,9 @@ export const generateRuntime = async (
|
|
|
2000
2109
|
// Computed once: the endpoint template bakes it in below. A spec that
|
|
2001
2110
|
// contributes no origin of its own gets a per-spec diagnostic
|
|
2002
2111
|
// (`proxyAllowlistWarnings`) — the proxy would refuse its every send.
|
|
2003
|
-
const proxyOrigins =
|
|
2112
|
+
const proxyOrigins = [
|
|
2113
|
+
...new Set([...specOrigins(openApiData), ...apiPageOrigins(project)]),
|
|
2114
|
+
].toSorted();
|
|
2004
2115
|
|
|
2005
2116
|
const hasStaged = staged.size > 0;
|
|
2006
2117
|
// Only emit a project-scanning `docs` collection when a filesystem source
|
|
@@ -2022,6 +2133,7 @@ export const generateRuntime = async (
|
|
|
2022
2133
|
aliases: resolveTsconfigAliases(context.root),
|
|
2023
2134
|
askPath,
|
|
2024
2135
|
config,
|
|
2136
|
+
consentClientPath,
|
|
2025
2137
|
contentRoot: docsCollection.base,
|
|
2026
2138
|
contentRoutes,
|
|
2027
2139
|
context,
|
|
@@ -2186,6 +2298,7 @@ export const generateRuntime = async (
|
|
|
2186
2298
|
}),
|
|
2187
2299
|
writeNotFoundPage(write, srcDir, pages, project.graph.pages),
|
|
2188
2300
|
write(searchClientPath, searchClientTemplate(config)),
|
|
2301
|
+
write(consentClientPath, consentClientTemplate(config.consent)),
|
|
2189
2302
|
write(featuresPath, featuresTemplate(clientFeatures)),
|
|
2190
2303
|
]);
|
|
2191
2304
|
|
|
@@ -2258,6 +2371,7 @@ export const generateRuntime = async (
|
|
|
2258
2371
|
const warnings: string[] = [
|
|
2259
2372
|
...(depsLinkWarning ? [depsLinkWarning] : []),
|
|
2260
2373
|
...proxyAllowlistWarnings(config, openApiData),
|
|
2374
|
+
...apiPageProxyWarnings(project),
|
|
2261
2375
|
...reactCompilerWarnings(config, needsReact, reactCompilerPath),
|
|
2262
2376
|
...mcp.warnings,
|
|
2263
2377
|
...islandDiscovery.warnings,
|
package/src/astro/include-hmr.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
|
|
3
|
+
import { resolve } from "pathe";
|
|
4
|
+
|
|
3
5
|
import { refreshBlumeContent } from "./integration.ts";
|
|
4
6
|
|
|
5
7
|
/**
|
|
@@ -18,12 +20,21 @@ import { refreshBlumeContent } from "./integration.ts";
|
|
|
18
20
|
*/
|
|
19
21
|
|
|
20
22
|
/** The Vite module-graph slice the plugin touches (structurally typed, like
|
|
21
|
-
* every Blume-authored Vite plugin — see `serverAppResolvePlugin`).
|
|
23
|
+
* every Blume-authored Vite plugin — see `serverAppResolvePlugin`). Every
|
|
24
|
+
* environment keeps its own graph, and the server's own `moduleGraph` only
|
|
25
|
+
* covers `client` and `ssr`: with `@astrojs/cloudflare` the content pages
|
|
26
|
+
* render in the `prerender` environment instead. */
|
|
22
27
|
interface IncludeHmrServer {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
config: { root: string };
|
|
29
|
+
environments: Record<
|
|
30
|
+
string,
|
|
31
|
+
{
|
|
32
|
+
moduleGraph: {
|
|
33
|
+
getModulesByFile: (file: string) => Set<unknown> | undefined;
|
|
34
|
+
invalidateModule: (mod: never) => void;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
>;
|
|
27
38
|
ws: { send: (payload: { type: "full-reload" }) => void };
|
|
28
39
|
}
|
|
29
40
|
|
|
@@ -51,16 +62,24 @@ export const includeHmrPlugin = (graphPath: string): IncludeHmrPlugin => ({
|
|
|
51
62
|
// No graph yet (first run) — nothing to invalidate.
|
|
52
63
|
return;
|
|
53
64
|
}
|
|
54
|
-
|
|
65
|
+
// An ejected app's graph is relative to the project, its Vite root; the
|
|
66
|
+
// hidden runtime's is absolute, which resolving leaves as it is.
|
|
67
|
+
const { config, environments, ws } = ctx.server;
|
|
68
|
+
const includers = Object.entries(graph).find(
|
|
69
|
+
([partial]) => resolve(config.root, partial) === ctx.file
|
|
70
|
+
)?.[1];
|
|
55
71
|
if (!includers || includers.length === 0) {
|
|
56
72
|
return;
|
|
57
73
|
}
|
|
58
|
-
const { moduleGraph
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
for (const { moduleGraph } of Object.values(environments)) {
|
|
75
|
+
for (const includer of includers) {
|
|
76
|
+
for (const mod of moduleGraph.getModulesByFile(
|
|
77
|
+
resolve(config.root, includer)
|
|
78
|
+
) ?? []) {
|
|
79
|
+
// SAFETY: the module came out of this module graph; `never` only
|
|
80
|
+
// reflects that the structural slice doesn't model the node type.
|
|
81
|
+
moduleGraph.invalidateModule(mod as never);
|
|
82
|
+
}
|
|
64
83
|
}
|
|
65
84
|
}
|
|
66
85
|
// Plain `.md` pages have no Vite module: their HTML lives in the
|
|
@@ -29,7 +29,10 @@ type StoreEntry = ReturnType<LoaderContext["store"]["entries"]>[number][1];
|
|
|
29
29
|
/** Meta-store key holding the recorded partials digest of an includer. */
|
|
30
30
|
const stateKey = (id: string): string => `blume:include-state:${id}`;
|
|
31
31
|
|
|
32
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* The generated include graph: partial → including pages, absolute in the
|
|
34
|
+
* hidden runtime and relative to the project root in an ejected app.
|
|
35
|
+
*/
|
|
33
36
|
type IncludeGraph = Record<string, string[]>;
|
|
34
37
|
|
|
35
38
|
/**
|
|
@@ -47,14 +50,22 @@ const readGraph = (graphPath: string): IncludeGraph => {
|
|
|
47
50
|
}
|
|
48
51
|
};
|
|
49
52
|
|
|
50
|
-
/**
|
|
51
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Invert the graph: absolute including page → its absolute partials, sorted.
|
|
55
|
+
* Each path resolves against the Astro root, which leaves the hidden runtime's
|
|
56
|
+
* absolute paths as they are.
|
|
57
|
+
*/
|
|
58
|
+
const partialsByPage = (
|
|
59
|
+
graph: IncludeGraph,
|
|
60
|
+
root: string
|
|
61
|
+
): Map<string, string[]> => {
|
|
52
62
|
const byPage = new Map<string, string[]>();
|
|
53
63
|
for (const [partial, pages] of Object.entries(graph)) {
|
|
54
64
|
for (const page of pages) {
|
|
55
|
-
const
|
|
56
|
-
partials.
|
|
57
|
-
|
|
65
|
+
const abs = resolve(root, page);
|
|
66
|
+
const partials = byPage.get(abs) ?? [];
|
|
67
|
+
partials.push(resolve(root, partial));
|
|
68
|
+
byPage.set(abs, partials);
|
|
58
69
|
}
|
|
59
70
|
}
|
|
60
71
|
for (const partials of byPage.values()) {
|
|
@@ -123,11 +134,11 @@ export const evictStaleIncluders = (
|
|
|
123
134
|
context: LoaderContext,
|
|
124
135
|
graphPath: string
|
|
125
136
|
): string[] => {
|
|
126
|
-
const
|
|
137
|
+
const root = fileURLToPath(context.config.root);
|
|
138
|
+
const byPage = partialsByPage(readGraph(graphPath), root);
|
|
127
139
|
if (byPage.size === 0) {
|
|
128
140
|
return [];
|
|
129
141
|
}
|
|
130
|
-
const root = fileURLToPath(context.config.root);
|
|
131
142
|
const evicted: string[] = [];
|
|
132
143
|
for (const [id, entry] of context.store.entries()) {
|
|
133
144
|
if (evictIfStale(context, byPage, root, id, entry)) {
|
package/src/astro/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { withAdapterRoot } from "./adapter-root.ts";
|
|
|
2
2
|
export { generateRuntime, prerenderDepsPlugin } from "./generate.ts";
|
|
3
3
|
export { includeHmrPlugin } from "./include-hmr.ts";
|
|
4
4
|
export { withIncludeRefresh } from "./include-refresh.ts";
|
|
5
|
+
export { variablesVitePlugin } from "./variables.ts";
|
|
5
6
|
export type { GenerateResult } from "./generate.ts";
|
|
6
7
|
export {
|
|
7
8
|
blumeIntegration,
|