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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page layout modes (`mode` frontmatter), Mintlify's names for what a page
|
|
3
|
+
* shows around its content:
|
|
4
|
+
*
|
|
5
|
+
* - `default`: the sidebar, the page's title and table of contents, and the
|
|
6
|
+
* page-end links, around the prose column.
|
|
7
|
+
* - `wide`: no table of contents; the content takes its width.
|
|
8
|
+
* - `center`: no sidebar or table of contents; a wider column, centered.
|
|
9
|
+
* For changelogs and other pages read top to bottom.
|
|
10
|
+
* - `custom`: only the header. No sidebar, title, breadcrumbs, table of
|
|
11
|
+
* contents, page-end links, or site footer, and the content spans the
|
|
12
|
+
* page, for a landing page written in MDX.
|
|
13
|
+
* - `frame`: `custom`, keeping the sidebar.
|
|
14
|
+
*
|
|
15
|
+
* Mintlify's `assistant` mode, a full-page chat, has no equivalent.
|
|
16
|
+
*/
|
|
17
|
+
export const PAGE_MODES = [
|
|
18
|
+
"default",
|
|
19
|
+
"wide",
|
|
20
|
+
"center",
|
|
21
|
+
"custom",
|
|
22
|
+
"frame",
|
|
23
|
+
] as const;
|
|
24
|
+
|
|
25
|
+
export type PageMode = (typeof PAGE_MODES)[number];
|
|
26
|
+
|
|
27
|
+
/** What a page shows around its content, and how wide the content runs. */
|
|
28
|
+
export interface PageModeLayout {
|
|
29
|
+
/** The page's own chrome: title, description, breadcrumbs, page-end links, and the site footer. */
|
|
30
|
+
chrome: boolean;
|
|
31
|
+
sidebar: boolean;
|
|
32
|
+
toc: boolean;
|
|
33
|
+
/** `content` is the prose measure, `center` a wider centered column, `full` the whole column. */
|
|
34
|
+
width: "content" | "center" | "full";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The layout a mode gives a page. */
|
|
38
|
+
export const pageModeLayout = (mode: PageMode = "default"): PageModeLayout => {
|
|
39
|
+
switch (mode) {
|
|
40
|
+
case "wide": {
|
|
41
|
+
return { chrome: true, sidebar: true, toc: false, width: "full" };
|
|
42
|
+
}
|
|
43
|
+
case "center": {
|
|
44
|
+
return { chrome: true, sidebar: false, toc: false, width: "center" };
|
|
45
|
+
}
|
|
46
|
+
case "custom": {
|
|
47
|
+
return { chrome: false, sidebar: false, toc: false, width: "full" };
|
|
48
|
+
}
|
|
49
|
+
case "frame": {
|
|
50
|
+
return { chrome: false, sidebar: true, toc: false, width: "full" };
|
|
51
|
+
}
|
|
52
|
+
default: {
|
|
53
|
+
return { chrome: true, sidebar: true, toc: true, width: "content" };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
package/src/core/probe.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface ProbeResult {
|
|
|
16
16
|
status?: number;
|
|
17
17
|
timedOut?: boolean;
|
|
18
18
|
error?: string;
|
|
19
|
+
/** The system error code behind a request that got no response (`ENOTFOUND`). */
|
|
20
|
+
code?: string;
|
|
19
21
|
/** Whether the request was redirected before landing on `status`. */
|
|
20
22
|
redirected?: boolean;
|
|
21
23
|
/** The URL finally landed on, after following redirects. */
|
|
@@ -28,6 +30,18 @@ export interface ProbeResult {
|
|
|
28
30
|
robotsTag?: string | null;
|
|
29
31
|
}
|
|
30
32
|
|
|
33
|
+
/**
|
|
34
|
+
* The reason a request got no response. Node's fetch rejects with a bare
|
|
35
|
+
* "fetch failed" and puts the system error (`getaddrinfo ENOTFOUND …`, with
|
|
36
|
+
* its `code`) on `cause`; Bun's rejects with the system error itself.
|
|
37
|
+
*/
|
|
38
|
+
const failure = (error: Error): Pick<ProbeResult, "code" | "error"> => {
|
|
39
|
+
const reason = error.cause instanceof Error ? error.cause : error;
|
|
40
|
+
return "code" in reason
|
|
41
|
+
? { code: String(reason.code), error: reason.message }
|
|
42
|
+
: { error: reason.message };
|
|
43
|
+
};
|
|
44
|
+
|
|
31
45
|
/** Probe a URL with the given method, normalizing failures to a result. */
|
|
32
46
|
const request = async (
|
|
33
47
|
url: string,
|
|
@@ -56,10 +70,9 @@ const request = async (
|
|
|
56
70
|
if (error instanceof Error && error.name === "AbortError") {
|
|
57
71
|
return { ok: false, timedOut: true };
|
|
58
72
|
}
|
|
59
|
-
|
|
60
|
-
error
|
|
61
|
-
|
|
62
|
-
};
|
|
73
|
+
const reason =
|
|
74
|
+
error instanceof Error ? failure(error) : { error: String(error) };
|
|
75
|
+
return { ...reason, ok: false };
|
|
63
76
|
} finally {
|
|
64
77
|
clearTimeout(timer);
|
|
65
78
|
}
|
|
@@ -95,10 +108,17 @@ export const gradeExternal = (
|
|
|
95
108
|
if (result.timedOut) {
|
|
96
109
|
return { detail: "request timed out", severity: "warning" };
|
|
97
110
|
}
|
|
111
|
+
// No response at all. A host name that doesn't resolve is as dead as a 404;
|
|
112
|
+
// a refused, reset, or failed connection is more often someone else's outage
|
|
113
|
+
// or the runner's own network, so it's graded like a timeout.
|
|
98
114
|
if (result.status === undefined) {
|
|
99
|
-
return {
|
|
115
|
+
return {
|
|
116
|
+
detail: result.error ?? "unreachable",
|
|
117
|
+
severity: result.code === "ENOTFOUND" ? "error" : "warning",
|
|
118
|
+
};
|
|
100
119
|
}
|
|
101
|
-
// A 404/410 is definitively dead.
|
|
120
|
+
// A 404/410 is definitively dead. Any other status — a 401/403 from a site
|
|
121
|
+
// that turns bots away, a 429, a 5xx — may well be rate limiting or a
|
|
102
122
|
// transient blip, which is not the author's bug to fix.
|
|
103
123
|
if (result.status === STATUS_NOT_FOUND || result.status === STATUS_GONE) {
|
|
104
124
|
return { detail: `HTTP ${result.status}`, severity: "error" };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isAbsolute, relative } from "pathe";
|
|
2
2
|
|
|
3
|
+
import { normalizePath, withBasePath } from "./base-path.ts";
|
|
3
4
|
import { CHANGELOG_INDEX_ROUTE, hasChangelogIndex } from "./changelog-index.ts";
|
|
4
5
|
import { loadConfig } from "./config.ts";
|
|
5
6
|
import { customStaticRoutes, discoverPages } from "./custom-pages.ts";
|
|
@@ -18,10 +19,16 @@ import { buildManifest } from "./manifest.ts";
|
|
|
18
19
|
import { discoverFolderMeta } from "./meta.ts";
|
|
19
20
|
import type { FolderMetaSource } from "./meta.ts";
|
|
20
21
|
import { resolveProjectContext } from "./project.ts";
|
|
22
|
+
import { isPatternPath, pathsUnderPattern } from "./redirect-patterns.ts";
|
|
21
23
|
import type { ResolvedConfig } from "./schema.ts";
|
|
22
24
|
import { normalizeEntry, strippedLineOffset } from "./sources/normalize.ts";
|
|
23
25
|
import { resolveDocsCollection, resolveSources } from "./sources/resolve.ts";
|
|
24
|
-
import type {
|
|
26
|
+
import type { SourceRuntime } from "./sources/resolve.ts";
|
|
27
|
+
import type {
|
|
28
|
+
ContentSource,
|
|
29
|
+
SourceEntry,
|
|
30
|
+
SourceLoadResult,
|
|
31
|
+
} from "./sources/types.ts";
|
|
25
32
|
import type {
|
|
26
33
|
BlumeManifest,
|
|
27
34
|
ContentGraph,
|
|
@@ -30,6 +37,12 @@ import type {
|
|
|
30
37
|
PageRecord,
|
|
31
38
|
ProjectContext,
|
|
32
39
|
} from "./types.ts";
|
|
40
|
+
import {
|
|
41
|
+
hasVariables,
|
|
42
|
+
substituteVariables,
|
|
43
|
+
undefinedVariables,
|
|
44
|
+
} from "./variables.ts";
|
|
45
|
+
import type { ContentVariables } from "./variables.ts";
|
|
33
46
|
import { versionsDiagnostics } from "./versions.ts";
|
|
34
47
|
|
|
35
48
|
/** Build mode: drafts are kept in `dev` and dropped in `build`. */
|
|
@@ -246,6 +259,104 @@ const isBannerShorthand = (
|
|
|
246
259
|
banner: NonNullable<ResolvedConfig["banner"]>
|
|
247
260
|
): banner is string => typeof banner === "string";
|
|
248
261
|
|
|
262
|
+
/**
|
|
263
|
+
* Report an entry's undefined content variables at their source lines, then
|
|
264
|
+
* replace the defined ones in the text the scan extracts from: the expanded
|
|
265
|
+
* text when includes were spliced (its `origins` map lines back to the file
|
|
266
|
+
* each came from), else the body.
|
|
267
|
+
*/
|
|
268
|
+
const substituteEntryVariables = (
|
|
269
|
+
entry: SourceEntry,
|
|
270
|
+
variables: ContentVariables
|
|
271
|
+
): Diagnostic[] => {
|
|
272
|
+
const { expanded } = entry;
|
|
273
|
+
const text = expanded?.text ?? entry.body.text;
|
|
274
|
+
const offset = expanded ? 0 : strippedLineOffset(entry.raw, entry.body.text);
|
|
275
|
+
const diagnostics = undefinedVariables(text, variables).map(
|
|
276
|
+
({ line, name }): Diagnostic => {
|
|
277
|
+
const origin = expanded?.origins[line - 1];
|
|
278
|
+
return {
|
|
279
|
+
code: "BLUME_UNDEFINED_VARIABLE",
|
|
280
|
+
file: origin?.file ?? entry.sourcePath,
|
|
281
|
+
line: origin?.line ?? line + offset,
|
|
282
|
+
message: `{{${name}}} isn't a defined variable, so it would show as written.`,
|
|
283
|
+
severity: "error",
|
|
284
|
+
suggestion: `Define "${name}" under variables in blume.config.ts, or put it in inline code to show it as written.`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
);
|
|
288
|
+
if (expanded) {
|
|
289
|
+
expanded.text = substituteVariables(expanded.text, variables);
|
|
290
|
+
} else {
|
|
291
|
+
entry.body.text = substituteVariables(entry.body.text, variables);
|
|
292
|
+
}
|
|
293
|
+
return diagnostics;
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
/** {@link substituteEntryVariables} over every loaded entry, when any are defined. */
|
|
297
|
+
const substituteLoadedVariables = (
|
|
298
|
+
loaded: readonly SourceLoadResult[],
|
|
299
|
+
variables: ContentVariables
|
|
300
|
+
): Diagnostic[] =>
|
|
301
|
+
hasVariables(variables)
|
|
302
|
+
? loaded.flatMap(({ entries }) =>
|
|
303
|
+
entries.flatMap((entry) => substituteEntryVariables(entry, variables))
|
|
304
|
+
)
|
|
305
|
+
: [];
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* A pattern redirect that also matches a page. Hosts disagree on which
|
|
309
|
+
* answers (Vercel and Cloudflare apply the rule ahead of the page, Netlify
|
|
310
|
+
* and the Node server serve the page), so the pattern is rejected rather than
|
|
311
|
+
* let the answer depend on the host. `pages` are the served page paths, which
|
|
312
|
+
* carry `basePath`, as the based `from` does.
|
|
313
|
+
*
|
|
314
|
+
* An exact redirect from a page's own URL answers the same way everywhere:
|
|
315
|
+
* Astro ranks its route above the page's catch-all, in dev and build alike,
|
|
316
|
+
* and writes the redirect page where the page would go, so the page never
|
|
317
|
+
* publishes. That's a warning rather than an error, since the outcome doesn't
|
|
318
|
+
* depend on the host.
|
|
319
|
+
*/
|
|
320
|
+
const redirectPageDiagnostics = (
|
|
321
|
+
config: ResolvedConfig,
|
|
322
|
+
pages: readonly string[],
|
|
323
|
+
configFile: string | null
|
|
324
|
+
): Diagnostic[] =>
|
|
325
|
+
config.redirects.flatMap((redirect): Diagnostic[] => {
|
|
326
|
+
const from = withBasePath(config.basePath, redirect.from);
|
|
327
|
+
if (!isPatternPath(redirect.from)) {
|
|
328
|
+
const page = normalizePath(from);
|
|
329
|
+
return pages.includes(page)
|
|
330
|
+
? [
|
|
331
|
+
{
|
|
332
|
+
code: "BLUME_REDIRECT_MATCHES_PAGE",
|
|
333
|
+
file: configFile ?? undefined,
|
|
334
|
+
message: `The redirect from ${redirect.from} is also the page ${page}, which never publishes: its URL redirects to ${redirect.to} instead.`,
|
|
335
|
+
severity: "warning",
|
|
336
|
+
suggestion:
|
|
337
|
+
"If the page moved, delete it or give it a new slug; otherwise remove the redirect.",
|
|
338
|
+
} satisfies Diagnostic,
|
|
339
|
+
]
|
|
340
|
+
: [];
|
|
341
|
+
}
|
|
342
|
+
const matched = pathsUnderPattern(from, pages);
|
|
343
|
+
const [first] = matched;
|
|
344
|
+
if (first === undefined) {
|
|
345
|
+
return [];
|
|
346
|
+
}
|
|
347
|
+
const more = matched.length > 1 ? ` and ${matched.length - 1} more` : "";
|
|
348
|
+
return [
|
|
349
|
+
{
|
|
350
|
+
code: "BLUME_REDIRECT_MATCHES_PAGE",
|
|
351
|
+
file: configFile ?? undefined,
|
|
352
|
+
message: `The redirect from ${redirect.from} also matches the page ${first}${more}, which some hosts would redirect and others would serve.`,
|
|
353
|
+
severity: "error",
|
|
354
|
+
suggestion:
|
|
355
|
+
"Narrow the pattern to the paths that moved, or move the pages out from under it.",
|
|
356
|
+
} satisfies Diagnostic,
|
|
357
|
+
];
|
|
358
|
+
});
|
|
359
|
+
|
|
249
360
|
/** The configured banner link target, when the banner has a link. */
|
|
250
361
|
const bannerLinkHref = (
|
|
251
362
|
banner: ResolvedConfig["banner"]
|
|
@@ -254,6 +365,26 @@ const bannerLinkHref = (
|
|
|
254
365
|
? undefined
|
|
255
366
|
: banner.link?.href;
|
|
256
367
|
|
|
368
|
+
/**
|
|
369
|
+
* The project's sources, before any of them loads: `beforeSources` sees the
|
|
370
|
+
* config first, then each source validates itself (e.g. the filesystem
|
|
371
|
+
* source checks its root exists), replacing the single hard `contentRoot`
|
|
372
|
+
* check.
|
|
373
|
+
*/
|
|
374
|
+
const validatedSources = (
|
|
375
|
+
config: ResolvedConfig,
|
|
376
|
+
context: ProjectContext,
|
|
377
|
+
runtime: SourceRuntime,
|
|
378
|
+
beforeSources?: (config: ResolvedConfig) => void
|
|
379
|
+
): ContentSource[] => {
|
|
380
|
+
beforeSources?.(config);
|
|
381
|
+
const sources = resolveSources(config, context, runtime);
|
|
382
|
+
for (const source of sources) {
|
|
383
|
+
source.validate?.();
|
|
384
|
+
}
|
|
385
|
+
return sources;
|
|
386
|
+
};
|
|
387
|
+
|
|
257
388
|
export const scanProject = async (
|
|
258
389
|
root: string,
|
|
259
390
|
options: {
|
|
@@ -265,6 +396,12 @@ export const scanProject = async (
|
|
|
265
396
|
overrides?: ConfigOverrides;
|
|
266
397
|
/** Relocate the generated runtime (e.g. `.blume-verify` for isolation). */
|
|
267
398
|
runtimeDir?: string;
|
|
399
|
+
/**
|
|
400
|
+
* Called with the resolved config before any source loads, so a command
|
|
401
|
+
* can report an unset secret ahead of a fetch that fails without it: a
|
|
402
|
+
* source that can't load fails the scan, and nothing after it runs.
|
|
403
|
+
*/
|
|
404
|
+
beforeSources?: (config: ResolvedConfig) => void;
|
|
268
405
|
} = {}
|
|
269
406
|
): Promise<BlumeProject> => {
|
|
270
407
|
const mode = options.mode ?? "dev";
|
|
@@ -276,17 +413,12 @@ export const scanProject = async (
|
|
|
276
413
|
const context = resolveProjectContext(root, config, {
|
|
277
414
|
runtimeDir: options.runtimeDir,
|
|
278
415
|
});
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
refresh: options.refresh,
|
|
286
|
-
});
|
|
287
|
-
for (const source of sources) {
|
|
288
|
-
source.validate?.();
|
|
289
|
-
}
|
|
416
|
+
const sources = validatedSources(
|
|
417
|
+
config,
|
|
418
|
+
context,
|
|
419
|
+
{ mode, preview, refresh: options.refresh },
|
|
420
|
+
options.beforeSources
|
|
421
|
+
);
|
|
290
422
|
|
|
291
423
|
// Folder meta is discovered per filesystem source, under each source's own
|
|
292
424
|
// root and keyed by its route prefix, so a prefixed/root-differing source's
|
|
@@ -352,6 +484,14 @@ export const scanProject = async (
|
|
|
352
484
|
})
|
|
353
485
|
);
|
|
354
486
|
|
|
487
|
+
// Content variables: an undefined name in prose is an error at its source
|
|
488
|
+
// line, and every defined one is replaced in the text headings, links, and
|
|
489
|
+
// components are extracted from, so they match the rendered page.
|
|
490
|
+
const variableDiagnostics = substituteLoadedVariables(
|
|
491
|
+
loaded,
|
|
492
|
+
config.variables
|
|
493
|
+
);
|
|
494
|
+
|
|
355
495
|
// Folder meta contributed by the sources themselves (the OpenAPI source
|
|
356
496
|
// labels each tag directory with the spec's own tag name). It applies to
|
|
357
497
|
// every locale, so it merges into the shared map — beneath user-authored
|
|
@@ -424,14 +564,15 @@ export const scanProject = async (
|
|
|
424
564
|
const customPages = context.pagesRoot
|
|
425
565
|
? await discoverPages(context.pagesRoot)
|
|
426
566
|
: [];
|
|
567
|
+
const extraRoutes = new Set([
|
|
568
|
+
...customStaticRoutes(customPages),
|
|
569
|
+
...(hasChangelogIndex(pages, config) ? [CHANGELOG_INDEX_ROUTE] : []),
|
|
570
|
+
]);
|
|
427
571
|
const graph = buildContentGraph(pages, {
|
|
428
572
|
bannerHref: bannerLinkHref(config.banner),
|
|
429
573
|
basePath: config.basePath,
|
|
430
574
|
brandHref: logoHref(config.logo),
|
|
431
|
-
extraRoutes
|
|
432
|
-
...customStaticRoutes(customPages),
|
|
433
|
-
...(hasChangelogIndex(pages, config) ? [CHANGELOG_INDEX_ROUTE] : []),
|
|
434
|
-
]),
|
|
575
|
+
extraRoutes,
|
|
435
576
|
folderMeta: folderMeta.meta,
|
|
436
577
|
i18n: config.i18n,
|
|
437
578
|
navigation: config.navigation,
|
|
@@ -453,6 +594,7 @@ export const scanProject = async (
|
|
|
453
594
|
diagnostics: [
|
|
454
595
|
...contentDiagnostics,
|
|
455
596
|
...includeDiagnostics,
|
|
597
|
+
...variableDiagnostics,
|
|
456
598
|
...folderMeta.diagnostics,
|
|
457
599
|
...entryIdDiagnostics(
|
|
458
600
|
pages,
|
|
@@ -462,6 +604,11 @@ export const scanProject = async (
|
|
|
462
604
|
...i18nWarnings,
|
|
463
605
|
...versionWarnings,
|
|
464
606
|
...lastModifiedWarnings,
|
|
607
|
+
...redirectPageDiagnostics(
|
|
608
|
+
config,
|
|
609
|
+
[...manifest.routes.map((route) => route.path), ...extraRoutes],
|
|
610
|
+
context.configFile
|
|
611
|
+
),
|
|
465
612
|
],
|
|
466
613
|
droppedPages,
|
|
467
614
|
graph,
|