blume 2.0.2 → 2.0.3
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/CHANGELOG.md +65 -0
- package/dist/cli/{chunk-6k4ftwze.js → chunk-1d7ve1dm.js} +1 -1
- package/dist/cli/{chunk-zp79m0ts.js → chunk-2eytanqx.js} +2 -2
- package/dist/cli/{chunk-8g8ytmgx.js → chunk-2hsdwb9n.js} +19 -19
- package/dist/cli/{chunk-8g8ytmgx.js.map → chunk-2hsdwb9n.js.map} +1 -1
- package/dist/cli/{chunk-g698a744.js → chunk-2z928egk.js} +5 -5
- package/dist/cli/{chunk-ppzjqwx2.js → chunk-35d4wj9f.js} +17 -18
- package/dist/cli/{chunk-ppzjqwx2.js.map → chunk-35d4wj9f.js.map} +3 -3
- package/dist/cli/{chunk-mqc662a6.js → chunk-364znk6q.js} +2 -2
- package/dist/cli/{chunk-gs7r695n.js → chunk-3em5wd2y.js} +21 -8
- package/dist/cli/{chunk-gs7r695n.js.map → chunk-3em5wd2y.js.map} +3 -3
- package/dist/cli/{chunk-k7pj68a8.js → chunk-5f86nr5m.js} +15 -15
- package/dist/cli/{chunk-hr8ne106.js → chunk-5m5nmvyq.js} +68 -43
- package/dist/cli/chunk-5m5nmvyq.js.map +13 -0
- package/dist/cli/{chunk-91ws1n6j.js → chunk-5xvm6tfj.js} +14 -14
- package/dist/cli/{chunk-w4bxdvsa.js → chunk-6dsbexzp.js} +14 -14
- package/dist/cli/{chunk-00gs3wqs.js → chunk-8ktnccpt.js} +1 -1
- package/dist/cli/{chunk-j85scx15.js → chunk-9t7a85s3.js} +130 -44
- package/dist/cli/chunk-9t7a85s3.js.map +10 -0
- package/dist/cli/{chunk-bbnwccaz.js → chunk-a58773jm.js} +2 -2
- package/dist/cli/{chunk-nfcyttvj.js → chunk-acanzt5p.js} +9 -9
- package/dist/cli/{chunk-nfcyttvj.js.map → chunk-acanzt5p.js.map} +1 -1
- package/dist/cli/{chunk-wdrt2k2v.js → chunk-akbpwfxc.js} +90 -26
- package/dist/cli/chunk-akbpwfxc.js.map +10 -0
- package/dist/cli/{chunk-sqw4ekg1.js → chunk-b07cmahc.js} +2 -2
- package/dist/cli/{chunk-xh43dwgw.js → chunk-c8chx29p.js} +42 -29
- package/dist/cli/{chunk-xh43dwgw.js.map → chunk-c8chx29p.js.map} +9 -9
- package/dist/cli/{chunk-7mbqtmgb.js → chunk-crgn1q09.js} +21 -12
- package/dist/cli/chunk-crgn1q09.js.map +10 -0
- package/dist/cli/chunk-e04dxsz1.js +39 -0
- package/dist/cli/chunk-e04dxsz1.js.map +10 -0
- package/dist/cli/{chunk-4e9b9ra6.js → chunk-ey84smr6.js} +3 -3
- package/dist/cli/{chunk-d1v5rhy0.js → chunk-g4hq16wv.js} +13 -13
- package/dist/cli/{chunk-273ygyr4.js → chunk-ga0pf4aj.js} +7 -7
- package/dist/cli/{chunk-273ygyr4.js.map → chunk-ga0pf4aj.js.map} +3 -3
- package/dist/cli/{chunk-pbg5a4s3.js → chunk-hm3vjy5s.js} +64 -45
- package/dist/cli/chunk-hm3vjy5s.js.map +19 -0
- package/dist/cli/{chunk-5r8g91qn.js → chunk-j85vccga.js} +306 -107
- package/dist/cli/chunk-j85vccga.js.map +36 -0
- package/dist/cli/{chunk-n1yg3tj3.js → chunk-p3v96n38.js} +6 -6
- package/dist/cli/{chunk-n1yg3tj3.js.map → chunk-p3v96n38.js.map} +3 -3
- package/dist/cli/{chunk-7vtckvaw.js → chunk-p73c0m7w.js} +14 -14
- package/dist/cli/{chunk-7vtckvaw.js.map → chunk-p73c0m7w.js.map} +1 -1
- package/dist/cli/{chunk-qkb5a8sa.js → chunk-pehfxfta.js} +3 -3
- package/dist/cli/{chunk-v6ya5kcb.js → chunk-pv29h0wf.js} +1223 -978
- package/dist/cli/{chunk-v6ya5kcb.js.map → chunk-pv29h0wf.js.map} +47 -46
- package/dist/cli/{chunk-6dtt0zfn.js → chunk-q58y5e6a.js} +10 -10
- package/dist/cli/{chunk-6dtt0zfn.js.map → chunk-q58y5e6a.js.map} +3 -3
- package/dist/cli/{chunk-fsmrqk8a.js → chunk-r20tn01b.js} +1 -1
- package/dist/cli/{chunk-bfwp9vp6.js → chunk-r9rcc4w7.js} +7 -7
- package/dist/cli/{chunk-h7k3nq3v.js → chunk-tkacnehg.js} +2 -2
- package/dist/cli/{chunk-h2ez8dzb.js → chunk-tzmab476.js} +4 -4
- package/dist/cli/{chunk-3yce002v.js → chunk-vg9r4eb9.js} +6 -6
- package/dist/cli/{chunk-3yce002v.js.map → chunk-vg9r4eb9.js.map} +4 -4
- package/dist/cli/{chunk-hqp2ajnh.js → chunk-wrr3j9w9.js} +16 -17
- package/dist/cli/{chunk-hqp2ajnh.js.map → chunk-wrr3j9w9.js.map} +7 -7
- package/dist/cli/{chunk-ddndchfr.js → chunk-yfyb25rh.js} +38 -26
- package/dist/cli/chunk-yfyb25rh.js.map +14 -0
- package/dist/cli/index.js +20 -18
- package/dist/cli/index.js.map +3 -3
- package/dist/types/ai/link-headers.d.ts +8 -1
- package/dist/types/ai/openapi-components.d.ts +5 -2
- package/dist/types/ai/relative-links.d.ts +9 -7
- package/dist/types/ai/skills.d.ts +4 -1
- package/dist/types/ai/tar.d.ts +1 -3
- package/dist/types/analytics/index.d.ts +2 -0
- package/dist/types/analytics/one-dollar-stats.d.ts +48 -0
- package/dist/types/analytics/schema.d.ts +14 -0
- package/dist/types/astro/integration.d.ts +3 -2
- package/dist/types/core/base-path.d.ts +21 -7
- package/dist/types/core/config-input.d.ts +9 -7
- package/dist/types/core/directive-diagnostics.d.ts +12 -0
- package/dist/types/core/heading-markers.d.ts +5 -7
- package/dist/types/core/i18n.d.ts +2 -0
- package/dist/types/core/last-modified.d.ts +10 -0
- package/dist/types/core/meta.d.ts +8 -0
- package/dist/types/core/schema.d.ts +7 -0
- package/dist/types/core/sources/lower.d.ts +29 -16
- package/dist/types/core/sources/normalize.d.ts +13 -1
- package/dist/types/core/sources/watch.d.ts +12 -5
- package/dist/types/core/standard-schema.d.ts +5 -0
- package/dist/types/deploy/artifacts.d.ts +6 -4
- package/dist/types/deploy/headers.d.ts +5 -0
- package/dist/types/deploy/platforms/types.d.ts +8 -0
- package/dist/types/deploy/redirects.d.ts +24 -13
- package/dist/types/markdown/directives.d.ts +62 -0
- package/dist/types/markdown/features.d.ts +21 -0
- package/dist/types/markdown/mdast.d.ts +63 -0
- package/dist/types/openapi/asyncapi.d.ts +4 -2
- package/docs/02-deployment.mdx +4 -2
- package/docs/08-faq.mdx +1 -1
- package/docs/advanced/custom-pages.mdx +3 -3
- package/docs/cli/audit.mdx +17 -1
- package/docs/cli/evals.mdx +3 -3
- package/docs/cli/translate.mdx +3 -3
- package/docs/cli/version.mdx +1 -1
- package/docs/configuration/analytics.mdx +20 -1
- package/docs/configuration/customization.mdx +2 -0
- package/docs/configuration/search.mdx +1 -1
- package/docs/content/components.mdx +1 -1
- package/docs/content/frontmatter.mdx +1 -1
- package/docs/content/i18n.mdx +2 -0
- package/docs/content/index.mdx +4 -2
- package/docs/content/islands.mdx +1 -1
- package/docs/content/meta.mdx +3 -1
- package/docs/content/sources.mdx +1 -5
- package/docs/content/syntax.mdx +14 -0
- package/docs/content/versioning.mdx +1 -1
- package/docs/discoverability/agent-discovery.mdx +1 -1
- package/docs/discoverability/index.mdx +2 -1
- package/docs/discoverability/markdown.mdx +2 -2
- package/docs/discoverability/open-graph.mdx +5 -3
- package/docs/discoverability/rss.mdx +1 -1
- package/docs/references/asyncapi.mdx +1 -1
- package/docs/references/graphql.mdx +1 -1
- package/docs/references/openapi.mdx +5 -3
- package/package.json +1 -1
- package/skills/blume-migrate/references/fumadocs.md +1 -1
- package/skills/blume-migrate/references/nextra.md +1 -1
- package/skills/blume-migrate/scripts/mintlify-codemod.mjs +7 -2
- package/src/ai/agent-readability.ts +2 -2
- package/src/ai/ai-catalog.ts +6 -2
- package/src/ai/api/handlers.ts +2 -2
- package/src/ai/api/spec.ts +2 -2
- package/src/ai/api-catalog.ts +6 -2
- package/src/ai/changelog-markdown.ts +2 -2
- package/src/ai/link-headers.ts +14 -5
- package/src/ai/llms.ts +18 -7
- package/src/ai/mcp/discovery.ts +2 -2
- package/src/ai/mcp/query.ts +2 -2
- package/src/ai/mcp/server.ts +2 -2
- package/src/ai/openapi-components.ts +22 -6
- package/src/ai/relative-links.ts +42 -26
- package/src/ai/serializers.ts +2 -1
- package/src/ai/skills.ts +14 -1
- package/src/ai/tar.ts +139 -12
- package/src/analytics/head.ts +4 -0
- package/src/analytics/index.ts +5 -0
- package/src/analytics/one-dollar-stats.ts +86 -0
- package/src/analytics/schema.ts +2 -0
- package/src/astro/generate.ts +1 -1
- package/src/astro/include-hmr.ts +31 -12
- package/src/astro/include-refresh.ts +19 -8
- package/src/astro/integration.ts +108 -14
- package/src/astro/runtime-modules.ts +28 -13
- package/src/astro/templates.ts +81 -37
- package/src/audit/checks/links.ts +8 -1
- package/src/audit/graph.ts +3 -1
- package/src/audit/run.ts +12 -9
- package/src/audit/snapshot.ts +5 -0
- package/src/cli/args.ts +32 -0
- package/src/cli/commands/audit.ts +4 -1
- package/src/cli/commands/doctor.ts +3 -1
- package/src/cli/commands/eval.ts +19 -11
- package/src/cli/commands/translate.ts +9 -12
- package/src/cli/commands/validate.ts +3 -1
- package/src/cli/dev-lock.ts +157 -37
- package/src/cli/report-format.ts +11 -6
- package/src/components/colors.ts +19 -0
- package/src/components/content/Badge.astro +5 -3
- package/src/components/content/Component.astro +2 -2
- package/src/components/content/Tab.astro +0 -1
- package/src/components/content/Tabs.astro +4 -0
- package/src/components/content/badge-color.ts +5 -2
- package/src/components/content/base-href.ts +13 -36
- package/src/components/islands/assistant.tsx +21 -4
- package/src/components/islands/base-path.ts +47 -10
- package/src/components/islands/hooks.ts +35 -19
- package/src/components/islands/webmcp.ts +4 -2
- package/src/components/layout/Breadcrumbs.astro +5 -2
- package/src/components/layout/DiscoveryLinks.astro +9 -5
- package/src/components/layout/Header.astro +2 -2
- package/src/components/layout/LanguageSwitcher.astro +2 -2
- package/src/components/layout/NavSelector.astro +2 -2
- package/src/components/layout/NavTabMenu.astro +3 -3
- package/src/components/layout/NavTree.astro +16 -6
- package/src/components/layout/PageActions.astro +4 -3
- package/src/components/layout/PageLayout.astro +7 -6
- package/src/components/layout/Pagination.astro +3 -3
- package/src/components/layout/RootLayout.astro +5 -5
- package/src/components/layout/Search.astro +33 -13
- package/src/components/layout/VersionBanner.astro +2 -2
- package/src/components/layout/analytics-client.ts +12 -0
- package/src/components/layout/toc-active.ts +41 -0
- package/src/components/layout/toc-element.ts +8 -14
- package/src/components/openapi/ApiTagOperations.astro +2 -2
- package/src/components/openapi/AsyncApiOperation.astro +7 -4
- package/src/components/openapi/GraphqlChip.astro +2 -2
- package/src/components/openapi/Operation.astro +2 -0
- package/src/components/openapi/Playground.astro +4 -4
- package/src/components/openapi/RequestPanel.astro +5 -2
- package/src/components/openapi/SchemaTable.astro +7 -0
- package/src/components/openapi/async.ts +38 -6
- package/src/components/openapi/helpers.ts +19 -9
- package/src/components/openapi/message-composer.ts +6 -1
- package/src/components/openapi/message.ts +17 -2
- package/src/components/openapi/operation-model.ts +81 -11
- package/src/components/openapi/panel.ts +4 -2
- package/src/components/openapi/param-style.ts +181 -0
- package/src/components/openapi/playground-client.ts +73 -16
- package/src/components/openapi/request.ts +190 -26
- package/src/components/openapi/schema-tree.ts +30 -24
- package/src/components/openapi/snippets.ts +85 -6
- package/src/components/openapi/ws-client.ts +18 -2
- package/src/core/base-path.ts +62 -16
- package/src/core/config-input.ts +9 -7
- package/src/core/diagnostics.ts +2 -0
- package/src/core/directive-diagnostics.ts +99 -0
- package/src/core/frontmatter.ts +21 -18
- package/src/core/heading-markers.ts +5 -18
- package/src/core/i18n.ts +31 -3
- package/src/core/last-modified.ts +25 -3
- package/src/core/locale-links.ts +5 -1
- package/src/core/meta.ts +33 -19
- package/src/core/navigation.ts +28 -8
- package/src/core/project-graph.ts +27 -5
- package/src/core/schema.ts +24 -4
- package/src/core/sources/contentful-rich-text.ts +27 -20
- package/src/core/sources/filesystem.ts +20 -2
- package/src/core/sources/github-releases.ts +25 -6
- package/src/core/sources/lexical.ts +23 -18
- package/src/core/sources/lower.ts +201 -34
- package/src/core/sources/mdx-remote.ts +51 -16
- package/src/core/sources/normalize.ts +325 -90
- package/src/core/sources/notion.ts +52 -25
- package/src/core/sources/obsidian.ts +23 -6
- package/src/core/sources/portable-text.ts +38 -21
- package/src/core/sources/strapi-blocks.ts +20 -16
- package/src/core/sources/watch.ts +20 -7
- package/src/core/standard-schema.ts +10 -6
- package/src/core/version-cut.ts +52 -15
- package/src/deploy/artifacts.ts +27 -6
- package/src/deploy/cloudflare-negotiation.ts +4 -12
- package/src/deploy/headers.ts +8 -4
- package/src/deploy/node-headers.ts +1 -1
- package/src/deploy/platforms/cloudflare.ts +12 -3
- package/src/deploy/platforms/netlify.ts +1 -0
- package/src/deploy/platforms/node.ts +1 -0
- package/src/deploy/platforms/static.ts +1 -0
- package/src/deploy/platforms/types.ts +8 -0
- package/src/deploy/platforms/vercel.ts +1 -0
- package/src/deploy/redirects.ts +54 -18
- package/src/deploy/robots.ts +2 -2
- package/src/deploy/rss.ts +4 -3
- package/src/deploy/sitemap.ts +7 -5
- package/src/markdown/base-links.ts +34 -36
- package/src/markdown/directives.ts +242 -36
- package/src/markdown/features.ts +17 -0
- package/src/markdown/index.ts +7 -6
- package/src/markdown/mdast.ts +5 -2
- package/src/markdown/relative-links.ts +12 -4
- package/src/og/card.ts +129 -5
- package/src/og/derive.ts +41 -31
- package/src/og/index.ts +1 -0
- package/src/openapi/asyncapi.ts +4 -2
- package/src/openapi/model.ts +22 -14
- package/src/openapi/proxy.ts +63 -10
- package/src/openapi/render-mdx.ts +41 -2
- package/src/registry/eject.ts +181 -24
- package/src/search/adapters/version-scope.ts +30 -0
- package/src/search/documents.ts +67 -26
- package/src/search/popular.ts +2 -1
- package/src/seo/jsonld.ts +7 -3
- package/src/translate/meta.ts +68 -24
- package/src/translate/run.ts +3 -3
- package/src/translate/validate.ts +4 -1
- package/src/translate/work-list.ts +56 -17
- package/dist/cli/chunk-5r8g91qn.js.map +0 -34
- package/dist/cli/chunk-7mbqtmgb.js.map +0 -10
- package/dist/cli/chunk-ddndchfr.js.map +0 -14
- package/dist/cli/chunk-esh98wmb.js +0 -23
- package/dist/cli/chunk-esh98wmb.js.map +0 -10
- package/dist/cli/chunk-hr8ne106.js.map +0 -13
- package/dist/cli/chunk-j85scx15.js.map +0 -10
- package/dist/cli/chunk-pbg5a4s3.js.map +0 -19
- package/dist/cli/chunk-wdrt2k2v.js.map +0 -10
- /package/dist/cli/{chunk-6k4ftwze.js.map → chunk-1d7ve1dm.js.map} +0 -0
- /package/dist/cli/{chunk-zp79m0ts.js.map → chunk-2eytanqx.js.map} +0 -0
- /package/dist/cli/{chunk-g698a744.js.map → chunk-2z928egk.js.map} +0 -0
- /package/dist/cli/{chunk-mqc662a6.js.map → chunk-364znk6q.js.map} +0 -0
- /package/dist/cli/{chunk-k7pj68a8.js.map → chunk-5f86nr5m.js.map} +0 -0
- /package/dist/cli/{chunk-91ws1n6j.js.map → chunk-5xvm6tfj.js.map} +0 -0
- /package/dist/cli/{chunk-w4bxdvsa.js.map → chunk-6dsbexzp.js.map} +0 -0
- /package/dist/cli/{chunk-00gs3wqs.js.map → chunk-8ktnccpt.js.map} +0 -0
- /package/dist/cli/{chunk-bbnwccaz.js.map → chunk-a58773jm.js.map} +0 -0
- /package/dist/cli/{chunk-sqw4ekg1.js.map → chunk-b07cmahc.js.map} +0 -0
- /package/dist/cli/{chunk-4e9b9ra6.js.map → chunk-ey84smr6.js.map} +0 -0
- /package/dist/cli/{chunk-d1v5rhy0.js.map → chunk-g4hq16wv.js.map} +0 -0
- /package/dist/cli/{chunk-qkb5a8sa.js.map → chunk-pehfxfta.js.map} +0 -0
- /package/dist/cli/{chunk-fsmrqk8a.js.map → chunk-r20tn01b.js.map} +0 -0
- /package/dist/cli/{chunk-bfwp9vp6.js.map → chunk-r9rcc4w7.js.map} +0 -0
- /package/dist/cli/{chunk-h7k3nq3v.js.map → chunk-tkacnehg.js.map} +0 -0
- /package/dist/cli/{chunk-h2ez8dzb.js.map → chunk-tzmab476.js.map} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
frontmatter_default,
|
|
4
|
+
MARKDOWN_BODY_FEATURES,
|
|
5
|
+
MDX_BODY_FEATURES,
|
|
4
6
|
parseHeadingMarkers,
|
|
5
7
|
EN_UI,
|
|
6
8
|
resolveUIStrings,
|
|
7
9
|
HTML_COMMENT,
|
|
8
10
|
readExpandedEntryText,
|
|
9
|
-
MARKDOWN_FEATURES,
|
|
10
|
-
MDX_FEATURES,
|
|
11
11
|
componentRegistry,
|
|
12
12
|
downlevelComponentNode,
|
|
13
13
|
downlevelComponents,
|
|
@@ -15,13 +15,14 @@ import {
|
|
|
15
15
|
applyAudienceVisibility,
|
|
16
16
|
agentMarkdown,
|
|
17
17
|
buildRawMarkdown
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import {
|
|
20
|
-
normalizeBasePath
|
|
21
|
-
} from "./chunk-gs7r695n.js";
|
|
18
|
+
} from "./chunk-pv29h0wf.js";
|
|
22
19
|
import {
|
|
20
|
+
directiveSource,
|
|
23
21
|
contentIndexable
|
|
24
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-j85vccga.js";
|
|
23
|
+
import {
|
|
24
|
+
normalizeBasePath
|
|
25
|
+
} from "./chunk-3em5wd2y.js";
|
|
25
26
|
|
|
26
27
|
// src/search/documents.ts
|
|
27
28
|
import { markdownToMdast, mdxToMdast } from "satteri";
|
|
@@ -83,8 +84,7 @@ var INLINE_PARENTS = new Set([
|
|
|
83
84
|
"mdxJsxTextElement",
|
|
84
85
|
"strong",
|
|
85
86
|
"subscript",
|
|
86
|
-
"superscript"
|
|
87
|
-
"textDirective"
|
|
87
|
+
"superscript"
|
|
88
88
|
]);
|
|
89
89
|
var NON_PROSE = new Set([
|
|
90
90
|
"image",
|
|
@@ -95,8 +95,8 @@ var NON_PROSE = new Set([
|
|
|
95
95
|
"mdxTextExpression",
|
|
96
96
|
"mdxjsEsm"
|
|
97
97
|
]);
|
|
98
|
-
var MD_PARSE = { features:
|
|
99
|
-
var MDX_PARSE = { features:
|
|
98
|
+
var MD_PARSE = { features: MARKDOWN_BODY_FEATURES };
|
|
99
|
+
var MDX_PARSE = { features: MDX_BODY_FEATURES };
|
|
100
100
|
var parseMdx = (markdown) => {
|
|
101
101
|
try {
|
|
102
102
|
return mdxToMdast(markdown, MDX_PARSE);
|
|
@@ -115,6 +115,7 @@ var collectCode = (node, out, walk) => {
|
|
|
115
115
|
}
|
|
116
116
|
out.push(node.value, " ");
|
|
117
117
|
};
|
|
118
|
+
var directiveText = (node, walk) => directiveSource(node, node.type === "textDirective" ? ":" : "::", walk.downlevel.source);
|
|
118
119
|
var separatesWords = (node) => !INLINE_PARENTS.has(node.type) || node.children.length === 0;
|
|
119
120
|
var collectText = (node, out, walk) => {
|
|
120
121
|
if (NON_PROSE.has(node.type)) {
|
|
@@ -145,20 +146,16 @@ var collectText = (node, out, walk) => {
|
|
|
145
146
|
out.push(" ");
|
|
146
147
|
return;
|
|
147
148
|
}
|
|
149
|
+
case "textDirective": {
|
|
150
|
+
out.push(directiveText(node, walk));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
case "leafDirective": {
|
|
154
|
+
out.push(directiveText(node, walk), " ");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
148
157
|
case "heading": {
|
|
149
|
-
|
|
150
|
-
const trailing = last?.type === "text" ? last : undefined;
|
|
151
|
-
const inner = [];
|
|
152
|
-
const kept = trailing ? node.children.slice(0, -1) : node.children;
|
|
153
|
-
for (const child of kept) {
|
|
154
|
-
collectText(child, inner, walk);
|
|
155
|
-
}
|
|
156
|
-
if (trailing) {
|
|
157
|
-
const stripped = parseHeadingMarkers(trailing.value).text;
|
|
158
|
-
const literal = stripped === "" && node.children.length === 1;
|
|
159
|
-
inner.push(literal ? trailing.value : stripped);
|
|
160
|
-
}
|
|
161
|
-
out.push(inner.join("").trimEnd(), " ");
|
|
158
|
+
collectHeading(node, out, walk);
|
|
162
159
|
return;
|
|
163
160
|
}
|
|
164
161
|
default: {
|
|
@@ -178,6 +175,21 @@ var collectText = (node, out, walk) => {
|
|
|
178
175
|
}
|
|
179
176
|
}
|
|
180
177
|
};
|
|
178
|
+
var collectHeading = (node, out, walk) => {
|
|
179
|
+
const last = node.children.at(-1);
|
|
180
|
+
const trailing = last?.type === "text" ? last : undefined;
|
|
181
|
+
const inner = [];
|
|
182
|
+
const kept = trailing ? node.children.slice(0, -1) : node.children;
|
|
183
|
+
for (const child of kept) {
|
|
184
|
+
collectText(child, inner, walk);
|
|
185
|
+
}
|
|
186
|
+
if (trailing) {
|
|
187
|
+
const stripped = parseHeadingMarkers(trailing.value).text;
|
|
188
|
+
const literal = stripped === "" && node.children.length === 1;
|
|
189
|
+
inner.push(literal ? trailing.value : stripped);
|
|
190
|
+
}
|
|
191
|
+
out.push(inner.join("").trimEnd(), " ");
|
|
192
|
+
};
|
|
181
193
|
var toPlainText = (markdown, format, walk) => {
|
|
182
194
|
const tree = parseMarkdown(markdown, format);
|
|
183
195
|
if (!tree) {
|
|
@@ -372,5 +384,5 @@ var buildMcpData = async (project) => {
|
|
|
372
384
|
|
|
373
385
|
export { buildSearchDocuments, buildMcpData };
|
|
374
386
|
|
|
375
|
-
//# debugId=
|
|
376
|
-
//# sourceMappingURL=chunk-
|
|
387
|
+
//# debugId=447C9153F372D54864756E2164756E21
|
|
388
|
+
//# sourceMappingURL=chunk-yfyb25rh.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/search/documents.ts", "../src/markdown/fence-meta.ts", "../src/markdown/code-title.ts", "../src/search/facets.ts", "../src/ai/mcp/data.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Nodes } from \"mdast\";\nimport { markdownToMdast, mdxToMdast } from \"satteri\";\n\nimport {\n componentRegistry,\n downlevelComponentNode,\n downlevelComponents,\n} from \"../ai/component-markdown.ts\";\nimport type {\n ComponentMarkdown,\n DownlevelWalk,\n MdastNode as DownlevelNode,\n} from \"../ai/component-markdown.ts\";\nimport { projectComponentSerializers } from \"../ai/serializers.ts\";\nimport { applyAudienceVisibility } from \"../ai/visibility.ts\";\nimport type { VisibilityAudience } from \"../ai/visibility.ts\";\nimport matter from \"../core/frontmatter.ts\";\nimport { parseHeadingMarkers } from \"../core/heading-markers.ts\";\nimport { EN_UI, resolveUIStrings } from \"../core/i18n-ui.ts\";\nimport { contentIndexable } from \"../core/manifest.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport { HTML_COMMENT } from \"../core/sources/normalize.ts\";\nimport { readExpandedEntryText } from \"../core/sources/read.ts\";\nimport type { NavNode, PageRecord } from \"../core/types.ts\";\nimport { parseCodeTitle } from \"../markdown/code-title.ts\";\nimport { directiveSource } from \"../markdown/directives.ts\";\nimport type { DirectiveNode } from \"../markdown/directives.ts\";\nimport {\n MARKDOWN_BODY_FEATURES,\n MDX_BODY_FEATURES,\n} from \"../markdown/features.ts\";\nimport { pageFacets } from \"./facets.ts\";\n\n/** A document indexed by the client-side search providers (Orama, FlexSearch). */\nexport interface SearchDocument {\n route: string;\n title: string;\n description: string;\n content: string;\n /** Ancestor section labels for the result breadcrumb, e.g. `[\"Guides\"]`. */\n breadcrumb: string[];\n /** Top-level section label, used by the search filter pills. */\n section: string;\n /** Locale code, so the dialog can filter results to the active language. */\n locale: string;\n /** Resolved page `type` (`doc`, `blog`, a custom `rfc`…), for type filters. */\n contentType: string;\n /** Docs version (`\"\"` for the current docs), so results scope to the viewed version. */\n version: string;\n /** Frontmatter `search.tags`, surfaced for hosted-provider faceting. */\n tags?: string[];\n /**\n * Declared facet values (`content.types.<type>.facets`), key → value.\n * Filterable through the MCP tools' `filters` input.\n */\n facets?: Record<string, string>;\n}\n\n/**\n * A record uploaded to a hosted search backend (Algolia, Orama Cloud,\n * Typesense, Mixedbread). `_id` is the stable per-page key; each sync adapts it\n * to the backend's own id field (`objectID`, `id`, …).\n */\nexport interface SearchRecord {\n _id: string;\n url: string;\n title: string;\n description: string;\n content: string;\n /** Locale code, carried as a facet for per-language filtering. */\n locale: string;\n /**\n * Docs version, carried as a facet for per-version filtering. The current\n * docs upload as `\"current\"` — hosted backends treat an empty facet value\n * unreliably, so the sentinel stands in for the empty version id.\n */\n version: string;\n /** Single faceting tag (the first frontmatter tag, when present). */\n tag?: string;\n}\n\n// Tag-shaped only: a name (or closing slash/fragment) right after `<`, and no\n// newline inside. Applied *within* html/JSX nodes so their inner prose is\n// kept; the surrounding Markdown is walked as a tree, so a bare `<` in prose\n// (\"costs < 5 credits\") is ordinary text and never at risk.\nconst HTML_OR_JSX = /<\\/?[a-zA-Z][^\\n<>]*>|<\\/?>/gu;\nconst WHITESPACE = /\\s+/gu;\n\n// Parents whose children are inline: no separator is inserted after them, or\n// `re*ally*` would index as `re ally`. Every other parent is block-shaped and\n// ends with a space so adjacent paragraphs/headings/cells don't fuse.\nconst INLINE_PARENTS = new Set([\n \"delete\",\n \"emphasis\",\n \"footnoteReference\",\n \"link\",\n \"linkReference\",\n \"mdxJsxTextElement\",\n \"strong\",\n \"subscript\",\n \"superscript\",\n]);\n\n// Nodes that never render as prose: image alt text was never indexed, MDX\n// expressions (`{props.x}`) and ESM (`export const meta`) are code, and math\n// is LaTeX source rendered by KaTeX, not searchable words.\nconst NON_PROSE = new Set<Nodes[\"type\"]>([\n \"image\",\n \"imageReference\",\n \"inlineMath\",\n \"math\",\n \"mdxFlowExpression\",\n \"mdxTextExpression\",\n \"mdxjsEsm\",\n]);\n\ntype PageFormat = PageRecord[\"format\"];\n\n/** What the plain-text walk carries: the code-block policy and the downlevel context. */\ninterface Walk {\n includeCodeBlocks: boolean;\n downlevel: DownlevelWalk;\n}\n\n// Front matter is already off (core/frontmatter.ts) by the time a body gets\n// here, so a body that opens with a `---` divider must read as a thematic\n// break rather than a second front matter block — as the renderer reads it.\nconst MD_PARSE = { features: MARKDOWN_BODY_FEATURES };\nconst MDX_PARSE = { features: MDX_BODY_FEATURES };\n\nconst parseMdx = (markdown: string): Nodes | undefined => {\n try {\n return mdxToMdast(markdown, MDX_PARSE);\n } catch {\n return undefined;\n }\n};\n\n/**\n * Parse a page body the way the renderer reads it. `.mdx` pages go through\n * the MDX grammar with the renderer's feature set, so components become\n * `mdxJsx*` nodes whose children — prose and fences, however they're indented\n * — walk like top-level content, and `:::` directives and `$$` math parse as\n * such; Markdown would instead fold a tight component into one html node and\n * read its indented children as an indented code block. A page the MDX\n * grammar rejects (an HTML comment, an unclosed tag) fails to render too, so\n * it has no body to index: reading it as Markdown instead would put its ESM,\n * expressions, and raw tags in the index as prose.\n */\nconst parseMarkdown = (\n markdown: string,\n format: PageFormat\n): Nodes | undefined =>\n format === \"mdx\" ? parseMdx(markdown) : markdownToMdast(markdown, MD_PARSE);\n\n// Fenced code is excluded from the plain index by default (ranking noise) —\n// the \"markdown\" extraction keeps it for assistant grounding. Code-heavy docs opt\n// in via `search.indexing.includeCodeBlocks`, which indexes the fence body and\n// its rendered title (```ts blume.config.ts) but never the fence markers,\n// language, or other meta keywords.\nconst collectCode = (\n node: Extract<Nodes, { type: \"code\" }>,\n out: string[],\n walk: Walk\n): void => {\n if (!walk.includeCodeBlocks) {\n return;\n }\n const title = parseCodeTitle(node.meta ?? undefined);\n if (title) {\n out.push(title, \" \");\n }\n // The trailing space keeps the fence apart from what follows it.\n out.push(node.value, \" \");\n};\n\n/**\n * A text or leaf directive as the page shows it. Blume renders neither (see\n * `markdown/directives.ts`), and prose is full of text that parses as one —\n * `16:9`, `og:image` — so the page shows the source the author wrote, and the\n * index reads the same text rather than dropping the `:name` part.\n */\nconst directiveText = (\n node: Extract<Nodes, { type: \"leafDirective\" | \"textDirective\" }>,\n walk: Walk\n): string =>\n directiveSource(\n // SAFETY: DirectiveNode is a structural subset of Satteri's directive\n // nodes — a `name`, optional attributes and children, and a position.\n node as DirectiveNode,\n node.type === \"textDirective\" ? \":\" : \"::\",\n // The walked tree was parsed from this text, so its offsets index into it.\n walk.downlevel.source\n );\n\n// Block boundaries separate words; so does an empty inline element (`<br />`,\n// a self-closing icon), which otherwise fuses its neighbors.\nconst separatesWords = (node: Extract<Nodes, { children: unknown }>): boolean =>\n !INLINE_PARENTS.has(node.type) || node.children.length === 0;\n\n/** Fold one mdast node into the plain-text accumulator. */\nconst collectText = (node: Nodes, out: string[], walk: Walk): void => {\n if (NON_PROSE.has(node.type)) {\n return;\n }\n switch (node.type) {\n case \"code\": {\n collectCode(node, out, walk);\n return;\n }\n // A component with a serializer indexes as the text the page shows —\n // a Card's title and call to action, a TypeTable's descriptions — read\n // from the Markdown the serializer emits (its contract is Markdown, not\n // MDX). One without a serializer walks its children like any block.\n case \"mdxJsxFlowElement\": {\n // SAFETY: DownlevelNode is a structural subset of Satteri's mdast\n // output — the walk checks for offsets before reading them.\n const text = downlevelComponentNode(\n node as DownlevelNode,\n walk.downlevel\n );\n if (text !== null) {\n collectText(markdownToMdast(text, MD_PARSE), out, walk);\n return;\n }\n break;\n }\n // Inline code is kept verbatim — `Array<T>` is a type parameter, not a\n // tag, and its tokens must stay searchable.\n case \"inlineCode\": {\n out.push(node.value);\n return;\n }\n // A raw-HTML run. In a `.md` page (or an `.mdx` page MDX couldn't parse)\n // CommonMark folds a block-level `<Callout>` with no blank lines into ONE\n // html node holding all its inner prose, so the node can't just be\n // dropped — strip the tag-shaped runs and keep the text.\n case \"html\": {\n out.push(\n node.value.replaceAll(HTML_COMMENT, \" \").replaceAll(HTML_OR_JSX, \" \"),\n \" \"\n );\n return;\n }\n case \"break\": {\n out.push(\" \");\n return;\n }\n case \"textDirective\": {\n out.push(directiveText(node, walk));\n return;\n }\n case \"leafDirective\": {\n out.push(directiveText(node, walk), \" \");\n return;\n }\n case \"heading\": {\n // oxlint-disable-next-line no-use-before-define -- mutual recursion: a heading's children are walked like any others\n collectHeading(node, out, walk);\n return;\n }\n default: {\n break;\n }\n }\n if (\"value\" in node) {\n out.push(node.value);\n return;\n }\n if (\"children\" in node) {\n for (const child of node.children) {\n collectText(child, out, walk);\n }\n if (separatesWords(node)) {\n out.push(\" \");\n }\n }\n};\n\n/**\n * Fold a heading into the accumulator. Trailing heading markers\n * (`[#custom-id]`, `{#custom-id}`, `[!toc]`, `[toc]`) are anchor metadata,\n * not prose — strip them so they never pollute the index. Only a marker that\n * ends the heading's final plain-text child counts, mirroring the renderer: a\n * heading ending in inline code or an image keeps its bracketed text on the\n * page (so it stays searchable), and a heading that is nothing but markers\n * renders them literally.\n */\nconst collectHeading = (\n node: Extract<Nodes, { type: \"heading\" }>,\n out: string[],\n walk: Walk\n): void => {\n const last = node.children.at(-1);\n const trailing = last?.type === \"text\" ? last : undefined;\n const inner: string[] = [];\n const kept = trailing ? node.children.slice(0, -1) : node.children;\n for (const child of kept) {\n collectText(child, inner, walk);\n }\n if (trailing) {\n const stripped = parseHeadingMarkers(trailing.value).text;\n const literal = stripped === \"\" && node.children.length === 1;\n inner.push(literal ? trailing.value : stripped);\n }\n out.push(inner.join(\"\").trimEnd(), \" \");\n};\n\n/**\n * Reduce Markdown/MDX to plain, searchable text: parse (GFM included) and walk\n * the tree instead of regex-stripping the source, so reference-style links,\n * autolinks, setext headings, tables, and literal `*`/`~`/`>` in prose all\n * reduce correctly. This feeds the client index *and* every hosted-provider\n * record, so anything lost here is a permanent search-quality loss.\n */\nconst toPlainText = (\n markdown: string,\n format: PageFormat,\n walk: Walk\n): string => {\n const tree = parseMarkdown(markdown, format);\n if (!tree) {\n return \"\";\n }\n const out: string[] = [];\n collectText(tree, out, walk);\n return out.join(\"\").replaceAll(WHITESPACE, \" \").trim();\n};\n\ninterface Crumbs {\n breadcrumb: string[];\n section: string;\n}\n\n/**\n * Map each page route to its ancestor section labels by walking the nav sidebar\n * once. The nearest ancestor group — the sidebar section a page appears under —\n * becomes its `section`, the dimension the search filter pills group by, so the\n * pills mirror the visible sidebar (and honor folder-meta renames).\n */\nconst buildCrumbIndex = (sidebar: NavNode[]): Map<string, Crumbs> => {\n const index = new Map<string, Crumbs>();\n // A config-sidebar section's landing page (the group's `root`) lives on the\n // *group* node, not on any page leaf — record it under the group's own label\n // so the section's landing page carries the same facet as its children. A\n // real page leaf for the route (filesystem sidebars emit index pages as\n // leaves) wins, so group routes are merged in only where no leaf claimed one.\n const groupRoutes = new Map<string, Crumbs>();\n const walk = (nodes: NavNode[], trail: string[]): void => {\n for (const node of nodes) {\n if (node.kind === \"group\") {\n if (node.route && !groupRoutes.has(node.route)) {\n groupRoutes.set(node.route, {\n breadcrumb: [...trail, node.label],\n section: node.label,\n });\n }\n walk(node.children, [...trail, node.label]);\n } else if (node.route) {\n index.set(node.route, {\n breadcrumb: trail,\n section: trail.at(-1) ?? \"\",\n });\n }\n }\n };\n walk(sidebar, []);\n for (const [route, crumbs] of groupRoutes) {\n if (!index.has(route)) {\n index.set(route, crumbs);\n }\n }\n return index;\n};\n\ninterface BuildOptions {\n includeWhenDisabled?: boolean;\n content?: \"markdown\" | \"plain\";\n audience?: VisibilityAudience;\n}\n\n/**\n * Read a page's body and reduce it per the extraction options. The\n * `\"markdown\"` body is agent-facing, so its components are downleveled in the\n * source with the serializers every agent surface uses (front matter in scope\n * for prop expressions). The plain body is parsed as written and walked, with\n * the same serializers applied per component on the way, so the index reads a\n * `<Card>` or `<TypeTable>` as the text it shows.\n */\nconst pageBody = async (\n project: BlumeProject,\n page: PageRecord | undefined,\n options: Pick<BuildOptions, \"audience\" | \"content\"> | undefined,\n components: Record<string, ComponentMarkdown>\n): Promise<string> => {\n if (!page) {\n return \"\";\n }\n const parsed = matter(await readExpandedEntryText(project, page));\n const visible = applyAudienceVisibility(\n parsed.content,\n options?.audience ?? \"web\"\n );\n if (options?.content === \"markdown\") {\n return downlevelComponents(visible.trim(), components, parsed.data);\n }\n return toPlainText(visible, page.format, {\n downlevel: {\n frontmatter: parsed.data,\n registry: componentRegistry(components),\n source: visible,\n },\n includeCodeBlocks: project.config.search.indexing.includeCodeBlocks,\n });\n};\n\n/**\n * Build search documents from the content graph. Only indexable pages are\n * included (per the route manifest), and content comes from the source files,\n * so the index is identical in dev and build.\n *\n * Pass `includeWhenDisabled` to index pages on their content merits even when\n * the search provider is `none` — used by the MCP server, which is a separate\n * feature from on-page search.\n *\n * `content` selects the extraction: `\"plain\"` (default) strips Markdown to bare\n * searchable text; `\"markdown\"` keeps the body's Markdown — code blocks, lists,\n * headings — for assistant grounding, where fenced examples are often the answer\n * and stripping them makes the model unable to cite content the docs do contain.\n * The `\"markdown\"` body is agent-facing, so components are downleveled with the\n * same serializers the `.md` mirror, llms-full.txt and MCP `get_page` use: a\n * page whose body is a `<CardGroup>` of `<Card>`s is prose to a reader and bare\n * JSX to anything reading the source, and section landing pages are exactly\n * that shape.\n *\n * `audience` resolves `<Visibility>` blocks before extraction: `\"web\"`\n * (default) keeps web-only content and drops agents-only blocks — the site\n * search and hosted syncs must not surface content the page hides — while\n * `\"agents\"` mirrors llms-full.txt/MCP `get_page` (web removed, agents kept).\n *\n * Whether fenced code joins the plain extraction is site-wide policy, read\n * from `search.indexing.includeCodeBlocks` here rather than threaded by each\n * caller, so the client index, hosted syncs, eject, and the MCP `search_docs`\n * index can't drift apart.\n */\nexport const buildSearchDocuments = async (\n project: BlumeProject,\n options?: BuildOptions\n): Promise<SearchDocument[]> => {\n const pageById = new Map(project.graph.pages.map((page) => [page.id, page]));\n\n // Build the crumb index from every locale's sidebar (their nodes carry\n // locale-prefixed routes), so localized pages get the right section/breadcrumb.\n // Falls back to the single default-locale nav when i18n is off.\n const byLocale = Object.values(project.graph.navigationByLocale ?? {});\n // Archived versions' trees contribute too, so snapshot pages get their own\n // section/breadcrumb instead of falling through to the \"Docs\" default.\n const byVersion = Object.values(project.graph.navigationByVersion ?? {})\n .flatMap((locales) => Object.values(locales))\n .map((nav) => nav.sidebar);\n const sidebars = [\n ...(byLocale.length > 0\n ? byLocale.map((nav) => nav.sidebar)\n : [project.graph.navigation?.sidebar ?? []]),\n ...byVersion,\n ];\n const crumbs = new Map<string, Crumbs>();\n for (const sidebar of sidebars) {\n for (const [route, crumb] of buildCrumbIndex(sidebar)) {\n crumbs.set(route, crumb);\n }\n }\n\n const indexable = project.manifest.routes.filter((route) => {\n if (!options?.includeWhenDisabled) {\n return route.indexable;\n }\n // A fallback route renders the fallback locale's page at another locale's\n // URL, so indexing it would only repeat that page as a second hit — the\n // reason site search leaves it out too.\n if (route.fallback) {\n return false;\n }\n const page = pageById.get(route.id);\n return page ? contentIndexable(page, project.config) : false;\n });\n\n // Built once — `downlevelComponents` rebuilds its registry per call\n // otherwise.\n const components = projectComponentSerializers(project);\n\n // A page in no sidebar group falls under the \"Docs\" section, in its own\n // language: the label is a UI string, resolved once per locale.\n const { i18n } = project.config;\n const docsSections = new Map<string, string>();\n const docsSection = (locale: string): string => {\n let label = docsSections.get(locale);\n if (label === undefined) {\n label = (\n i18n\n ? resolveUIStrings(locale, {\n defaultLocale: i18n.defaultLocale,\n overrides: i18n.ui,\n })\n : EN_UI\n ).search.docs;\n docsSections.set(locale, label);\n }\n return label;\n };\n\n return await Promise.all(\n indexable.map(async (route) => {\n const page = pageById.get(route.id);\n const body = await pageBody(project, page, options, components);\n const tags = page?.meta?.search?.tags;\n const crumb = crumbs.get(route.path);\n const facets = page ? pageFacets(page, project.config) : undefined;\n const document: SearchDocument = {\n breadcrumb: crumb?.breadcrumb ?? [],\n content: body,\n contentType: route.contentType,\n description: page?.description ?? \"\",\n locale: route.locale,\n route: route.path,\n section: crumb?.section || docsSection(route.locale),\n tags: tags && tags.length > 0 ? tags : undefined,\n title: route.title,\n version: route.version,\n };\n if (facets) {\n document.facets = facets;\n }\n return document;\n })\n );\n};\n\n/**\n * Map per-page search documents to the flat record shape hosted backends\n * ingest. One record per page, keyed by route; the first tag becomes the\n * faceting `tag`.\n */\nexport const toSearchRecords = (documents: SearchDocument[]): SearchRecord[] =>\n documents.map((doc) => ({\n _id: doc.route,\n content: doc.content,\n description: doc.description,\n locale: doc.locale,\n tag: doc.tags?.[0],\n title: doc.title,\n url: doc.route,\n version: doc.version || \"current\",\n }));\n",
|
|
6
|
+
"/**\n * The shared fence-meta grammar: how the tokens after a code fence's language\n * (```ts title=\"...\" {1,3-5} lineNumbers) split, and which of them carry\n * reserved meaning. Both the Shiki-side meta reader (`code-title.ts`) and the\n * MDAST plugins that rewrite marked fences (`ts2js.ts`) consume this, so the\n * two layers can't drift on token boundaries or keyword lists.\n */\n\n/**\n * Any quoted `key=\"...\"` attr (spaces allowed inside the quotes). The body\n * excludes only the delimiting quote, so `title=\"foo's file.ts\"` (an\n * apostrophe inside double quotes) still matches. The left boundary stops\n * `subtitle=\"...\"` (or any `*title=` attr) from reading as a title.\n */\nexport const QUOTED_ATTR = /[\\w-]+=(?:\"[^\"]*\"|'[^']*')/gu;\n\n/**\n * A Shiki `{1,3-5}` line-range token, braces included. Shiki tolerates\n * whitespace inside the braces (`{1, 3-5}`), so the range is one token even\n * when it contains spaces — split on whitespace alone, `3-5}` would surface\n * as a bare word and be promoted to the block title.\n */\nconst LINE_RANGE = /\\{[^}]*\\}/u;\n\n/**\n * One fence-meta token: a quoted attribute, a line range, or a bare word, so\n * a keyword inside a quoted value (`title=\"enable ts2js later\"`) never reads\n * as a bare token and a spaced line range never splits.\n */\nconst META_TOKEN = new RegExp(\n `${QUOTED_ATTR.source}|${LINE_RANGE.source}|\\\\S+`,\n \"gu\"\n);\n\n/** Split a raw fence meta string into its tokens. */\nexport const metaTokens = (meta: string | null | undefined): string[] =>\n meta?.match(META_TOKEN) ?? [];\n\n/**\n * Bare keywords with reserved meaning after the language; never promoted to\n * a block title.\n */\nexport const RESERVED_META_KEYWORDS: ReadonlySet<string> = new Set([\n \"lineNumbers\",\n \"ts2js\",\n \"twoslash\",\n]);\n\n/** A Shiki `{1,3-5}` line-range token. */\nexport const isLineRange = (token: string): boolean => token.startsWith(\"{\");\n",
|
|
7
|
+
"/**\n * Code-fence meta. A Shiki transformer reads the tokens after the language and\n * promotes them to attributes on the rendered `<pre>`:\n *\n * - a title — the first bare token (```ts blume.config.ts) or `title=\"...\"` —\n * becomes `data-title`; the theme's code header shows it, falling back to the\n * language label.\n * - the `lineNumbers` keyword (```ts file.ts lineNumbers) becomes\n * `data-line-numbers`; the theme renders a counter-driven line-number gutter.\n */\n\nimport {\n isLineRange,\n metaTokens,\n QUOTED_ATTR,\n RESERVED_META_KEYWORDS,\n} from \"./fence-meta.ts\";\n\n/** The slice of Shiki's transformer `this` context Blume reads. */\ninterface CodeMetaContext {\n options: { meta?: { __raw?: string } };\n}\n\n/** The `<pre>` hast node a Shiki `pre` hook receives. */\ninterface PreNode {\n properties: Record<string, boolean | number | string | undefined>;\n}\n\n/** A Shiki-compatible transformer, typed structurally to avoid a Shiki dep. */\nexport interface CodeTitleTransformer {\n name: string;\n pre: (this: CodeMetaContext, node: PreNode) => void;\n}\n\nconst TITLE_ATTR = /(?:^|\\s)title=(?:\"(?<dq>[^\"]*)\"|'(?<sq>[^']*)')/u;\nconst LINE_NUMBERS = /(?:^|\\s)lineNumbers(?=\\s|$)/u;\n\n// Quoted attrs are blanked before keyword/bare-token scans so a quoted value\n// can't leak tokens (`title=\"enable lineNumbers later\"`).\nconst withoutQuotedAttrs = (raw: string): string =>\n raw.replace(QUOTED_ATTR, \" \");\n\n// The first bare token is the title (```ts blume.config.ts): a non-empty token\n// that isn't a Shiki line range (`{1,3-5}`), a `key=value` attr, or a reserved\n// keyword.\nconst isTitleToken = (token: string): boolean =>\n token.length > 0 &&\n !isLineRange(token) &&\n !token.includes(\"=\") &&\n !RESERVED_META_KEYWORDS.has(token);\n\n/** The title a fence's meta string promotes to `data-title`, if any. */\nexport const parseCodeTitle = (raw: string | undefined): string | undefined => {\n if (!raw) {\n return undefined;\n }\n // Blank every *other* quoted attr first, so a `title=\"…\"` embedded in\n // another attribute's value (`caption='set title=\"X\" here'`) can't be\n // promoted to the block title.\n const scrubbed = raw.replace(QUOTED_ATTR, (attr) =>\n attr.startsWith(\"title=\") ? attr : \" \"\n );\n const explicit = scrubbed.match(TITLE_ATTR);\n const attrTitle = explicit?.groups?.dq ?? explicit?.groups?.sq;\n if (attrTitle) {\n return attrTitle;\n }\n // The shared tokenizer keeps a quoted attr (rejected below by its `=`) and\n // a spaced line range (`{1, 3-5}`) whole, so neither can shed a fragment\n // that reads as a bare title.\n return metaTokens(raw).find(isTitleToken);\n};\n\nconst hasLineNumbers = (raw: string | undefined): boolean =>\n Boolean(raw && LINE_NUMBERS.test(withoutQuotedAttrs(raw)));\n\n/** Build the transformer. Runs after Shiki's built-in `data-language` hook. */\nexport const codeTitleTransformer = (): CodeTitleTransformer => ({\n name: \"blume:code-meta\",\n pre(node) {\n const raw = this.options.meta?.__raw;\n const title = parseCodeTitle(raw);\n if (title) {\n node.properties.dataTitle = title;\n }\n if (hasLineNumbers(raw)) {\n node.properties.dataLineNumbers = true;\n }\n },\n});\n",
|
|
8
|
+
"import type { ResolvedConfig } from \"../core/schema.ts\";\nimport type { PageRecord } from \"../core/types.ts\";\n\n/**\n * Resolve a page's facet values: the subset of its validated custom\n * frontmatter named by its content type's `facets` declaration. Strings facet\n * as-is; numbers and booleans are stringified so an enum-like `priority: 1`\n * or `enforced: true` still filters; any other shape (objects, arrays,\n * transformed dates) is not a facet value and is skipped. Returns `undefined`\n * when nothing facets, so the field stays absent from serialized documents\n * rather than shipping as `{}` on every page.\n */\n/** Whether a custom frontmatter value stringifies into a usable facet value. */\nconst isFacetValue = <T>(value: T): value is T & (string | number | boolean) =>\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\";\n\nexport const pageFacets = (\n page: Pick<PageRecord, \"contentType\" | \"custom\">,\n config: ResolvedConfig\n): Record<string, string> | undefined => {\n const declared = config.content.types[page.contentType]?.facets;\n if (!declared || declared.length === 0 || !page.custom) {\n return;\n }\n const facets: Record<string, string> = {};\n for (const key of declared) {\n const value = page.custom[key];\n if (isFacetValue(value)) {\n facets[key] = String(value);\n }\n }\n return Object.keys(facets).length > 0 ? facets : undefined;\n};\n",
|
|
9
|
+
"import { normalizeBasePath } from \"../../core/base-path.ts\";\nimport type { BlumeProject } from \"../../core/project-graph.ts\";\nimport type { Navigation } from \"../../core/types.ts\";\nimport { buildSearchDocuments } from \"../../search/documents.ts\";\nimport { pageFacets } from \"../../search/facets.ts\";\nimport type { OramaDoc } from \"../../search/orama-index.ts\";\nimport { agentMarkdown, buildRawMarkdown } from \"../markdown.ts\";\n\n/** A page entry surfaced by the `list_pages` MCP tool. */\nexport interface McpRoute {\n contentType: string;\n description?: string;\n /** Declared facet values (`content.types.<type>.facets`), key → value. */\n facets?: Record<string, string>;\n indexable: boolean;\n lastModified: string | null;\n /** Resolved locale code (the default locale when not under i18n). */\n locale: string;\n route: string;\n title: string;\n /** Docs version (`\"\"` for the current docs). */\n version: string;\n}\n\n/**\n * The self-contained snapshot the generated MCP endpoint serves. Bundles the\n * search documents, raw page Markdown, route list, and navigation so the server\n * works regardless of the configured search provider and needs no filesystem\n * access at request time. Serialized to `generated/mcp-data.json`.\n */\nexport interface McpData {\n /**\n * Normalized `deployment.base` (`\"\"` or `/seg`), layered onto routes when\n * emitting URLs — the site is base-less and routes are base-less manifest\n * paths, matching the sitemap/llms.txt convention.\n */\n base: string;\n /**\n * The site's `i18n.defaultLocale`, when i18n is configured. Selects a\n * word-segmenting Orama tokenizer for every non-Latin script, so\n * `search_docs` can match CJK, Cyrillic, Greek, Hebrew, or Devanagari\n * content.\n */\n defaultLocale?: string;\n /**\n * Archived docs version ids, in configured order. Present only on a\n * versioned site; its presence is what makes `search_docs`/`list_pages`\n * default to the current docs.\n */\n archivedVersions?: string[];\n documents: OramaDoc[];\n instructions?: string;\n name: string;\n navigation: Navigation;\n /** Per-locale trees for a locale-aware `get_navigation` (i18n sites only). */\n navigationByLocale?: Record<string, Navigation>;\n /** Per-archived-version trees, keyed by version id then locale code. */\n navigationByVersion?: Record<string, Record<string, Navigation>>;\n pages: Record<string, string>;\n routes: McpRoute[];\n site: string | null;\n version: string;\n}\n\n/** Build the MCP data snapshot from a resolved project. */\nexport const buildMcpData = async (project: BlumeProject): Promise<McpData> => {\n const { config, graph, manifest } = project;\n const [documents, rawMarkdown] = await Promise.all([\n // The MCP server is independent of on-page search, so index docs even when\n // the search provider is `none`. Documents are agent-facing, so\n // `<Visibility>` resolves like `get_page`/llms-full.txt (web-only content\n // removed, agents-only kept).\n buildSearchDocuments(project, {\n audience: \"agents\",\n includeWhenDisabled: true,\n }),\n buildRawMarkdown(project),\n ]);\n\n // `get_page` serves the agent variant: components downleveled to Markdown.\n const pages = Object.fromEntries(\n Object.entries(rawMarkdown).map(([route, entry]) => [\n route,\n agentMarkdown(entry),\n ])\n );\n\n const pageById = new Map(graph.pages.map((page) => [page.id, page]));\n\n const routes: McpRoute[] = [];\n // Fallback routes render the fallback locale's page at another locale's\n // URL: listing them would pass that page off as a translation, once per\n // locale. `get_page` still resolves them through `pages`, as llms.txt and\n // search leave them out.\n for (const route of manifest.routes) {\n if (route.hidden || route.fallback) {\n continue;\n }\n const page = pageById.get(route.id);\n const facets = page ? pageFacets(page, config) : undefined;\n const entry: McpRoute = {\n contentType: route.contentType,\n description: page?.description,\n indexable: route.indexable,\n lastModified: route.lastModified ?? null,\n locale: route.locale,\n route: route.path,\n title: route.title,\n version: route.version,\n };\n if (facets) {\n entry.facets = facets;\n }\n routes.push(entry);\n }\n\n const data: McpData = {\n base: normalizeBasePath(config.deployment.options.base),\n defaultLocale: config.i18n?.defaultLocale,\n documents: documents.map((doc) => {\n const document: OramaDoc = {\n content: doc.content,\n contentType: doc.contentType,\n description: doc.description,\n locale: doc.locale,\n route: doc.route,\n title: doc.title,\n version: doc.version,\n };\n if (doc.facets) {\n document.facets = doc.facets;\n }\n return document;\n }),\n instructions: config.agents.mcp.instructions,\n name: config.agents.mcp.name ?? config.title,\n navigation: graph.navigation,\n pages,\n routes,\n site: config.deployment.options.site ?? null,\n version: manifest.blumeVersion,\n };\n if (config.versions) {\n data.archivedVersions = config.versions.archived.map(\n (version) => version.id\n );\n data.navigationByVersion = graph.navigationByVersion;\n }\n if (config.i18n) {\n data.navigationByLocale = graph.navigationByLocale;\n }\n return data;\n};\n"
|
|
10
|
+
],
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "447C9153F372D54864756E2164756E21",
|
|
13
|
+
"names": []
|
|
14
|
+
}
|
package/dist/cli/index.js
CHANGED
|
@@ -231,8 +231,10 @@ var DOCS_PATHS = new Map(Object.entries({
|
|
|
231
231
|
BLUME_TRANSLATE_MISSING: "/docs/cli/translate",
|
|
232
232
|
BLUME_TRANSLATE_STALE: "/docs/cli/translate",
|
|
233
233
|
BLUME_UNKNOWN_COMPONENT: "/docs/configuration/customization",
|
|
234
|
+
BLUME_UNKNOWN_DIRECTIVE: "/docs/content/syntax",
|
|
234
235
|
BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,
|
|
235
236
|
BLUME_UNKNOWN_OPTION: "/docs/cli",
|
|
237
|
+
BLUME_UNLOADABLE_FILE_NAME: "/docs/content",
|
|
236
238
|
BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,
|
|
237
239
|
BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,
|
|
238
240
|
BLUME_YARN_PNP: "/docs/quickstart"
|
|
@@ -678,23 +680,23 @@ var main = defineCommand({
|
|
|
678
680
|
version: getBlumeVersion()
|
|
679
681
|
},
|
|
680
682
|
subCommands: {
|
|
681
|
-
add: lazyCommand(commandMeta.add, () => import("./chunk-
|
|
682
|
-
audit: lazyCommand(commandMeta.audit, () => import("./chunk-
|
|
683
|
-
build: lazyCommand(commandMeta.build, () => import("./chunk-
|
|
684
|
-
check: lazyCommand(commandMeta.check, () => import("./chunk-
|
|
685
|
-
dev: lazyCommand(commandMeta.dev, () => import("./chunk-
|
|
686
|
-
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-
|
|
687
|
-
eject: lazyCommand(commandMeta.eject, () => import("./chunk-
|
|
688
|
-
eval: lazyCommand(commandMeta.eval, () => import("./chunk-
|
|
689
|
-
init: lazyCommand(commandMeta.init, () => import("./chunk-
|
|
690
|
-
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-
|
|
691
|
-
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-
|
|
692
|
-
preview: lazyCommand(commandMeta.preview, () => import("./chunk-
|
|
693
|
-
sync: lazyCommand(commandMeta.sync, () => import("./chunk-
|
|
694
|
-
translate: lazyCommand(commandMeta.translate, () => import("./chunk-
|
|
695
|
-
upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-
|
|
696
|
-
validate: lazyCommand(commandMeta.validate, () => import("./chunk-
|
|
697
|
-
version: lazyCommand(commandMeta.version, () => import("./chunk-
|
|
683
|
+
add: lazyCommand(commandMeta.add, () => import("./chunk-a58773jm.js"), "addCommand"),
|
|
684
|
+
audit: lazyCommand(commandMeta.audit, () => import("./chunk-wrr3j9w9.js"), "auditCommand"),
|
|
685
|
+
build: lazyCommand(commandMeta.build, () => import("./chunk-5f86nr5m.js"), "buildCommand"),
|
|
686
|
+
check: lazyCommand(commandMeta.check, () => import("./chunk-5xvm6tfj.js"), "checkCommand"),
|
|
687
|
+
dev: lazyCommand(commandMeta.dev, () => import("./chunk-2hsdwb9n.js"), "devCommand"),
|
|
688
|
+
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-q58y5e6a.js"), "doctorCommand"),
|
|
689
|
+
eject: lazyCommand(commandMeta.eject, () => import("./chunk-g4hq16wv.js"), "ejectCommand"),
|
|
690
|
+
eval: lazyCommand(commandMeta.eval, () => import("./chunk-35d4wj9f.js"), "evalCommand"),
|
|
691
|
+
init: lazyCommand(commandMeta.init, () => import("./chunk-p73c0m7w.js"), "initCommand"),
|
|
692
|
+
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-vg9r4eb9.js"), "mcpStdioCommand"),
|
|
693
|
+
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-2eytanqx.js"), "migrateCommand"),
|
|
694
|
+
preview: lazyCommand(commandMeta.preview, () => import("./chunk-acanzt5p.js"), "previewCommand"),
|
|
695
|
+
sync: lazyCommand(commandMeta.sync, () => import("./chunk-6dsbexzp.js"), "syncCommand"),
|
|
696
|
+
translate: lazyCommand(commandMeta.translate, () => import("./chunk-hm3vjy5s.js"), "translateCommand"),
|
|
697
|
+
upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-r9rcc4w7.js"), "upgradeCommand"),
|
|
698
|
+
validate: lazyCommand(commandMeta.validate, () => import("./chunk-p3v96n38.js"), "validateCommand"),
|
|
699
|
+
version: lazyCommand(commandMeta.version, () => import("./chunk-2z928egk.js"), "versionCommand")
|
|
698
700
|
}
|
|
699
701
|
});
|
|
700
702
|
loadEnvFiles(process.cwd());
|
|
@@ -729,5 +731,5 @@ export {
|
|
|
729
731
|
closestMatch
|
|
730
732
|
};
|
|
731
733
|
|
|
732
|
-
//# debugId=
|
|
734
|
+
//# debugId=62583F2FCD118ED064756E2164756E21
|
|
733
735
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"import { existsSync } from \"node:fs\";\n\nimport { config } from \"dotenv\";\nimport { dirname, join, resolve } from \"pathe\";\n\n// Blume's remote sources (GitHub Releases, mdx-remote, Sanity, Notion…) read\n// their tokens from `process.env` during the content scan — which runs before\n// Astro/Vite boots, so Vite's own `.env` loading is too late. This loader fills\n// that gap: it cascades `.env`/`.env.local` from the working dir up to the repo\n// root, so a monorepo can keep one `.env` at the root and every app picks it up.\n\n/**\n * Load `.env`/`.env.local`, cascading from `startDir` up to the repository root\n * (the first ancestor containing a `.git`) or the filesystem root. The ordered\n * path list is handed to dotenv, whose `config` is first-wins, never clobbers\n * existing `process.env` values, and treats unreadable files as best-effort —\n * so shell/CI overrides are never lost, `.env.local` layers over `.env`, and a\n * bad file never aborts a build. dotenv is also the parser Vite runs over\n * these files at build time, so a value means the same thing to the pre-boot\n * content scan and the built site — including multi-line double-quoted values\n * (PEM keys), which a line-based parser silently truncates.\n *\n * `NODE_ENV` is never taken from these files: it picks the mode Vite and Astro\n * run in, so a monorepo root `.env` that sets it for another app would turn\n * every `blume build` into a development build (or `blume dev` into a\n * production one).\n */\nexport const loadEnvFiles = (startDir: string): void => {\n const paths: string[] = [];\n let dir = resolve(startDir);\n let done = false;\n while (!done) {\n paths.push(join(dir, \".env.local\"), join(dir, \".env\"));\n const parent = dirname(dir);\n // Stop at the repo root (nearest `.git`) or the filesystem root.\n done = existsSync(join(dir, \".git\")) || parent === dir;\n dir = parent;\n }\n const loaded: Record<string, string> = {};\n config({ path: paths, processEnv: loaded, quiet: true });\n for (const [key, value] of Object.entries(loaded)) {\n if (key !== \"NODE_ENV\" && process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n};\n",
|
|
10
10
|
"/**\n * Rewrite a bare `--host` in the raw argv to `--host=` before citty parses it.\n *\n * `host` is a string arg (citty has no mixed string/boolean type), and citty\n * 0.2 parses with `node:util.parseArgs`, where a string option consumes the\n * next token as its value even when that token is another flag: `blume dev\n * --host --open` would bind the literal hostname \"--open\" and drop `--open`.\n * The `--host=` spelling parses as `\"\"` without touching its neighbor, which\n * `normalizeHost` then maps to Astro's \"bind all interfaces\".\n */\nexport const normalizeHostArgs = (rawArgs: readonly string[]): string[] =>\n rawArgs.map((arg, index) => {\n if (arg !== \"--host\") {\n return arg;\n }\n const next = rawArgs[index + 1];\n return next === undefined || next.startsWith(\"-\") ? \"--host=\" : arg;\n });\n\n/**\n * Resolve a `--host` flag value into what Astro/Vite's `server.host` expects.\n * citty has no mixed string/boolean arg type, so `host` is declared as a\n * string and a bare `--host` parses as `\"\"` (`normalizeHostArgs` rewrites it\n * to `--host=` first) — Node would bind all interfaces for `\"\"`, but Vite's\n * `resolveHostname` treats it as a literal hostname and prints malformed URLs\n * like `http://:4321/`. Match Astro's own `--host` semantics instead: bare\n * flag → `true` (bind all interfaces), `--host 10.0.0.1` → that address,\n * absent → `false` (localhost only).\n *\n * Lives beside `normalizeHostArgs` rather than in `commands/dev.ts` so\n * `preview` can share it without importing the whole dev command graph.\n */\nexport const normalizeHost = (host?: string): boolean | string =>\n host === \"\" ? true : (host ?? false);\n",
|
|
11
11
|
"import { colors } from \"consola/utils\";\n\nimport { getBlumeVersion } from \"../core/version.ts\";\n\nconst ISSUES_URL = \"https://github.com/haydenbleasel/blume/issues\";\n\n// Absolute paths into the hidden generated runtime — POSIX (`…/.blume/…`) or\n// Windows drive-letter (`C:\\…\\.blume\\…`) — including any trailing `:line:col`,\n// stopping at whitespace or a closing paren.\nconst BLUME_FRAME =\n /(?<abs>(?:\\/[^\\s()]*\\/|[A-Za-z]:\\\\[^\\s()]*\\\\)\\.blume[/\\\\][^\\s()]*)/gu;\n\n// The separator immediately before `.blume/` (or `.blume\\`) in a matched path.\nconst BLUME_MARKER = /[/\\\\]\\.blume[/\\\\]/u;\n\n/**\n * Rewrite `.blume/` frames in a stack so the generated runtime reads clearly:\n * the machine-absolute prefix is dropped to a project-relative `.blume/…` path\n * and tagged `(generated)`, keeping the reader oriented instead of staring at a\n * long path into a hidden directory. Frames in the user's own source (custom\n * pages keep their real location; wrappers import user files by their real path)\n * are untouched, so the actionable frame stays intact.\n */\nexport const remapBlumeStack = (stack: string): string =>\n stack.replaceAll(BLUME_FRAME, (match) => {\n const marker = match.search(BLUME_MARKER);\n return `${match.slice(marker + 1)} (generated)`;\n });\n\n/**\n * Print an unexpected (non-{@link BlumeError}) failure in a stable, reportable\n * shape instead of a bare stack trace: a fixed `BLUME_INTERNAL` code, the\n * message, a trimmed stack, and an environment dump for bug reports. Callers\n * exit after this — it doesn't exit itself, so it's testable.\n */\n// oxlint-disable-next-line anti-slop/no-unknown-parameters -- last-resort handler for whatever a catch clause caught; anything narrower would force casts at every call site\nexport const reportInternalError = (error: unknown): void => {\n const err = error instanceof Error ? error : new Error(String(error));\n const lines = [\n `${colors.red(colors.bold(\"BLUME_INTERNAL\"))} An unexpected error occurred.`,\n ` ${err.message}`,\n ];\n\n // A few frames are enough to locate the fault without burying the report;\n // `.blume/` frames are relativized so the hidden runtime reads clearly.\n const stack = remapBlumeStack(err.stack ?? \"\")\n .split(\"\\n\")\n .slice(1, 5)\n .map((line) => line.trim())\n .filter(Boolean);\n if (stack.length > 0) {\n lines.push(\"\", colors.dim(stack.join(\"\\n\")));\n }\n\n lines.push(\n \"\",\n \"This is likely a bug in Blume. Please report it with the details below:\",\n colors.dim(\n [\n ` Blume: ${getBlumeVersion()}`,\n ` Node: ${process.version}`,\n ` Platform: ${process.platform} ${process.arch}`,\n ].join(\"\\n\")\n ),\n ` ${ISSUES_URL}`\n );\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n};\n",
|
|
12
|
-
"import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
|
|
12
|
+
"import { colors } from \"consola/utils\";\nimport { relative } from \"pathe\";\nimport type { ZodError } from \"zod\";\n\nimport type { Diagnostic } from \"./types.ts\";\n\n/** A recoverable error carrying a structured diagnostic. */\nexport class BlumeError extends Error {\n readonly diagnostic: Diagnostic;\n\n constructor(diagnostic: Diagnostic) {\n super(diagnostic.message);\n this.name = \"BlumeError\";\n this.diagnostic = diagnostic;\n }\n}\n\nexport const createDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic;\n\n/** Docs site base; diagnostic help links resolve against it. */\nconst DOCS_BASE = \"https://useblume.dev\";\n\nconst DOCS_DEPLOYMENT = \"/docs/deployment\";\nconst DOCS_CLI_VALIDATE = \"/docs/cli/validate\";\nconst DOCS_CONTENT_SOURCES = \"/docs/content/sources\";\nconst DOCS_CONTENT_NAVIGATION = \"/docs/content/navigation\";\nconst DOCS_CONTENT_INCLUDES = \"/docs/content/includes\";\n\n/** Diagnostic code → the docs page that explains it. */\nconst DOCS_PATHS = new Map(\n Object.entries({\n BLUME_ADAPTER_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_ASSETS_UNCHECKED: DOCS_CLI_VALIDATE,\n BLUME_ASSET_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_BROKEN_ANCHOR: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_ASSET: DOCS_CLI_VALIDATE,\n BLUME_BROKEN_LINK: DOCS_CLI_VALIDATE,\n BLUME_COMPONENTS_INVALID: \"/docs/configuration/customization\",\n BLUME_CONFIG_INVALID: \"/docs/configuration\",\n BLUME_CONFIG_LOAD_FAILED: \"/docs/configuration\",\n BLUME_CONTENT_ROOT_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_DEAD_LINK: DOCS_CLI_VALIDATE,\n BLUME_DEPENDENCY_MISSING: \"/docs/cli/doctor\",\n BLUME_DUPLICATE_ROUTE: DOCS_CONTENT_NAVIGATION,\n BLUME_DUPLICATE_SIDEBAR_ORDER: DOCS_CONTENT_NAVIGATION,\n BLUME_FRONTMATTER_INVALID: \"/docs/content/frontmatter\",\n BLUME_INCLUDE_CYCLE: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_MALFORMED: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_NOT_FOUND: DOCS_CONTENT_INCLUDES,\n BLUME_INCLUDE_OUTSIDE_ROOT: DOCS_CONTENT_INCLUDES,\n BLUME_MDX_CURLY_ANCHOR: \"/docs/content/syntax\",\n\n BLUME_META_INVALID: \"/docs/content/meta\",\n BLUME_META_LOAD_FAILED: \"/docs/content/meta\",\n BLUME_MISSING_SECRET: DOCS_DEPLOYMENT,\n BLUME_NAV_DUPLICATE_LABEL: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_HIDDEN_IN_SIDEBAR: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_INDEX_TITLE_MISMATCH: DOCS_CONTENT_NAVIGATION,\n BLUME_NAV_MISSING_PAGE: DOCS_CONTENT_NAVIGATION,\n BLUME_NODE_VERSION: \"/docs/quickstart\",\n BLUME_SERVER_FEATURE_REQUIRED: DOCS_DEPLOYMENT,\n BLUME_SIDEBAR_DISPLAY_IGNORED: DOCS_CONTENT_NAVIGATION,\n BLUME_SOURCE_FETCH_FAILED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_MISCONFIGURED: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_OFFLINE: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_SDK_MISSING: DOCS_CONTENT_SOURCES,\n BLUME_SOURCE_UNAVAILABLE: DOCS_CONTENT_SOURCES,\n BLUME_TRANSLATE_MISSING: \"/docs/cli/translate\",\n BLUME_TRANSLATE_STALE: \"/docs/cli/translate\",\n BLUME_UNKNOWN_COMPONENT: \"/docs/configuration/customization\",\n BLUME_UNKNOWN_DIRECTIVE: \"/docs/content/syntax\",\n BLUME_UNKNOWN_ICON: DOCS_CONTENT_NAVIGATION,\n BLUME_UNKNOWN_OPTION: \"/docs/cli\",\n BLUME_UNLOADABLE_FILE_NAME: \"/docs/content\",\n BLUME_WIKILINK_AMBIGUOUS: DOCS_CONTENT_SOURCES,\n BLUME_WIKILINK_UNRESOLVED: DOCS_CONTENT_SOURCES,\n BLUME_YARN_PNP: \"/docs/quickstart\",\n })\n);\n\n/** The docs URL that explains a diagnostic code, if one is mapped. */\nexport const resolveDocsUrl = (code: string): string | undefined => {\n const path = DOCS_PATHS.get(code);\n return path ? `${DOCS_BASE}${path}` : undefined;\n};\n\n/** Fill in `docsUrl` from the code map where a diagnostic doesn't set its own. */\nexport const enrichDiagnostic = (diagnostic: Diagnostic): Diagnostic =>\n diagnostic.docsUrl\n ? diagnostic\n : { ...diagnostic, docsUrl: resolveDocsUrl(diagnostic.code) };\n\nconst REGEXP_SPECIAL = /[$()*+.?[\\\\\\]^{|}]/gu;\nconst escapeRegExp = (value: string): string =>\n value.replaceAll(REGEXP_SPECIAL, String.raw`\\$&`);\n\n/** A key segment scans the source text; an array index has no key to find. */\nconst isKeySegment = (segment: string | number): segment is string =>\n typeof segment === \"string\";\n\n/**\n * Where a located value's children are searched. `object` and `array` are the\n * inside of a `{…}`/`[…]` literal, searched entry by entry so a key or an index\n * only matches a direct child. `block` has no brackets — the whole file at the\n * top, or a YAML key's indented lines — and is searched at any depth.\n */\ninterface Scope {\n end: number;\n /** A literal's direct entries (keys or elements), in source order. */\n entries: number[];\n kind: \"array\" | \"block\" | \"object\";\n start: number;\n}\n\n/** A located key or element: where it starts, and where its value starts. */\ninterface Step {\n index: number;\n next: number;\n}\n\nconst QUOTES = new Set(['\"', \"'\", \"`\"]);\nconst OPENERS = new Set([\"(\", \"[\", \"{\"]);\nconst CLOSERS = new Set([\")\", \"]\", \"}\"]);\nconst WHITESPACE = /\\s/u;\n\n/**\n * The index just past a comment starting at `index`, or `index` when none does.\n * A `//` after a `:` is a URL scheme in YAML (`href: https://…`), not a comment.\n */\nconst skipComment = (source: string, index: number): number => {\n if (source.startsWith(\"//\", index) && source.charAt(index - 1) !== \":\") {\n const end = source.indexOf(\"\\n\", index);\n return end === -1 ? source.length : end;\n }\n if (source.startsWith(\"/*\", index)) {\n const end = source.indexOf(\"*/\", index + 2);\n return end === -1 ? source.length : end + 2;\n }\n return index;\n};\n\n/**\n * The index just past a string literal starting at `index`, or `index` when\n * none does. A `'`/`\"` that doesn't close on its own line is an apostrophe in\n * plain YAML text, not a string.\n */\nconst skipString = (source: string, index: number): number => {\n const quote = source.charAt(index);\n if (!QUOTES.has(quote)) {\n return index;\n }\n let cursor = index + 1;\n while (cursor < source.length) {\n const char = source.charAt(cursor);\n if (char === quote) {\n return cursor + 1;\n }\n if (char === \"\\n\" && quote !== \"`\") {\n return index;\n }\n cursor += char === \"\\\\\" ? 2 : 1;\n }\n return index;\n};\n\n/** Where a literal closes, and where each of its direct entries starts. */\ninterface LiteralScan {\n end: number;\n entries: number[];\n}\n\n/**\n * Walk the `{…}`/`[…]` literal opened at `open`: where each direct entry starts\n * (a key, or an array element) and where the literal closes. Nested brackets,\n * strings, and comments are stepped over, so only the literal's own commas\n * separate its entries.\n */\nconst scanLiteral = (source: string, open: number): LiteralScan => {\n const entries: number[] = [];\n let depth = 0;\n let pending = true;\n let index = open + 1;\n while (index < source.length) {\n const afterComment = skipComment(source, index);\n const char = source.charAt(index);\n if (afterComment !== index || WHITESPACE.test(char)) {\n index = Math.max(afterComment, index + 1);\n continue;\n }\n if (depth === 0 && CLOSERS.has(char)) {\n return { end: index, entries };\n }\n if (depth === 0 && pending) {\n entries.push(index);\n pending = false;\n }\n const afterString = skipString(source, index);\n if (afterString !== index) {\n index = afterString;\n continue;\n }\n if (OPENERS.has(char)) {\n depth += 1;\n } else if (CLOSERS.has(char)) {\n depth -= 1;\n } else if (char === \",\" && depth === 0) {\n pending = true;\n }\n index += 1;\n }\n return { end: source.length, entries };\n};\n\n/**\n * The lines indented deeper than the key at `anchor` — a YAML mapping's\n * children — up to the first line that isn't, or `limit`.\n */\nconst indentedBlock = (\n source: string,\n anchor: number,\n limit: number\n): Scope => {\n const column = anchor - (source.lastIndexOf(\"\\n\", anchor - 1) + 1);\n const lineEnd = source.indexOf(\"\\n\", anchor);\n const start = lineEnd === -1 ? limit : Math.min(lineEnd + 1, limit);\n let end = start;\n while (end < limit) {\n const next = source.indexOf(\"\\n\", end);\n const after = next === -1 || next >= limit ? limit : next + 1;\n const line = source.slice(end, after);\n if (line.trim() !== \"\" && line.length - line.trimStart().length <= column) {\n break;\n }\n end = after;\n }\n return { end, entries: [], kind: \"block\", start };\n};\n\n/** A value's lead-in before its literal: spaces, or an adapter call's `vercel(`. */\nconst VALUE_LEAD = /[\\s\\w$.(]*/uy;\n\n/**\n * The scope holding the children of the key or element at `anchor`, whose\n * value starts at `from`. A `{…}`/`[…]` literal — written directly, or as the\n * first argument of a call like `vercel({…})` — is walked entry by entry;\n * anything else falls back to the lines indented under `anchor` (YAML's\n * nesting), within the enclosing scope's `limit`.\n */\nconst valueScope = (source: string, step: Step, limit: number): Scope => {\n VALUE_LEAD.lastIndex = step.next;\n VALUE_LEAD.exec(source);\n const open = VALUE_LEAD.lastIndex;\n const char = source.charAt(open);\n if (open < limit && (char === \"{\" || char === \"[\")) {\n const literal = scanLiteral(source, open);\n return {\n end: literal.end,\n entries: literal.entries,\n kind: char === \"{\" ? \"object\" : \"array\",\n start: open,\n };\n }\n return indentedBlock(source, step.index, limit);\n};\n\n/**\n * Find `segment` as a `key:`/`key =` (bare or quoted) in `scope`: among an\n * object literal's own entries, or anywhere in a block. The negative lookbehind\n * keeps `title` from matching the tail of an unrelated key such as `subtitle:`.\n */\nconst findKey = (\n source: string,\n scope: Scope,\n segment: string\n): Step | undefined => {\n const key = escapeRegExp(segment);\n const pattern = `(?<![\\\\w$])(?:${key}|\"${key}\"|'${key}')\\\\s*[:=]`;\n if (scope.kind === \"block\") {\n const matcher = new RegExp(pattern, \"gu\");\n matcher.lastIndex = scope.start;\n const match = matcher.exec(source);\n return match && match.index < scope.end\n ? { index: match.index, next: matcher.lastIndex }\n : undefined;\n }\n // Sticky: the key must start exactly where the entry does.\n const matcher = new RegExp(pattern, \"uy\");\n for (const entry of scope.kind === \"object\" ? scope.entries : []) {\n matcher.lastIndex = entry;\n if (matcher.test(source)) {\n return { index: entry, next: matcher.lastIndex };\n }\n }\n return undefined;\n};\n\n/** The element at `position` of an array literal; a block can't be indexed. */\nconst findElement = (scope: Scope, position: number): Step | undefined => {\n const index = scope.kind === \"array\" ? scope.entries[position] : undefined;\n return index === undefined ? undefined : { index, next: index };\n};\n\n/**\n * Best-effort source position for a Zod issue path (e.g. `[\"seo\", \"title\"]`,\n * `[\"redirects\", 2, \"status\"]`) in the raw config / frontmatter text. Narrows\n * segment by segment: a key is found among its parent's own entries (or, where\n * there are no brackets, in the parent's indented lines), an index picks that\n * element of an array literal. A segment that isn't there — a missing key —\n * stops the walk at its parent, so the position never escapes into a sibling.\n * Returns 1-based line/column, or undefined when not even the first segment\n * matches.\n */\nconst locatePath = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n let scope: Scope = {\n end: source.length,\n entries: [],\n kind: \"block\",\n start: 0,\n };\n let found = -1;\n for (const segment of path) {\n const step = isKeySegment(segment)\n ? findKey(source, scope, segment)\n : findElement(scope, segment);\n if (!step) {\n break;\n }\n found = step.index;\n scope = valueScope(source, step, scope.end);\n }\n if (found < 0) {\n return;\n }\n const before = source.slice(0, found);\n const lastNewline = before.lastIndexOf(\"\\n\");\n return { column: found - lastNewline, line: before.split(\"\\n\").length };\n};\n\n/** The YAML front matter block of a `.md`/`.mdx` source, if it has one. */\nconst FRONTMATTER = /^---\\r?\\n(?<body>[\\s\\S]*?)\\r?\\n---/u;\n\n/**\n * Locate a front matter key in a content file, e.g. `[\"seo\", \"description\"]` in\n * `docs/api.mdx`. Scoped to the front matter block so a `title:` written in the\n * page body can't be mistaken for the front matter key of the same name; returns\n * undefined when the file has no front matter or the key isn't set (a missing\n * key has no line to point at — callers anchor to the file instead).\n */\nexport const locateFrontmatterKey = (\n source: string,\n path: readonly (string | number)[]\n): { column: number; line: number } | undefined => {\n const block = FRONTMATTER.exec(source);\n if (!block) {\n return;\n }\n // `locatePath` reports lines 1-based within the text it was given, and the\n // front matter body starts one line below the opening `---`.\n const position = locatePath(block.groups?.body ?? \"\", path);\n return position && { column: position.column, line: position.line + 1 };\n};\n\n/**\n * Convert generic validation issues (message + path, the shape shared by Zod\n * and Standard Schema issues) into Blume diagnostics, anchored to a file.\n */\nexport const diagnosticsFromIssues = (\n issues: readonly {\n message: string;\n path: readonly (string | number)[];\n }[],\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n issues.map((issue) => {\n const schemaPath = issue.path.join(\".\");\n const position = options.source\n ? locatePath(options.source, issue.path)\n : undefined;\n return {\n code: options.code,\n column: position?.column,\n file: options.file,\n line: position?.line,\n message: schemaPath ? `${schemaPath}: ${issue.message}` : issue.message,\n schemaPath: schemaPath || undefined,\n severity: \"error\",\n } satisfies Diagnostic;\n });\n\n/** Convert a ZodError into Blume diagnostics, anchored to a file. */\nexport const diagnosticsFromZod = (\n error: ZodError,\n options: { code: string; file?: string; source?: string }\n): Diagnostic[] =>\n diagnosticsFromIssues(\n error.issues.map((issue) => ({\n message: issue.message,\n // Zod 4 paths are PropertyKey[]; a symbol segment has no place in a\n // dotted schema path or a source-position scan.\n path: issue.path.filter(\n (segment): segment is string | number => typeof segment !== \"symbol\"\n ),\n })),\n options\n );\n\nconst severityColor = (severity: Diagnostic[\"severity\"]) => {\n if (severity === \"error\") {\n return colors.red;\n }\n if (severity === \"warning\") {\n return colors.yellow;\n }\n return colors.blue;\n};\n\n/** Format a single diagnostic for terminal output. */\nexport const formatDiagnostic = (\n diagnostic: Diagnostic,\n root?: string\n): string => {\n const color = severityColor(diagnostic.severity);\n const lines: string[] = [\n `${color(colors.bold(diagnostic.code))} ${diagnostic.message}`,\n ];\n\n // An audit finding is about a built URL, and names the source file that fixes\n // it as a second line (\"at /docs/api\" / \"in docs/api.mdx:3:2\"). Everything\n // else is about a file alone, and keeps the original single `at file` line.\n if (diagnostic.url) {\n lines.push(` ${colors.dim(`at ${diagnostic.url}`)}`);\n }\n if (diagnostic.file) {\n const location = root ? relative(root, diagnostic.file) : diagnostic.file;\n const column =\n diagnostic.column === undefined ? \"\" : `:${diagnostic.column}`;\n const position =\n diagnostic.line === undefined ? \"\" : `:${diagnostic.line}${column}`;\n const label = diagnostic.url ? \"in\" : \"at\";\n lines.push(` ${colors.dim(`${label} ${location}${position}`)}`);\n }\n\n if (diagnostic.suggestion) {\n lines.push(` ${colors.cyan(`fix: ${diagnostic.suggestion}`)}`);\n }\n\n if (diagnostic.docsUrl) {\n lines.push(` ${colors.dim(`docs: ${diagnostic.docsUrl}`)}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const hasErrors = (diagnostics: Diagnostic[]): boolean =>\n diagnostics.some((d) => d.severity === \"error\");\n\nexport const countBySeverity = (diagnostics: Diagnostic[]) => {\n const counts = { error: 0, info: 0, warning: 0 } satisfies Record<\n Diagnostic[\"severity\"],\n number\n >;\n for (const diagnostic of diagnostics) {\n counts[diagnostic.severity] += 1;\n }\n return counts;\n};\n",
|
|
13
13
|
"import { consola } from \"consola\";\nimport { relative } from \"pathe\";\n\nimport {\n countBySeverity,\n enrichDiagnostic,\n formatDiagnostic,\n hasErrors,\n} from \"../core/diagnostics.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\nexport const logger = consola.withTag(\"blume\");\n\n/**\n * Resolve once stdout has drained. `process.exit` doesn't flush a piped stdout,\n * so await this before exiting non-zero after writing machine-readable output\n * (e.g. `--json`), otherwise the payload can be truncated in CI.\n */\nexport const flushStdout = (): Promise<void> =>\n // oxlint-disable-next-line promise/avoid-new -- adapt stdout's write callback\n new Promise((resolve) => {\n process.stdout.write(\"\", () => resolve());\n });\n\n/**\n * Print diagnostics as a JSON document on stdout for CI and editors: each is\n * enriched with its `docsUrl` and its `file` made root-relative. Returns whether\n * any were errors, matching {@link reportDiagnostics}.\n */\nexport const reportDiagnosticsJson = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n const enriched = diagnostics.map((diagnostic) => {\n const withDocs = enrichDiagnostic(diagnostic);\n return withDocs.file && root\n ? { ...withDocs, file: relative(root, withDocs.file) }\n : withDocs;\n });\n process.stdout.write(\n `${JSON.stringify(\n { diagnostics: enriched, summary: countBySeverity(diagnostics) },\n null,\n 2\n )}\\n`\n );\n return hasErrors(diagnostics);\n};\n\n/** Print a batch of diagnostics and return whether any were errors. */\nexport const reportDiagnostics = (\n diagnostics: Diagnostic[],\n root?: string\n): boolean => {\n if (diagnostics.length === 0) {\n return false;\n }\n\n for (const diagnostic of diagnostics) {\n process.stderr.write(\n `${formatDiagnostic(enrichDiagnostic(diagnostic), root)}\\n`\n );\n }\n\n const counts = countBySeverity(diagnostics);\n const summary = [\n counts.error ? `${counts.error} error(s)` : null,\n counts.warning ? `${counts.warning} warning(s)` : null,\n ]\n .filter(Boolean)\n .join(\", \");\n if (summary) {\n process.stderr.write(`\\n${summary}\\n`);\n }\n\n return hasErrors(diagnostics);\n};\n",
|
|
14
14
|
"import type { ArgsDef } from \"citty\";\n\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** A flag the command doesn't declare, with the declared one it most resembles. */\nexport interface UnknownFlag {\n /** The flag as typed, without any `=value`. */\n flag: string;\n /** The closest declared flag (`--isolated` for `--isolatd`), if one is close. */\n suggestion?: string;\n}\n\n/** What a declared option spelling means for the token that follows it. */\ninterface KnownFlag {\n /** Whether it's a boolean switch, which `--no-<name>` turns off. */\n boolean: boolean;\n /**\n * How the flags a command takes list it: `--kebab-name`, or `--no-<name>`\n * for a boolean that's on by default, since that's the form anyone types.\n */\n display: string;\n /** The canonical kebab-case name, which typos are matched against. */\n name: string;\n /** Whether it reads the next token as its value (`--port 4000`). */\n takesValue: boolean;\n}\n\n/** `budgetJs` → `budget-js`; a name already in kebab case is unchanged. */\nconst kebabCase = (name: string): string =>\n name.replaceAll(/(?<upper>[A-Z])/gu, (letter) => `-${letter.toLowerCase()}`);\n\n/** `budget-js` → `budgetJs`; a name already in camel case is unchanged. */\nconst camelCase = (name: string): string =>\n name.replaceAll(/-(?<letter>[a-z])/gu, (match) =>\n match.slice(1).toUpperCase()\n );\n\nconst aliasesOf = (alias: string | string[] | undefined): string[] => {\n if (alias === undefined) {\n return [];\n }\n return Array.isArray(alias) ? alias : [alias];\n};\n\n/**\n * Every spelling citty accepts for each declared option — the name, its camel\n * and kebab forms, and its aliases — mapped to what that option is. Positional\n * arguments aren't flags and don't appear.\n */\nconst knownFlags = (argsDef: ArgsDef): Map<string, KnownFlag> => {\n const flags = new Map<string, KnownFlag>();\n for (const [name, def] of Object.entries(argsDef)) {\n if (def.type === \"positional\") {\n continue;\n }\n const kebab = kebabCase(name);\n const boolean = def.type === \"boolean\";\n const onByDefault = boolean && \"default\" in def && def.default === true;\n const flag = {\n boolean,\n display: onByDefault ? `--no-${kebab}` : `--${kebab}`,\n name: kebab,\n takesValue: def.type === \"string\" || def.type === \"enum\",\n };\n for (const spelling of [\n name,\n kebabCase(name),\n camelCase(name),\n ...aliasesOf(\"alias\" in def ? def.alias : undefined),\n ]) {\n flags.set(spelling, flag);\n }\n }\n return flags;\n};\n\n/** Edit distance between two short strings (insertions, deletions, swaps of one letter). */\nconst distance = (from: string, to: string): number => {\n let previous = Array.from({ length: to.length + 1 }, (_, index) => index);\n for (const [row, fromChar] of [...from].entries()) {\n const current = [row + 1];\n for (const [column, toChar] of [...to].entries()) {\n current.push(\n Math.min(\n (previous[column + 1] ?? 0) + 1,\n (current[column] ?? 0) + 1,\n (previous[column] ?? 0) + (fromChar === toChar ? 0 : 1)\n )\n );\n }\n previous = current;\n }\n return previous[to.length] ?? 0;\n};\n\n/**\n * The candidate closest to `name`, when it's close enough to be the likely\n * intent: at most two edits away, and fewer edits than half the candidate's\n * length, so a short typo doesn't \"suggest\" an unrelated short word.\n */\nexport const closestMatch = (\n name: string,\n candidates: readonly string[]\n): string | undefined => {\n let best: { candidate: string; edits: number } | undefined;\n for (const candidate of candidates) {\n const edits = distance(name, candidate);\n if (\n edits <= 2 &&\n edits * 2 < candidate.length &&\n (best === undefined || edits < best.edits)\n ) {\n best = { candidate, edits };\n }\n }\n return best?.candidate;\n};\n\n/** A `--name`, `--no-name`, `--name=value`, or `-n` token, taken apart. */\ninterface FlagToken {\n /** Whether it carries its value inline (`--port=4000`). */\n hasValue: boolean;\n /** `--name` rather than `-n`. */\n long: boolean;\n /** The name as typed, without dashes or `=value`. */\n name: string;\n /** The negated flag's name, for a `--no-name` token. */\n negated: string | undefined;\n}\n\nconst parseToken = (arg: string): FlagToken => {\n const long = arg.startsWith(\"--\");\n const [name = \"\"] = arg.slice(long ? 2 : 1).split(\"=\");\n return {\n hasValue: arg.includes(\"=\"),\n long,\n name,\n negated: long && name.startsWith(\"no-\") ? name.slice(3) : undefined,\n };\n};\n\n/**\n * How many tokens after this one a declared flag consumes — one for a string\n * flag's separate value (`--port 4000`, read whatever it looks like, as\n * citty's parser does), none otherwise — or undefined when the token names no\n * declared flag. A negation never reads a value; grouped single-letter\n * booleans (`-ab`) are declared when every letter is.\n */\nconst declaredWidth = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): number | undefined => {\n const known =\n flags.get(token.name) ??\n (token.negated === undefined ? undefined : flags.get(token.negated));\n if (known) {\n return known.takesValue && !token.hasValue && token.negated === undefined\n ? 1\n : 0;\n }\n const grouped =\n !token.long &&\n token.name.length > 1 &&\n [...token.name].every((letter) => flags.get(letter)?.takesValue === false);\n return grouped ? 0 : undefined;\n};\n\n/**\n * An undeclared token as reported, with the declared flag it most resembles.\n * A mistyped negation keeps its `no-` in the suggestion (`--no-instal` →\n * `--no-install`), so the fix doesn't flip what was asked for; negating a flag\n * that takes a value means nothing, so those suggest the flag itself.\n */\nconst describeUnknown = (\n token: FlagToken,\n flags: Map<string, KnownFlag>\n): UnknownFlag => {\n const unknown: UnknownFlag = {\n flag: `${token.long ? \"--\" : \"-\"}${token.name}`,\n };\n const names = [...new Set([...flags.values()].map((flag) => flag.name))];\n const match = closestMatch(token.negated ?? token.name, names);\n if (match) {\n const negate = token.negated !== undefined && flags.get(match)?.boolean;\n unknown.suggestion = negate ? `--no-${match}` : `--${match}`;\n }\n return unknown;\n};\n\n/**\n * The flags in `rawArgs` that the command's `args` don't declare. citty itself\n * accepts any flag and drops the ones it doesn't know, so a typo like\n * `--isolatd` would silently run a different command than the one intended.\n *\n * Mirrors what citty accepts: every spelling from {@link knownFlags}, a\n * `--no-<flag>` negation of any of them, `--flag=value`, a declared string\n * flag's separate value token, grouped single-letter boolean aliases, and\n * everything after a bare `--`. `accepted` names extra flags the command\n * handles itself (the removed `blume build --adapter`, which gets its own\n * migration message).\n */\nexport const unknownFlags = (\n rawArgs: readonly string[],\n argsDef: ArgsDef,\n accepted: readonly string[] = []\n): UnknownFlag[] => {\n const flags = knownFlags(argsDef);\n const unknown: UnknownFlag[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index] ?? \"\";\n if (arg === \"--\") {\n break;\n }\n if (!arg.startsWith(\"-\") || arg === \"-\") {\n continue;\n }\n const token = parseToken(arg);\n const width = declaredWidth(token, flags);\n if (width !== undefined) {\n index += width;\n } else if (!accepted.includes(token.negated ?? token.name)) {\n unknown.push(describeUnknown(token, flags));\n }\n }\n return unknown;\n};\n\n/**\n * Flags a command reads from its raw arguments itself instead of declaring\n * them, keyed by command name. `blume build` answers the Blume 1 `--adapter`,\n * `--output`, and `--base` with the `deployment` setting that replaced each,\n * which says more than \"unknown option\" would.\n */\nexport const COMMAND_HANDLED_FLAGS = new Map([\n [\"build\", [\"adapter\", \"output\", \"base\"]],\n]);\n\n/**\n * The error for a command run with flags it doesn't declare: each unknown\n * flag (with its likely intended spelling), then every flag the command does\n * take, so the fix is on screen without a trip to `--help`.\n */\nexport const unknownFlagsDiagnostic = (\n command: string,\n unknown: readonly UnknownFlag[],\n argsDef: ArgsDef\n): Diagnostic => {\n const listed = unknown\n .map(({ flag, suggestion }) =>\n suggestion ? `${flag} (did you mean ${suggestion}?)` : flag\n )\n .join(\", \");\n const declared = [\n ...new Set([...knownFlags(argsDef).values()].map((flag) => flag.display)),\n ].toSorted();\n const takes =\n declared.length > 0\n ? `It takes ${declared.join(\", \")}.`\n : \"It takes no options.\";\n return {\n code: \"BLUME_UNKNOWN_OPTION\",\n message: `blume ${command} doesn't know ${unknown.length === 1 ? \"the option\" : \"the options\"} ${listed}.`,\n severity: \"error\",\n suggestion: `${takes} Run \\`blume ${command} --help\\` for what each does.`,\n };\n};\n",
|
|
15
15
|
"import type { ArgsDef, CommandDef, CommandMeta } from \"citty\";\n\nimport { BlumeError } from \"../core/diagnostics.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { reportDiagnostics } from \"./log.ts\";\nimport {\n COMMAND_HANDLED_FLAGS,\n unknownFlags,\n unknownFlagsDiagnostic,\n} from \"./unknown-flags.ts\";\n\n/**\n * Wrap a command so its module is imported only when citty needs its `args`\n * or runs it. `meta` stays static (from `command-meta.ts`), so rendering root\n * usage, matching an unknown name, and `blume <cmd> --help` for *another*\n * command never touch this one's dependency graph.\n *\n * `load` imports the command's module and `key` names its export, so the call\n * site stays a plain `() => import(\"./commands/x.ts\")`.\n *\n * Only `args`, `setup`, `run`, and `cleanup` are forwarded: no Blume command\n * declares `default`, `plugins`, or nested `subCommands`.\n *\n * Two behaviors every command shares live here rather than in each command:\n * `setup` rejects flags the command doesn't declare (citty accepts and drops\n * them, so `blume build --isolatd` would run a real, non-isolated build), and\n * `run` reports a {@link BlumeError} a command lets escape — a config that\n * fails validation, say — as its diagnostic instead of citty's raw stack dump.\n */\nexport const lazyCommand = <Args extends ArgsDef, Key extends string>(\n meta: CommandMeta,\n load: () => Promise<Record<Key, CommandDef<Args>>>,\n key: Key\n): CommandDef<Args> => {\n const command = async () => {\n const module = await load();\n return module[key];\n };\n const name = meta.name ?? key;\n return {\n args: async () => {\n const { args } = await command();\n // SAFETY: every Blume command passes `args` to `defineCommand` as a plain\n // object literal (the \"command registry\" test checks it); citty's\n // `Resolvable` widening is the only reason the type also admits a thunk\n // or a promise here.\n return args as Args;\n },\n cleanup: async (context) => {\n const loaded = await command();\n await loaded.cleanup?.(context);\n },\n meta,\n run: async (context) => {\n const loaded = await command();\n try {\n await loaded.run?.(context);\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], process.cwd());\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n },\n setup: async (context) => {\n const loaded = await command();\n // SAFETY: as for `args` above, every command's `args` is a plain object.\n const argsDef = (loaded.args ?? {}) as ArgsDef;\n const unknown = unknownFlags(\n context.rawArgs,\n argsDef,\n COMMAND_HANDLED_FLAGS.get(name)\n );\n if (unknown.length > 0) {\n reportDiagnostics([unknownFlagsDiagnostic(name, unknown, argsDef)]);\n process.exit(1);\n }\n await loaded.setup?.(context);\n },\n };\n};\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": "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",
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "62583F2FCD118ED064756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|
|
@@ -20,5 +20,12 @@ import type { ResolvedConfig } from "../core/schema.ts";
|
|
|
20
20
|
* headers. Targets are
|
|
21
21
|
* root-relative under `deployment.base` — RFC 8288 resolves them against the
|
|
22
22
|
* request URL. Returns null when nothing is advertisable.
|
|
23
|
+
*
|
|
24
|
+
* `surface` is where the header is sent. A deployed site (`"build"`) serves
|
|
25
|
+
* every target. The dev server (`"dev"`) serves the routes — the JSON API's
|
|
26
|
+
* OpenAPI document and the Markdown mirror — but not the files `blume build`
|
|
27
|
+
* writes after the build (the API and AI catalogs, `agent-readability.json`,
|
|
28
|
+
* `llms.txt`), so its header leaves those out rather than point agents at
|
|
29
|
+
* 404s.
|
|
23
30
|
*/
|
|
24
|
-
export declare const buildHomeLinkHeader: (config: ResolvedConfig, routePaths: readonly string[]) => string | null;
|
|
31
|
+
export declare const buildHomeLinkHeader: (config: ResolvedConfig, routePaths: readonly string[], surface?: "build" | "dev") => string | null;
|
|
@@ -23,9 +23,12 @@ import type { OpenApiData } from "../openapi/model.ts";
|
|
|
23
23
|
* endpoint and what it does is the part that was missing altogether.
|
|
24
24
|
*
|
|
25
25
|
* `specs` is the parsed `blume:openapi` data — empty when the project has no
|
|
26
|
-
* API reference, in which case every serializer declines.
|
|
26
|
+
* API reference, in which case every serializer declines. `deployBase` is the
|
|
27
|
+
* configured `deployment.base`: operation routes carry `basePath` but not it,
|
|
28
|
+
* and the links written here are made after the agent surfaces rebase the
|
|
29
|
+
* page's own links, so they take it here, as the rendered page's do.
|
|
27
30
|
*/
|
|
28
|
-
export declare const openapiComponentSerializers: (specs: OpenApiData) => {
|
|
31
|
+
export declare const openapiComponentSerializers: (specs: OpenApiData, deployBase?: string) => {
|
|
29
32
|
/**
|
|
30
33
|
* The spec-level block at the top of the overview page: its version and
|
|
31
34
|
* where the API lives. The tag sections that follow are real Markdown
|
|
@@ -6,14 +6,16 @@ import type { BlumeProject } from "../core/project-graph.ts";
|
|
|
6
6
|
* link lands on `/install`; the rendered page rewrites it to the route it
|
|
7
7
|
* means (`markdown/relative-links.ts`), and the Markdown an agent reads gets
|
|
8
8
|
* the same rewrite from the same resolver (`resolveRelativeHref`), so both
|
|
9
|
-
* point at one page. Root-relative
|
|
10
|
-
* `<Card href="/guide"
|
|
11
|
-
*
|
|
12
|
-
* `components/content/base-href.ts`)
|
|
9
|
+
* point at one page. Root-relative links (`[x](/guide)`,
|
|
10
|
+
* `<Card href="/guide">`, ``) get what the rendered page
|
|
11
|
+
* gives them too (`markdown/base-links.ts`,
|
|
12
|
+
* `components/content/base-href.ts`): a page link the `deployment.base` +
|
|
13
|
+
* `basePath` prefix, a public file (`/spec.pdf`) or image the
|
|
14
|
+
* `deployment.base` alone, and, on a page in a prefixed locale, a page link
|
|
13
15
|
* that locale's copy of the route when it is served
|
|
14
|
-
* (`components/layout/LocaleLinks.astro`). Inline links, component
|
|
15
|
-
* and reference definitions are rewritten; fenced and inline code,
|
|
16
|
-
* asset links, and external URLs are left as written.
|
|
16
|
+
* (`components/layout/LocaleLinks.astro`). Inline links, images, component
|
|
17
|
+
* `href`s, and reference definitions are rewritten; fenced and inline code,
|
|
18
|
+
* relative images and asset links, and external URLs are left as written.
|
|
17
19
|
*/
|
|
18
20
|
/** The page a Markdown text was written for. */
|
|
19
21
|
export interface LinkedPage {
|
|
@@ -32,7 +32,10 @@ export interface CollectedSkills {
|
|
|
32
32
|
* hold a `SKILL.md` (the layout `npx skills add` consumes). Subdirectories
|
|
33
33
|
* without one are ignored silently — the directory may hold other assets —
|
|
34
34
|
* while a present-but-invalid skill earns a warning so it isn't dropped
|
|
35
|
-
* behind the publisher's back.
|
|
35
|
+
* behind the publisher's back. Two directories declaring the same `name`
|
|
36
|
+
* would publish to the same artifact path under two index entries, so the
|
|
37
|
+
* first directory in sorted order keeps the name and the other is skipped
|
|
38
|
+
* with a warning naming both.
|
|
36
39
|
*/
|
|
37
40
|
export declare const collectSkills: (dir: string) => Promise<CollectedSkills>;
|
|
38
41
|
/**
|
package/dist/types/ai/tar.d.ts
CHANGED
|
@@ -18,8 +18,6 @@ export interface TarEntry {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Build a gzipped ustar archive of the given files, in the given order. Paths
|
|
21
|
-
*
|
|
22
|
-
* surface a programming error — nanotar would silently truncate an oversized
|
|
23
|
-
* name into a corrupt archive, so the validation stays here.
|
|
21
|
+
* escaping the archive root throw to surface a programming error.
|
|
24
22
|
*/
|
|
25
23
|
export declare const buildTarGz: (entries: readonly TarEntry[]) => Uint8Array;
|