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
|
@@ -371,4 +371,4 @@ var analyzeComponentOverrides = (source, filePath) => {
|
|
|
371
371
|
export { emptyComponentOverrides, ComponentOverridesError, analyzeComponentOverrides };
|
|
372
372
|
|
|
373
373
|
//# debugId=D84ED7D5A5A4CC7064756E2164756E21
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
374
|
+
//# sourceMappingURL=chunk-8ktnccpt.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
+
OPENAPI_PATH,
|
|
3
4
|
hasScalarReferences,
|
|
4
5
|
needsPlaygroundProxy,
|
|
5
6
|
buildMcpDiscovery,
|
|
@@ -10,20 +11,50 @@ import {
|
|
|
10
11
|
routeIsTaken,
|
|
11
12
|
customOgRoutes,
|
|
12
13
|
resolveAskBackend,
|
|
14
|
+
fontLocaleCodes,
|
|
13
15
|
buildIncludeGraph,
|
|
14
16
|
collectContentAssets,
|
|
15
17
|
buildRssFeeds,
|
|
16
18
|
renderRssFeed,
|
|
17
19
|
isOpenApiSource,
|
|
18
20
|
buildRawMarkdown
|
|
19
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-pv29h0wf.js";
|
|
22
|
+
import {
|
|
23
|
+
buildApiSpec,
|
|
24
|
+
buildAskData,
|
|
25
|
+
resolveOgFonts,
|
|
26
|
+
buildThemeCss,
|
|
27
|
+
buildReferenceFiles,
|
|
28
|
+
tailwindEntryTemplate,
|
|
29
|
+
examplesEntryTemplate,
|
|
30
|
+
rebaseSourceDirectives,
|
|
31
|
+
twoslashCss,
|
|
32
|
+
EXAMPLE_SCAN_GLOB,
|
|
33
|
+
exampleScanRoots,
|
|
34
|
+
discoverExamples,
|
|
35
|
+
exampleMarkdownLookup,
|
|
36
|
+
detectNeedsReact,
|
|
37
|
+
detectUsesMath,
|
|
38
|
+
collectStaged,
|
|
39
|
+
buildRuntimeData,
|
|
40
|
+
PLAYGROUND_PROXY_ENTRY,
|
|
41
|
+
playgroundProxyPattern,
|
|
42
|
+
specOrigins,
|
|
43
|
+
proxyAllowlistWarnings,
|
|
44
|
+
analyzeComponentsFile,
|
|
45
|
+
languageIconCssFor,
|
|
46
|
+
clientFeaturesFor
|
|
47
|
+
} from "./chunk-c8chx29p.js";
|
|
20
48
|
import {
|
|
21
49
|
packageRoot
|
|
22
50
|
} from "./index.js";
|
|
23
51
|
import {
|
|
24
52
|
buildSearchDocuments,
|
|
25
53
|
buildMcpData
|
|
26
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-yfyb25rh.js";
|
|
55
|
+
import {
|
|
56
|
+
scanProject
|
|
57
|
+
} from "./chunk-j85vccga.js";
|
|
27
58
|
import {
|
|
28
59
|
planComponentSlots,
|
|
29
60
|
runtimeDependencies,
|
|
@@ -46,42 +77,22 @@ import {
|
|
|
46
77
|
catchAllPageTemplate,
|
|
47
78
|
changelogIndexTemplate,
|
|
48
79
|
notFoundPageTemplate,
|
|
80
|
+
notFoundMarkdownTemplate,
|
|
81
|
+
notFoundJsonTemplate,
|
|
82
|
+
apiPagesIndexTemplate,
|
|
83
|
+
apiPageTemplate,
|
|
84
|
+
apiNavigationTemplate,
|
|
85
|
+
apiSearchTemplate,
|
|
86
|
+
apiNotFoundTemplate,
|
|
49
87
|
exampleSlug,
|
|
50
88
|
exampleWrapperTemplate,
|
|
51
89
|
exampleMapTemplate,
|
|
52
90
|
examplesPageTemplate,
|
|
53
91
|
runtimeTsconfigTemplate
|
|
54
|
-
} from "./chunk-
|
|
92
|
+
} from "./chunk-5m5nmvyq.js";
|
|
55
93
|
import {
|
|
56
94
|
discoverIslands
|
|
57
|
-
} from "./chunk-
|
|
58
|
-
import {
|
|
59
|
-
buildAskData,
|
|
60
|
-
buildThemeCss,
|
|
61
|
-
buildReferenceFiles,
|
|
62
|
-
tailwindEntryTemplate,
|
|
63
|
-
examplesEntryTemplate,
|
|
64
|
-
rebaseSourceDirectives,
|
|
65
|
-
twoslashCss,
|
|
66
|
-
EXAMPLE_SCAN_GLOB,
|
|
67
|
-
exampleScanRoots,
|
|
68
|
-
discoverExamples,
|
|
69
|
-
exampleMarkdownLookup,
|
|
70
|
-
detectNeedsReact,
|
|
71
|
-
detectUsesMath,
|
|
72
|
-
collectStaged,
|
|
73
|
-
buildRuntimeData,
|
|
74
|
-
PLAYGROUND_PROXY_ENTRY,
|
|
75
|
-
playgroundProxyPattern,
|
|
76
|
-
specOrigins,
|
|
77
|
-
proxyAllowlistWarnings,
|
|
78
|
-
analyzeComponentsFile,
|
|
79
|
-
languageIconCssFor,
|
|
80
|
-
clientFeaturesFor
|
|
81
|
-
} from "./chunk-xh43dwgw.js";
|
|
82
|
-
import {
|
|
83
|
-
scanProject
|
|
84
|
-
} from "./chunk-5r8g91qn.js";
|
|
95
|
+
} from "./chunk-b07cmahc.js";
|
|
85
96
|
|
|
86
97
|
// src/registry/eject.ts
|
|
87
98
|
import { existsSync } from "node:fs";
|
|
@@ -161,12 +172,12 @@ var playgroundProxyFiles = (config, openApiData, srcDir) => needsPlaygroundProxy
|
|
|
161
172
|
path: join(srcDir, PLAYGROUND_PROXY_ENTRY)
|
|
162
173
|
}
|
|
163
174
|
] : [];
|
|
164
|
-
var
|
|
165
|
-
|
|
175
|
+
var ejectAgentData = async (project, userPages) => hostsMcp(project, userPages) || project.config.agents.api ? await buildMcpData(project) : null;
|
|
176
|
+
var mcpFiles = (project, userPages, srcDir, data) => {
|
|
177
|
+
if (!(data && hostsMcp(project, userPages))) {
|
|
166
178
|
return [];
|
|
167
179
|
}
|
|
168
180
|
const { route } = project.config.agents.mcp;
|
|
169
|
-
const data = await buildMcpData(project);
|
|
170
181
|
const discoveryInput = {
|
|
171
182
|
base: data.base,
|
|
172
183
|
name: data.name,
|
|
@@ -175,11 +186,6 @@ var mcpFiles = async (project, userPages, srcDir, genDir) => {
|
|
|
175
186
|
version: data.version
|
|
176
187
|
};
|
|
177
188
|
return [
|
|
178
|
-
{
|
|
179
|
-
content: `${JSON.stringify(data)}
|
|
180
|
-
`,
|
|
181
|
-
path: join(genDir, "mcp-data.json")
|
|
182
|
-
},
|
|
183
189
|
{
|
|
184
190
|
content: mcpEndpointTemplate(),
|
|
185
191
|
path: join(srcDir, "pages", mcpPageFile(route))
|
|
@@ -194,6 +200,58 @@ var mcpFiles = async (project, userPages, srcDir, genDir) => {
|
|
|
194
200
|
}
|
|
195
201
|
];
|
|
196
202
|
};
|
|
203
|
+
var apiFiles = (project, userPages, root, srcDir, data) => {
|
|
204
|
+
const { config } = project;
|
|
205
|
+
if (!(data && config.agents.api)) {
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
const server = config.deployment.options.output === "server";
|
|
209
|
+
const apiDir = join(srcDir, "pages", "api");
|
|
210
|
+
const files = [
|
|
211
|
+
{
|
|
212
|
+
content: apiPagesIndexTemplate(),
|
|
213
|
+
path: join(apiDir, "docs", "pages.json.ts")
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
content: apiPageTemplate(),
|
|
217
|
+
path: join(apiDir, "docs", "pages", "[...route].json.ts")
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
content: apiNavigationTemplate(),
|
|
221
|
+
path: join(apiDir, "docs", "navigation.json.ts")
|
|
222
|
+
}
|
|
223
|
+
];
|
|
224
|
+
if (server) {
|
|
225
|
+
files.push({
|
|
226
|
+
content: apiSearchTemplate(),
|
|
227
|
+
path: join(apiDir, "docs", "search.ts")
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
const apiOwned = userPages.some((page) => page.pattern.startsWith("/api/[")) || project.graph.pages.some((page) => page.route === "/api" || page.route.startsWith("/api/"));
|
|
231
|
+
if (server && !apiOwned) {
|
|
232
|
+
files.push({
|
|
233
|
+
content: apiNotFoundTemplate({ base: data.base, site: data.site }),
|
|
234
|
+
path: join(apiDir, "[...path].ts")
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (!(routeIsTaken(userPages, project.graph.pages, OPENAPI_PATH) || existsSync(join(root, "public", "openapi.json")))) {
|
|
238
|
+
files.push({
|
|
239
|
+
content: staticJsonEndpointTemplate(buildApiSpec({
|
|
240
|
+
agentReadability: config.agents.agentReadability,
|
|
241
|
+
base: data.base,
|
|
242
|
+
description: config.description,
|
|
243
|
+
llmsTxt: config.agents.llmsTxt.enabled,
|
|
244
|
+
mcpRoute: hostsMcp(project, userPages) ? config.agents.mcp.route : null,
|
|
245
|
+
name: config.title,
|
|
246
|
+
search: server,
|
|
247
|
+
site: data.site,
|
|
248
|
+
version: data.version
|
|
249
|
+
})),
|
|
250
|
+
path: join(srcDir, "pages", "openapi.json.ts")
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return files;
|
|
254
|
+
};
|
|
197
255
|
var changelogFiles = (project, userPages, srcDir, options) => {
|
|
198
256
|
const hasChangelog = project.graph.pages.some((page) => page.contentType === "changelog" && !(page.meta.draft || page.meta.sidebar.hidden));
|
|
199
257
|
const hasChangelogSource = sourcesOfKind(project.config, "github-releases").length > 0;
|
|
@@ -225,6 +283,10 @@ var contentAssetFiles = async (project, root, srcDir, genDir) => {
|
|
|
225
283
|
}
|
|
226
284
|
];
|
|
227
285
|
};
|
|
286
|
+
var portableIncludeGraph = (project, root) => Object.fromEntries(Object.entries(buildIncludeGraph(project.graph.pages)).map(([partial, includers]) => [
|
|
287
|
+
toPosix(relative(root, partial)),
|
|
288
|
+
includers.map((page) => toPosix(relative(root, page)))
|
|
289
|
+
]));
|
|
228
290
|
var readUserCss = async (file, genDir) => {
|
|
229
291
|
if (!(file && existsSync(file))) {
|
|
230
292
|
return "";
|
|
@@ -414,7 +476,7 @@ var eject = async (root) => {
|
|
|
414
476
|
path: join(genDir, "raw-markdown.json")
|
|
415
477
|
},
|
|
416
478
|
{
|
|
417
|
-
content: `${JSON.stringify(
|
|
479
|
+
content: `${JSON.stringify(portableIncludeGraph(project, root))}
|
|
418
480
|
`,
|
|
419
481
|
path: join(genDir, "includes.json")
|
|
420
482
|
},
|
|
@@ -438,16 +500,40 @@ var eject = async (root) => {
|
|
|
438
500
|
staged: hasStaged
|
|
439
501
|
});
|
|
440
502
|
if (config.seo.og.enabled) {
|
|
503
|
+
const { fallbacks, families } = resolveOgFonts({
|
|
504
|
+
locales: fontLocaleCodes(config.i18n),
|
|
505
|
+
ogFonts: config.seo.og.fonts,
|
|
506
|
+
themeFonts: config.theme.fonts,
|
|
507
|
+
themeFontsConfigured: false
|
|
508
|
+
}, root);
|
|
441
509
|
files.push({
|
|
442
|
-
content: ogEndpointTemplate(customOgRoutes(pages, config.title, config.seo.og.titles), {
|
|
510
|
+
content: ogEndpointTemplate(customOgRoutes(pages, config.title, config.seo.og.titles), {
|
|
511
|
+
fallbacks,
|
|
512
|
+
families,
|
|
513
|
+
pageDescriptions: config.seo.og.description !== false
|
|
514
|
+
}, changelog.length > 0),
|
|
443
515
|
path: join(srcDir, "pages", "og", "[...slug].png.ts")
|
|
444
516
|
});
|
|
445
517
|
}
|
|
446
|
-
|
|
518
|
+
const agentData = await ejectAgentData(project, pages);
|
|
519
|
+
if (agentData) {
|
|
520
|
+
files.push({
|
|
521
|
+
content: `${JSON.stringify(agentData)}
|
|
522
|
+
`,
|
|
523
|
+
path: join(genDir, "mcp-data.json")
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
files.push(...mcpFiles(project, pages, srcDir, agentData), ...apiFiles(project, pages, root, srcDir, agentData), ...changelog, ...playgroundProxyFiles(config, openApiData, srcDir));
|
|
447
527
|
if (!routeIsTaken(pages, project.graph.pages, "/404")) {
|
|
448
528
|
files.push({
|
|
449
529
|
content: notFoundPageTemplate(),
|
|
450
530
|
path: join(srcDir, "pages", "404.astro")
|
|
531
|
+
}, {
|
|
532
|
+
content: notFoundMarkdownTemplate(),
|
|
533
|
+
path: join(srcDir, "pages", "404.md.ts")
|
|
534
|
+
}, {
|
|
535
|
+
content: notFoundJsonTemplate(),
|
|
536
|
+
path: join(srcDir, "pages", "404.json.ts")
|
|
451
537
|
});
|
|
452
538
|
}
|
|
453
539
|
files.push({
|
|
@@ -538,5 +624,5 @@ var eject = async (root) => {
|
|
|
538
624
|
|
|
539
625
|
export { eject };
|
|
540
626
|
|
|
541
|
-
//# debugId=
|
|
542
|
-
//# sourceMappingURL=chunk-
|
|
627
|
+
//# debugId=85A9341CACEEA14864756E2164756E21
|
|
628
|
+
//# sourceMappingURL=chunk-9t7a85s3.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/registry/eject.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { existsSync } from \"node:fs\";\nimport { cp, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\nimport { join, relative } from \"pathe\";\n\nimport { OPENAPI_PATH } from \"../ai/api/paths.ts\";\nimport { buildApiSpec } from \"../ai/api/spec.ts\";\nimport { buildAskData } from \"../ai/ask-data.ts\";\nimport { resolveAskBackend } from \"../ai/ask.ts\";\nimport { buildRawMarkdown } from \"../ai/markdown.ts\";\nimport { buildMcpData } from \"../ai/mcp/data.ts\";\nimport type { McpData } from \"../ai/mcp/data.ts\";\nimport { buildMcpDiscovery, buildMcpServerCard } from \"../ai/mcp/discovery.ts\";\nimport { planComponentSlots } from \"../astro/component-slots.ts\";\nimport {\n EXAMPLE_SCAN_GLOB,\n discoverExamples,\n exampleMarkdownLookup,\n exampleScanRoots,\n} from \"../astro/examples.ts\";\nimport {\n analyzeComponentsFile,\n buildRuntimeData,\n clientFeaturesFor,\n collectStaged,\n detectNeedsReact,\n detectUsesMath,\n languageIconCssFor,\n PLAYGROUND_PROXY_ENTRY,\n playgroundProxyPattern,\n proxyAllowlistWarnings,\n specOrigins,\n} from \"../astro/generate.ts\";\nimport { discoverIslands } from \"../astro/islands.ts\";\nimport { customOgRoutes, discoverPages, routeIsTaken } from \"../astro/pages.ts\";\nimport {\n apiNavigationTemplate,\n apiNotFoundTemplate,\n apiPagesIndexTemplate,\n apiPageTemplate,\n apiSearchTemplate,\n askComponentTemplate,\n askEndpointTemplate,\n astroConfigTemplate,\n catchAllPageTemplate,\n changelogIndexTemplate,\n contentAssetsEndpointTemplate,\n contentConfigTemplate,\n exampleMapTemplate,\n exampleSlug,\n examplesPageTemplate,\n exampleWrapperTemplate,\n featuresTemplate,\n mcpEndpointTemplate,\n mcpPageFile,\n mixedbreadSearchEndpointTemplate,\n notFoundJsonTemplate,\n notFoundMarkdownTemplate,\n notFoundPageTemplate,\n ogEndpointTemplate,\n playgroundProxyTemplate,\n rawMarkdownEndpointTemplate,\n rssEndpointTemplate,\n runtimeDependencies,\n runtimeTsconfigTemplate,\n searchClientTemplate,\n searchEndpointTemplate,\n staticJsonEndpointTemplate,\n} from \"../astro/templates.ts\";\nimport { collectContentAssets } from \"../core/content-assets.ts\";\nimport { buildIncludeGraph } from \"../core/includes.ts\";\nimport { packageRoot } from \"../core/package-root.ts\";\nimport { scanProject } from \"../core/project-graph.ts\";\nimport type { BlumeProject } from \"../core/project-graph.ts\";\nimport {\n resolveDocsCollection,\n sourcesOfKind,\n} from \"../core/sources/collection.ts\";\nimport type { ProjectContext } from \"../core/types.ts\";\nimport { buildRssFeeds, renderRssFeed } from \"../deploy/rss.ts\";\nimport { resolveOgFonts } from \"../og/derive.ts\";\nimport type { OpenApiData } from \"../openapi/model.ts\";\nimport {\n hasScalarReferences,\n needsPlaygroundProxy,\n} from \"../openapi/references.ts\";\nimport { buildReferenceFiles } from \"../openapi/scalar.ts\";\nimport { isOpenApiSource } from \"../openapi/source.ts\";\nimport { buildSearchDocuments } from \"../search/documents.ts\";\nimport {\n examplesEntryTemplate,\n tailwindEntryTemplate,\n} from \"../theme/entry.ts\";\nimport { fontLocaleCodes } from \"../theme/fonts.ts\";\nimport { buildThemeCss } from \"../theme/palette.ts\";\nimport { rebaseSourceDirectives } from \"../theme/sources.ts\";\nimport { twoslashCss } from \"../theme/twoslash.ts\";\n\nconst toPosix = (path: string): string => path.split(\"\\\\\").join(\"/\");\n\n/** The portable `@source` guess: blume in the project's own node_modules. */\nconst LOCAL_BLUME_SOURCE = \"../../node_modules/blume/src/**/*.{astro,ts,tsx}\";\n\n/**\n * The `@source` glob pointing Tailwind at Blume's own source, relative to the\n * ejected `src/generated/app.css`. The project-local `node_modules/blume` is\n * preferred (portable, and under pnpm the symlink survives version bumps), but\n * hoisted installs (npm/yarn workspaces lift blume into the workspace root's\n * node_modules) would make that guess match nothing and silently drop utility\n * classes — so fall back to the package's real installed location, and when\n * even that fails, warn instead of failing silently.\n *\n * Exported for testing.\n */\nexport const blumeSourceGlob = (\n root: string,\n genDir: string,\n resolveBlumeRoot: () => string = packageRoot\n): string => {\n if (existsSync(join(root, \"node_modules\", \"blume\"))) {\n return LOCAL_BLUME_SOURCE;\n }\n try {\n const src = join(resolveBlumeRoot(), \"src\");\n return `${toPosix(relative(genDir, src))}/**/*.{astro,ts,tsx}`;\n } catch {\n console.warn(\n 'blume: could not locate the installed blume package; src/generated/app.css keeps its default `@source \"../../node_modules/blume/...\"` glob. If blume is hoisted elsewhere, point that glob at its install location or Blume\\'s utility classes will be missing.'\n );\n return LOCAL_BLUME_SOURCE;\n }\n};\n\n/** The `blume:openapi` payload for the ejected app (`{}` when none). */\nconst ejectOpenApiData = (project: BlumeProject): OpenApiData => {\n const source = project.sources.find(isOpenApiSource);\n return source ? source.openApiData() : {};\n};\n\n/**\n * The assistant endpoint plus, unless the backend runs its own retrieval (Inkeep),\n * its grounding snapshot. Empty when the assistant is disabled.\n */\nconst askFiles = async (\n project: BlumeProject,\n srcDir: string,\n genDir: string\n): Promise<{ content: string; path: string }[]> => {\n const { assistant } = project.config.ai;\n if (!(assistant?.enabled && !assistant.endpoint)) {\n const endpointPath = join(srcDir, \"pages\", \"api\", \"ask.ts\");\n if (existsSync(endpointPath)) {\n const content = await readFile(endpointPath, \"utf-8\");\n if (content.startsWith(\"// Generated by Blume. Do not edit.\")) {\n await rm(endpointPath, { force: true });\n }\n }\n await rm(join(genDir, \"ask-data.json\"), { force: true });\n return [];\n }\n const backend = resolveAskBackend(assistant.provider);\n const files = [\n {\n content: askEndpointTemplate(backend, {\n cors: assistant.cors,\n instructions: assistant.instructions,\n retrieval: assistant.retrieval,\n }),\n path: join(srcDir, \"pages\", \"api\", \"ask.ts\"),\n },\n ];\n if (backend.grounded) {\n files.push({\n content: `${JSON.stringify(await buildAskData(project))}\\n`,\n path: join(genDir, \"ask-data.json\"),\n });\n }\n return files;\n};\n\n/** Whether the ejected app hosts the MCP server (enabled and route free). */\nconst hostsMcp = (\n project: BlumeProject,\n userPages: { pattern: string }[]\n): boolean =>\n project.config.agents.mcp.enabled &&\n !routeIsTaken(\n userPages,\n project.graph.pages,\n project.config.agents.mcp.route\n );\n\n/**\n * The `.well-known` MCP discovery routes, injected as prerendered pages\n * alongside the user's own so the ejected Astro config wires them in. Empty\n * when the server is disabled or its route is already owned by a page.\n */\nconst mcpDiscoveryPages = (\n project: BlumeProject,\n userPages: { pattern: string }[]\n): { entrypoint: string; pattern: string }[] =>\n hostsMcp(project, userPages)\n ? [\n {\n entrypoint: \"src/blume-mcp/discovery.ts\",\n pattern: \"/.well-known/mcp.json\",\n },\n {\n entrypoint: \"src/blume-mcp/server-card.ts\",\n pattern: \"/.well-known/mcp/server-card.json\",\n },\n ]\n : [];\n\n/**\n * The playground's built-in CORS proxy route (`playground: { proxy: true }`),\n * mirroring `planPlaygroundProxy` in generate.ts: injected like the MCP\n * discovery routes, because Astro treats a `_`-prefixed page file as private,\n * and mounted under `basePath` at the URL the playground sends to. Empty when\n * no reference routes its playground through it.\n */\nconst playgroundProxyPages = (\n config: BlumeProject[\"config\"]\n): { entrypoint: string; pattern: string }[] =>\n needsPlaygroundProxy(config)\n ? [\n {\n entrypoint: toPosix(join(\"src\", PLAYGROUND_PROXY_ENTRY)),\n pattern: playgroundProxyPattern(config),\n },\n ]\n : [];\n\n/**\n * The proxy endpoint behind {@link playgroundProxyPages}, with the origin\n * allowlist baked in from the same parsed specs the reference pages render.\n */\nconst playgroundProxyFiles = (\n config: BlumeProject[\"config\"],\n openApiData: OpenApiData,\n srcDir: string\n): { content: string; path: string }[] =>\n needsPlaygroundProxy(config)\n ? [\n {\n content: playgroundProxyTemplate(specOrigins(openApiData)),\n path: join(srcDir, PLAYGROUND_PROXY_ENTRY),\n },\n ]\n : [];\n\n/**\n * The agent data snapshot (`blume:mcp-data`) behind the MCP server and the\n * JSON docs API, mirroring `publishAgentData` in generate.ts: built when\n * either is on, null when neither needs it.\n */\nconst ejectAgentData = async (\n project: BlumeProject,\n userPages: { pattern: string }[]\n): Promise<McpData | null> =>\n hostsMcp(project, userPages) || project.config.agents.api\n ? await buildMcpData(project)\n : null;\n\n/**\n * The MCP server endpoint and `.well-known` discovery documents, mirroring\n * `writeMcpFiles` in generate.ts. Empty when the server is disabled or its\n * route is already owned by a page.\n */\nconst mcpFiles = (\n project: BlumeProject,\n userPages: { pattern: string }[],\n srcDir: string,\n data: McpData | null\n): { content: string; path: string }[] => {\n if (!(data && hostsMcp(project, userPages))) {\n return [];\n }\n const { route } = project.config.agents.mcp;\n const discoveryInput = {\n base: data.base,\n name: data.name,\n route,\n site: data.site,\n version: data.version,\n };\n return [\n {\n content: mcpEndpointTemplate(),\n path: join(srcDir, \"pages\", mcpPageFile(route)),\n },\n {\n content: staticJsonEndpointTemplate(buildMcpDiscovery(discoveryInput)),\n path: join(srcDir, \"blume-mcp\", \"discovery.ts\"),\n },\n {\n content: staticJsonEndpointTemplate(buildMcpServerCard(discoveryInput)),\n path: join(srcDir, \"blume-mcp\", \"server-card.ts\"),\n },\n ];\n};\n\n/**\n * The JSON docs API, mirroring `planApi` and `writeApiFiles` in generate.ts:\n * the prerendered page index, per-page documents, and navigation; on server\n * output the search endpoint and, unless a user page or a content page already\n * lives under `/api/`, the JSON 404 catch-all; and `/openapi.json`, unless a\n * `public/openapi.json` or a page owns that route. The ejected `llms.txt`,\n * homepage `Link` header, and 404 page advertise these routes, so the ejected\n * app serves them. Empty when `agents.api` is off.\n */\nconst apiFiles = (\n project: BlumeProject,\n userPages: { pattern: string }[],\n root: string,\n srcDir: string,\n data: McpData | null\n): { content: string; path: string }[] => {\n const { config } = project;\n if (!(data && config.agents.api)) {\n return [];\n }\n const server = config.deployment.options.output === \"server\";\n const apiDir = join(srcDir, \"pages\", \"api\");\n const files = [\n {\n content: apiPagesIndexTemplate(),\n path: join(apiDir, \"docs\", \"pages.json.ts\"),\n },\n {\n content: apiPageTemplate(),\n path: join(apiDir, \"docs\", \"pages\", \"[...route].json.ts\"),\n },\n {\n content: apiNavigationTemplate(),\n path: join(apiDir, \"docs\", \"navigation.json.ts\"),\n },\n ];\n if (server) {\n files.push({\n content: apiSearchTemplate(),\n path: join(apiDir, \"docs\", \"search.ts\"),\n });\n }\n const apiOwned =\n userPages.some((page) => page.pattern.startsWith(\"/api/[\")) ||\n project.graph.pages.some(\n (page) => page.route === \"/api\" || page.route.startsWith(\"/api/\")\n );\n if (server && !apiOwned) {\n files.push({\n content: apiNotFoundTemplate({ base: data.base, site: data.site }),\n path: join(apiDir, \"[...path].ts\"),\n });\n }\n if (\n !(\n routeIsTaken(userPages, project.graph.pages, OPENAPI_PATH) ||\n existsSync(join(root, \"public\", \"openapi.json\"))\n )\n ) {\n files.push({\n content: staticJsonEndpointTemplate(\n buildApiSpec({\n agentReadability: config.agents.agentReadability,\n base: data.base,\n description: config.description,\n llmsTxt: config.agents.llmsTxt.enabled,\n mcpRoute: hostsMcp(project, userPages)\n ? config.agents.mcp.route\n : null,\n name: config.title,\n search: server,\n site: data.site,\n version: data.version,\n })\n ),\n path: join(srcDir, \"pages\", \"openapi.json.ts\"),\n });\n }\n return files;\n};\n\n/**\n * The `/changelog` index page, mirroring `shouldGenerateChangelog` in\n * generate.ts: emitted when `type: changelog` entries or a release-backed\n * changelog source exist, unless a user page already owns the route.\n */\nconst changelogFiles = (\n project: BlumeProject,\n userPages: { pattern: string }[],\n srcDir: string,\n options: Parameters<typeof changelogIndexTemplate>[0]\n): { content: string; path: string }[] => {\n const hasChangelog = project.graph.pages.some(\n (page) =>\n page.contentType === \"changelog\" &&\n !(page.meta.draft || page.meta.sidebar.hidden)\n );\n const hasChangelogSource =\n sourcesOfKind(project.config, \"github-releases\").length > 0;\n if (\n !(hasChangelog || hasChangelogSource) ||\n routeIsTaken(userPages, project.graph.pages, \"/changelog\")\n ) {\n return [];\n }\n return [\n {\n content: changelogIndexTemplate(options),\n path: join(srcDir, \"pages\", \"changelog.astro\"),\n },\n ];\n};\n\n/**\n * The colocated-image map and the `/blume-assets/[...asset]` endpoint that\n * serves it, mirroring generate.ts: the ejected raw Markdown points\n * `` at `/blume-assets/content/…`, and the config aliases\n * `blume:content-assets` to the map. Each original's path is written relative\n * to the project root (the directory `astro dev`/`astro build` run from), so\n * the ejected app builds from any checkout. Remote-source images need no\n * endpoint: eject copies them into the project's own `public/blume-assets`.\n */\nconst contentAssetFiles = async (\n project: BlumeProject,\n root: string,\n srcDir: string,\n genDir: string\n): Promise<{ content: string; path: string }[]> => {\n const assets = await collectContentAssets(project);\n const portable = Object.fromEntries(\n Object.entries(assets).map(([param, abs]) => [\n param,\n toPosix(relative(root, abs)),\n ])\n );\n return [\n {\n content: `${JSON.stringify(portable)}\\n`,\n path: join(genDir, \"content-assets.json\"),\n },\n {\n content: contentAssetsEndpointTemplate(null),\n path: join(srcDir, \"pages\", \"blume-assets\", \"[...asset].ts\"),\n },\n ];\n};\n\n/**\n * The partial → including-pages map with every path relative to the project\n * root, like every other path in the ejected app, so it holds in any checkout.\n * Its readers (`includeHmrPlugin`, `withIncludeRefresh`) resolve each path\n * against the app's root, which after eject is the project itself.\n */\nconst portableIncludeGraph = (\n project: BlumeProject,\n root: string\n): Record<string, string[]> =>\n Object.fromEntries(\n Object.entries(buildIncludeGraph(project.graph.pages)).map(\n ([partial, includers]) => [\n toPosix(relative(root, partial)),\n includers.map((page) => toPosix(relative(root, page))),\n ]\n )\n );\n\n/** Contents of the configured `examples.css`, or `\"\"` when unset/absent. */\n/**\n * Read a user stylesheet that eject inlines into a generated entry under\n * `genDir`, re-rooting its relative `@source` paths from the user's file.\n * Resolves to an empty string when the file is unset or absent.\n */\nconst readUserCss = async (\n file: string | null,\n genDir: string\n): Promise<string> => {\n if (!(file && existsSync(file))) {\n return \"\";\n }\n const css = await readFile(file, \"utf-8\");\n return rebaseSourceDirectives(css, { from: file, to: genDir });\n};\n\n/**\n * The per-example preview route `<Component />` iframes embed, nested under\n * `basePath` so it stays reachable behind a proxy that only forwards the\n * base. Empty when the project has no examples.\n */\nconst examplesPreviewFiles = (\n srcDir: string,\n basePath: string,\n hasExamples: boolean\n): { content: string; path: string }[] =>\n hasExamples\n ? [\n {\n content: examplesPageTemplate(),\n path: join(\n srcDir,\n \"pages\",\n ...basePath.split(\"/\").filter(Boolean),\n \"blume-examples\",\n \"[...path].astro\"\n ),\n },\n ]\n : [];\n\n/**\n * The packages the ejected app imports by bare name: Astro, Tailwind's Vite\n * plugin, Tailwind and its typography plugin (which the generated `app.css`\n * and `examples.css` import by name), `blume` itself, the integrations the\n * config wires in, whatever the configured adapters declare, and React when\n * islands, examples, or the assistant render with it (Blume ships React, so\n * projects rarely list it). They have to be the project's own dependencies\n * after eject — under a strict linker such as pnpm nothing else makes them\n * resolvable, and `astro build` fails. The hidden runtime reaches the same\n * packages through its `node_modules` junction into Blume's own, so only\n * eject declares the ones its generated files import directly: the AI SDK the\n * assistant route streams through (unless `ai.assistant.endpoint` points\n * elsewhere, when no route is written) and the EPUB generator's browser bundle\n * `features.ts` loads (only named there when `export.epub` is on).\n */\nconst ejectDependencies = (\n options: Parameters<typeof runtimeDependencies>[0]\n): string[] => {\n const { assistant } = options.config.ai;\n return [\n ...new Set([\n \"astro\",\n \"@tailwindcss/vite\",\n \"tailwindcss\",\n \"@tailwindcss/typography\",\n \"blume\",\n ...runtimeDependencies(options),\n ...(options.needsReact ? [\"react\", \"react-dom\"] : []),\n ...(assistant?.enabled && !assistant.endpoint ? [\"ai\"] : []),\n ...(options.config.export.epub ? [\"epub-gen-memory\"] : []),\n ]),\n ];\n};\n\nconst ejectIntegrationBridge = (\n config: BlumeProject[\"config\"],\n root: string,\n configFile: string | null\n): Parameters<typeof astroConfigTemplate>[0][\"integrationBridge\"] =>\n config.integrations.length > 0 && configFile\n ? { configFile: toPosix(relative(root, configFile)) }\n : undefined;\n\n/**\n * Promote the generated runtime into the project as an owned Astro app. After\n * eject the project has a normal `astro.config.mjs` and `src/`, the `blume` CLI\n * is no longer required, and the `blume` package remains importable.\n *\n * Returns the written files plus non-fatal warnings, mirroring the generated\n * runtime (e.g. a Scalar reference spec that wasn't found, or a reference\n * route colliding with a content page), and the packages the ejected app\n * imports by bare name, for the caller to add to package.json.\n */\nexport const eject = async (\n root: string\n): Promise<{ dependencies: string[]; files: string[]; warnings: string[] }> => {\n const project = await scanProject(root, { mode: \"build\" });\n const { context, config } = project;\n\n const srcDir = join(root, \"src\");\n const genDir = join(srcDir, \"generated\");\n const assistantEnabled = config.ai.assistant?.enabled ?? false;\n const exportPdf = config.export.pdf;\n const exportEpub = config.export.epub;\n\n // Discover examples first and expose them on the project, so the agent-facing\n // Markdown built below (raw `.md`, MCP) downlevels `<Component>` to its source.\n const examples = await discoverExamples(root, config.examples.source);\n project.examples = exampleMarkdownLookup(examples.examples);\n\n const [\n pages,\n needsReactRaw,\n usesMath,\n userTheme,\n userExamplesCss,\n rawMarkdown,\n islands,\n overrideAnalysis,\n ] = await Promise.all([\n context.pagesRoot ? discoverPages(context.pagesRoot) : Promise.resolve([]),\n detectNeedsReact(root),\n detectUsesMath(root),\n readUserCss(context.themeFile, genDir),\n readUserCss(\n config.examples.css ? join(root, config.examples.css) : null,\n genDir\n ),\n buildRawMarkdown(project),\n discoverIslands(root),\n analyzeComponentsFile(context.componentsFile),\n ]);\n // The `islands/` convention and `components.ts` share the same static plan\n // the CLI uses, with every import written relative to its generated file so\n // the ejected app builds from any checkout (like the example wrappers below).\n const slotPlan = planComponentSlots(islands.islands, overrideAnalysis, {\n relativeTo: genDir,\n });\n // Island/example/override frameworks drive which Astro renderers the ejected\n // config wires in; React also switches on for project `.tsx`/`.jsx` and the assistant.\n const frameworks = new Set<string>([\n ...islands.islands.map((island) => island.framework),\n ...examples.examples.map((example) => example.framework),\n ...slotPlan.frameworks,\n ]);\n const needsReact =\n needsReactRaw || assistantEnabled || frameworks.has(\"react\");\n const needsVue = frameworks.has(\"vue\");\n const needsSvelte = frameworks.has(\"svelte\");\n\n // A project-relative context so generated files use portable paths.\n const relContext: ProjectContext = {\n ...context,\n contentRoot: toPosix(relative(root, context.contentRoot)),\n distDir: \"./dist\",\n outDir: \".\",\n pagesRoot: context.pagesRoot\n ? `./${toPosix(relative(root, context.pagesRoot))}`\n : null,\n root: \".\",\n };\n // The `docs` collection resolves its base against the real project root and\n // is then relativized like everything else, so the ejected content config\n // never bakes in the absolute path `eject` happened to run from.\n const docsCollection = resolveDocsCollection(config, root);\n const relCollection = {\n ...docsCollection,\n base: toPosix(relative(root, docsCollection.base)),\n };\n\n const relPages = [\n ...pages.map((page) => ({\n entrypoint: toPosix(relative(root, page.entrypoint)),\n pattern: page.pattern,\n })),\n ...mcpDiscoveryPages(project, pages),\n ...playgroundProxyPages(config),\n ];\n const openApiData = ejectOpenApiData(project);\n\n // Non-filesystem sources eject their materialized MDX into `<root>/blume-staged`\n // (a dedicated dir so it never clashes with a content root literally named\n // `content`; the relative `staged` collection points there).\n const staged = collectStaged(project);\n const hasStaged = staged.size > 0;\n const stagedDir = \"blume-staged\";\n const features = await clientFeaturesFor(project);\n const languageIcons = await languageIconCssFor(project);\n\n const files: {\n path: string;\n content: string;\n /** Don't overwrite a file the user already owns (e.g. a tuned tsconfig). */\n skipIfExists?: boolean;\n }[] = [\n {\n content: astroConfigTemplate({\n askPath: \"./src/generated/Ask.astro\",\n config,\n contentRoot: relContext.contentRoot,\n contentRoutes: project.manifest.routes.map((route) => route.path),\n context: relContext,\n examplesPath: \"./src/generated/examples.ts\",\n examplesThemePath: \"./src/generated/examples.css\",\n features,\n featuresPath: \"./src/generated/features.ts\",\n // No CLI publishes the runtime data modules in memory after eject, so\n // the config aliases each to the JSON snapshot written below.\n generatedModulesDir: \"./src/generated\",\n integrationBridge: ejectIntegrationBridge(\n config,\n root,\n context.configFile\n ),\n needsReact,\n needsSvelte,\n needsVue,\n pages: relPages,\n searchClientPath: \"./src/generated/search-client.ts\",\n themePath: \"./src/generated/app.css\",\n }),\n path: join(root, \"astro.config.mjs\"),\n },\n {\n content: runtimeTsconfigTemplate(),\n path: join(root, \"tsconfig.json\"),\n // Never clobber a hand-tuned tsconfig; only write ours if none exists.\n skipIfExists: true,\n },\n {\n content: contentConfigTemplate({\n collection: relCollection,\n config,\n context: relContext,\n staged: hasStaged,\n stagedBase: stagedDir,\n }),\n path: join(srcDir, \"content.config.ts\"),\n },\n {\n content: catchAllPageTemplate({\n exportEpub,\n exportPdf,\n mathEnabled: usesMath,\n needsReact,\n }),\n path: join(srcDir, \"pages\", \"[...slug].astro\"),\n },\n {\n content: slotPlan.module,\n path: join(genDir, \"components.ts\"),\n },\n // The example map the catch-all imports; written even when empty so the\n // `blume:examples` alias always resolves.\n {\n content: exampleMapTemplate(examples.examples, config.basePath),\n path: join(genDir, \"examples.ts\"),\n },\n {\n // The isolated Tailwind entry for `<Component />` preview frames.\n // Relative sources keep the ejected app portable.\n content: examplesEntryTemplate({\n configTokens: buildThemeCss(config.theme),\n sources: exampleScanRoots(root, examples.dir).map(\n (dir) => `${relative(genDir, dir)}/${EXAMPLE_SCAN_GLOB}`\n ),\n userCss: userExamplesCss,\n }),\n path: join(genDir, \"examples.css\"),\n },\n {\n content: tailwindEntryTemplate({\n configTokens: buildThemeCss(config.theme),\n languageIcons,\n // Relative paths from src/generated/app.css keep the ejected app\n // portable; the blume glob resolves the real install location when\n // the package is hoisted out of the project's own node_modules.\n sources: [\n blumeSourceGlob(root, genDir),\n \"../../**/*.{astro,mdx,ts,tsx}\",\n ],\n twoslashCss: twoslashCss(),\n userTheme,\n }),\n path: join(genDir, \"app.css\"),\n },\n { content: buildRuntimeData(project), path: join(genDir, \"data.json\") },\n // The header's Ask trigger behind the `blume:ask` alias. Always written — it\n // renders nothing when Ask is off — so the alias always resolves.\n {\n content: askComponentTemplate(assistantEnabled),\n path: join(genDir, \"Ask.astro\"),\n },\n {\n content: `${JSON.stringify(openApiData)}\\n`,\n path: join(genDir, \"openapi.json\"),\n },\n {\n content: `${JSON.stringify(rawMarkdown)}\\n`,\n path: join(genDir, \"raw-markdown.json\"),\n },\n {\n // The partial → including-pages map behind `includeHmrPlugin`, which the\n // ejected astro.config wires at this exact path — without the file every\n // hot update's read would silently no-op and partial edits would serve\n // stale pages. A snapshot like the rest of `src/generated`: the ejected\n // app owns (and may regenerate or prune) it.\n content: `${JSON.stringify(portableIncludeGraph(project, root))}\\n`,\n path: join(genDir, \"includes.json\"),\n },\n {\n content: rawMarkdownEndpointTemplate(\"md\"),\n path: join(srcDir, \"pages\", \"[...slug].md.ts\"),\n },\n {\n content: rawMarkdownEndpointTemplate(\"mdx\"),\n path: join(srcDir, \"pages\", \"[...slug].mdx.ts\"),\n },\n ];\n\n files.push(...(await contentAssetFiles(project, root, srcDir, genDir)));\n\n if (assistantEnabled) {\n files.push(...(await askFiles(project, srcDir, genDir)));\n }\n\n // The `/changelog` index, mirrored from the generated runtime (`[]` when\n // the project has no changelog). The OG endpoint below adds its card.\n const changelog = changelogFiles(project, pages, srcDir, {\n exportEpub,\n exportPdf,\n needsReact,\n staged: hasStaged,\n });\n\n if (config.seo.og.enabled) {\n // The default script fallbacks ride along (Google family names, nothing\n // machine-specific), so a non-Latin card still renders after eject. An\n // explicit seo.og.fonts replaces them, and isn't carried over.\n const { fallbacks, families } = resolveOgFonts(\n {\n locales: fontLocaleCodes(config.i18n),\n ogFonts: config.seo.og.fonts,\n themeFonts: config.theme.fonts,\n themeFontsConfigured: false,\n },\n root\n );\n files.push({\n content: ogEndpointTemplate(\n customOgRoutes(pages, config.title, config.seo.og.titles),\n {\n fallbacks,\n families,\n pageDescriptions: config.seo.og.description !== false,\n },\n changelog.length > 0\n ),\n path: join(srcDir, \"pages\", \"og\", \"[...slug].png.ts\"),\n });\n }\n\n // The hosted MCP server, the JSON docs API, and the playground's built-in\n // proxy, mirrored from the generated runtime (`[]` when each is off). The\n // server and the API share one agent data snapshot.\n const agentData = await ejectAgentData(project, pages);\n if (agentData) {\n files.push({\n content: `${JSON.stringify(agentData)}\\n`,\n path: join(genDir, \"mcp-data.json\"),\n });\n }\n files.push(\n ...mcpFiles(project, pages, srcDir, agentData),\n ...apiFiles(project, pages, root, srcDir, agentData),\n ...changelog,\n ...playgroundProxyFiles(config, openApiData, srcDir)\n );\n\n // Default 404 page and its Markdown (`/404.md`) and JSON (`/404.json`)\n // twins, mirroring `writeNotFoundPage` in generate.ts: all three are skipped\n // when the project already owns `/404` (a custom `pages/404.astro` or a\n // `404.md` content page). The ejected project owns the files afterwards and\n // can edit or remove them.\n if (!routeIsTaken(pages, project.graph.pages, \"/404\")) {\n files.push(\n {\n content: notFoundPageTemplate(),\n path: join(srcDir, \"pages\", \"404.astro\"),\n },\n {\n content: notFoundMarkdownTemplate(),\n path: join(srcDir, \"pages\", \"404.md.ts\"),\n },\n {\n content: notFoundJsonTemplate(),\n path: join(srcDir, \"pages\", \"404.json.ts\"),\n }\n );\n }\n\n // The client-feature loaders behind the `blume:features` alias, and the\n // provider-specific client loader behind `blume:search-client`.\n files.push(\n {\n content: featuresTemplate(features),\n path: join(genDir, \"features.ts\"),\n },\n {\n content: searchClientTemplate(config),\n path: join(genDir, \"search-client.ts\"),\n }\n );\n\n const searchAdapter = config.search.provider;\n if (searchAdapter.mode === \"static\") {\n const documents = await buildSearchDocuments(project);\n files.push(\n {\n content: `${JSON.stringify(documents)}\\n`,\n path: join(genDir, \"search.json\"),\n },\n {\n content: searchEndpointTemplate(),\n path: join(srcDir, \"pages\", \"blume-search.json.ts\"),\n }\n );\n }\n\n if (searchAdapter.kind === \"mixedbread\") {\n files.push({\n content: mixedbreadSearchEndpointTemplate(searchAdapter.options),\n path: join(srcDir, \"pages\", \"api\", \"search.ts\"),\n });\n }\n\n const feeds = buildRssFeeds(project);\n if (feeds.length > 0) {\n const feedXml = Object.fromEntries(\n feeds.map((feed) => [feed.type, renderRssFeed(feed)])\n );\n files.push(\n {\n content: `${JSON.stringify(feedXml)}\\n`,\n path: join(genDir, \"rss.json\"),\n },\n {\n content: rssEndpointTemplate(),\n path: join(srcDir, \"pages\", \"[section]\", \"rss.xml.ts\"),\n }\n );\n }\n\n // Scalar API/AsyncAPI reference pages, mirrored from the generated runtime so\n // the ejected app keeps its reference routes — including the warnings (a\n // missing spec file, a route collision), which the caller surfaces exactly\n // like the generated-runtime path does.\n // A proxied spec with no origin to allow gets the generated runtime's\n // diagnostic too.\n const warnings: string[] = proxyAllowlistWarnings(config, openApiData);\n if (hasScalarReferences(config)) {\n const references = await buildReferenceFiles({\n config,\n contentRoutes: new Set(project.graph.pages.map((page) => page.route)),\n root,\n });\n warnings.push(...references.warnings);\n for (const file of references.files) {\n files.push({\n content: file.content,\n path: join(srcDir, \"pages\", file.pagePath),\n });\n }\n }\n\n // Per-override and per-example live wrappers referenced by the maps above.\n files.push(\n ...slotPlan.wrappers.map((wrapper) => ({\n content: wrapper.content,\n path: join(genDir, \"component-slots\", `${wrapper.name}.astro`),\n })),\n ...examples.examples.map((example) => ({\n content: exampleWrapperTemplate(example, join(genDir, \"examples\")),\n path: join(genDir, \"examples\", `${exampleSlug(example.path)}.astro`),\n })),\n ...examplesPreviewFiles(\n srcDir,\n config.basePath,\n examples.examples.length > 0\n )\n );\n\n // Materialize staged source bodies under `<root>/blume-staged/<source>/<ref>`,\n // matching the relative `staged` collection base in the ejected config.\n for (const [entryId, content] of staged) {\n files.push({ content, path: join(root, stagedDir, entryId) });\n }\n\n const written = files.filter(\n (file) => !(file.skipIfExists && existsSync(file.path))\n );\n await Promise.all(\n written.map(async (file) => {\n await mkdir(join(file.path, \"..\"), { recursive: true });\n await writeFile(file.path, file.content, \"utf-8\");\n })\n );\n\n // Materialized source assets (e.g. downloaded Notion images) live under the\n // hidden runtime's public dir; copy them into the owned project's `public/`\n // so the staged content's `/blume-assets/…` references still resolve.\n const assetsSrc = join(context.outDir, \"public\", \"blume-assets\");\n if (existsSync(assetsSrc)) {\n await cp(assetsSrc, join(root, \"public\", \"blume-assets\"), {\n recursive: true,\n });\n }\n\n // The hidden runtime is no longer the source of truth.\n await rm(context.outDir, { force: true, recursive: true });\n\n return {\n dependencies: ejectDependencies({\n config,\n needsReact,\n needsSvelte,\n needsVue,\n }),\n files: written.map((file) => file.path),\n warnings,\n };\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "85A9341CACEEA14864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
packageSrc,
|
|
8
8
|
registry,
|
|
9
9
|
findItem
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-r20tn01b.js";
|
|
11
11
|
|
|
12
12
|
// src/cli/commands/add.ts
|
|
13
13
|
import { existsSync } from "node:fs";
|
|
@@ -96,4 +96,4 @@ export {
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
//# debugId=B640E77C94BA0A0364756E2164756E21
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-a58773jm.js.map
|
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
deployPlatform,
|
|
4
4
|
resolveProjectContext,
|
|
5
5
|
loadConfig
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import"./chunk-
|
|
6
|
+
} from "./chunk-pv29h0wf.js";
|
|
7
|
+
import"./chunk-3em5wd2y.js";
|
|
8
8
|
import {
|
|
9
9
|
commandMeta,
|
|
10
10
|
normalizeHost,
|
|
@@ -12,13 +12,13 @@ import {
|
|
|
12
12
|
} from "./index.js";
|
|
13
13
|
import {
|
|
14
14
|
deployOutputDir
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import {
|
|
17
|
-
refuseIfEjected
|
|
18
|
-
} from "./chunk-4e9b9ra6.js";
|
|
15
|
+
} from "./chunk-5m5nmvyq.js";
|
|
19
16
|
import {
|
|
20
17
|
parsePort
|
|
21
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-e04dxsz1.js";
|
|
19
|
+
import {
|
|
20
|
+
refuseIfEjected
|
|
21
|
+
} from "./chunk-ey84smr6.js";
|
|
22
22
|
|
|
23
23
|
// src/cli/commands/preview.ts
|
|
24
24
|
import { existsSync } from "node:fs";
|
|
@@ -60,5 +60,5 @@ export {
|
|
|
60
60
|
previewCommand
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//# debugId=
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
63
|
+
//# debugId=062E50A4A26E603564756E2164756E21
|
|
64
|
+
//# sourceMappingURL=chunk-acanzt5p.js.map
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
"import { existsSync } from \"node:fs\";\n\nimport { preview } from \"astro\";\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { loadConfig } from \"../../core/config.ts\";\nimport { resolveProjectContext } from \"../../core/project.ts\";\nimport { deployOutputDir } from \"../../deploy/adapter-output.ts\";\nimport { deployPlatform } from \"../../deploy/platforms/index.ts\";\nimport { parsePort } from \"../args.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { refuseIfEjected } from \"../eject-scripts.ts\";\nimport { normalizeHost } from \"../host-args.ts\";\nimport { logger } from \"../log.ts\";\n\nexport const previewCommand = defineCommand({\n args: {\n host: { description: \"Network host to bind.\", type: \"string\" },\n port: { description: \"Port to listen on.\", type: \"string\" },\n },\n meta: commandMeta.preview,\n async run({ args }) {\n const root = process.cwd();\n await refuseIfEjected(root, \"preview\");\n const { config } = await loadConfig(root);\n const context = resolveProjectContext(root, config);\n\n // Astro previews a server build through its adapter's preview entrypoint,\n // and the Vercel and Netlify adapters declare none, so Astro would throw\n // mid-command. Say so up front, with what to run instead.\n const { deployment } = config;\n const platform = deployPlatform(deployment);\n if (deployment.options.output === \"server\" && platform.previewDeploy) {\n logger.error(\n `\\`blume preview\\` can't serve a ${deployment.kind}() server build: ${platform.astro?.package} has no local preview server. Run \\`blume dev\\` to try the site locally, or deploy a preview with \\`${platform.previewDeploy}\\`.`\n );\n process.exit(1);\n }\n\n // `blume dev` writes `.blume/astro.config.mjs` too, so the runtime alone\n // doesn't mean there's anything to serve: the build output must exist.\n if (\n !existsSync(join(context.outDir, \"astro.config.mjs\")) ||\n !existsSync(deployOutputDir(config, context))\n ) {\n logger.error(\"No build found. Run `blume build` first.\");\n process.exit(1);\n }\n\n await preview({\n logLevel: \"info\",\n root: context.outDir,\n server: {\n // `normalizeHost` maps a bare `--host` (citty parses it as \"\") to\n // `true` so Vite binds all interfaces instead of the hostname \"\".\n host: normalizeHost(args.host),\n port: parsePort(args.port),\n },\n });\n },\n});\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA;AACA;AACA;AAYO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM,EAAE,aAAa,yBAAyB,MAAM,SAAS;AAAA,IAC7D,MAAM,EAAE,aAAa,sBAAsB,MAAM,SAAS;AAAA,EAC5D;AAAA,EACA,MAAM,YAAY;AAAA,OACZ,IAAG,GAAG,QAAQ;AAAA,IAClB,MAAM,OAAO,QAAQ,IAAI;AAAA,IACzB,MAAM,gBAAgB,MAAM,SAAS;AAAA,IACrC,QAAQ,WAAW,MAAM,WAAW,IAAI;AAAA,IACxC,MAAM,UAAU,sBAAsB,MAAM,MAAM;AAAA,IAKlD,QAAQ,eAAe;AAAA,IACvB,MAAM,WAAW,eAAe,UAAU;AAAA,IAC1C,IAAI,WAAW,QAAQ,WAAW,YAAY,SAAS,eAAe;AAAA,MACpE,OAAO,MACL,mCAAmC,WAAW,wBAAwB,SAAS,OAAO,8GAA8G,SAAS,kBAC/M;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IAIA,IACE,CAAC,WAAW,KAAK,QAAQ,QAAQ,kBAAkB,CAAC,KACpD,CAAC,WAAW,gBAAgB,QAAQ,OAAO,CAAC,GAC5C;AAAA,MACA,OAAO,MAAM,0CAA0C;AAAA,MACvD,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IAEA,MAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,MAAM,QAAQ;AAAA,MACd,QAAQ;AAAA,QAGN,MAAM,cAAc,KAAK,IAAI;AAAA,QAC7B,MAAM,UAAU,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA;AAEL,CAAC;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "062E50A4A26E603564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveRuntimeDir
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-pv29h0wf.js";
|
|
5
5
|
import {
|
|
6
6
|
logger
|
|
7
7
|
} from "./index.js";
|
|
@@ -9,13 +9,58 @@ import {
|
|
|
9
9
|
// src/cli/dev-lock.ts
|
|
10
10
|
import {
|
|
11
11
|
existsSync,
|
|
12
|
+
linkSync,
|
|
12
13
|
mkdirSync,
|
|
13
14
|
readFileSync,
|
|
15
|
+
renameSync,
|
|
14
16
|
rmSync,
|
|
17
|
+
statSync,
|
|
15
18
|
writeFileSync
|
|
16
19
|
} from "node:fs";
|
|
17
20
|
import { join } from "pathe";
|
|
18
21
|
var lockPath = (outDir) => join(outDir, "dev.lock");
|
|
22
|
+
var reapPath = (outDir) => join(outDir, "dev.lock.reap");
|
|
23
|
+
var PARTIAL_LOCK_GRACE_MS = 2000;
|
|
24
|
+
var RETRY_DELAY_MS = 5;
|
|
25
|
+
var pause = (ms) => {
|
|
26
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
27
|
+
};
|
|
28
|
+
var tempSequence = 0;
|
|
29
|
+
var tempPath = (path) => {
|
|
30
|
+
tempSequence += 1;
|
|
31
|
+
return `${path}.${process.pid}.${tempSequence}.tmp`;
|
|
32
|
+
};
|
|
33
|
+
var createExclusive = (path, payload) => {
|
|
34
|
+
const temp = tempPath(path);
|
|
35
|
+
writeFileSync(temp, payload);
|
|
36
|
+
try {
|
|
37
|
+
linkSync(temp, path);
|
|
38
|
+
return true;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error.code !== "EEXIST") {
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
} finally {
|
|
45
|
+
rmSync(temp, { force: true });
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var replaceFile = (path, payload) => {
|
|
49
|
+
const temp = tempPath(path);
|
|
50
|
+
writeFileSync(temp, payload);
|
|
51
|
+
renameSync(temp, path);
|
|
52
|
+
};
|
|
53
|
+
var readIfExists = (path) => {
|
|
54
|
+
try {
|
|
55
|
+
const raw = readFileSync(path, "utf-8");
|
|
56
|
+
return { mtimeMs: statSync(path).mtimeMs, raw };
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (error.code !== "ENOENT") {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
19
64
|
var isValidPid = (pid) => typeof pid === "number" && Number.isInteger(pid) && pid > 0;
|
|
20
65
|
var isPortNumber = (port) => typeof port === "number";
|
|
21
66
|
var isLockRecord = (data) => typeof data === "object" && data !== null;
|
|
@@ -45,13 +90,21 @@ var isProcessAlive = (pid) => {
|
|
|
45
90
|
return error.code === "EPERM";
|
|
46
91
|
}
|
|
47
92
|
};
|
|
48
|
-
var
|
|
49
|
-
const
|
|
50
|
-
if (!
|
|
51
|
-
return
|
|
93
|
+
var inspectLock = (outDir) => {
|
|
94
|
+
const file = readIfExists(lockPath(outDir));
|
|
95
|
+
if (!file) {
|
|
96
|
+
return { kind: "absent" };
|
|
97
|
+
}
|
|
98
|
+
const lock = parseLock(file.raw);
|
|
99
|
+
if (!lock) {
|
|
100
|
+
return Date.now() - file.mtimeMs < PARTIAL_LOCK_GRACE_MS ? { kind: "busy" } : { kind: "stale" };
|
|
52
101
|
}
|
|
53
|
-
|
|
54
|
-
|
|
102
|
+
return isProcessAlive(lock.pid) ? { kind: "live", lock } : { kind: "stale" };
|
|
103
|
+
};
|
|
104
|
+
var isClaimable = (state) => state.kind === "stale" || state.kind === "live" && state.lock.pid === process.pid;
|
|
105
|
+
var readDevLock = (outDir) => {
|
|
106
|
+
const state = inspectLock(outDir);
|
|
107
|
+
return state.kind === "live" ? state.lock : null;
|
|
55
108
|
};
|
|
56
109
|
var lockPayload = (port) => {
|
|
57
110
|
const info = { pid: process.pid };
|
|
@@ -60,9 +113,6 @@ var lockPayload = (port) => {
|
|
|
60
113
|
}
|
|
61
114
|
return JSON.stringify(info);
|
|
62
115
|
};
|
|
63
|
-
var writeLock = (outDir, port) => {
|
|
64
|
-
writeFileSync(lockPath(outDir), lockPayload(port));
|
|
65
|
-
};
|
|
66
116
|
|
|
67
117
|
class DevLockHeldError extends Error {
|
|
68
118
|
lock;
|
|
@@ -83,25 +133,39 @@ var ownsLock = (outDir) => {
|
|
|
83
133
|
return false;
|
|
84
134
|
}
|
|
85
135
|
};
|
|
86
|
-
var
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
136
|
+
var reapStaleLock = (outDir) => {
|
|
137
|
+
const mutex = reapPath(outDir);
|
|
138
|
+
if (!createExclusive(mutex, lockPayload())) {
|
|
139
|
+
const holder = readIfExists(mutex);
|
|
140
|
+
const pid = holder ? parseLock(holder.raw)?.pid : undefined;
|
|
141
|
+
if (pid !== undefined && pid !== process.pid && isProcessAlive(pid)) {
|
|
142
|
+
pause(RETRY_DELAY_MS);
|
|
143
|
+
} else if (holder) {
|
|
144
|
+
rmSync(mutex, { force: true });
|
|
93
145
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
if (isClaimable(inspectLock(outDir))) {
|
|
150
|
+
rmSync(lockPath(outDir), { force: true });
|
|
97
151
|
}
|
|
98
|
-
|
|
99
|
-
|
|
152
|
+
} finally {
|
|
153
|
+
rmSync(mutex, { force: true });
|
|
100
154
|
}
|
|
101
155
|
};
|
|
102
156
|
var acquireDevLock = (outDir, port) => {
|
|
103
157
|
mkdirSync(outDir, { recursive: true });
|
|
104
|
-
|
|
158
|
+
const payload = lockPayload(port);
|
|
159
|
+
while (!createExclusive(lockPath(outDir), payload)) {
|
|
160
|
+
const state = inspectLock(outDir);
|
|
161
|
+
if (isClaimable(state)) {
|
|
162
|
+
reapStaleLock(outDir);
|
|
163
|
+
} else if (state.kind === "live") {
|
|
164
|
+
throw new DevLockHeldError(state.lock);
|
|
165
|
+
} else if (state.kind === "busy") {
|
|
166
|
+
pause(RETRY_DELAY_MS);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
105
169
|
let released = false;
|
|
106
170
|
return () => {
|
|
107
171
|
if (released) {
|
|
@@ -117,7 +181,7 @@ var acquireDevLock = (outDir, port) => {
|
|
|
117
181
|
};
|
|
118
182
|
var updateDevLockPort = (outDir, port) => {
|
|
119
183
|
if (ownsLock(outDir)) {
|
|
120
|
-
|
|
184
|
+
replaceFile(lockPath(outDir), lockPayload(port));
|
|
121
185
|
}
|
|
122
186
|
};
|
|
123
187
|
var describeDevLock = (lock) => lock.port === undefined ? "" : ` at http://localhost:${lock.port}`;
|
|
@@ -132,5 +196,5 @@ var refuseIfDevRunning = (root, action, options = {}) => {
|
|
|
132
196
|
|
|
133
197
|
export { readDevLock, DevLockHeldError, acquireDevLock, updateDevLockPort, describeDevLock, refuseIfDevRunning };
|
|
134
198
|
|
|
135
|
-
//# debugId=
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
199
|
+
//# debugId=BA0F0BBCC7BD124F64756E2164756E21
|
|
200
|
+
//# sourceMappingURL=chunk-akbpwfxc.js.map
|