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,259 @@
|
|
|
1
|
+
import type { EvaluatedValue } from "../ai/component-markdown.ts";
|
|
2
|
+
import { readStaticExpression } from "../ai/static-expression.ts";
|
|
3
|
+
import { PARAM_LOCATIONS } from "../components/content/api-field.ts";
|
|
4
|
+
import type { FieldValue } from "../components/content/api-field.ts";
|
|
5
|
+
import {
|
|
6
|
+
AUTH_METHODS,
|
|
7
|
+
PLAYGROUND_MODES,
|
|
8
|
+
parseApiEndpoint,
|
|
9
|
+
} from "../components/content/api-page.ts";
|
|
10
|
+
import type {
|
|
11
|
+
EndpointField,
|
|
12
|
+
EndpointSpec,
|
|
13
|
+
} from "../components/content/api-page.ts";
|
|
14
|
+
import { jsxAttribute, jsxFlowElement } from "./mdast.ts";
|
|
15
|
+
import type { MdastNode, MdastValue } from "./mdast.ts";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The right-hand column of a hand-written API page, as Mintlify renders one.
|
|
19
|
+
* Top-level `<RequestExample>` and `<ResponseExample>` move into an
|
|
20
|
+
* `<ApiRail>` at the end of the document, request examples first, and the
|
|
21
|
+
* render is flagged so the layout makes room for the column (see
|
|
22
|
+
* `ApiRail.astro`). Below `xl` the rail follows the page's content, and the
|
|
23
|
+
* examples are ordinary code groups there. An example nested in another
|
|
24
|
+
* component stays where it is written.
|
|
25
|
+
*
|
|
26
|
+
* A page with `api` frontmatter (`POST /v1/users`) also gets its endpoint: the
|
|
27
|
+
* method and path at the top of the page (`<ApiEndpoint>`), and at the head of
|
|
28
|
+
* the rail a Try it panel and request samples (`<ApiPlayground>`) built from
|
|
29
|
+
* the page's `<ParamField>`s, which the plugin collects here, nested body
|
|
30
|
+
* fields included (see `components/content/api-page.ts`).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/** The render-frontmatter key that tells the layout a page has a rail. */
|
|
34
|
+
export const API_RAIL_KEY = "blumeApiRail";
|
|
35
|
+
|
|
36
|
+
/** The components that move to the rail, in the order they stack there. */
|
|
37
|
+
const RAIL_COMPONENTS = ["RequestExample", "ResponseExample"];
|
|
38
|
+
|
|
39
|
+
/** The root, as the plugin's `after` hook receives it. */
|
|
40
|
+
interface RailRoot {
|
|
41
|
+
children: MdastNode[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The slice of Satteri's visitor context the plugin uses. */
|
|
45
|
+
export interface ApiRailContext {
|
|
46
|
+
appendChild: (node: RailRoot, child: MdastNode) => void;
|
|
47
|
+
data?: { astro?: { frontmatter?: Record<string, EvaluatedValue> } };
|
|
48
|
+
insertChildAt: (node: RailRoot, index: number, child: MdastNode) => void;
|
|
49
|
+
removeNode: (node: MdastNode) => void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* A detached copy of a node Satteri materialized lazily: its own fields,
|
|
54
|
+
* children included, without the arena handles that tie it to its old place.
|
|
55
|
+
* Appending the original instead would move an empty shell.
|
|
56
|
+
*/
|
|
57
|
+
const detach = (node: MdastNode): MdastNode =>
|
|
58
|
+
JSON.parse(
|
|
59
|
+
JSON.stringify(node, (key: string, value: MdastValue) =>
|
|
60
|
+
key === "_id" || key === "_resolver" ? undefined : value
|
|
61
|
+
)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const isName = <Value>(value: Value): value is Value & string =>
|
|
65
|
+
typeof value === "string";
|
|
66
|
+
|
|
67
|
+
const railIndex = (node: MdastNode): number =>
|
|
68
|
+
node.type === "mdxJsxFlowElement" && isName(node.name)
|
|
69
|
+
? RAIL_COMPONENTS.indexOf(node.name)
|
|
70
|
+
: -1;
|
|
71
|
+
|
|
72
|
+
/** An element's name, when it is a JSX element. */
|
|
73
|
+
const elementName = (node: MdastNode): string | undefined =>
|
|
74
|
+
node.type === "mdxJsxFlowElement" && isName(node.name)
|
|
75
|
+
? node.name
|
|
76
|
+
: undefined;
|
|
77
|
+
|
|
78
|
+
const isNode = (value: MdastValue): value is MdastNode =>
|
|
79
|
+
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
80
|
+
|
|
81
|
+
/** A node's children, when it has any. */
|
|
82
|
+
const childrenOf = (node: MdastNode): MdastNode[] =>
|
|
83
|
+
Array.isArray(node.children) ? node.children.filter(isNode) : [];
|
|
84
|
+
|
|
85
|
+
/** One JSX attribute, as the parser leaves it. */
|
|
86
|
+
interface JsxAttribute {
|
|
87
|
+
name?: string;
|
|
88
|
+
type: string;
|
|
89
|
+
value?: string | { value: string } | null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const isAttribute = (value: MdastValue): value is JsxAttribute & MdastNode =>
|
|
93
|
+
isNode(value) && value.type === "mdxJsxAttribute";
|
|
94
|
+
|
|
95
|
+
/** An element's attributes, name to value. */
|
|
96
|
+
interface AttributeValues {
|
|
97
|
+
[name: string]: EvaluatedValue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* An element's attributes as values: text, shorthand flags as `true`, and
|
|
102
|
+
* expressions read as literal data (see `ai/static-expression.ts`); one that
|
|
103
|
+
* isn't literal is left out.
|
|
104
|
+
*/
|
|
105
|
+
const attributeValues = (
|
|
106
|
+
node: MdastNode,
|
|
107
|
+
frontmatter: Record<string, EvaluatedValue> | undefined
|
|
108
|
+
): AttributeValues => {
|
|
109
|
+
const values: AttributeValues = {};
|
|
110
|
+
const attributes = Array.isArray(node.attributes) ? node.attributes : [];
|
|
111
|
+
for (const attribute of attributes.filter(isAttribute)) {
|
|
112
|
+
const { name, value } = attribute;
|
|
113
|
+
if (!name) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (value === null || value === undefined) {
|
|
117
|
+
values[name] = true;
|
|
118
|
+
} else if (isName(value)) {
|
|
119
|
+
values[name] = value;
|
|
120
|
+
} else {
|
|
121
|
+
const read = readStaticExpression(value.value, frontmatter);
|
|
122
|
+
if (read.ok) {
|
|
123
|
+
values[name] = read.value;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return values;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const isFlag = (value: EvaluatedValue): boolean =>
|
|
131
|
+
value === true || value === "true";
|
|
132
|
+
|
|
133
|
+
/** A `<ParamField>`'s values as an endpoint field, or `null` with no location. */
|
|
134
|
+
const endpointField = (values: AttributeValues): EndpointField | null => {
|
|
135
|
+
const location = PARAM_LOCATIONS.find((key) => isName(values[key]));
|
|
136
|
+
const name = location ? values[location] : undefined;
|
|
137
|
+
if (!(location && isName(name))) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const field: EndpointField = { location, name };
|
|
141
|
+
if (isName(values.type)) {
|
|
142
|
+
field.type = values.type;
|
|
143
|
+
}
|
|
144
|
+
if (isName(values.placeholder)) {
|
|
145
|
+
field.placeholder = values.placeholder;
|
|
146
|
+
}
|
|
147
|
+
if (isFlag(values.required)) {
|
|
148
|
+
field.required = true;
|
|
149
|
+
}
|
|
150
|
+
if (isFlag(values.deprecated)) {
|
|
151
|
+
field.deprecated = true;
|
|
152
|
+
}
|
|
153
|
+
if (values.default !== undefined) {
|
|
154
|
+
// SAFETY: an attribute's literal data is JSON-shaped; a frontmatter
|
|
155
|
+
// date only arrives through `frontmatter.*`, which a default never reads.
|
|
156
|
+
field.default = values.default as FieldValue;
|
|
157
|
+
}
|
|
158
|
+
return field;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The `<ParamField>`s under `nodes`, in document order. A field's own nested
|
|
163
|
+
* fields (in its `<Expandable>`) become its `fields`, the properties of the
|
|
164
|
+
* object it describes.
|
|
165
|
+
*/
|
|
166
|
+
const collectFields = (
|
|
167
|
+
nodes: MdastNode[],
|
|
168
|
+
frontmatter: Record<string, EvaluatedValue> | undefined
|
|
169
|
+
): EndpointField[] =>
|
|
170
|
+
nodes.flatMap((node) => {
|
|
171
|
+
const nested = collectFields(childrenOf(node), frontmatter);
|
|
172
|
+
if (elementName(node) !== "ParamField") {
|
|
173
|
+
return nested;
|
|
174
|
+
}
|
|
175
|
+
const field = endpointField(attributeValues(node, frontmatter));
|
|
176
|
+
if (!field) {
|
|
177
|
+
return nested;
|
|
178
|
+
}
|
|
179
|
+
return nested.length > 0 ? [{ ...field, fields: nested }] : [field];
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
/** The page's endpoint, when its `api` frontmatter names one. */
|
|
183
|
+
const endpointSpec = (
|
|
184
|
+
root: RailRoot,
|
|
185
|
+
frontmatter: Record<string, EvaluatedValue> | undefined,
|
|
186
|
+
requestExample: boolean
|
|
187
|
+
): EndpointSpec | null => {
|
|
188
|
+
const api = frontmatter?.api;
|
|
189
|
+
const endpoint = isName(api) ? parseApiEndpoint(api) : null;
|
|
190
|
+
if (!endpoint) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const spec: EndpointSpec = {
|
|
194
|
+
fields: collectFields(root.children, frontmatter),
|
|
195
|
+
method: endpoint.method,
|
|
196
|
+
requestExample,
|
|
197
|
+
target: endpoint.target,
|
|
198
|
+
};
|
|
199
|
+
const authMethod = AUTH_METHODS.find(
|
|
200
|
+
(method) => method === frontmatter?.authMethod
|
|
201
|
+
);
|
|
202
|
+
if (authMethod) {
|
|
203
|
+
spec.authMethod = authMethod;
|
|
204
|
+
}
|
|
205
|
+
const playground = PLAYGROUND_MODES.find(
|
|
206
|
+
(mode) => mode === frontmatter?.playground
|
|
207
|
+
);
|
|
208
|
+
if (playground) {
|
|
209
|
+
spec.playground = playground;
|
|
210
|
+
}
|
|
211
|
+
return spec;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
/** Where the endpoint header goes: after a front matter block, if any. */
|
|
215
|
+
const headerIndex = (root: RailRoot): number =>
|
|
216
|
+
root.children.findIndex(
|
|
217
|
+
(node) => node.type !== "yaml" && node.type !== "toml"
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
export const apiRailPlugin = () => ({
|
|
221
|
+
after(root: RailRoot, ctx: ApiRailContext) {
|
|
222
|
+
const frontmatter = ctx.data?.astro?.frontmatter;
|
|
223
|
+
const examples = root.children.filter((node) => railIndex(node) !== -1);
|
|
224
|
+
const spec = endpointSpec(
|
|
225
|
+
root,
|
|
226
|
+
frontmatter,
|
|
227
|
+
examples.some((node) => railIndex(node) === 0)
|
|
228
|
+
);
|
|
229
|
+
const specAttribute = spec
|
|
230
|
+
? [jsxAttribute("spec", JSON.stringify(spec))]
|
|
231
|
+
: [];
|
|
232
|
+
const playground =
|
|
233
|
+
spec && spec.playground !== "none"
|
|
234
|
+
? [jsxFlowElement("ApiPlayground", specAttribute, [])]
|
|
235
|
+
: [];
|
|
236
|
+
for (const example of examples) {
|
|
237
|
+
ctx.removeNode(example);
|
|
238
|
+
}
|
|
239
|
+
if (spec) {
|
|
240
|
+
ctx.insertChildAt(
|
|
241
|
+
root,
|
|
242
|
+
Math.max(headerIndex(root), 0),
|
|
243
|
+
jsxFlowElement("ApiEndpoint", specAttribute, [])
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
const rail = [
|
|
247
|
+
...playground,
|
|
248
|
+
...examples.toSorted((a, b) => railIndex(a) - railIndex(b)).map(detach),
|
|
249
|
+
];
|
|
250
|
+
if (rail.length === 0) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
ctx.appendChild(root, jsxFlowElement("ApiRail", [], rail));
|
|
254
|
+
if (frontmatter) {
|
|
255
|
+
frontmatter[API_RAIL_KEY] = true;
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
name: "blume-api-rail",
|
|
259
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isInternalPath,
|
|
3
|
+
withAuthoredBasePath,
|
|
3
4
|
withBasePath,
|
|
4
|
-
withComposedBasePath,
|
|
5
5
|
} from "../core/base-path.ts";
|
|
6
6
|
import { servesRoute } from "../core/locale-links.ts";
|
|
7
7
|
import type { MdastNode } from "./mdast.ts";
|
|
@@ -20,18 +20,6 @@ interface MdastUrlContext {
|
|
|
20
20
|
setProperty: (node: MdastNode, key: "url", value: string) => void;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
/**
|
|
24
|
-
* A path whose final segment carries a file extension (`/spec.pdf`, `/logo.svg`)
|
|
25
|
-
* — a public asset, which Blume serves from `public/` at the site root and
|
|
26
|
-
* does *not* move under `basePath`, unless a page is served there: a dotted
|
|
27
|
-
* route (`/releases/v1.2`) is based like any other page link, the same
|
|
28
|
-
* served-route test the link checker and the locale rewrite apply.
|
|
29
|
-
*/
|
|
30
|
-
const DOTTED_PATH = /\.[a-z0-9]+$/iu;
|
|
31
|
-
|
|
32
|
-
/** Strip any `#fragment`/`?query` so only the path is extension-tested. */
|
|
33
|
-
const pathOf = (url: string): string => url.replace(/[#?].*$/u, "");
|
|
34
|
-
|
|
35
23
|
/** Only a string URL can be rebased; MDAST allows null or absent urls. */
|
|
36
24
|
const isUrl = (url: string | null | undefined): url is string =>
|
|
37
25
|
typeof url === "string";
|
|
@@ -45,13 +33,15 @@ export interface BaseLinksPluginOptions {
|
|
|
45
33
|
}
|
|
46
34
|
|
|
47
35
|
/**
|
|
48
|
-
* Satteri MDAST plugin that prepends the served-URL base
|
|
49
|
-
*
|
|
50
|
-
* (`[x](/guide)`
|
|
51
|
-
*
|
|
52
|
-
* `/
|
|
53
|
-
*
|
|
54
|
-
* (
|
|
36
|
+
* Satteri MDAST plugin that prepends the served-URL base to root-relative
|
|
37
|
+
* internal links, so authors write links as if mounted at root. A page link
|
|
38
|
+
* gains `deployment.base` layered over the site-wide `basePath` (`[x](/guide)`
|
|
39
|
+
* -> `/base/docs/guide`); a public asset — an image, or a link to a file like
|
|
40
|
+
* `/spec.pdf` (see `withAuthoredBasePath`) — gains `deployment.base` alone,
|
|
41
|
+
* since Astro serves `public/` under it but never under `basePath`.
|
|
42
|
+
* Idempotent per layer (a hand-written `/docs/x` isn't double-prefixed) and
|
|
43
|
+
* inert for external URLs, fragments, and relative paths. Only constructed
|
|
44
|
+
* when a base is set (see `markdown/index.ts`).
|
|
55
45
|
*/
|
|
56
46
|
export const baseLinksPlugin = (
|
|
57
47
|
deployBase: string,
|
|
@@ -78,30 +68,38 @@ export const baseLinksPlugin = (
|
|
|
78
68
|
return cached.routes;
|
|
79
69
|
};
|
|
80
70
|
|
|
81
|
-
/** Whether
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
return (
|
|
85
|
-
!DOTTED_PATH.test(path) ||
|
|
86
|
-
servesRoute(servedRoutes(), withBasePath(basePath, path))
|
|
87
|
-
);
|
|
88
|
-
};
|
|
71
|
+
/** Whether a page is served at a based, fragment-less path. */
|
|
72
|
+
const servesPage = (route: string): boolean =>
|
|
73
|
+
servesRoute(servedRoutes(), route);
|
|
89
74
|
|
|
90
|
-
|
|
75
|
+
/** Record `based(url)` on the node when its root-relative URL changes. */
|
|
76
|
+
const rebase = (
|
|
77
|
+
node: UrlNode,
|
|
78
|
+
ctx: MdastUrlContext,
|
|
79
|
+
based: (url: string) => string
|
|
80
|
+
): void => {
|
|
91
81
|
const { url } = node;
|
|
92
|
-
if (isUrl(url) && isInternalPath(url)
|
|
93
|
-
const next =
|
|
82
|
+
if (isUrl(url) && isInternalPath(url)) {
|
|
83
|
+
const next = based(url);
|
|
94
84
|
if (next !== url) {
|
|
95
85
|
ctx.setProperty(node, "url", next);
|
|
96
86
|
}
|
|
97
87
|
}
|
|
98
88
|
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
89
|
+
const rebaseLink = (node: UrlNode, ctx: MdastUrlContext): void =>
|
|
90
|
+
rebase(node, ctx, (url) =>
|
|
91
|
+
withAuthoredBasePath(deployBase, basePath, url, servesPage)
|
|
92
|
+
);
|
|
93
|
+
// An image is always a file, never a page: `public/` (or a generated asset
|
|
94
|
+
// endpoint), served under the deployment base but not `basePath`.
|
|
95
|
+
const rebaseImage = (node: UrlNode, ctx: MdastUrlContext): void =>
|
|
96
|
+
rebase(node, ctx, (url) => withBasePath(deployBase, url));
|
|
97
|
+
// `link` covers inline links; `definition` covers reference-style
|
|
98
|
+
// definitions (`[x]: /guide`), which a link or an image may cite.
|
|
102
99
|
return {
|
|
103
|
-
definition:
|
|
104
|
-
|
|
100
|
+
definition: rebaseLink,
|
|
101
|
+
image: rebaseImage,
|
|
102
|
+
link: rebaseLink,
|
|
105
103
|
name: "blume-base-links",
|
|
106
104
|
};
|
|
107
105
|
};
|
|
@@ -7,6 +7,12 @@
|
|
|
7
7
|
* language label.
|
|
8
8
|
* - the `lineNumbers` keyword (```ts file.ts lineNumbers) becomes
|
|
9
9
|
* `data-line-numbers`; the theme renders a counter-driven line-number gutter.
|
|
10
|
+
* - the `wrap` keyword becomes `data-wrap`: this block's long lines wrap
|
|
11
|
+
* instead of scrolling, as `markdown.code.wrap` does for every block.
|
|
12
|
+
* - the `expandable` keyword becomes `data-expandable` on a block of
|
|
13
|
+
* {@link EXPANDABLE_MIN_LINES} lines or more: the theme shows its first
|
|
14
|
+
* {@link EXPANDABLE_VISIBLE_LINES} lines, and the page script adds a toggle
|
|
15
|
+
* that shows the rest in full. A shorter block renders as it is.
|
|
10
16
|
*/
|
|
11
17
|
|
|
12
18
|
import {
|
|
@@ -16,9 +22,20 @@ import {
|
|
|
16
22
|
RESERVED_META_KEYWORDS,
|
|
17
23
|
} from "./fence-meta.ts";
|
|
18
24
|
|
|
25
|
+
/** The lines a collapsed `expandable` block shows. */
|
|
26
|
+
export const EXPANDABLE_VISIBLE_LINES = 10;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The lines a block needs before `expandable` collapses it: a few more than it
|
|
30
|
+
* shows, so the toggle never hides a line or two behind a click.
|
|
31
|
+
*/
|
|
32
|
+
export const EXPANDABLE_MIN_LINES = 16;
|
|
33
|
+
|
|
19
34
|
/** The slice of Shiki's transformer `this` context Blume reads. */
|
|
20
35
|
interface CodeMetaContext {
|
|
21
36
|
options: { meta?: { __raw?: string } };
|
|
37
|
+
/** The block's code, as highlighted. */
|
|
38
|
+
source?: string;
|
|
22
39
|
}
|
|
23
40
|
|
|
24
41
|
/** The `<pre>` hast node a Shiki `pre` hook receives. */
|
|
@@ -33,12 +50,6 @@ export interface CodeTitleTransformer {
|
|
|
33
50
|
}
|
|
34
51
|
|
|
35
52
|
const TITLE_ATTR = /(?:^|\s)title=(?:"(?<dq>[^"]*)"|'(?<sq>[^']*)')/u;
|
|
36
|
-
const LINE_NUMBERS = /(?:^|\s)lineNumbers(?=\s|$)/u;
|
|
37
|
-
|
|
38
|
-
// Quoted attrs are blanked before keyword/bare-token scans so a quoted value
|
|
39
|
-
// can't leak tokens (`title="enable lineNumbers later"`).
|
|
40
|
-
const withoutQuotedAttrs = (raw: string): string =>
|
|
41
|
-
raw.replace(QUOTED_ATTR, " ");
|
|
42
53
|
|
|
43
54
|
// The first bare token is the title (```ts blume.config.ts): a non-empty token
|
|
44
55
|
// that isn't a Shiki line range (`{1,3-5}`), a `key=value` attr, or a reserved
|
|
@@ -71,8 +82,14 @@ export const parseCodeTitle = (raw: string | undefined): string | undefined => {
|
|
|
71
82
|
return metaTokens(raw).find(isTitleToken);
|
|
72
83
|
};
|
|
73
84
|
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
// The shared tokenizer keeps a quoted attr whole, so a keyword inside a
|
|
86
|
+
// quoted value (`title="enable lineNumbers later"`) is never a token of its own.
|
|
87
|
+
const hasKeyword = (raw: string | undefined, keyword: string): boolean =>
|
|
88
|
+
metaTokens(raw).includes(keyword);
|
|
89
|
+
|
|
90
|
+
/** How many lines a block's code runs to, a trailing newline aside. */
|
|
91
|
+
export const lineCount = (source = ""): number =>
|
|
92
|
+
source === "" ? 0 : source.replace(/\r?\n$/u, "").split(/\r?\n/u).length;
|
|
76
93
|
|
|
77
94
|
/** Build the transformer. Runs after Shiki's built-in `data-language` hook. */
|
|
78
95
|
export const codeTitleTransformer = (): CodeTitleTransformer => ({
|
|
@@ -83,8 +100,17 @@ export const codeTitleTransformer = (): CodeTitleTransformer => ({
|
|
|
83
100
|
if (title) {
|
|
84
101
|
node.properties.dataTitle = title;
|
|
85
102
|
}
|
|
86
|
-
if (
|
|
103
|
+
if (hasKeyword(raw, "lineNumbers")) {
|
|
87
104
|
node.properties.dataLineNumbers = true;
|
|
88
105
|
}
|
|
106
|
+
if (hasKeyword(raw, "wrap")) {
|
|
107
|
+
node.properties.dataWrap = true;
|
|
108
|
+
}
|
|
109
|
+
if (
|
|
110
|
+
hasKeyword(raw, "expandable") &&
|
|
111
|
+
lineCount(this.source) >= EXPANDABLE_MIN_LINES
|
|
112
|
+
) {
|
|
113
|
+
node.properties.dataExpandable = true;
|
|
114
|
+
}
|
|
89
115
|
},
|
|
90
116
|
});
|