blume 2.0.3 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -0
- package/CHANGELOG.md +142 -0
- package/README.md +1 -1
- package/dist/cli/{chunk-5f86nr5m.js → chunk-073rdvgb.js} +21 -48
- package/dist/cli/{chunk-5f86nr5m.js.map → chunk-073rdvgb.js.map} +4 -5
- package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
- package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
- package/dist/cli/chunk-150jk7km.js +52 -0
- package/dist/cli/chunk-150jk7km.js.map +10 -0
- package/dist/cli/{chunk-9t7a85s3.js → chunk-313vnn40.js} +30 -19
- package/dist/cli/chunk-313vnn40.js.map +10 -0
- package/dist/cli/{chunk-tkacnehg.js → chunk-3v3ffbrj.js} +2 -2
- package/dist/cli/{chunk-q58y5e6a.js → chunk-3x6x3pph.js} +46 -24
- package/dist/cli/chunk-3x6x3pph.js.map +10 -0
- package/dist/cli/{chunk-1d7ve1dm.js → chunk-42t4jxdx.js} +37 -5
- package/dist/cli/chunk-42t4jxdx.js.map +12 -0
- package/dist/cli/{chunk-8ktnccpt.js → chunk-54ztw1nj.js} +21 -2
- package/dist/cli/chunk-54ztw1nj.js.map +10 -0
- package/dist/cli/{chunk-hm3vjy5s.js → chunk-5vjtgs6e.js} +28 -10
- package/dist/cli/{chunk-hm3vjy5s.js.map → chunk-5vjtgs6e.js.map} +4 -4
- package/dist/cli/chunk-66w9j7p6.js +322 -0
- package/dist/cli/chunk-66w9j7p6.js.map +14 -0
- package/dist/cli/{chunk-2hsdwb9n.js → chunk-7ppf1rva.js} +34 -18
- package/dist/cli/chunk-7ppf1rva.js.map +10 -0
- package/dist/cli/{chunk-r9rcc4w7.js → chunk-8y2kmjv8.js} +7 -7
- package/dist/cli/{chunk-r20tn01b.js → chunk-c1y538kd.js} +8 -2
- package/dist/cli/{chunk-r20tn01b.js.map → chunk-c1y538kd.js.map} +3 -3
- package/dist/cli/{chunk-2eytanqx.js → chunk-c887fj0s.js} +2 -2
- package/dist/cli/{chunk-p3v96n38.js → chunk-cfyg47zg.js} +16 -6
- package/dist/cli/chunk-cfyg47zg.js.map +10 -0
- package/dist/cli/chunk-cm89scdv.js +443 -0
- package/dist/cli/chunk-cm89scdv.js.map +11 -0
- package/dist/cli/{chunk-akbpwfxc.js → chunk-dzwehpy7.js} +2 -2
- package/dist/cli/{chunk-wrr3j9w9.js → chunk-e6atmn4h.js} +299 -72
- package/dist/cli/chunk-e6atmn4h.js.map +36 -0
- package/dist/cli/{chunk-tzmab476.js → chunk-e8xw9qkh.js} +8 -6
- package/dist/cli/{chunk-tzmab476.js.map → chunk-e8xw9qkh.js.map} +3 -3
- package/dist/cli/{chunk-6dsbexzp.js → chunk-e9q7a2ak.js} +17 -15
- package/dist/cli/{chunk-6dsbexzp.js.map → chunk-e9q7a2ak.js.map} +2 -2
- package/dist/cli/{chunk-pv29h0wf.js → chunk-ehweg4fr.js} +5155 -1249
- package/dist/cli/chunk-ehweg4fr.js.map +218 -0
- package/dist/cli/{chunk-c8chx29p.js → chunk-ep6nd0rn.js} +390 -318
- package/dist/cli/chunk-ep6nd0rn.js.map +36 -0
- package/dist/cli/{chunk-p73c0m7w.js → chunk-fdrkhpjy.js} +18 -15
- package/dist/cli/{chunk-p73c0m7w.js.map → chunk-fdrkhpjy.js.map} +3 -3
- package/dist/cli/{chunk-2z928egk.js → chunk-ft9vfys6.js} +5 -5
- package/dist/cli/{chunk-5m5nmvyq.js → chunk-gb420vvz.js} +316 -79
- package/dist/cli/chunk-gb420vvz.js.map +17 -0
- package/dist/cli/{chunk-vg9r4eb9.js → chunk-hebn0tpx.js} +86 -13
- package/dist/cli/chunk-hebn0tpx.js.map +14 -0
- package/dist/cli/{chunk-35d4wj9f.js → chunk-htrwgabr.js} +41 -23
- package/dist/cli/chunk-htrwgabr.js.map +15 -0
- package/dist/cli/{chunk-g4hq16wv.js → chunk-hx3xqnk9.js} +16 -14
- package/dist/cli/{chunk-g4hq16wv.js.map → chunk-hx3xqnk9.js.map} +2 -2
- package/dist/cli/chunk-j134vrp2.js +65 -0
- package/dist/cli/chunk-j134vrp2.js.map +10 -0
- package/dist/cli/{chunk-a58773jm.js → chunk-kma9f6sf.js} +2 -2
- package/dist/cli/chunk-kwrg63tm.js +31 -0
- package/dist/cli/chunk-kwrg63tm.js.map +10 -0
- package/dist/cli/{chunk-ey84smr6.js → chunk-mrcccgnh.js} +6 -6
- package/dist/cli/{chunk-ey84smr6.js.map → chunk-mrcccgnh.js.map} +1 -1
- package/dist/cli/{chunk-yfyb25rh.js → chunk-n0v7m8ry.js} +24 -8
- package/dist/cli/chunk-n0v7m8ry.js.map +14 -0
- package/dist/cli/{chunk-j85vccga.js → chunk-ncj7w596.js} +576 -367
- package/dist/cli/chunk-ncj7w596.js.map +35 -0
- package/dist/cli/{chunk-5xvm6tfj.js → chunk-nq1d20w2.js} +17 -15
- package/dist/cli/{chunk-5xvm6tfj.js.map → chunk-nq1d20w2.js.map} +2 -2
- package/dist/cli/{chunk-pehfxfta.js → chunk-nrns10mj.js} +6 -98
- package/dist/cli/chunk-nrns10mj.js.map +10 -0
- package/dist/cli/{chunk-crgn1q09.js → chunk-sds923fa.js} +4 -4
- package/dist/cli/chunk-t2m5j4pr.js +104 -0
- package/dist/cli/chunk-t2m5j4pr.js.map +11 -0
- package/dist/cli/{chunk-acanzt5p.js → chunk-tdqhyxfz.js} +6 -6
- package/dist/cli/chunk-tphac74f.js +126 -0
- package/dist/cli/chunk-tphac74f.js.map +11 -0
- package/dist/cli/chunk-w1r4vase.js +18 -0
- package/dist/cli/chunk-w1r4vase.js.map +10 -0
- package/dist/cli/{chunk-3em5wd2y.js → chunk-zccbjcj0.js} +4 -3
- package/dist/cli/{chunk-3em5wd2y.js.map → chunk-zccbjcj0.js.map} +2 -2
- package/dist/cli/index.js +31 -20
- package/dist/cli/index.js.map +5 -5
- package/dist/types/ai/agent-surface.d.ts +8 -7
- package/dist/types/ai/ai-catalog.d.ts +7 -0
- package/dist/types/ai/ask-context.d.ts +26 -0
- package/dist/types/ai/ask.d.ts +271 -58
- package/dist/types/ai/component-markdown.d.ts +2 -0
- package/dist/types/ai/index.d.ts +2 -2
- package/dist/types/ai/openapi-components.d.ts +4 -1
- package/dist/types/ai/site-skill.d.ts +26 -0
- package/dist/types/ai/skills.d.ts +16 -0
- package/dist/types/astro/integration.d.ts +9 -0
- package/dist/types/astro/markdown-negotiation.d.ts +3 -0
- package/dist/types/astro/pages.d.ts +10 -0
- package/dist/types/captcha/hcaptcha.d.ts +27 -0
- package/dist/types/captcha/index.d.ts +28 -0
- package/dist/types/captcha/schema.d.ts +29 -0
- package/dist/types/captcha/turnstile.d.ts +28 -0
- package/dist/types/cli/init/scaffold.d.ts +1 -1
- package/dist/types/components/content/api-field.d.ts +62 -0
- package/dist/types/components/content/api-page.d.ts +100 -0
- package/dist/types/components/layout/nav-utils.d.ts +26 -0
- package/dist/types/components/openapi/code-samples.d.ts +29 -0
- package/dist/types/components/openapi/helpers.d.ts +158 -0
- package/dist/types/components/openapi/security.d.ts +95 -0
- package/dist/types/components/openapi/snippets.d.ts +60 -0
- package/dist/types/consent/ethyca.d.ts +48 -0
- package/dist/types/consent/index.d.ts +37 -0
- package/dist/types/consent/native.d.ts +28 -0
- package/dist/types/consent/osano.d.ts +42 -0
- package/dist/types/consent/schema.d.ts +110 -0
- package/dist/types/core/changelog-index.d.ts +8 -0
- package/dist/types/core/config-input.d.ts +217 -23
- package/dist/types/core/data.d.ts +53 -4
- package/dist/types/core/footer.d.ts +8 -0
- package/dist/types/core/i18n-ui.d.ts +88 -0
- package/dist/types/core/includes.d.ts +8 -2
- package/dist/types/core/links.d.ts +8 -0
- package/dist/types/core/localizable.d.ts +7 -0
- package/dist/types/core/page-modes.d.ts +29 -0
- package/dist/types/core/probe.d.ts +2 -0
- package/dist/types/core/project-graph.d.ts +6 -0
- package/dist/types/core/redirect-patterns.d.ts +152 -0
- package/dist/types/core/related.d.ts +40 -0
- package/dist/types/core/schema.d.ts +670 -56
- package/dist/types/core/sources/cache.d.ts +3 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
- package/dist/types/core/sources/contentful.d.ts +17 -1
- package/dist/types/core/sources/lexical.d.ts +5 -0
- package/dist/types/core/sources/normalize.d.ts +20 -1
- package/dist/types/core/sources/read.d.ts +5 -0
- package/dist/types/core/sources/remote.d.ts +37 -10
- package/dist/types/core/sources/sanity.d.ts +1 -1
- package/dist/types/core/types.d.ts +18 -1
- package/dist/types/core/variables.d.ts +42 -0
- package/dist/types/deploy/adapter-output.d.ts +2 -1
- package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
- package/dist/types/deploy/adapters/node.d.ts +58 -23
- package/dist/types/deploy/adapters/registry.d.ts +10 -0
- package/dist/types/deploy/adapters/types.d.ts +3 -2
- package/dist/types/deploy/node-headers.d.ts +13 -2
- package/dist/types/deploy/platforms/cloudflare.d.ts +15 -7
- package/dist/types/deploy/platforms/netlify.d.ts +7 -0
- package/dist/types/deploy/platforms/node.d.ts +3 -1
- package/dist/types/deploy/platforms/types.d.ts +18 -7
- package/dist/types/deploy/platforms/vercel.d.ts +26 -1
- package/dist/types/deploy/redirects.d.ts +55 -11
- package/dist/types/deploy/sitemap.d.ts +2 -1
- package/dist/types/deploy/vercel-negotiation.d.ts +51 -21
- package/dist/types/markdown/code-title.d.ts +17 -0
- package/dist/types/markdown/features.d.ts +3 -2
- package/dist/types/narration/build.d.ts +70 -0
- package/dist/types/narration/provider.d.ts +26 -0
- package/dist/types/narration/script.d.ts +154 -0
- package/dist/types/openapi/checks.d.ts +27 -0
- package/dist/types/openapi/graphql.d.ts +6 -0
- package/dist/types/openapi/model.d.ts +27 -10
- package/dist/types/openapi/overlay.d.ts +54 -0
- package/dist/types/openapi/parse.d.ts +16 -0
- package/dist/types/openapi/references.d.ts +30 -4
- package/dist/types/ratelimit/cloudflare.d.ts +39 -0
- package/dist/types/ratelimit/index.d.ts +27 -0
- package/dist/types/ratelimit/memory.d.ts +36 -0
- package/dist/types/ratelimit/schema.d.ts +119 -0
- package/dist/types/ratelimit/upstash.d.ts +46 -0
- package/dist/types/ratelimit/wrangler.d.ts +23 -0
- package/dist/types/reference/asyncapi.d.ts +10 -10
- package/dist/types/reference/graphql.d.ts +89 -11
- package/dist/types/reference/index.d.ts +1 -1
- package/dist/types/reference/openapi.d.ts +33 -12
- package/dist/types/reference/options.d.ts +82 -6
- package/dist/types/reference/scalar.d.ts +13 -0
- package/dist/types/reference/schema.d.ts +144 -36
- package/dist/types/search/adapters/registry.d.ts +3 -0
- package/dist/types/search/adapters/typesense.d.ts +14 -4
- package/dist/types/search/build.d.ts +3 -1
- package/dist/types/search/documents.d.ts +12 -1
- package/dist/types/search/orama-index.d.ts +13 -9
- package/dist/types/search/sync/algolia.d.ts +5 -2
- package/dist/types/search/sync/index.d.ts +3 -1
- package/dist/types/search/sync/typesense.d.ts +11 -7
- package/dist/types/seo/metatags.d.ts +20 -0
- package/dist/types/sources/contentful.d.ts +16 -0
- package/dist/types/sources/github-releases.d.ts +8 -1
- package/dist/types/sources/payload.d.ts +2 -0
- package/dist/types/sources/registry.d.ts +54 -0
- package/dist/types/sources/shared.d.ts +3 -0
- package/dist/types/sources/strapi.d.ts +2 -0
- package/docs/01-quickstart.mdx +4 -2
- package/docs/02-deployment.mdx +71 -17
- package/docs/03-upgrading.mdx +4 -4
- package/docs/04-migrating.mdx +1 -1
- package/docs/advanced/changelog.mdx +13 -2
- package/docs/advanced/skills.mdx +15 -1
- package/docs/cli/audit.mdx +51 -8
- package/docs/cli/doctor.mdx +5 -1
- package/docs/cli/evals.mdx +4 -4
- package/docs/cli/index.mdx +1 -0
- package/docs/cli/translate.mdx +1 -0
- package/docs/cli/validate.mdx +4 -3
- package/docs/configuration/analytics.mdx +3 -1
- package/docs/configuration/assistant.mdx +194 -38
- package/docs/configuration/consent.mdx +100 -0
- package/docs/configuration/customization.mdx +8 -6
- package/docs/configuration/export.mdx +5 -3
- package/docs/configuration/index.mdx +64 -5
- package/docs/configuration/meta.ts +3 -0
- package/docs/configuration/narration.mdx +119 -0
- package/docs/configuration/rate-limiting.mdx +90 -0
- package/docs/configuration/search.mdx +63 -12
- package/docs/configuration/theming.mdx +3 -1
- package/docs/content/components.mdx +108 -2
- package/docs/content/frontmatter.mdx +80 -2
- package/docs/content/i18n.mdx +39 -4
- package/docs/content/includes.mdx +16 -0
- package/docs/content/meta.mdx +1 -0
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +32 -10
- package/docs/content/sources/contentful.mdx +35 -0
- package/docs/content/sources/custom.mdx +43 -0
- package/docs/content/sources/github-releases.mdx +39 -0
- package/docs/content/sources/index.mdx +91 -0
- package/docs/content/sources/meta.ts +16 -0
- package/docs/content/sources/notion.mdx +32 -0
- package/docs/content/sources/obsidian.mdx +37 -0
- package/docs/content/sources/payload.mdx +31 -0
- package/docs/content/sources/remote-mdx.mdx +44 -0
- package/docs/content/sources/sanity.mdx +29 -0
- package/docs/content/sources/strapi.mdx +32 -0
- package/docs/content/syntax.mdx +69 -4
- package/docs/content/variables.mdx +41 -0
- package/docs/discoverability/agent-discovery.mdx +29 -2
- package/docs/discoverability/index.mdx +2 -2
- package/docs/discoverability/json-api.mdx +2 -0
- package/docs/discoverability/llms-txt.mdx +2 -2
- package/docs/discoverability/markdown.mdx +3 -1
- package/docs/discoverability/mcp.mdx +4 -0
- package/docs/discoverability/metadata.mdx +17 -0
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/api-pages.mdx +74 -0
- package/docs/references/asyncapi.mdx +4 -2
- package/docs/references/graphql.mdx +14 -2
- package/docs/references/meta.ts +1 -1
- package/docs/references/openapi.mdx +148 -7
- package/docs/references/scalar.mdx +3 -1
- package/package.json +43 -8
- package/skills/blume/SKILL.md +3 -0
- package/skills/blume-migrate/SKILL.md +6 -6
- package/skills/blume-migrate/references/docusaurus.md +7 -7
- package/skills/blume-migrate/references/fumadocs.md +17 -13
- package/skills/blume-migrate/references/mintlify.md +37 -19
- package/skills/blume-migrate/references/nextra.md +10 -7
- package/skills/blume-migrate/references/starlight.md +11 -8
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +60 -14
- package/skills/blume-write-skill/SKILL.md +82 -0
- package/src/ai/agent-readability.ts +2 -1
- package/src/ai/agent-surface.ts +9 -7
- package/src/ai/ai-catalog.ts +6 -3
- package/src/ai/ask-context.ts +103 -20
- package/src/ai/ask-data.ts +6 -0
- package/src/ai/ask-limits.ts +13 -0
- package/src/ai/ask-tools.ts +142 -0
- package/src/ai/ask.ts +354 -76
- package/src/ai/changelog-markdown.ts +11 -6
- package/src/ai/component-markdown.ts +76 -1
- package/src/ai/cors.ts +14 -3
- package/src/ai/index.ts +12 -0
- package/src/ai/llms.ts +6 -2
- package/src/ai/markdown.ts +2 -1
- package/src/ai/mcp/data.ts +6 -0
- package/src/ai/mcp/query.ts +14 -6
- package/src/ai/openapi-components.ts +36 -6
- package/src/ai/relative-links.ts +4 -38
- package/src/ai/site-skill.ts +274 -0
- package/src/ai/skills.ts +35 -2
- package/src/ai/write-skill.ts +97 -0
- package/src/astro/generate.ts +210 -66
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +42 -4
- package/src/astro/markdown-negotiation.ts +3 -0
- package/src/astro/module-types.ts +9 -1
- package/src/astro/pages.ts +23 -0
- package/src/astro/templates.ts +406 -108
- package/src/astro/variables.ts +31 -0
- package/src/audit/catalog.ts +38 -3
- package/src/audit/checks/contrast.ts +183 -0
- package/src/audit/checks/i18n.ts +2 -3
- package/src/audit/checks/indexability.ts +2 -3
- package/src/audit/checks/links.ts +19 -13
- package/src/audit/checks/network.ts +110 -6
- package/src/audit/checks/redirects.ts +6 -4
- package/src/audit/checks/robots.ts +58 -2
- package/src/audit/checks/sitemap.ts +2 -3
- package/src/audit/redirects.ts +46 -15
- package/src/audit/run.ts +5 -0
- package/src/audit/types.ts +4 -1
- package/src/audit/url.ts +14 -5
- package/src/blume-modules.d.ts +12 -1
- package/src/captcha/client.ts +152 -0
- package/src/captcha/hcaptcha.ts +36 -0
- package/src/captcha/index.ts +28 -0
- package/src/captcha/schema.ts +32 -0
- package/src/captcha/turnstile.ts +38 -0
- package/src/captcha/verify.ts +71 -0
- package/src/cli/args.ts +51 -0
- package/src/cli/build-failure.ts +23 -0
- package/src/cli/command-meta.ts +5 -0
- package/src/cli/commands/audit.ts +10 -1
- package/src/cli/commands/dev.ts +18 -2
- package/src/cli/commands/doctor.ts +67 -28
- package/src/cli/commands/eval.ts +36 -4
- package/src/cli/commands/init.ts +6 -4
- package/src/cli/commands/skill.ts +96 -0
- package/src/cli/commands/validate.ts +10 -1
- package/src/cli/index.ts +5 -0
- package/src/cli/init/scaffold.ts +3 -3
- package/src/cli/prepare.ts +6 -3
- package/src/cli/required-secrets.ts +72 -30
- package/src/components/BlumePage.astro +2 -0
- package/src/components/content/ApiEndpoint.astro +18 -0
- package/src/components/content/ApiField.astro +79 -0
- package/src/components/content/ApiPlayground.astro +66 -0
- package/src/components/content/ApiRail.astro +19 -0
- package/src/components/content/Color.astro +1 -0
- package/src/components/content/FileTree.astro +1 -0
- package/src/components/content/GithubInfo.astro +1 -0
- package/src/components/content/Panel.astro +1 -0
- package/src/components/content/ParamField.astro +25 -0
- package/src/components/content/RequestExample.astro +17 -0
- package/src/components/content/ResponseExample.astro +17 -0
- package/src/components/content/ResponseField.astro +32 -0
- package/src/components/content/Step.astro +1 -0
- package/src/components/content/Tile.astro +1 -0
- package/src/components/content/Tooltip.astro +1 -0
- package/src/components/content/Tree.astro +1 -0
- package/src/components/content/TypeTable.astro +4 -1
- package/src/components/content/View.astro +21 -0
- package/src/components/content/ViewSwitcher.astro +168 -0
- package/src/components/content/api-field.ts +103 -0
- package/src/components/content/api-page.ts +248 -0
- package/src/components/content/mermaid-element.ts +15 -1
- package/src/components/content/view-switcher.ts +71 -0
- package/src/components/index.ts +2 -0
- package/src/components/islands/Assistant.astro +10 -1
- package/src/components/islands/assistant.tsx +104 -14
- package/src/components/islands/code-question.ts +62 -0
- package/src/components/islands/hooks.ts +136 -21
- package/src/components/islands/support-link.ts +68 -0
- package/src/components/layout/Analytics.astro +11 -2
- package/src/components/layout/Banner.astro +14 -10
- package/src/components/layout/Breadcrumbs.astro +6 -2
- package/src/components/layout/ConsentBanner.astro +62 -0
- package/src/components/layout/ConsentHead.astro +38 -0
- package/src/components/layout/Directory.astro +94 -0
- package/src/components/layout/DrawerSwitchers.astro +51 -0
- package/src/components/layout/Empty.astro +2 -2
- package/src/components/layout/Header.astro +122 -80
- package/src/components/layout/LanguageSwitcher.astro +48 -15
- package/src/components/layout/NarrationPlayer.astro +1085 -0
- package/src/components/layout/NavSelector.astro +33 -7
- package/src/components/layout/PageActions.astro +139 -24
- package/src/components/layout/PageFeedback.astro +54 -49
- package/src/components/layout/PageLayout.astro +71 -3
- package/src/components/layout/ReferenceLayout.astro +17 -6
- package/src/components/layout/RelatedPages.astro +42 -0
- package/src/components/layout/RootLayout.astro +318 -47
- package/src/components/layout/Search.astro +47 -19
- package/src/components/layout/SiteFooter.astro +124 -0
- package/src/components/layout/SiteMetatags.astro +16 -0
- package/src/components/layout/TableOfContents.astro +24 -17
- package/src/components/layout/consent/native.ts +79 -0
- package/src/components/layout/consent/types.ts +37 -0
- package/src/components/layout/footer-links.ts +53 -0
- package/src/components/layout/footer-socials.ts +87 -0
- package/src/components/layout/head-scripts.ts +6 -1
- package/src/components/layout/locale-redirect.ts +107 -0
- package/src/components/layout/nav-utils.ts +83 -0
- package/src/components/layout/page-feedback.ts +96 -0
- package/src/components/layout/search/algolia.ts +10 -1
- package/src/components/layout/search/analytics.ts +126 -0
- package/src/components/layout/search/endpoint.ts +48 -5
- package/src/components/layout/search/flexsearch.ts +17 -5
- package/src/components/layout/search/orama-cloud.ts +26 -14
- package/src/components/layout/search/pagefind.ts +114 -5
- package/src/components/layout/search/types.ts +32 -0
- package/src/components/layout/search/typesense.ts +19 -3
- package/src/components/openapi/AsyncApiOperation.astro +14 -7
- package/src/components/openapi/Authorization.astro +10 -0
- package/src/components/openapi/GraphqlOperation.astro +5 -0
- package/src/components/openapi/Operation.astro +184 -13
- package/src/components/openapi/ParametersTable.astro +8 -4
- package/src/components/openapi/Playground.astro +7 -1
- package/src/components/openapi/RequestBody.astro +24 -5
- package/src/components/openapi/RequestPanel.astro +59 -7
- package/src/components/openapi/Responses.astro +7 -4
- package/src/components/openapi/SchemaTable.astro +15 -3
- package/src/components/openapi/async-snippets.ts +65 -9
- package/src/components/openapi/async.ts +123 -29
- package/src/components/openapi/code-samples.ts +97 -0
- package/src/components/openapi/graphql-helpers.ts +35 -12
- package/src/components/openapi/helpers.ts +36 -2
- package/src/components/openapi/message-model.ts +54 -11
- package/src/components/openapi/message.ts +14 -4
- package/src/components/openapi/operation-model.ts +16 -7
- package/src/components/openapi/playground-client.ts +24 -5
- package/src/components/openapi/playground-schema.ts +1 -1
- package/src/components/openapi/schema-tree.ts +44 -14
- package/src/components/openapi/security.ts +16 -3
- package/src/components/openapi/snippets.ts +873 -10
- package/src/components/openapi/validate-json.ts +4 -3
- package/src/components/props.ts +6 -0
- package/src/consent/client.ts +95 -0
- package/src/consent/clients.ts +19 -0
- package/src/consent/ethyca.ts +71 -0
- package/src/consent/head.ts +24 -0
- package/src/consent/index.ts +37 -0
- package/src/consent/init.ts +29 -0
- package/src/consent/native.ts +36 -0
- package/src/consent/osano.ts +59 -0
- package/src/consent/schema.ts +30 -0
- package/src/core/builtin-tags.ts +5 -0
- package/src/core/changelog-index.ts +31 -1
- package/src/core/client-address.ts +19 -0
- package/src/core/component-diagnostics.ts +53 -0
- package/src/core/component-overrides.ts +32 -0
- package/src/core/config-input.ts +225 -23
- package/src/core/data.ts +46 -4
- package/src/core/diagnostics.ts +8 -2
- package/src/core/footer.ts +26 -0
- package/src/core/graph.ts +39 -36
- package/src/core/i18n-ui.ts +84 -2
- package/src/core/includes.ts +21 -4
- package/src/core/links.ts +63 -19
- package/src/core/localizable.ts +26 -0
- package/src/core/navigation.ts +43 -12
- package/src/core/page-modes.ts +56 -0
- package/src/core/probe.ts +26 -6
- package/src/core/project-graph.ts +163 -16
- package/src/core/redirect-patterns.ts +520 -0
- package/src/core/related.ts +131 -0
- package/src/core/schema.ts +339 -66
- package/src/core/sources/cache.ts +6 -0
- package/src/core/sources/contentful-rich-text.ts +29 -6
- package/src/core/sources/contentful.ts +135 -25
- package/src/core/sources/filesystem.ts +26 -4
- package/src/core/sources/github-releases.ts +12 -1
- package/src/core/sources/lexical.ts +15 -10
- package/src/core/sources/mdx-remote.ts +62 -10
- package/src/core/sources/normalize.ts +228 -41
- package/src/core/sources/notion.ts +7 -1
- package/src/core/sources/obsidian.ts +16 -3
- package/src/core/sources/payload.ts +38 -15
- package/src/core/sources/read.ts +8 -3
- package/src/core/sources/remote.ts +72 -15
- package/src/core/sources/resolve.ts +11 -1
- package/src/core/sources/sanity.ts +43 -25
- package/src/core/sources/strapi.ts +2 -2
- package/src/core/types.ts +19 -1
- package/src/core/ui-packs/ar.ts +44 -0
- package/src/core/ui-packs/bg.ts +46 -0
- package/src/core/ui-packs/bn.ts +44 -0
- package/src/core/ui-packs/ca.ts +47 -0
- package/src/core/ui-packs/cs.ts +45 -0
- package/src/core/ui-packs/da.ts +46 -0
- package/src/core/ui-packs/de.ts +47 -0
- package/src/core/ui-packs/el.ts +46 -0
- package/src/core/ui-packs/es.ts +47 -0
- package/src/core/ui-packs/fa.ts +46 -0
- package/src/core/ui-packs/fi.ts +46 -0
- package/src/core/ui-packs/fr.ts +47 -0
- package/src/core/ui-packs/he.ts +44 -0
- package/src/core/ui-packs/hi.ts +45 -0
- package/src/core/ui-packs/hr.ts +46 -0
- package/src/core/ui-packs/hu.ts +45 -0
- package/src/core/ui-packs/id.ts +46 -0
- package/src/core/ui-packs/it.ts +46 -0
- package/src/core/ui-packs/ja.ts +46 -0
- package/src/core/ui-packs/ko.ts +45 -0
- package/src/core/ui-packs/nl.ts +47 -0
- package/src/core/ui-packs/no.ts +45 -0
- package/src/core/ui-packs/pl.ts +46 -0
- package/src/core/ui-packs/pt-br.ts +47 -0
- package/src/core/ui-packs/pt.ts +46 -0
- package/src/core/ui-packs/ro.ts +46 -0
- package/src/core/ui-packs/ru.ts +46 -0
- package/src/core/ui-packs/sk.ts +45 -0
- package/src/core/ui-packs/sr.ts +46 -0
- package/src/core/ui-packs/sv.ts +45 -0
- package/src/core/ui-packs/th.ts +44 -0
- package/src/core/ui-packs/tr.ts +46 -0
- package/src/core/ui-packs/uk.ts +46 -0
- package/src/core/ui-packs/vi.ts +46 -0
- package/src/core/ui-packs/zh-tw.ts +44 -0
- package/src/core/ui-packs/zh.ts +44 -0
- package/src/core/variables.ts +103 -0
- package/src/deploy/adapter-output.ts +7 -2
- package/src/deploy/adapters/cloudflare.ts +7 -5
- package/src/deploy/adapters/node.ts +47 -9
- package/src/deploy/adapters/types.ts +7 -3
- package/src/deploy/artifacts.ts +79 -9
- package/src/deploy/cloudflare-negotiation.ts +35 -5
- package/src/deploy/headers.ts +2 -1
- package/src/deploy/node-headers.ts +63 -9
- package/src/deploy/platforms/cloudflare.ts +45 -9
- package/src/deploy/platforms/netlify.ts +35 -2
- package/src/deploy/platforms/node.ts +12 -2
- package/src/deploy/platforms/types.ts +21 -7
- package/src/deploy/platforms/vercel.ts +149 -17
- package/src/deploy/redirects.ts +151 -24
- package/src/deploy/rss.ts +3 -1
- package/src/deploy/sitemap.ts +39 -5
- package/src/deploy/vercel-negotiation.ts +326 -102
- package/src/eval/agents.ts +18 -1
- package/src/eval/prompts.ts +6 -3
- package/src/eval/report.ts +34 -13
- package/src/eval/run.ts +5 -0
- package/src/markdown/api-rail.ts +259 -0
- package/src/markdown/code-title.ts +35 -9
- package/src/markdown/features.ts +3 -2
- package/src/markdown/fence-meta.ts +2 -0
- package/src/markdown/include.ts +11 -1
- package/src/markdown/index.ts +28 -5
- package/src/markdown/math.ts +4 -4
- package/src/markdown/relative-links.ts +3 -2
- package/src/markdown/variables.ts +56 -0
- package/src/markdown/views.ts +82 -0
- package/src/narration/build.ts +412 -0
- package/src/narration/player.ts +249 -0
- package/src/narration/provider.ts +29 -0
- package/src/narration/script.ts +592 -0
- package/src/og/card.ts +7 -6
- package/src/openapi/checks.ts +273 -0
- package/src/openapi/graphql-build.ts +21 -0
- package/src/openapi/graphql.ts +11 -0
- package/src/openapi/model.ts +72 -27
- package/src/openapi/overlay.ts +256 -0
- package/src/openapi/parse.ts +182 -4
- package/src/openapi/references.ts +64 -8
- package/src/openapi/render-mdx.ts +5 -1
- package/src/openapi/scalar.ts +40 -6
- package/src/openapi/source.ts +40 -15
- package/src/ratelimit/cloudflare.ts +54 -0
- package/src/ratelimit/index.ts +30 -0
- package/src/ratelimit/memory.ts +45 -0
- package/src/ratelimit/runtime.ts +247 -0
- package/src/ratelimit/schema.ts +28 -0
- package/src/ratelimit/upstash.ts +60 -0
- package/src/ratelimit/wrangler.ts +70 -0
- package/src/reference/asyncapi.ts +2 -2
- package/src/reference/graphql.ts +20 -3
- package/src/reference/index.ts +1 -0
- package/src/reference/openapi.ts +21 -7
- package/src/reference/options.ts +80 -8
- package/src/reference/scalar.ts +33 -8
- package/src/registry/eject.ts +23 -5
- package/src/registry/registry.ts +7 -0
- package/src/search/adapters/locale-scope.ts +30 -0
- package/src/search/adapters/typesense.ts +14 -4
- package/src/search/build.ts +21 -3
- package/src/search/documents.ts +26 -2
- package/src/search/orama-index.ts +191 -34
- package/src/search/pagefind-ranking.ts +39 -0
- package/src/search/source-pages.ts +29 -0
- package/src/search/sync/algolia.ts +111 -10
- package/src/search/sync/index.ts +52 -13
- package/src/search/sync/orama-cloud.ts +3 -0
- package/src/search/sync/typesense.ts +76 -26
- package/src/seo/metatags.ts +67 -0
- package/src/sources/contentful.ts +12 -0
- package/src/sources/github-releases.ts +7 -1
- package/src/sources/shared.ts +3 -0
- package/src/theme/chrome-icons.ts +1 -0
- package/src/theme/color.ts +500 -0
- package/src/theme/entry.ts +85 -6
- package/src/theme/palette.ts +121 -45
- package/src/translate/prompts.ts +1 -0
- package/src/translate/validate.ts +31 -3
- package/src/upgrade/upgrade.ts +4 -171
- package/dist/cli/chunk-1d7ve1dm.js.map +0 -12
- package/dist/cli/chunk-2hsdwb9n.js.map +0 -10
- package/dist/cli/chunk-35d4wj9f.js.map +0 -15
- package/dist/cli/chunk-364znk6q.js +0 -75
- package/dist/cli/chunk-364znk6q.js.map +0 -11
- package/dist/cli/chunk-5m5nmvyq.js.map +0 -13
- package/dist/cli/chunk-8ktnccpt.js.map +0 -10
- package/dist/cli/chunk-9t7a85s3.js.map +0 -10
- package/dist/cli/chunk-b07cmahc.js +0 -145
- package/dist/cli/chunk-b07cmahc.js.map +0 -11
- package/dist/cli/chunk-c8chx29p.js.map +0 -36
- package/dist/cli/chunk-e04dxsz1.js +0 -39
- package/dist/cli/chunk-e04dxsz1.js.map +0 -10
- package/dist/cli/chunk-j85vccga.js.map +0 -36
- package/dist/cli/chunk-p3v96n38.js.map +0 -10
- package/dist/cli/chunk-pehfxfta.js.map +0 -10
- package/dist/cli/chunk-pv29h0wf.js.map +0 -190
- package/dist/cli/chunk-q58y5e6a.js.map +0 -10
- package/dist/cli/chunk-vg9r4eb9.js.map +0 -14
- package/dist/cli/chunk-wrr3j9w9.js.map +0 -35
- package/dist/cli/chunk-yfyb25rh.js.map +0 -14
- package/docs/content/sources.mdx +0 -334
- /package/dist/cli/{chunk-tkacnehg.js.map → chunk-3v3ffbrj.js.map} +0 -0
- /package/dist/cli/{chunk-r9rcc4w7.js.map → chunk-8y2kmjv8.js.map} +0 -0
- /package/dist/cli/{chunk-2eytanqx.js.map → chunk-c887fj0s.js.map} +0 -0
- /package/dist/cli/{chunk-akbpwfxc.js.map → chunk-dzwehpy7.js.map} +0 -0
- /package/dist/cli/{chunk-2z928egk.js.map → chunk-ft9vfys6.js.map} +0 -0
- /package/dist/cli/{chunk-a58773jm.js.map → chunk-kma9f6sf.js.map} +0 -0
- /package/dist/cli/{chunk-crgn1q09.js.map → chunk-sds923fa.js.map} +0 -0
- /package/dist/cli/{chunk-acanzt5p.js.map → chunk-tdqhyxfz.js.map} +0 -0
|
@@ -14,20 +14,25 @@ import {
|
|
|
14
14
|
API_SEARCH_PATH,
|
|
15
15
|
apiNamePhrase,
|
|
16
16
|
resolveReferences,
|
|
17
|
-
referenceRoutes,
|
|
18
17
|
hasScalarReferences,
|
|
19
18
|
builtinProxyReferences,
|
|
19
|
+
apiPagesUseBuiltinProxy,
|
|
20
20
|
needsPlaygroundProxy,
|
|
21
21
|
buildMcpDiscovery,
|
|
22
22
|
buildMcpServerCard,
|
|
23
23
|
hasAiCatalog,
|
|
24
24
|
buildHomeLinkHeader,
|
|
25
|
+
resolveLocalizable,
|
|
25
26
|
resolveDocsCollection,
|
|
27
|
+
withChangelogIndexText,
|
|
26
28
|
discoverPages,
|
|
27
29
|
routeIsTaken,
|
|
28
30
|
hasGeneratedChangelog,
|
|
31
|
+
navTargetRoutes,
|
|
29
32
|
customOgRoutes,
|
|
30
33
|
resolveAskBackend,
|
|
34
|
+
captchaSettings,
|
|
35
|
+
parseApiEndpoint,
|
|
31
36
|
GOOGLE_FONTS,
|
|
32
37
|
isFontSlug,
|
|
33
38
|
fontLocaleCodes,
|
|
@@ -46,10 +51,11 @@ import {
|
|
|
46
51
|
renderRssFeed,
|
|
47
52
|
HTTP_METHODS,
|
|
48
53
|
withServerDefaults,
|
|
54
|
+
readOverlaidSpec,
|
|
49
55
|
isOpenApiSource,
|
|
50
56
|
buildRawMarkdown,
|
|
51
57
|
markdownRoutePaths
|
|
52
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-ehweg4fr.js";
|
|
53
59
|
import {
|
|
54
60
|
trimChar,
|
|
55
61
|
normalizeBasePath,
|
|
@@ -57,15 +63,16 @@ import {
|
|
|
57
63
|
mountBasePath,
|
|
58
64
|
siteRoot,
|
|
59
65
|
absoluteUrl2
|
|
60
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-zccbjcj0.js";
|
|
61
67
|
import {
|
|
62
68
|
validateSearchPopularIcons,
|
|
63
69
|
validateNavTargets
|
|
64
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-ncj7w596.js";
|
|
65
71
|
import {
|
|
72
|
+
EXPANDABLE_VISIBLE_LINES,
|
|
66
73
|
buildSearchDocuments,
|
|
67
74
|
buildMcpData
|
|
68
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-n0v7m8ry.js";
|
|
69
76
|
import {
|
|
70
77
|
planComponentSlots,
|
|
71
78
|
publishRuntimeModules,
|
|
@@ -77,6 +84,7 @@ import {
|
|
|
77
84
|
askComponentTemplate,
|
|
78
85
|
searchEndpointTemplate,
|
|
79
86
|
featuresTemplate,
|
|
87
|
+
consentClientTemplate,
|
|
80
88
|
searchClientTemplate,
|
|
81
89
|
mixedbreadSearchEndpointTemplate,
|
|
82
90
|
rawMarkdownEndpointTemplate,
|
|
@@ -105,32 +113,138 @@ import {
|
|
|
105
113
|
examplesPageTemplate,
|
|
106
114
|
runtimePackageTemplate,
|
|
107
115
|
runtimeTsconfigTemplate
|
|
108
|
-
} from "./chunk-
|
|
116
|
+
} from "./chunk-gb420vvz.js";
|
|
117
|
+
import {
|
|
118
|
+
validateUsedComponents,
|
|
119
|
+
missingExampleDiagnostics,
|
|
120
|
+
discoverIslands,
|
|
121
|
+
EXAMPLE_SCAN_GLOB,
|
|
122
|
+
exampleScanRoots,
|
|
123
|
+
discoverExamples,
|
|
124
|
+
exampleMarkdownLookup,
|
|
125
|
+
missingDependencyDiagnostic
|
|
126
|
+
} from "./chunk-66w9j7p6.js";
|
|
109
127
|
import {
|
|
110
128
|
emptyComponentOverrides,
|
|
111
129
|
analyzeComponentOverrides
|
|
112
|
-
} from "./chunk-
|
|
130
|
+
} from "./chunk-54ztw1nj.js";
|
|
113
131
|
import {
|
|
114
132
|
writeTextAtomic
|
|
115
133
|
} from "./chunk-jq5n4avg.js";
|
|
116
134
|
import {
|
|
117
|
-
|
|
118
|
-
|
|
135
|
+
resolveAccent,
|
|
136
|
+
resolveRadius,
|
|
137
|
+
buildThemeCss
|
|
138
|
+
} from "./chunk-cm89scdv.js";
|
|
119
139
|
import {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
missingDependencyDiagnostic
|
|
123
|
-
} from "./chunk-b07cmahc.js";
|
|
140
|
+
registry
|
|
141
|
+
} from "./chunk-c1y538kd.js";
|
|
124
142
|
|
|
125
143
|
// src/astro/integration.ts
|
|
126
|
-
import { join as
|
|
144
|
+
import { join as join4, relative, resolve as resolve2 } from "pathe";
|
|
127
145
|
|
|
128
146
|
// src/deploy/artifacts.ts
|
|
129
|
-
import { dirname as
|
|
147
|
+
import { dirname as dirname3, join as join3, resolve } from "pathe";
|
|
148
|
+
|
|
149
|
+
// src/narration/build.ts
|
|
150
|
+
import { createGateway, generateSpeech } from "ai";
|
|
151
|
+
import { HTMLElement, parse, TextNode } from "node-html-parser";
|
|
152
|
+
import { dirname, join } from "pathe";
|
|
153
|
+
|
|
154
|
+
// src/narration/script.ts
|
|
155
|
+
var INLINE_TAGS = new Set([
|
|
156
|
+
"a",
|
|
157
|
+
"abbr",
|
|
158
|
+
"audio",
|
|
159
|
+
"button",
|
|
160
|
+
"canvas",
|
|
161
|
+
"embed",
|
|
162
|
+
"iframe",
|
|
163
|
+
"img",
|
|
164
|
+
"input",
|
|
165
|
+
"math",
|
|
166
|
+
"noscript",
|
|
167
|
+
"object",
|
|
168
|
+
"picture",
|
|
169
|
+
"script",
|
|
170
|
+
"select",
|
|
171
|
+
"style",
|
|
172
|
+
"svg",
|
|
173
|
+
"template",
|
|
174
|
+
"textarea",
|
|
175
|
+
"video",
|
|
176
|
+
"b",
|
|
177
|
+
"bdi",
|
|
178
|
+
"bdo",
|
|
179
|
+
"cite",
|
|
180
|
+
"code",
|
|
181
|
+
"data",
|
|
182
|
+
"del",
|
|
183
|
+
"dfn",
|
|
184
|
+
"em",
|
|
185
|
+
"font",
|
|
186
|
+
"i",
|
|
187
|
+
"ins",
|
|
188
|
+
"kbd",
|
|
189
|
+
"label",
|
|
190
|
+
"mark",
|
|
191
|
+
"q",
|
|
192
|
+
"s",
|
|
193
|
+
"samp",
|
|
194
|
+
"small",
|
|
195
|
+
"span",
|
|
196
|
+
"strong",
|
|
197
|
+
"sub",
|
|
198
|
+
"sup",
|
|
199
|
+
"time",
|
|
200
|
+
"u",
|
|
201
|
+
"var",
|
|
202
|
+
"wbr"
|
|
203
|
+
]);
|
|
204
|
+
var SKIPPED_TAGS = new Set([
|
|
205
|
+
"audio",
|
|
206
|
+
"blume-diff",
|
|
207
|
+
"blume-mermaid",
|
|
208
|
+
"button",
|
|
209
|
+
"canvas",
|
|
210
|
+
"dialog",
|
|
211
|
+
"embed",
|
|
212
|
+
"figure",
|
|
213
|
+
"iframe",
|
|
214
|
+
"img",
|
|
215
|
+
"input",
|
|
216
|
+
"math",
|
|
217
|
+
"nav",
|
|
218
|
+
"noscript",
|
|
219
|
+
"object",
|
|
220
|
+
"picture",
|
|
221
|
+
"pre",
|
|
222
|
+
"script",
|
|
223
|
+
"select",
|
|
224
|
+
"style",
|
|
225
|
+
"svg",
|
|
226
|
+
"table",
|
|
227
|
+
"template",
|
|
228
|
+
"textarea",
|
|
229
|
+
"video"
|
|
230
|
+
]);
|
|
231
|
+
var CALLOUT_KINDS = new Set([
|
|
232
|
+
"danger",
|
|
233
|
+
"info",
|
|
234
|
+
"note",
|
|
235
|
+
"success",
|
|
236
|
+
"tip",
|
|
237
|
+
"warning"
|
|
238
|
+
]);
|
|
239
|
+
var DENSE_SCRIPT_LANGS = new Set(["ja", "ko", "zh"]);
|
|
130
240
|
|
|
131
241
|
// src/search/build.ts
|
|
132
242
|
import { close, createIndex } from "pagefind";
|
|
133
|
-
import { dirname, join } from "pathe";
|
|
243
|
+
import { dirname as dirname2, join as join2 } from "pathe";
|
|
244
|
+
|
|
245
|
+
// src/search/sync/algolia.ts
|
|
246
|
+
var jsonBytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf-8");
|
|
247
|
+
var WIDEST_CHARACTER = jsonBytes("\x00");
|
|
134
248
|
|
|
135
249
|
// src/deploy/sitemap.ts
|
|
136
250
|
import { escape as escapeXml } from "html-escaper";
|
|
@@ -226,8 +340,8 @@ import {
|
|
|
226
340
|
rm,
|
|
227
341
|
writeFile
|
|
228
342
|
} from "node:fs/promises";
|
|
229
|
-
import { dirname as
|
|
230
|
-
var ogCacheDir = (context) => existsSync(
|
|
343
|
+
import { dirname as dirname4, join as join5 } from "pathe";
|
|
344
|
+
var ogCacheDir = (context) => existsSync(join5(context.root, "node_modules")) ? join5(context.root, "node_modules", ".cache", "blume", "og") : join5(context.outDir, ".cache", "og");
|
|
231
345
|
var REGISTRY_KEY2 = Symbol.for("blume.og-cache");
|
|
232
346
|
var registry3 = () => {
|
|
233
347
|
const host = globalThis;
|
|
@@ -245,7 +359,7 @@ var pruneCardCache = async (dir) => {
|
|
|
245
359
|
return 0;
|
|
246
360
|
}
|
|
247
361
|
const stale = entries.filter((name) => name.endsWith(".tmp") || name.endsWith(".png") && !used.has(name.slice(0, -".png".length)));
|
|
248
|
-
await Promise.all(stale.map((name) => rm(
|
|
362
|
+
await Promise.all(stale.map((name) => rm(join5(dir, name), { force: true })));
|
|
249
363
|
return stale.length;
|
|
250
364
|
};
|
|
251
365
|
var cardCacheTally = () => {
|
|
@@ -259,7 +373,7 @@ import { existsSync as existsSync6, readFileSync as readFileSync3, realpathSync
|
|
|
259
373
|
import {
|
|
260
374
|
lstat,
|
|
261
375
|
mkdir as mkdir2,
|
|
262
|
-
readFile as
|
|
376
|
+
readFile as readFile3,
|
|
263
377
|
readlink,
|
|
264
378
|
realpath,
|
|
265
379
|
rm as rm2,
|
|
@@ -267,9 +381,9 @@ import {
|
|
|
267
381
|
} from "node:fs/promises";
|
|
268
382
|
import { createRequire as createRequire2 } from "node:module";
|
|
269
383
|
import { pathToFileURL } from "node:url";
|
|
270
|
-
import
|
|
271
|
-
import { dirname as
|
|
272
|
-
import { glob
|
|
384
|
+
import pMap from "p-map";
|
|
385
|
+
import { dirname as dirname8, isAbsolute as isAbsolute5, join as join11, normalize as normalize2, relative as relative5, resolve as resolve6 } from "pathe";
|
|
386
|
+
import { glob } from "tinyglobby";
|
|
273
387
|
|
|
274
388
|
// src/ai/api/problem.ts
|
|
275
389
|
var PROBLEM_TYPE = "application/problem+json";
|
|
@@ -813,6 +927,12 @@ var buildAskData = async (project) => {
|
|
|
813
927
|
if (versioned) {
|
|
814
928
|
document.version = doc.version;
|
|
815
929
|
}
|
|
930
|
+
if (doc.boost !== undefined) {
|
|
931
|
+
document.boost = doc.boost;
|
|
932
|
+
}
|
|
933
|
+
if (doc.keywords) {
|
|
934
|
+
document.keywords = doc.keywords;
|
|
935
|
+
}
|
|
816
936
|
return document;
|
|
817
937
|
}),
|
|
818
938
|
site: project.config.deployment.options.site ?? null
|
|
@@ -839,70 +959,6 @@ var navVariants = (data, hiddenDefault = null) => [
|
|
|
839
959
|
})))
|
|
840
960
|
];
|
|
841
961
|
|
|
842
|
-
// src/core/builtin-tags.ts
|
|
843
|
-
var BUILTIN_MDX_TAGS = new Set([
|
|
844
|
-
"Accordion",
|
|
845
|
-
"AccordionItem",
|
|
846
|
-
"ApiOverview",
|
|
847
|
-
"ApiTagOperations",
|
|
848
|
-
"AutoTypeTable",
|
|
849
|
-
"Badge",
|
|
850
|
-
"Callout",
|
|
851
|
-
"Card",
|
|
852
|
-
"CardGroup",
|
|
853
|
-
"CodeBlock",
|
|
854
|
-
"CodeGroup",
|
|
855
|
-
"Color",
|
|
856
|
-
"Column",
|
|
857
|
-
"Columns",
|
|
858
|
-
"Component",
|
|
859
|
-
"Diff",
|
|
860
|
-
"Expandable",
|
|
861
|
-
"FileTree",
|
|
862
|
-
"Frame",
|
|
863
|
-
"GithubInfo",
|
|
864
|
-
"Icon",
|
|
865
|
-
"Math",
|
|
866
|
-
"Operation",
|
|
867
|
-
"Panel",
|
|
868
|
-
"Prompt",
|
|
869
|
-
"Step",
|
|
870
|
-
"Steps",
|
|
871
|
-
"Tab",
|
|
872
|
-
"Tabs",
|
|
873
|
-
"Tile",
|
|
874
|
-
"Tooltip",
|
|
875
|
-
"Tree",
|
|
876
|
-
"TypeTable",
|
|
877
|
-
"Visibility",
|
|
878
|
-
"YouTube"
|
|
879
|
-
]);
|
|
880
|
-
|
|
881
|
-
// src/core/component-diagnostics.ts
|
|
882
|
-
var toKebab = (tag) => tag.replaceAll(/(?<lower>[a-z0-9])(?<upper>[A-Z])/gu, "$<lower>-$<upper>").toLowerCase();
|
|
883
|
-
var validateUsedComponents = (pages, extraTags, registryNames) => {
|
|
884
|
-
const diagnostics = [];
|
|
885
|
-
const seen = new Set;
|
|
886
|
-
for (const page of pages) {
|
|
887
|
-
for (const tag of page.componentsUsed ?? []) {
|
|
888
|
-
if (BUILTIN_MDX_TAGS.has(tag) || extraTags.has(tag) || seen.has(tag)) {
|
|
889
|
-
continue;
|
|
890
|
-
}
|
|
891
|
-
seen.add(tag);
|
|
892
|
-
const name = toKebab(tag);
|
|
893
|
-
const suggestion = registryNames.has(name) ? `Run \`blume add ${name}\` to install it, or register <${tag}> in components.ts (mdx).` : `Register <${tag}> in components.ts (mdx), or add an islands/${tag}.tsx component.`;
|
|
894
|
-
diagnostics.push({
|
|
895
|
-
code: "BLUME_UNKNOWN_COMPONENT",
|
|
896
|
-
file: page.sourcePath ?? page.id,
|
|
897
|
-
message: `<${tag}> is used in ${page.route} but isn't a known component.`,
|
|
898
|
-
severity: "warning",
|
|
899
|
-
suggestion
|
|
900
|
-
});
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
return diagnostics;
|
|
904
|
-
};
|
|
905
|
-
|
|
906
962
|
// src/core/svg-dimensions.ts
|
|
907
963
|
var ROOT = /<svg\s(?:[^>"']|"[^"]*"|'[^']*')*>/u;
|
|
908
964
|
var WIDTH = /\swidth=(?<quote>['"])(?<value>[^%]+?)\k<quote>/u;
|
|
@@ -968,7 +1024,7 @@ var svgDimensions = (svg) => {
|
|
|
968
1024
|
|
|
969
1025
|
// src/core/tsconfig-aliases.ts
|
|
970
1026
|
import { existsSync as existsSync2 } from "node:fs";
|
|
971
|
-
import { dirname as
|
|
1027
|
+
import { dirname as dirname5, join as join6, resolve as resolve3 } from "pathe";
|
|
972
1028
|
import ts from "typescript";
|
|
973
1029
|
var PARSE_HOST = {
|
|
974
1030
|
fileExists: ts.sys.fileExists,
|
|
@@ -990,7 +1046,7 @@ var toAlias = (key, value, baseDir) => {
|
|
|
990
1046
|
return { find, replacement: resolve3(baseDir, target) };
|
|
991
1047
|
};
|
|
992
1048
|
var resolveTsconfigAliases = (root) => {
|
|
993
|
-
const entry = ["tsconfig.json", "jsconfig.json"].map((name) =>
|
|
1049
|
+
const entry = ["tsconfig.json", "jsconfig.json"].map((name) => join6(root, name)).find((file) => existsSync2(file));
|
|
994
1050
|
if (!entry) {
|
|
995
1051
|
return {};
|
|
996
1052
|
}
|
|
@@ -998,7 +1054,7 @@ var resolveTsconfigAliases = (root) => {
|
|
|
998
1054
|
if (error) {
|
|
999
1055
|
return {};
|
|
1000
1056
|
}
|
|
1001
|
-
const configDir =
|
|
1057
|
+
const configDir = dirname5(entry);
|
|
1002
1058
|
const { options } = ts.parseJsonConfigFileContent(config, PARSE_HOST, configDir, undefined, entry);
|
|
1003
1059
|
const { paths } = options;
|
|
1004
1060
|
if (!paths) {
|
|
@@ -1151,9 +1207,9 @@ var hasMermaidFence = (text) => MERMAID_FENCE.test(text);
|
|
|
1151
1207
|
|
|
1152
1208
|
// src/og/derive.ts
|
|
1153
1209
|
import { existsSync as existsSync3 } from "node:fs";
|
|
1154
|
-
import { isAbsolute, join as
|
|
1210
|
+
import { isAbsolute, join as join7 } from "pathe";
|
|
1155
1211
|
var CARD_WEIGHTS = [400, 600];
|
|
1156
|
-
var absoluteSrc = (root, src) => isAbsolute(src) ? src :
|
|
1212
|
+
var absoluteSrc = (root, src) => isAbsolute(src) ? src : join7(root, src);
|
|
1157
1213
|
var isNumericWeight = (weight) => typeof weight === "number";
|
|
1158
1214
|
var isRangeWeight = (weight) => typeof weight === "string";
|
|
1159
1215
|
var isFontName = (value) => typeof value === "string";
|
|
@@ -1334,98 +1390,22 @@ var missingFontFiles = (options, root) => {
|
|
|
1334
1390
|
|
|
1335
1391
|
// src/og/logo.ts
|
|
1336
1392
|
import { existsSync as existsSync4, readFileSync } from "node:fs";
|
|
1337
|
-
import { join as
|
|
1393
|
+
import { join as join8 } from "pathe";
|
|
1338
1394
|
var resolveOgLogo = (project, source) => {
|
|
1339
1395
|
if (!source?.toLowerCase().endsWith(".svg")) {
|
|
1340
1396
|
return;
|
|
1341
1397
|
}
|
|
1342
1398
|
const relative = source.replace(/^\//u, "");
|
|
1343
1399
|
const file = [
|
|
1344
|
-
|
|
1345
|
-
|
|
1400
|
+
join8(project.context.root, "public", relative),
|
|
1401
|
+
join8(project.context.root, relative)
|
|
1346
1402
|
].find((path) => existsSync4(path));
|
|
1347
1403
|
return file ? readFileSync(file, "utf-8") : undefined;
|
|
1348
1404
|
};
|
|
1349
1405
|
|
|
1350
1406
|
// src/openapi/scalar.ts
|
|
1351
1407
|
import { readFile as readFile2 } from "node:fs/promises";
|
|
1352
|
-
import { isAbsolute as isAbsolute2, join as
|
|
1353
|
-
|
|
1354
|
-
// src/theme/palette.ts
|
|
1355
|
-
var FALLBACK_ACCENT = "oklch(0.62 0.16 250)";
|
|
1356
|
-
var ACCENTS = {
|
|
1357
|
-
blue: FALLBACK_ACCENT,
|
|
1358
|
-
green: "oklch(0.6 0.16 150)",
|
|
1359
|
-
orange: "oklch(0.68 0.17 50)",
|
|
1360
|
-
pink: "oklch(0.65 0.2 350)",
|
|
1361
|
-
purple: "oklch(0.58 0.2 290)",
|
|
1362
|
-
red: "oklch(0.58 0.22 25)",
|
|
1363
|
-
teal: "oklch(0.6 0.12 195)"
|
|
1364
|
-
};
|
|
1365
|
-
var isAccentPreset = (value) => Object.hasOwn(ACCENTS, value);
|
|
1366
|
-
var CSS_COLOR = /^[\w\s#%.,()/+-]+$/u;
|
|
1367
|
-
var safeColor = (value, fallback) => CSS_COLOR.test(value.trim()) ? value.trim() : fallback;
|
|
1368
|
-
var presetOrColor = (value) => isAccentPreset(value) ? ACCENTS[value] : safeColor(value, FALLBACK_ACCENT);
|
|
1369
|
-
var safeColorOrNull = (value) => value && CSS_COLOR.test(value.trim()) ? value.trim() : null;
|
|
1370
|
-
var RADII = {
|
|
1371
|
-
lg: "0.75rem",
|
|
1372
|
-
md: "0.5rem",
|
|
1373
|
-
none: "0",
|
|
1374
|
-
sm: "0.25rem"
|
|
1375
|
-
};
|
|
1376
|
-
var cssString = (value) => JSON.stringify(value);
|
|
1377
|
-
var backgroundImageCss = (image) => `url(${cssString(image)})`;
|
|
1378
|
-
var cssToken = (name, value) => value ? [` ${name}: ${value};`] : [];
|
|
1379
|
-
var themeRootCss = (theme, options) => [
|
|
1380
|
-
` --blume-accent: ${options.accent};`,
|
|
1381
|
-
...cssToken("--blume-action", options.action),
|
|
1382
|
-
...cssToken("--blume-action-foreground", options.action ? "oklch(1 0 0)" : null),
|
|
1383
|
-
...cssToken("--blume-background", safeColorOrNull(theme.background?.light)),
|
|
1384
|
-
...cssToken("--blume-background-image", theme.backgroundImage?.light ? backgroundImageCss(theme.backgroundImage.light) : null),
|
|
1385
|
-
` --blume-radius: ${options.radius};`
|
|
1386
|
-
].filter(Boolean).join(`
|
|
1387
|
-
`);
|
|
1388
|
-
var themeDarkCss = (theme, options) => {
|
|
1389
|
-
const tokens = [
|
|
1390
|
-
` --blume-accent: ${options.accent};`,
|
|
1391
|
-
" --blume-accent-foreground: oklch(1 0 0);",
|
|
1392
|
-
...cssToken("--blume-action", options.action),
|
|
1393
|
-
...cssToken("--blume-action-foreground", options.action ? "oklch(1 0 0)" : null),
|
|
1394
|
-
...cssToken("--blume-background", safeColorOrNull(theme.background?.dark)),
|
|
1395
|
-
...cssToken("--blume-background-image", theme.backgroundImage?.dark ? backgroundImageCss(theme.backgroundImage.dark) : null)
|
|
1396
|
-
].filter(Boolean);
|
|
1397
|
-
return `:root[data-theme="dark"] {
|
|
1398
|
-
${tokens.join(`
|
|
1399
|
-
`)}
|
|
1400
|
-
}
|
|
1401
|
-
`;
|
|
1402
|
-
};
|
|
1403
|
-
var resolveAccent = (theme) => ({
|
|
1404
|
-
dark: presetOrColor(theme.accent.dark),
|
|
1405
|
-
light: presetOrColor(theme.accent.light)
|
|
1406
|
-
});
|
|
1407
|
-
var resolveRadius = (theme) => RADII[theme.radius];
|
|
1408
|
-
var buildThemeCss = (theme) => {
|
|
1409
|
-
const accent = resolveAccent(theme);
|
|
1410
|
-
const action = theme.action ? presetOrColor(theme.action) : null;
|
|
1411
|
-
const radius = RADII[theme.radius];
|
|
1412
|
-
const root = themeRootCss(theme, {
|
|
1413
|
-
accent: accent.light,
|
|
1414
|
-
action,
|
|
1415
|
-
radius
|
|
1416
|
-
});
|
|
1417
|
-
const dark = themeDarkCss(theme, {
|
|
1418
|
-
accent: accent.dark,
|
|
1419
|
-
action
|
|
1420
|
-
});
|
|
1421
|
-
return `/* Generated by Blume from theme config. */
|
|
1422
|
-
:root {
|
|
1423
|
-
${root}
|
|
1424
|
-
}
|
|
1425
|
-
${dark}`;
|
|
1426
|
-
};
|
|
1427
|
-
|
|
1428
|
-
// src/openapi/scalar.ts
|
|
1408
|
+
import { isAbsolute as isAbsolute2, join as join9 } from "pathe";
|
|
1429
1409
|
var URL_SPEC = /^https?:\/\//u;
|
|
1430
1410
|
var referencePagePath = (route) => {
|
|
1431
1411
|
const segments = trimChar(route, "/");
|
|
@@ -1441,11 +1421,28 @@ var themeConfiguration = (config, override) => {
|
|
|
1441
1421
|
customCss: `:root,.light-mode,.dark-mode{--scalar-color-accent:${accent.light};--scalar-radius:${radius};}.dark-mode{--scalar-color-accent:${accent.dark};}`
|
|
1442
1422
|
};
|
|
1443
1423
|
};
|
|
1444
|
-
var
|
|
1424
|
+
var overlaidConfiguration = async (ref, root) => {
|
|
1425
|
+
try {
|
|
1426
|
+
const { text, warnings } = await readOverlaidSpec(ref.spec, root, {
|
|
1427
|
+
overlays: ref.overlays
|
|
1428
|
+
});
|
|
1429
|
+
return { config: { content: text }, warning: warnings[0] };
|
|
1430
|
+
} catch (error) {
|
|
1431
|
+
const { message } = error;
|
|
1432
|
+
return {
|
|
1433
|
+
warning: `API reference ${ref.route} was skipped: its overlays couldn't be applied to "${ref.spec}" (${message}).`
|
|
1434
|
+
};
|
|
1435
|
+
}
|
|
1436
|
+
};
|
|
1437
|
+
var specConfiguration = async (ref, root) => {
|
|
1438
|
+
const { spec } = ref;
|
|
1439
|
+
if (ref.overlays?.length) {
|
|
1440
|
+
return await overlaidConfiguration(ref, root);
|
|
1441
|
+
}
|
|
1445
1442
|
if (URL_SPEC.test(spec)) {
|
|
1446
1443
|
return { config: { url: spec } };
|
|
1447
1444
|
}
|
|
1448
|
-
const absolute = isAbsolute2(spec) ? spec :
|
|
1445
|
+
const absolute = isAbsolute2(spec) ? spec : join9(root, spec);
|
|
1449
1446
|
try {
|
|
1450
1447
|
return { config: { content: await readFile2(absolute, "utf-8") } };
|
|
1451
1448
|
} catch {
|
|
@@ -1483,13 +1480,16 @@ var buildReferenceFiles = async (options) => {
|
|
|
1483
1480
|
}
|
|
1484
1481
|
const built = await Promise.all(accepted.map(async (ref) => ({
|
|
1485
1482
|
ref,
|
|
1486
|
-
spec: await specConfiguration(ref
|
|
1483
|
+
spec: await specConfiguration(ref, root)
|
|
1487
1484
|
})));
|
|
1488
1485
|
const files = [];
|
|
1489
1486
|
for (const { ref, spec } of built) {
|
|
1490
1487
|
if (spec.warning) {
|
|
1491
1488
|
warnings.push(spec.warning);
|
|
1492
1489
|
}
|
|
1490
|
+
if (!spec.config) {
|
|
1491
|
+
continue;
|
|
1492
|
+
}
|
|
1493
1493
|
const pagePath = referencePagePath(ref.route);
|
|
1494
1494
|
const { theme, ...passthrough } = ref.scalar ?? {};
|
|
1495
1495
|
files.push({
|
|
@@ -1521,6 +1521,15 @@ var resolveSearchPopular = (popular, basePath) => popular.map(({ href, icon, lab
|
|
|
1521
1521
|
return page;
|
|
1522
1522
|
});
|
|
1523
1523
|
|
|
1524
|
+
// src/search/source-pages.ts
|
|
1525
|
+
import { relative as relative2 } from "pathe";
|
|
1526
|
+
var sourcePages = (project) => project.manifest.routes.flatMap((route) => route.indexable && route.sourcePath ? [
|
|
1527
|
+
[
|
|
1528
|
+
relative2(project.context.root, route.sourcePath),
|
|
1529
|
+
{ title: route.title, url: route.path }
|
|
1530
|
+
]
|
|
1531
|
+
] : []);
|
|
1532
|
+
|
|
1524
1533
|
// src/theme/code-block-padding.ts
|
|
1525
1534
|
var CODE_PADDING_BLOCK_REM = 1;
|
|
1526
1535
|
|
|
@@ -2077,14 +2086,60 @@ ${options.languageIcons ?? ""}
|
|
|
2077
2086
|
transparent;
|
|
2078
2087
|
}
|
|
2079
2088
|
|
|
2080
|
-
/* Word wrap
|
|
2081
|
-
|
|
2089
|
+
/* Word wrap: long lines wrap instead of scrolling, on every block
|
|
2090
|
+
(markdown.code.wrap, an attribute on <body>) or on one (\`\`\`ts wrap, which
|
|
2091
|
+
Shiki's fence-meta reader sets as data-wrap). Default code keeps
|
|
2092
|
+
\`white-space: pre\`. */
|
|
2082
2093
|
[data-blume-code-wrap] pre,
|
|
2083
|
-
[data-blume-code-wrap] pre code
|
|
2094
|
+
[data-blume-code-wrap] pre code,
|
|
2095
|
+
pre[data-wrap],
|
|
2096
|
+
pre[data-wrap] code {
|
|
2084
2097
|
overflow-wrap: break-word;
|
|
2085
2098
|
white-space: pre-wrap;
|
|
2086
2099
|
}
|
|
2087
2100
|
|
|
2101
|
+
/* An expandable block (\`\`\`ts expandable) starts collapsed to its first lines,
|
|
2102
|
+
faded out toward the cut, with a toggle under it (added by the layout
|
|
2103
|
+
script). Opened, it shows in full: no height cap and no inner scroll. The
|
|
2104
|
+
collapse needs that script to undo it, so a page without scripting shows
|
|
2105
|
+
the block the ordinary way. */
|
|
2106
|
+
@media (scripting: enabled) {
|
|
2107
|
+
.prose pre[data-expandable]:not([data-expanded]) > code {
|
|
2108
|
+
max-height: calc(${EXPANDABLE_VISIBLE_LINES}lh + ${CODE_SCROLL_INSET_REM}rem);
|
|
2109
|
+
mask-image: linear-gradient(to bottom, #000 calc(100% - 3lh), transparent);
|
|
2110
|
+
overflow-y: hidden;
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
|
|
2114
|
+
.prose pre[data-expandable][data-expanded] > code {
|
|
2115
|
+
max-height: none;
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
[data-blume-code-expand] {
|
|
2119
|
+
align-items: center;
|
|
2120
|
+
color: var(--blume-muted-foreground);
|
|
2121
|
+
display: flex;
|
|
2122
|
+
font-family: var(--font-sans);
|
|
2123
|
+
font-size: 0.75rem;
|
|
2124
|
+
font-weight: 500;
|
|
2125
|
+
gap: 0.25rem;
|
|
2126
|
+
justify-content: center;
|
|
2127
|
+
padding-top: 0.5rem;
|
|
2128
|
+
width: 100%;
|
|
2129
|
+
}
|
|
2130
|
+
|
|
2131
|
+
[data-blume-code-expand]:hover {
|
|
2132
|
+
color: var(--blume-foreground);
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2135
|
+
[data-blume-code-expand] svg {
|
|
2136
|
+
transition: transform 150ms;
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
[data-blume-code-expand][aria-expanded="true"] svg {
|
|
2140
|
+
transform: rotate(180deg);
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2088
2143
|
.prose :where(table) {
|
|
2089
2144
|
font-size: 0.8125rem;
|
|
2090
2145
|
}
|
|
@@ -2196,6 +2251,12 @@ blume-tabs pre[data-language],
|
|
|
2196
2251
|
padding-inline-end: 3.5rem;
|
|
2197
2252
|
}
|
|
2198
2253
|
|
|
2254
|
+
/* With the assistant on, an Ask button sits beside the copy button, so the
|
|
2255
|
+
line's tail clears both. */
|
|
2256
|
+
.prose :is(blume-tabs pre, .not-prose pre, pre:not([data-language])):not(.twoslash, .twoslash pre, blume-panel-tabs *):has(> [data-blume-ask]) > code {
|
|
2257
|
+
padding-inline-end: 5.75rem;
|
|
2258
|
+
}
|
|
2259
|
+
|
|
2199
2260
|
blume-tabs pre[data-language]::before,
|
|
2200
2261
|
.not-prose pre[data-language]::before {
|
|
2201
2262
|
content: none;
|
|
@@ -2363,8 +2424,11 @@ pre:has(.line.focused):hover .line:not(.focused) {
|
|
|
2363
2424
|
Strip the surrounding chrome so the printout is just the article. Scoped to
|
|
2364
2425
|
the chrome itself, never bare \`header\`/\`aside\`: content renders those too
|
|
2365
2426
|
(every Callout and Panel is an <aside>, every changelog Update has a
|
|
2366
|
-
<header>), and they belong in the printout. \`body > header\`
|
|
2367
|
-
\`layout.Header\`
|
|
2427
|
+
<header>), and they belong in the printout. \`body > header\` and
|
|
2428
|
+
\`body > footer\` keep \`layout.Header\` and \`layout.Footer\` overrides out
|
|
2429
|
+
as well. Everything after the article (directory and related-page cards,
|
|
2430
|
+
last updated, feedback, prev/next) is page chrome too, and so are the
|
|
2431
|
+
copy, ask, and expand buttons on code blocks. */
|
|
2368
2432
|
@media print {
|
|
2369
2433
|
[data-blume-banner],
|
|
2370
2434
|
[data-blume-header],
|
|
@@ -2374,7 +2438,13 @@ pre:has(.line.focused):hover .line:not(.focused) {
|
|
|
2374
2438
|
[data-blume-assistant-panel],
|
|
2375
2439
|
[data-blume-page-actions],
|
|
2376
2440
|
#blume-content > nav,
|
|
2377
|
-
#blume-content > details
|
|
2441
|
+
#blume-content > details,
|
|
2442
|
+
[data-blume-page-end],
|
|
2443
|
+
[data-blume-footer],
|
|
2444
|
+
body > footer,
|
|
2445
|
+
[data-blume-copy],
|
|
2446
|
+
[data-blume-ask],
|
|
2447
|
+
[data-blume-code-expand] {
|
|
2378
2448
|
display: none !important;
|
|
2379
2449
|
}
|
|
2380
2450
|
|
|
@@ -2385,6 +2455,23 @@ pre:has(.line.focused):hover .line:not(.focused) {
|
|
|
2385
2455
|
overflow: visible;
|
|
2386
2456
|
}
|
|
2387
2457
|
|
|
2458
|
+
/* A collapsed \`expandable\` block prints open: its toggle is hidden above,
|
|
2459
|
+
so the collapse would cut the block off at its first lines. Same
|
|
2460
|
+
selector as the collapse, so this later rule wins. */
|
|
2461
|
+
.prose pre[data-expandable]:not([data-expanded]) > code {
|
|
2462
|
+
mask-image: none;
|
|
2463
|
+
max-height: none;
|
|
2464
|
+
overflow-y: visible;
|
|
2465
|
+
}
|
|
2466
|
+
|
|
2467
|
+
/* The theme script switches a dark page to light for printing
|
|
2468
|
+
(\`beforeprint\`); a color transition would print mid-fade. */
|
|
2469
|
+
*,
|
|
2470
|
+
*::before,
|
|
2471
|
+
*::after {
|
|
2472
|
+
transition: none !important;
|
|
2473
|
+
}
|
|
2474
|
+
|
|
2388
2475
|
#blume-content {
|
|
2389
2476
|
padding: 0 !important;
|
|
2390
2477
|
}
|
|
@@ -2446,15 +2533,15 @@ ${options.userCss}
|
|
|
2446
2533
|
`;
|
|
2447
2534
|
|
|
2448
2535
|
// src/theme/sources.ts
|
|
2449
|
-
import { dirname as
|
|
2536
|
+
import { dirname as dirname6, isAbsolute as isAbsolute3, relative as relative3, resolve as resolve4 } from "pathe";
|
|
2450
2537
|
var SOURCE_DIRECTIVE = /@source(?<not>\s+not)?\s+(?<quote>["'])(?<path>[^"']+)\k<quote>/gu;
|
|
2451
2538
|
var rebaseSourceDirectives = (css, options) => {
|
|
2452
|
-
const base =
|
|
2539
|
+
const base = dirname6(options.from);
|
|
2453
2540
|
return css.replace(SOURCE_DIRECTIVE, (directive, not, quote, path) => {
|
|
2454
2541
|
if (isAbsolute3(path)) {
|
|
2455
2542
|
return directive;
|
|
2456
2543
|
}
|
|
2457
|
-
const rebased =
|
|
2544
|
+
const rebased = relative3(options.to, resolve4(base, path));
|
|
2458
2545
|
return `@source${not ?? ""} ${quote}${rebased}${quote}`;
|
|
2459
2546
|
});
|
|
2460
2547
|
};
|
|
@@ -2541,89 +2628,12 @@ var twoslashCss = () => {
|
|
|
2541
2628
|
${OVERRIDES}`;
|
|
2542
2629
|
};
|
|
2543
2630
|
|
|
2544
|
-
// src/astro/examples.ts
|
|
2545
|
-
import { readFile as readFile3 } from "node:fs/promises";
|
|
2546
|
-
import pMap from "p-map";
|
|
2547
|
-
import { isAbsolute as isAbsolute4, join as join9, relative as relative3 } from "pathe";
|
|
2548
|
-
import { glob } from "tinyglobby";
|
|
2549
|
-
var FRAMEWORK_BY_EXT = {
|
|
2550
|
-
astro: "astro",
|
|
2551
|
-
jsx: "react",
|
|
2552
|
-
svelte: "svelte",
|
|
2553
|
-
tsx: "react",
|
|
2554
|
-
vue: "vue"
|
|
2555
|
-
};
|
|
2556
|
-
var EXAMPLE_FILE = /\.(?<ext>astro|jsx|svelte|tsx|vue)$/u;
|
|
2557
|
-
var DEFAULT_EXAMPLE_GLOB = "**/*.{astro,jsx,svelte,tsx,vue}";
|
|
2558
|
-
var READ_CONCURRENCY = 16;
|
|
2559
|
-
var EXAMPLE_SCAN_GLOB = "**/*.{astro,jsx,svelte,ts,tsx,vue}";
|
|
2560
|
-
var exampleScanRoots = (root, examplesDir) => {
|
|
2561
|
-
const path = relative3(root, examplesDir);
|
|
2562
|
-
const outside = path.startsWith("..") || isAbsolute4(path);
|
|
2563
|
-
return outside ? [root, examplesDir] : [root];
|
|
2564
|
-
};
|
|
2565
|
-
var GLOB_MAGIC = /[!*?[\]{}]/u;
|
|
2566
|
-
var splitGlobBase = (pattern) => {
|
|
2567
|
-
const segments = pattern.split("/");
|
|
2568
|
-
const firstMagic = segments.findIndex((segment) => GLOB_MAGIC.test(segment));
|
|
2569
|
-
return {
|
|
2570
|
-
base: segments.slice(0, firstMagic).join("/"),
|
|
2571
|
-
rest: segments.slice(firstMagic).join("/")
|
|
2572
|
-
};
|
|
2573
|
-
};
|
|
2574
|
-
var discoverExamples = async (root, pattern = "examples") => {
|
|
2575
|
-
const { base, rest } = GLOB_MAGIC.test(pattern) ? splitGlobBase(pattern) : { base: pattern, rest: DEFAULT_EXAMPLE_GLOB };
|
|
2576
|
-
const dir = join9(root, base);
|
|
2577
|
-
const matches = await glob([rest], {
|
|
2578
|
-
absolute: true,
|
|
2579
|
-
cwd: dir,
|
|
2580
|
-
onlyFiles: true
|
|
2581
|
-
});
|
|
2582
|
-
const files = matches.toSorted();
|
|
2583
|
-
const sources = await pMap(files, (file) => readFile3(file, "utf-8"), {
|
|
2584
|
-
concurrency: READ_CONCURRENCY
|
|
2585
|
-
});
|
|
2586
|
-
const examples = [];
|
|
2587
|
-
const warnings = [];
|
|
2588
|
-
const seen = new Map;
|
|
2589
|
-
const collectExample = (file, source) => {
|
|
2590
|
-
const ext = file.match(EXAMPLE_FILE)?.groups?.ext;
|
|
2591
|
-
const framework = ext ? FRAMEWORK_BY_EXT[ext] : undefined;
|
|
2592
|
-
if (!(ext && framework)) {
|
|
2593
|
-
return;
|
|
2594
|
-
}
|
|
2595
|
-
const path = relative3(dir, file).slice(0, -(ext.length + 1));
|
|
2596
|
-
const existing = seen.get(path);
|
|
2597
|
-
if (existing) {
|
|
2598
|
-
warnings.push(`Two examples both resolve to "${path}" ("${existing}" and "${file}"); ignoring the second. Give them distinct paths.`);
|
|
2599
|
-
return;
|
|
2600
|
-
}
|
|
2601
|
-
seen.set(path, file);
|
|
2602
|
-
examples.push({
|
|
2603
|
-
client: framework === "astro" ? undefined : readClientMode(source, file, warnings),
|
|
2604
|
-
file,
|
|
2605
|
-
framework,
|
|
2606
|
-
lang: ext,
|
|
2607
|
-
path,
|
|
2608
|
-
source
|
|
2609
|
-
});
|
|
2610
|
-
};
|
|
2611
|
-
for (const [index, file] of files.entries()) {
|
|
2612
|
-
collectExample(file, sources[index] ?? "");
|
|
2613
|
-
}
|
|
2614
|
-
return { dir, examples, warnings };
|
|
2615
|
-
};
|
|
2616
|
-
var exampleMarkdownLookup = (examples) => Object.fromEntries(examples.map((example) => [
|
|
2617
|
-
example.path,
|
|
2618
|
-
{ lang: example.lang, source: example.source }
|
|
2619
|
-
]));
|
|
2620
|
-
|
|
2621
2631
|
// src/astro/render-deps.ts
|
|
2622
2632
|
import { existsSync as existsSync5, realpathSync } from "node:fs";
|
|
2623
2633
|
import {
|
|
2624
2634
|
basename,
|
|
2625
|
-
dirname as
|
|
2626
|
-
isAbsolute as
|
|
2635
|
+
dirname as dirname7,
|
|
2636
|
+
isAbsolute as isAbsolute4,
|
|
2627
2637
|
join as join10,
|
|
2628
2638
|
normalize,
|
|
2629
2639
|
relative as relative4,
|
|
@@ -2631,7 +2641,7 @@ import {
|
|
|
2631
2641
|
} from "pathe";
|
|
2632
2642
|
var depsCandidates = (pkgDir) => [
|
|
2633
2643
|
join10(pkgDir, "node_modules"),
|
|
2634
|
-
|
|
2644
|
+
dirname7(pkgDir)
|
|
2635
2645
|
];
|
|
2636
2646
|
var candidateHolding = (pkgDir, ...segments) => depsCandidates(pkgDir).find((dir) => existsSync5(join10(dir, ...segments))) ?? null;
|
|
2637
2647
|
var packageDirFrom = (name, fromDir) => {
|
|
@@ -2641,7 +2651,7 @@ var packageDirFrom = (name, fromDir) => {
|
|
|
2641
2651
|
if (existsSync5(join10(candidate, "package.json"))) {
|
|
2642
2652
|
return normalize(realpathSync(candidate));
|
|
2643
2653
|
}
|
|
2644
|
-
const parent =
|
|
2654
|
+
const parent = dirname7(dir);
|
|
2645
2655
|
if (parent === dir) {
|
|
2646
2656
|
return null;
|
|
2647
2657
|
}
|
|
@@ -2653,16 +2663,19 @@ var packageDirFrom = (name, fromDir) => {
|
|
|
2653
2663
|
var BLUME_SRC = join11(packageRoot(), "src");
|
|
2654
2664
|
var resolveReactCompiler = (config, needsReact, pkgDir = packageRoot()) => {
|
|
2655
2665
|
if (!(needsReact && config.react.compiler)) {
|
|
2656
|
-
return
|
|
2666
|
+
return false;
|
|
2657
2667
|
}
|
|
2658
2668
|
try {
|
|
2659
|
-
|
|
2669
|
+
const astroReact = createRequire2(pathToFileURL(join11(pkgDir, "_.js")).href).resolve("@astrojs/react");
|
|
2670
|
+
const pluginReact = createRequire2(astroReact).resolve("@vitejs/plugin-react");
|
|
2671
|
+
createRequire2(pluginReact).resolve("oxc-transform-react");
|
|
2672
|
+
return true;
|
|
2660
2673
|
} catch {
|
|
2661
|
-
return
|
|
2674
|
+
return false;
|
|
2662
2675
|
}
|
|
2663
2676
|
};
|
|
2664
|
-
var reactCompilerWarnings = (config, needsReact,
|
|
2665
|
-
"React Compiler is enabled but `
|
|
2677
|
+
var reactCompilerWarnings = (config, needsReact, compiler) => needsReact && config.react.compiler && !compiler ? [
|
|
2678
|
+
"React Compiler is enabled but `oxc-transform-react` could not be resolved; falling back to an uncompiled build. Reinstall Blume, or set `react: { compiler: false }` to silence this."
|
|
2666
2679
|
] : [];
|
|
2667
2680
|
var resolveAstroPackageJson = (modulesDir) => {
|
|
2668
2681
|
try {
|
|
@@ -2679,7 +2692,7 @@ var resolvedAstroHit = (fromDir) => {
|
|
|
2679
2692
|
if (pkg) {
|
|
2680
2693
|
return { modulesDir, pkg };
|
|
2681
2694
|
}
|
|
2682
|
-
const parent =
|
|
2695
|
+
const parent = dirname8(dir);
|
|
2683
2696
|
if (parent === dir) {
|
|
2684
2697
|
return null;
|
|
2685
2698
|
}
|
|
@@ -2712,13 +2725,13 @@ var linkDepsJunction = async (link, depsDir) => {
|
|
|
2712
2725
|
return;
|
|
2713
2726
|
}
|
|
2714
2727
|
try {
|
|
2715
|
-
if (resolve6(
|
|
2728
|
+
if (resolve6(dirname8(link), await readlink(link)) === resolve6(depsDir)) {
|
|
2716
2729
|
return;
|
|
2717
2730
|
}
|
|
2718
2731
|
} catch {}
|
|
2719
2732
|
await rm2(link, { force: true });
|
|
2720
2733
|
}
|
|
2721
|
-
await mkdir2(
|
|
2734
|
+
await mkdir2(dirname8(link), { recursive: true });
|
|
2722
2735
|
await symlinkDir(depsDir, link);
|
|
2723
2736
|
};
|
|
2724
2737
|
var readPkgVersion = (pkgJsonPath) => {
|
|
@@ -2796,7 +2809,7 @@ var readOptional = async (path) => {
|
|
|
2796
2809
|
return "";
|
|
2797
2810
|
}
|
|
2798
2811
|
try {
|
|
2799
|
-
return await
|
|
2812
|
+
return await readFile3(path, "utf-8");
|
|
2800
2813
|
} catch {
|
|
2801
2814
|
return "";
|
|
2802
2815
|
}
|
|
@@ -2806,7 +2819,7 @@ var readUserCss = async (file, outputDir) => {
|
|
|
2806
2819
|
return file ? rebaseSourceDirectives(css, { from: file, to: outputDir }) : css;
|
|
2807
2820
|
};
|
|
2808
2821
|
var detectNeedsReact = async (root) => {
|
|
2809
|
-
const matches = await
|
|
2822
|
+
const matches = await glob(["**/*.{tsx,jsx}"], {
|
|
2810
2823
|
cwd: root,
|
|
2811
2824
|
ignore: ["**/node_modules/**", "**/.blume/**", "**/dist/**"],
|
|
2812
2825
|
onlyFiles: true
|
|
@@ -2814,15 +2827,15 @@ var detectNeedsReact = async (root) => {
|
|
|
2814
2827
|
return matches.length > 0;
|
|
2815
2828
|
};
|
|
2816
2829
|
var containsMath = (content) => content.includes("$$") || content.includes("<Math");
|
|
2817
|
-
var
|
|
2830
|
+
var READ_CONCURRENCY = 16;
|
|
2818
2831
|
var detectUsesMath = async (root, staged = []) => {
|
|
2819
|
-
const files = await
|
|
2832
|
+
const files = await glob(["**/*.{md,mdx}"], {
|
|
2820
2833
|
cwd: root,
|
|
2821
2834
|
ignore: ["**/node_modules/**", "**/.blume/**", "**/dist/**"],
|
|
2822
2835
|
onlyFiles: true
|
|
2823
2836
|
});
|
|
2824
|
-
const contents = await
|
|
2825
|
-
concurrency:
|
|
2837
|
+
const contents = await pMap(files, (file) => readOptional(join11(root, file)), {
|
|
2838
|
+
concurrency: READ_CONCURRENCY
|
|
2826
2839
|
});
|
|
2827
2840
|
return [...contents, ...staged].some(containsMath);
|
|
2828
2841
|
};
|
|
@@ -2839,7 +2852,7 @@ var loadIntegrationBridge = async (config, context) => {
|
|
|
2839
2852
|
var writeIfChanged = async (path, content) => {
|
|
2840
2853
|
let existing = null;
|
|
2841
2854
|
try {
|
|
2842
|
-
existing = await
|
|
2855
|
+
existing = await readFile3(path, "utf-8");
|
|
2843
2856
|
} catch {
|
|
2844
2857
|
existing = null;
|
|
2845
2858
|
}
|
|
@@ -2850,7 +2863,7 @@ var writeIfChanged = async (path, content) => {
|
|
|
2850
2863
|
return true;
|
|
2851
2864
|
};
|
|
2852
2865
|
var pruneOrphans = async (srcDir, written) => {
|
|
2853
|
-
const existing = await
|
|
2866
|
+
const existing = await glob("**/*", {
|
|
2854
2867
|
absolute: true,
|
|
2855
2868
|
cwd: srcDir,
|
|
2856
2869
|
onlyFiles: true
|
|
@@ -2904,7 +2917,7 @@ var readLogoSvg = (project, source) => {
|
|
|
2904
2917
|
return file ? readFileSync3(file, "utf-8") : undefined;
|
|
2905
2918
|
};
|
|
2906
2919
|
var isStringShorthand = (value) => typeof value === "string";
|
|
2907
|
-
var
|
|
2920
|
+
var footerRepoUrl = (repo, derived) => {
|
|
2908
2921
|
if (isStringShorthand(repo)) {
|
|
2909
2922
|
return repo;
|
|
2910
2923
|
}
|
|
@@ -3019,10 +3032,31 @@ var resolveBanner = (config) => {
|
|
|
3019
3032
|
return {
|
|
3020
3033
|
content: banner.content,
|
|
3021
3034
|
dismissible: banner.dismissible,
|
|
3022
|
-
key: banner.id ?? banner.content,
|
|
3035
|
+
key: banner.id ?? resolveLocalizable(banner.content, undefined, config.i18n?.defaultLocale),
|
|
3023
3036
|
link: banner.link
|
|
3024
3037
|
};
|
|
3025
3038
|
};
|
|
3039
|
+
var playgroundProxyPattern = (config) => withBasePath(config.basePath, "/_api-proxy");
|
|
3040
|
+
var resolveApiPages = (config) => {
|
|
3041
|
+
const { auth, playground, server } = config.api;
|
|
3042
|
+
const resolved = {
|
|
3043
|
+
playground: {
|
|
3044
|
+
enabled: playground.enabled,
|
|
3045
|
+
proxy: playground.proxy === true ? playgroundProxyPattern(config) : playground.proxy
|
|
3046
|
+
}
|
|
3047
|
+
};
|
|
3048
|
+
if (auth) {
|
|
3049
|
+
resolved.auth = auth;
|
|
3050
|
+
}
|
|
3051
|
+
if (server) {
|
|
3052
|
+
resolved.server = server;
|
|
3053
|
+
}
|
|
3054
|
+
return resolved;
|
|
3055
|
+
};
|
|
3056
|
+
var resolveFooter = (config) => {
|
|
3057
|
+
const { footer } = config;
|
|
3058
|
+
return footer && (footer.links.length > 0 || Object.keys(footer.socials).length > 0) ? footer : null;
|
|
3059
|
+
};
|
|
3026
3060
|
var resolveOgMark = (project, siteLogo) => {
|
|
3027
3061
|
const configured = project.config.seo.og.logo;
|
|
3028
3062
|
if (configured === false) {
|
|
@@ -3056,6 +3090,18 @@ var resolveGithubData = (github) => github ? {
|
|
|
3056
3090
|
owner: github.owner,
|
|
3057
3091
|
repo: github.repo
|
|
3058
3092
|
} : null;
|
|
3093
|
+
var resolveAssistant = (config) => {
|
|
3094
|
+
const { assistant } = config.ai;
|
|
3095
|
+
if (!assistant?.enabled) {
|
|
3096
|
+
return null;
|
|
3097
|
+
}
|
|
3098
|
+
return {
|
|
3099
|
+
captcha: assistant.captcha ? captchaSettings(assistant.captcha) : null,
|
|
3100
|
+
endpoint: assistant.endpoint ?? null,
|
|
3101
|
+
suggestions: assistant.suggestions,
|
|
3102
|
+
support: assistant.support ?? null
|
|
3103
|
+
};
|
|
3104
|
+
};
|
|
3059
3105
|
var buildRuntimeData = (project) => {
|
|
3060
3106
|
const { config, context, graph, manifest } = project;
|
|
3061
3107
|
const { github } = config;
|
|
@@ -3070,28 +3116,28 @@ var buildRuntimeData = (project) => {
|
|
|
3070
3116
|
const rel = relative5(context.root, sourcePath).split("\\").join("/");
|
|
3071
3117
|
const editDir = trimChar(github?.dir ?? "", "/");
|
|
3072
3118
|
const editPath = normalize2(editDir ? join11(editDir, rel) : rel);
|
|
3073
|
-
if (editPath.startsWith("..") ||
|
|
3119
|
+
if (editPath.startsWith("..") || isAbsolute5(editPath)) {
|
|
3074
3120
|
return null;
|
|
3075
3121
|
}
|
|
3076
3122
|
return `${editBase}/${editPath}`;
|
|
3077
3123
|
};
|
|
3078
3124
|
const { i18n } = config;
|
|
3079
|
-
const markUrl =
|
|
3125
|
+
const markUrl = footerRepoUrl(config.navigation.repo, repoUrl2);
|
|
3080
3126
|
const withRepoUrl = (nav) => ({
|
|
3081
3127
|
...nav,
|
|
3082
3128
|
repoUrl: markUrl
|
|
3083
3129
|
});
|
|
3084
3130
|
const uiByLocale = i18n ? Object.fromEntries(i18n.locales.map(({ code }) => [
|
|
3085
3131
|
code,
|
|
3086
|
-
resolveUIStrings(code, {
|
|
3132
|
+
withChangelogIndexText(config, resolveUIStrings(code, {
|
|
3087
3133
|
defaultLocale: i18n.defaultLocale,
|
|
3088
3134
|
overrides: i18n.ui
|
|
3089
|
-
})
|
|
3135
|
+
}), code)
|
|
3090
3136
|
])) : {};
|
|
3091
|
-
const defaultUi = i18n ? resolveUIStrings(i18n.defaultLocale, {
|
|
3137
|
+
const defaultUi = withChangelogIndexText(config, i18n ? resolveUIStrings(i18n.defaultLocale, {
|
|
3092
3138
|
defaultLocale: i18n.defaultLocale,
|
|
3093
3139
|
overrides: i18n.ui
|
|
3094
|
-
}) : EN_UI;
|
|
3140
|
+
}) : EN_UI, i18n?.defaultLocale);
|
|
3095
3141
|
const navigationByLocale = i18n ? Object.fromEntries(i18n.locales.map(({ code }) => [
|
|
3096
3142
|
code,
|
|
3097
3143
|
withRepoUrl(graph.navigationByLocale[code] ?? {
|
|
@@ -3106,15 +3152,14 @@ var buildRuntimeData = (project) => {
|
|
|
3106
3152
|
const data = {
|
|
3107
3153
|
config: {
|
|
3108
3154
|
analytics: config.analytics,
|
|
3155
|
+
api: resolveApiPages(config),
|
|
3109
3156
|
appleIcon: resolveAppleIcon(project),
|
|
3110
|
-
assistant: config
|
|
3111
|
-
endpoint: config.ai.assistant.endpoint ?? null,
|
|
3112
|
-
suggestions: config.ai.assistant.suggestions
|
|
3113
|
-
} : null,
|
|
3157
|
+
assistant: resolveAssistant(config),
|
|
3114
3158
|
banner: resolveBanner(config),
|
|
3115
3159
|
basePath: config.basePath,
|
|
3116
3160
|
codeThemes: config.markdown.code.theme,
|
|
3117
3161
|
codeWrap: config.markdown.code.wrap,
|
|
3162
|
+
consent: config.consent,
|
|
3118
3163
|
dateFormat: config.dateFormat,
|
|
3119
3164
|
description: config.description,
|
|
3120
3165
|
discovery: {
|
|
@@ -3125,7 +3170,9 @@ var buildRuntimeData = (project) => {
|
|
|
3125
3170
|
sitemap: config.seo.sitemap && Boolean(config.deployment.options.site)
|
|
3126
3171
|
},
|
|
3127
3172
|
favicon: resolveFavicon(project),
|
|
3128
|
-
feedback: config.feedback,
|
|
3173
|
+
feedback: config.feedback.enabled,
|
|
3174
|
+
feedbackComments: config.feedback.comments,
|
|
3175
|
+
footer: resolveFooter(config),
|
|
3129
3176
|
github: resolveGithubData(github),
|
|
3130
3177
|
i18n: i18n ? {
|
|
3131
3178
|
defaultLocale: i18n.defaultLocale,
|
|
@@ -3135,7 +3182,8 @@ var buildRuntimeData = (project) => {
|
|
|
3135
3182
|
code,
|
|
3136
3183
|
dir,
|
|
3137
3184
|
label
|
|
3138
|
-
}))
|
|
3185
|
+
})),
|
|
3186
|
+
routeByBrowserLanguage: i18n.routeByBrowserLanguage
|
|
3139
3187
|
} : null,
|
|
3140
3188
|
identity: config.seo.organization || config.seo.software ? {
|
|
3141
3189
|
organization: config.seo.organization,
|
|
@@ -3147,6 +3195,8 @@ var buildRuntimeData = (project) => {
|
|
|
3147
3195
|
name: config.agents.mcp.name ?? config.title,
|
|
3148
3196
|
route: config.agents.mcp.route
|
|
3149
3197
|
} : null,
|
|
3198
|
+
metatags: config.seo.metatags ?? null,
|
|
3199
|
+
narration: config.narration.enabled ? { generated: config.narration.provider !== null } : null,
|
|
3150
3200
|
og: {
|
|
3151
3201
|
description: resolveOgDescription(config),
|
|
3152
3202
|
enabled: config.seo.og.enabled ?? false,
|
|
@@ -3157,6 +3207,7 @@ var buildRuntimeData = (project) => {
|
|
|
3157
3207
|
openInChat: config.ai.openInChat,
|
|
3158
3208
|
repoUrl: repoUrl2,
|
|
3159
3209
|
search: {
|
|
3210
|
+
analytics: config.search.analytics,
|
|
3160
3211
|
enabled: config.search.provider.mode !== "none",
|
|
3161
3212
|
popular: resolveSearchPopular(config.search.popular, config.basePath),
|
|
3162
3213
|
provider: config.search.provider.kind
|
|
@@ -3322,7 +3373,6 @@ var writeApiFiles = async (project, plan, write, data, mcp) => {
|
|
|
3322
3373
|
await Promise.all(writes);
|
|
3323
3374
|
};
|
|
3324
3375
|
var PLAYGROUND_PROXY_ENTRY = join11("blume-openapi", "api-proxy.ts");
|
|
3325
|
-
var playgroundProxyPattern = (config) => withBasePath(config.basePath, "/_api-proxy");
|
|
3326
3376
|
var planPlaygroundProxy = (config, srcDir) => ({
|
|
3327
3377
|
enabled: needsPlaygroundProxy(config),
|
|
3328
3378
|
entrypoint: join11(srcDir, PLAYGROUND_PROXY_ENTRY),
|
|
@@ -3357,6 +3407,27 @@ var specOriginsOf = (spec) => {
|
|
|
3357
3407
|
return [...origins];
|
|
3358
3408
|
};
|
|
3359
3409
|
var specOrigins = (data) => [...new Set(Object.values(data).flatMap(specOriginsOf))].toSorted();
|
|
3410
|
+
var originOf = (url) => {
|
|
3411
|
+
try {
|
|
3412
|
+
return new URL(url).origin;
|
|
3413
|
+
} catch {
|
|
3414
|
+
return null;
|
|
3415
|
+
}
|
|
3416
|
+
};
|
|
3417
|
+
var apiPageOrigins = (project) => {
|
|
3418
|
+
const { config } = project;
|
|
3419
|
+
if (!apiPagesUseBuiltinProxy(config)) {
|
|
3420
|
+
return [];
|
|
3421
|
+
}
|
|
3422
|
+
const targets = project.graph.pages.map((page) => parseApiEndpoint(page.meta.api ?? "")?.target ?? "");
|
|
3423
|
+
return [config.api.server ?? "", ...targets].flatMap((target) => {
|
|
3424
|
+
const origin = originOf(target);
|
|
3425
|
+
return origin ? [origin] : [];
|
|
3426
|
+
});
|
|
3427
|
+
};
|
|
3428
|
+
var apiPageProxyWarnings = (project) => apiPagesUseBuiltinProxy(project.config) && apiPageOrigins(project).length === 0 ? [
|
|
3429
|
+
"api.playground.proxy is true, but api.server isn't an absolute URL and no page's api frontmatter names one, so the built-in proxy has no origin to allow and will refuse every request the endpoint pages send. Set api.server to the API's URL, like https://api.acme.com/v1."
|
|
3430
|
+
] : [];
|
|
3360
3431
|
var proxyAllowlistWarnings = (config, data) => {
|
|
3361
3432
|
const proxied = new Set(builtinProxyReferences(config).map((reference) => reference.slug));
|
|
3362
3433
|
const warnings = [];
|
|
@@ -3378,9 +3449,12 @@ var writeAskFiles = async (project, srcDir, write, modules) => {
|
|
|
3378
3449
|
modules.set("blume:ask-data", JSON.stringify(await buildAskData(project)));
|
|
3379
3450
|
}
|
|
3380
3451
|
await write(join11(srcDir, "pages", "api", "ask.ts"), askEndpointTemplate(backend, {
|
|
3452
|
+
captcha: assistant.captcha,
|
|
3381
3453
|
cors: assistant.cors,
|
|
3382
3454
|
instructions: assistant.instructions,
|
|
3383
|
-
|
|
3455
|
+
rateLimit: project.config.rateLimit,
|
|
3456
|
+
retrieval: assistant.retrieval,
|
|
3457
|
+
tools: assistant.tools ?? backend.toolsByDefault
|
|
3384
3458
|
}));
|
|
3385
3459
|
};
|
|
3386
3460
|
var writeNotFoundPage = async (write, srcDir, pages, contentPages) => {
|
|
@@ -3405,7 +3479,7 @@ var dependencyPreflight = async (project, frameworks) => {
|
|
|
3405
3479
|
}
|
|
3406
3480
|
return [diagnosticWarning(diagnostic)];
|
|
3407
3481
|
};
|
|
3408
|
-
var analyzeComponentsFile = async (componentsFile) => componentsFile ? analyzeComponentOverrides(await
|
|
3482
|
+
var analyzeComponentsFile = async (componentsFile) => componentsFile ? analyzeComponentOverrides(await readFile3(componentsFile, "utf-8"), componentsFile) : emptyComponentOverrides();
|
|
3409
3483
|
var projectOgFonts = (project) => resolveOgFonts({
|
|
3410
3484
|
locales: fontLocaleCodes(project.config.i18n),
|
|
3411
3485
|
ogFonts: project.config.seo.og.fonts,
|
|
@@ -3444,6 +3518,7 @@ var generateRuntime = async (project) => {
|
|
|
3444
3518
|
const askPath = join11(srcDir, "generated", "Ask.astro");
|
|
3445
3519
|
const themePath = join11(srcDir, "generated", "app.css");
|
|
3446
3520
|
const searchClientPath = join11(srcDir, "generated", "search-client.ts");
|
|
3521
|
+
const consentClientPath = join11(srcDir, "generated", "consent-client.ts");
|
|
3447
3522
|
const featuresPath = join11(srcDir, "generated", "features.ts");
|
|
3448
3523
|
const examplesPath = join11(srcDir, "generated", "examples.ts");
|
|
3449
3524
|
const examplesThemePath = join11(srcDir, "generated", "examples.css");
|
|
@@ -3497,7 +3572,7 @@ var generateRuntime = async (project) => {
|
|
|
3497
3572
|
const needsReact = detectedReact || assistantEnabled || frameworks.has("react");
|
|
3498
3573
|
const needsVue = frameworks.has("vue");
|
|
3499
3574
|
const needsSvelte = frameworks.has("svelte");
|
|
3500
|
-
const
|
|
3575
|
+
const reactCompiler = resolveReactCompiler(config, needsReact);
|
|
3501
3576
|
const ogRoutes = customOgRoutes(pages, config.title, config.seo.og.titles);
|
|
3502
3577
|
const changelogIndex = hasGeneratedChangelog(project, pages);
|
|
3503
3578
|
const mcp = planMcp(project, srcDir, pages);
|
|
@@ -3513,7 +3588,9 @@ var generateRuntime = async (project) => {
|
|
|
3513
3588
|
pattern: playgroundProxy.pattern
|
|
3514
3589
|
});
|
|
3515
3590
|
}
|
|
3516
|
-
const proxyOrigins =
|
|
3591
|
+
const proxyOrigins = [
|
|
3592
|
+
...new Set([...specOrigins(openApiData), ...apiPageOrigins(project)])
|
|
3593
|
+
].toSorted();
|
|
3517
3594
|
const hasStaged = staged.size > 0;
|
|
3518
3595
|
const hasFilesystemSource = project.sources.some((source) => !source.staged);
|
|
3519
3596
|
const docsCollection = resolveDocsCollection(config, context.root);
|
|
@@ -3523,6 +3600,7 @@ var generateRuntime = async (project) => {
|
|
|
3523
3600
|
aliases: resolveTsconfigAliases(context.root),
|
|
3524
3601
|
askPath,
|
|
3525
3602
|
config,
|
|
3603
|
+
consentClientPath,
|
|
3526
3604
|
contentRoot: docsCollection.base,
|
|
3527
3605
|
contentRoutes,
|
|
3528
3606
|
context,
|
|
@@ -3535,7 +3613,7 @@ var generateRuntime = async (project) => {
|
|
|
3535
3613
|
needsSvelte,
|
|
3536
3614
|
needsVue,
|
|
3537
3615
|
pages,
|
|
3538
|
-
|
|
3616
|
+
reactCompiler,
|
|
3539
3617
|
searchClientPath,
|
|
3540
3618
|
themePath
|
|
3541
3619
|
})),
|
|
@@ -3569,7 +3647,7 @@ var generateRuntime = async (project) => {
|
|
|
3569
3647
|
languageIcons,
|
|
3570
3648
|
sources: [
|
|
3571
3649
|
`${BLUME_SRC}/**/*.{astro,ts,tsx}`,
|
|
3572
|
-
`${context.root}/**/*.{astro,mdx,ts,tsx}`
|
|
3650
|
+
`${context.root}/**/*.{astro,jsx,mdx,ts,tsx}`
|
|
3573
3651
|
],
|
|
3574
3652
|
twoslashCss: twoslashCss(),
|
|
3575
3653
|
userTheme
|
|
@@ -3580,7 +3658,7 @@ var generateRuntime = async (project) => {
|
|
|
3580
3658
|
writeAskFiles(project, srcDir, write, modules),
|
|
3581
3659
|
writeMcpFiles(mcp, write, agentData),
|
|
3582
3660
|
writeApiFiles(project, api, write, agentData, mcp),
|
|
3583
|
-
playgroundProxy.enabled ? write(playgroundProxy.entrypoint, playgroundProxyTemplate(proxyOrigins)) : Promise.resolve(false)
|
|
3661
|
+
playgroundProxy.enabled ? write(playgroundProxy.entrypoint, playgroundProxyTemplate(proxyOrigins, config.rateLimit)) : Promise.resolve(false)
|
|
3584
3662
|
]);
|
|
3585
3663
|
if (config.seo.og.enabled) {
|
|
3586
3664
|
await write(join11(srcDir, "pages", "og", "[...slug].png.ts"), ogEndpointTemplate(ogRoutes, {
|
|
@@ -3610,6 +3688,7 @@ var generateRuntime = async (project) => {
|
|
|
3610
3688
|
}),
|
|
3611
3689
|
writeNotFoundPage(write, srcDir, pages, project.graph.pages),
|
|
3612
3690
|
write(searchClientPath, searchClientTemplate(config)),
|
|
3691
|
+
write(consentClientPath, consentClientTemplate(config.consent)),
|
|
3613
3692
|
write(featuresPath, featuresTemplate(clientFeatures))
|
|
3614
3693
|
]);
|
|
3615
3694
|
const searchAdapter = config.search.provider;
|
|
@@ -3619,7 +3698,7 @@ var generateRuntime = async (project) => {
|
|
|
3619
3698
|
await write(join11(srcDir, "pages", "blume-search.json.ts"), searchEndpointTemplate());
|
|
3620
3699
|
}
|
|
3621
3700
|
if (searchAdapter.kind === "mixedbread") {
|
|
3622
|
-
await write(join11(srcDir, "pages", "api", "search.ts"), mixedbreadSearchEndpointTemplate(searchAdapter.options));
|
|
3701
|
+
await write(join11(srcDir, "pages", "api", "search.ts"), mixedbreadSearchEndpointTemplate(searchAdapter.options, sourcePages(project), config.rateLimit));
|
|
3623
3702
|
}
|
|
3624
3703
|
await write(join11(srcDir, "generated", "includes.json"), `${JSON.stringify(buildIncludeGraph(project.graph.pages))}
|
|
3625
3704
|
`);
|
|
@@ -3640,30 +3719,23 @@ var generateRuntime = async (project) => {
|
|
|
3640
3719
|
const warnings = [
|
|
3641
3720
|
...depsLinkWarning ? [depsLinkWarning] : [],
|
|
3642
3721
|
...proxyAllowlistWarnings(config, openApiData),
|
|
3643
|
-
...
|
|
3722
|
+
...apiPageProxyWarnings(project),
|
|
3723
|
+
...reactCompilerWarnings(config, needsReact, reactCompiler),
|
|
3644
3724
|
...mcp.warnings,
|
|
3645
3725
|
...islandDiscovery.warnings,
|
|
3646
3726
|
...exampleDiscovery.warnings,
|
|
3647
3727
|
...examplesWarnings,
|
|
3648
3728
|
...overrideWarnings
|
|
3649
3729
|
];
|
|
3650
|
-
const navTargetRoutes = new Set([
|
|
3651
|
-
...project.graph.routes.keys(),
|
|
3652
|
-
...pages.map((page) => page.pattern),
|
|
3653
|
-
...referenceRoutes(config)
|
|
3654
|
-
]);
|
|
3655
|
-
if (changelogIndex) {
|
|
3656
|
-
navTargetRoutes.add("/changelog");
|
|
3657
|
-
}
|
|
3658
3730
|
warnings.push(...[
|
|
3659
|
-
...validateNavTargets(project.graph.navigation, navTargetRoutes),
|
|
3731
|
+
...validateNavTargets(project.graph.navigation, navTargetRoutes(project, pages)),
|
|
3660
3732
|
...validateSearchPopularIcons(config.search.popular)
|
|
3661
3733
|
].map(diagnosticWarning));
|
|
3662
3734
|
const knownComponentTags = new Set([
|
|
3663
3735
|
...islandDiscovery.islands.map((island) => island.name),
|
|
3664
3736
|
...overrideAnalysis.mdx.map((entry) => entry.key)
|
|
3665
3737
|
]);
|
|
3666
|
-
warnings.push(...validateUsedComponents(project.graph.pages, knownComponentTags, new Set(registry.map((item) => item.name))).map(diagnosticWarning), ...dependencyWarnings);
|
|
3738
|
+
warnings.push(...validateUsedComponents(project.graph.pages, knownComponentTags, new Set(registry.map((item) => item.name))).map(diagnosticWarning), ...missingExampleDiagnostics(project.graph.pages, exampleDiscovery, context.root, knownComponentTags).map(diagnosticWarning), ...dependencyWarnings);
|
|
3667
3739
|
if (hasScalarReferences(config)) {
|
|
3668
3740
|
const references = await buildReferenceFiles({
|
|
3669
3741
|
config,
|
|
@@ -3686,7 +3758,7 @@ var generateRuntime = async (project) => {
|
|
|
3686
3758
|
return { structuralChange: structural.some(Boolean), warnings };
|
|
3687
3759
|
};
|
|
3688
3760
|
|
|
3689
|
-
export { publishBuildProject, refreshBlumeContent, showBlumeErrorOverlay, ogCacheDir, pruneCardCache, cardCacheTally, buildApiSpec, buildAskData, resolveOgFonts,
|
|
3761
|
+
export { publishBuildProject, refreshBlumeContent, showBlumeErrorOverlay, ogCacheDir, pruneCardCache, cardCacheTally, buildApiSpec, buildAskData, resolveOgFonts, buildReferenceFiles, sourcePages, tailwindEntryTemplate, examplesEntryTemplate, rebaseSourceDirectives, twoslashCss, packageDirFrom, detectNeedsReact, detectUsesMath, collectStaged, playgroundProxyPattern, buildRuntimeData, PLAYGROUND_PROXY_ENTRY, specOrigins, proxyAllowlistWarnings, analyzeComponentsFile, languageIconCssFor, clientFeaturesFor, generateRuntime };
|
|
3690
3762
|
|
|
3691
|
-
//# debugId=
|
|
3692
|
-
//# sourceMappingURL=chunk-
|
|
3763
|
+
//# debugId=06510295E6F5A8F264756E2164756E21
|
|
3764
|
+
//# sourceMappingURL=chunk-ep6nd0rn.js.map
|