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
|
@@ -16,31 +16,31 @@ import {
|
|
|
16
16
|
applyPlan,
|
|
17
17
|
readExistingPackage,
|
|
18
18
|
nextSteps
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-dm4mg9bj.js";
|
|
20
20
|
import"./chunk-zccbjcj0.js";
|
|
21
|
-
import"./chunk-
|
|
21
|
+
import"./chunk-1rkxzg3n.js";
|
|
22
22
|
import {
|
|
23
23
|
commandMeta,
|
|
24
24
|
logger
|
|
25
25
|
} from "./index.js";
|
|
26
|
-
import"./chunk-
|
|
27
|
-
import"./chunk-
|
|
28
|
-
import"./chunk-
|
|
29
|
-
import"./chunk-
|
|
30
|
-
import"./chunk-
|
|
26
|
+
import"./chunk-8f8xw4x2.js";
|
|
27
|
+
import"./chunk-2nr29y95.js";
|
|
28
|
+
import"./chunk-as09pafp.js";
|
|
29
|
+
import"./chunk-a3ydrqny.js";
|
|
30
|
+
import"./chunk-w6e455pz.js";
|
|
31
31
|
import"./chunk-jq5n4avg.js";
|
|
32
|
-
import"./chunk-
|
|
33
|
-
import"./chunk-
|
|
34
|
-
import {
|
|
35
|
-
eject
|
|
36
|
-
} from "./chunk-k3gr1nm9.js";
|
|
32
|
+
import"./chunk-96snx8yy.js";
|
|
33
|
+
import"./chunk-dmx6cezx.js";
|
|
37
34
|
import {
|
|
38
35
|
updatePackageScripts
|
|
39
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-wehv26ry.js";
|
|
37
|
+
import {
|
|
38
|
+
eject
|
|
39
|
+
} from "./chunk-fqy4n3q2.js";
|
|
40
40
|
import {
|
|
41
41
|
installDependencies
|
|
42
|
-
} from "./chunk-
|
|
43
|
-
import"./chunk-
|
|
42
|
+
} from "./chunk-vnbvhgmd.js";
|
|
43
|
+
import"./chunk-79bzzkx4.js";
|
|
44
44
|
|
|
45
45
|
// src/cli/commands/init.ts
|
|
46
46
|
import * as clack from "@clack/prompts";
|
|
@@ -331,5 +331,5 @@ export {
|
|
|
331
331
|
initCommand
|
|
332
332
|
};
|
|
333
333
|
|
|
334
|
-
//# debugId=
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
334
|
+
//# debugId=7A664C611E6C031464756E2164756E21
|
|
335
|
+
//# sourceMappingURL=chunk-frk2wdq1.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli/commands/init.ts", "../src/cli/init/questions.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import * as clack from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { resolve } from \"pathe\";\n\nimport { ensureGitignore } from \"../../core/gitignore.ts\";\nimport { eject } from \"../../registry/eject.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { updatePackageScripts } from \"../eject-scripts.ts\";\nimport { installDependencies } from \"../init/install.ts\";\nimport { collectAnswers } from \"../init/questions.ts\";\nimport {\n applyPlan,\n buildPlan,\n cdCommand,\n commandsFor,\n detectPackageManager,\n nextSteps,\n outsidePnpmWorkspace,\n PACKAGE_MANAGERS,\n readExistingPackage,\n TEMPLATES,\n validateContentDir,\n workspaceNote,\n} from \"../init/scaffold.ts\";\nimport type { InitAnswers } from \"../init/scaffold.ts\";\nimport { logger } from \"../log.ts\";\n\n/** The `cd` line that opens every next-steps hint, when one is needed. */\nconst cdStep = (answers: InitAnswers): string[] =>\n answers.directory === \".\" ? [] : [cdCommand(answers.directory)];\n\n/**\n * Install the scaffolded project's dependencies. Interactive runs hide the\n * package manager's output behind a spinner; `--yes`/CI runs stream it. On\n * failure the scaffold is left intact and the exact retry command is printed\n * before exiting non-zero, so a CI wrapper can tell the two outcomes apart.\n */\nconst installScaffold = async (\n root: string,\n answers: InitAnswers,\n interactive: boolean\n): Promise<void> => {\n const command = commandsFor(answers.packageManager).install;\n const spinner = interactive ? clack.spinner() : undefined;\n if (spinner) {\n spinner.start(`Installing dependencies (${command})`);\n } else {\n logger.info(`Installing dependencies (${command})…`);\n }\n const outcome = await installDependencies(root, answers.packageManager, {\n quiet: interactive,\n });\n if (outcome.failure === undefined) {\n if (spinner) {\n spinner.stop(\"Installed dependencies\");\n } else {\n logger.success(\"Installed dependencies\");\n }\n return;\n }\n const retry = [...cdStep(answers), command];\n const hint = `Project created successfully, but dependency installation failed.\\n\\nRetry with:\\n\\n ${retry.join(\"\\n \")}\\n`;\n if (spinner) {\n spinner.stop(\"Dependency installation failed\");\n clack.log.error(outcome.failure);\n clack.note(hint.trimEnd());\n clack.outro(\"Scaffolded without dependencies.\");\n } else {\n logger.error(outcome.failure);\n logger.box(hint.trimEnd());\n }\n process.exit(1);\n};\n\n/**\n * Eject the freshly scaffolded project, or print the install-then-eject path.\n * Eject jiti-loads the scaffolded blume.config.ts, whose `import { defineConfig }\n * from \"blume\"` only resolves once dependencies are installed (or blume is\n * hoisted from an ancestor node_modules, as in a monorepo) — so the fallback\n * below is the common path when the install step was skipped.\n */\nconst ejectScaffold = async (\n root: string,\n answers: InitAnswers,\n needsInstall: boolean\n): Promise<void> => {\n const commands = commandsFor(answers.packageManager);\n const cd = cdStep(answers);\n const install = needsInstall ? [commands.install] : [];\n try {\n const { dependencies } = await eject(root);\n // The scaffolded scripts point at the Blume CLI; the ejected app runs\n // Astro directly (mirroring the standalone `blume eject` command).\n const added = await updatePackageScripts(root, dependencies);\n logger.success(\"Ejected to a standalone Astro project.\");\n // The packages eject added aren't installed yet, even when the scaffold's\n // own install already ran, so install comes first either way.\n const ejectInstall = added.length > 0 ? [commands.install] : install;\n const steps = [...cd, ...ejectInstall, commands.dev];\n logger.box(`Next steps:\\n\\n ${steps.join(\"\\n \")}`);\n } catch (error) {\n // SAFETY: eject and the script rewrite throw Error instances; only the\n // message is surfaced in the fallback hint.\n const { message } = error as Error;\n // Only a skipped install explains the failure; after an install that ran,\n // the error itself is the reason.\n logger.warn(\n needsInstall\n ? `Scaffolded, but eject needs the project's dependencies installed to load blume.config.ts: ${message}`\n : `Scaffolded, but eject failed: ${message}`\n );\n const steps = [...cd, ...install, `${commands.exec} blume eject --yes`];\n logger.box(`Next steps:\\n\\n ${steps.join(\"\\n \")}`);\n }\n};\n\n/**\n * Print the closing next steps. An existing package.json was left alone, so\n * the steps add what it lacks; a workspace `note` already printed ahead of an\n * install that ran, so it closes the steps only when the install is still the\n * user's to run.\n */\nconst printNextSteps = async (\n root: string,\n answers: InitAnswers,\n outcome: {\n createdPackage: boolean;\n interactive: boolean;\n needsInstall: boolean;\n note: string | undefined;\n }\n): Promise<void> => {\n const existing = outcome.createdPackage\n ? undefined\n : await readExistingPackage(root);\n const steps = nextSteps(\n answers,\n outcome.needsInstall,\n existing,\n outcome.needsInstall ? outcome.note : undefined\n );\n if (outcome.interactive) {\n clack.note(steps.trimEnd());\n clack.outro(\"You're all set.\");\n } else {\n // consola's box pads its content itself; a trailing newline would add\n // blank rows at the bottom.\n logger.box(steps.trimEnd());\n }\n};\n\n/**\n * Validate the enum-valued flags up front, exiting with the accepted values\n * on a typo so a bad flag never reaches the prompts.\n */\nconst resolveFlags = (args: {\n \"package-manager\"?: string;\n template?: string;\n}) => {\n const template = TEMPLATES.find((candidate) => candidate === args.template);\n if (args.template !== undefined && template === undefined) {\n logger.error(\n `Unknown template \"${args.template}\" (use ${TEMPLATES.join(\" | \")}).`\n );\n process.exit(1);\n }\n const pm = PACKAGE_MANAGERS.find(\n (candidate) => candidate === args[\"package-manager\"]\n );\n if (args[\"package-manager\"] !== undefined && pm === undefined) {\n logger.error(\n `Unknown package manager \"${args[\"package-manager\"]}\" (use ${PACKAGE_MANAGERS.join(\" | \")}).`\n );\n process.exit(1);\n }\n return { pm, template };\n};\n\nexport const initCommand = defineCommand({\n args: {\n \"content-dir\": {\n description: \"Content directory.\",\n type: \"string\",\n },\n dir: {\n description: \"Directory to scaffold into (default: current directory).\",\n required: false,\n type: \"positional\",\n },\n eject: {\n description: \"Eject to a standalone Astro project after scaffolding.\",\n type: \"boolean\",\n },\n install: {\n default: true,\n description: \"Install dependencies after scaffolding.\",\n negativeDescription: \"Skip installing dependencies after scaffolding.\",\n type: \"boolean\",\n },\n \"package-manager\": {\n description:\n \"Package manager to install with and print in the next steps (npm|pnpm|yarn|bun).\",\n type: \"string\",\n },\n template: {\n description: \"Starter template: docs | api | sdk | changelog.\",\n type: \"string\",\n },\n yes: {\n description: \"Skip prompts and scaffold with defaults.\",\n type: \"boolean\",\n },\n },\n meta: commandMeta.init,\n async run({ args }) {\n const cwd = process.cwd();\n const { pm, template } = resolveFlags(args);\n\n const interactive =\n !args.yes &&\n process.stdin.isTTY === true &&\n clack.isTTY(process.stdout) &&\n !clack.isCI();\n\n let answers: InitAnswers;\n if (interactive) {\n clack.intro(\"blume init\");\n const collected = await collectAnswers(\n clack,\n {\n contentDir: args[\"content-dir\"],\n directory: args.dir,\n packageManager: pm,\n template,\n },\n { cwd, userAgent: process.env.npm_config_user_agent }\n );\n if (collected === null) {\n clack.cancel(\"Canceled — nothing was written.\");\n process.exit(0);\n }\n answers = collected;\n } else {\n answers = {\n contentDir: args[\"content-dir\"] ?? \"docs\",\n directory: args.dir ?? \".\",\n packageManager:\n pm ?? detectPackageManager(process.env.npm_config_user_agent),\n sources: [\"filesystem\"],\n template: template ?? \"docs\",\n title: \"My Docs\",\n };\n }\n\n const root = resolve(cwd, answers.directory);\n // Interactive runs validate this inline, but an explicit --content-dir\n // flag skips that prompt, so guard here in both modes.\n if (validateContentDir(root, answers.contentDir) !== undefined) {\n logger.error(\n `Invalid --content-dir \"${answers.contentDir}\" (must be a path inside the project).`\n );\n process.exit(1);\n }\n\n const sink = interactive ? clack.log : logger;\n const env = { userAgent: process.env.npm_config_user_agent };\n const { createdPackage } = await applyPlan(\n buildPlan(root, answers, env),\n sink\n );\n // A workspace the project joins keeps its own package-manager config,\n // which `init` leaves alone; say what it still needs before installing.\n const note = workspaceNote(root, answers, env);\n\n // Keep installed dependencies, Blume's generated runtime (`.blume/`),\n // build output (`dist/`), and local secrets (`.env.local`, where every\n // missing-secret warning says to put them) out of version control.\n // Idempotent: creates `.gitignore` when absent and skips entries already\n // present (trailing-slash agnostic).\n const ignored = await ensureGitignore(root, [\n \"node_modules/\",\n \".blume/\",\n \"dist/\",\n \".env.local\",\n ]);\n if (ignored.length > 0) {\n sink.success(`Added ${ignored.join(\", \")} to .gitignore`);\n }\n\n // A newly written package.json is the only one `init` knows lists blume;\n // an existing one is left alone, and so are its dependencies. In a pnpm\n // workspace that doesn't list the folder, an install would exit 0 without\n // installing it, so that one waits until the note's change is made.\n const shouldInstall =\n createdPackage && args.install && !outsidePnpmWorkspace(root, answers);\n if (note) {\n (interactive ? clack.log : logger).warn(note);\n }\n if (shouldInstall) {\n await installScaffold(root, answers, interactive);\n }\n const needsInstall = createdPackage && !shouldInstall;\n\n if (args.eject) {\n await ejectScaffold(root, answers, needsInstall);\n return;\n }\n\n await printNextSteps(root, answers, {\n createdPackage,\n interactive,\n needsInstall,\n note,\n });\n },\n});\n",
|
|
5
|
+
"import * as clack from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { resolve } from \"pathe\";\n\nimport { ensureGitignore } from \"../../core/gitignore.ts\";\nimport { eject } from \"../../registry/eject.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { updatePackageScripts } from \"../eject-scripts.ts\";\nimport { installDependencies } from \"../init/install.ts\";\nimport { collectAnswers } from \"../init/questions.ts\";\nimport {\n applyPlan,\n buildPlan,\n cdCommand,\n commandsFor,\n detectPackageManager,\n nextSteps,\n outsidePnpmWorkspace,\n PACKAGE_MANAGERS,\n readExistingPackage,\n TEMPLATES,\n validateContentDir,\n workspaceNote,\n} from \"../init/scaffold.ts\";\nimport type { InitAnswers } from \"../init/scaffold.ts\";\nimport { logger } from \"../log.ts\";\n\n/** The `cd` line that opens every next-steps hint, when one is needed. */\nconst cdStep = (answers: InitAnswers): string[] =>\n answers.directory === \".\" ? [] : [cdCommand(answers.directory)];\n\n/**\n * Install the scaffolded project's dependencies. Interactive runs hide the\n * package manager's output behind a spinner; `--yes`/CI runs stream it. On\n * failure the scaffold is left intact and the exact retry command is printed\n * before exiting non-zero, so a CI wrapper can tell the two outcomes apart.\n */\nconst installScaffold = async (\n root: string,\n answers: InitAnswers,\n interactive: boolean\n): Promise<void> => {\n const command = commandsFor(answers.packageManager).install;\n const spinner = interactive ? clack.spinner() : undefined;\n if (spinner) {\n spinner.start(`Installing dependencies (${command})`);\n } else {\n logger.info(`Installing dependencies (${command})…`);\n }\n const outcome = await installDependencies(root, answers.packageManager, {\n quiet: interactive,\n });\n if (outcome.failure === undefined) {\n if (spinner) {\n spinner.stop(\"Installed dependencies\");\n } else {\n logger.success(\"Installed dependencies\");\n }\n return;\n }\n const retry = [...cdStep(answers), command];\n const hint = `Project created successfully, but dependency installation failed.\\n\\nRetry with:\\n\\n ${retry.join(\"\\n \")}\\n`;\n if (spinner) {\n spinner.stop(\"Dependency installation failed\");\n clack.log.error(outcome.failure);\n clack.note(hint.trimEnd());\n clack.outro(\"Scaffolded without dependencies.\");\n } else {\n logger.error(outcome.failure);\n logger.box(hint.trimEnd());\n }\n process.exit(1);\n};\n\n/**\n * Eject the freshly scaffolded project, or print the install-then-eject path.\n * Eject jiti-loads the scaffolded blume.config.ts, whose `import { defineConfig }\n * from \"blume\"` resolves to the running Blume package even before an install\n * (see `blumeModuleAliases`). When eject still fails after a skipped install,\n * the fallback below names the install as the likely fix.\n */\nconst ejectScaffold = async (\n root: string,\n answers: InitAnswers,\n needsInstall: boolean\n): Promise<void> => {\n const commands = commandsFor(answers.packageManager);\n const cd = cdStep(answers);\n const install = needsInstall ? [commands.install] : [];\n try {\n const { dependencies } = await eject(root);\n // The scaffolded scripts point at the Blume CLI; the ejected app runs\n // Astro directly (mirroring the standalone `blume eject` command).\n const added = await updatePackageScripts(root, dependencies);\n logger.success(\"Ejected to a standalone Astro project.\");\n // The packages eject added aren't installed yet, even when the scaffold's\n // own install already ran, so install comes first either way.\n const ejectInstall = added.length > 0 ? [commands.install] : install;\n const steps = [...cd, ...ejectInstall, commands.dev];\n logger.box(`Next steps:\\n\\n ${steps.join(\"\\n \")}`);\n } catch (error) {\n // SAFETY: eject and the script rewrite throw Error instances; only the\n // message is surfaced in the fallback hint.\n const { message } = error as Error;\n // Only a skipped install explains the failure; after an install that ran,\n // the error itself is the reason.\n logger.warn(\n needsInstall\n ? `Scaffolded, but eject needs the project's dependencies installed to load blume.config.ts: ${message}`\n : `Scaffolded, but eject failed: ${message}`\n );\n const steps = [...cd, ...install, `${commands.exec} blume eject --yes`];\n logger.box(`Next steps:\\n\\n ${steps.join(\"\\n \")}`);\n }\n};\n\n/**\n * Print the closing next steps. An existing package.json was left alone, so\n * the steps add what it lacks; a workspace `note` already printed ahead of an\n * install that ran, so it closes the steps only when the install is still the\n * user's to run.\n */\nconst printNextSteps = async (\n root: string,\n answers: InitAnswers,\n outcome: {\n createdPackage: boolean;\n interactive: boolean;\n needsInstall: boolean;\n note: string | undefined;\n }\n): Promise<void> => {\n const existing = outcome.createdPackage\n ? undefined\n : await readExistingPackage(root);\n const steps = nextSteps(\n answers,\n outcome.needsInstall,\n existing,\n outcome.needsInstall ? outcome.note : undefined\n );\n if (outcome.interactive) {\n clack.note(steps.trimEnd());\n clack.outro(\"You're all set.\");\n } else {\n // consola's box pads its content itself; a trailing newline would add\n // blank rows at the bottom.\n logger.box(steps.trimEnd());\n }\n};\n\n/**\n * Validate the enum-valued flags up front, exiting with the accepted values\n * on a typo so a bad flag never reaches the prompts.\n */\nconst resolveFlags = (args: {\n \"package-manager\"?: string;\n template?: string;\n}) => {\n const template = TEMPLATES.find((candidate) => candidate === args.template);\n if (args.template !== undefined && template === undefined) {\n logger.error(\n `Unknown template \"${args.template}\" (use ${TEMPLATES.join(\" | \")}).`\n );\n process.exit(1);\n }\n const pm = PACKAGE_MANAGERS.find(\n (candidate) => candidate === args[\"package-manager\"]\n );\n if (args[\"package-manager\"] !== undefined && pm === undefined) {\n logger.error(\n `Unknown package manager \"${args[\"package-manager\"]}\" (use ${PACKAGE_MANAGERS.join(\" | \")}).`\n );\n process.exit(1);\n }\n return { pm, template };\n};\n\nexport const initCommand = defineCommand({\n args: {\n \"content-dir\": {\n description: \"Content directory.\",\n type: \"string\",\n },\n dir: {\n description: \"Directory to scaffold into (default: current directory).\",\n required: false,\n type: \"positional\",\n },\n eject: {\n description: \"Eject to a standalone Astro project after scaffolding.\",\n type: \"boolean\",\n },\n install: {\n default: true,\n description: \"Install dependencies after scaffolding.\",\n negativeDescription: \"Skip installing dependencies after scaffolding.\",\n type: \"boolean\",\n },\n \"package-manager\": {\n description:\n \"Package manager to install with and print in the next steps (npm|pnpm|yarn|bun).\",\n type: \"string\",\n },\n template: {\n description: \"Starter template: docs | api | sdk | changelog.\",\n type: \"string\",\n },\n yes: {\n description: \"Skip prompts and scaffold with defaults.\",\n type: \"boolean\",\n },\n },\n meta: commandMeta.init,\n async run({ args }) {\n const cwd = process.cwd();\n const { pm, template } = resolveFlags(args);\n\n const interactive =\n !args.yes &&\n process.stdin.isTTY === true &&\n clack.isTTY(process.stdout) &&\n !clack.isCI();\n\n let answers: InitAnswers;\n if (interactive) {\n clack.intro(\"blume init\");\n const collected = await collectAnswers(\n clack,\n {\n contentDir: args[\"content-dir\"],\n directory: args.dir,\n packageManager: pm,\n template,\n },\n { cwd, userAgent: process.env.npm_config_user_agent }\n );\n if (collected === null) {\n clack.cancel(\"Canceled — nothing was written.\");\n process.exit(0);\n }\n answers = collected;\n } else {\n answers = {\n contentDir: args[\"content-dir\"] ?? \"docs\",\n directory: args.dir ?? \".\",\n packageManager:\n pm ?? detectPackageManager(process.env.npm_config_user_agent),\n sources: [\"filesystem\"],\n template: template ?? \"docs\",\n title: \"My Docs\",\n };\n }\n\n const root = resolve(cwd, answers.directory);\n // Interactive runs validate this inline, but an explicit --content-dir\n // flag skips that prompt, so guard here in both modes.\n if (validateContentDir(root, answers.contentDir) !== undefined) {\n logger.error(\n `Invalid --content-dir \"${answers.contentDir}\" (must be a path inside the project).`\n );\n process.exit(1);\n }\n\n const sink = interactive ? clack.log : logger;\n const env = { userAgent: process.env.npm_config_user_agent };\n const { createdPackage } = await applyPlan(\n buildPlan(root, answers, env),\n sink\n );\n // A workspace the project joins keeps its own package-manager config,\n // which `init` leaves alone; say what it still needs before installing.\n const note = workspaceNote(root, answers, env);\n\n // Keep installed dependencies, Blume's generated runtime (`.blume/`),\n // build output (`dist/`), and local secrets (`.env.local`, where every\n // missing-secret warning says to put them) out of version control.\n // Idempotent: creates `.gitignore` when absent and skips entries already\n // present (trailing-slash agnostic).\n const ignored = await ensureGitignore(root, [\n \"node_modules/\",\n \".blume/\",\n \"dist/\",\n \".env.local\",\n ]);\n if (ignored.length > 0) {\n sink.success(`Added ${ignored.join(\", \")} to .gitignore`);\n }\n\n // A newly written package.json is the only one `init` knows lists blume;\n // an existing one is left alone, and so are its dependencies. In a pnpm\n // workspace that doesn't list the folder, an install would exit 0 without\n // installing it, so that one waits until the note's change is made.\n const shouldInstall =\n createdPackage && args.install && !outsidePnpmWorkspace(root, answers);\n if (note) {\n (interactive ? clack.log : logger).warn(note);\n }\n if (shouldInstall) {\n await installScaffold(root, answers, interactive);\n }\n const needsInstall = createdPackage && !shouldInstall;\n\n if (args.eject) {\n await ejectScaffold(root, answers, needsInstall);\n return;\n }\n\n await printNextSteps(root, answers, {\n createdPackage,\n interactive,\n needsInstall,\n note,\n });\n },\n});\n",
|
|
6
6
|
"import { basename, resolve } from \"pathe\";\n\nimport {\n detectPackageManager,\n titleize,\n validateContentDir,\n} from \"./scaffold.ts\";\nimport type {\n InitAnswers,\n PackageManager,\n SourceKind,\n Template,\n} from \"./scaffold.ts\";\n\n/** One prompt option: value plus display label and optional hint. */\ninterface PromptOption<Value> {\n hint?: string;\n label: string;\n value: Value;\n}\n\n/**\n * The prompt surface `collectAnswers` needs — structurally satisfied by the\n * `@clack/prompts` module itself, and by plain fakes in tests. Every prompt\n * resolves to a cancel symbol when the user aborts.\n */\nexport interface Prompter {\n multiselect: (opts: {\n initialValues?: SourceKind[];\n message: string;\n options: PromptOption<SourceKind>[];\n required?: boolean;\n }) => Promise<SourceKind[] | symbol>;\n select: (opts: {\n message: string;\n options: PromptOption<Template>[];\n }) => Promise<Template | symbol>;\n text: (opts: {\n defaultValue?: string;\n initialValue?: string;\n message: string;\n placeholder?: string;\n validate?: (value: string | undefined) => string | undefined;\n }) => Promise<string | symbol>;\n}\n\n/** Flag values the user passed explicitly; each one skips its question. */\nexport interface InitFlags {\n contentDir?: string;\n directory?: string;\n packageManager?: PackageManager;\n template?: Template;\n}\n\nconst cancelled = (value: string | string[] | symbol): value is symbol =>\n typeof value === \"symbol\";\n\n/**\n * Run the interactive init flow, returning the collected answers or `null`\n * when the user cancels. All questions run before anything is written, so a\n * cancel never leaves a partial scaffold behind.\n */\nexport const collectAnswers = async (\n prompter: Prompter,\n flags: InitFlags,\n defaults: { cwd: string; userAgent?: string }\n): Promise<InitAnswers | null> => {\n const directory =\n flags.directory ??\n (await prompter.text({\n defaultValue: \".\",\n message: \"Where should we create your project?\",\n placeholder: \"./my-docs\",\n }));\n if (cancelled(directory)) {\n return null;\n }\n\n const root = resolve(defaults.cwd, directory);\n const title = await prompter.text({\n initialValue: titleize(basename(root)),\n message: \"What's your docs site called?\",\n validate: (value) =>\n value?.trim() ? undefined : \"Give your docs site a name.\",\n });\n if (cancelled(title)) {\n return null;\n }\n\n const template =\n flags.template ??\n (await prompter.select({\n message: \"Which template?\",\n options: [\n { hint: \"Markdown docs site\", label: \"docs\", value: \"docs\" },\n { hint: \"OpenAPI reference at /api\", label: \"api\", value: \"api\" },\n { hint: \"SDK docs with an install page\", label: \"sdk\", value: \"sdk\" },\n {\n hint: \"Docs plus a changelog tab\",\n label: \"changelog\",\n value: \"changelog\",\n },\n ],\n }));\n if (cancelled(template)) {\n return null;\n }\n\n const picked = await prompter.multiselect({\n initialValues: [\"filesystem\"],\n message: \"Where does your content live?\",\n options: [\n { hint: \"Local .mdx files\", label: \"filesystem\", value: \"filesystem\" },\n { hint: \"An Obsidian vault\", label: \"obsidian\", value: \"obsidian\" },\n {\n hint: \"Changelog from GitHub Releases\",\n label: \"github-releases\",\n value: \"github-releases\",\n },\n { hint: \"A Notion database\", label: \"notion\", value: \"notion\" },\n { hint: \"A Sanity dataset\", label: \"sanity\", value: \"sanity\" },\n {\n hint: \"A Contentful content type\",\n label: \"contentful\",\n value: \"contentful\",\n },\n { hint: \"A Payload collection\", label: \"payload\", value: \"payload\" },\n { hint: \"A Strapi content type\", label: \"strapi\", value: \"strapi\" },\n {\n hint: \"MDX fetched from a GitHub repo\",\n label: \"mdx-remote\",\n value: \"mdx-remote\",\n },\n ],\n required: false,\n });\n if (cancelled(picked)) {\n return null;\n }\n // No selection desugars to the implicit local source, same as the schema.\n const sources: SourceKind[] = picked.length === 0 ? [\"filesystem\"] : picked;\n\n let contentDir = flags.contentDir ?? \"docs\";\n if (flags.contentDir === undefined && sources.includes(\"filesystem\")) {\n const answer = await prompter.text({\n defaultValue: \"docs\",\n message: \"Content directory?\",\n placeholder: \"docs\",\n validate: (value) => validateContentDir(root, value || \"docs\"),\n });\n if (cancelled(answer)) {\n return null;\n }\n contentDir = answer;\n }\n\n return {\n contentDir,\n directory,\n packageManager:\n flags.packageManager ?? detectPackageManager(defaults.userAgent),\n sources,\n template,\n title,\n };\n};\n"
|
|
7
7
|
],
|
|
8
8
|
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
9
|
+
"debugId": "7A664C611E6C031464756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
AGENTS,
|
|
11
11
|
launchInstalledAgent
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-8b489v1b.js";
|
|
13
13
|
|
|
14
14
|
// src/cli/commands/migrate.ts
|
|
15
15
|
import { defineCommand } from "citty";
|
|
@@ -24,14 +24,38 @@ var MIGRATE_SOURCES = [
|
|
|
24
24
|
"fumadocs",
|
|
25
25
|
"docusaurus",
|
|
26
26
|
"starlight",
|
|
27
|
-
"nextra"
|
|
27
|
+
"nextra",
|
|
28
|
+
"vitepress",
|
|
29
|
+
"vuepress",
|
|
30
|
+
"docus",
|
|
31
|
+
"mkdocs",
|
|
32
|
+
"mdbook",
|
|
33
|
+
"fern",
|
|
34
|
+
"gitbook",
|
|
35
|
+
"redocly",
|
|
36
|
+
"readme",
|
|
37
|
+
"docsify",
|
|
38
|
+
"jekyll",
|
|
39
|
+
"github-wiki"
|
|
28
40
|
];
|
|
29
41
|
var MIGRATE_SOURCE_NAMES = {
|
|
42
|
+
docsify: "Docsify",
|
|
43
|
+
docus: "Docus",
|
|
30
44
|
docusaurus: "Docusaurus",
|
|
45
|
+
fern: "Fern",
|
|
31
46
|
fumadocs: "Fumadocs",
|
|
47
|
+
gitbook: "GitBook",
|
|
48
|
+
"github-wiki": "GitHub Wiki",
|
|
49
|
+
jekyll: "Jekyll",
|
|
50
|
+
mdbook: "mdBook",
|
|
32
51
|
mintlify: "Mintlify",
|
|
52
|
+
mkdocs: "MkDocs",
|
|
33
53
|
nextra: "Nextra",
|
|
34
|
-
|
|
54
|
+
readme: "ReadMe",
|
|
55
|
+
redocly: "Redocly",
|
|
56
|
+
starlight: "Starlight",
|
|
57
|
+
vitepress: "VitePress",
|
|
58
|
+
vuepress: "VuePress"
|
|
35
59
|
};
|
|
36
60
|
var MIGRATE_SKILL_DIR = join("skills", "blume-migrate");
|
|
37
61
|
var isMigrateSource = (value) => MIGRATE_SOURCES.some((source) => source === value);
|
|
@@ -67,7 +91,67 @@ var SIGNALS = [
|
|
|
67
91
|
source: "fumadocs"
|
|
68
92
|
},
|
|
69
93
|
{ deps: ["nextra"], source: "nextra" },
|
|
70
|
-
{ deps: ["@astrojs/starlight"], source: "starlight" }
|
|
94
|
+
{ deps: ["@astrojs/starlight"], source: "starlight" },
|
|
95
|
+
{
|
|
96
|
+
deps: ["vitepress"],
|
|
97
|
+
files: [".vitepress", "docs/.vitepress"].flatMap((dir) => ["ts", "mts", "js", "mjs"].map((ext) => `${dir}/config.${ext}`)),
|
|
98
|
+
source: "vitepress"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
deps: ["vuepress", "vuepress-vite", "vuepress-webpack"],
|
|
102
|
+
files: [
|
|
103
|
+
...[".vuepress", "docs/.vuepress"].flatMap((dir) => ["ts", "js", "mjs", "yml", "toml"].map((ext) => `${dir}/config.${ext}`)),
|
|
104
|
+
"vuepress.config.ts",
|
|
105
|
+
"vuepress.config.js",
|
|
106
|
+
"vuepress.config.mjs"
|
|
107
|
+
],
|
|
108
|
+
source: "vuepress"
|
|
109
|
+
},
|
|
110
|
+
{ deps: ["docus", "@nuxt-themes/docus"], source: "docus" },
|
|
111
|
+
{
|
|
112
|
+
files: [
|
|
113
|
+
"mkdocs.yml",
|
|
114
|
+
"mkdocs.yaml",
|
|
115
|
+
"zensical.toml",
|
|
116
|
+
"properdocs.yml",
|
|
117
|
+
"properdocs.yaml"
|
|
118
|
+
],
|
|
119
|
+
source: "mkdocs"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
files: ["book.toml", "docs/book.toml", "book/book.toml"],
|
|
123
|
+
source: "mdbook"
|
|
124
|
+
},
|
|
125
|
+
{ files: ["fern/docs.yml"], source: "fern" },
|
|
126
|
+
{
|
|
127
|
+
deps: ["honkit", "gitbook-cli"],
|
|
128
|
+
files: ["gitbook-docs.yaml", ".gitbook.yaml", ".gitbook.yml"],
|
|
129
|
+
source: "gitbook"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
deps: [
|
|
133
|
+
"@redocly/realm",
|
|
134
|
+
"@redocly/redoc",
|
|
135
|
+
"@redocly/revel",
|
|
136
|
+
"@redocly/reef",
|
|
137
|
+
"@redocly/redoc-revel",
|
|
138
|
+
"@redocly/redoc-reef",
|
|
139
|
+
"@redocly/revel-reef"
|
|
140
|
+
],
|
|
141
|
+
files: ["sidebars.yaml"],
|
|
142
|
+
source: "redocly"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
files: [
|
|
146
|
+
"docs/_order.yaml",
|
|
147
|
+
"reference/_order.yaml",
|
|
148
|
+
"recipes/_order.yaml",
|
|
149
|
+
"custom_pages/_order.yaml"
|
|
150
|
+
],
|
|
151
|
+
source: "readme"
|
|
152
|
+
},
|
|
153
|
+
{ deps: ["docsify-cli", "docsify"], source: "docsify" },
|
|
154
|
+
{ files: ["_config.yml", "docs/_config.yml"], source: "jekyll" }
|
|
71
155
|
];
|
|
72
156
|
var detectMigrateSource = async (root) => {
|
|
73
157
|
const deps = await dependencyNames(root);
|
|
@@ -83,17 +167,21 @@ var detectMigrateSource = async (root) => {
|
|
|
83
167
|
}
|
|
84
168
|
return null;
|
|
85
169
|
};
|
|
170
|
+
var URL_RULES = {
|
|
171
|
+
"github-wiki": "Keep every content page. The old wiki URLs stay on github.com and can't be redirected, so map them with the reference's route table and link stubs instead: add no `redirects`, and never push to the wiki; prepare the stubs for the user."
|
|
172
|
+
};
|
|
86
173
|
var migratePrompt = (options) => {
|
|
87
174
|
const { detected, skillDir, source, version } = options;
|
|
88
175
|
const evidence = detected && detected.source === source ? ` (detected from ${detected.evidence})` : "";
|
|
89
176
|
const sourceLine = source ? `The source is ${MIGRATE_SOURCE_NAMES[source]}${evidence}. Its exact mappings are in ${join(skillDir, "references", `${source}.md`)}.` : `The source framework wasn't detected, so inventory the repo first. If it's ${MIGRATE_SOURCES.map((id) => MIGRATE_SOURCE_NAMES[id]).join(", ")}, read that framework's file in ${join(skillDir, "references")}; otherwise follow the skill's mental model directly.`;
|
|
177
|
+
const urlRule = (source && URL_RULES[source]) ?? "Keep every page, and add a redirect for any URL that moves.";
|
|
90
178
|
return `Migrate this documentation project to Blume ${version}.
|
|
91
179
|
|
|
92
180
|
Follow the blume-migrate skill: read ${join(skillDir, "SKILL.md")} first and work through its migration workflow. Wherever the skill says \`<skill>\`, it means ${skillDir}.
|
|
93
181
|
|
|
94
182
|
${sourceLine}
|
|
95
183
|
|
|
96
|
-
Add \`blume@^${version}\` as the docs package's dependency.
|
|
184
|
+
Add \`blume@^${version}\` as the docs package's dependency. ${urlRule} Report everything you drop or approximate, and run the skill's verification steps before you finish.`;
|
|
97
185
|
};
|
|
98
186
|
|
|
99
187
|
// src/cli/commands/migrate.ts
|
|
@@ -172,5 +260,5 @@ export {
|
|
|
172
260
|
migrateCommand
|
|
173
261
|
};
|
|
174
262
|
|
|
175
|
-
//# debugId=
|
|
176
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# debugId=7221C933F227E9F464756E2164756E21
|
|
264
|
+
//# sourceMappingURL=chunk-gprwej7h.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/commands/migrate.ts", "../src/migrate/migrate.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { AGENTS, launchInstalledAgent } from \"../../audit/agent.ts\";\nimport type { AgentKind } from \"../../audit/agent.ts\";\nimport { packageRoot } from \"../../core/package-root.ts\";\nimport { getBlumeVersion } from \"../../core/version.ts\";\nimport {\n MIGRATE_SKILL_DIR,\n MIGRATE_SOURCES,\n MIGRATE_SOURCE_NAMES,\n detectMigrateSource,\n isMigrateSource,\n migratePrompt,\n} from \"../../migrate/migrate.ts\";\nimport type { MigrateSourceId } from \"../../migrate/migrate.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { reportInternalError } from \"../internal-error.ts\";\nimport { logger } from \"../log.ts\";\n\n/**\n * `blume migrate [source]` — move a docs site from another framework to Blume\n * with a coding agent. Run it through the package runner (`npx blume migrate\n * fumadocs --claude`) in the site being migrated: it names the source (or\n * detects it), then opens Claude Code or Codex on the `blume-migrate` skill\n * bundled in this package, the way `blume audit --claude` hands off its\n * findings. The judgment stays in the skill; the command is the front door.\n * Status lines go straight to stderr: consola drops info-level lines in test\n * and CI environments.\n */\nexport const migrateCommand = defineCommand({\n args: {\n claude: {\n description: \"Run the migration with Claude Code.\",\n type: \"boolean\",\n },\n codex: {\n description: \"Run the migration with Codex.\",\n type: \"boolean\",\n },\n source: {\n description: `The framework to migrate from: ${MIGRATE_SOURCES.join(\" | \")}. Detected when omitted.`,\n required: false,\n type: \"positional\",\n },\n },\n meta: commandMeta.migrate,\n async run({ args }) {\n const root = process.cwd();\n // SAFETY: AGENTS is a closed record keyed by AgentKind, so its keys are\n // exactly the agent kinds.\n const agents = (Object.keys(AGENTS) as AgentKind[]).filter(\n (kind) => args[kind]\n );\n if (agents.length > 1) {\n logger.error(\"Pass at most one of --codex or --claude.\");\n process.exit(1);\n }\n const [agent] = agents;\n if (args.source && !isMigrateSource(args.source)) {\n logger.error(\n `Unknown source \"${args.source}\" (use ${MIGRATE_SOURCES.join(\" | \")}). Leave it out to detect the framework, or to migrate from one not listed.`\n );\n process.exit(1);\n }\n\n try {\n const detected = await detectMigrateSource(root);\n const named: MigrateSourceId | null =\n args.source && isMigrateSource(args.source) ? args.source : null;\n const source = named ?? detected?.source ?? null;\n process.stderr.write(\n source\n ? ` Migrating from ${MIGRATE_SOURCE_NAMES[source]}${named ? \"\" : ` (detected from ${detected?.evidence})`}.\\n`\n : \" Couldn't detect the docs framework; the agent will inventory the repo first.\\n\"\n );\n // A named source wins, but a repo that looks like another framework is\n // worth a second look before an agent rewrites it on the wrong mappings.\n if (named && detected && detected.source !== named) {\n process.stderr.write(\n ` Warning: this looks like a ${MIGRATE_SOURCE_NAMES[detected.source]} project (${detected.evidence}); migrating from ${MIGRATE_SOURCE_NAMES[named]} as named.\\n`\n );\n }\n const skillDir = join(packageRoot(), MIGRATE_SKILL_DIR);\n\n // Without an agent flag the command is the pointer for any other agent:\n // the bundled skill's path (which lives in a throwaway cache under npx),\n // plus the install line that puts the skill where agents look for it.\n if (!agent) {\n process.stderr.write(\n ` blume migrate runs the migration with a coding agent: rerun with --codex or --claude.\\n Using another agent? Point it at ${join(skillDir, \"SKILL.md\")},\\n or install the skill where your agent looks for skills: npx skills add haydenbleasel/blume --skill blume-migrate\\n`\n );\n return;\n }\n\n const cli = AGENTS[agent];\n process.stderr.write(` Handing the migration to ${cli.name}…\\n\\n`);\n const code = await launchInstalledAgent(\n cli.bin,\n migratePrompt({\n detected,\n skillDir,\n source,\n version: getBlumeVersion(),\n })\n );\n if (code === null) {\n logger.error(\n `${cli.name} (\\`${cli.bin}\\`) was not found on PATH. Install it with \\`${cli.install}\\`.`\n );\n process.exit(1);\n }\n if (code !== 0) {\n process.exit(code);\n }\n } catch (error) {\n reportInternalError(error);\n process.exit(1);\n }\n },\n});\n",
|
|
6
|
+
"import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\n\nimport { join } from \"pathe\";\n\n/**\n * `blume migrate`'s logic, kept out of the command module so it runs (and is\n * covered) in-process. Migration is judgment work — idiomatic navigation,\n * component rewrites, what to drop — so it stays in the `blume-migrate` skill,\n * shipped inside the package; this module only names the source (from the\n * argument, or detected from the repo's own files) and writes the prompt that\n * points a coding agent at the skill and that source's mappings.\n */\n\n/** The docs frameworks the skill has a mapping reference for. */\nexport const MIGRATE_SOURCES = [\n \"mintlify\",\n \"fumadocs\",\n \"docusaurus\",\n \"starlight\",\n \"nextra\",\n \"vitepress\",\n \"vuepress\",\n \"docus\",\n \"mkdocs\",\n \"mdbook\",\n \"fern\",\n \"gitbook\",\n \"redocly\",\n \"readme\",\n \"docsify\",\n \"jekyll\",\n \"github-wiki\",\n] as const;\n\nexport type MigrateSourceId = (typeof MIGRATE_SOURCES)[number];\n\n/** Display names, for messages and the prompt. */\nexport const MIGRATE_SOURCE_NAMES: Record<MigrateSourceId, string> = {\n docsify: \"Docsify\",\n docus: \"Docus\",\n docusaurus: \"Docusaurus\",\n fern: \"Fern\",\n fumadocs: \"Fumadocs\",\n gitbook: \"GitBook\",\n \"github-wiki\": \"GitHub Wiki\",\n jekyll: \"Jekyll\",\n mdbook: \"mdBook\",\n mintlify: \"Mintlify\",\n mkdocs: \"MkDocs\",\n nextra: \"Nextra\",\n readme: \"ReadMe\",\n redocly: \"Redocly\",\n starlight: \"Starlight\",\n vitepress: \"VitePress\",\n vuepress: \"VuePress\",\n};\n\n/** The skill's directory inside the published package. */\nexport const MIGRATE_SKILL_DIR = join(\"skills\", \"blume-migrate\");\n\nexport const isMigrateSource = (value: string): value is MigrateSourceId =>\n MIGRATE_SOURCES.some((source) => source === value);\n\n/** A detected source and the file or dependency that gave it away. */\nexport interface DetectedSource {\n evidence: string;\n source: MigrateSourceId;\n}\n\n/** The slice of `package.json` detection reads. */\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\n/** Every dependency the project's `package.json` names, or none when unreadable. */\nconst dependencyNames = async (root: string): Promise<Set<string>> => {\n const path = join(root, \"package.json\");\n if (!existsSync(path)) {\n return new Set();\n }\n try {\n // SAFETY: package.json is a JSON object; only its dependency maps are read.\n const pkg = JSON.parse(await readFile(path, \"utf-8\")) as PackageJson;\n return new Set([\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ]);\n } catch {\n // A malformed package.json is the agent's to deal with; detection just\n // falls back to the other signals.\n return new Set();\n }\n};\n\n/**\n * Each source's tell, in the order the skill's workflow checks them: a config\n * file the framework owns, or a dependency only it installs. A GitHub wiki\n * clone has neither (its tell is the `.wiki.git` remote), so `github-wiki` is\n * named-only.\n */\nconst SIGNALS: {\n deps?: string[];\n files?: string[];\n source: MigrateSourceId;\n}[] = [\n { files: [\"docs.json\", \"mint.json\"], source: \"mintlify\" },\n {\n files: [\n \"docusaurus.config.ts\",\n \"docusaurus.config.js\",\n \"docusaurus.config.mjs\",\n \"docusaurus.config.cjs\",\n ],\n source: \"docusaurus\",\n },\n {\n deps: [\"fumadocs-core\", \"fumadocs-ui\", \"fumadocs-mdx\"],\n files: [\"source.config.ts\"],\n source: \"fumadocs\",\n },\n { deps: [\"nextra\"], source: \"nextra\" },\n { deps: [\"@astrojs/starlight\"], source: \"starlight\" },\n // The config usually sits in docs/.vitepress, often with the dependency in\n // docs/package.json rather than the root one.\n {\n deps: [\"vitepress\"],\n files: [\".vitepress\", \"docs/.vitepress\"].flatMap((dir) =>\n [\"ts\", \"mts\", \"js\", \"mjs\"].map((ext) => `${dir}/config.${ext}`)\n ),\n source: \"vitepress\",\n },\n // v1 also reads YAML and TOML configs; v2 also reads vuepress.config.* from\n // the directory it runs in. vuepress-vite and vuepress-webpack were the v2\n // beta wrappers.\n {\n deps: [\"vuepress\", \"vuepress-vite\", \"vuepress-webpack\"],\n files: [\n ...[\".vuepress\", \"docs/.vuepress\"].flatMap((dir) =>\n [\"ts\", \"js\", \"mjs\", \"yml\", \"toml\"].map((ext) => `${dir}/config.${ext}`)\n ),\n \"vuepress.config.ts\",\n \"vuepress.config.js\",\n \"vuepress.config.mjs\",\n ],\n source: \"vuepress\",\n },\n // The Nuxt docs theme (not Docusaurus); 1.x shipped as @nuxt-themes/docus.\n { deps: [\"docus\", \"@nuxt-themes/docus\"], source: \"docus\" },\n // MkDocs and the tools that build its projects (Zensical, ProperDocs). They\n // come after the JavaScript frameworks, so a stale mkdocs.yml doesn't win.\n {\n files: [\n \"mkdocs.yml\",\n \"mkdocs.yaml\",\n \"zensical.toml\",\n \"properdocs.yml\",\n \"properdocs.yaml\",\n ],\n source: \"mkdocs\",\n },\n // A code repo usually keeps its book in a subfolder.\n {\n files: [\"book.toml\", \"docs/book.toml\", \"book/book.toml\"],\n source: \"mdbook\",\n },\n // Not fern.config.json alone: plenty of repos run Fern only to generate SDKs.\n { files: [\"fern/docs.yml\"], source: \"fern\" },\n // Not SUMMARY.md (mdBook and HonKit books have one too) or book.json (too\n // generic a name).\n {\n deps: [\"honkit\", \"gitbook-cli\"],\n files: [\"gitbook-docs.yaml\", \".gitbook.yaml\", \".gitbook.yml\"],\n source: \"gitbook\",\n },\n // After the config-file sources, and never on redocly.yaml alone: that file\n // is just as often Redocly CLI lint config in a repo built with another\n // framework.\n {\n deps: [\n \"@redocly/realm\",\n \"@redocly/redoc\",\n \"@redocly/revel\",\n \"@redocly/reef\",\n \"@redocly/redoc-revel\",\n \"@redocly/redoc-reef\",\n \"@redocly/revel-reef\",\n ],\n files: [\"sidebars.yaml\"],\n source: \"redocly\",\n },\n // ReadMe's bi-directional Git sync; repos that only push with the rdme CLI\n // leave no tell, so those are named-only.\n {\n files: [\n \"docs/_order.yaml\",\n \"reference/_order.yaml\",\n \"recipes/_order.yaml\",\n \"custom_pages/_order.yaml\",\n ],\n source: \"readme\",\n },\n // A Docsify site is an index.html that loads the library from a CDN, so only\n // the ones with a manifest give themselves away. Not _sidebar.md: on a\n // case-insensitive filesystem it also matches a GitHub wiki's _Sidebar.md.\n { deps: [\"docsify-cli\", \"docsify\"], source: \"docsify\" },\n // Last: _config.yml is a generic name (Hexo and Jupyter Book use it too), so\n // every more specific tell wins first, and the reference says how to spot\n // the others.\n { files: [\"_config.yml\", \"docs/_config.yml\"], source: \"jekyll\" },\n];\n\n/**\n * Detect the docs framework a project is built on from its own files, or\n * null when nothing gives it away (the skill still migrates any framework,\n * working from its general model instead of a mapping reference).\n */\nexport const detectMigrateSource = async (\n root: string\n): Promise<DetectedSource | null> => {\n const deps = await dependencyNames(root);\n for (const { deps: tells = [], files = [], source } of SIGNALS) {\n const file = files.find((name) => existsSync(join(root, name)));\n if (file) {\n return { evidence: file, source };\n }\n const dep = tells.find((name) => deps.has(name));\n if (dep) {\n return { evidence: `${dep} in package.json`, source };\n }\n }\n return null;\n};\n\n/**\n * The prompt's URL rule, where a source can't follow the default: a GitHub\n * wiki's old URLs stay on github.com, where no redirect can reach them.\n */\nconst URL_RULES: Partial<Record<MigrateSourceId, string>> = {\n \"github-wiki\":\n \"Keep every content page. The old wiki URLs stay on github.com and can't be redirected, so map them with the reference's route table and link stubs instead: add no `redirects`, and never push to the wiki; prepare the stubs for the user.\",\n};\n\n/**\n * The handoff prompt: follow the skill, where its mappings for this source\n * are, and the few rules worth restating — the target version, and that no\n * page or URL is lost.\n */\nexport const migratePrompt = (options: {\n detected: DetectedSource | null;\n skillDir: string;\n source: MigrateSourceId | null;\n version: string;\n}): string => {\n const { detected, skillDir, source, version } = options;\n const evidence =\n detected && detected.source === source\n ? ` (detected from ${detected.evidence})`\n : \"\";\n const sourceLine = source\n ? `The source is ${MIGRATE_SOURCE_NAMES[source]}${evidence}. Its exact mappings are in ${join(skillDir, \"references\", `${source}.md`)}.`\n : `The source framework wasn't detected, so inventory the repo first. If it's ${MIGRATE_SOURCES.map((id) => MIGRATE_SOURCE_NAMES[id]).join(\", \")}, read that framework's file in ${join(skillDir, \"references\")}; otherwise follow the skill's mental model directly.`;\n const urlRule =\n (source && URL_RULES[source]) ??\n \"Keep every page, and add a redirect for any URL that moves.\";\n return `Migrate this documentation project to Blume ${version}.\n\nFollow the blume-migrate skill: read ${join(skillDir, \"SKILL.md\")} first and work through its migration workflow. Wherever the skill says \\`<skill>\\`, it means ${skillDir}.\n\n${sourceLine}\n\nAdd \\`blume@^${version}\\` as the docs package's dependency. ${urlRule} Report everything you drop or approximate, and run the skill's verification steps before you finish.`;\n};\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "7221C933F227E9F464756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
locateMdxFailure
|
|
4
|
+
} from "./chunk-8f8xw4x2.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/build-failure.ts
|
|
7
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
8
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "pathe";
|
|
9
|
+
import ts from "typescript";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
var buildErrorSchema = z.looseObject({
|
|
12
|
+
errors: z.array(z.instanceof(Error)).optional(),
|
|
13
|
+
id: z.string().optional(),
|
|
14
|
+
loc: z.looseObject({
|
|
15
|
+
column: z.number().optional(),
|
|
16
|
+
file: z.string().optional(),
|
|
17
|
+
line: z.number().optional()
|
|
18
|
+
}).optional()
|
|
19
|
+
});
|
|
20
|
+
var blumeErrorSchema = z.looseObject({
|
|
21
|
+
diagnostic: z.object({
|
|
22
|
+
code: z.string(),
|
|
23
|
+
column: z.number().optional(),
|
|
24
|
+
docsUrl: z.string().optional(),
|
|
25
|
+
file: z.string().optional(),
|
|
26
|
+
line: z.number().optional(),
|
|
27
|
+
message: z.string(),
|
|
28
|
+
severity: z.enum(["error", "info", "warning"]),
|
|
29
|
+
suggestion: z.string().optional()
|
|
30
|
+
})
|
|
31
|
+
});
|
|
32
|
+
var UNDEFINED_NAME = [
|
|
33
|
+
/^(?<name>[\w$]+) is not defined$/u,
|
|
34
|
+
/^Can't find variable: (?<name>[\w$]+)$/u
|
|
35
|
+
];
|
|
36
|
+
var POSITIONED = /^\d+:\d+: /u;
|
|
37
|
+
var undefinedNameDiagnostic = (name, file, site) => {
|
|
38
|
+
const escape = "show the braces as text: escape each opening brace (`\\{`) or put it in inline code";
|
|
39
|
+
const variable = site?.expression === `{{${name}}}`;
|
|
40
|
+
return {
|
|
41
|
+
code: "BLUME_MDX_UNDEFINED_NAME",
|
|
42
|
+
column: site?.column,
|
|
43
|
+
file: site?.file ?? file,
|
|
44
|
+
line: site?.line,
|
|
45
|
+
message: site?.expression ? `\`${site.expression}\` reads \`${name}\`, which isn't defined, so the page fails to render. In .mdx, \`{…}\` is a JavaScript expression.` : `\`${name}\` isn't defined, so the page fails to render. In .mdx, \`{…}\` is a JavaScript expression, and one reads it.`,
|
|
46
|
+
severity: "error",
|
|
47
|
+
suggestion: variable ? `Define \`${name}\` under \`variables\` in blume.config.ts, or ${escape}.` : `To ${escape}. For a value every page shares, define a variable in blume.config.ts and write \`{{name}}\`.`
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
var TSCONFIG_NOT_FOUND = /Tsconfig not found (?<target>\S+?)\.?$/mu;
|
|
51
|
+
var tsconfigLinksSchema = z.object({
|
|
52
|
+
extends: z.union([z.string(), z.array(z.string())]).optional(),
|
|
53
|
+
references: z.array(z.object({ path: z.string() })).optional()
|
|
54
|
+
});
|
|
55
|
+
var linkTo = (path, target) => {
|
|
56
|
+
const parsed = tsconfigLinksSchema.safeParse(ts.readConfigFile(path, ts.sys.readFile).config);
|
|
57
|
+
if (!parsed.success) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const names = (written) => {
|
|
61
|
+
const resolved = resolve(dirname(path), written);
|
|
62
|
+
return written === target || resolved === target || join(resolved, "tsconfig.json") === target;
|
|
63
|
+
};
|
|
64
|
+
const extended = [parsed.data.extends ?? []].flat().find(names);
|
|
65
|
+
if (extended !== undefined) {
|
|
66
|
+
return { key: "extends", written: extended };
|
|
67
|
+
}
|
|
68
|
+
const referenced = (parsed.data.references ?? []).map((reference) => reference.path).find(names);
|
|
69
|
+
return referenced === undefined ? undefined : { key: "references", written: referenced };
|
|
70
|
+
};
|
|
71
|
+
var tsconfigFix = ({ key, written }, name) => {
|
|
72
|
+
if (key === "references") {
|
|
73
|
+
return `Create \`${written}\` (a framework's generated tsconfig appears once its prepare or build step runs), or remove it from \`references\` in ${name}.`;
|
|
74
|
+
}
|
|
75
|
+
if (written.startsWith(".") || isAbsolute(written)) {
|
|
76
|
+
return `Restore \`${written}\`, or remove it from \`extends\` in ${name}.`;
|
|
77
|
+
}
|
|
78
|
+
const packageName = written.split("/").slice(0, written.startsWith("@") ? 2 : 1).join("/");
|
|
79
|
+
return `Install the package that provides it (\`${packageName}\`), or remove it from \`extends\` in ${name}.`;
|
|
80
|
+
};
|
|
81
|
+
var tsconfigExtendsDiagnostic = (target, root) => {
|
|
82
|
+
const found = root ? ["tsconfig.json", "jsconfig.json"].map((name) => join(root, name)).filter((path) => existsSync(path)).map((path) => ({ link: linkTo(path, target), path })).find(({ link }) => link !== undefined) : undefined;
|
|
83
|
+
const file = found?.path;
|
|
84
|
+
const { key, written } = found?.link ?? { key: "extends", written: target };
|
|
85
|
+
const line = file ? readFileSync(file, "utf-8").split(`
|
|
86
|
+
`).findIndex((text) => text.includes(JSON.stringify(written))) + 1 : 0;
|
|
87
|
+
const name = file ? basename(file) : "tsconfig.json";
|
|
88
|
+
return {
|
|
89
|
+
code: "BLUME_TSCONFIG_EXTENDS",
|
|
90
|
+
file,
|
|
91
|
+
line: line > 0 ? line : undefined,
|
|
92
|
+
message: `${file ? name : "A tsconfig.json in the project"} ${key} \`${written}\`, which can't be found. The build reads the project's ${name} to resolve imports, so it stops here.`,
|
|
93
|
+
severity: "error",
|
|
94
|
+
suggestion: tsconfigFix({ key, written }, name)
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
var missingTsconfig = (error) => (TSCONFIG_NOT_FOUND.exec(error.message) ?? (error.cause instanceof Error ? TSCONFIG_NOT_FOUND.exec(error.cause.message) : null))?.groups?.target;
|
|
98
|
+
var undefinedName = (error) => error.name === "ReferenceError" ? UNDEFINED_NAME.map((pattern) => pattern.exec(error.message)).find(Boolean)?.groups?.name : undefined;
|
|
99
|
+
var locateFailure = async (error, page, name, locate) => {
|
|
100
|
+
if (!locate) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (name) {
|
|
104
|
+
return await locate(page, { kind: "undefined-name", name });
|
|
105
|
+
}
|
|
106
|
+
return error.name === "MDXError" && !POSITIONED.test(error.message) ? await locate(page, { kind: "syntax" }) : null;
|
|
107
|
+
};
|
|
108
|
+
var failureDiagnostic = async (error, context) => {
|
|
109
|
+
const raised = blumeErrorSchema.safeParse(error);
|
|
110
|
+
if (raised.success) {
|
|
111
|
+
return raised.data.diagnostic;
|
|
112
|
+
}
|
|
113
|
+
const tsconfig = missingTsconfig(error);
|
|
114
|
+
if (tsconfig) {
|
|
115
|
+
return tsconfigExtendsDiagnostic(tsconfig, context.root);
|
|
116
|
+
}
|
|
117
|
+
const parsed = buildErrorSchema.safeParse(error);
|
|
118
|
+
const { id, loc } = parsed.success ? parsed.data : {};
|
|
119
|
+
const file = loc?.file ?? id;
|
|
120
|
+
const name = undefinedName(error);
|
|
121
|
+
const site = file?.endsWith(".mdx") ? await locateFailure(error, file, name, context.locate) : null;
|
|
122
|
+
if (file?.endsWith(".mdx") && name) {
|
|
123
|
+
return undefinedNameDiagnostic(name, file, site);
|
|
124
|
+
}
|
|
125
|
+
if (site?.diagnostic) {
|
|
126
|
+
return site.diagnostic;
|
|
127
|
+
}
|
|
128
|
+
const label = error.name === "Error" ? "" : `${error.name}: `;
|
|
129
|
+
return {
|
|
130
|
+
code: "BLUME_BUILD_FAILED",
|
|
131
|
+
column: loc?.column,
|
|
132
|
+
file,
|
|
133
|
+
line: loc?.line,
|
|
134
|
+
message: `${label}${error.message}`,
|
|
135
|
+
severity: "error"
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
var astroBuildDiagnostics = async (rejection, context = {}) => {
|
|
139
|
+
const parsed = buildErrorSchema.safeParse(rejection);
|
|
140
|
+
const failures = parsed.success ? parsed.data.errors ?? [] : [];
|
|
141
|
+
return await Promise.all((failures.length > 0 ? failures : [rejection]).map(async (failure) => await failureDiagnostic(failure, context)));
|
|
142
|
+
};
|
|
143
|
+
var buildFailureLocator = (project) => (file, failure) => {
|
|
144
|
+
const page = project.graph.pages.find((candidate) => candidate.sourcePath === file);
|
|
145
|
+
const source = project.sources.find((candidate) => candidate.name === page?.source.name);
|
|
146
|
+
return locateMdxFailure({
|
|
147
|
+
contentRoot: source?.staged ? undefined : source?.contentRoot,
|
|
148
|
+
name: relative(project.context.root, file),
|
|
149
|
+
sourcePath: file,
|
|
150
|
+
variables: project.config.variables
|
|
151
|
+
}, failure);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export { astroBuildDiagnostics, buildFailureLocator };
|
|
155
|
+
|
|
156
|
+
//# debugId=A5E390AFCF69E70164756E2164756E21
|
|
157
|
+
//# sourceMappingURL=chunk-kkrteb15.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli/build-failure.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { existsSync, readFileSync } from \"node:fs\";\n\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"pathe\";\nimport ts from \"typescript\";\nimport { z } from \"zod\";\n\nimport { locateMdxFailure } from \"../core/mdx-syntax.ts\";\nimport type { MdxFailure, MdxFailureSite } from \"../core/mdx-syntax.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/**\n * The fields of an `astro build` rejection the report reads. Rolldown bundles\n * every plugin failure (an MDX compile error, say) into one error whose\n * `errors` holds each; a failure carries `loc` where the compiler pinned it,\n * or only `id`, the module that failed.\n */\nconst buildErrorSchema = z.looseObject({\n errors: z.array(z.instanceof(Error)).optional(),\n id: z.string().optional(),\n loc: z\n .looseObject({\n column: z.number().optional(),\n file: z.string().optional(),\n line: z.number().optional(),\n })\n .optional(),\n});\n\n/**\n * The diagnostic a `BlumeError` thrown inside the build carries, such as a\n * failed hosted search sync in `astro:build:done`. The hook runs Blume's\n * source rather than the CLI bundle, so its error is another copy of the class\n * that the command's `instanceof BlumeError` doesn't recognize.\n */\nconst blumeErrorSchema = z.looseObject({\n diagnostic: z.object({\n code: z.string(),\n column: z.number().optional(),\n docsUrl: z.string().optional(),\n file: z.string().optional(),\n line: z.number().optional(),\n message: z.string(),\n severity: z.enum([\"error\", \"info\", \"warning\"]),\n suggestion: z.string().optional(),\n }),\n});\n\n/**\n * Finds where in an `.mdx` page's files a failure Astro reported with no line\n * happened (see `locateMdxFailure`).\n */\nexport type MdxFailureLocator = (\n file: string,\n failure: MdxFailure\n) => Promise<MdxFailureSite | null>;\n\n/** What the report reads besides the error. */\nexport interface BuildFailureContext {\n locate?: MdxFailureLocator;\n /** The project root, where the build reads `tsconfig.json`. */\n root?: string;\n}\n\n// The message for a name nothing defines, in V8 (Node) and JavaScriptCore (Bun).\nconst UNDEFINED_NAME = [\n /^(?<name>[\\w$]+) is not defined$/u,\n /^Can't find variable: (?<name>[\\w$]+)$/u,\n];\n// A compiler message that opens with where it failed.\nconst POSITIONED = /^\\d+:\\d+: /u;\n\n/**\n * A `{…}` expression in an `.mdx` page that reads a name nothing defines: the\n * page compiles, then throws while it renders. Placed at the expression when\n * the page (or a partial it includes) shows where.\n */\nconst undefinedNameDiagnostic = (\n name: string,\n file: string,\n site: MdxFailureSite | null\n): Diagnostic => {\n const escape =\n \"show the braces as text: escape each opening brace (`\\\\{`) or put it in inline code\";\n // `{{name}}` is a Blume variable the site doesn't define.\n const variable = site?.expression === `{{${name}}}`;\n return {\n code: \"BLUME_MDX_UNDEFINED_NAME\",\n column: site?.column,\n file: site?.file ?? file,\n line: site?.line,\n message: site?.expression\n ? `\\`${site.expression}\\` reads \\`${name}\\`, which isn't defined, so the page fails to render. In .mdx, \\`{…}\\` is a JavaScript expression.`\n : `\\`${name}\\` isn't defined, so the page fails to render. In .mdx, \\`{…}\\` is a JavaScript expression, and one reads it.`,\n severity: \"error\",\n suggestion: variable\n ? `Define \\`${name}\\` under \\`variables\\` in blume.config.ts, or ${escape}.`\n : `To ${escape}. For a value every page shares, define a variable in blume.config.ts and write \\`{{name}}\\`.`,\n };\n};\n\n// Vite's message for an `extends` or `references` entry it can't resolve. It\n// names an `extends` package as written, and a path resolved.\nconst TSCONFIG_NOT_FOUND = /Tsconfig not found (?<target>\\S+?)\\.?$/mu;\n\nconst tsconfigLinksSchema = z.object({\n extends: z.union([z.string(), z.array(z.string())]).optional(),\n references: z.array(z.object({ path: z.string() })).optional(),\n});\n\n/** An entry in a tsconfig's `extends` or `references`, as written. */\ninterface TsconfigLink {\n key: \"extends\" | \"references\";\n written: string;\n}\n\n/**\n * The `extends` or `references` entry in the tsconfig at `path` that names\n * `target`: written as is, or resolved from the tsconfig's folder (a\n * reference can name a folder, which means its `tsconfig.json`).\n */\nconst linkTo = (path: string, target: string): TsconfigLink | undefined => {\n const parsed = tsconfigLinksSchema.safeParse(\n ts.readConfigFile(path, ts.sys.readFile).config\n );\n if (!parsed.success) {\n return undefined;\n }\n const names = (written: string): boolean => {\n const resolved = resolve(dirname(path), written);\n return (\n written === target ||\n resolved === target ||\n join(resolved, \"tsconfig.json\") === target\n );\n };\n const extended = [parsed.data.extends ?? []].flat().find(names);\n if (extended !== undefined) {\n return { key: \"extends\", written: extended };\n }\n const referenced = (parsed.data.references ?? [])\n .map((reference) => reference.path)\n .find(names);\n return referenced === undefined\n ? undefined\n : { key: \"references\", written: referenced };\n};\n\n/** How to fix a tsconfig entry that doesn't resolve. */\nconst tsconfigFix = ({ key, written }: TsconfigLink, name: string): string => {\n if (key === \"references\") {\n return `Create \\`${written}\\` (a framework's generated tsconfig appears once its prepare or build step runs), or remove it from \\`references\\` in ${name}.`;\n }\n if (written.startsWith(\".\") || isAbsolute(written)) {\n return `Restore \\`${written}\\`, or remove it from \\`extends\\` in ${name}.`;\n }\n const packageName = written\n .split(\"/\")\n .slice(0, written.startsWith(\"@\") ? 2 : 1)\n .join(\"/\");\n return `Install the package that provides it (\\`${packageName}\\`), or remove it from \\`extends\\` in ${name}.`;\n};\n\n/**\n * An `extends` or `references` entry in the project's `tsconfig.json` that\n * doesn't resolve: Vite reads that file while it builds the site, so the\n * build fails in `astro sync` before any page compiles. Placed at the entry's\n * line when the project's own tsconfig names the target.\n */\nconst tsconfigExtendsDiagnostic = (\n target: string,\n root: string | undefined\n): Diagnostic => {\n const found = root\n ? [\"tsconfig.json\", \"jsconfig.json\"]\n .map((name) => join(root, name))\n .filter((path) => existsSync(path))\n .map((path) => ({ link: linkTo(path, target), path }))\n .find(({ link }) => link !== undefined)\n : undefined;\n const file = found?.path;\n const { key, written } = found?.link ?? { key: \"extends\", written: target };\n const line = file\n ? readFileSync(file, \"utf-8\")\n .split(\"\\n\")\n .findIndex((text) => text.includes(JSON.stringify(written))) + 1\n : 0;\n const name = file ? basename(file) : \"tsconfig.json\";\n return {\n code: \"BLUME_TSCONFIG_EXTENDS\",\n file,\n line: line > 0 ? line : undefined,\n message: `${file ? name : \"A tsconfig.json in the project\"} ${key} \\`${written}\\`, which can't be found. The build reads the project's ${name} to resolve imports, so it stops here.`,\n severity: \"error\",\n suggestion: tsconfigFix({ key, written }, name),\n };\n};\n\n/** The `extends` target an unresolvable tsconfig names, if `error` is that. */\nconst missingTsconfig = (error: Error): string | undefined =>\n (\n TSCONFIG_NOT_FOUND.exec(error.message) ??\n // `astro sync` wraps the resolver's error in its own.\n (error.cause instanceof Error\n ? TSCONFIG_NOT_FOUND.exec(error.cause.message)\n : null)\n )?.groups?.target;\n\n/** The name a render error says nothing defines, if it says that. */\nconst undefinedName = (error: Error): string | undefined =>\n error.name === \"ReferenceError\"\n ? UNDEFINED_NAME.map((pattern) => pattern.exec(error.message)).find(Boolean)\n ?.groups?.name\n : undefined;\n\n/**\n * Where in an `.mdx` page's files a failure the compiler didn't place\n * happened: a render error the page threw, or a compile error in a partial it\n * includes, which the compiler pins on the page with no `line:column:` in its\n * message. (Bun stamps a `line` of its own on every error, so `loc` can't\n * tell.)\n */\nconst locateFailure = async (\n error: Error,\n page: string,\n name: string | undefined,\n locate: MdxFailureLocator | undefined\n): Promise<MdxFailureSite | null> => {\n if (!locate) {\n return null;\n }\n if (name) {\n return await locate(page, { kind: \"undefined-name\", name });\n }\n return error.name === \"MDXError\" && !POSITIONED.test(error.message)\n ? await locate(page, { kind: \"syntax\" })\n : null;\n};\n\n/** One failure as a diagnostic at the file (and position) it names. */\nconst failureDiagnostic = async (\n error: Error,\n context: BuildFailureContext\n): Promise<Diagnostic> => {\n const raised = blumeErrorSchema.safeParse(error);\n if (raised.success) {\n return raised.data.diagnostic;\n }\n const tsconfig = missingTsconfig(error);\n if (tsconfig) {\n return tsconfigExtendsDiagnostic(tsconfig, context.root);\n }\n const parsed = buildErrorSchema.safeParse(error);\n const { id, loc } = parsed.success ? parsed.data : {};\n const file = loc?.file ?? id;\n const name = undefinedName(error);\n const site = file?.endsWith(\".mdx\")\n ? await locateFailure(error, file, name, context.locate)\n : null;\n if (file?.endsWith(\".mdx\") && name) {\n return undefinedNameDiagnostic(name, file, site);\n }\n if (site?.diagnostic) {\n return site.diagnostic;\n }\n // A named error (`MDXError`, `CompilerError`) says which step failed.\n const label = error.name === \"Error\" ? \"\" : `${error.name}: `;\n return {\n code: \"BLUME_BUILD_FAILED\",\n column: loc?.column,\n file,\n line: loc?.line,\n message: `${label}${error.message}`,\n severity: \"error\",\n };\n};\n\n/**\n * What `astro build` rejected with, as build diagnostics: one per failure\n * Rolldown collected, else the error itself. A page Blume's own checks pass\n * can still fail Astro's compile (MDX that doesn't parse) or render, and that\n * is a problem in the site, reported at its file, rather than an internal\n * error blaming Blume.\n */\nexport const astroBuildDiagnostics = async (\n rejection: Error,\n context: BuildFailureContext = {}\n): Promise<Diagnostic[]> => {\n const parsed = buildErrorSchema.safeParse(rejection);\n const failures = parsed.success ? (parsed.data.errors ?? []) : [];\n return await Promise.all(\n (failures.length > 0 ? failures : [rejection]).map(\n async (failure) => await failureDiagnostic(failure, context)\n )\n );\n};\n\n/**\n * The locator a build uses: the failing page's source, read with the includes\n * and variables the scan resolved for it.\n */\nexport const buildFailureLocator =\n (\n project: Pick<BlumeProject, \"config\" | \"context\" | \"graph\" | \"sources\">\n ): MdxFailureLocator =>\n (file, failure) => {\n const page = project.graph.pages.find(\n (candidate) => candidate.sourcePath === file\n );\n const source = project.sources.find(\n (candidate) => candidate.name === page?.source.name\n );\n return locateMdxFailure(\n {\n contentRoot: source?.staged ? undefined : source?.contentRoot,\n name: relative(project.context.root, file),\n sourcePath: file,\n variables: project.config.variables,\n },\n failure\n );\n };\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "A5E390AFCF69E70164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-dm4mg9bj.js";
|
|
5
5
|
import"./chunk-zccbjcj0.js";
|
|
6
6
|
import {
|
|
7
7
|
commandMeta,
|
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
reportDiagnostics
|
|
12
12
|
} from "./index.js";
|
|
13
13
|
import"./chunk-jq5n4avg.js";
|
|
14
|
-
import"./chunk-
|
|
14
|
+
import"./chunk-8f8xw4x2.js";
|
|
15
15
|
import {
|
|
16
16
|
CutError,
|
|
17
17
|
cutVersion
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-p8zg3a2h.js";
|
|
19
19
|
|
|
20
20
|
// src/cli/commands/version.ts
|
|
21
21
|
import { defineCommand } from "citty";
|
|
@@ -88,4 +88,4 @@ export {
|
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
//# debugId=86F69482E9E3E55264756E2164756E21
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
91
|
+
//# sourceMappingURL=chunk-mrvh4c88.js.map
|
|
@@ -8,15 +8,15 @@ import {
|
|
|
8
8
|
VERSION_ID,
|
|
9
9
|
VERSION_LIKE,
|
|
10
10
|
versionizeRoute
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-dm4mg9bj.js";
|
|
12
|
+
import {
|
|
13
|
+
isWithin,
|
|
14
|
+
scanProject
|
|
15
|
+
} from "./chunk-8f8xw4x2.js";
|
|
12
16
|
import {
|
|
13
17
|
mountBasePath,
|
|
14
18
|
stripBasePath
|
|
15
19
|
} from "./chunk-zccbjcj0.js";
|
|
16
|
-
import {
|
|
17
|
-
isWithin,
|
|
18
|
-
scanProject
|
|
19
|
-
} from "./chunk-0pmb4tr4.js";
|
|
20
20
|
|
|
21
21
|
// src/core/version-cut.ts
|
|
22
22
|
import { existsSync } from "node:fs";
|
|
@@ -279,5 +279,5 @@ var cutVersion = async (root, id, options = {}) => {
|
|
|
279
279
|
|
|
280
280
|
export { CutError, unregisteredSnapshotDiagnostics, cutVersion };
|
|
281
281
|
|
|
282
|
-
//# debugId=
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
282
|
+
//# debugId=1864DE871652686F64756E2164756E21
|
|
283
|
+
//# sourceMappingURL=chunk-p8zg3a2h.js.map
|