blume 2.1.3 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +126 -0
- package/README.md +4 -4
- package/dist/cli/{chunk-74wfhv79.js → chunk-05f21r8h.js} +1 -1
- package/dist/cli/{chunk-9qzgg6mj.js → chunk-1cm0h819.js} +3 -3
- package/dist/cli/{chunk-nbyvgnnm.js → chunk-1rkxzg3n.js} +104 -47
- package/dist/cli/chunk-1rkxzg3n.js.map +36 -0
- package/dist/cli/{chunk-desvm72z.js → chunk-2nr29y95.js} +22 -26
- package/dist/cli/chunk-2nr29y95.js.map +13 -0
- package/dist/cli/{chunk-32khwcb6.js → chunk-49r370mb.js} +42 -69
- package/dist/cli/{chunk-32khwcb6.js.map → chunk-49r370mb.js.map} +9 -10
- package/dist/cli/{chunk-ms9z66nz.js → chunk-4rftmttv.js} +2 -2
- package/dist/cli/{chunk-s0bdnc7v.js → chunk-79bzzkx4.js} +5 -4
- package/dist/cli/chunk-79bzzkx4.js.map +10 -0
- package/dist/cli/{chunk-hvcxng5f.js → chunk-7tekknev.js} +6 -6
- package/dist/cli/{chunk-dv2z0rzf.js → chunk-8b489v1b.js} +38 -13
- package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-8b489v1b.js.map} +5 -4
- package/dist/cli/{chunk-0pmb4tr4.js → chunk-8f8xw4x2.js} +1195 -222
- package/dist/cli/chunk-8f8xw4x2.js.map +44 -0
- package/dist/cli/chunk-96snx8yy.js +329 -0
- package/dist/cli/chunk-96snx8yy.js.map +13 -0
- package/dist/cli/{chunk-ckrcm08h.js → chunk-a3ydrqny.js} +48 -62
- package/dist/cli/{chunk-ckrcm08h.js.map → chunk-a3ydrqny.js.map} +4 -5
- package/dist/cli/{chunk-bxwhtvw8.js → chunk-ahc5gc9h.js} +5 -5
- package/dist/cli/{chunk-dpy8qdjf.js → chunk-as09pafp.js} +73 -182
- package/dist/cli/chunk-as09pafp.js.map +18 -0
- package/dist/cli/{chunk-tfycddbt.js → chunk-bjk964fp.js} +2 -2
- package/dist/cli/{chunk-gfc5fqvf.js → chunk-br0n8n3e.js} +18 -18
- package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-br0n8n3e.js.map} +1 -1
- package/dist/cli/{chunk-297ajdcv.js → chunk-c69tw29j.js} +6 -6
- package/dist/cli/{chunk-297ajdcv.js.map → chunk-c69tw29j.js.map} +3 -3
- package/dist/cli/chunk-cn3dy3hz.js +146 -0
- package/dist/cli/chunk-cn3dy3hz.js.map +11 -0
- package/dist/cli/{chunk-124fvmzq.js → chunk-dm4mg9bj.js} +11064 -8742
- package/dist/cli/{chunk-124fvmzq.js.map → chunk-dm4mg9bj.js.map} +78 -64
- package/dist/cli/{chunk-dqhg54mr.js → chunk-dmx6cezx.js} +1 -1
- package/dist/cli/{chunk-60hz265r.js → chunk-dpcahcrb.js} +24 -11
- package/dist/cli/chunk-dpcahcrb.js.map +10 -0
- package/dist/cli/{chunk-a57yh0h9.js → chunk-dyk3r7jw.js} +7 -7
- package/dist/cli/{chunk-a57yh0h9.js.map → chunk-dyk3r7jw.js.map} +1 -1
- package/dist/cli/{chunk-twy7psdz.js → chunk-enk76qd5.js} +14 -10
- package/dist/cli/chunk-enk76qd5.js.map +10 -0
- package/dist/cli/{chunk-k3gr1nm9.js → chunk-fqy4n3q2.js} +13 -16
- package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-fqy4n3q2.js.map} +3 -3
- package/dist/cli/{chunk-sc93apfs.js → chunk-frk2wdq1.js} +17 -17
- package/dist/cli/{chunk-sc93apfs.js.map → chunk-frk2wdq1.js.map} +2 -2
- package/dist/cli/{chunk-kdpzw38a.js → chunk-gprwej7h.js} +95 -7
- package/dist/cli/chunk-gprwej7h.js.map +11 -0
- package/dist/cli/chunk-kkrteb15.js +157 -0
- package/dist/cli/chunk-kkrteb15.js.map +10 -0
- package/dist/cli/{chunk-ave1wcbr.js → chunk-m9bp2hc1.js} +1 -1
- package/dist/cli/{chunk-58bt3hag.js → chunk-mrvh4c88.js} +4 -4
- package/dist/cli/{chunk-5cmts6dv.js → chunk-p8zg3a2h.js} +7 -7
- package/dist/cli/{chunk-5cmts6dv.js.map → chunk-p8zg3a2h.js.map} +1 -1
- package/dist/cli/{chunk-0w6hs479.js → chunk-rkqae7kh.js} +30 -18
- package/dist/cli/chunk-rkqae7kh.js.map +10 -0
- package/dist/cli/{chunk-bqxaqn5p.js → chunk-t5xx74rd.js} +8 -8
- package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-t5xx74rd.js.map} +1 -1
- package/dist/cli/{chunk-1f882900.js → chunk-th0pgaj5.js} +2 -2
- package/dist/cli/{chunk-dhwtqnnd.js → chunk-vnbvhgmd.js} +2 -2
- package/dist/cli/{chunk-gxtg6ed2.js → chunk-vzy9rh6y.js} +21 -21
- package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-vzy9rh6y.js.map} +3 -3
- package/dist/cli/{chunk-j1x92mx9.js → chunk-w6e455pz.js} +1 -1
- package/dist/cli/chunk-wehv26ry.js +155 -0
- package/dist/cli/chunk-wehv26ry.js.map +11 -0
- package/dist/cli/{chunk-y4msrwm9.js → chunk-xgq4eytj.js} +15 -15
- package/dist/cli/{chunk-36bxs9c7.js → chunk-xt0qvz1t.js} +27 -23
- package/dist/cli/chunk-xt0qvz1t.js.map +10 -0
- package/dist/cli/index.js +78 -42
- package/dist/cli/index.js.map +7 -6
- package/dist/types/ai/changelog-components.d.ts +18 -0
- package/dist/types/ai/changelog-markdown.d.ts +12 -0
- package/dist/types/ai/openapi-components.d.ts +7 -7
- package/dist/types/ai/operation-details.d.ts +39 -0
- package/dist/types/ai/relative-links.d.ts +3 -1
- package/dist/types/ai/serializers.d.ts +6 -4
- package/dist/types/analytics/head.d.ts +4 -2
- package/dist/types/analytics/script.d.ts +8 -2
- package/dist/types/components/content/youtube.d.ts +20 -0
- package/dist/types/components/layout/nav-utils.d.ts +8 -0
- package/dist/types/components/openapi/example-panels.d.ts +33 -0
- package/dist/types/components/openapi/helpers.d.ts +53 -11
- package/dist/types/components/openapi/snippets.d.ts +7 -1
- package/dist/types/core/alert-diagnostics.d.ts +10 -0
- package/dist/types/core/builtin-tags.d.ts +16 -0
- package/dist/types/core/changelog-list.d.ts +48 -0
- package/dist/types/core/closest-match.d.ts +6 -0
- package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
- package/dist/types/core/code-fences.d.ts +8 -1
- package/dist/types/core/config-input.d.ts +1 -1
- package/dist/types/core/content-assets.d.ts +16 -18
- package/dist/types/core/diagnostics.d.ts +14 -0
- package/dist/types/core/directive-diagnostics.d.ts +22 -8
- package/dist/types/core/former-routes.d.ts +14 -0
- package/dist/types/core/github.d.ts +5 -4
- package/dist/types/core/heading-markers.d.ts +65 -2
- package/dist/types/core/hidden-pages.d.ts +3 -0
- package/dist/types/core/includes.d.ts +23 -0
- package/dist/types/core/last-modified.d.ts +18 -6
- package/dist/types/core/links.d.ts +42 -2
- package/dist/types/core/load-module.d.ts +19 -4
- package/dist/types/core/manifest.d.ts +14 -1
- package/dist/types/core/markdown-mirrors.d.ts +22 -0
- package/dist/types/core/mdx-elements.d.ts +32 -0
- package/dist/types/core/mdx-syntax.d.ts +100 -0
- package/dist/types/core/meta-diagnostics.d.ts +7 -0
- package/dist/types/core/meta.d.ts +32 -5
- package/dist/types/core/nav-diagnostics.d.ts +9 -2
- package/dist/types/core/navigation.d.ts +13 -0
- package/dist/types/core/ordering-prefix.d.ts +6 -0
- package/dist/types/core/pinned-ids.d.ts +23 -0
- package/dist/types/core/project-graph.d.ts +9 -1
- package/dist/types/core/redirect-patterns.d.ts +18 -0
- package/dist/types/core/relative-files.d.ts +31 -0
- package/dist/types/core/schema.d.ts +267 -7
- package/dist/types/core/sources/normalize.d.ts +101 -9
- package/dist/types/core/sources/types.d.ts +16 -0
- package/dist/types/core/static-files.d.ts +10 -0
- package/dist/types/core/static-host.d.ts +42 -0
- package/dist/types/core/svg-images.d.ts +26 -0
- package/dist/types/core/syntax-diagnostics.d.ts +14 -0
- package/dist/types/core/types.d.ts +42 -1
- package/dist/types/deploy/generated-files.d.ts +41 -0
- package/dist/types/deploy/redirects.d.ts +21 -7
- package/dist/types/markdown/code-title.d.ts +9 -5
- package/dist/types/markdown/directives.d.ts +8 -0
- package/dist/types/markdown/fence-language.d.ts +51 -0
- package/dist/types/markdown/fence-meta.d.ts +5 -0
- package/dist/types/markdown/github-alerts.d.ts +35 -0
- package/dist/types/openapi/asyncapi.d.ts +6 -5
- package/dist/types/openapi/checks.d.ts +10 -5
- package/dist/types/openapi/model.d.ts +55 -8
- package/dist/types/openapi/parse.d.ts +4 -1
- package/dist/types/sources/filesystem.d.ts +14 -4
- package/dist/types/sources/mdx-remote.d.ts +6 -3
- package/dist/types/sources/registry.d.ts +3 -3
- package/dist/types/theme/color.d.ts +33 -0
- package/dist/types/theme/palette.d.ts +122 -0
- package/docs/01-quickstart.mdx +1 -1
- package/docs/02-deployment.mdx +23 -8
- package/docs/04-migrating.mdx +16 -4
- package/docs/advanced/changelog.mdx +27 -1
- package/docs/advanced/skills.mdx +1 -1
- package/docs/cli/audit.mdx +1 -1
- package/docs/cli/doctor.mdx +2 -2
- package/docs/cli/evals.mdx +1 -1
- package/docs/cli/index.mdx +4 -2
- package/docs/cli/validate.mdx +10 -7
- package/docs/configuration/analytics.mdx +2 -0
- package/docs/configuration/customization.mdx +3 -1
- package/docs/configuration/index.mdx +2 -2
- package/docs/configuration/theming.mdx +5 -1
- package/docs/content/components.mdx +26 -6
- package/docs/content/frontmatter.mdx +1 -1
- package/docs/content/includes.mdx +6 -2
- package/docs/content/index.mdx +11 -1
- package/docs/content/islands.mdx +2 -0
- package/docs/content/meta.mdx +9 -3
- package/docs/content/navigation.mdx +14 -6
- package/docs/content/sources/obsidian.mdx +1 -1
- package/docs/content/sources/remote-mdx.mdx +3 -1
- package/docs/content/syntax.mdx +76 -8
- package/docs/content/variables.mdx +3 -1
- package/docs/discoverability/agent-discovery.mdx +1 -1
- package/docs/discoverability/json-api.mdx +1 -1
- package/docs/discoverability/llms-txt.mdx +1 -1
- package/docs/discoverability/markdown.mdx +2 -2
- package/docs/discoverability/open-graph.mdx +1 -1
- package/docs/discoverability/sitemap-and-robots.mdx +1 -1
- package/docs/references/graphql.mdx +2 -0
- package/docs/references/openapi.mdx +45 -7
- package/package.json +4 -4
- package/skills/blume/SKILL.md +2 -2
- package/skills/blume-migrate/SKILL.md +49 -27
- package/skills/blume-migrate/references/docsify.md +262 -0
- package/skills/blume-migrate/references/docus.md +298 -0
- package/skills/blume-migrate/references/docusaurus.md +3 -3
- package/skills/blume-migrate/references/fern.md +327 -0
- package/skills/blume-migrate/references/fumadocs.md +1 -1
- package/skills/blume-migrate/references/gitbook.md +267 -0
- package/skills/blume-migrate/references/github-wiki.md +259 -0
- package/skills/blume-migrate/references/jekyll.md +253 -0
- package/skills/blume-migrate/references/mdbook.md +256 -0
- package/skills/blume-migrate/references/mintlify.md +5 -5
- package/skills/blume-migrate/references/mkdocs.md +236 -0
- package/skills/blume-migrate/references/monorepo.md +20 -8
- package/skills/blume-migrate/references/nextra.md +2 -2
- package/skills/blume-migrate/references/readme.md +257 -0
- package/skills/blume-migrate/references/redocly.md +198 -0
- package/skills/blume-migrate/references/starlight.md +3 -3
- package/skills/blume-migrate/references/vitepress.md +204 -0
- package/skills/blume-migrate/references/vuepress.md +271 -0
- package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
- package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
- package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
- package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
- package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
- package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
- package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
- package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
- package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
- package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
- package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
- package/src/ai/changelog-components.ts +24 -0
- package/src/ai/changelog-markdown.ts +45 -41
- package/src/ai/component-markdown.ts +22 -9
- package/src/ai/llms.ts +36 -5
- package/src/ai/markdown.ts +2 -2
- package/src/ai/openapi-components.ts +25 -9
- package/src/ai/operation-details.ts +208 -0
- package/src/ai/relative-links.ts +48 -8
- package/src/ai/serializers.ts +7 -6
- package/src/ai/site-skill.ts +6 -2
- package/src/analytics/head.ts +11 -5
- package/src/analytics/script.ts +13 -3
- package/src/astro/generate.ts +32 -6
- package/src/astro/index.ts +1 -0
- package/src/astro/integration.ts +27 -1
- package/src/astro/mdx-source-errors.ts +46 -0
- package/src/astro/templates.ts +89 -185
- package/src/audit/checks/redirects.ts +5 -1
- package/src/audit/redirects.ts +36 -19
- package/src/audit/report.ts +22 -9
- package/src/audit/run.ts +12 -28
- package/src/audit/terms.ts +23 -0
- package/src/audit/url.ts +2 -2
- package/src/cli/build-failure.ts +256 -7
- package/src/cli/command-meta.ts +1 -1
- package/src/cli/commands/audit.ts +1 -1
- package/src/cli/commands/build.ts +12 -3
- package/src/cli/commands/check.ts +13 -2
- package/src/cli/commands/dev.ts +1 -1
- package/src/cli/commands/doctor.ts +4 -2
- package/src/cli/commands/init.ts +3 -3
- package/src/cli/commands/preview.ts +17 -1
- package/src/cli/commands/validate.ts +22 -10
- package/src/cli/prepare.ts +1 -1
- package/src/cli/preview-pages.ts +161 -0
- package/src/cli/unknown-flags.ts +1 -42
- package/src/components/code-copy.ts +51 -0
- package/src/components/code-language.ts +75 -0
- package/src/components/content/AccordionItem.astro +16 -1
- package/src/components/content/Callout.astro +11 -1
- package/src/components/content/Changelog.astro +189 -0
- package/src/components/content/CodeBlock.astro +8 -11
- package/src/components/content/Tabs.astro +16 -2
- package/src/components/content/YouTube.astro +6 -4
- package/src/components/content/code-block.ts +33 -0
- package/src/components/content/content-strings.ts +5 -1
- package/src/components/content/inline-markdown.ts +35 -8
- package/src/components/content/youtube.ts +49 -7
- package/src/components/layout/Analytics.astro +5 -1
- package/src/components/layout/NavTree.astro +8 -3
- package/src/components/layout/RootLayout.astro +18 -31
- package/src/components/layout/nav-utils.ts +14 -0
- package/src/components/layout/search/pagefind.ts +2 -1
- package/src/components/openapi/Operation.astro +4 -0
- package/src/components/openapi/PanelTabs.astro +9 -3
- package/src/components/openapi/RequestBody.astro +42 -8
- package/src/components/openapi/RequestPanel.astro +34 -53
- package/src/components/openapi/example-panels.ts +110 -0
- package/src/components/openapi/helpers.ts +195 -20
- package/src/components/openapi/operation-model.ts +63 -26
- package/src/components/openapi/request.ts +13 -0
- package/src/components/openapi/snippets.ts +14 -2
- package/src/core/alert-diagnostics.ts +89 -0
- package/src/core/builtin-tags.ts +76 -0
- package/src/core/changelog-list.ts +87 -0
- package/src/core/closest-match.ts +41 -0
- package/src/core/code-fence-diagnostics.ts +267 -0
- package/src/core/code-fences.ts +43 -7
- package/src/core/component-diagnostics.ts +65 -12
- package/src/core/config-input.ts +1 -1
- package/src/core/config.ts +46 -1
- package/src/core/content-assets.ts +64 -144
- package/src/core/diagnostics.ts +36 -3
- package/src/core/directive-diagnostics.ts +265 -47
- package/src/core/former-routes.ts +46 -0
- package/src/core/git-ignored.ts +53 -0
- package/src/core/github.ts +5 -4
- package/src/core/heading-markers.ts +156 -2
- package/src/core/hidden-pages.ts +64 -0
- package/src/core/includes.ts +181 -41
- package/src/core/last-modified.ts +47 -10
- package/src/core/links.ts +438 -83
- package/src/core/load-module.ts +98 -9
- package/src/core/manifest.ts +12 -9
- package/src/core/markdown-mirrors.ts +52 -0
- package/src/core/mdx-elements.ts +153 -0
- package/src/core/mdx-syntax.ts +377 -0
- package/src/core/meta-diagnostics.ts +134 -0
- package/src/core/meta.ts +154 -55
- package/src/core/nav-diagnostics.ts +16 -4
- package/src/core/navigation.ts +70 -10
- package/src/core/ordering-prefix.ts +22 -2
- package/src/core/pinned-ids.ts +141 -0
- package/src/core/project-graph.ts +221 -29
- package/src/core/redirect-patterns.ts +41 -0
- package/src/core/relative-files.ts +145 -0
- package/src/core/schema.ts +17 -3
- package/src/core/sources/mdx-remote.ts +75 -14
- package/src/core/sources/normalize.ts +885 -179
- package/src/core/sources/notion.ts +5 -4
- package/src/core/sources/obsidian.ts +2 -5
- package/src/core/sources/types.ts +17 -0
- package/src/core/static-files.ts +40 -0
- package/src/core/static-host.ts +125 -0
- package/src/core/svg-images.ts +98 -0
- package/src/core/syntax-diagnostics.ts +491 -0
- package/src/core/types.ts +43 -1
- package/src/deploy/artifacts.ts +2 -28
- package/src/deploy/generated-files.ts +128 -0
- package/src/deploy/platforms/vercel.ts +25 -1
- package/src/deploy/redirects.ts +43 -16
- package/src/deploy/sitemap.ts +2 -1
- package/src/markdown/base-links.ts +87 -6
- package/src/markdown/code-title.ts +29 -13
- package/src/markdown/content-assets.ts +210 -0
- package/src/markdown/directives.ts +69 -5
- package/src/markdown/fence-language.ts +106 -0
- package/src/markdown/fence-meta.ts +42 -0
- package/src/markdown/github-alerts.ts +172 -0
- package/src/markdown/heading-anchors.ts +265 -56
- package/src/markdown/include.ts +30 -3
- package/src/markdown/index.ts +145 -40
- package/src/markdown/prompt-text.ts +95 -0
- package/src/markdown/relative-links.ts +37 -2
- package/src/markdown/route-snapshot.ts +22 -12
- package/src/markdown/svg-fallback.ts +51 -0
- package/src/markdown/title-heading.ts +134 -0
- package/src/migrate/migrate.ts +127 -2
- package/src/og/card.ts +14 -4
- package/src/openapi/asyncapi.ts +14 -6
- package/src/openapi/checks.ts +160 -15
- package/src/openapi/model.ts +172 -33
- package/src/openapi/parse.ts +13 -4
- package/src/openapi/render-mdx.ts +55 -9
- package/src/openapi/source.ts +87 -6
- package/src/registry/eject.ts +0 -1
- package/src/search/documents.ts +10 -2
- package/src/sources/filesystem.ts +28 -3
- package/src/sources/mdx-remote.ts +7 -15
- package/src/theme/color.ts +14 -0
- package/src/theme/entry.ts +22 -1
- package/src/theme/palette.ts +74 -1
- package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
- package/dist/cli/chunk-0w6hs479.js.map +0 -10
- package/dist/cli/chunk-150jk7km.js +0 -52
- package/dist/cli/chunk-150jk7km.js.map +0 -10
- package/dist/cli/chunk-36bxs9c7.js.map +0 -10
- package/dist/cli/chunk-53jqw8z0.js +0 -89
- package/dist/cli/chunk-53jqw8z0.js.map +0 -10
- package/dist/cli/chunk-60hz265r.js.map +0 -10
- package/dist/cli/chunk-desvm72z.js.map +0 -14
- package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
- package/dist/cli/chunk-es8h0v3j.js +0 -441
- package/dist/cli/chunk-es8h0v3j.js.map +0 -11
- package/dist/cli/chunk-kdpzw38a.js.map +0 -11
- package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
- package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
- package/dist/cli/chunk-twy7psdz.js.map +0 -10
- package/dist/cli/chunk-ydp3065p.js +0 -64
- package/dist/cli/chunk-ydp3065p.js.map +0 -10
- /package/dist/cli/{chunk-74wfhv79.js.map → chunk-05f21r8h.js.map} +0 -0
- /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-1cm0h819.js.map} +0 -0
- /package/dist/cli/{chunk-ms9z66nz.js.map → chunk-4rftmttv.js.map} +0 -0
- /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-7tekknev.js.map} +0 -0
- /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-ahc5gc9h.js.map} +0 -0
- /package/dist/cli/{chunk-tfycddbt.js.map → chunk-bjk964fp.js.map} +0 -0
- /package/dist/cli/{chunk-dqhg54mr.js.map → chunk-dmx6cezx.js.map} +0 -0
- /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-m9bp2hc1.js.map} +0 -0
- /package/dist/cli/{chunk-58bt3hag.js.map → chunk-mrvh4c88.js.map} +0 -0
- /package/dist/cli/{chunk-1f882900.js.map → chunk-th0pgaj5.js.map} +0 -0
- /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-vnbvhgmd.js.map} +0 -0
- /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-w6e455pz.js.map} +0 -0
- /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-xgq4eytj.js.map} +0 -0
package/src/core/load-module.ts
CHANGED
|
@@ -1,16 +1,100 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
|
|
1
4
|
import { createJiti } from "jiti";
|
|
5
|
+
import type { Jiti, JitiOptions } from "jiti";
|
|
6
|
+
import { join } from "pathe";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
import { packageRoot } from "./package-root.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Blume's own `exports` map, each entry reduced to the file it runs from: the
|
|
13
|
+
* target itself, or a conditions object's `default` (its `types` is only for
|
|
14
|
+
* the consumer's typechecker).
|
|
15
|
+
*/
|
|
16
|
+
const blumeExportsSchema = z.object({
|
|
17
|
+
exports: z.record(
|
|
18
|
+
z.string(),
|
|
19
|
+
z.union([
|
|
20
|
+
z.string(),
|
|
21
|
+
z.object({ default: z.string() }).transform((target) => target.default),
|
|
22
|
+
])
|
|
23
|
+
),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
let aliases: Record<string, string> | undefined;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* jiti aliases that resolve `blume` and every subpath it exports to the
|
|
30
|
+
* running Blume package, read from its own `exports` map. Without them a user
|
|
31
|
+
* module resolves `blume` by walking up from its own folder, so a `meta.ts`
|
|
32
|
+
* under a content root outside the project (`content.root: "../docs"`, a
|
|
33
|
+
* sibling workspace package) or a file `blume.config.ts` imports from beside
|
|
34
|
+
* the project can't find the `blume` installed in the project. A wildcard
|
|
35
|
+
* export (`./core/*`) becomes a prefix alias (`blume/core/`), which jiti
|
|
36
|
+
* extends with the rest of the specifier.
|
|
37
|
+
*/
|
|
38
|
+
export const blumeModuleAliases = (): Record<string, string> => {
|
|
39
|
+
if (!aliases) {
|
|
40
|
+
const root = packageRoot();
|
|
41
|
+
const { exports } = blumeExportsSchema.parse(
|
|
42
|
+
JSON.parse(readFileSync(join(root, "package.json"), "utf-8"))
|
|
43
|
+
);
|
|
44
|
+
aliases = Object.fromEntries(
|
|
45
|
+
Object.entries(exports).map(([subpath, target]) => [
|
|
46
|
+
join("blume", subpath).replace(/\*$/u, ""),
|
|
47
|
+
join(root, target).replace(/\*$/u, ""),
|
|
48
|
+
])
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return aliases;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* An import through one jiti instance for every file a loader is called with,
|
|
56
|
+
* created on its first call so that importing this module (the `blume` barrel
|
|
57
|
+
* reaches it through `defineConfig`) reads nothing from disk. `moduleCache:
|
|
58
|
+
* false` ensures edits are picked up on each load, which is what makes
|
|
59
|
+
* dev-server regeneration reflect config/meta changes.
|
|
60
|
+
*
|
|
61
|
+
* Each import leaves `Error.prepareStackTrace` as it found it. The first file
|
|
62
|
+
* jiti compiles loads its bundled Babel, which wraps that formatter for the
|
|
63
|
+
* whole process to hide its own frames. Under Bun the wrapper hands off to
|
|
64
|
+
* Bun's native formatter, which throws for an object that isn't a native
|
|
65
|
+
* `Error`, and Vite's bundled follow-redirects captures a stack trace on one
|
|
66
|
+
* as it loads, so importing Astro or Vite after a compiled config or meta file
|
|
67
|
+
* would crash.
|
|
68
|
+
*/
|
|
69
|
+
const lazyImport = (
|
|
70
|
+
options: JitiOptions
|
|
71
|
+
): ((file: string) => Promise<{ default?: unknown }>) => {
|
|
72
|
+
let jiti: Jiti | undefined;
|
|
73
|
+
return async (file) => {
|
|
74
|
+
jiti ??= createJiti(import.meta.url, {
|
|
75
|
+
...options,
|
|
76
|
+
alias: blumeModuleAliases(),
|
|
77
|
+
moduleCache: false,
|
|
78
|
+
});
|
|
79
|
+
const { prepareStackTrace } = Error;
|
|
80
|
+
try {
|
|
81
|
+
return await jiti.import<{ default?: unknown }>(file);
|
|
82
|
+
} finally {
|
|
83
|
+
Error.prepareStackTrace = prepareStackTrace;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
};
|
|
2
87
|
|
|
3
88
|
/**
|
|
4
89
|
* Create a loader for user-authored ESM/TS modules (`blume.config.ts`,
|
|
5
|
-
* `meta.ts`)
|
|
6
|
-
*
|
|
7
|
-
* which is what makes dev-server regeneration reflect config/meta changes.
|
|
90
|
+
* `meta.ts`), in which `blume` resolves to the running package wherever the
|
|
91
|
+
* module lives (see {@link blumeModuleAliases}).
|
|
8
92
|
*/
|
|
9
93
|
// oxlint-disable-next-line anti-slop/no-unknown-returns -- user-authored modules can export anything; callers validate the loaded value at their own boundary
|
|
10
94
|
export const createModuleLoader = (): ((file: string) => Promise<unknown>) => {
|
|
11
|
-
const
|
|
95
|
+
const load = lazyImport({});
|
|
12
96
|
return async (file: string) => {
|
|
13
|
-
const loaded = await
|
|
97
|
+
const loaded = await load(file);
|
|
14
98
|
return loaded?.default ?? loaded;
|
|
15
99
|
};
|
|
16
100
|
};
|
|
@@ -22,15 +106,20 @@ export const createModuleLoader = (): ((file: string) => Promise<unknown>) => {
|
|
|
22
106
|
* exports `null`/`undefined`, resolves to `undefined` so the caller can say
|
|
23
107
|
* so, instead of validating `{}` (a bare `defineConfig({…})` call) or
|
|
24
108
|
* `{ config }` (a named export). jiti's default interop is off because it
|
|
25
|
-
* throws on `export default null`.
|
|
109
|
+
* throws on `export default null`. Turning it off changes how jiti compiles
|
|
110
|
+
* every module the config reaches, Blume's own source included, but jiti keys
|
|
111
|
+
* its disk cache by file and source alone, so this loader keeps a cache of its
|
|
112
|
+
* own: sharing one, it would run code compiled for {@link createModuleLoader}
|
|
113
|
+
* (and that loader, code compiled for this one), whichever loaded the file
|
|
114
|
+
* first.
|
|
26
115
|
*/
|
|
27
116
|
export const createDefaultExportLoader: typeof createModuleLoader = () => {
|
|
28
|
-
const
|
|
117
|
+
const load = lazyImport({
|
|
118
|
+
fsCache: join(tmpdir(), "jiti-blume-default-export"),
|
|
29
119
|
interopDefault: false,
|
|
30
|
-
moduleCache: false,
|
|
31
120
|
});
|
|
32
121
|
return async (file: string) => {
|
|
33
|
-
const loaded = await
|
|
122
|
+
const loaded = await load(file);
|
|
34
123
|
return loaded.default ?? undefined;
|
|
35
124
|
};
|
|
36
125
|
};
|
package/src/core/manifest.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mountBasePath } from "./base-path.ts";
|
|
2
|
+
import { isHiddenPage } from "./hidden-pages.ts";
|
|
2
3
|
import { localizeRoute, resolveFallbackLocale } from "./i18n.ts";
|
|
3
4
|
import type { ResolvedConfig } from "./schema.ts";
|
|
4
5
|
import type {
|
|
@@ -52,10 +53,11 @@ export const MANIFEST_VERSION = 1;
|
|
|
52
53
|
*/
|
|
53
54
|
export const contentIndexable = (
|
|
54
55
|
page: PageRecord,
|
|
55
|
-
config: ResolvedConfig
|
|
56
|
+
config: ResolvedConfig,
|
|
57
|
+
graph: ContentGraph
|
|
56
58
|
): boolean =>
|
|
57
59
|
!page.meta.search.exclude &&
|
|
58
|
-
(!page
|
|
60
|
+
(!isHiddenPage(page, graph) || config.search.indexing.includeHiddenPages);
|
|
59
61
|
|
|
60
62
|
/**
|
|
61
63
|
* Fallback materialization: render the fallback locale's content at the
|
|
@@ -66,9 +68,10 @@ export const contentIndexable = (
|
|
|
66
68
|
/**
|
|
67
69
|
* The description a page's `<head>` emits — `seo.description` over the front
|
|
68
70
|
* matter `description` — mirrored onto its route so the OG card's subtitle
|
|
69
|
-
* matches the page's `og:description
|
|
71
|
+
* matches the page's `og:description`, and the summary page indexes like
|
|
72
|
+
* `llms.txt` give it.
|
|
70
73
|
*/
|
|
71
|
-
const
|
|
74
|
+
export const metaDescription = (page: PageRecord): string | undefined =>
|
|
72
75
|
page.meta.seo.description ?? page.description;
|
|
73
76
|
|
|
74
77
|
const buildFallbackRoutes = (
|
|
@@ -121,12 +124,12 @@ const buildFallbackRoutes = (
|
|
|
121
124
|
alternates: alternatesByKey.get(key) ?? [],
|
|
122
125
|
collection: source.collection ?? "docs",
|
|
123
126
|
contentType: source.contentType,
|
|
124
|
-
description:
|
|
127
|
+
description: metaDescription(source),
|
|
125
128
|
draft: source.meta.draft,
|
|
126
129
|
editUrl: source.editUrl,
|
|
127
130
|
entryId: source.entryId ?? source.source.ref,
|
|
128
131
|
fallback: true,
|
|
129
|
-
hidden: source
|
|
132
|
+
hidden: isHiddenPage(source, graph),
|
|
130
133
|
id: source.id,
|
|
131
134
|
indexable: false,
|
|
132
135
|
lastModified: source.lastModified,
|
|
@@ -187,13 +190,13 @@ export const buildManifest = (options: {
|
|
|
187
190
|
alternates: alternatesByKey.get(page.translationKey) ?? [],
|
|
188
191
|
collection: page.collection ?? "docs",
|
|
189
192
|
contentType: page.contentType,
|
|
190
|
-
description:
|
|
193
|
+
description: metaDescription(page),
|
|
191
194
|
draft: page.meta.draft,
|
|
192
195
|
editUrl: page.editUrl,
|
|
193
196
|
entryId: page.entryId ?? page.source.ref,
|
|
194
|
-
hidden: page
|
|
197
|
+
hidden: isHiddenPage(page, graph),
|
|
195
198
|
id: page.id,
|
|
196
|
-
indexable: searchEnabled && contentIndexable(page, config),
|
|
199
|
+
indexable: searchEnabled && contentIndexable(page, config, graph),
|
|
197
200
|
lastModified: page.lastModified,
|
|
198
201
|
locale: page.locale,
|
|
199
202
|
monolingual: page.monolingual,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { servesRoute } from "./locale-links.ts";
|
|
2
|
+
import type { RouteSet } from "./locale-links.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Where Blume serves each page's raw Markdown: a copy beside the page, named
|
|
6
|
+
* for its route (`/guide.md`, `/guide.mdx`; see `rawMarkdownEndpointTemplate`).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** The extensions every page's Markdown copies are served at. */
|
|
10
|
+
export const MIRROR_EXTENSIONS = [".md", ".mdx"] as const;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The name the root's copies are served under (`/index.md`). They always are:
|
|
14
|
+
* with no page at `/`, the llms.txt index stands in (see `buildRawMarkdown`).
|
|
15
|
+
*/
|
|
16
|
+
const ROOT_MIRROR = "/index";
|
|
17
|
+
|
|
18
|
+
/** A path naming a Markdown copy: the name it's served under, then `.md(x)`. */
|
|
19
|
+
const MIRROR_PATH = /^(?<name>\/.+)\.mdx?$/u;
|
|
20
|
+
|
|
21
|
+
/** The name a page's Markdown copies are served under, from its route. */
|
|
22
|
+
export const mirrorName = (route: string): string =>
|
|
23
|
+
route === "/" ? ROOT_MIRROR : route;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The page whose Markdown copies are served under `name`, if any are: the
|
|
27
|
+
* root's under `/index`, and a page's under its own route. `/index` is no
|
|
28
|
+
* page's route, yet it names the root's copies, so a path that isn't a page
|
|
29
|
+
* can still name a served copy.
|
|
30
|
+
*/
|
|
31
|
+
export const mirrorOwner = (
|
|
32
|
+
pages: RouteSet,
|
|
33
|
+
name: string
|
|
34
|
+
): string | undefined => {
|
|
35
|
+
if (name === ROOT_MIRROR) {
|
|
36
|
+
return "/";
|
|
37
|
+
}
|
|
38
|
+
return servesRoute(pages, name) ? name : undefined;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The page a served Markdown copy at `path` belongs to (`/guide.md` the page
|
|
43
|
+
* `/guide`'s, `/index.mdx` the root's), or `undefined` when `path` is no
|
|
44
|
+
* served copy.
|
|
45
|
+
*/
|
|
46
|
+
export const mirroredPage = (
|
|
47
|
+
pages: RouteSet,
|
|
48
|
+
path: string
|
|
49
|
+
): string | undefined => {
|
|
50
|
+
const name = MIRROR_PATH.exec(path)?.groups?.name;
|
|
51
|
+
return name === undefined ? undefined : mirrorOwner(pages, name);
|
|
52
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { Nodes } from "mdast";
|
|
2
|
+
import { mdxToMdast } from "satteri";
|
|
3
|
+
|
|
4
|
+
import { MDX_BODY_FEATURES } from "../markdown/features.ts";
|
|
5
|
+
import { BUILTIN_CHILD_PROPS } from "./builtin-tags.ts";
|
|
6
|
+
import type { ElementUse } from "./types.ts";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* JSX elements in an `.mdx` body whose props don't render as written:
|
|
10
|
+
*
|
|
11
|
+
* - `handler`: an HTML element with a JavaScript event handler
|
|
12
|
+
* (`<button onClick={() => …}>`). The page is static HTML, so the function
|
|
13
|
+
* is written into the attribute as text and never runs. A string handler
|
|
14
|
+
* (`onclick="…"`) is inline script the browser does run, and is left alone.
|
|
15
|
+
* - `prop`: a built-in that shows its children (see `BUILTIN_CHILD_PROPS`),
|
|
16
|
+
* used without any, with props it doesn't take. Those are ignored, so the
|
|
17
|
+
* element renders without the content they carry.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
type JsxElement = Extract<
|
|
21
|
+
Nodes,
|
|
22
|
+
{ type: "mdxJsxFlowElement" | "mdxJsxTextElement" }
|
|
23
|
+
>;
|
|
24
|
+
type AttributeValue = Extract<
|
|
25
|
+
JsxElement["attributes"][number],
|
|
26
|
+
{ type: "mdxJsxAttribute" }
|
|
27
|
+
>["value"];
|
|
28
|
+
type ExpressionValue = Extract<AttributeValue, { type: string }>;
|
|
29
|
+
|
|
30
|
+
/** Whether an attribute's value is a `{…}` expression, not a string or nothing. */
|
|
31
|
+
export const isExpression = (value: AttributeValue): value is ExpressionValue =>
|
|
32
|
+
typeof value === "object" && value !== null;
|
|
33
|
+
|
|
34
|
+
// An `on*` prop, and a body that may hold one with an expression value.
|
|
35
|
+
const EVENT_HANDLER = /^on[A-Z]/u;
|
|
36
|
+
const HANDLER_HINT = /\son[A-Z]\w*\s*=\s*\{/u;
|
|
37
|
+
// An expression that is only a string literal, which renders as that string.
|
|
38
|
+
const STRING_LITERAL = /^\s*(?<quote>["'`])[\s\S]*\k<quote>\s*$/u;
|
|
39
|
+
// An intrinsic element: a lowercase name, not a member like `motion.div`.
|
|
40
|
+
const HTML_ELEMENT = /^[a-z][\w-]*$/u;
|
|
41
|
+
|
|
42
|
+
// A built-in that shows its children, opened with props and either closed at
|
|
43
|
+
// once or closed with nothing between the tags. Attribute values may hold
|
|
44
|
+
// `>`, so quoted strings and one level of braces are skipped whole.
|
|
45
|
+
const CHILDLESS_HINT = new RegExp(
|
|
46
|
+
String.raw`<(?<tag>${[...BUILTIN_CHILD_PROPS.keys()].join("|")})\s(?:[^<>"'{}]|"[^"]*"|'[^']*'|\{[^{}]*\})*(?:\/>|>\s*<\/\k<tag>>)`,
|
|
47
|
+
"u"
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
/** Whether an element has nothing to show between its tags. */
|
|
51
|
+
const isChildless = (node: JsxElement): boolean =>
|
|
52
|
+
node.children.every(
|
|
53
|
+
(child) => child.type === "text" && child.value.trim() === ""
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
/** The handler props on an HTML element that hold a JavaScript value. */
|
|
57
|
+
const handlerProps = (node: JsxElement): string[] =>
|
|
58
|
+
node.attributes.flatMap((attribute) =>
|
|
59
|
+
attribute.type === "mdxJsxAttribute" &&
|
|
60
|
+
EVENT_HANDLER.test(attribute.name) &&
|
|
61
|
+
isExpression(attribute.value) &&
|
|
62
|
+
!STRING_LITERAL.test(attribute.value.value)
|
|
63
|
+
? [attribute.name]
|
|
64
|
+
: []
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The props a childless built-in gets but doesn't take. A spread
|
|
69
|
+
* (`{...props}`) could pass anything, so it counts as none; an Astro
|
|
70
|
+
* directive (`client:load`, `set:html`) isn't a prop.
|
|
71
|
+
*/
|
|
72
|
+
const unknownProps = (node: JsxElement, accepted: readonly string[]) => {
|
|
73
|
+
if (
|
|
74
|
+
!isChildless(node) ||
|
|
75
|
+
node.attributes.some((attribute) => attribute.type !== "mdxJsxAttribute")
|
|
76
|
+
) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
return node.attributes.flatMap((attribute) =>
|
|
80
|
+
attribute.type === "mdxJsxAttribute" &&
|
|
81
|
+
!attribute.name.includes(":") &&
|
|
82
|
+
!accepted.includes(attribute.name)
|
|
83
|
+
? [attribute.name]
|
|
84
|
+
: []
|
|
85
|
+
);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** What `node` carries that doesn't render as written, if anything. */
|
|
89
|
+
const elementUse = (
|
|
90
|
+
node: JsxElement,
|
|
91
|
+
lineOffset: number
|
|
92
|
+
): ElementUse | undefined => {
|
|
93
|
+
const tag = node.name ?? "";
|
|
94
|
+
const accepted = BUILTIN_CHILD_PROPS.get(tag);
|
|
95
|
+
let kind: ElementUse["kind"] = "prop";
|
|
96
|
+
let props: string[] = [];
|
|
97
|
+
if (HTML_ELEMENT.test(tag)) {
|
|
98
|
+
kind = "handler";
|
|
99
|
+
props = handlerProps(node);
|
|
100
|
+
} else if (accepted) {
|
|
101
|
+
props = unknownProps(node, accepted);
|
|
102
|
+
}
|
|
103
|
+
const start = node.position?.start;
|
|
104
|
+
return props.length > 0
|
|
105
|
+
? {
|
|
106
|
+
column: start?.column ?? 1,
|
|
107
|
+
kind,
|
|
108
|
+
line: (start?.line ?? 1) + lineOffset,
|
|
109
|
+
props,
|
|
110
|
+
tag,
|
|
111
|
+
}
|
|
112
|
+
: undefined;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Every element in an `.mdx` body whose props don't render as written (see
|
|
117
|
+
* the module comment), in source order, its line shifted by `lineOffset`. The
|
|
118
|
+
* body is parsed only when a cheap test finds a suspect, and a body MDX can't
|
|
119
|
+
* parse fails to render with its own error, so it yields none.
|
|
120
|
+
*/
|
|
121
|
+
export const extractElementUses = (
|
|
122
|
+
body: string,
|
|
123
|
+
lineOffset = 0
|
|
124
|
+
): ElementUse[] => {
|
|
125
|
+
if (!(HANDLER_HINT.test(body) || CHILDLESS_HINT.test(body))) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
let tree: Nodes;
|
|
129
|
+
try {
|
|
130
|
+
tree = mdxToMdast(body, { features: MDX_BODY_FEATURES });
|
|
131
|
+
} catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const uses: ElementUse[] = [];
|
|
135
|
+
const walk = (node: Nodes): void => {
|
|
136
|
+
if (
|
|
137
|
+
node.type === "mdxJsxFlowElement" ||
|
|
138
|
+
node.type === "mdxJsxTextElement"
|
|
139
|
+
) {
|
|
140
|
+
const use = elementUse(node, lineOffset);
|
|
141
|
+
if (use) {
|
|
142
|
+
uses.push(use);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if ("children" in node) {
|
|
146
|
+
for (const child of node.children) {
|
|
147
|
+
walk(child);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
walk(tree);
|
|
152
|
+
return uses;
|
|
153
|
+
};
|