blume 2.1.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +126 -0
  3. package/README.md +4 -4
  4. package/dist/cli/{chunk-74wfhv79.js → chunk-05f21r8h.js} +1 -1
  5. package/dist/cli/{chunk-9qzgg6mj.js → chunk-1cm0h819.js} +3 -3
  6. package/dist/cli/{chunk-nbyvgnnm.js → chunk-1rkxzg3n.js} +104 -47
  7. package/dist/cli/chunk-1rkxzg3n.js.map +36 -0
  8. package/dist/cli/{chunk-desvm72z.js → chunk-2nr29y95.js} +22 -26
  9. package/dist/cli/chunk-2nr29y95.js.map +13 -0
  10. package/dist/cli/{chunk-32khwcb6.js → chunk-49r370mb.js} +42 -69
  11. package/dist/cli/{chunk-32khwcb6.js.map → chunk-49r370mb.js.map} +9 -10
  12. package/dist/cli/{chunk-ms9z66nz.js → chunk-4rftmttv.js} +2 -2
  13. package/dist/cli/{chunk-s0bdnc7v.js → chunk-79bzzkx4.js} +5 -4
  14. package/dist/cli/chunk-79bzzkx4.js.map +10 -0
  15. package/dist/cli/{chunk-hvcxng5f.js → chunk-7tekknev.js} +6 -6
  16. package/dist/cli/{chunk-dv2z0rzf.js → chunk-8b489v1b.js} +38 -13
  17. package/dist/cli/{chunk-dv2z0rzf.js.map → chunk-8b489v1b.js.map} +5 -4
  18. package/dist/cli/{chunk-0pmb4tr4.js → chunk-8f8xw4x2.js} +1195 -222
  19. package/dist/cli/chunk-8f8xw4x2.js.map +44 -0
  20. package/dist/cli/chunk-96snx8yy.js +329 -0
  21. package/dist/cli/chunk-96snx8yy.js.map +13 -0
  22. package/dist/cli/{chunk-ckrcm08h.js → chunk-a3ydrqny.js} +48 -62
  23. package/dist/cli/{chunk-ckrcm08h.js.map → chunk-a3ydrqny.js.map} +4 -5
  24. package/dist/cli/{chunk-bxwhtvw8.js → chunk-ahc5gc9h.js} +5 -5
  25. package/dist/cli/{chunk-dpy8qdjf.js → chunk-as09pafp.js} +73 -182
  26. package/dist/cli/chunk-as09pafp.js.map +18 -0
  27. package/dist/cli/{chunk-tfycddbt.js → chunk-bjk964fp.js} +2 -2
  28. package/dist/cli/{chunk-gfc5fqvf.js → chunk-br0n8n3e.js} +18 -18
  29. package/dist/cli/{chunk-gfc5fqvf.js.map → chunk-br0n8n3e.js.map} +1 -1
  30. package/dist/cli/{chunk-297ajdcv.js → chunk-c69tw29j.js} +6 -6
  31. package/dist/cli/{chunk-297ajdcv.js.map → chunk-c69tw29j.js.map} +3 -3
  32. package/dist/cli/chunk-cn3dy3hz.js +146 -0
  33. package/dist/cli/chunk-cn3dy3hz.js.map +11 -0
  34. package/dist/cli/{chunk-124fvmzq.js → chunk-dm4mg9bj.js} +11064 -8742
  35. package/dist/cli/{chunk-124fvmzq.js.map → chunk-dm4mg9bj.js.map} +78 -64
  36. package/dist/cli/{chunk-dqhg54mr.js → chunk-dmx6cezx.js} +1 -1
  37. package/dist/cli/{chunk-60hz265r.js → chunk-dpcahcrb.js} +24 -11
  38. package/dist/cli/chunk-dpcahcrb.js.map +10 -0
  39. package/dist/cli/{chunk-a57yh0h9.js → chunk-dyk3r7jw.js} +7 -7
  40. package/dist/cli/{chunk-a57yh0h9.js.map → chunk-dyk3r7jw.js.map} +1 -1
  41. package/dist/cli/{chunk-twy7psdz.js → chunk-enk76qd5.js} +14 -10
  42. package/dist/cli/chunk-enk76qd5.js.map +10 -0
  43. package/dist/cli/{chunk-k3gr1nm9.js → chunk-fqy4n3q2.js} +13 -16
  44. package/dist/cli/{chunk-k3gr1nm9.js.map → chunk-fqy4n3q2.js.map} +3 -3
  45. package/dist/cli/{chunk-sc93apfs.js → chunk-frk2wdq1.js} +17 -17
  46. package/dist/cli/{chunk-sc93apfs.js.map → chunk-frk2wdq1.js.map} +2 -2
  47. package/dist/cli/{chunk-kdpzw38a.js → chunk-gprwej7h.js} +95 -7
  48. package/dist/cli/chunk-gprwej7h.js.map +11 -0
  49. package/dist/cli/chunk-kkrteb15.js +157 -0
  50. package/dist/cli/chunk-kkrteb15.js.map +10 -0
  51. package/dist/cli/{chunk-ave1wcbr.js → chunk-m9bp2hc1.js} +1 -1
  52. package/dist/cli/{chunk-58bt3hag.js → chunk-mrvh4c88.js} +4 -4
  53. package/dist/cli/{chunk-5cmts6dv.js → chunk-p8zg3a2h.js} +7 -7
  54. package/dist/cli/{chunk-5cmts6dv.js.map → chunk-p8zg3a2h.js.map} +1 -1
  55. package/dist/cli/{chunk-0w6hs479.js → chunk-rkqae7kh.js} +30 -18
  56. package/dist/cli/chunk-rkqae7kh.js.map +10 -0
  57. package/dist/cli/{chunk-bqxaqn5p.js → chunk-t5xx74rd.js} +8 -8
  58. package/dist/cli/{chunk-bqxaqn5p.js.map → chunk-t5xx74rd.js.map} +1 -1
  59. package/dist/cli/{chunk-1f882900.js → chunk-th0pgaj5.js} +2 -2
  60. package/dist/cli/{chunk-dhwtqnnd.js → chunk-vnbvhgmd.js} +2 -2
  61. package/dist/cli/{chunk-gxtg6ed2.js → chunk-vzy9rh6y.js} +21 -21
  62. package/dist/cli/{chunk-gxtg6ed2.js.map → chunk-vzy9rh6y.js.map} +3 -3
  63. package/dist/cli/{chunk-j1x92mx9.js → chunk-w6e455pz.js} +1 -1
  64. package/dist/cli/chunk-wehv26ry.js +155 -0
  65. package/dist/cli/chunk-wehv26ry.js.map +11 -0
  66. package/dist/cli/{chunk-y4msrwm9.js → chunk-xgq4eytj.js} +15 -15
  67. package/dist/cli/{chunk-36bxs9c7.js → chunk-xt0qvz1t.js} +27 -23
  68. package/dist/cli/chunk-xt0qvz1t.js.map +10 -0
  69. package/dist/cli/index.js +78 -42
  70. package/dist/cli/index.js.map +7 -6
  71. package/dist/types/ai/changelog-components.d.ts +18 -0
  72. package/dist/types/ai/changelog-markdown.d.ts +12 -0
  73. package/dist/types/ai/openapi-components.d.ts +7 -7
  74. package/dist/types/ai/operation-details.d.ts +39 -0
  75. package/dist/types/ai/relative-links.d.ts +3 -1
  76. package/dist/types/ai/serializers.d.ts +6 -4
  77. package/dist/types/analytics/head.d.ts +4 -2
  78. package/dist/types/analytics/script.d.ts +8 -2
  79. package/dist/types/components/content/youtube.d.ts +20 -0
  80. package/dist/types/components/layout/nav-utils.d.ts +8 -0
  81. package/dist/types/components/openapi/example-panels.d.ts +33 -0
  82. package/dist/types/components/openapi/helpers.d.ts +53 -11
  83. package/dist/types/components/openapi/snippets.d.ts +7 -1
  84. package/dist/types/core/alert-diagnostics.d.ts +10 -0
  85. package/dist/types/core/builtin-tags.d.ts +16 -0
  86. package/dist/types/core/changelog-list.d.ts +48 -0
  87. package/dist/types/core/closest-match.d.ts +6 -0
  88. package/dist/types/core/code-fence-diagnostics.d.ts +18 -0
  89. package/dist/types/core/code-fences.d.ts +8 -1
  90. package/dist/types/core/config-input.d.ts +1 -1
  91. package/dist/types/core/content-assets.d.ts +16 -18
  92. package/dist/types/core/diagnostics.d.ts +14 -0
  93. package/dist/types/core/directive-diagnostics.d.ts +22 -8
  94. package/dist/types/core/former-routes.d.ts +14 -0
  95. package/dist/types/core/github.d.ts +5 -4
  96. package/dist/types/core/heading-markers.d.ts +65 -2
  97. package/dist/types/core/hidden-pages.d.ts +3 -0
  98. package/dist/types/core/includes.d.ts +23 -0
  99. package/dist/types/core/last-modified.d.ts +18 -6
  100. package/dist/types/core/links.d.ts +42 -2
  101. package/dist/types/core/load-module.d.ts +19 -4
  102. package/dist/types/core/manifest.d.ts +14 -1
  103. package/dist/types/core/markdown-mirrors.d.ts +22 -0
  104. package/dist/types/core/mdx-elements.d.ts +32 -0
  105. package/dist/types/core/mdx-syntax.d.ts +100 -0
  106. package/dist/types/core/meta-diagnostics.d.ts +7 -0
  107. package/dist/types/core/meta.d.ts +32 -5
  108. package/dist/types/core/nav-diagnostics.d.ts +9 -2
  109. package/dist/types/core/navigation.d.ts +13 -0
  110. package/dist/types/core/ordering-prefix.d.ts +6 -0
  111. package/dist/types/core/pinned-ids.d.ts +23 -0
  112. package/dist/types/core/project-graph.d.ts +9 -1
  113. package/dist/types/core/redirect-patterns.d.ts +18 -0
  114. package/dist/types/core/relative-files.d.ts +31 -0
  115. package/dist/types/core/schema.d.ts +267 -7
  116. package/dist/types/core/sources/normalize.d.ts +101 -9
  117. package/dist/types/core/sources/types.d.ts +16 -0
  118. package/dist/types/core/static-files.d.ts +10 -0
  119. package/dist/types/core/static-host.d.ts +42 -0
  120. package/dist/types/core/svg-images.d.ts +26 -0
  121. package/dist/types/core/syntax-diagnostics.d.ts +14 -0
  122. package/dist/types/core/types.d.ts +42 -1
  123. package/dist/types/deploy/generated-files.d.ts +41 -0
  124. package/dist/types/deploy/redirects.d.ts +21 -7
  125. package/dist/types/markdown/code-title.d.ts +9 -5
  126. package/dist/types/markdown/directives.d.ts +8 -0
  127. package/dist/types/markdown/fence-language.d.ts +51 -0
  128. package/dist/types/markdown/fence-meta.d.ts +5 -0
  129. package/dist/types/markdown/github-alerts.d.ts +35 -0
  130. package/dist/types/openapi/asyncapi.d.ts +6 -5
  131. package/dist/types/openapi/checks.d.ts +10 -5
  132. package/dist/types/openapi/model.d.ts +55 -8
  133. package/dist/types/openapi/parse.d.ts +4 -1
  134. package/dist/types/sources/filesystem.d.ts +14 -4
  135. package/dist/types/sources/mdx-remote.d.ts +6 -3
  136. package/dist/types/sources/registry.d.ts +3 -3
  137. package/dist/types/theme/color.d.ts +33 -0
  138. package/dist/types/theme/palette.d.ts +122 -0
  139. package/docs/01-quickstart.mdx +1 -1
  140. package/docs/02-deployment.mdx +23 -8
  141. package/docs/04-migrating.mdx +16 -4
  142. package/docs/advanced/changelog.mdx +27 -1
  143. package/docs/advanced/skills.mdx +1 -1
  144. package/docs/cli/audit.mdx +1 -1
  145. package/docs/cli/doctor.mdx +2 -2
  146. package/docs/cli/evals.mdx +1 -1
  147. package/docs/cli/index.mdx +4 -2
  148. package/docs/cli/validate.mdx +10 -7
  149. package/docs/configuration/analytics.mdx +2 -0
  150. package/docs/configuration/customization.mdx +3 -1
  151. package/docs/configuration/index.mdx +2 -2
  152. package/docs/configuration/theming.mdx +5 -1
  153. package/docs/content/components.mdx +26 -6
  154. package/docs/content/frontmatter.mdx +1 -1
  155. package/docs/content/includes.mdx +6 -2
  156. package/docs/content/index.mdx +11 -1
  157. package/docs/content/islands.mdx +2 -0
  158. package/docs/content/meta.mdx +9 -3
  159. package/docs/content/navigation.mdx +14 -6
  160. package/docs/content/sources/obsidian.mdx +1 -1
  161. package/docs/content/sources/remote-mdx.mdx +3 -1
  162. package/docs/content/syntax.mdx +76 -8
  163. package/docs/content/variables.mdx +3 -1
  164. package/docs/discoverability/agent-discovery.mdx +1 -1
  165. package/docs/discoverability/json-api.mdx +1 -1
  166. package/docs/discoverability/llms-txt.mdx +1 -1
  167. package/docs/discoverability/markdown.mdx +2 -2
  168. package/docs/discoverability/open-graph.mdx +1 -1
  169. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  170. package/docs/references/graphql.mdx +2 -0
  171. package/docs/references/openapi.mdx +45 -7
  172. package/package.json +4 -4
  173. package/skills/blume/SKILL.md +2 -2
  174. package/skills/blume-migrate/SKILL.md +49 -27
  175. package/skills/blume-migrate/references/docsify.md +262 -0
  176. package/skills/blume-migrate/references/docus.md +298 -0
  177. package/skills/blume-migrate/references/docusaurus.md +3 -3
  178. package/skills/blume-migrate/references/fern.md +327 -0
  179. package/skills/blume-migrate/references/fumadocs.md +1 -1
  180. package/skills/blume-migrate/references/gitbook.md +267 -0
  181. package/skills/blume-migrate/references/github-wiki.md +259 -0
  182. package/skills/blume-migrate/references/jekyll.md +253 -0
  183. package/skills/blume-migrate/references/mdbook.md +256 -0
  184. package/skills/blume-migrate/references/mintlify.md +5 -5
  185. package/skills/blume-migrate/references/mkdocs.md +236 -0
  186. package/skills/blume-migrate/references/monorepo.md +20 -8
  187. package/skills/blume-migrate/references/nextra.md +2 -2
  188. package/skills/blume-migrate/references/readme.md +257 -0
  189. package/skills/blume-migrate/references/redocly.md +198 -0
  190. package/skills/blume-migrate/references/starlight.md +3 -3
  191. package/skills/blume-migrate/references/vitepress.md +204 -0
  192. package/skills/blume-migrate/references/vuepress.md +271 -0
  193. package/skills/blume-migrate/scripts/docsify-codemod.mjs +2387 -0
  194. package/skills/blume-migrate/scripts/docus-codemod.mjs +2542 -0
  195. package/skills/blume-migrate/scripts/fern-codemod.mjs +2633 -0
  196. package/skills/blume-migrate/scripts/github-wiki-codemod.mjs +2808 -0
  197. package/skills/blume-migrate/scripts/include-excerpts.mjs +649 -0
  198. package/skills/blume-migrate/scripts/jekyll-codemod.mjs +3649 -0
  199. package/skills/blume-migrate/scripts/mintlify-codemod.mjs +17 -13
  200. package/skills/blume-migrate/scripts/mkdocs-codemod.mjs +2526 -0
  201. package/skills/blume-migrate/scripts/operation-routes.mjs +508 -0
  202. package/skills/blume-migrate/scripts/pin-heading-ids.mjs +1049 -0
  203. package/skills/blume-migrate/scripts/readme-codemod.mjs +4139 -0
  204. package/skills/blume-migrate/scripts/vitepress-codemod.mjs +1511 -0
  205. package/src/ai/changelog-components.ts +24 -0
  206. package/src/ai/changelog-markdown.ts +45 -41
  207. package/src/ai/component-markdown.ts +22 -9
  208. package/src/ai/llms.ts +36 -5
  209. package/src/ai/markdown.ts +2 -2
  210. package/src/ai/openapi-components.ts +25 -9
  211. package/src/ai/operation-details.ts +208 -0
  212. package/src/ai/relative-links.ts +48 -8
  213. package/src/ai/serializers.ts +7 -6
  214. package/src/ai/site-skill.ts +6 -2
  215. package/src/analytics/head.ts +11 -5
  216. package/src/analytics/script.ts +13 -3
  217. package/src/astro/generate.ts +32 -6
  218. package/src/astro/index.ts +1 -0
  219. package/src/astro/integration.ts +27 -1
  220. package/src/astro/mdx-source-errors.ts +46 -0
  221. package/src/astro/templates.ts +89 -185
  222. package/src/audit/checks/redirects.ts +5 -1
  223. package/src/audit/redirects.ts +36 -19
  224. package/src/audit/report.ts +22 -9
  225. package/src/audit/run.ts +12 -28
  226. package/src/audit/terms.ts +23 -0
  227. package/src/audit/url.ts +2 -2
  228. package/src/cli/build-failure.ts +256 -7
  229. package/src/cli/command-meta.ts +1 -1
  230. package/src/cli/commands/audit.ts +1 -1
  231. package/src/cli/commands/build.ts +12 -3
  232. package/src/cli/commands/check.ts +13 -2
  233. package/src/cli/commands/dev.ts +1 -1
  234. package/src/cli/commands/doctor.ts +4 -2
  235. package/src/cli/commands/init.ts +3 -3
  236. package/src/cli/commands/preview.ts +17 -1
  237. package/src/cli/commands/validate.ts +22 -10
  238. package/src/cli/prepare.ts +1 -1
  239. package/src/cli/preview-pages.ts +161 -0
  240. package/src/cli/unknown-flags.ts +1 -42
  241. package/src/components/code-copy.ts +51 -0
  242. package/src/components/code-language.ts +75 -0
  243. package/src/components/content/AccordionItem.astro +16 -1
  244. package/src/components/content/Callout.astro +11 -1
  245. package/src/components/content/Changelog.astro +189 -0
  246. package/src/components/content/CodeBlock.astro +8 -11
  247. package/src/components/content/Tabs.astro +16 -2
  248. package/src/components/content/YouTube.astro +6 -4
  249. package/src/components/content/code-block.ts +33 -0
  250. package/src/components/content/content-strings.ts +5 -1
  251. package/src/components/content/inline-markdown.ts +35 -8
  252. package/src/components/content/youtube.ts +49 -7
  253. package/src/components/layout/Analytics.astro +5 -1
  254. package/src/components/layout/NavTree.astro +8 -3
  255. package/src/components/layout/RootLayout.astro +18 -31
  256. package/src/components/layout/nav-utils.ts +14 -0
  257. package/src/components/layout/search/pagefind.ts +2 -1
  258. package/src/components/openapi/Operation.astro +4 -0
  259. package/src/components/openapi/PanelTabs.astro +9 -3
  260. package/src/components/openapi/RequestBody.astro +42 -8
  261. package/src/components/openapi/RequestPanel.astro +34 -53
  262. package/src/components/openapi/example-panels.ts +110 -0
  263. package/src/components/openapi/helpers.ts +195 -20
  264. package/src/components/openapi/operation-model.ts +63 -26
  265. package/src/components/openapi/request.ts +13 -0
  266. package/src/components/openapi/snippets.ts +14 -2
  267. package/src/core/alert-diagnostics.ts +89 -0
  268. package/src/core/builtin-tags.ts +76 -0
  269. package/src/core/changelog-list.ts +87 -0
  270. package/src/core/closest-match.ts +41 -0
  271. package/src/core/code-fence-diagnostics.ts +267 -0
  272. package/src/core/code-fences.ts +43 -7
  273. package/src/core/component-diagnostics.ts +65 -12
  274. package/src/core/config-input.ts +1 -1
  275. package/src/core/config.ts +46 -1
  276. package/src/core/content-assets.ts +64 -144
  277. package/src/core/diagnostics.ts +36 -3
  278. package/src/core/directive-diagnostics.ts +265 -47
  279. package/src/core/former-routes.ts +46 -0
  280. package/src/core/git-ignored.ts +53 -0
  281. package/src/core/github.ts +5 -4
  282. package/src/core/heading-markers.ts +156 -2
  283. package/src/core/hidden-pages.ts +64 -0
  284. package/src/core/includes.ts +181 -41
  285. package/src/core/last-modified.ts +47 -10
  286. package/src/core/links.ts +438 -83
  287. package/src/core/load-module.ts +98 -9
  288. package/src/core/manifest.ts +12 -9
  289. package/src/core/markdown-mirrors.ts +52 -0
  290. package/src/core/mdx-elements.ts +153 -0
  291. package/src/core/mdx-syntax.ts +377 -0
  292. package/src/core/meta-diagnostics.ts +134 -0
  293. package/src/core/meta.ts +154 -55
  294. package/src/core/nav-diagnostics.ts +16 -4
  295. package/src/core/navigation.ts +70 -10
  296. package/src/core/ordering-prefix.ts +22 -2
  297. package/src/core/pinned-ids.ts +141 -0
  298. package/src/core/project-graph.ts +221 -29
  299. package/src/core/redirect-patterns.ts +41 -0
  300. package/src/core/relative-files.ts +145 -0
  301. package/src/core/schema.ts +17 -3
  302. package/src/core/sources/mdx-remote.ts +75 -14
  303. package/src/core/sources/normalize.ts +885 -179
  304. package/src/core/sources/notion.ts +5 -4
  305. package/src/core/sources/obsidian.ts +2 -5
  306. package/src/core/sources/types.ts +17 -0
  307. package/src/core/static-files.ts +40 -0
  308. package/src/core/static-host.ts +125 -0
  309. package/src/core/svg-images.ts +98 -0
  310. package/src/core/syntax-diagnostics.ts +491 -0
  311. package/src/core/types.ts +43 -1
  312. package/src/deploy/artifacts.ts +2 -28
  313. package/src/deploy/generated-files.ts +128 -0
  314. package/src/deploy/platforms/vercel.ts +25 -1
  315. package/src/deploy/redirects.ts +43 -16
  316. package/src/deploy/sitemap.ts +2 -1
  317. package/src/markdown/base-links.ts +87 -6
  318. package/src/markdown/code-title.ts +29 -13
  319. package/src/markdown/content-assets.ts +210 -0
  320. package/src/markdown/directives.ts +69 -5
  321. package/src/markdown/fence-language.ts +106 -0
  322. package/src/markdown/fence-meta.ts +42 -0
  323. package/src/markdown/github-alerts.ts +172 -0
  324. package/src/markdown/heading-anchors.ts +265 -56
  325. package/src/markdown/include.ts +30 -3
  326. package/src/markdown/index.ts +145 -40
  327. package/src/markdown/prompt-text.ts +95 -0
  328. package/src/markdown/relative-links.ts +37 -2
  329. package/src/markdown/route-snapshot.ts +22 -12
  330. package/src/markdown/svg-fallback.ts +51 -0
  331. package/src/markdown/title-heading.ts +134 -0
  332. package/src/migrate/migrate.ts +127 -2
  333. package/src/og/card.ts +14 -4
  334. package/src/openapi/asyncapi.ts +14 -6
  335. package/src/openapi/checks.ts +160 -15
  336. package/src/openapi/model.ts +172 -33
  337. package/src/openapi/parse.ts +13 -4
  338. package/src/openapi/render-mdx.ts +55 -9
  339. package/src/openapi/source.ts +87 -6
  340. package/src/registry/eject.ts +0 -1
  341. package/src/search/documents.ts +10 -2
  342. package/src/sources/filesystem.ts +28 -3
  343. package/src/sources/mdx-remote.ts +7 -15
  344. package/src/theme/color.ts +14 -0
  345. package/src/theme/entry.ts +22 -1
  346. package/src/theme/palette.ts +74 -1
  347. package/dist/cli/chunk-0pmb4tr4.js.map +0 -35
  348. package/dist/cli/chunk-0w6hs479.js.map +0 -10
  349. package/dist/cli/chunk-150jk7km.js +0 -52
  350. package/dist/cli/chunk-150jk7km.js.map +0 -10
  351. package/dist/cli/chunk-36bxs9c7.js.map +0 -10
  352. package/dist/cli/chunk-53jqw8z0.js +0 -89
  353. package/dist/cli/chunk-53jqw8z0.js.map +0 -10
  354. package/dist/cli/chunk-60hz265r.js.map +0 -10
  355. package/dist/cli/chunk-desvm72z.js.map +0 -14
  356. package/dist/cli/chunk-dpy8qdjf.js.map +0 -17
  357. package/dist/cli/chunk-es8h0v3j.js +0 -441
  358. package/dist/cli/chunk-es8h0v3j.js.map +0 -11
  359. package/dist/cli/chunk-kdpzw38a.js.map +0 -11
  360. package/dist/cli/chunk-nbyvgnnm.js.map +0 -36
  361. package/dist/cli/chunk-s0bdnc7v.js.map +0 -10
  362. package/dist/cli/chunk-twy7psdz.js.map +0 -10
  363. package/dist/cli/chunk-ydp3065p.js +0 -64
  364. package/dist/cli/chunk-ydp3065p.js.map +0 -10
  365. /package/dist/cli/{chunk-74wfhv79.js.map → chunk-05f21r8h.js.map} +0 -0
  366. /package/dist/cli/{chunk-9qzgg6mj.js.map → chunk-1cm0h819.js.map} +0 -0
  367. /package/dist/cli/{chunk-ms9z66nz.js.map → chunk-4rftmttv.js.map} +0 -0
  368. /package/dist/cli/{chunk-hvcxng5f.js.map → chunk-7tekknev.js.map} +0 -0
  369. /package/dist/cli/{chunk-bxwhtvw8.js.map → chunk-ahc5gc9h.js.map} +0 -0
  370. /package/dist/cli/{chunk-tfycddbt.js.map → chunk-bjk964fp.js.map} +0 -0
  371. /package/dist/cli/{chunk-dqhg54mr.js.map → chunk-dmx6cezx.js.map} +0 -0
  372. /package/dist/cli/{chunk-ave1wcbr.js.map → chunk-m9bp2hc1.js.map} +0 -0
  373. /package/dist/cli/{chunk-58bt3hag.js.map → chunk-mrvh4c88.js.map} +0 -0
  374. /package/dist/cli/{chunk-1f882900.js.map → chunk-th0pgaj5.js.map} +0 -0
  375. /package/dist/cli/{chunk-dhwtqnnd.js.map → chunk-vnbvhgmd.js.map} +0 -0
  376. /package/dist/cli/{chunk-j1x92mx9.js.map → chunk-w6e455pz.js.map} +0 -0
  377. /package/dist/cli/{chunk-y4msrwm9.js.map → chunk-xgq4eytj.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  resolveRuntimeDir
4
- } from "./chunk-124fvmzq.js";
4
+ } from "./chunk-dm4mg9bj.js";
5
5
  import {
6
6
  logger
7
7
  } from "./index.js";
@@ -197,4 +197,4 @@ var refuseIfDevRunning = (root, action, options = {}) => {
197
197
  export { readDevLock, DevLockHeldError, acquireDevLock, updateDevLockPort, describeDevLock, refuseIfDevRunning };
198
198
 
199
199
  //# debugId=BA0F0BBCC7BD124F64756E2164756E21
200
- //# sourceMappingURL=chunk-tfycddbt.js.map
200
+ //# sourceMappingURL=chunk-bjk964fp.js.map
@@ -8,28 +8,28 @@ import {
8
8
  import {
9
9
  commandsFor,
10
10
  detectProjectPackageManager
11
- } from "./chunk-124fvmzq.js";
11
+ } from "./chunk-dm4mg9bj.js";
12
12
  import"./chunk-zccbjcj0.js";
13
- import"./chunk-nbyvgnnm.js";
14
- import"./chunk-desvm72z.js";
15
- import"./chunk-0pmb4tr4.js";
16
- import"./chunk-dpy8qdjf.js";
17
- import"./chunk-ckrcm08h.js";
18
- import"./chunk-j1x92mx9.js";
13
+ import"./chunk-1rkxzg3n.js";
14
+ import"./chunk-8f8xw4x2.js";
15
+ import"./chunk-2nr29y95.js";
16
+ import"./chunk-as09pafp.js";
17
+ import"./chunk-a3ydrqny.js";
18
+ import"./chunk-w6e455pz.js";
19
19
  import"./chunk-jq5n4avg.js";
20
- import"./chunk-es8h0v3j.js";
21
- import"./chunk-dqhg54mr.js";
20
+ import"./chunk-96snx8yy.js";
21
+ import"./chunk-dmx6cezx.js";
22
+ import {
23
+ updatePackageScripts,
24
+ isEjectedProject
25
+ } from "./chunk-wehv26ry.js";
22
26
  import {
23
27
  eject
24
- } from "./chunk-k3gr1nm9.js";
28
+ } from "./chunk-fqy4n3q2.js";
25
29
  import {
26
30
  refuseIfDevRunning
27
- } from "./chunk-tfycddbt.js";
28
- import {
29
- updatePackageScripts,
30
- isEjectedProject
31
- } from "./chunk-53jqw8z0.js";
32
- import"./chunk-s0bdnc7v.js";
31
+ } from "./chunk-bjk964fp.js";
32
+ import"./chunk-79bzzkx4.js";
33
33
 
34
34
  // src/cli/commands/eject.ts
35
35
  import { defineCommand } from "citty";
@@ -94,5 +94,5 @@ export {
94
94
  ejectCommand
95
95
  };
96
96
 
97
- //# debugId=31B30D27F177D0A364756E2164756E21
98
- //# sourceMappingURL=chunk-gfc5fqvf.js.map
97
+ //# debugId=9A7F310B3D4EBEE364756E2164756E21
98
+ //# sourceMappingURL=chunk-br0n8n3e.js.map
@@ -5,6 +5,6 @@
5
5
  "import { defineCommand } from \"citty\";\nimport { relative } from \"pathe\";\n\nimport { BlumeError } from \"../../core/diagnostics.ts\";\nimport { eject } from \"../../registry/eject.ts\";\nimport { commandMeta } from \"../command-meta.ts\";\nimport { refuseIfDevRunning } from \"../dev-lock.ts\";\nimport { isEjectedProject, updatePackageScripts } from \"../eject-scripts.ts\";\nimport { commandsFor, detectProjectPackageManager } from \"../init/scaffold.ts\";\nimport { logger, reportDiagnostics } from \"../log.ts\";\n\n/**\n * Eject the project, reporting a config or `components.ts` error as the same\n * diagnostic other commands print (a Blume 1 config, say) instead of a stack.\n */\nconst ejectOrExit = async (\n root: string\n): Promise<Awaited<ReturnType<typeof eject>>> => {\n try {\n return await eject(root);\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], root);\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const ejectCommand = defineCommand({\n args: {\n force: {\n description:\n \"Eject again over an already-ejected app, overwriting astro.config.mjs and src/.\",\n type: \"boolean\",\n },\n yes: { description: \"Skip the confirmation prompt.\", type: \"boolean\" },\n },\n meta: commandMeta.eject,\n async run({ args }) {\n const root = process.cwd();\n refuseIfDevRunning(root, \"ejecting\");\n\n // A second eject rewrites the app from blume.config.ts, discarding every\n // edit made to it since the first, so it takes an explicit --force.\n if (isEjectedProject(root) && !args.force) {\n logger.error(\n \"This project is already ejected: ejecting again would overwrite astro.config.mjs and src/ with a fresh copy, discarding your edits to them. Pass --force to overwrite them anyway.\"\n );\n process.exit(1);\n }\n\n if (!args.yes) {\n logger.warn(\n \"Eject is one-way: it writes astro.config.mjs, src/, and (if absent) tsconfig.json, rewrites your package.json scripts, adds the packages the Astro app imports to its dependencies, and removes .blume. An existing tsconfig.json is left untouched.\"\n );\n logger.info(\"Re-run with --yes to proceed.\");\n return;\n }\n\n const { dependencies, files, warnings } = await ejectOrExit(root);\n const added = await updatePackageScripts(root, dependencies);\n\n // The same surface as the generated-runtime path (prepare.ts): one warn\n // per generation warning, e.g. a Scalar reference spec that wasn't found.\n for (const warning of warnings) {\n logger.warn(warning);\n }\n\n logger.success(`Ejected ${files.length} file(s):`);\n for (const file of files) {\n process.stdout.write(` ${relative(root, file)}\\n`);\n }\n // Print run commands matching the project's package manager (lockfile\n // detection, since eject runs inside an existing project).\n const pm = await detectProjectPackageManager(root);\n const { build, dev, install } = commandsFor(pm);\n // Newly added dependencies aren't installed yet, so install comes first.\n const run = added.length > 0 ? [install, dev, build] : [dev, build];\n const addedNote =\n added.length > 0 ? `Added to package.json: ${added.join(\", \")}.\\n\\n` : \"\";\n logger.box(\n `Your project is now a standalone Astro app.\\n\\n${addedNote}${run.map((command) => ` ${command}`).join(\"\\n\")}\\n\\nThe blume package remains importable.`\n );\n },\n});\n"
6
6
  ],
7
7
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAcA,IAAM,cAAc,OAClB,SAC+C;AAAA,EAC/C,IAAI;AAAA,IACF,OAAO,MAAM,MAAM,IAAI;AAAA,IACvB,OAAO,OAAO;AAAA,IACd,IAAI,iBAAiB,YAAY;AAAA,MAC/B,kBAAkB,CAAC,MAAM,UAAU,GAAG,IAAI;AAAA,MAC1C,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IACA,MAAM;AAAA;AAAA;AAIH,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,aACE;AAAA,MACF,MAAM;AAAA,IACR;AAAA,IACA,KAAK,EAAE,aAAa,iCAAiC,MAAM,UAAU;AAAA,EACvE;AAAA,EACA,MAAM,YAAY;AAAA,OACZ,IAAG,GAAG,QAAQ;AAAA,IAClB,MAAM,OAAO,QAAQ,IAAI;AAAA,IACzB,mBAAmB,MAAM,UAAU;AAAA,IAInC,IAAI,iBAAiB,IAAI,KAAK,CAAC,KAAK,OAAO;AAAA,MACzC,OAAO,MACL,oLACF;AAAA,MACA,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IAEA,IAAI,CAAC,KAAK,KAAK;AAAA,MACb,OAAO,KACL,sPACF;AAAA,MACA,OAAO,KAAK,+BAA+B;AAAA,MAC3C;AAAA,IACF;AAAA,IAEA,QAAQ,cAAc,OAAO,aAAa,MAAM,YAAY,IAAI;AAAA,IAChE,MAAM,QAAQ,MAAM,qBAAqB,MAAM,YAAY;AAAA,IAI3D,WAAW,WAAW,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO;AAAA,IACrB;AAAA,IAEA,OAAO,QAAQ,WAAW,MAAM,iBAAiB;AAAA,IACjD,WAAW,QAAQ,OAAO;AAAA,MACxB,QAAQ,OAAO,MAAM,KAAK,SAAS,MAAM,IAAI;AAAA,CAAK;AAAA,IACpD;AAAA,IAGA,MAAM,KAAK,MAAM,4BAA4B,IAAI;AAAA,IACjD,QAAQ,OAAO,KAAK,YAAY,YAAY,EAAE;AAAA,IAE9C,MAAM,MAAM,MAAM,SAAS,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK;AAAA,IAClE,MAAM,YACJ,MAAM,SAAS,IAAI,0BAA0B,MAAM,KAAK,IAAI;AAAA;AAAA,IAAW;AAAA,IACzE,OAAO,IACL;AAAA;AAAA,EAAkD,YAAY,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA,sCAC9G;AAAA;AAEJ,CAAC;",
8
- "debugId": "31B30D27F177D0A364756E2164756E21",
8
+ "debugId": "9A7F310B3D4EBEE364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  packageDirFrom,
4
4
  generateRuntime
5
- } from "./chunk-nbyvgnnm.js";
5
+ } from "./chunk-1rkxzg3n.js";
6
6
  import {
7
7
  loadEnvFiles,
8
8
  reportInternalError,
@@ -13,11 +13,11 @@ import {
13
13
  } from "./index.js";
14
14
  import {
15
15
  scanProject
16
- } from "./chunk-0pmb4tr4.js";
16
+ } from "./chunk-8f8xw4x2.js";
17
17
  import {
18
18
  serverFeatures,
19
19
  checkRequiredSecrets
20
- } from "./chunk-ms9z66nz.js";
20
+ } from "./chunk-4rftmttv.js";
21
21
 
22
22
  // src/cli/yarn-pnp.ts
23
23
  import { existsSync } from "node:fs";
@@ -93,7 +93,7 @@ var prepareProject = async (options) => {
93
93
  }
94
94
  }
95
95
  const hadErrors = reportDiagnostics(project.diagnostics, options.root);
96
- const dropped = project.droppedPages > 0 ? `${project.droppedPages} page(s) failed frontmatter validation and were dropped from the site. ` : "";
96
+ const dropped = project.droppedPages > 0 ? `${project.droppedPages} page(s) failed validation and were dropped from the site. ` : "";
97
97
  const optIn = options.strictOptIn ?? options.mode === "dev";
98
98
  if (hadErrors && options.strict) {
99
99
  logger.error(`Aborting due to errors. ${dropped}Fix the diagnostics above, or ${optIn ? "drop --strict" : "pass --no-strict"} to continue despite them.`);
@@ -120,5 +120,5 @@ var prepareProject = async (options) => {
120
120
 
121
121
  export { prepareProject };
122
122
 
123
- //# debugId=306EB25EAF65994264756E2164756E21
124
- //# sourceMappingURL=chunk-297ajdcv.js.map
123
+ //# debugId=0B8AEED1A551B5FA64756E2164756E21
124
+ //# sourceMappingURL=chunk-c69tw29j.js.map
@@ -3,9 +3,9 @@
3
3
  "sources": ["../src/cli/yarn-pnp.ts", "../src/cli/prepare.ts"],
4
4
  "sourcesContent": [
5
5
  "import { existsSync } from \"node:fs\";\n\nimport { dirname, join } from \"pathe\";\n\nimport { packageDirFrom } from \"../astro/render-deps.ts\";\nimport type { Diagnostic } from \"../core/types.ts\";\n\n/** Whether `root` or one of its ancestors holds a Yarn Plug'n'Play manifest. */\nconst hasPnpManifest = (root: string): boolean => {\n let dir = root;\n while (true) {\n if (existsSync(join(dir, \".pnp.cjs\")) || existsSync(join(dir, \".pnp.js\"))) {\n return true;\n }\n const parent = dirname(dir);\n if (parent === dir) {\n return false;\n }\n dir = parent;\n }\n};\n\n/**\n * The diagnostic for a project installed with Yarn Plug'n'Play, or null.\n *\n * Plug'n'Play installs no `node_modules`, and the Astro project Blume\n * generates in `.blume/` imports Astro and Blume's dependencies by name, which\n * only a `node_modules` tree resolves — so under PnP the build dies loading\n * `astro/config`, a failure that reads like a bug in Blume. Caught up front\n * instead: when the command runs under the PnP runtime (`process.versions.pnp`,\n * set by `yarn run`), or when a `.pnp.cjs` manifest sits in the project with no\n * `node_modules` copy of Blume beside it.\n */\nexport const yarnPnpDiagnostic = (\n root: string,\n pnpVersion: string | undefined = process.versions.pnp\n): Diagnostic | null => {\n const underPnp =\n pnpVersion !== undefined ||\n (hasPnpManifest(root) && packageDirFrom(\"blume\", root) === null);\n if (!underPnp) {\n return null;\n }\n return {\n code: \"BLUME_YARN_PNP\",\n message:\n \"Yarn Plug'n'Play isn't supported: the Astro project Blume generates in `.blume/` resolves Astro and Blume's dependencies from a `node_modules` folder, which Plug'n'Play doesn't create.\",\n severity: \"error\",\n suggestion:\n \"Add `nodeLinker: node-modules` to `.yarnrc.yml`, run `yarn install`, then run this command again.\",\n };\n};\n",
6
- "import { generateRuntime } from \"../astro/generate.ts\";\nimport { BlumeError, hasErrors } from \"../core/diagnostics.ts\";\nimport { scanProject } from \"../core/project-graph.ts\";\nimport type {\n BlumeProject,\n BuildMode,\n ConfigOverrides,\n} from \"../core/project-graph.ts\";\nimport { serverFeatures } from \"../core/server-features.ts\";\nimport { loadEnvFiles } from \"./env.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { logger, reportDiagnostics } from \"./log.ts\";\nimport { checkRequiredSecrets } from \"./required-secrets.ts\";\nimport { yarnPnpDiagnostic } from \"./yarn-pnp.ts\";\n\nexport interface PrepareOptions {\n root: string;\n mode?: BuildMode;\n strict?: boolean;\n /**\n * Whether the command is strict only on request (`blume check --strict`),\n * which changes how the abort message says to continue. Defaults to true in\n * dev mode (`blume dev`, `blume sync`) and false otherwise, where strict is\n * the default a user turns off with `--no-strict` (`blume build`).\n */\n strictOptIn?: boolean;\n /** Local dev server URL, used as the `deployment.site` fallback (dev only). */\n devServerUrl?: string;\n /** Render drafts and fetch unpublished CMS content. */\n preview?: boolean;\n /** Force remote sources to re-fetch instead of serving the cached snapshot. */\n refresh?: boolean;\n /** CLI config overrides (e.g. `--output`, `--content-dir`). */\n overrides?: ConfigOverrides;\n /** Relocate the generated runtime (e.g. `.blume-verify` for `--isolated`). */\n runtimeDir?: string;\n}\n\n/**\n * Scan the project, surface diagnostics, and (re)generate the `.blume` runtime.\n * In strict mode, any error aborts. Returns the resolved project.\n */\nexport const prepareProject = async (\n options: PrepareOptions\n): Promise<BlumeProject> => {\n // Under Yarn Plug'n'Play the generated runtime can't resolve anything; say\n // so before scanning, instead of failing inside Astro's config load.\n const pnp = yarnPnpDiagnostic(options.root);\n if (pnp) {\n reportDiagnostics([pnp], options.root);\n process.exit(1);\n }\n\n // Load `.env` files from the project root before the scan: remote sources\n // read their tokens from `process.env` during `scanProject`, and\n // `loadEnvFiles` never overrides variables that are already set.\n loadEnvFiles(options.root);\n\n let project: BlumeProject;\n try {\n project = await scanProject(options.root, {\n // Fail-fast on missing secrets: warn now, not at the first request, and\n // before the sources fetch, so a source that can't authenticate on a\n // fresh build still gets its variable named.\n beforeSources: (config) => {\n reportDiagnostics(checkRequiredSecrets(config), options.root);\n },\n devServerUrl: options.devServerUrl,\n mode: options.mode,\n overrides: options.overrides,\n preview: options.preview,\n refresh: options.refresh,\n runtimeDir: options.runtimeDir,\n });\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], options.root);\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n\n // Hard gate: server-only features cannot ship in a static build.\n if (\n options.mode === \"build\" &&\n project.config.deployment.options.output === \"static\"\n ) {\n const features = serverFeatures(project.config);\n if (features.length > 0) {\n // A host adapter already names the target, so only its\n // `output: \"static\"` stands in the way; otherwise name one.\n const { kind } = project.config.deployment;\n reportDiagnostics(\n [\n {\n code: \"BLUME_SERVER_FEATURE_REQUIRED\",\n message: `${features.join(\", \")} ${features.length === 1 ? \"requires\" : \"require\"} server output, but this is a static build.`,\n severity: \"error\",\n suggestion:\n kind === \"static\"\n ? 'Set deployment to a host adapter from \"blume/deploy\" in blume.config.ts, e.g. `deployment: vercel()`.'\n : `Drop \\`output: \"static\"\\` from \\`deployment: ${kind}()\\` in blume.config.ts to build for the server.`,\n },\n ],\n options.root\n );\n process.exit(1);\n }\n }\n\n const hadErrors = reportDiagnostics(project.diagnostics, options.root);\n const dropped =\n project.droppedPages > 0\n ? `${project.droppedPages} page(s) failed frontmatter validation and were dropped from the site. `\n : \"\";\n const optIn = options.strictOptIn ?? options.mode === \"dev\";\n if (hadErrors && options.strict) {\n logger.error(\n `Aborting due to errors. ${dropped}Fix the diagnostics above, or ${optIn ? \"drop --strict\" : \"pass --no-strict\"} to continue despite them.`\n );\n process.exit(1);\n }\n if (hasErrors(project.diagnostics) && !options.strict) {\n logger.warn(\n `Continuing despite errors. ${dropped}${optIn ? \"Pass --strict\" : \"Drop --no-strict\"} to fail instead.`\n );\n }\n\n let warnings: string[];\n try {\n ({ warnings } = await generateRuntime(project));\n } catch (error) {\n // A config error the generator raised (an unplannable `components.ts`\n // override, a missing font file) is the user's to fix, not an internal\n // failure: report the diagnostic and stop, like a scan-time error.\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], options.root);\n process.exit(1);\n }\n throw error;\n }\n for (const warning of warnings) {\n logger.warn(warning);\n }\n\n return project;\n};\n"
6
+ "import { generateRuntime } from \"../astro/generate.ts\";\nimport { BlumeError, hasErrors } from \"../core/diagnostics.ts\";\nimport { scanProject } from \"../core/project-graph.ts\";\nimport type {\n BlumeProject,\n BuildMode,\n ConfigOverrides,\n} from \"../core/project-graph.ts\";\nimport { serverFeatures } from \"../core/server-features.ts\";\nimport { loadEnvFiles } from \"./env.ts\";\nimport { reportInternalError } from \"./internal-error.ts\";\nimport { logger, reportDiagnostics } from \"./log.ts\";\nimport { checkRequiredSecrets } from \"./required-secrets.ts\";\nimport { yarnPnpDiagnostic } from \"./yarn-pnp.ts\";\n\nexport interface PrepareOptions {\n root: string;\n mode?: BuildMode;\n strict?: boolean;\n /**\n * Whether the command is strict only on request (`blume check --strict`),\n * which changes how the abort message says to continue. Defaults to true in\n * dev mode (`blume dev`, `blume sync`) and false otherwise, where strict is\n * the default a user turns off with `--no-strict` (`blume build`).\n */\n strictOptIn?: boolean;\n /** Local dev server URL, used as the `deployment.site` fallback (dev only). */\n devServerUrl?: string;\n /** Render drafts and fetch unpublished CMS content. */\n preview?: boolean;\n /** Force remote sources to re-fetch instead of serving the cached snapshot. */\n refresh?: boolean;\n /** CLI config overrides (e.g. `--output`, `--content-dir`). */\n overrides?: ConfigOverrides;\n /** Relocate the generated runtime (e.g. `.blume-verify` for `--isolated`). */\n runtimeDir?: string;\n}\n\n/**\n * Scan the project, surface diagnostics, and (re)generate the `.blume` runtime.\n * In strict mode, any error aborts. Returns the resolved project.\n */\nexport const prepareProject = async (\n options: PrepareOptions\n): Promise<BlumeProject> => {\n // Under Yarn Plug'n'Play the generated runtime can't resolve anything; say\n // so before scanning, instead of failing inside Astro's config load.\n const pnp = yarnPnpDiagnostic(options.root);\n if (pnp) {\n reportDiagnostics([pnp], options.root);\n process.exit(1);\n }\n\n // Load `.env` files from the project root before the scan: remote sources\n // read their tokens from `process.env` during `scanProject`, and\n // `loadEnvFiles` never overrides variables that are already set.\n loadEnvFiles(options.root);\n\n let project: BlumeProject;\n try {\n project = await scanProject(options.root, {\n // Fail-fast on missing secrets: warn now, not at the first request, and\n // before the sources fetch, so a source that can't authenticate on a\n // fresh build still gets its variable named.\n beforeSources: (config) => {\n reportDiagnostics(checkRequiredSecrets(config), options.root);\n },\n devServerUrl: options.devServerUrl,\n mode: options.mode,\n overrides: options.overrides,\n preview: options.preview,\n refresh: options.refresh,\n runtimeDir: options.runtimeDir,\n });\n } catch (error) {\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], options.root);\n } else {\n reportInternalError(error);\n }\n process.exit(1);\n }\n\n // Hard gate: server-only features cannot ship in a static build.\n if (\n options.mode === \"build\" &&\n project.config.deployment.options.output === \"static\"\n ) {\n const features = serverFeatures(project.config);\n if (features.length > 0) {\n // A host adapter already names the target, so only its\n // `output: \"static\"` stands in the way; otherwise name one.\n const { kind } = project.config.deployment;\n reportDiagnostics(\n [\n {\n code: \"BLUME_SERVER_FEATURE_REQUIRED\",\n message: `${features.join(\", \")} ${features.length === 1 ? \"requires\" : \"require\"} server output, but this is a static build.`,\n severity: \"error\",\n suggestion:\n kind === \"static\"\n ? 'Set deployment to a host adapter from \"blume/deploy\" in blume.config.ts, e.g. `deployment: vercel()`.'\n : `Drop \\`output: \"static\"\\` from \\`deployment: ${kind}()\\` in blume.config.ts to build for the server.`,\n },\n ],\n options.root\n );\n process.exit(1);\n }\n }\n\n const hadErrors = reportDiagnostics(project.diagnostics, options.root);\n const dropped =\n project.droppedPages > 0\n ? `${project.droppedPages} page(s) failed validation and were dropped from the site. `\n : \"\";\n const optIn = options.strictOptIn ?? options.mode === \"dev\";\n if (hadErrors && options.strict) {\n logger.error(\n `Aborting due to errors. ${dropped}Fix the diagnostics above, or ${optIn ? \"drop --strict\" : \"pass --no-strict\"} to continue despite them.`\n );\n process.exit(1);\n }\n if (hasErrors(project.diagnostics) && !options.strict) {\n logger.warn(\n `Continuing despite errors. ${dropped}${optIn ? \"Pass --strict\" : \"Drop --no-strict\"} to fail instead.`\n );\n }\n\n let warnings: string[];\n try {\n ({ warnings } = await generateRuntime(project));\n } catch (error) {\n // A config error the generator raised (an unplannable `components.ts`\n // override, a missing font file) is the user's to fix, not an internal\n // failure: report the diagnostic and stop, like a scan-time error.\n if (error instanceof BlumeError) {\n reportDiagnostics([error.diagnostic], options.root);\n process.exit(1);\n }\n throw error;\n }\n for (const warning of warnings) {\n logger.warn(warning);\n }\n\n return project;\n};\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "306EB25EAF65994264756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "0B8AEED1A551B5FA64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ compileEveryRedirect,
4
+ matchCompiledRedirect,
5
+ requestPath,
6
+ platformRedirects,
7
+ distDir,
8
+ deployPlatform,
9
+ resolveProjectContext,
10
+ loadConfig
11
+ } from "./chunk-dm4mg9bj.js";
12
+ import {
13
+ normalizeBasePath,
14
+ stripBasePath
15
+ } from "./chunk-zccbjcj0.js";
16
+ import {
17
+ commandMeta,
18
+ normalizeHost,
19
+ logger
20
+ } from "./index.js";
21
+ import {
22
+ publicFolder,
23
+ trailingSlashAnswer,
24
+ answerRequestsFirst,
25
+ refuseIfEjected
26
+ } from "./chunk-wehv26ry.js";
27
+ import {
28
+ deployOutputDir
29
+ } from "./chunk-as09pafp.js";
30
+ import {
31
+ parsePort
32
+ } from "./chunk-05f21r8h.js";
33
+
34
+ // src/cli/commands/preview.ts
35
+ import { existsSync } from "node:fs";
36
+ import { preview } from "astro";
37
+ import { defineCommand } from "citty";
38
+ import { join as join2 } from "pathe";
39
+
40
+ // src/cli/preview-pages.ts
41
+ import { readFileSync, statSync } from "node:fs";
42
+ import { Server } from "node:http";
43
+ import { join } from "pathe";
44
+ var isDirectory = (path) => {
45
+ try {
46
+ return statSync(path).isDirectory();
47
+ } catch {
48
+ return null;
49
+ }
50
+ };
51
+ var previewPageUrl = (distDir, base, url) => {
52
+ const queryAt = url.search(/[?#]/u);
53
+ const pathname = queryAt === -1 ? url : url.slice(0, queryAt);
54
+ if (pathname.endsWith("/")) {
55
+ return null;
56
+ }
57
+ let route;
58
+ try {
59
+ route = decodeURIComponent(stripBasePath(base, pathname));
60
+ } catch {
61
+ return null;
62
+ }
63
+ const page = join(distDir, route);
64
+ if (!page.startsWith(`${distDir}/`)) {
65
+ return null;
66
+ }
67
+ return isDirectory(`${page}.html`) === true && isDirectory(join(page, "index.html")) === false ? `${pathname}/index.html${queryAt === -1 ? "" : url.slice(queryAt)}` : null;
68
+ };
69
+ var previewRedirects = (config, runtimeDir) => {
70
+ if (config.redirects.length === 0) {
71
+ return [];
72
+ }
73
+ let manifest;
74
+ try {
75
+ manifest = JSON.parse(readFileSync(join(runtimeDir, "blume.manifest.json"), "utf-8"));
76
+ } catch {
77
+ manifest = { routes: [] };
78
+ }
79
+ return compileEveryRedirect(platformRedirects({ config, manifest }));
80
+ };
81
+ var previewAnswer = (routing, request) => {
82
+ const url = request.url ?? "/";
83
+ const redirect = matchCompiledRedirect(routing.redirects, requestPath(url));
84
+ if (redirect) {
85
+ return { kind: "redirect", location: redirect[0], status: redirect[1] };
86
+ }
87
+ const slash = trailingSlashAnswer(request, routing.base, routing.isPublicFolder);
88
+ if (slash) {
89
+ return slash;
90
+ }
91
+ const page = previewPageUrl(routing.distDir, routing.base, url);
92
+ return page === null ? null : { kind: "rewrite", url: page };
93
+ };
94
+ var servePreview = (preview, routing) => {
95
+ if (!(("server" in preview) && preview.server instanceof Server)) {
96
+ return;
97
+ }
98
+ answerRequestsFirst(preview.server, (request) => previewAnswer(routing, request));
99
+ };
100
+
101
+ // src/cli/commands/preview.ts
102
+ var previewCommand = defineCommand({
103
+ args: {
104
+ host: { description: "Network host to bind.", type: "string" },
105
+ port: { description: "Port to listen on.", type: "string" }
106
+ },
107
+ meta: commandMeta.preview,
108
+ async run({ args }) {
109
+ const root = process.cwd();
110
+ await refuseIfEjected(root, "preview");
111
+ const { config } = await loadConfig(root);
112
+ const context = resolveProjectContext(root, config);
113
+ const { deployment } = config;
114
+ const platform = deployPlatform(deployment);
115
+ if (deployment.options.output === "server" && platform.previewDeploy) {
116
+ logger.error(`\`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}\`.`);
117
+ process.exit(1);
118
+ }
119
+ if (!existsSync(join2(context.outDir, "astro.config.mjs")) || !existsSync(deployOutputDir(config, context))) {
120
+ logger.error("No build found. Run `blume build` first.");
121
+ process.exit(1);
122
+ }
123
+ const server = await preview({
124
+ logLevel: "info",
125
+ root: context.outDir,
126
+ server: {
127
+ host: normalizeHost(args.host),
128
+ port: parsePort(args.port)
129
+ }
130
+ });
131
+ if (deployment.options.output === "static") {
132
+ servePreview(server, {
133
+ base: normalizeBasePath(deployment.options.base),
134
+ distDir: distDir(context),
135
+ isPublicFolder: publicFolder(join2(context.root, "public")),
136
+ redirects: previewRedirects(config, context.outDir)
137
+ });
138
+ }
139
+ }
140
+ });
141
+ export {
142
+ previewCommand
143
+ };
144
+
145
+ //# debugId=A1D72D1423B1BFEC64756E2164756E21
146
+ //# sourceMappingURL=chunk-cn3dy3hz.js.map
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/preview.ts", "../src/cli/preview-pages.ts"],
4
+ "sourcesContent": [
5
+ "import { existsSync } from \"node:fs\";\n\nimport { preview } from \"astro\";\nimport { defineCommand } from \"citty\";\nimport { join } from \"pathe\";\n\nimport { normalizeBasePath } from \"../../core/base-path.ts\";\nimport { loadConfig } from \"../../core/config.ts\";\nimport { resolveProjectContext } from \"../../core/project.ts\";\nimport { publicFolder } from \"../../core/static-host.ts\";\nimport { deployOutputDir } from \"../../deploy/adapter-output.ts\";\nimport { deployPlatform } from \"../../deploy/platforms/index.ts\";\nimport { distDir } from \"../../deploy/platforms/paths.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\";\nimport { previewRedirects, servePreview } from \"../preview-pages.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 const server = 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 // A static build is served by Vite, which knows nothing of the host's\n // redirect rules or trailing-slash handling, and whose HTML fallback\n // would answer a page with the redirect page of a redirect from its\n // `.html` URL.\n if (deployment.options.output === \"static\") {\n servePreview(server, {\n base: normalizeBasePath(deployment.options.base),\n distDir: distDir(context),\n isPublicFolder: publicFolder(join(context.root, \"public\")),\n redirects: previewRedirects(config, context.outDir),\n });\n }\n },\n});\n",
6
+ "import { readFileSync, statSync } from \"node:fs\";\nimport { Server } from \"node:http\";\nimport type { IncomingMessage } from \"node:http\";\n\nimport type { PreviewServer } from \"astro\";\nimport { join } from \"pathe\";\n\nimport { stripBasePath } from \"../core/base-path.ts\";\nimport {\n compileEveryRedirect,\n matchCompiledRedirect,\n requestPath,\n} from \"../core/redirect-patterns.ts\";\nimport type { CompiledRedirect } from \"../core/redirect-patterns.ts\";\nimport type { ResolvedConfig } from \"../core/schema.ts\";\nimport {\n answerRequestsFirst,\n trailingSlashAnswer,\n} from \"../core/static-host.ts\";\nimport type { HostAnswer } from \"../core/static-host.ts\";\nimport type { BlumeManifest } from \"../core/types.ts\";\nimport { platformRedirects } from \"../deploy/redirects.ts\";\n\n/**\n * Astro previews a static build on Vite's preview server, which serves the\n * files in `dist/` and nothing a host would add: the redirect rules the build\n * writes for it (`_redirects`, `vercel.json`), which carry every pattern\n * redirect, and the host's handling of a trailing slash (see\n * `core/static-host.ts`). Its HTML fallback also answers a slashless `/guide`\n * with `guide.html` whenever that path exists. It checks with\n * `fs.existsSync`, which a directory passes too. A redirect from\n * `/guide.html` (a migrated site's URL) has its redirect page written to\n * `dist/guide.html/index.html`, a directory, so the fallback rewrites\n * `/guide` to it, Astro's own preview rewrite appends `/index.html`, and the\n * page at `/guide` becomes a redirect page that refreshes to itself forever.\n * Hosts look up files, so they serve the page at `guide/index.html`.\n */\n\n/** Whether `path` is a directory (true) or a file (false); null when absent. */\nconst isDirectory = (path: string): boolean | null => {\n try {\n return statSync(path).isDirectory();\n } catch {\n return null;\n }\n};\n\n/**\n * The URL to serve a preview request from in place of the one Vite's HTML\n * fallback would pick, or null to leave the request alone: the page's own\n * `index.html` when `dist/<route>.html` is a directory, the redirect page of\n * a redirect from `<route>.html`. `base` is the normalized\n * `deployment.base`, which the URL carries and `dist/` doesn't.\n */\nexport const previewPageUrl = (\n distDir: string,\n base: string,\n url: string\n): string | null => {\n const queryAt = url.search(/[?#]/u);\n const pathname = queryAt === -1 ? url : url.slice(0, queryAt);\n if (pathname.endsWith(\"/\")) {\n return null;\n }\n let route: string;\n try {\n route = decodeURIComponent(stripBasePath(base, pathname));\n } catch {\n return null;\n }\n const page = join(distDir, route);\n if (!page.startsWith(`${distDir}/`)) {\n return null;\n }\n return isDirectory(`${page}.html`) === true &&\n isDirectory(join(page, \"index.html\")) === false\n ? `${pathname}/index.html${queryAt === -1 ? \"\" : url.slice(queryAt)}`\n : null;\n};\n\n/**\n * The configured redirects as a static build's host files carry them, for\n * the preview to answer as the host would. They're based against the pages\n * of the last generated project (`blume.manifest.json` in the runtime dir),\n * which tell a page from a public file and say which moved pages' Markdown\n * copies move with them.\n */\nexport const previewRedirects = (\n config: ResolvedConfig,\n runtimeDir: string\n): CompiledRedirect[] => {\n if (config.redirects.length === 0) {\n return [];\n }\n let manifest: Pick<BlumeManifest, \"routes\">;\n try {\n manifest = JSON.parse(\n readFileSync(join(runtimeDir, \"blume.manifest.json\"), \"utf-8\")\n );\n } catch {\n manifest = { routes: [] };\n }\n return compileEveryRedirect(platformRedirects({ config, manifest }));\n};\n\n/** What a static build's preview answers like a host would. */\nexport interface PreviewRouting {\n /** The normalized `deployment.base` (`\"\"` at the root). */\n base: string;\n distDir: string;\n /**\n * Whether a path names a folder of HTML in the project's `public/`, served\n * at its slashed URL (see `publicFolder`).\n */\n isPublicFolder: (path: string) => boolean;\n /** Every configured redirect, as the build's host files carry them. */\n redirects: readonly CompiledRedirect[];\n}\n\n/**\n * How the preview answers a request ahead of Vite: a configured redirect\n * first, as the host's rules do, then the trailing slash, then the page\n * Vite's fallback would miss ({@link previewPageUrl}).\n */\nexport const previewAnswer = (\n routing: PreviewRouting,\n request: Pick<IncomingMessage, \"method\" | \"url\">\n): HostAnswer | null => {\n const url = request.url ?? \"/\";\n const redirect = matchCompiledRedirect(routing.redirects, requestPath(url));\n if (redirect) {\n return { kind: \"redirect\", location: redirect[0], status: redirect[1] };\n }\n const slash = trailingSlashAnswer(\n request,\n routing.base,\n routing.isPublicFolder\n );\n if (slash) {\n return slash;\n }\n const page = previewPageUrl(routing.distDir, routing.base, url);\n return page === null ? null : { kind: \"rewrite\", url: page };\n};\n\n/**\n * Answer each request with {@link previewAnswer} before Vite's middleware\n * sees it. Astro's static preview hands back Vite's HTTP server beside the\n * documented fields; without one, the server is left as it is.\n */\nexport const servePreview = (\n preview: PreviewServer,\n routing: PreviewRouting\n): void => {\n if (!(\"server\" in preview && preview.server instanceof Server)) {\n return;\n }\n answerRequestsFirst(preview.server, (request) =>\n previewAnswer(routing, request)\n );\n};\n"
7
+ ],
8
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA;AACA;AACA,iBAAS;;;ACJT;AACA;AAIA;AAkCA,IAAM,cAAc,CAAC,SAAiC;AAAA,EACpD,IAAI;AAAA,IACF,OAAO,SAAS,IAAI,EAAE,YAAY;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAWJ,IAAM,iBAAiB,CAC5B,SACA,MACA,QACkB;AAAA,EAClB,MAAM,UAAU,IAAI,OAAO,OAAO;AAAA,EAClC,MAAM,WAAW,YAAY,KAAK,MAAM,IAAI,MAAM,GAAG,OAAO;AAAA,EAC5D,IAAI,SAAS,SAAS,GAAG,GAAG;AAAA,IAC1B,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,mBAAmB,cAAc,MAAM,QAAQ,CAAC;AAAA,IACxD,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAET,MAAM,OAAO,KAAK,SAAS,KAAK;AAAA,EAChC,IAAI,CAAC,KAAK,WAAW,GAAG,UAAU,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,YAAY,GAAG,WAAW,MAAM,QACrC,YAAY,KAAK,MAAM,YAAY,CAAC,MAAM,QACxC,GAAG,sBAAsB,YAAY,KAAK,KAAK,IAAI,MAAM,OAAO,MAChE;AAAA;AAUC,IAAM,mBAAmB,CAC9B,QACA,eACuB;AAAA,EACvB,IAAI,OAAO,UAAU,WAAW,GAAG;AAAA,IACjC,OAAO,CAAC;AAAA,EACV;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,KAAK,MACd,aAAa,KAAK,YAAY,qBAAqB,GAAG,OAAO,CAC/D;AAAA,IACA,MAAM;AAAA,IACN,WAAW,EAAE,QAAQ,CAAC,EAAE;AAAA;AAAA,EAE1B,OAAO,qBAAqB,kBAAkB,EAAE,QAAQ,SAAS,CAAC,CAAC;AAAA;AAsB9D,IAAM,gBAAgB,CAC3B,SACA,YACsB;AAAA,EACtB,MAAM,MAAM,QAAQ,OAAO;AAAA,EAC3B,MAAM,WAAW,sBAAsB,QAAQ,WAAW,YAAY,GAAG,CAAC;AAAA,EAC1E,IAAI,UAAU;AAAA,IACZ,OAAO,EAAE,MAAM,YAAY,UAAU,SAAS,IAAI,QAAQ,SAAS,GAAG;AAAA,EACxE;AAAA,EACA,MAAM,QAAQ,oBACZ,SACA,QAAQ,MACR,QAAQ,cACV;AAAA,EACA,IAAI,OAAO;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,eAAe,QAAQ,SAAS,QAAQ,MAAM,GAAG;AAAA,EAC9D,OAAO,SAAS,OAAO,OAAO,EAAE,MAAM,WAAW,KAAK,KAAK;AAAA;AAQtD,IAAM,eAAe,CAC1B,SACA,YACS;AAAA,EACT,IAAI,GAAE,YAAY,YAAW,QAAQ,kBAAkB,SAAS;AAAA,IAC9D;AAAA,EACF;AAAA,EACA,oBAAoB,QAAQ,QAAQ,CAAC,YACnC,cAAc,SAAS,OAAO,CAChC;AAAA;;;AD3IK,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,MAAK,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,SAAS,MAAM,QAAQ;AAAA,MAC3B,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,IAKD,IAAI,WAAW,QAAQ,WAAW,UAAU;AAAA,MAC1C,aAAa,QAAQ;AAAA,QACnB,MAAM,kBAAkB,WAAW,QAAQ,IAAI;AAAA,QAC/C,SAAS,QAAQ,OAAO;AAAA,QACxB,gBAAgB,aAAa,MAAK,QAAQ,MAAM,QAAQ,CAAC;AAAA,QACzD,WAAW,iBAAiB,QAAQ,QAAQ,MAAM;AAAA,MACpD,CAAC;AAAA,IACH;AAAA;AAEJ,CAAC;",
9
+ "debugId": "A1D72D1423B1BFEC64756E2164756E21",
10
+ "names": []
11
+ }