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,224 @@
|
|
|
1
|
+
import type { ParameterLike, SchemaLike } from "../openapi/helpers.ts";
|
|
2
|
+
import { resolveSecurity } from "../openapi/security.ts";
|
|
3
|
+
import type { OperationSecurity } from "../openapi/security.ts";
|
|
4
|
+
import type { FieldValue, ParamLocation } from "./api-field.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A hand-written API page's endpoint, as its `api` frontmatter and its
|
|
8
|
+
* `<ParamField>`s describe it, turned into the OpenAPI-shaped pieces the
|
|
9
|
+
* operation playground and code samples are built from: a page with
|
|
10
|
+
* `api: "POST /v1/users"` gets the same Try it panel and request samples as
|
|
11
|
+
* a spec'd operation, with no spec. Mintlify's frontmatter, so migrated pages
|
|
12
|
+
* keep it as written.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** How a hand-written endpoint authenticates (`authMethod`, `api.auth.method`). */
|
|
16
|
+
export const AUTH_METHODS = ["bearer", "basic", "key", "none"] as const;
|
|
17
|
+
export type AuthMethod = (typeof AUTH_METHODS)[number];
|
|
18
|
+
|
|
19
|
+
/** What a page's playground shows: all of it, the samples only, or none. */
|
|
20
|
+
export const PLAYGROUND_MODES = ["interactive", "simple", "none"] as const;
|
|
21
|
+
export type PlaygroundMode = (typeof PLAYGROUND_MODES)[number];
|
|
22
|
+
|
|
23
|
+
/** `api` frontmatter: an HTTP method, then a path or a full URL. */
|
|
24
|
+
export const API_ENDPOINT =
|
|
25
|
+
/^(?<method>GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE)\s+(?<target>\S+)$/iu;
|
|
26
|
+
|
|
27
|
+
/** The site's default auth for hand-written endpoints (`api.auth`). */
|
|
28
|
+
export interface EndpointAuth {
|
|
29
|
+
method: AuthMethod;
|
|
30
|
+
/** The header an API key goes in. */
|
|
31
|
+
name?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** One `<ParamField>`, as the page's plugin collected it. */
|
|
35
|
+
export interface EndpointField {
|
|
36
|
+
default?: FieldValue;
|
|
37
|
+
deprecated?: boolean;
|
|
38
|
+
/** Body fields nested in this one's `<Expandable>`. */
|
|
39
|
+
fields?: EndpointField[];
|
|
40
|
+
location: ParamLocation;
|
|
41
|
+
name: string;
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
required?: boolean;
|
|
44
|
+
type?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** What the page's plugin hands the endpoint components. */
|
|
48
|
+
export interface EndpointSpec {
|
|
49
|
+
authMethod?: AuthMethod;
|
|
50
|
+
fields: EndpointField[];
|
|
51
|
+
method: string;
|
|
52
|
+
playground?: PlaygroundMode;
|
|
53
|
+
/** The page has a `<RequestExample>`, which stands in for generated samples. */
|
|
54
|
+
requestExample: boolean;
|
|
55
|
+
/** The `api` target as written: a path, or a full URL. */
|
|
56
|
+
target: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** The method and target of an `api` value, or `null` when it isn't one. */
|
|
60
|
+
export const parseApiEndpoint = (
|
|
61
|
+
value: string
|
|
62
|
+
): { method: string; target: string } | null => {
|
|
63
|
+
const groups = API_ENDPOINT.exec(value.trim())?.groups;
|
|
64
|
+
return groups?.method && groups.target
|
|
65
|
+
? { method: groups.method.toUpperCase(), target: groups.target }
|
|
66
|
+
: null;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const ABSOLUTE_URL = /^(?<origin>https?:\/\/[^/?#]+)(?<rest>.*)$/iu;
|
|
70
|
+
|
|
71
|
+
/** An endpoint's target, split the way the operation model takes it. */
|
|
72
|
+
export interface EndpointTarget {
|
|
73
|
+
path: string;
|
|
74
|
+
servers: { url: string }[];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The target split into a server and a path: a full URL is its own server,
|
|
79
|
+
* and a path joins the site's `api.server`, or stays relative to the docs
|
|
80
|
+
* when there is none.
|
|
81
|
+
*/
|
|
82
|
+
export const endpointTarget = (
|
|
83
|
+
target: string,
|
|
84
|
+
server?: string
|
|
85
|
+
): EndpointTarget => {
|
|
86
|
+
const absolute = ABSOLUTE_URL.exec(target)?.groups;
|
|
87
|
+
if (absolute?.origin) {
|
|
88
|
+
return {
|
|
89
|
+
path: absolute.rest || "/",
|
|
90
|
+
servers: [{ url: absolute.origin }],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
path: target.startsWith("/") ? target : `/${target}`,
|
|
95
|
+
servers: server ? [{ url: server.replace(/\/+$/u, "") }] : [],
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const PRIMITIVES = new Set([
|
|
100
|
+
"string",
|
|
101
|
+
"number",
|
|
102
|
+
"integer",
|
|
103
|
+
"boolean",
|
|
104
|
+
"object",
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* A field's JSON schema from its `type`: `string[]` an array of strings, a
|
|
109
|
+
* field with nested fields an object with those properties, and anything
|
|
110
|
+
* that isn't a JSON type (`enum<string>`, `Date`) a string, which is what it
|
|
111
|
+
* goes over the wire as. A default and placeholder carry over, the
|
|
112
|
+
* placeholder as the example the samples show.
|
|
113
|
+
*/
|
|
114
|
+
export const fieldSchema = (field: EndpointField): SchemaLike => {
|
|
115
|
+
const type = field.type?.trim().toLowerCase() ?? "";
|
|
116
|
+
if (type.endsWith("[]")) {
|
|
117
|
+
return {
|
|
118
|
+
items: fieldSchema({
|
|
119
|
+
...field,
|
|
120
|
+
default: undefined,
|
|
121
|
+
type: type.slice(0, -2),
|
|
122
|
+
}),
|
|
123
|
+
type: "array",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const nested = field.fields ?? [];
|
|
127
|
+
const schema: SchemaLike =
|
|
128
|
+
nested.length > 0
|
|
129
|
+
? {
|
|
130
|
+
properties: Object.fromEntries(
|
|
131
|
+
nested.map((child) => [child.name, fieldSchema(child)])
|
|
132
|
+
),
|
|
133
|
+
type: "object",
|
|
134
|
+
}
|
|
135
|
+
: { type: PRIMITIVES.has(type) ? type : "string" };
|
|
136
|
+
const required = nested
|
|
137
|
+
.filter((child) => child.required)
|
|
138
|
+
.map((child) => child.name);
|
|
139
|
+
if (required.length > 0) {
|
|
140
|
+
schema.required = required;
|
|
141
|
+
}
|
|
142
|
+
if (field.default !== undefined) {
|
|
143
|
+
schema.default = field.default;
|
|
144
|
+
}
|
|
145
|
+
if (field.placeholder) {
|
|
146
|
+
schema.example = field.placeholder;
|
|
147
|
+
}
|
|
148
|
+
if (field.deprecated) {
|
|
149
|
+
schema.deprecated = true;
|
|
150
|
+
}
|
|
151
|
+
return schema;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/** The path, query, and header fields as OpenAPI parameters. */
|
|
155
|
+
export const endpointParameters = (fields: EndpointField[]): ParameterLike[] =>
|
|
156
|
+
fields.flatMap((field) =>
|
|
157
|
+
field.location === "body"
|
|
158
|
+
? []
|
|
159
|
+
: [
|
|
160
|
+
{
|
|
161
|
+
deprecated: field.deprecated === true,
|
|
162
|
+
in: field.location,
|
|
163
|
+
name: field.name,
|
|
164
|
+
// A path parameter is always required.
|
|
165
|
+
required: field.location === "path" || field.required === true,
|
|
166
|
+
schema: fieldSchema(field),
|
|
167
|
+
},
|
|
168
|
+
]
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
/** The body fields as a JSON request body, or `undefined` when there are none. */
|
|
172
|
+
export const endpointBody = (fields: EndpointField[]) => {
|
|
173
|
+
const body = fields.filter((field) => field.location === "body");
|
|
174
|
+
return body.length > 0
|
|
175
|
+
? {
|
|
176
|
+
content: {
|
|
177
|
+
"application/json": {
|
|
178
|
+
schema: fieldSchema({
|
|
179
|
+
fields: body,
|
|
180
|
+
location: "body",
|
|
181
|
+
name: "",
|
|
182
|
+
type: "object",
|
|
183
|
+
}),
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
}
|
|
187
|
+
: undefined;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* The security an endpoint enforces: its page's `authMethod`, else the
|
|
192
|
+
* site's `api.auth`, else none. An API key goes in the configured header,
|
|
193
|
+
* `x-api-key` when none is named.
|
|
194
|
+
*/
|
|
195
|
+
export const endpointSecurity = (
|
|
196
|
+
authMethod?: AuthMethod,
|
|
197
|
+
siteAuth?: EndpointAuth
|
|
198
|
+
): OperationSecurity => {
|
|
199
|
+
const method = authMethod ?? siteAuth?.method ?? "none";
|
|
200
|
+
if (method === "none") {
|
|
201
|
+
return { alternatives: [], optional: false };
|
|
202
|
+
}
|
|
203
|
+
if (method === "key") {
|
|
204
|
+
return resolveSecurity([{ apiKey: [] }], {
|
|
205
|
+
apiKey: {
|
|
206
|
+
in: "header",
|
|
207
|
+
name: siteAuth?.name ?? "x-api-key",
|
|
208
|
+
type: "apiKey",
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
return resolveSecurity([{ [method]: [] }], {
|
|
213
|
+
[method]: { scheme: method, type: "http" },
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* The endpoint spec the page's plugin wrote into the `spec` attribute of
|
|
219
|
+
* `<ApiEndpoint>` and `<ApiPlayground>`.
|
|
220
|
+
*/
|
|
221
|
+
export const readEndpointSpec = (json: string): EndpointSpec =>
|
|
222
|
+
// SAFETY: the attribute is `JSON.stringify` of an `EndpointSpec`, written
|
|
223
|
+
// by `markdown/api-rail.ts` at build; authors never write it.
|
|
224
|
+
JSON.parse(json) as EndpointSpec;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The named color each documented Badge `variant` paints with; `accent` is
|
|
3
|
+
* the site's theme accent rather than a fixed hue.
|
|
4
|
+
*/
|
|
2
5
|
const VARIANT_COLOR = new Map([
|
|
3
|
-
["accent", "
|
|
6
|
+
["accent", "accent"],
|
|
4
7
|
["danger", "red"],
|
|
5
8
|
["default", "gray"],
|
|
6
9
|
["success", "green"],
|
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
import data from "blume:data";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
isInternalPath,
|
|
5
4
|
normalizeBasePath,
|
|
6
|
-
|
|
7
|
-
withComposedBasePath,
|
|
5
|
+
withAuthoredBasePath,
|
|
8
6
|
} from "../../core/base-path.ts";
|
|
9
7
|
import { routeSetFor, servesRoute } from "../../core/locale-links.ts";
|
|
10
8
|
|
|
11
|
-
// Mirrors `markdown/base-links.ts`: a path whose final segment carries a file
|
|
12
|
-
// extension is a `public/` asset, served at the site root and never moved
|
|
13
|
-
// under `basePath` — unless a page is served there (a dotted route like
|
|
14
|
-
// `/releases/v1.2`).
|
|
15
|
-
const DOTTED_PATH = /\.[a-z0-9]+$/iu;
|
|
16
|
-
|
|
17
|
-
/** Strip any `#fragment`/`?query` so only the path is extension-tested. */
|
|
18
|
-
const pathOf = (url: string): string => url.replace(/[#?].*$/u, "");
|
|
19
|
-
|
|
20
|
-
/** Whether an internal `href` links a page rather than a public asset. */
|
|
21
|
-
const isPageHref = (href: string): boolean => {
|
|
22
|
-
const path = pathOf(href);
|
|
23
|
-
return (
|
|
24
|
-
!DOTTED_PATH.test(path) ||
|
|
25
|
-
servesRoute(
|
|
26
|
-
routeSetFor(data.routes),
|
|
27
|
-
withBasePath(data.config.basePath, path)
|
|
28
|
-
)
|
|
29
|
-
);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
9
|
/**
|
|
33
10
|
* Rebase a component-emitted `href` the way `markdown/base-links.ts` rebases
|
|
34
11
|
* `[x](/guide)`: a root-relative internal page link gains the composed
|
|
35
|
-
* `deployment.base` + `basePath` prefix,
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
12
|
+
* `deployment.base` + `basePath` prefix, and a public asset (`/spec.pdf`, with
|
|
13
|
+
* no page served there) the deployment base alone, so authors write component
|
|
14
|
+
* links (`<Card href="/guide">`) under the same "as if mounted at root"
|
|
15
|
+
* contract as markdown links (see `withAuthoredBasePath`). Idempotent per
|
|
16
|
+
* layer (a hand-written `/docs/x` isn't double-prefixed) and inert for
|
|
17
|
+
* external URLs, fragments, and relative paths.
|
|
40
18
|
*/
|
|
41
19
|
export const contentHref = (href: string): string =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
: href;
|
|
20
|
+
withAuthoredBasePath(
|
|
21
|
+
normalizeBasePath(import.meta.env.BASE_URL),
|
|
22
|
+
data.config.basePath,
|
|
23
|
+
href,
|
|
24
|
+
(route) => servesRoute(routeSetFor(data.routes), route)
|
|
25
|
+
);
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page view picker's logic (see `ViewSwitcher.astro`). A page written in
|
|
3
|
+
* `<View title>` blocks shows one view at a time. The choice sits on
|
|
4
|
+
* `<body data-blume-view>`, which each page brings fresh, and a per-page style
|
|
5
|
+
* hides everything tagged with another view: the `<View>` blocks, the
|
|
6
|
+
* picker's icons, and the table of contents entries for their headings.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Where a reader's last-picked view is remembered, across pages. The init
|
|
11
|
+
* script below spells it out, as it does {@link VIEW_PARAM}.
|
|
12
|
+
*/
|
|
13
|
+
export const VIEW_STORAGE_KEY = "blume-view";
|
|
14
|
+
|
|
15
|
+
/** The query parameter a shared link picks a view with (`?view=Python`). */
|
|
16
|
+
export const VIEW_PARAM = "view";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The view to show: the first of the candidates the page has, most specific
|
|
20
|
+
* first (a linked heading's view, the link's `?view=`, the reader's last
|
|
21
|
+
* pick), else the page's first view.
|
|
22
|
+
*/
|
|
23
|
+
export const chooseView = (
|
|
24
|
+
titles: readonly string[],
|
|
25
|
+
candidates: readonly (string | null | undefined)[]
|
|
26
|
+
): string | undefined =>
|
|
27
|
+
candidates.find(
|
|
28
|
+
(candidate): candidate is string =>
|
|
29
|
+
candidate !== null &&
|
|
30
|
+
candidate !== undefined &&
|
|
31
|
+
titles.includes(candidate)
|
|
32
|
+
) ?? titles[0];
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A CSS string for `value`, safe inside a `<style>` element: quotes and
|
|
36
|
+
* backslashes escaped, `<` as a hex escape so the text can't close the
|
|
37
|
+
* element, and line breaks (which a CSS string can't hold) as spaces.
|
|
38
|
+
*/
|
|
39
|
+
const cssString = (value: string): string =>
|
|
40
|
+
`"${value
|
|
41
|
+
.replaceAll(/["\\]/gu, String.raw`\$&`)
|
|
42
|
+
.replaceAll("<", String.raw`\3c `)
|
|
43
|
+
.replaceAll(/[\n\r\f]/gu, " ")}"`;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The page's view CSS: with a view chosen on `<body>`, everything tagged with
|
|
47
|
+
* another is hidden; before a choice, everything but the first view is.
|
|
48
|
+
*/
|
|
49
|
+
export const viewStyle = (titles: readonly string[]): string => {
|
|
50
|
+
const [first] = titles;
|
|
51
|
+
if (first === undefined) {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
const other = (title: string): string =>
|
|
55
|
+
`[data-blume-view]:not([data-blume-view=${cssString(title)}])`;
|
|
56
|
+
const selectors = [
|
|
57
|
+
`body:not([data-blume-view]) ${other(first)}`,
|
|
58
|
+
...titles.map(
|
|
59
|
+
(title) => `body[data-blume-view=${cssString(title)}] ${other(title)}`
|
|
60
|
+
),
|
|
61
|
+
];
|
|
62
|
+
return `${selectors.join(",")}{display:none!important}`;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Runs inline as the picker is parsed, ahead of the views it controls, so a
|
|
67
|
+
* link's `?view=` or the reader's last pick applies before anything paints.
|
|
68
|
+
* Inline scripts run once per session under the client router; after that
|
|
69
|
+
* the picker element applies the choice as each page swaps in.
|
|
70
|
+
*/
|
|
71
|
+
export const VIEW_INIT_SCRIPT = `(()=>{const s=document.currentScript;const p=s&&s.closest("blume-view-switcher");if(!p)return;let t=[];try{t=JSON.parse(p.getAttribute("data-views")||"[]")}catch{}let r=null;try{r=localStorage.getItem("blume-view")}catch{}const l=new URLSearchParams(location.search).get("view");const v=[l,r].find((c)=>c&&t.includes(c))||t[0];if(!v)return;document.body.setAttribute("data-blume-view",v);const e=p.querySelector("select");if(e)e.value=v;})();`;
|
package/src/components/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
import type { CaptchaSettings } from "../../captcha/schema.ts";
|
|
2
3
|
import type { UIStrings } from "../../core/i18n-ui.ts";
|
|
3
4
|
import { resolveIcon } from "../../theme/icons.ts";
|
|
4
5
|
import Assistant from "./assistant.tsx";
|
|
@@ -9,12 +10,17 @@ interface Suggestion {
|
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
interface Props {
|
|
13
|
+
/** The bot check's public settings (`ai.assistant.captcha`). */
|
|
14
|
+
captcha?: CaptchaSettings;
|
|
12
15
|
endpoint?: string;
|
|
13
16
|
strings?: UIStrings["assistant"];
|
|
14
17
|
suggestions?: Suggestion[];
|
|
18
|
+
/** The Contact support link (`ai.assistant.support`). */
|
|
19
|
+
support?: string;
|
|
15
20
|
}
|
|
16
21
|
|
|
17
|
-
const { endpoint, strings, suggestions = [] } =
|
|
22
|
+
const { captcha, endpoint, strings, suggestions = [], support } =
|
|
23
|
+
Astro.props;
|
|
18
24
|
|
|
19
25
|
// Icons resolve to inline SVG here (server-only module), so the client island
|
|
20
26
|
// gets ready-to-render markup rather than a name it can't resolve. Bare Lucide
|
|
@@ -41,6 +47,7 @@ const icons = {
|
|
|
41
47
|
clear: bodyFor("trash-2"),
|
|
42
48
|
close: bodyFor("chevrons-right"),
|
|
43
49
|
copy: bodyFor("copy"),
|
|
50
|
+
remove: bodyFor("x"),
|
|
44
51
|
};
|
|
45
52
|
---
|
|
46
53
|
|
|
@@ -50,11 +57,13 @@ const icons = {
|
|
|
50
57
|
panel and re-stamps the body push attribute itself on astro:after-swap
|
|
51
58
|
(see assistant.tsx), since the swap replaces <body> wholesale. */}
|
|
52
59
|
<Assistant
|
|
60
|
+
captcha={captcha}
|
|
53
61
|
client:load
|
|
54
62
|
endpoint={endpoint}
|
|
55
63
|
icons={icons}
|
|
56
64
|
strings={strings}
|
|
57
65
|
suggestions={items}
|
|
66
|
+
support={support}
|
|
58
67
|
transition:persist="blume-assistant"
|
|
59
68
|
/>
|
|
60
69
|
|