blume 1.7.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +19 -0
- package/CHANGELOG.md +217 -0
- package/README.md +34 -21
- package/dist/cli/chunk-11j0384y.js +148 -0
- package/dist/cli/chunk-11j0384y.js.map +10 -0
- package/dist/cli/{chunk-rqy0s5wh.js → chunk-1w8dp3qb.js} +17 -16
- package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-1w8dp3qb.js.map} +3 -3
- package/dist/cli/chunk-2q1dwty4.js +75 -0
- package/dist/cli/chunk-2q1dwty4.js.map +11 -0
- package/dist/cli/chunk-41za066z.js +122 -0
- package/dist/cli/chunk-41za066z.js.map +11 -0
- package/dist/cli/chunk-5a2z0198.js +133 -0
- package/dist/cli/chunk-5a2z0198.js.map +10 -0
- package/dist/cli/{chunk-5g0w1e2c.js → chunk-6k8vp3ta.js} +25 -13
- package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-6k8vp3ta.js.map} +4 -4
- package/dist/cli/{chunk-5qk08vmp.js → chunk-79njf86q.js} +133 -54
- package/dist/cli/chunk-79njf86q.js.map +11 -0
- package/dist/cli/{chunk-e7f42gdj.js → chunk-7ez8ny0t.js} +2 -2
- package/dist/cli/{chunk-nn13znc2.js → chunk-88cpgt6h.js} +1 -1
- package/dist/cli/chunk-a9kptbw5.js +361 -0
- package/dist/cli/chunk-a9kptbw5.js.map +14 -0
- package/dist/cli/chunk-abh8yjkn.js +31 -0
- package/dist/cli/chunk-abh8yjkn.js.map +10 -0
- package/dist/cli/chunk-b5aj94ah.js +91 -0
- package/dist/cli/chunk-b5aj94ah.js.map +10 -0
- package/dist/cli/{chunk-b27xqwn9.js → chunk-bctazmbk.js} +9 -5
- package/dist/cli/chunk-bctazmbk.js.map +10 -0
- package/dist/cli/chunk-beat36xx.js +279 -0
- package/dist/cli/chunk-beat36xx.js.map +10 -0
- package/dist/cli/chunk-bnbmcwfb.js +145 -0
- package/dist/cli/chunk-bnbmcwfb.js.map +11 -0
- package/dist/cli/{chunk-0xjyb285.js → chunk-bw22s759.js} +15 -5
- package/dist/cli/{chunk-0xjyb285.js.map → chunk-bw22s759.js.map} +4 -4
- package/dist/cli/chunk-by2290sx.js +39 -0
- package/dist/cli/chunk-by2290sx.js.map +10 -0
- package/dist/cli/chunk-d1tadaw7.js +79 -0
- package/dist/cli/chunk-d1tadaw7.js.map +10 -0
- package/dist/cli/{chunk-ahnw3kxw.js → chunk-d80hr03s.js} +24 -19
- package/dist/cli/chunk-d80hr03s.js.map +15 -0
- package/dist/cli/chunk-ernrthtr.js +97 -0
- package/dist/cli/chunk-ernrthtr.js.map +10 -0
- package/dist/cli/chunk-f2972sbt.js +374 -0
- package/dist/cli/chunk-f2972sbt.js.map +10 -0
- package/dist/cli/{chunk-vacwm2hv.js → chunk-f7t03s3g.js} +2 -2
- package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
- package/dist/cli/chunk-fa25z98p.js.map +11 -0
- package/dist/cli/{chunk-cjtn640a.js → chunk-fh5hj5jt.js} +43 -20
- package/dist/cli/chunk-fh5hj5jt.js.map +10 -0
- package/dist/cli/{chunk-yg63d42r.js → chunk-j8mw0za6.js} +86 -57
- package/dist/cli/chunk-j8mw0za6.js.map +35 -0
- package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
- package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
- package/dist/cli/{chunk-ps4m1xh4.js → chunk-mnqj32sj.js} +505 -542
- package/dist/cli/chunk-mnqj32sj.js.map +12 -0
- package/dist/cli/{chunk-8cjtbafj.js → chunk-mwt1k8n7.js} +100 -374
- package/dist/cli/chunk-mwt1k8n7.js.map +10 -0
- package/dist/cli/chunk-nk3ts2xk.js +51 -0
- package/dist/cli/chunk-nk3ts2xk.js.map +10 -0
- package/dist/cli/{chunk-3r45185y.js → chunk-pat2zzwc.js} +9 -11
- package/dist/cli/{chunk-3r45185y.js.map → chunk-pat2zzwc.js.map} +2 -2
- package/dist/cli/chunk-pnnvybbk.js +176 -0
- package/dist/cli/chunk-pnnvybbk.js.map +11 -0
- package/dist/cli/{chunk-4x36ddpw.js → chunk-sqn5t4q0.js} +81 -87
- package/dist/cli/chunk-sqn5t4q0.js.map +10 -0
- package/dist/cli/{chunk-bvwwhd84.js → chunk-tzne8qfq.js} +15 -15
- package/dist/cli/{chunk-bvwwhd84.js.map → chunk-tzne8qfq.js.map} +1 -1
- package/dist/cli/chunk-xaz13gwg.js +12449 -0
- package/dist/cli/chunk-xaz13gwg.js.map +182 -0
- package/dist/cli/chunk-y3e45rc8.js +102 -0
- package/dist/cli/chunk-y3e45rc8.js.map +10 -0
- package/dist/cli/chunk-z01ze5c1.js +261 -0
- package/dist/cli/chunk-z01ze5c1.js.map +10 -0
- package/dist/cli/{chunk-k79xp7av.js → chunk-z1f5arsg.js} +219 -689
- package/dist/cli/chunk-z1f5arsg.js.map +36 -0
- package/dist/cli/{chunk-1jefwnfs.js → chunk-zg2gtj10.js} +1076 -2592
- package/dist/cli/chunk-zg2gtj10.js.map +35 -0
- package/dist/cli/{chunk-dwgcp5sm.js → chunk-zxccj738.js} +1 -1
- package/dist/cli/index.js +214 -57
- package/dist/cli/index.js.map +8 -7
- package/dist/types/ai/agent-readability.d.ts +52 -0
- package/dist/types/ai/ai-catalog.d.ts +42 -0
- package/dist/types/ai/api/paths.d.ts +17 -0
- package/dist/types/ai/api-catalog.d.ts +18 -0
- package/dist/types/ai/ask.d.ts +368 -0
- package/dist/types/ai/changelog-markdown.d.ts +2 -0
- package/dist/types/ai/component-markdown.d.ts +2 -2
- package/dist/types/ai/index.d.ts +24 -0
- package/dist/types/ai/link-headers.d.ts +24 -0
- package/dist/types/ai/llms.d.ts +25 -0
- package/dist/types/ai/markdown.d.ts +45 -0
- package/dist/types/ai/mcp/discovery.d.ts +68 -0
- package/dist/types/ai/mcp/tools.d.ts +16 -0
- package/dist/types/ai/openapi-components.d.ts +43 -0
- package/dist/types/ai/relative-links.d.ts +26 -0
- package/dist/types/ai/serializers.d.ts +15 -0
- package/dist/types/ai/skills.d.ts +42 -0
- package/dist/types/ai/tar.d.ts +25 -0
- package/dist/types/ai/visibility.d.ts +17 -0
- package/dist/types/ai/web-bot-auth.d.ts +16 -0
- package/dist/types/analytics/adobe.d.ts +35 -0
- package/dist/types/analytics/amplitude.d.ts +50 -0
- package/dist/types/analytics/clarity.d.ts +31 -0
- package/dist/types/analytics/clearbit.d.ts +29 -0
- package/dist/types/analytics/cloudflare.d.ts +41 -0
- package/dist/types/analytics/fathom.d.ts +41 -0
- package/dist/types/analytics/google-analytics.d.ts +44 -0
- package/dist/types/analytics/google-tag-manager.d.ts +40 -0
- package/dist/types/analytics/head.d.ts +30 -0
- package/dist/types/analytics/heap.d.ts +40 -0
- package/dist/types/analytics/hightouch.d.ts +44 -0
- package/dist/types/analytics/hotjar.d.ts +33 -0
- package/dist/types/analytics/index.d.ts +61 -0
- package/dist/types/analytics/inline.d.ts +17 -0
- package/dist/types/analytics/logrocket.d.ts +44 -0
- package/dist/types/analytics/mixpanel.d.ts +67 -0
- package/dist/types/analytics/pirsch.d.ts +42 -0
- package/dist/types/analytics/plausible.d.ts +56 -0
- package/dist/types/analytics/posthog.d.ts +45 -0
- package/dist/types/analytics/schema.d.ts +320 -0
- package/dist/types/analytics/script.d.ts +46 -0
- package/dist/types/analytics/segment.d.ts +50 -0
- package/dist/types/analytics/vercel.d.ts +48 -0
- package/dist/types/astro/integration.d.ts +76 -0
- package/dist/types/astro/markdown-negotiation.d.ts +23 -0
- package/dist/types/astro/module-types.d.ts +14 -0
- package/dist/types/astro/pages.d.ts +44 -0
- package/dist/types/cli/env.d.ts +12 -0
- package/dist/types/cli/init/scaffold.d.ts +154 -0
- package/dist/types/components/layout/nav-utils.d.ts +11 -0
- package/dist/types/core/adapter.d.ts +47 -0
- package/dist/types/core/api-name.d.ts +7 -0
- package/dist/types/core/changelog-index.d.ts +13 -0
- package/dist/types/core/config-input.d.ts +186 -515
- package/dist/types/core/config.d.ts +60 -34
- package/dist/types/core/content-assets.d.ts +76 -0
- package/dist/types/core/custom-pages.d.ts +33 -0
- package/dist/types/core/data.d.ts +27 -12
- package/dist/types/core/define-components.d.ts +12 -9
- package/dist/types/core/deployment-env.d.ts +6 -11
- package/dist/types/core/frontmatter.d.ts +10 -0
- package/dist/types/core/graph.d.ts +18 -0
- package/dist/types/core/heading-markers.d.ts +54 -0
- package/dist/types/core/i18n-ui.d.ts +6 -2
- package/dist/types/core/i18n.d.ts +87 -0
- package/dist/types/core/includes.d.ts +138 -0
- package/dist/types/core/last-modified.d.ts +47 -0
- package/dist/types/core/links.d.ts +95 -0
- package/dist/types/core/locale-links.d.ts +60 -0
- package/dist/types/core/manifest.d.ts +17 -0
- package/dist/types/core/meta.d.ts +38 -0
- package/dist/types/core/nav-diagnostics.d.ts +26 -0
- package/dist/types/core/navigation.d.ts +6 -0
- package/dist/types/core/node-require.d.ts +19 -0
- package/dist/types/core/package-json.d.ts +13 -0
- package/dist/types/core/probe.d.ts +42 -0
- package/dist/types/core/project-graph.d.ts +51 -0
- package/dist/types/core/project.d.ts +2 -0
- package/dist/types/core/safe-href.d.ts +2 -0
- package/dist/types/core/safe-links.d.ts +26 -0
- package/dist/types/core/schema.d.ts +2282 -452
- package/dist/types/core/site-url.d.ts +16 -0
- package/dist/types/core/sources/assets.d.ts +36 -0
- package/dist/types/core/sources/cache.d.ts +37 -0
- package/dist/types/core/sources/collection.d.ts +28 -0
- package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
- package/dist/types/core/sources/contentful.d.ts +40 -0
- package/dist/types/core/sources/filesystem.d.ts +24 -0
- package/dist/types/core/sources/github-releases.d.ts +31 -0
- package/dist/types/core/sources/json.d.ts +30 -0
- package/dist/types/core/sources/lexical.d.ts +19 -0
- package/dist/types/core/sources/lower.d.ts +75 -0
- package/dist/types/core/sources/mdx-remote.d.ts +28 -0
- package/dist/types/core/sources/normalize.d.ts +147 -0
- package/dist/types/core/sources/notion.d.ts +131 -0
- package/dist/types/core/sources/obsidian.d.ts +46 -0
- package/dist/types/core/sources/payload.d.ts +39 -0
- package/dist/types/core/sources/portable-text.d.ts +42 -0
- package/dist/types/core/sources/read.d.ts +23 -0
- package/dist/types/core/sources/remote.d.ts +74 -0
- package/dist/types/core/sources/resolve.d.ts +19 -0
- package/dist/types/core/sources/sanity.d.ts +43 -0
- package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
- package/dist/types/core/sources/strapi.d.ts +33 -0
- package/dist/types/core/sources/types.d.ts +7 -0
- package/dist/types/core/sources/watch.d.ts +45 -0
- package/dist/types/core/text-width.d.ts +11 -0
- package/dist/types/core/types.d.ts +15 -1
- package/dist/types/core/unrecognized-keys.d.ts +7 -0
- package/dist/types/core/versions.d.ts +72 -0
- package/dist/types/core/yaml.d.ts +9 -0
- package/dist/types/deploy/adapter-output.d.ts +45 -0
- package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
- package/dist/types/deploy/adapters/index.d.ts +29 -0
- package/dist/types/deploy/adapters/netlify.d.ts +37 -0
- package/dist/types/deploy/adapters/node.d.ts +37 -0
- package/dist/types/deploy/adapters/registry.d.ts +133 -0
- package/dist/types/deploy/adapters/types.d.ts +71 -0
- package/dist/types/deploy/adapters/vercel.d.ts +38 -0
- package/dist/types/deploy/artifacts.d.ts +65 -0
- package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
- package/dist/types/deploy/function-bundle.d.ts +80 -0
- package/dist/types/deploy/headers.d.ts +50 -0
- package/dist/types/deploy/node-headers.d.ts +42 -0
- package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
- package/dist/types/deploy/platforms/index.d.ts +18 -0
- package/dist/types/deploy/platforms/netlify.d.ts +13 -0
- package/dist/types/deploy/platforms/node.d.ts +11 -0
- package/dist/types/deploy/platforms/paths.d.ts +27 -0
- package/dist/types/deploy/platforms/static.d.ts +10 -0
- package/dist/types/deploy/platforms/types.d.ts +104 -0
- package/dist/types/deploy/platforms/vercel.d.ts +32 -0
- package/dist/types/deploy/redirects.d.ts +53 -0
- package/dist/types/deploy/robots.d.ts +8 -0
- package/dist/types/deploy/rss.d.ts +31 -0
- package/dist/types/deploy/sitemap.d.ts +21 -0
- package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
- package/dist/types/markdown/code-title.d.ts +32 -0
- package/dist/types/markdown/fence-meta.d.ts +23 -0
- package/dist/types/markdown/themes.d.ts +3 -3
- package/dist/types/openapi/asyncapi.d.ts +129 -0
- package/dist/types/openapi/graphql-build.d.ts +8 -0
- package/dist/types/openapi/graphql.d.ts +122 -0
- package/dist/types/openapi/model.d.ts +158 -0
- package/dist/types/openapi/parse.d.ts +57 -0
- package/dist/types/openapi/references.d.ts +37 -25
- package/dist/types/openapi/render-mdx.d.ts +33 -0
- package/dist/types/openapi/sentence.d.ts +7 -0
- package/dist/types/openapi/signature.d.ts +10 -0
- package/dist/types/openapi/source.d.ts +22 -0
- package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
- package/dist/types/reference/asyncapi.d.ts +166 -0
- package/dist/types/reference/graphql.d.ts +181 -0
- package/dist/types/reference/index.d.ts +32 -0
- package/dist/types/reference/openapi.d.ts +165 -0
- package/dist/types/reference/options.d.ts +157 -0
- package/dist/types/reference/scalar.d.ts +136 -0
- package/dist/types/reference/schema.d.ts +630 -0
- package/dist/types/search/adapters/algolia.d.ts +32 -0
- package/dist/types/search/adapters/flexsearch.d.ts +12 -0
- package/dist/types/search/adapters/index.d.ts +31 -0
- package/dist/types/search/adapters/mixedbread.d.ts +22 -0
- package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
- package/dist/types/search/adapters/orama.d.ts +13 -0
- package/dist/types/search/adapters/pagefind.d.ts +12 -0
- package/dist/types/search/adapters/registry.d.ts +228 -0
- package/dist/types/search/adapters/types.d.ts +34 -0
- package/dist/types/search/adapters/typesense.d.ts +42 -0
- package/dist/types/search/build.d.ts +23 -0
- package/dist/types/search/documents.d.ts +90 -0
- package/dist/types/search/facets.d.ts +3 -0
- package/dist/types/search/sync/algolia.d.ts +14 -0
- package/dist/types/search/sync/index.d.ts +14 -0
- package/dist/types/search/sync/orama-cloud.d.ts +10 -0
- package/dist/types/search/sync/typesense.d.ts +14 -0
- package/dist/types/sources/contentful.d.ts +68 -0
- package/dist/types/sources/custom.d.ts +20 -0
- package/dist/types/sources/filesystem.d.ts +42 -0
- package/dist/types/sources/github-releases.d.ts +46 -0
- package/dist/types/sources/index.d.ts +48 -0
- package/dist/types/sources/mdx-remote.d.ts +63 -0
- package/dist/types/sources/notion.d.ts +65 -0
- package/dist/types/sources/obsidian.d.ts +34 -0
- package/dist/types/sources/payload.d.ts +68 -0
- package/dist/types/sources/registry.d.ts +1414 -0
- package/dist/types/sources/sanity.d.ts +69 -0
- package/dist/types/sources/shared.d.ts +46 -0
- package/dist/types/sources/strapi.d.ts +66 -0
- package/dist/types/theme/icon-kind.d.ts +11 -0
- package/dist/types/theme/icons.d.ts +20 -0
- package/docs/01-quickstart.mdx +18 -18
- package/docs/02-deployment.mdx +50 -26
- package/docs/03-upgrading.mdx +351 -0
- package/docs/04-migrating.mdx +58 -0
- package/docs/08-faq.mdx +3 -3
- package/docs/advanced/blog.mdx +13 -6
- package/docs/advanced/changelog.mdx +23 -35
- package/docs/advanced/custom-pages.mdx +20 -8
- package/docs/advanced/meta.ts +1 -8
- package/docs/advanced/skills.mdx +8 -0
- package/docs/cli/audit.mdx +646 -0
- package/docs/cli/doctor.mdx +29 -0
- package/docs/{reference/eval.mdx → cli/evals.mdx} +9 -8
- package/docs/cli/index.mdx +105 -0
- package/docs/cli/meta.ts +7 -0
- package/docs/{reference → cli}/translate.mdx +1 -1
- package/docs/cli/validate.mdx +41 -0
- package/docs/cli/version.mdx +40 -0
- package/docs/configuration/analytics.mdx +350 -59
- package/docs/configuration/ask-ai.mdx +162 -61
- package/docs/configuration/customization.mdx +15 -9
- package/docs/configuration/index.mdx +50 -31
- package/docs/configuration/search.mdx +75 -54
- package/docs/configuration/theming.mdx +24 -15
- package/docs/content/components.mdx +21 -5
- package/docs/{reference → content}/frontmatter.mdx +35 -1
- package/docs/content/i18n.mdx +8 -6
- package/docs/content/includes.mdx +2 -4
- package/docs/content/index.mdx +1 -1
- package/docs/content/islands.mdx +10 -5
- package/docs/content/meta.mdx +1 -1
- package/docs/content/meta.ts +1 -0
- package/docs/content/navigation.mdx +9 -7
- package/docs/content/sources.mdx +145 -50
- package/docs/content/syntax.mdx +16 -12
- package/docs/content/versioning.mdx +3 -3
- package/docs/discoverability/agent-discovery.mdx +11 -11
- package/docs/discoverability/index.mdx +4 -4
- package/docs/discoverability/json-api.mdx +4 -4
- package/docs/discoverability/llms-txt.mdx +6 -6
- package/docs/discoverability/markdown.mdx +4 -4
- package/docs/discoverability/mcp.mdx +11 -11
- package/docs/discoverability/sitemap-and-robots.mdx +3 -3
- package/docs/index.mdx +2 -2
- package/docs/references/asyncapi.mdx +59 -0
- package/docs/{advanced → references}/graphql.mdx +45 -32
- package/docs/{reference → references}/meta.ts +2 -2
- package/docs/references/openapi.mdx +171 -0
- package/docs/references/scalar.mdx +64 -0
- package/package.json +42 -8
- package/skills/blume/SKILL.md +21 -8
- package/skills/blume-migrate/SKILL.md +22 -21
- package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
- package/skills/blume-migrate/references/docusaurus.md +5 -4
- package/skills/blume-migrate/references/fumadocs.md +4 -4
- package/skills/blume-migrate/references/mintlify.md +23 -8
- package/skills/blume-migrate/references/monorepo.md +6 -6
- package/skills/blume-migrate/references/starlight.md +4 -4
- package/src/ai/agent-readability.ts +21 -22
- package/src/ai/ai-catalog.ts +50 -32
- package/src/ai/api/handlers.ts +46 -11
- package/src/ai/api-catalog.ts +8 -8
- package/src/ai/ask-data.ts +1 -1
- package/src/ai/ask.ts +624 -100
- package/src/ai/changelog-markdown.ts +91 -0
- package/src/ai/component-markdown.ts +328 -12
- package/src/ai/index.ts +45 -0
- package/src/ai/link-headers.ts +7 -6
- package/src/ai/llms.ts +20 -15
- package/src/ai/markdown.ts +35 -5
- package/src/ai/mcp/data.ts +9 -5
- package/src/ai/openapi-components.ts +4 -1
- package/src/ai/relative-links.ts +170 -0
- package/src/ai/serializers.ts +2 -2
- package/src/ai/skills.ts +1 -1
- package/src/ai/web-bot-auth.ts +2 -2
- package/src/analytics/adobe.ts +46 -0
- package/src/analytics/amplitude.ts +79 -0
- package/src/analytics/clarity.ts +46 -0
- package/src/analytics/clearbit.ts +47 -0
- package/src/analytics/cloudflare.ts +67 -0
- package/src/analytics/fathom.ts +64 -0
- package/src/analytics/google-analytics.ts +84 -0
- package/src/analytics/google-tag-manager.ts +61 -0
- package/src/analytics/head.ts +130 -0
- package/src/analytics/heap.ts +65 -0
- package/src/analytics/hightouch.ts +77 -0
- package/src/analytics/hotjar.ts +47 -0
- package/src/analytics/index.ts +71 -0
- package/src/analytics/inline.ts +21 -0
- package/src/analytics/logrocket.ts +71 -0
- package/src/analytics/mixpanel.ts +92 -0
- package/src/analytics/pirsch.ts +66 -0
- package/src/analytics/plausible.ts +83 -0
- package/src/analytics/posthog.ts +78 -0
- package/src/analytics/schema.ts +60 -0
- package/src/analytics/script.ts +60 -0
- package/src/analytics/segment.ts +85 -0
- package/src/analytics/vercel.ts +50 -0
- package/src/astro/adapter-root.ts +7 -9
- package/src/astro/component-slots.ts +131 -91
- package/src/astro/generate.ts +112 -345
- package/src/astro/integration.ts +2 -6
- package/src/astro/pages.ts +13 -101
- package/src/astro/render-deps.ts +379 -0
- package/src/astro/runtime-deps.ts +201 -0
- package/src/astro/templates.ts +554 -541
- package/src/audit/agent.ts +24 -0
- package/src/audit/catalog.ts +2 -2
- package/src/audit/checks/assets.ts +2 -2
- package/src/audit/checks/dns-aid.ts +1 -1
- package/src/audit/checks/duplicates.ts +3 -1
- package/src/audit/checks/i18n.ts +1 -1
- package/src/audit/checks/indexability.ts +7 -7
- package/src/audit/checks/links.ts +2 -2
- package/src/audit/checks/llms.ts +6 -6
- package/src/audit/checks/network.ts +3 -3
- package/src/audit/checks/og-image.ts +2 -2
- package/src/audit/checks/robots.ts +1 -1
- package/src/audit/checks/sitemap.ts +2 -2
- package/src/audit/checks/social.ts +1 -1
- package/src/audit/run.ts +4 -3
- package/src/audit/terms.ts +31 -0
- package/src/audit/url.ts +13 -13
- package/src/cli/command-meta.ts +10 -0
- package/src/cli/commands/audit.ts +39 -20
- package/src/cli/commands/build.ts +71 -316
- package/src/cli/commands/check.ts +1 -0
- package/src/cli/commands/dev.ts +40 -1
- package/src/cli/commands/doctor.ts +90 -14
- package/src/cli/commands/eject.ts +44 -7
- package/src/cli/commands/eval.ts +2 -2
- package/src/cli/commands/init.ts +161 -41
- package/src/cli/commands/migrate.ts +121 -0
- package/src/cli/commands/preview.ts +7 -1
- package/src/cli/commands/translate.ts +2 -2
- package/src/cli/commands/upgrade.ts +141 -0
- package/src/cli/commands/version.ts +57 -44
- package/src/cli/eject-scripts.ts +121 -6
- package/src/cli/index.ts +11 -1
- package/src/cli/init/install.ts +70 -0
- package/src/cli/init/questions.ts +7 -0
- package/src/cli/init/scaffold.ts +459 -75
- package/src/cli/lazy-command.ts +37 -1
- package/src/cli/prepare.ts +40 -6
- package/src/cli/required-secrets.ts +38 -11
- package/src/cli/unknown-flags.ts +266 -0
- package/src/cli/yarn-pnp.ts +52 -0
- package/src/components/content/AccordionItem.astro +7 -1
- package/src/components/content/Card.astro +4 -3
- package/src/components/content/ColorItem.astro +22 -4
- package/src/components/content/GithubInfo.astro +2 -2
- package/src/components/content/Prompt.astro +25 -25
- package/src/components/content/Tabs.astro +3 -1
- package/src/components/content/Tile.astro +2 -3
- package/src/components/content/Tooltip.astro +57 -9
- package/src/components/content/content-strings.ts +34 -0
- package/src/components/content/diff.ts +1 -1
- package/src/components/content/mermaid-element.ts +13 -2
- package/src/components/content/prompt-markdown.ts +292 -0
- package/src/components/content/tooltip-id.ts +41 -0
- package/src/components/islands/hooks.ts +25 -2
- package/src/components/layout/Analytics.astro +21 -79
- package/src/components/layout/Banner.astro +3 -1
- package/src/components/layout/DiscoveryLinks.astro +69 -0
- package/src/components/layout/Header.astro +83 -20
- package/src/components/layout/LanguageSwitcher.astro +4 -1
- package/src/components/layout/Logo.astro +23 -2
- package/src/components/layout/NavSelector.astro +13 -2
- package/src/components/layout/NavTree.astro +12 -3
- package/src/components/layout/NavTreeScript.astro +17 -3
- package/src/components/layout/PageActions.astro +3 -3
- package/src/components/layout/PageFeedback.astro +11 -1
- package/src/components/layout/PageLayout.astro +52 -5
- package/src/components/layout/ReferenceLayout.astro +21 -12
- package/src/components/layout/RootLayout.astro +69 -66
- package/src/components/layout/Search.astro +30 -6
- package/src/components/layout/WebMcp.astro +1 -1
- package/src/components/layout/analytics-client.ts +72 -15
- package/src/components/layout/drawer-inert.ts +113 -15
- package/src/components/layout/dropdown-clamp.ts +105 -0
- package/src/components/layout/head-scripts.ts +15 -6
- package/src/components/layout/nav-utils.ts +17 -0
- package/src/components/layout/search/algolia.ts +8 -8
- package/src/components/layout/search/orama-cloud.ts +9 -7
- package/src/components/layout/search/typesense.ts +11 -17
- package/src/components/openapi/MessageComposer.astro +2 -2
- package/src/components/openapi/Playground.astro +2 -2
- package/src/components/openapi/playground-client.ts +79 -10
- package/src/core/changelog-index.ts +24 -0
- package/src/core/component-overrides.ts +399 -154
- package/src/core/config-input.ts +188 -553
- package/src/core/config.ts +130 -41
- package/src/core/custom-pages.ts +105 -0
- package/src/core/data.ts +31 -12
- package/src/core/define-components.ts +12 -9
- package/src/core/deployment-env.ts +18 -74
- package/src/core/diagnostics.ts +14 -7
- package/src/core/graph.ts +69 -25
- package/src/core/i18n-ui.ts +6 -2
- package/src/core/i18n.ts +17 -0
- package/src/core/includes.ts +156 -38
- package/src/core/last-modified.ts +6 -11
- package/src/core/links.ts +166 -2
- package/src/core/manifest.ts +10 -3
- package/src/core/navigation.ts +115 -16
- package/src/core/new-tab.ts +35 -0
- package/src/core/node-require.ts +21 -0
- package/src/core/project-graph.ts +42 -26
- package/src/core/project.ts +9 -4
- package/src/core/request-body.ts +61 -0
- package/src/core/safe-href.ts +28 -0
- package/src/core/safe-links.ts +68 -0
- package/src/core/schema.ts +517 -739
- package/src/core/server-features.ts +8 -9
- package/src/core/sources/assets.ts +47 -11
- package/src/core/sources/collection.ts +67 -0
- package/src/core/sources/contentful-rich-text.ts +285 -0
- package/src/core/sources/contentful.ts +173 -0
- package/src/core/sources/github-releases.ts +51 -1
- package/src/core/sources/json.ts +71 -0
- package/src/core/sources/lexical.ts +195 -0
- package/src/core/sources/lower.ts +226 -0
- package/src/core/sources/normalize.ts +52 -2
- package/src/core/sources/notion.ts +39 -28
- package/src/core/sources/payload.ts +135 -0
- package/src/core/sources/portable-text.ts +11 -16
- package/src/core/sources/remote.ts +226 -0
- package/src/core/sources/resolve.ts +104 -166
- package/src/core/sources/sanity.ts +16 -49
- package/src/core/sources/strapi-blocks.ts +124 -0
- package/src/core/sources/strapi.ts +191 -0
- package/src/core/sources/types.ts +12 -1
- package/src/core/types.ts +15 -1
- package/src/core/ui-packs/ar.ts +6 -2
- package/src/core/ui-packs/bg.ts +6 -2
- package/src/core/ui-packs/bn.ts +6 -2
- package/src/core/ui-packs/ca.ts +3 -1
- package/src/core/ui-packs/cs.ts +6 -2
- package/src/core/ui-packs/da.ts +6 -2
- package/src/core/ui-packs/de.ts +6 -2
- package/src/core/ui-packs/el.ts +3 -1
- package/src/core/ui-packs/es.ts +3 -1
- package/src/core/ui-packs/fa.ts +6 -2
- package/src/core/ui-packs/fi.ts +6 -2
- package/src/core/ui-packs/fr.ts +3 -1
- package/src/core/ui-packs/he.ts +6 -2
- package/src/core/ui-packs/hi.ts +6 -2
- package/src/core/ui-packs/hr.ts +6 -2
- package/src/core/ui-packs/hu.ts +6 -2
- package/src/core/ui-packs/id.ts +6 -2
- package/src/core/ui-packs/it.ts +3 -1
- package/src/core/ui-packs/ja.ts +3 -1
- package/src/core/ui-packs/ko.ts +3 -1
- package/src/core/ui-packs/nl.ts +6 -2
- package/src/core/ui-packs/no.ts +6 -2
- package/src/core/ui-packs/pl.ts +6 -2
- package/src/core/ui-packs/pt-br.ts +3 -1
- package/src/core/ui-packs/pt.ts +3 -1
- package/src/core/ui-packs/ro.ts +6 -2
- package/src/core/ui-packs/ru.ts +6 -2
- package/src/core/ui-packs/sk.ts +6 -2
- package/src/core/ui-packs/sr.ts +6 -2
- package/src/core/ui-packs/sv.ts +6 -2
- package/src/core/ui-packs/th.ts +3 -1
- package/src/core/ui-packs/tr.ts +6 -2
- package/src/core/ui-packs/uk.ts +6 -2
- package/src/core/ui-packs/vi.ts +3 -1
- package/src/core/ui-packs/zh-tw.ts +3 -1
- package/src/core/ui-packs/zh.ts +3 -1
- package/src/core/unrecognized-keys.ts +10 -0
- package/src/core/version-cut.ts +116 -8
- package/src/deploy/adapter-output.ts +57 -97
- package/src/deploy/adapters/cloudflare.ts +39 -0
- package/src/deploy/adapters/index.ts +41 -0
- package/src/deploy/adapters/netlify.ts +34 -0
- package/src/deploy/adapters/node.ts +34 -0
- package/src/deploy/adapters/registry.ts +127 -0
- package/src/deploy/adapters/types.ts +92 -0
- package/src/deploy/adapters/vercel.ts +35 -0
- package/src/deploy/artifacts.ts +55 -27
- package/src/deploy/cloudflare-negotiation.ts +179 -100
- package/src/deploy/function-bundle.ts +18 -3
- package/src/deploy/headers.ts +124 -23
- package/src/deploy/node-headers.ts +198 -0
- package/src/deploy/platforms/cloudflare.ts +312 -0
- package/src/deploy/platforms/index.ts +67 -0
- package/src/deploy/platforms/netlify.ts +52 -0
- package/src/deploy/platforms/node.ts +40 -0
- package/src/deploy/platforms/paths.ts +42 -0
- package/src/deploy/platforms/static.ts +29 -0
- package/src/deploy/platforms/types.ts +112 -0
- package/src/deploy/platforms/vercel.ts +193 -0
- package/src/deploy/redirects.ts +30 -18
- package/src/deploy/robots.ts +3 -3
- package/src/deploy/rss.ts +2 -2
- package/src/deploy/sitemap.ts +2 -2
- package/src/deploy/vercel-negotiation.ts +2 -2
- package/src/eval/agents.ts +32 -1
- package/src/eval/findings.ts +19 -11
- package/src/eval/report.ts +10 -2
- package/src/markdown/external-links.ts +65 -0
- package/src/markdown/include.ts +45 -27
- package/src/markdown/index.ts +34 -9
- package/src/markdown/inline-code.ts +12 -6
- package/src/markdown/relative-links.ts +324 -0
- package/src/markdown/themes.ts +3 -3
- package/src/migrate/migrate.ts +149 -0
- package/src/openapi/parse.ts +64 -16
- package/src/openapi/proxy.ts +62 -10
- package/src/openapi/references.ts +147 -147
- package/src/openapi/render-mdx.ts +32 -10
- package/src/openapi/scalar.ts +15 -13
- package/src/openapi/sentence.ts +14 -0
- package/src/openapi/source.ts +37 -21
- package/src/openapi/spec-dependency-error.ts +15 -0
- package/src/reference/asyncapi.ts +83 -0
- package/src/reference/graphql.ts +89 -0
- package/src/reference/index.ts +40 -0
- package/src/reference/openapi.ts +83 -0
- package/src/reference/options.ts +201 -0
- package/src/reference/scalar.ts +136 -0
- package/src/reference/schema.ts +88 -0
- package/src/registry/eject.ts +97 -42
- package/src/search/adapters/algolia.ts +46 -0
- package/src/search/adapters/flexsearch.ts +29 -0
- package/src/search/adapters/index.ts +39 -0
- package/src/search/adapters/mixedbread.ts +39 -0
- package/src/search/adapters/orama-cloud.ts +51 -0
- package/src/search/adapters/orama.ts +24 -0
- package/src/search/adapters/pagefind.ts +27 -0
- package/src/search/adapters/registry.ts +131 -0
- package/src/search/adapters/types.ts +46 -0
- package/src/search/adapters/typesense.ts +57 -0
- package/src/search/build.ts +8 -4
- package/src/search/documents.ts +6 -0
- package/src/search/sync/algolia.ts +12 -11
- package/src/search/sync/index.ts +35 -20
- package/src/search/sync/orama-cloud.ts +12 -9
- package/src/search/sync/typesense.ts +15 -13
- package/src/sources/contentful.ts +63 -0
- package/src/sources/custom.ts +38 -0
- package/src/sources/filesystem.ts +51 -0
- package/src/sources/github-releases.ts +52 -0
- package/src/sources/index.ts +60 -0
- package/src/sources/mdx-remote.ts +76 -0
- package/src/sources/notion.ts +63 -0
- package/src/sources/obsidian.ts +38 -0
- package/src/sources/payload.ts +60 -0
- package/src/sources/registry.ts +182 -0
- package/src/sources/sanity.ts +66 -0
- package/src/sources/shared.ts +52 -0
- package/src/sources/strapi.ts +58 -0
- package/src/theme/entry.ts +24 -2
- package/src/translate/report.ts +40 -7
- package/src/upgrade/upgrade.ts +499 -0
- package/dist/cli/chunk-0qymqwzz.js +0 -164
- package/dist/cli/chunk-0qymqwzz.js.map +0 -15
- package/dist/cli/chunk-1jefwnfs.js.map +0 -48
- package/dist/cli/chunk-2mzebbbz.js +0 -69
- package/dist/cli/chunk-2z47ypj8.js.map +0 -11
- package/dist/cli/chunk-4x36ddpw.js.map +0 -11
- package/dist/cli/chunk-5093q3n7.js +0 -68
- package/dist/cli/chunk-5093q3n7.js.map +0 -10
- package/dist/cli/chunk-5qk08vmp.js.map +0 -11
- package/dist/cli/chunk-7s8hm3b6.js +0 -5347
- package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
- package/dist/cli/chunk-8cjtbafj.js.map +0 -13
- package/dist/cli/chunk-97r59kpr.js +0 -381
- package/dist/cli/chunk-97r59kpr.js.map +0 -12
- package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
- package/dist/cli/chunk-b27xqwn9.js.map +0 -10
- package/dist/cli/chunk-bf6bt1xt.js +0 -185
- package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
- package/dist/cli/chunk-cjtn640a.js.map +0 -10
- package/dist/cli/chunk-ct47dqpx.js.map +0 -11
- package/dist/cli/chunk-esphfr8p.js +0 -107
- package/dist/cli/chunk-esphfr8p.js.map +0 -11
- package/dist/cli/chunk-ex56aa81.js +0 -1016
- package/dist/cli/chunk-ex56aa81.js.map +0 -13
- package/dist/cli/chunk-garjf5z9.js +0 -30
- package/dist/cli/chunk-garjf5z9.js.map +0 -10
- package/dist/cli/chunk-js7saxwm.js +0 -1045
- package/dist/cli/chunk-js7saxwm.js.map +0 -22
- package/dist/cli/chunk-k79xp7av.js.map +0 -39
- package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
- package/dist/cli/chunk-q4rae3bg.js +0 -60
- package/dist/cli/chunk-q4rae3bg.js.map +0 -10
- package/dist/cli/chunk-rz9jmfhz.js +0 -108
- package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
- package/dist/cli/chunk-vh9w1sgp.js +0 -73
- package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
- package/dist/cli/chunk-vrfp10qk.js +0 -81
- package/dist/cli/chunk-vrfp10qk.js.map +0 -10
- package/dist/cli/chunk-yg63d42r.js.map +0 -34
- package/docs/advanced/api-reference.mdx +0 -240
- package/docs/reference/cli.mdx +0 -197
- package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
- package/src/components/content/changelog-element.ts +0 -69
- package/src/search/providers.ts +0 -91
- /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-7ez8ny0t.js.map} +0 -0
- /package/dist/cli/{chunk-nn13znc2.js.map → chunk-88cpgt6h.js.map} +0 -0
- /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-f7t03s3g.js.map} +0 -0
- /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-zxccj738.js.map} +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { ContentSource } from "../core/sources/types.ts";
|
|
6
|
+
|
|
7
|
+
/** A user-provided {@link ContentSource} instance, validated for `name` + `load`. */
|
|
8
|
+
export const customOptionsSchema = z.custom<ContentSource>(
|
|
9
|
+
(value): value is ContentSource =>
|
|
10
|
+
typeof value === "object" &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
"load" in value &&
|
|
13
|
+
typeof value.load === "function" &&
|
|
14
|
+
"name" in value &&
|
|
15
|
+
typeof value.name === "string",
|
|
16
|
+
{ message: "custom() takes a ContentSource (an object with name + load)" }
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export type CustomAdapter = AdapterDescriptor<"custom", ContentSource>;
|
|
20
|
+
|
|
21
|
+
export const customAdapterSchema = adapterDescriptorSchema(
|
|
22
|
+
"custom",
|
|
23
|
+
customOptionsSchema
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Any object implementing the {@link ContentSource} interface, passed straight
|
|
28
|
+
* through. This is the extension point for adapters with custom serializers or
|
|
29
|
+
* any other backend, without their SDKs touching core. Unlike the built-in
|
|
30
|
+
* adapters the descriptor carries a live instance, so it never travels through
|
|
31
|
+
* the generated project's data snapshot — the CLI consumes it at scan time.
|
|
32
|
+
*/
|
|
33
|
+
export const custom = (source: ContentSource): CustomAdapter => ({
|
|
34
|
+
kind: "custom",
|
|
35
|
+
options: source,
|
|
36
|
+
requiredSecrets: [],
|
|
37
|
+
runtimeDeps: [],
|
|
38
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions } from "./shared.ts";
|
|
6
|
+
import { DEFAULT_CONTENT_GLOB, sharedSourceOptionsSchema } from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
/** What `include` defaults to: every Markdown/MDX file under the root. */
|
|
9
|
+
export const DEFAULT_CONTENT_INCLUDE = [DEFAULT_CONTENT_GLOB];
|
|
10
|
+
/** What `exclude` defaults to: underscore- and dot-prefixed paths. */
|
|
11
|
+
export const DEFAULT_CONTENT_EXCLUDE = ["**/_*", "**/.*"];
|
|
12
|
+
|
|
13
|
+
/** Options for {@link filesystem}. */
|
|
14
|
+
export interface FilesystemOptions extends SharedSourceOptions {
|
|
15
|
+
/** Glob patterns to ignore. Defaults to `["**\/_*", "**\/.*"]`. */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
/** Glob patterns to include. Defaults to `["**\/*.{md,mdx}"]`. */
|
|
18
|
+
include?: string[];
|
|
19
|
+
/** Directory to read from, relative to the project root. Defaults to `docs`. */
|
|
20
|
+
root?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const filesystemOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
24
|
+
exclude: z.array(z.string()).default(DEFAULT_CONTENT_EXCLUDE),
|
|
25
|
+
include: z.array(z.string()).default(DEFAULT_CONTENT_INCLUDE),
|
|
26
|
+
root: z.string().default("docs"),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export type FilesystemAdapter = AdapterDescriptor<
|
|
30
|
+
"filesystem",
|
|
31
|
+
FilesystemOptions
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
export const filesystemAdapterSchema = adapterDescriptorSchema(
|
|
35
|
+
"filesystem",
|
|
36
|
+
filesystemOptionsSchema
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Local Markdown/MDX read from a directory. The zero-config default: with no
|
|
41
|
+
* `content.sources`, the top-level `content.root`/`include`/`exclude` desugar
|
|
42
|
+
* to exactly one of these.
|
|
43
|
+
*/
|
|
44
|
+
export const filesystem = (
|
|
45
|
+
options: FilesystemOptions = {}
|
|
46
|
+
): FilesystemAdapter => ({
|
|
47
|
+
kind: "filesystem",
|
|
48
|
+
options,
|
|
49
|
+
requiredSecrets: [],
|
|
50
|
+
runtimeDeps: [],
|
|
51
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions } from "./shared.ts";
|
|
6
|
+
import { sharedSourceOptionsSchema } from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link githubReleases}. */
|
|
9
|
+
export interface GithubReleasesOptions extends SharedSourceOptions {
|
|
10
|
+
/** Include draft releases (needs a token with repo write access). */
|
|
11
|
+
drafts?: boolean;
|
|
12
|
+
/** Cap the number of releases materialized, newest-first. Defaults to 100. */
|
|
13
|
+
limit?: number;
|
|
14
|
+
/** Repository owner (user or org). */
|
|
15
|
+
owner: string;
|
|
16
|
+
/** Include prereleases. */
|
|
17
|
+
prereleases?: boolean;
|
|
18
|
+
/** Repository name. */
|
|
19
|
+
repo: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const githubReleasesOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
23
|
+
drafts: z.boolean().optional(),
|
|
24
|
+
limit: z.number().positive().optional(),
|
|
25
|
+
owner: z.string(),
|
|
26
|
+
prereleases: z.boolean().optional(),
|
|
27
|
+
repo: z.string(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export type GithubReleasesAdapter = AdapterDescriptor<
|
|
31
|
+
"github-releases",
|
|
32
|
+
GithubReleasesOptions
|
|
33
|
+
>;
|
|
34
|
+
|
|
35
|
+
export const githubReleasesAdapterSchema = adapterDescriptorSchema(
|
|
36
|
+
"github-releases",
|
|
37
|
+
githubReleasesOptionsSchema
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* A repo's GitHub Releases, materialized as `type: changelog` entries — release
|
|
42
|
+
* notes become the changelog with no files to maintain. A private repo reads a
|
|
43
|
+
* token from `GITHUB_TOKEN`; it is never inlined here.
|
|
44
|
+
*/
|
|
45
|
+
export const githubReleases = (
|
|
46
|
+
options: GithubReleasesOptions
|
|
47
|
+
): GithubReleasesAdapter => ({
|
|
48
|
+
kind: "github-releases",
|
|
49
|
+
options,
|
|
50
|
+
requiredSecrets: ["GITHUB_TOKEN"],
|
|
51
|
+
runtimeDeps: [],
|
|
52
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content source adapters for `blume.config.ts`:
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defineConfig } from "blume";
|
|
6
|
+
* import { filesystem, githubReleases } from "blume/sources";
|
|
7
|
+
*
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* content: {
|
|
10
|
+
* sources: [
|
|
11
|
+
* filesystem({ root: "docs" }),
|
|
12
|
+
* githubReleases({ owner: "acme", repo: "sdk", prefix: "changelog" }),
|
|
13
|
+
* ],
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Each factory returns a plain descriptor (see `core/adapter.ts`) that the
|
|
19
|
+
* schema validates and the CLI reads at scan time; every consumer — the
|
|
20
|
+
* generated `.blume/package.json`, the secrets check, `blume doctor` — reads
|
|
21
|
+
* the descriptor's `runtimeDeps` and `requiredSecrets` instead of switching
|
|
22
|
+
* on a source name. `custom()` is the exception that carries a live
|
|
23
|
+
* {@link ContentSource} instance rather than JSON.
|
|
24
|
+
*/
|
|
25
|
+
export type { AdapterDescriptor } from "../core/adapter.ts";
|
|
26
|
+
export type {
|
|
27
|
+
ContentSource,
|
|
28
|
+
SourceContext,
|
|
29
|
+
SourceEntry,
|
|
30
|
+
SourceLoadResult,
|
|
31
|
+
} from "../core/sources/types.ts";
|
|
32
|
+
export { contentful } from "./contentful.ts";
|
|
33
|
+
export type { ContentfulAdapter, ContentfulOptions } from "./contentful.ts";
|
|
34
|
+
export { custom } from "./custom.ts";
|
|
35
|
+
export type { CustomAdapter } from "./custom.ts";
|
|
36
|
+
export { filesystem } from "./filesystem.ts";
|
|
37
|
+
export type { FilesystemAdapter, FilesystemOptions } from "./filesystem.ts";
|
|
38
|
+
export { githubReleases } from "./github-releases.ts";
|
|
39
|
+
export type {
|
|
40
|
+
GithubReleasesAdapter,
|
|
41
|
+
GithubReleasesOptions,
|
|
42
|
+
} from "./github-releases.ts";
|
|
43
|
+
export { mdxRemote } from "./mdx-remote.ts";
|
|
44
|
+
export type { MdxRemoteAdapter, MdxRemoteOptions } from "./mdx-remote.ts";
|
|
45
|
+
export { notion } from "./notion.ts";
|
|
46
|
+
export type { NotionAdapter, NotionOptions } from "./notion.ts";
|
|
47
|
+
export { obsidian } from "./obsidian.ts";
|
|
48
|
+
export type { ObsidianAdapter, ObsidianOptions } from "./obsidian.ts";
|
|
49
|
+
export { payload } from "./payload.ts";
|
|
50
|
+
export type { PayloadAdapter, PayloadOptions } from "./payload.ts";
|
|
51
|
+
export type {
|
|
52
|
+
AnySourceAdapter,
|
|
53
|
+
ContentSourceAdapter,
|
|
54
|
+
SourceAdapterKind,
|
|
55
|
+
} from "./registry.ts";
|
|
56
|
+
export { sanity } from "./sanity.ts";
|
|
57
|
+
export type { SanityAdapter, SanityOptions } from "./sanity.ts";
|
|
58
|
+
export type { SharedSourceOptions, SourceFieldMap } from "./shared.ts";
|
|
59
|
+
export { strapi } from "./strapi.ts";
|
|
60
|
+
export type { StrapiAdapter, StrapiOptions } from "./strapi.ts";
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions } from "./shared.ts";
|
|
6
|
+
import { DEFAULT_CONTENT_GLOB, sharedSourceOptionsSchema } from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link mdxRemote}. */
|
|
9
|
+
export interface MdxRemoteOptions extends SharedSourceOptions {
|
|
10
|
+
/** Explicit list of source-relative file paths to fetch from `url`. */
|
|
11
|
+
files?: string[];
|
|
12
|
+
/** Enumerate a GitHub repo subtree via the git-trees API. */
|
|
13
|
+
github?: {
|
|
14
|
+
/** Repository owner (user or org). */
|
|
15
|
+
owner: string;
|
|
16
|
+
/** Subpath within the repo. Defaults to the repo root. */
|
|
17
|
+
path?: string;
|
|
18
|
+
/** Git ref (branch, tag, or SHA). Defaults to `main`. */
|
|
19
|
+
ref?: string;
|
|
20
|
+
/** Repository name. */
|
|
21
|
+
repo: string;
|
|
22
|
+
};
|
|
23
|
+
/** Glob patterns applied to enumerated refs. Defaults to `["**\/*.{md,mdx}"]`. */
|
|
24
|
+
include?: string[];
|
|
25
|
+
/** Raw base URL, e.g. `https://raw.githubusercontent.com/acme/sdk/main/docs`. */
|
|
26
|
+
url?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const mdxRemoteOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
30
|
+
files: z.array(z.string()).optional(),
|
|
31
|
+
github: z
|
|
32
|
+
.strictObject({
|
|
33
|
+
owner: z.string(),
|
|
34
|
+
path: z.string().default(""),
|
|
35
|
+
ref: z.string().default("main"),
|
|
36
|
+
repo: z.string(),
|
|
37
|
+
})
|
|
38
|
+
.optional(),
|
|
39
|
+
include: z.array(z.string()).default([DEFAULT_CONTENT_GLOB]),
|
|
40
|
+
url: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export type MdxRemoteAdapter = AdapterDescriptor<
|
|
44
|
+
"mdx-remote",
|
|
45
|
+
MdxRemoteOptions
|
|
46
|
+
>;
|
|
47
|
+
|
|
48
|
+
export const mdxRemoteAdapterSchema = adapterDescriptorSchema(
|
|
49
|
+
"mdx-remote",
|
|
50
|
+
mdxRemoteOptionsSchema
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// The hosts the source ever sends `GITHUB_TOKEN` to (the same set the fetch
|
|
54
|
+
// in core/sources/mdx-remote.ts checks), so only an adapter reading from
|
|
55
|
+
// GitHub declares the variable.
|
|
56
|
+
const GITHUB_HOSTS = new Set(["api.github.com", "raw.githubusercontent.com"]);
|
|
57
|
+
|
|
58
|
+
const readsFromGithub = (options: MdxRemoteOptions): boolean =>
|
|
59
|
+
options.github !== undefined ||
|
|
60
|
+
(options.url !== undefined &&
|
|
61
|
+
URL.canParse(options.url) &&
|
|
62
|
+
GITHUB_HOSTS.has(new URL(options.url).hostname));
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Remote Markdown/MDX fetched over HTTP. Enumerate files explicitly against a
|
|
66
|
+
* raw `url` base, or from a GitHub repo subtree via `github`. A private repo's
|
|
67
|
+
* token comes from `GITHUB_TOKEN` — never inline it here. The adapter declares
|
|
68
|
+
* the variable only when it reads from GitHub, since a `url` on any other host
|
|
69
|
+
* is never sent the token.
|
|
70
|
+
*/
|
|
71
|
+
export const mdxRemote = (options: MdxRemoteOptions): MdxRemoteAdapter => ({
|
|
72
|
+
kind: "mdx-remote",
|
|
73
|
+
options,
|
|
74
|
+
requiredSecrets: readsFromGithub(options) ? ["GITHUB_TOKEN"] : [],
|
|
75
|
+
runtimeDeps: [],
|
|
76
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions } from "./shared.ts";
|
|
6
|
+
import { sharedSourceOptionsSchema } from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link notion}. */
|
|
9
|
+
export interface NotionOptions extends SharedSourceOptions {
|
|
10
|
+
/** Max concurrent Notion API requests; default 3 (Notion's per-integration pace). */
|
|
11
|
+
concurrency?: number;
|
|
12
|
+
/** Notion database id. */
|
|
13
|
+
database: string;
|
|
14
|
+
/** Notion property names mapped onto Blume meta. */
|
|
15
|
+
properties?: {
|
|
16
|
+
/** Property holding the page description. */
|
|
17
|
+
description?: string;
|
|
18
|
+
/** Property holding the sort order. */
|
|
19
|
+
order?: string;
|
|
20
|
+
/** Property holding the page slug. */
|
|
21
|
+
slug?: string;
|
|
22
|
+
/** Property holding the publish status. */
|
|
23
|
+
status?: string;
|
|
24
|
+
/** Property holding the page title. */
|
|
25
|
+
title?: string;
|
|
26
|
+
};
|
|
27
|
+
/** Status value treated as published; others map to `draft`. Defaults to `Published`. */
|
|
28
|
+
publishedValue?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const notionOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
32
|
+
concurrency: z.number().positive().optional(),
|
|
33
|
+
database: z.string(),
|
|
34
|
+
properties: z
|
|
35
|
+
.strictObject({
|
|
36
|
+
description: z.string().optional(),
|
|
37
|
+
order: z.string().optional(),
|
|
38
|
+
slug: z.string().optional(),
|
|
39
|
+
status: z.string().optional(),
|
|
40
|
+
title: z.string().optional(),
|
|
41
|
+
})
|
|
42
|
+
.optional(),
|
|
43
|
+
publishedValue: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export type NotionAdapter = AdapterDescriptor<"notion", NotionOptions>;
|
|
47
|
+
|
|
48
|
+
export const notionAdapterSchema = adapterDescriptorSchema(
|
|
49
|
+
"notion",
|
|
50
|
+
notionOptionsSchema
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A Notion database; pages become entries, blocks become MDX. `@notionhq/client`
|
|
55
|
+
* is the declared runtime dependency, and the integration token comes from
|
|
56
|
+
* `NOTION_TOKEN`.
|
|
57
|
+
*/
|
|
58
|
+
export const notion = (options: NotionOptions): NotionAdapter => ({
|
|
59
|
+
kind: "notion",
|
|
60
|
+
options,
|
|
61
|
+
requiredSecrets: ["NOTION_TOKEN"],
|
|
62
|
+
runtimeDeps: ["@notionhq/client"],
|
|
63
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions } from "./shared.ts";
|
|
6
|
+
import { sharedSourceOptionsSchema } from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
/** Options for {@link obsidian}. */
|
|
9
|
+
export interface ObsidianOptions extends SharedSourceOptions {
|
|
10
|
+
/** Vault folder names to skip at any depth, in addition to dot-folders. */
|
|
11
|
+
exclude?: string[];
|
|
12
|
+
/** Vault directory, absolute or relative to the project root. */
|
|
13
|
+
vault: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const obsidianOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
17
|
+
exclude: z.array(z.string()).optional(),
|
|
18
|
+
vault: z.string().min(1),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type ObsidianAdapter = AdapterDescriptor<"obsidian", ObsidianOptions>;
|
|
22
|
+
|
|
23
|
+
export const obsidianAdapterSchema = adapterDescriptorSchema(
|
|
24
|
+
"obsidian",
|
|
25
|
+
obsidianOptionsSchema
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* An Obsidian vault, read in place. Wikilinks become route links and
|
|
30
|
+
* `%%comments%%` are stripped at load time, so the vault stays the source of
|
|
31
|
+
* truth — no export step and no generated notes in the repo.
|
|
32
|
+
*/
|
|
33
|
+
export const obsidian = (options: ObsidianOptions): ObsidianAdapter => ({
|
|
34
|
+
kind: "obsidian",
|
|
35
|
+
options,
|
|
36
|
+
requiredSecrets: [],
|
|
37
|
+
runtimeDeps: [],
|
|
38
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import type { AdapterDescriptor } from "../core/adapter.ts";
|
|
4
|
+
import { adapterDescriptorSchema } from "../core/adapter.ts";
|
|
5
|
+
import type { SharedSourceOptions, SourceFieldMap } from "./shared.ts";
|
|
6
|
+
import {
|
|
7
|
+
queryParamsSchema,
|
|
8
|
+
sharedSourceOptionsSchema,
|
|
9
|
+
sourceFieldMapSchema,
|
|
10
|
+
} from "./shared.ts";
|
|
11
|
+
|
|
12
|
+
/** Options for {@link payload}. */
|
|
13
|
+
export interface PayloadOptions extends SharedSourceOptions {
|
|
14
|
+
/**
|
|
15
|
+
* The auth-enabled collection the API key belongs to. Defaults to `users`;
|
|
16
|
+
* it names the scheme in the `Authorization` header (`users API-Key <key>`).
|
|
17
|
+
*/
|
|
18
|
+
authCollection?: string;
|
|
19
|
+
/** The collection slug whose documents become pages. */
|
|
20
|
+
collection: string;
|
|
21
|
+
/** Relationship depth to populate. Defaults to `1`, enough for upload URLs. */
|
|
22
|
+
depth?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Field paths mapping a document onto Blume meta + body. Defaults to
|
|
25
|
+
* `title` / `description` / `slug` / `content` / `updatedAt`.
|
|
26
|
+
*/
|
|
27
|
+
fields?: SourceFieldMap;
|
|
28
|
+
/** Extra query parameters for the collection request (`"where[status][equals]": "live"`). */
|
|
29
|
+
params?: Record<string, string>;
|
|
30
|
+
/** The Payload app's origin (`https://cms.acme.dev`); its REST API is at `/api`. */
|
|
31
|
+
url: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const payloadOptionsSchema = sharedSourceOptionsSchema.extend({
|
|
35
|
+
authCollection: z.string().optional(),
|
|
36
|
+
collection: z.string(),
|
|
37
|
+
depth: z.number().int().nonnegative().optional(),
|
|
38
|
+
fields: sourceFieldMapSchema.optional(),
|
|
39
|
+
params: queryParamsSchema.optional(),
|
|
40
|
+
url: z.string(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export type PayloadAdapter = AdapterDescriptor<"payload", PayloadOptions>;
|
|
44
|
+
|
|
45
|
+
export const payloadAdapterSchema = adapterDescriptorSchema(
|
|
46
|
+
"payload",
|
|
47
|
+
payloadOptionsSchema
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A Payload collection read through its REST API; Lexical bodies become
|
|
52
|
+
* Markdown. The API key comes from `PAYLOAD_API_KEY`, and `--preview` reads
|
|
53
|
+
* drafts. Nothing to install: the adapter speaks the REST API directly.
|
|
54
|
+
*/
|
|
55
|
+
export const payload = (options: PayloadOptions): PayloadAdapter => ({
|
|
56
|
+
kind: "payload",
|
|
57
|
+
options,
|
|
58
|
+
requiredSecrets: ["PAYLOAD_API_KEY"],
|
|
59
|
+
runtimeDeps: [],
|
|
60
|
+
});
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import { contentful, contentfulAdapterSchema } from "./contentful.ts";
|
|
4
|
+
import type { ContentfulAdapter } from "./contentful.ts";
|
|
5
|
+
import { custom, customAdapterSchema } from "./custom.ts";
|
|
6
|
+
import type { CustomAdapter } from "./custom.ts";
|
|
7
|
+
import { filesystem, filesystemAdapterSchema } from "./filesystem.ts";
|
|
8
|
+
import type { FilesystemAdapter } from "./filesystem.ts";
|
|
9
|
+
import {
|
|
10
|
+
githubReleases,
|
|
11
|
+
githubReleasesAdapterSchema,
|
|
12
|
+
} from "./github-releases.ts";
|
|
13
|
+
import type { GithubReleasesAdapter } from "./github-releases.ts";
|
|
14
|
+
import { mdxRemote, mdxRemoteAdapterSchema } from "./mdx-remote.ts";
|
|
15
|
+
import type { MdxRemoteAdapter } from "./mdx-remote.ts";
|
|
16
|
+
import { notion, notionAdapterSchema } from "./notion.ts";
|
|
17
|
+
import type { NotionAdapter } from "./notion.ts";
|
|
18
|
+
import { obsidian, obsidianAdapterSchema } from "./obsidian.ts";
|
|
19
|
+
import type { ObsidianAdapter } from "./obsidian.ts";
|
|
20
|
+
import { payload, payloadAdapterSchema } from "./payload.ts";
|
|
21
|
+
import type { PayloadAdapter } from "./payload.ts";
|
|
22
|
+
import { sanity, sanityAdapterSchema } from "./sanity.ts";
|
|
23
|
+
import type { SanityAdapter } from "./sanity.ts";
|
|
24
|
+
import { strapi, strapiAdapterSchema } from "./strapi.ts";
|
|
25
|
+
import type { StrapiAdapter } from "./strapi.ts";
|
|
26
|
+
|
|
27
|
+
/** Every descriptor a `blume/sources` factory can return. */
|
|
28
|
+
export type AnySourceAdapter =
|
|
29
|
+
| FilesystemAdapter
|
|
30
|
+
| MdxRemoteAdapter
|
|
31
|
+
| GithubReleasesAdapter
|
|
32
|
+
| SanityAdapter
|
|
33
|
+
| NotionAdapter
|
|
34
|
+
| ContentfulAdapter
|
|
35
|
+
| PayloadAdapter
|
|
36
|
+
| StrapiAdapter
|
|
37
|
+
| ObsidianAdapter
|
|
38
|
+
| CustomAdapter;
|
|
39
|
+
|
|
40
|
+
/** Every adapter identity. */
|
|
41
|
+
export type SourceAdapterKind = AnySourceAdapter["kind"];
|
|
42
|
+
|
|
43
|
+
/** One variant per public adapter factory. */
|
|
44
|
+
const adapterVariants = [
|
|
45
|
+
filesystemAdapterSchema,
|
|
46
|
+
mdxRemoteAdapterSchema,
|
|
47
|
+
githubReleasesAdapterSchema,
|
|
48
|
+
sanityAdapterSchema,
|
|
49
|
+
notionAdapterSchema,
|
|
50
|
+
contentfulAdapterSchema,
|
|
51
|
+
payloadAdapterSchema,
|
|
52
|
+
strapiAdapterSchema,
|
|
53
|
+
obsidianAdapterSchema,
|
|
54
|
+
customAdapterSchema,
|
|
55
|
+
] as const;
|
|
56
|
+
|
|
57
|
+
const sourceAdapterUnion = z.discriminatedUnion("kind", adapterVariants);
|
|
58
|
+
|
|
59
|
+
/** What a public factory returns, as the config schema accepts it. */
|
|
60
|
+
export type SourceAdapterInput = z.input<typeof sourceAdapterUnion>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* A validated descriptor: the adapter's options with their defaults applied
|
|
64
|
+
* (a `filesystem()` entry always carries `root`/`include`/`exclude`), and the
|
|
65
|
+
* metadata lists re-derived from the factory so every consumer reads the
|
|
66
|
+
* `runtimeDeps` and `requiredSecrets` this version of Blume ships.
|
|
67
|
+
*/
|
|
68
|
+
export type ContentSourceAdapter = z.output<typeof sourceAdapterUnion>;
|
|
69
|
+
|
|
70
|
+
/** The factory name the 1.x `type` discriminator maps to, for the hint below. */
|
|
71
|
+
const FACTORY_FOR_TYPE = new Map([
|
|
72
|
+
["custom", "custom"],
|
|
73
|
+
["filesystem", "filesystem"],
|
|
74
|
+
["github-releases", "githubReleases"],
|
|
75
|
+
["mdx-remote", "mdxRemote"],
|
|
76
|
+
["notion", "notion"],
|
|
77
|
+
["obsidian", "obsidian"],
|
|
78
|
+
["sanity", "sanity"],
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
const FACTORIES_HINT =
|
|
82
|
+
'content.sources takes adapters imported from "blume/sources" — filesystem({ root }), mdxRemote({ github }), githubReleases({ owner, repo }), sanity({ projectId, dataset, query }), notion({ database }), contentful({ space, contentType }), payload({ url, collection }), strapi({ url, contentType }), obsidian({ vault }), or custom(source).';
|
|
83
|
+
|
|
84
|
+
const ARRAY_HINT = `content.sources is a list of adapters — e.g. \`sources: [filesystem({ root: "docs" }), githubReleases({ owner, repo, prefix: "changelog" })]\`, imported from "blume/sources".`;
|
|
85
|
+
|
|
86
|
+
const isObjectLike = (value: unknown): value is object =>
|
|
87
|
+
typeof value === "object" && value !== null;
|
|
88
|
+
|
|
89
|
+
/** The 1.x object form's discriminator, when an entry carries one. */
|
|
90
|
+
const legacyEntrySchema = z.looseObject({ type: z.string() });
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The message for an entry that is not a descriptor. A 1.x `{ type: "…" }`
|
|
94
|
+
* object names the factory that replaces it, so the fix is a rename plus
|
|
95
|
+
* moving the remaining fields into the call.
|
|
96
|
+
*/
|
|
97
|
+
const entryHint = (type: string | undefined): string => {
|
|
98
|
+
if (type === undefined) {
|
|
99
|
+
return FACTORIES_HINT;
|
|
100
|
+
}
|
|
101
|
+
const factory = FACTORY_FOR_TYPE.get(type);
|
|
102
|
+
if (!factory) {
|
|
103
|
+
return `${FACTORIES_HINT} The 1.x { type: "${type}" } object form was removed.`;
|
|
104
|
+
}
|
|
105
|
+
const call =
|
|
106
|
+
type === "custom"
|
|
107
|
+
? "custom(source) with the source you passed as `source`"
|
|
108
|
+
: `${factory}({ … }) with the other fields as its options`;
|
|
109
|
+
return `${FACTORIES_HINT} The 1.x { type: "${type}", … } object was removed: replace it with ${call}.`;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Validates a descriptor a factory returned and resolves it to the canonical
|
|
114
|
+
* form, so a descriptor that went through JSON (or was edited by hand)
|
|
115
|
+
* resolves to the same metadata Blume ships.
|
|
116
|
+
*/
|
|
117
|
+
export const resolvedSourceAdapterSchema = sourceAdapterUnion.transform(
|
|
118
|
+
(value): ContentSourceAdapter => {
|
|
119
|
+
switch (value.kind) {
|
|
120
|
+
case "filesystem": {
|
|
121
|
+
return { ...filesystem(value.options), options: value.options };
|
|
122
|
+
}
|
|
123
|
+
case "github-releases": {
|
|
124
|
+
return { ...githubReleases(value.options), options: value.options };
|
|
125
|
+
}
|
|
126
|
+
case "mdx-remote": {
|
|
127
|
+
return { ...mdxRemote(value.options), options: value.options };
|
|
128
|
+
}
|
|
129
|
+
case "notion": {
|
|
130
|
+
return { ...notion(value.options), options: value.options };
|
|
131
|
+
}
|
|
132
|
+
case "contentful": {
|
|
133
|
+
return { ...contentful(value.options), options: value.options };
|
|
134
|
+
}
|
|
135
|
+
case "payload": {
|
|
136
|
+
return { ...payload(value.options), options: value.options };
|
|
137
|
+
}
|
|
138
|
+
case "strapi": {
|
|
139
|
+
return { ...strapi(value.options), options: value.options };
|
|
140
|
+
}
|
|
141
|
+
case "obsidian": {
|
|
142
|
+
return { ...obsidian(value.options), options: value.options };
|
|
143
|
+
}
|
|
144
|
+
case "sanity": {
|
|
145
|
+
return { ...sanity(value.options), options: value.options };
|
|
146
|
+
}
|
|
147
|
+
default: {
|
|
148
|
+
// Only `custom` is left, and TypeScript has narrowed `value` to it.
|
|
149
|
+
// It returns after the switch rather than from a last case block:
|
|
150
|
+
// Bun 1.4.0's line coverage never credits the closing brace of a
|
|
151
|
+
// switch's final block, which would fail the 100% gate in CI.
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return custom(value.options);
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* One `content.sources` entry. Anything without a `kind` — the 1.x `{ type }`
|
|
161
|
+
* object, a string, `null` — fails here with the factory hint instead of the
|
|
162
|
+
* union's opaque "invalid discriminator" message.
|
|
163
|
+
*/
|
|
164
|
+
const sourceEntrySchema = z
|
|
165
|
+
.custom<SourceAdapterInput>(
|
|
166
|
+
(value) => isObjectLike(value) && "kind" in value,
|
|
167
|
+
{
|
|
168
|
+
error: (issue) => {
|
|
169
|
+
const legacy = legacyEntrySchema.safeParse(issue.input);
|
|
170
|
+
return entryHint(legacy.success ? legacy.data.type : undefined);
|
|
171
|
+
},
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
.pipe(resolvedSourceAdapterSchema);
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* `content.sources`: the adapters to read, in order. A non-array (the 1.x
|
|
178
|
+
* object form, say) fails with the list hint; entry errors keep their own.
|
|
179
|
+
*/
|
|
180
|
+
export const contentSourcesSchema = z.array(sourceEntrySchema, {
|
|
181
|
+
error: (issue) => (issue.code === "invalid_type" ? ARRAY_HINT : undefined),
|
|
182
|
+
});
|