blume 1.7.3 → 2.0.1

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 (690) hide show
  1. package/AGENTS.md +19 -0
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +34 -21
  4. package/dist/cli/{chunk-vacwm2hv.js → chunk-27g6wdth.js} +2 -2
  5. package/dist/cli/{chunk-ps4m1xh4.js → chunk-2hn4b8z7.js} +513 -550
  6. package/dist/cli/chunk-2hn4b8z7.js.map +12 -0
  7. package/dist/cli/chunk-5shv93fd.js +39 -0
  8. package/dist/cli/chunk-5shv93fd.js.map +10 -0
  9. package/dist/cli/chunk-6crbhc3x.js +361 -0
  10. package/dist/cli/chunk-6crbhc3x.js.map +14 -0
  11. package/dist/cli/{chunk-8cjtbafj.js → chunk-6hsn950k.js} +109 -383
  12. package/dist/cli/chunk-6hsn950k.js.map +10 -0
  13. package/dist/cli/chunk-6vm74dry.js +148 -0
  14. package/dist/cli/chunk-6vm74dry.js.map +10 -0
  15. package/dist/cli/{chunk-yg63d42r.js → chunk-79jhk4py.js} +87 -58
  16. package/dist/cli/chunk-79jhk4py.js.map +35 -0
  17. package/dist/cli/chunk-82bbrxdn.js +51 -0
  18. package/dist/cli/chunk-82bbrxdn.js.map +10 -0
  19. package/dist/cli/chunk-abh8yjkn.js +31 -0
  20. package/dist/cli/chunk-abh8yjkn.js.map +10 -0
  21. package/dist/cli/chunk-ah61y8py.js +75 -0
  22. package/dist/cli/chunk-ah61y8py.js.map +11 -0
  23. package/dist/cli/{chunk-dwgcp5sm.js → chunk-ce574jw2.js} +1 -1
  24. package/dist/cli/chunk-ch6g3ar0.js +102 -0
  25. package/dist/cli/chunk-ch6g3ar0.js.map +10 -0
  26. package/dist/cli/chunk-dh8cwk36.js +279 -0
  27. package/dist/cli/chunk-dh8cwk36.js.map +10 -0
  28. package/dist/cli/{chunk-rqy0s5wh.js → chunk-epjnccmv.js} +17 -16
  29. package/dist/cli/{chunk-rqy0s5wh.js.map → chunk-epjnccmv.js.map} +3 -3
  30. package/dist/cli/chunk-f2z5v128.js +97 -0
  31. package/dist/cli/chunk-f2z5v128.js.map +10 -0
  32. package/dist/cli/{chunk-2z47ypj8.js → chunk-fa25z98p.js} +16 -3
  33. package/dist/cli/chunk-fa25z98p.js.map +11 -0
  34. package/dist/cli/{chunk-1jefwnfs.js → chunk-fs23ddbb.js} +1076 -2592
  35. package/dist/cli/chunk-fs23ddbb.js.map +35 -0
  36. package/dist/cli/{chunk-e7f42gdj.js → chunk-fxypxtvm.js} +2 -2
  37. package/dist/cli/{chunk-bvwwhd84.js → chunk-fz5wtpmh.js} +15 -15
  38. package/dist/cli/{chunk-bvwwhd84.js.map → chunk-fz5wtpmh.js.map} +1 -1
  39. package/dist/cli/chunk-hdpx1tax.js +91 -0
  40. package/dist/cli/chunk-hdpx1tax.js.map +10 -0
  41. package/dist/cli/{chunk-ct47dqpx.js → chunk-jts8mvcz.js} +67 -7
  42. package/dist/cli/{chunk-2mzebbbz.js.map → chunk-jts8mvcz.js.map} +6 -4
  43. package/dist/cli/{chunk-ahnw3kxw.js → chunk-jwyddg7y.js} +27 -22
  44. package/dist/cli/chunk-jwyddg7y.js.map +15 -0
  45. package/dist/cli/{chunk-cjtn640a.js → chunk-kdp5q7ke.js} +43 -20
  46. package/dist/cli/chunk-kdp5q7ke.js.map +10 -0
  47. package/dist/cli/{chunk-5g0w1e2c.js → chunk-kpf8rrjc.js} +28 -16
  48. package/dist/cli/{chunk-5g0w1e2c.js.map → chunk-kpf8rrjc.js.map} +4 -4
  49. package/dist/cli/chunk-m3vmjgmq.js +133 -0
  50. package/dist/cli/chunk-m3vmjgmq.js.map +10 -0
  51. package/dist/cli/{chunk-b27xqwn9.js → chunk-mb2919y2.js} +9 -5
  52. package/dist/cli/chunk-mb2919y2.js.map +10 -0
  53. package/dist/cli/{chunk-5qk08vmp.js → chunk-q5163e60.js} +133 -54
  54. package/dist/cli/chunk-q5163e60.js.map +11 -0
  55. package/dist/cli/chunk-qkqwkpte.js +12437 -0
  56. package/dist/cli/chunk-qkqwkpte.js.map +182 -0
  57. package/dist/cli/{chunk-4x36ddpw.js → chunk-qs4q5p4e.js} +81 -87
  58. package/dist/cli/chunk-qs4q5p4e.js.map +10 -0
  59. package/dist/cli/{chunk-0xjyb285.js → chunk-qwsrynx5.js} +15 -5
  60. package/dist/cli/{chunk-0xjyb285.js.map → chunk-qwsrynx5.js.map} +4 -4
  61. package/dist/cli/chunk-s1p84fyh.js +261 -0
  62. package/dist/cli/chunk-s1p84fyh.js.map +10 -0
  63. package/dist/cli/chunk-s6jhgk0q.js +176 -0
  64. package/dist/cli/chunk-s6jhgk0q.js.map +11 -0
  65. package/dist/cli/chunk-vtk4a6dg.js +374 -0
  66. package/dist/cli/chunk-vtk4a6dg.js.map +10 -0
  67. package/dist/cli/{chunk-k79xp7av.js → chunk-wgm7m9qk.js} +230 -700
  68. package/dist/cli/chunk-wgm7m9qk.js.map +36 -0
  69. package/dist/cli/chunk-wm7js3j9.js +145 -0
  70. package/dist/cli/chunk-wm7js3j9.js.map +11 -0
  71. package/dist/cli/chunk-yt5n7ppj.js +79 -0
  72. package/dist/cli/chunk-yt5n7ppj.js.map +10 -0
  73. package/dist/cli/{chunk-3r45185y.js → chunk-yw7dm696.js} +9 -11
  74. package/dist/cli/{chunk-3r45185y.js.map → chunk-yw7dm696.js.map} +3 -3
  75. package/dist/cli/{chunk-nn13znc2.js → chunk-zxcczpyx.js} +1 -1
  76. package/dist/cli/chunk-zxh4d9vy.js +122 -0
  77. package/dist/cli/chunk-zxh4d9vy.js.map +11 -0
  78. package/dist/cli/index.js +214 -57
  79. package/dist/cli/index.js.map +8 -7
  80. package/dist/types/ai/agent-readability.d.ts +52 -0
  81. package/dist/types/ai/ai-catalog.d.ts +42 -0
  82. package/dist/types/ai/api/paths.d.ts +17 -0
  83. package/dist/types/ai/api-catalog.d.ts +18 -0
  84. package/dist/types/ai/ask-context.d.ts +7 -7
  85. package/dist/types/ai/ask.d.ts +368 -0
  86. package/dist/types/ai/changelog-markdown.d.ts +2 -0
  87. package/dist/types/ai/component-markdown.d.ts +2 -2
  88. package/dist/types/ai/index.d.ts +24 -0
  89. package/dist/types/ai/link-headers.d.ts +24 -0
  90. package/dist/types/ai/llms.d.ts +25 -0
  91. package/dist/types/ai/markdown.d.ts +45 -0
  92. package/dist/types/ai/mcp/discovery.d.ts +68 -0
  93. package/dist/types/ai/mcp/tools.d.ts +16 -0
  94. package/dist/types/ai/openapi-components.d.ts +43 -0
  95. package/dist/types/ai/relative-links.d.ts +26 -0
  96. package/dist/types/ai/serializers.d.ts +15 -0
  97. package/dist/types/ai/skills.d.ts +42 -0
  98. package/dist/types/ai/tar.d.ts +25 -0
  99. package/dist/types/ai/visibility.d.ts +17 -0
  100. package/dist/types/ai/web-bot-auth.d.ts +16 -0
  101. package/dist/types/analytics/adobe.d.ts +35 -0
  102. package/dist/types/analytics/amplitude.d.ts +50 -0
  103. package/dist/types/analytics/clarity.d.ts +31 -0
  104. package/dist/types/analytics/clearbit.d.ts +29 -0
  105. package/dist/types/analytics/cloudflare.d.ts +41 -0
  106. package/dist/types/analytics/fathom.d.ts +41 -0
  107. package/dist/types/analytics/google-analytics.d.ts +44 -0
  108. package/dist/types/analytics/google-tag-manager.d.ts +40 -0
  109. package/dist/types/analytics/head.d.ts +30 -0
  110. package/dist/types/analytics/heap.d.ts +40 -0
  111. package/dist/types/analytics/hightouch.d.ts +44 -0
  112. package/dist/types/analytics/hotjar.d.ts +33 -0
  113. package/dist/types/analytics/index.d.ts +61 -0
  114. package/dist/types/analytics/inline.d.ts +17 -0
  115. package/dist/types/analytics/logrocket.d.ts +44 -0
  116. package/dist/types/analytics/mixpanel.d.ts +67 -0
  117. package/dist/types/analytics/pirsch.d.ts +42 -0
  118. package/dist/types/analytics/plausible.d.ts +56 -0
  119. package/dist/types/analytics/posthog.d.ts +45 -0
  120. package/dist/types/analytics/schema.d.ts +320 -0
  121. package/dist/types/analytics/script.d.ts +46 -0
  122. package/dist/types/analytics/segment.d.ts +50 -0
  123. package/dist/types/analytics/vercel.d.ts +48 -0
  124. package/dist/types/astro/integration.d.ts +76 -0
  125. package/dist/types/astro/markdown-negotiation.d.ts +23 -0
  126. package/dist/types/astro/module-types.d.ts +14 -0
  127. package/dist/types/astro/pages.d.ts +44 -0
  128. package/dist/types/cli/env.d.ts +12 -0
  129. package/dist/types/cli/init/scaffold.d.ts +154 -0
  130. package/dist/types/components/layout/nav-utils.d.ts +11 -0
  131. package/dist/types/core/adapter.d.ts +47 -0
  132. package/dist/types/core/api-name.d.ts +7 -0
  133. package/dist/types/core/changelog-index.d.ts +13 -0
  134. package/dist/types/core/config-input.d.ts +197 -526
  135. package/dist/types/core/config.d.ts +61 -35
  136. package/dist/types/core/content-assets.d.ts +76 -0
  137. package/dist/types/core/custom-pages.d.ts +33 -0
  138. package/dist/types/core/data.d.ts +30 -15
  139. package/dist/types/core/define-components.d.ts +12 -9
  140. package/dist/types/core/deployment-env.d.ts +6 -11
  141. package/dist/types/core/frontmatter.d.ts +10 -0
  142. package/dist/types/core/graph.d.ts +18 -0
  143. package/dist/types/core/heading-markers.d.ts +54 -0
  144. package/dist/types/core/i18n-ui.d.ts +12 -10
  145. package/dist/types/core/i18n.d.ts +87 -0
  146. package/dist/types/core/includes.d.ts +138 -0
  147. package/dist/types/core/last-modified.d.ts +47 -0
  148. package/dist/types/core/links.d.ts +95 -0
  149. package/dist/types/core/locale-links.d.ts +60 -0
  150. package/dist/types/core/manifest.d.ts +17 -0
  151. package/dist/types/core/meta.d.ts +38 -0
  152. package/dist/types/core/nav-diagnostics.d.ts +26 -0
  153. package/dist/types/core/navigation.d.ts +6 -0
  154. package/dist/types/core/node-require.d.ts +19 -0
  155. package/dist/types/core/package-json.d.ts +13 -0
  156. package/dist/types/core/probe.d.ts +42 -0
  157. package/dist/types/core/project-graph.d.ts +51 -0
  158. package/dist/types/core/project.d.ts +2 -0
  159. package/dist/types/core/safe-href.d.ts +2 -0
  160. package/dist/types/core/safe-links.d.ts +26 -0
  161. package/dist/types/core/schema.d.ts +2284 -454
  162. package/dist/types/core/site-url.d.ts +16 -0
  163. package/dist/types/core/sources/assets.d.ts +36 -0
  164. package/dist/types/core/sources/cache.d.ts +37 -0
  165. package/dist/types/core/sources/collection.d.ts +28 -0
  166. package/dist/types/core/sources/contentful-rich-text.d.ts +31 -0
  167. package/dist/types/core/sources/contentful.d.ts +40 -0
  168. package/dist/types/core/sources/filesystem.d.ts +24 -0
  169. package/dist/types/core/sources/github-releases.d.ts +31 -0
  170. package/dist/types/core/sources/json.d.ts +30 -0
  171. package/dist/types/core/sources/lexical.d.ts +19 -0
  172. package/dist/types/core/sources/lower.d.ts +75 -0
  173. package/dist/types/core/sources/mdx-remote.d.ts +28 -0
  174. package/dist/types/core/sources/normalize.d.ts +147 -0
  175. package/dist/types/core/sources/notion.d.ts +131 -0
  176. package/dist/types/core/sources/obsidian.d.ts +46 -0
  177. package/dist/types/core/sources/payload.d.ts +39 -0
  178. package/dist/types/core/sources/portable-text.d.ts +42 -0
  179. package/dist/types/core/sources/read.d.ts +23 -0
  180. package/dist/types/core/sources/remote.d.ts +74 -0
  181. package/dist/types/core/sources/resolve.d.ts +19 -0
  182. package/dist/types/core/sources/sanity.d.ts +43 -0
  183. package/dist/types/core/sources/strapi-blocks.d.ts +12 -0
  184. package/dist/types/core/sources/strapi.d.ts +33 -0
  185. package/dist/types/core/sources/types.d.ts +7 -0
  186. package/dist/types/core/sources/watch.d.ts +45 -0
  187. package/dist/types/core/text-width.d.ts +11 -0
  188. package/dist/types/core/types.d.ts +15 -1
  189. package/dist/types/core/unrecognized-keys.d.ts +7 -0
  190. package/dist/types/core/versions.d.ts +72 -0
  191. package/dist/types/core/yaml.d.ts +9 -0
  192. package/dist/types/deploy/adapter-output.d.ts +45 -0
  193. package/dist/types/deploy/adapters/cloudflare.d.ts +40 -0
  194. package/dist/types/deploy/adapters/index.d.ts +29 -0
  195. package/dist/types/deploy/adapters/netlify.d.ts +37 -0
  196. package/dist/types/deploy/adapters/node.d.ts +37 -0
  197. package/dist/types/deploy/adapters/registry.d.ts +133 -0
  198. package/dist/types/deploy/adapters/types.d.ts +71 -0
  199. package/dist/types/deploy/adapters/vercel.d.ts +38 -0
  200. package/dist/types/deploy/artifacts.d.ts +65 -0
  201. package/dist/types/deploy/cloudflare-negotiation.d.ts +196 -0
  202. package/dist/types/deploy/function-bundle.d.ts +80 -0
  203. package/dist/types/deploy/headers.d.ts +50 -0
  204. package/dist/types/deploy/node-headers.d.ts +42 -0
  205. package/dist/types/deploy/platforms/cloudflare.d.ts +40 -0
  206. package/dist/types/deploy/platforms/index.d.ts +18 -0
  207. package/dist/types/deploy/platforms/netlify.d.ts +13 -0
  208. package/dist/types/deploy/platforms/node.d.ts +11 -0
  209. package/dist/types/deploy/platforms/paths.d.ts +27 -0
  210. package/dist/types/deploy/platforms/static.d.ts +10 -0
  211. package/dist/types/deploy/platforms/types.d.ts +104 -0
  212. package/dist/types/deploy/platforms/vercel.d.ts +32 -0
  213. package/dist/types/deploy/redirects.d.ts +53 -0
  214. package/dist/types/deploy/robots.d.ts +8 -0
  215. package/dist/types/deploy/rss.d.ts +31 -0
  216. package/dist/types/deploy/sitemap.d.ts +21 -0
  217. package/dist/types/deploy/vercel-negotiation.d.ts +109 -0
  218. package/dist/types/markdown/code-title.d.ts +32 -0
  219. package/dist/types/markdown/fence-meta.d.ts +23 -0
  220. package/dist/types/markdown/themes.d.ts +3 -3
  221. package/dist/types/openapi/asyncapi.d.ts +129 -0
  222. package/dist/types/openapi/graphql-build.d.ts +8 -0
  223. package/dist/types/openapi/graphql.d.ts +122 -0
  224. package/dist/types/openapi/model.d.ts +158 -0
  225. package/dist/types/openapi/parse.d.ts +57 -0
  226. package/dist/types/openapi/references.d.ts +37 -25
  227. package/dist/types/openapi/render-mdx.d.ts +33 -0
  228. package/dist/types/openapi/sentence.d.ts +7 -0
  229. package/dist/types/openapi/signature.d.ts +10 -0
  230. package/dist/types/openapi/source.d.ts +22 -0
  231. package/dist/types/openapi/spec-dependency-error.d.ts +10 -0
  232. package/dist/types/reference/asyncapi.d.ts +166 -0
  233. package/dist/types/reference/graphql.d.ts +181 -0
  234. package/dist/types/reference/index.d.ts +32 -0
  235. package/dist/types/reference/openapi.d.ts +165 -0
  236. package/dist/types/reference/options.d.ts +157 -0
  237. package/dist/types/reference/scalar.d.ts +136 -0
  238. package/dist/types/reference/schema.d.ts +630 -0
  239. package/dist/types/search/adapters/algolia.d.ts +32 -0
  240. package/dist/types/search/adapters/flexsearch.d.ts +12 -0
  241. package/dist/types/search/adapters/index.d.ts +31 -0
  242. package/dist/types/search/adapters/mixedbread.d.ts +22 -0
  243. package/dist/types/search/adapters/orama-cloud.d.ts +33 -0
  244. package/dist/types/search/adapters/orama.d.ts +13 -0
  245. package/dist/types/search/adapters/pagefind.d.ts +12 -0
  246. package/dist/types/search/adapters/registry.d.ts +228 -0
  247. package/dist/types/search/adapters/types.d.ts +34 -0
  248. package/dist/types/search/adapters/typesense.d.ts +42 -0
  249. package/dist/types/search/build.d.ts +23 -0
  250. package/dist/types/search/documents.d.ts +90 -0
  251. package/dist/types/search/facets.d.ts +3 -0
  252. package/dist/types/search/orama-index.d.ts +1 -1
  253. package/dist/types/search/sync/algolia.d.ts +14 -0
  254. package/dist/types/search/sync/index.d.ts +14 -0
  255. package/dist/types/search/sync/orama-cloud.d.ts +10 -0
  256. package/dist/types/search/sync/typesense.d.ts +14 -0
  257. package/dist/types/sources/contentful.d.ts +68 -0
  258. package/dist/types/sources/custom.d.ts +20 -0
  259. package/dist/types/sources/filesystem.d.ts +42 -0
  260. package/dist/types/sources/github-releases.d.ts +46 -0
  261. package/dist/types/sources/index.d.ts +48 -0
  262. package/dist/types/sources/mdx-remote.d.ts +63 -0
  263. package/dist/types/sources/notion.d.ts +65 -0
  264. package/dist/types/sources/obsidian.d.ts +34 -0
  265. package/dist/types/sources/payload.d.ts +68 -0
  266. package/dist/types/sources/registry.d.ts +1414 -0
  267. package/dist/types/sources/sanity.d.ts +69 -0
  268. package/dist/types/sources/shared.d.ts +46 -0
  269. package/dist/types/sources/strapi.d.ts +66 -0
  270. package/dist/types/theme/icon-kind.d.ts +11 -0
  271. package/dist/types/theme/icons.d.ts +20 -0
  272. package/docs/01-quickstart.mdx +18 -18
  273. package/docs/02-deployment.mdx +52 -28
  274. package/docs/03-upgrading.mdx +364 -0
  275. package/docs/04-migrating.mdx +58 -0
  276. package/docs/08-faq.mdx +5 -5
  277. package/docs/advanced/blog.mdx +13 -6
  278. package/docs/advanced/changelog.mdx +23 -35
  279. package/docs/advanced/custom-pages.mdx +22 -10
  280. package/docs/advanced/meta.ts +1 -8
  281. package/docs/advanced/skills.mdx +8 -0
  282. package/docs/cli/audit.mdx +646 -0
  283. package/docs/cli/doctor.mdx +29 -0
  284. package/docs/{reference/eval.mdx → cli/evals.mdx} +12 -11
  285. package/docs/cli/index.mdx +105 -0
  286. package/docs/cli/meta.ts +7 -0
  287. package/docs/{reference → cli}/translate.mdx +9 -9
  288. package/docs/cli/validate.mdx +41 -0
  289. package/docs/cli/version.mdx +40 -0
  290. package/docs/configuration/analytics.mdx +350 -59
  291. package/docs/configuration/assistant.mdx +357 -0
  292. package/docs/configuration/customization.mdx +16 -10
  293. package/docs/configuration/index.mdx +50 -31
  294. package/docs/configuration/meta.ts +1 -1
  295. package/docs/configuration/search.mdx +76 -55
  296. package/docs/configuration/theming.mdx +24 -15
  297. package/docs/content/components.mdx +21 -5
  298. package/docs/{reference → content}/frontmatter.mdx +35 -1
  299. package/docs/content/i18n.mdx +9 -7
  300. package/docs/content/includes.mdx +2 -4
  301. package/docs/content/index.mdx +1 -1
  302. package/docs/content/islands.mdx +11 -6
  303. package/docs/content/meta.mdx +1 -1
  304. package/docs/content/meta.ts +1 -0
  305. package/docs/content/navigation.mdx +9 -7
  306. package/docs/content/sources.mdx +145 -50
  307. package/docs/content/syntax.mdx +16 -12
  308. package/docs/content/versioning.mdx +3 -3
  309. package/docs/discoverability/agent-discovery.mdx +12 -12
  310. package/docs/discoverability/index.mdx +4 -4
  311. package/docs/discoverability/json-api.mdx +4 -4
  312. package/docs/discoverability/llms-txt.mdx +6 -6
  313. package/docs/discoverability/markdown.mdx +4 -4
  314. package/docs/discoverability/mcp.mdx +11 -11
  315. package/docs/discoverability/sitemap-and-robots.mdx +3 -3
  316. package/docs/index.mdx +4 -4
  317. package/docs/references/asyncapi.mdx +59 -0
  318. package/docs/{advanced → references}/graphql.mdx +45 -32
  319. package/docs/{reference → references}/meta.ts +2 -2
  320. package/docs/references/openapi.mdx +171 -0
  321. package/docs/references/scalar.mdx +64 -0
  322. package/package.json +42 -8
  323. package/skills/blume/SKILL.md +23 -10
  324. package/skills/blume-migrate/SKILL.md +22 -21
  325. package/skills/blume-migrate/assets/oxfmt@0.67.0.patch +49 -0
  326. package/skills/blume-migrate/references/docusaurus.md +5 -4
  327. package/skills/blume-migrate/references/fumadocs.md +4 -4
  328. package/skills/blume-migrate/references/mintlify.md +23 -8
  329. package/skills/blume-migrate/references/monorepo.md +6 -6
  330. package/skills/blume-migrate/references/starlight.md +4 -4
  331. package/src/ai/agent-readability.ts +25 -26
  332. package/src/ai/ai-catalog.ts +50 -32
  333. package/src/ai/api/handlers.ts +46 -11
  334. package/src/ai/api/paths.ts +1 -1
  335. package/src/ai/api-catalog.ts +8 -8
  336. package/src/ai/ask-context.ts +7 -7
  337. package/src/ai/ask-data.ts +3 -3
  338. package/src/ai/ask.ts +637 -100
  339. package/src/ai/changelog-markdown.ts +91 -0
  340. package/src/ai/component-markdown.ts +328 -12
  341. package/src/ai/cors.ts +3 -3
  342. package/src/ai/index.ts +45 -0
  343. package/src/ai/link-headers.ts +7 -6
  344. package/src/ai/llms.ts +20 -15
  345. package/src/ai/markdown.ts +35 -5
  346. package/src/ai/mcp/data.ts +9 -5
  347. package/src/ai/openapi-components.ts +5 -2
  348. package/src/ai/relative-links.ts +170 -0
  349. package/src/ai/serializers.ts +3 -3
  350. package/src/ai/skills.ts +1 -1
  351. package/src/ai/visibility.ts +1 -1
  352. package/src/ai/web-bot-auth.ts +2 -2
  353. package/src/analytics/adobe.ts +46 -0
  354. package/src/analytics/amplitude.ts +79 -0
  355. package/src/analytics/clarity.ts +46 -0
  356. package/src/analytics/clearbit.ts +47 -0
  357. package/src/analytics/cloudflare.ts +67 -0
  358. package/src/analytics/fathom.ts +64 -0
  359. package/src/analytics/google-analytics.ts +84 -0
  360. package/src/analytics/google-tag-manager.ts +61 -0
  361. package/src/analytics/head.ts +130 -0
  362. package/src/analytics/heap.ts +65 -0
  363. package/src/analytics/hightouch.ts +77 -0
  364. package/src/analytics/hotjar.ts +47 -0
  365. package/src/analytics/index.ts +71 -0
  366. package/src/analytics/inline.ts +21 -0
  367. package/src/analytics/logrocket.ts +71 -0
  368. package/src/analytics/mixpanel.ts +92 -0
  369. package/src/analytics/pirsch.ts +66 -0
  370. package/src/analytics/plausible.ts +83 -0
  371. package/src/analytics/posthog.ts +78 -0
  372. package/src/analytics/schema.ts +60 -0
  373. package/src/analytics/script.ts +60 -0
  374. package/src/analytics/segment.ts +85 -0
  375. package/src/analytics/vercel.ts +50 -0
  376. package/src/astro/adapter-root.ts +7 -9
  377. package/src/astro/component-slots.ts +131 -91
  378. package/src/astro/generate.ts +129 -361
  379. package/src/astro/integration.ts +2 -6
  380. package/src/astro/module-types.ts +1 -1
  381. package/src/astro/pages.ts +13 -101
  382. package/src/astro/render-deps.ts +379 -0
  383. package/src/astro/runtime-deps.ts +201 -0
  384. package/src/astro/templates.ts +575 -562
  385. package/src/audit/agent.ts +24 -0
  386. package/src/audit/catalog.ts +2 -2
  387. package/src/audit/checks/assets.ts +2 -2
  388. package/src/audit/checks/dns-aid.ts +1 -1
  389. package/src/audit/checks/duplicates.ts +3 -1
  390. package/src/audit/checks/i18n.ts +1 -1
  391. package/src/audit/checks/indexability.ts +7 -7
  392. package/src/audit/checks/links.ts +2 -2
  393. package/src/audit/checks/llms.ts +6 -6
  394. package/src/audit/checks/network.ts +3 -3
  395. package/src/audit/checks/og-image.ts +2 -2
  396. package/src/audit/checks/robots.ts +1 -1
  397. package/src/audit/checks/sitemap.ts +2 -2
  398. package/src/audit/checks/social.ts +1 -1
  399. package/src/audit/run.ts +4 -3
  400. package/src/audit/terms.ts +31 -0
  401. package/src/audit/url.ts +13 -13
  402. package/src/blume-modules.d.ts +2 -2
  403. package/src/cli/command-meta.ts +10 -0
  404. package/src/cli/commands/audit.ts +40 -21
  405. package/src/cli/commands/build.ts +71 -316
  406. package/src/cli/commands/check.ts +1 -0
  407. package/src/cli/commands/dev.ts +40 -1
  408. package/src/cli/commands/doctor.ts +92 -14
  409. package/src/cli/commands/eject.ts +44 -7
  410. package/src/cli/commands/eval.ts +5 -5
  411. package/src/cli/commands/init.ts +161 -41
  412. package/src/cli/commands/migrate.ts +121 -0
  413. package/src/cli/commands/preview.ts +7 -1
  414. package/src/cli/commands/translate.ts +5 -5
  415. package/src/cli/commands/upgrade.ts +141 -0
  416. package/src/cli/commands/version.ts +57 -44
  417. package/src/cli/eject-scripts.ts +121 -6
  418. package/src/cli/index.ts +11 -1
  419. package/src/cli/init/install.ts +70 -0
  420. package/src/cli/init/questions.ts +7 -0
  421. package/src/cli/init/scaffold.ts +459 -75
  422. package/src/cli/lazy-command.ts +37 -1
  423. package/src/cli/prepare.ts +40 -6
  424. package/src/cli/required-secrets.ts +39 -12
  425. package/src/cli/unknown-flags.ts +266 -0
  426. package/src/cli/yarn-pnp.ts +52 -0
  427. package/src/components/content/AccordionItem.astro +7 -1
  428. package/src/components/content/Card.astro +4 -3
  429. package/src/components/content/ColorItem.astro +22 -4
  430. package/src/components/content/GithubInfo.astro +2 -2
  431. package/src/components/content/Prompt.astro +25 -25
  432. package/src/components/content/Tabs.astro +3 -1
  433. package/src/components/content/Tile.astro +2 -3
  434. package/src/components/content/Tooltip.astro +57 -9
  435. package/src/components/content/content-strings.ts +34 -0
  436. package/src/components/content/diff.ts +1 -1
  437. package/src/components/content/mermaid-element.ts +13 -2
  438. package/src/components/content/prompt-markdown.ts +292 -0
  439. package/src/components/content/tooltip-id.ts +41 -0
  440. package/src/components/copy-feedback.ts +1 -1
  441. package/src/components/islands/{AskAI.astro → Assistant.astro} +10 -10
  442. package/src/components/islands/{ask-ai.tsx → assistant.tsx} +23 -23
  443. package/src/components/islands/hooks.ts +36 -11
  444. package/src/components/layout/Analytics.astro +21 -79
  445. package/src/components/layout/Banner.astro +3 -1
  446. package/src/components/layout/DiscoveryLinks.astro +69 -0
  447. package/src/components/layout/Header.astro +93 -30
  448. package/src/components/layout/LanguageSwitcher.astro +4 -1
  449. package/src/components/layout/Logo.astro +23 -2
  450. package/src/components/layout/NavSelector.astro +13 -2
  451. package/src/components/layout/NavTree.astro +12 -3
  452. package/src/components/layout/NavTreeScript.astro +17 -3
  453. package/src/components/layout/PageActions.astro +3 -3
  454. package/src/components/layout/PageFeedback.astro +11 -1
  455. package/src/components/layout/PageLayout.astro +58 -11
  456. package/src/components/layout/Pagination.astro +7 -7
  457. package/src/components/layout/ReferenceLayout.astro +22 -13
  458. package/src/components/layout/RootLayout.astro +75 -72
  459. package/src/components/layout/Search.astro +43 -19
  460. package/src/components/layout/WebMcp.astro +1 -1
  461. package/src/components/layout/analytics-client.ts +73 -16
  462. package/src/components/layout/drawer-inert.ts +113 -15
  463. package/src/components/layout/dropdown-clamp.ts +105 -0
  464. package/src/components/layout/head-scripts.ts +15 -6
  465. package/src/components/layout/nav-utils.ts +17 -0
  466. package/src/components/layout/search/algolia.ts +8 -8
  467. package/src/components/layout/search/orama-cloud.ts +9 -7
  468. package/src/components/layout/search/typesense.ts +11 -17
  469. package/src/components/openapi/MessageComposer.astro +2 -2
  470. package/src/components/openapi/Playground.astro +2 -2
  471. package/src/components/openapi/description.ts +2 -2
  472. package/src/components/openapi/playground-client.ts +79 -10
  473. package/src/core/changelog-index.ts +24 -0
  474. package/src/core/code-fences.ts +1 -1
  475. package/src/core/component-overrides.ts +399 -154
  476. package/src/core/config-input.ts +201 -566
  477. package/src/core/config.ts +131 -42
  478. package/src/core/custom-pages.ts +105 -0
  479. package/src/core/data.ts +34 -15
  480. package/src/core/define-components.ts +12 -9
  481. package/src/core/deployment-env.ts +18 -74
  482. package/src/core/diagnostics.ts +14 -7
  483. package/src/core/graph.ts +69 -25
  484. package/src/core/i18n-ui.ts +41 -11
  485. package/src/core/i18n.ts +17 -0
  486. package/src/core/includes.ts +156 -38
  487. package/src/core/last-modified.ts +6 -11
  488. package/src/core/links.ts +166 -2
  489. package/src/core/manifest.ts +10 -3
  490. package/src/core/navigation.ts +115 -16
  491. package/src/core/new-tab.ts +35 -0
  492. package/src/core/node-require.ts +21 -0
  493. package/src/core/project-graph.ts +42 -26
  494. package/src/core/project.ts +9 -4
  495. package/src/core/request-body.ts +61 -0
  496. package/src/core/safe-href.ts +28 -0
  497. package/src/core/safe-links.ts +68 -0
  498. package/src/core/schema.ts +528 -745
  499. package/src/core/server-features.ts +10 -11
  500. package/src/core/sources/assets.ts +47 -11
  501. package/src/core/sources/collection.ts +67 -0
  502. package/src/core/sources/contentful-rich-text.ts +285 -0
  503. package/src/core/sources/contentful.ts +173 -0
  504. package/src/core/sources/github-releases.ts +51 -1
  505. package/src/core/sources/json.ts +71 -0
  506. package/src/core/sources/lexical.ts +195 -0
  507. package/src/core/sources/lower.ts +226 -0
  508. package/src/core/sources/normalize.ts +52 -2
  509. package/src/core/sources/notion.ts +39 -28
  510. package/src/core/sources/payload.ts +135 -0
  511. package/src/core/sources/portable-text.ts +11 -16
  512. package/src/core/sources/remote.ts +226 -0
  513. package/src/core/sources/resolve.ts +104 -166
  514. package/src/core/sources/sanity.ts +16 -49
  515. package/src/core/sources/strapi-blocks.ts +124 -0
  516. package/src/core/sources/strapi.ts +191 -0
  517. package/src/core/sources/types.ts +12 -1
  518. package/src/core/types.ts +15 -1
  519. package/src/core/ui-packs/ar.ts +10 -7
  520. package/src/core/ui-packs/bg.ts +10 -7
  521. package/src/core/ui-packs/bn.ts +10 -7
  522. package/src/core/ui-packs/ca.ts +7 -6
  523. package/src/core/ui-packs/cs.ts +10 -7
  524. package/src/core/ui-packs/da.ts +10 -7
  525. package/src/core/ui-packs/de.ts +10 -7
  526. package/src/core/ui-packs/el.ts +7 -6
  527. package/src/core/ui-packs/es.ts +7 -6
  528. package/src/core/ui-packs/fa.ts +10 -7
  529. package/src/core/ui-packs/fi.ts +10 -7
  530. package/src/core/ui-packs/fr.ts +7 -6
  531. package/src/core/ui-packs/he.ts +10 -7
  532. package/src/core/ui-packs/hi.ts +10 -7
  533. package/src/core/ui-packs/hr.ts +10 -7
  534. package/src/core/ui-packs/hu.ts +10 -7
  535. package/src/core/ui-packs/id.ts +10 -7
  536. package/src/core/ui-packs/it.ts +7 -6
  537. package/src/core/ui-packs/ja.ts +7 -6
  538. package/src/core/ui-packs/ko.ts +7 -6
  539. package/src/core/ui-packs/nl.ts +10 -7
  540. package/src/core/ui-packs/no.ts +10 -7
  541. package/src/core/ui-packs/pl.ts +10 -7
  542. package/src/core/ui-packs/pt-br.ts +7 -6
  543. package/src/core/ui-packs/pt.ts +7 -6
  544. package/src/core/ui-packs/ro.ts +10 -7
  545. package/src/core/ui-packs/ru.ts +10 -7
  546. package/src/core/ui-packs/sk.ts +10 -7
  547. package/src/core/ui-packs/sr.ts +10 -7
  548. package/src/core/ui-packs/sv.ts +10 -7
  549. package/src/core/ui-packs/th.ts +7 -6
  550. package/src/core/ui-packs/tr.ts +10 -7
  551. package/src/core/ui-packs/uk.ts +10 -7
  552. package/src/core/ui-packs/vi.ts +7 -6
  553. package/src/core/ui-packs/zh-tw.ts +7 -6
  554. package/src/core/ui-packs/zh.ts +7 -6
  555. package/src/core/unrecognized-keys.ts +10 -0
  556. package/src/core/version-cut.ts +116 -8
  557. package/src/deploy/adapter-output.ts +57 -97
  558. package/src/deploy/adapters/cloudflare.ts +39 -0
  559. package/src/deploy/adapters/index.ts +41 -0
  560. package/src/deploy/adapters/netlify.ts +34 -0
  561. package/src/deploy/adapters/node.ts +34 -0
  562. package/src/deploy/adapters/registry.ts +127 -0
  563. package/src/deploy/adapters/types.ts +92 -0
  564. package/src/deploy/adapters/vercel.ts +35 -0
  565. package/src/deploy/artifacts.ts +55 -27
  566. package/src/deploy/cloudflare-negotiation.ts +179 -100
  567. package/src/deploy/function-bundle.ts +18 -3
  568. package/src/deploy/headers.ts +124 -23
  569. package/src/deploy/node-headers.ts +198 -0
  570. package/src/deploy/platforms/cloudflare.ts +312 -0
  571. package/src/deploy/platforms/index.ts +67 -0
  572. package/src/deploy/platforms/netlify.ts +52 -0
  573. package/src/deploy/platforms/node.ts +40 -0
  574. package/src/deploy/platforms/paths.ts +42 -0
  575. package/src/deploy/platforms/static.ts +29 -0
  576. package/src/deploy/platforms/types.ts +112 -0
  577. package/src/deploy/platforms/vercel.ts +193 -0
  578. package/src/deploy/redirects.ts +30 -18
  579. package/src/deploy/robots.ts +3 -3
  580. package/src/deploy/rss.ts +2 -2
  581. package/src/deploy/sitemap.ts +2 -2
  582. package/src/deploy/vercel-negotiation.ts +2 -2
  583. package/src/eval/agents.ts +32 -1
  584. package/src/eval/findings.ts +19 -11
  585. package/src/eval/report.ts +10 -2
  586. package/src/markdown/external-links.ts +65 -0
  587. package/src/markdown/include.ts +45 -27
  588. package/src/markdown/index.ts +34 -9
  589. package/src/markdown/inline-code.ts +12 -6
  590. package/src/markdown/relative-links.ts +324 -0
  591. package/src/markdown/themes.ts +3 -3
  592. package/src/migrate/migrate.ts +149 -0
  593. package/src/openapi/parse.ts +64 -16
  594. package/src/openapi/proxy.ts +62 -10
  595. package/src/openapi/references.ts +147 -147
  596. package/src/openapi/render-mdx.ts +32 -10
  597. package/src/openapi/scalar.ts +15 -13
  598. package/src/openapi/sentence.ts +14 -0
  599. package/src/openapi/source.ts +37 -21
  600. package/src/openapi/spec-dependency-error.ts +15 -0
  601. package/src/reference/asyncapi.ts +83 -0
  602. package/src/reference/graphql.ts +89 -0
  603. package/src/reference/index.ts +40 -0
  604. package/src/reference/openapi.ts +83 -0
  605. package/src/reference/options.ts +201 -0
  606. package/src/reference/scalar.ts +136 -0
  607. package/src/reference/schema.ts +88 -0
  608. package/src/registry/eject.ts +109 -53
  609. package/src/search/adapters/algolia.ts +46 -0
  610. package/src/search/adapters/flexsearch.ts +29 -0
  611. package/src/search/adapters/index.ts +39 -0
  612. package/src/search/adapters/mixedbread.ts +39 -0
  613. package/src/search/adapters/orama-cloud.ts +51 -0
  614. package/src/search/adapters/orama.ts +24 -0
  615. package/src/search/adapters/pagefind.ts +27 -0
  616. package/src/search/adapters/registry.ts +131 -0
  617. package/src/search/adapters/types.ts +46 -0
  618. package/src/search/adapters/typesense.ts +57 -0
  619. package/src/search/build.ts +8 -4
  620. package/src/search/documents.ts +8 -2
  621. package/src/search/orama-index.ts +1 -1
  622. package/src/search/sync/algolia.ts +12 -11
  623. package/src/search/sync/index.ts +35 -20
  624. package/src/search/sync/orama-cloud.ts +12 -9
  625. package/src/search/sync/typesense.ts +15 -13
  626. package/src/sources/contentful.ts +63 -0
  627. package/src/sources/custom.ts +38 -0
  628. package/src/sources/filesystem.ts +51 -0
  629. package/src/sources/github-releases.ts +52 -0
  630. package/src/sources/index.ts +60 -0
  631. package/src/sources/mdx-remote.ts +76 -0
  632. package/src/sources/notion.ts +63 -0
  633. package/src/sources/obsidian.ts +38 -0
  634. package/src/sources/payload.ts +60 -0
  635. package/src/sources/registry.ts +182 -0
  636. package/src/sources/sanity.ts +66 -0
  637. package/src/sources/shared.ts +52 -0
  638. package/src/sources/strapi.ts +58 -0
  639. package/src/theme/entry.ts +24 -2
  640. package/src/translate/report.ts +40 -7
  641. package/src/upgrade/upgrade.ts +499 -0
  642. package/dist/cli/chunk-0qymqwzz.js +0 -164
  643. package/dist/cli/chunk-0qymqwzz.js.map +0 -15
  644. package/dist/cli/chunk-1jefwnfs.js.map +0 -48
  645. package/dist/cli/chunk-2mzebbbz.js +0 -69
  646. package/dist/cli/chunk-2z47ypj8.js.map +0 -11
  647. package/dist/cli/chunk-4x36ddpw.js.map +0 -11
  648. package/dist/cli/chunk-5093q3n7.js +0 -68
  649. package/dist/cli/chunk-5093q3n7.js.map +0 -10
  650. package/dist/cli/chunk-5qk08vmp.js.map +0 -11
  651. package/dist/cli/chunk-7s8hm3b6.js +0 -5347
  652. package/dist/cli/chunk-7s8hm3b6.js.map +0 -58
  653. package/dist/cli/chunk-8cjtbafj.js.map +0 -13
  654. package/dist/cli/chunk-97r59kpr.js +0 -381
  655. package/dist/cli/chunk-97r59kpr.js.map +0 -12
  656. package/dist/cli/chunk-ahnw3kxw.js.map +0 -15
  657. package/dist/cli/chunk-b27xqwn9.js.map +0 -10
  658. package/dist/cli/chunk-bf6bt1xt.js +0 -185
  659. package/dist/cli/chunk-bf6bt1xt.js.map +0 -11
  660. package/dist/cli/chunk-cjtn640a.js.map +0 -10
  661. package/dist/cli/chunk-ct47dqpx.js.map +0 -11
  662. package/dist/cli/chunk-esphfr8p.js +0 -107
  663. package/dist/cli/chunk-esphfr8p.js.map +0 -11
  664. package/dist/cli/chunk-ex56aa81.js +0 -1016
  665. package/dist/cli/chunk-ex56aa81.js.map +0 -13
  666. package/dist/cli/chunk-garjf5z9.js +0 -30
  667. package/dist/cli/chunk-garjf5z9.js.map +0 -10
  668. package/dist/cli/chunk-js7saxwm.js +0 -1045
  669. package/dist/cli/chunk-js7saxwm.js.map +0 -22
  670. package/dist/cli/chunk-k79xp7av.js.map +0 -39
  671. package/dist/cli/chunk-ps4m1xh4.js.map +0 -15
  672. package/dist/cli/chunk-q4rae3bg.js +0 -60
  673. package/dist/cli/chunk-q4rae3bg.js.map +0 -10
  674. package/dist/cli/chunk-rz9jmfhz.js +0 -108
  675. package/dist/cli/chunk-rz9jmfhz.js.map +0 -10
  676. package/dist/cli/chunk-vh9w1sgp.js +0 -73
  677. package/dist/cli/chunk-vh9w1sgp.js.map +0 -10
  678. package/dist/cli/chunk-vrfp10qk.js +0 -81
  679. package/dist/cli/chunk-vrfp10qk.js.map +0 -10
  680. package/dist/cli/chunk-yg63d42r.js.map +0 -34
  681. package/docs/advanced/api-reference.mdx +0 -240
  682. package/docs/configuration/ask-ai.mdx +0 -256
  683. package/docs/reference/cli.mdx +0 -197
  684. package/skills/blume-migrate/assets/oxfmt@0.55.0.patch +0 -20
  685. package/src/components/content/changelog-element.ts +0 -69
  686. package/src/search/providers.ts +0 -91
  687. /package/dist/cli/{chunk-vacwm2hv.js.map → chunk-27g6wdth.js.map} +0 -0
  688. /package/dist/cli/{chunk-dwgcp5sm.js.map → chunk-ce574jw2.js.map} +0 -0
  689. /package/dist/cli/{chunk-e7f42gdj.js.map → chunk-fxypxtvm.js.map} +0 -0
  690. /package/dist/cli/{chunk-nn13znc2.js.map → chunk-zxcczpyx.js.map} +0 -0
@@ -0,0 +1,374 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ BlumeError
4
+ } from "./index.js";
5
+
6
+ // src/core/component-overrides.ts
7
+ import { existsSync } from "node:fs";
8
+ import { basename, dirname, extname, isAbsolute, join, resolve } from "pathe";
9
+ import ts from "typescript";
10
+ var emptyComponentOverrides = () => ({
11
+ layout: [],
12
+ mdx: [],
13
+ warnings: []
14
+ });
15
+ var GROUPS = ["mdx", "layout"];
16
+ var GROUP_SET = new Set(GROUPS);
17
+ var isGroup = (name) => GROUP_SET.has(name);
18
+ var ACCEPTED_OVERRIDE_FORMS = "Each override must be an imported identifier, a path string, or a `{ component, client, media }` object literal whose `component` is an imported identifier or a path string.";
19
+ var FRAMEWORK_BY_EXT = new Map([
20
+ ["jsx", "react"],
21
+ ["svelte", "svelte"],
22
+ ["tsx", "react"],
23
+ ["vue", "vue"]
24
+ ]);
25
+ var FRAMEWORK_LABEL = {
26
+ react: "React",
27
+ svelte: "Svelte",
28
+ vue: "Vue"
29
+ };
30
+ var COMPONENT_EXTS = [
31
+ "astro",
32
+ "tsx",
33
+ "ts",
34
+ "jsx",
35
+ "js",
36
+ "mjs",
37
+ "vue",
38
+ "svelte"
39
+ ];
40
+ var HYDRATION_MODES = new Set([
41
+ "idle",
42
+ "load",
43
+ "media",
44
+ "only",
45
+ "visible"
46
+ ]);
47
+ var HYDRATION_MODE_LIST = '"load", "idle", "visible", "media", or "only"';
48
+ var isHydrationMode = (value) => HYDRATION_MODES.has(value);
49
+ var reject = (context, message, node, missingFile) => {
50
+ context.errors.push({ message, missingFile, node });
51
+ };
52
+ var propName = (name) => ts.isIdentifier(name) || ts.isStringLiteral(name) ? name.text : undefined;
53
+ var addImportBindings = (map, statement) => {
54
+ if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {
55
+ return;
56
+ }
57
+ const specifier = statement.moduleSpecifier.text;
58
+ const clause = statement.importClause;
59
+ if (!clause) {
60
+ return;
61
+ }
62
+ if (clause.name) {
63
+ map.set(clause.name.text, {
64
+ imported: "default",
65
+ node: statement,
66
+ specifier
67
+ });
68
+ }
69
+ const named = clause.namedBindings;
70
+ if (named && ts.isNamedImports(named)) {
71
+ for (const element of named.elements) {
72
+ map.set(element.name.text, {
73
+ imported: (element.propertyName ?? element.name).text,
74
+ node: statement,
75
+ specifier
76
+ });
77
+ }
78
+ }
79
+ };
80
+ var collectImports = (sourceFile) => {
81
+ const map = new Map;
82
+ for (const statement of sourceFile.statements) {
83
+ addImportBindings(map, statement);
84
+ }
85
+ return map;
86
+ };
87
+ var unwrapObject = (expression) => {
88
+ if (ts.isObjectLiteralExpression(expression)) {
89
+ return expression;
90
+ }
91
+ if (ts.isCallExpression(expression)) {
92
+ const [arg] = expression.arguments;
93
+ return arg && ts.isObjectLiteralExpression(arg) ? arg : undefined;
94
+ }
95
+ if (ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression)) {
96
+ return unwrapObject(expression.expression);
97
+ }
98
+ return;
99
+ };
100
+ var findDefaultExport = (sourceFile) => sourceFile.statements.find((statement) => ts.isExportAssignment(statement) && !statement.isExportEquals);
101
+ var probeExtension = (base) => {
102
+ for (const extension of COMPONENT_EXTS) {
103
+ const candidate = `${base}.${extension}`;
104
+ if (existsSync(candidate)) {
105
+ return candidate;
106
+ }
107
+ }
108
+ return null;
109
+ };
110
+ var SCRIPT_EXT = /\.(?:jsx?|mjs)$/u;
111
+ var TS_SOURCE_EXTS = ["ts", "tsx", "mts"];
112
+ var resolvesLocally = (absolute) => {
113
+ if (existsSync(absolute) || probeExtension(absolute)) {
114
+ return true;
115
+ }
116
+ if (probeExtension(join(absolute, "index"))) {
117
+ return true;
118
+ }
119
+ const base = absolute.replace(SCRIPT_EXT, "");
120
+ return base !== absolute && TS_SOURCE_EXTS.some((extension) => existsSync(`${base}.${extension}`));
121
+ };
122
+ var toImport = (specifier, imported, dir) => {
123
+ const relative = specifier.startsWith(".") || isAbsolute(specifier);
124
+ let path = specifier;
125
+ let extension = extname(specifier).slice(1).toLowerCase();
126
+ if (relative) {
127
+ const absolute = isAbsolute(specifier) ? specifier : resolve(dir, specifier);
128
+ if (extension) {
129
+ path = absolute;
130
+ } else {
131
+ const probed = probeExtension(absolute);
132
+ path = probed ?? absolute;
133
+ extension = probed ? extname(probed).slice(1).toLowerCase() : "";
134
+ }
135
+ }
136
+ return {
137
+ framework: FRAMEWORK_BY_EXT.get(extension) ?? null,
138
+ name: imported,
139
+ path
140
+ };
141
+ };
142
+ var sourceFor = (specifier, imported, label, node, context) => {
143
+ const local = specifier.startsWith(".") || isAbsolute(specifier);
144
+ if (local && !resolvesLocally(resolve(context.dir, specifier))) {
145
+ reject(context, `${label} points at "${specifier}", but no file exists there; fix the path or restore the file.`, node, true);
146
+ return null;
147
+ }
148
+ return toImport(specifier, imported, context.dir);
149
+ };
150
+ var resolveIdentifier = (name, label, node, context) => {
151
+ const binding = context.imports.get(name);
152
+ if (binding) {
153
+ return sourceFor(binding.specifier, binding.imported, label, binding.node, context);
154
+ }
155
+ reject(context, `${label} refers to "${name}", which isn't imported in this file; import the component from its file.`, node);
156
+ return null;
157
+ };
158
+ var ALLOWED_FIELDS = "only `component`, `client`, and `media` are allowed in a descriptor.";
159
+ var applyDescriptorProperty = (descriptor, property, label, context) => {
160
+ if (ts.isShorthandPropertyAssignment(property)) {
161
+ if (property.name.text === "component") {
162
+ descriptor.source = resolveIdentifier(property.name.text, `${label}'s \`component\``, property, context);
163
+ return;
164
+ }
165
+ const shorthand = property.name.text;
166
+ if (shorthand === "client" || shorthand === "media") {
167
+ reject(context, `${label} writes \`${shorthand}\` as a shorthand property; only \`component\` may be shorthand, \`${shorthand}\` must be a string literal.`, property);
168
+ return;
169
+ }
170
+ reject(context, `${label} has a \`${shorthand}\` field; ${ALLOWED_FIELDS}`, property);
171
+ return;
172
+ }
173
+ if (!ts.isPropertyAssignment(property)) {
174
+ reject(context, `${label} contains a spread, method, or accessor; write it as a plain \`{ component, client, media }\` object literal.`, property);
175
+ return;
176
+ }
177
+ const name = propName(property.name);
178
+ const init = property.initializer;
179
+ if (name === "component") {
180
+ if (ts.isStringLiteral(init)) {
181
+ descriptor.source = sourceFor(init.text, "default", `${label}'s \`component\``, init, context);
182
+ } else if (ts.isIdentifier(init)) {
183
+ descriptor.source = resolveIdentifier(init.text, `${label}'s \`component\``, init, context);
184
+ } else {
185
+ reject(context, `${label}'s \`component\` must be an imported identifier or a path string.`, init);
186
+ }
187
+ } else if (name === "client") {
188
+ if (ts.isStringLiteral(init) && isHydrationMode(init.text)) {
189
+ descriptor.client = init.text;
190
+ } else {
191
+ reject(context, `${label}'s \`client\` must be a string literal: ${HYDRATION_MODE_LIST}.`, init);
192
+ }
193
+ } else if (name === "media") {
194
+ if (ts.isStringLiteral(init)) {
195
+ descriptor.media = init.text;
196
+ } else {
197
+ reject(context, `${label}'s \`media\` must be a string literal.`, init);
198
+ }
199
+ } else {
200
+ reject(context, `${label} has a \`${name ?? property.name.getText()}\` field; ${ALLOWED_FIELDS}`, property);
201
+ }
202
+ };
203
+ var readDescriptor = (object, label, context) => {
204
+ const descriptor = { source: null };
205
+ const before = context.errors.length;
206
+ let hadComponent = false;
207
+ for (const property of object.properties) {
208
+ if (property.name && propName(property.name) === "component") {
209
+ hadComponent = true;
210
+ }
211
+ applyDescriptorProperty(descriptor, property, label, context);
212
+ }
213
+ if (!hadComponent) {
214
+ reject(context, `${label} is an object literal without a \`component\` field.`, object);
215
+ }
216
+ return context.errors.length === before ? descriptor : null;
217
+ };
218
+ var finalize = (key, descriptor, label, warnings) => {
219
+ const { client, media, source } = descriptor;
220
+ if (!source) {
221
+ return null;
222
+ }
223
+ if (client === "media" && !media) {
224
+ warnings.push(`Override "${key}" uses client: "media" but no \`media\` query was given; it will hydrate as if \`client: "load"\`.`);
225
+ }
226
+ if (client === "only" && !source.framework) {
227
+ warnings.push(`Override "${key}" uses client: "only" but its framework couldn't be inferred; reference a .tsx/.jsx/.vue/.svelte file.`);
228
+ }
229
+ if (!client && source.framework) {
230
+ warnings.push(`Override "${key}" points to a ${FRAMEWORK_LABEL[source.framework]} component (${label}) but has no hydration mode, so it renders as static HTML with no interactivity. Add one, e.g. \`${key}: { component: ${JSON.stringify(label)}, client: "load" }\`.`);
231
+ }
232
+ const normalized = { key, source };
233
+ if (client) {
234
+ normalized.client = client;
235
+ }
236
+ if (media) {
237
+ normalized.media = media;
238
+ }
239
+ return normalized;
240
+ };
241
+ var normalizeEntry = (entry, group, context) => {
242
+ const { warnings } = context;
243
+ if (ts.isShorthandPropertyAssignment(entry)) {
244
+ const name = entry.name.text;
245
+ return finalize(name, { source: resolveIdentifier(name, `${group}.${name}`, entry, context) }, name, warnings);
246
+ }
247
+ if (ts.isSpreadAssignment(entry)) {
248
+ reject(context, `${group} contains a spread (\`...${entry.expression.getText()}\`); list each override explicitly.`, entry);
249
+ return null;
250
+ }
251
+ const key = propName(entry.name);
252
+ if (!key) {
253
+ reject(context, `${group} has an entry with a computed key (\`${entry.name.getText()}\`); keys must be plain names.`, entry);
254
+ return null;
255
+ }
256
+ const label = `${group}.${key}`;
257
+ if (!ts.isPropertyAssignment(entry)) {
258
+ reject(context, `${label} is a method or accessor, which Blume can't analyze statically.`, entry);
259
+ return null;
260
+ }
261
+ const value = entry.initializer;
262
+ if (ts.isIdentifier(value)) {
263
+ return finalize(key, { source: resolveIdentifier(value.text, label, entry, context) }, value.text, warnings);
264
+ }
265
+ if (ts.isStringLiteral(value)) {
266
+ return finalize(key, { source: sourceFor(value.text, "default", label, value, context) }, value.text, warnings);
267
+ }
268
+ if (ts.isObjectLiteralExpression(value)) {
269
+ const descriptor = readDescriptor(value, label, context);
270
+ return descriptor ? finalize(key, descriptor, key, warnings) : null;
271
+ }
272
+ reject(context, `${label} is an inline expression, which Blume can't analyze statically.`, entry);
273
+ return null;
274
+ };
275
+ var collectGroupOverrides = (property, context, result) => {
276
+ if (ts.isSpreadAssignment(property)) {
277
+ reject(context, `The top-level object contains a spread (\`...${property.expression.getText()}\`); list \`mdx\` and \`layout\` explicitly.`, property);
278
+ return;
279
+ }
280
+ const name = propName(property.name);
281
+ if (name === "islands") {
282
+ reject(context, 'The `islands` group was folded into `mdx`: move each entry there and give it a `client` mode, e.g. `mdx: { Counter: { component: Counter, client: "visible" } }`.', property);
283
+ return;
284
+ }
285
+ if (!(name && isGroup(name))) {
286
+ reject(context, `\`${name ?? property.name.getText()}\` isn't an override group; use \`mdx\` or \`layout\`.`, property);
287
+ return;
288
+ }
289
+ if (!ts.isPropertyAssignment(property) || !ts.isObjectLiteralExpression(property.initializer)) {
290
+ reject(context, `\`${name}\` must be an object literal of overrides.`, property);
291
+ return;
292
+ }
293
+ for (const entry of property.initializer.properties) {
294
+ const normalized = normalizeEntry(entry, name, context);
295
+ if (normalized) {
296
+ result[name].push(normalized);
297
+ }
298
+ }
299
+ };
300
+
301
+ class ComponentOverridesError extends BlumeError {
302
+ issues;
303
+ constructor(diagnostic, issues) {
304
+ super(diagnostic);
305
+ this.name = "ComponentOverridesError";
306
+ this.issues = issues;
307
+ }
308
+ }
309
+ var rejectionDiagnostic = (filePath, sourceFile, rejection) => {
310
+ const position = rejection.node ? sourceFile.getLineAndCharacterOfPosition(rejection.node.getStart(sourceFile)) : undefined;
311
+ return {
312
+ code: "BLUME_COMPONENTS_INVALID",
313
+ column: position && position.character + 1,
314
+ file: filePath,
315
+ line: position && position.line + 1,
316
+ message: rejection.message,
317
+ severity: "error",
318
+ suggestion: rejection.missingFile ? undefined : ACCEPTED_OVERRIDE_FORMS
319
+ };
320
+ };
321
+ var invalidOverrides = (filePath, sourceFile, rejections) => {
322
+ const issues = rejections.map((rejection) => rejectionDiagnostic(filePath, sourceFile, rejection));
323
+ const first = issues.find((issue) => issue.line !== undefined);
324
+ return new ComponentOverridesError({
325
+ code: "BLUME_COMPONENTS_INVALID",
326
+ column: first?.column,
327
+ file: filePath,
328
+ line: first?.line,
329
+ message: `${basename(filePath)} has ${rejections.length} override(s) Blume can't plan:
330
+ ${rejections.map((rejection) => ` - ${rejection.message}`).join(`
331
+ `)}`,
332
+ severity: "error",
333
+ suggestion: rejections.every((rejection) => rejection.missingFile) ? undefined : ACCEPTED_OVERRIDE_FORMS
334
+ }, issues);
335
+ };
336
+ var analyzeComponentOverrides = (source, filePath) => {
337
+ const result = emptyComponentOverrides();
338
+ const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true, filePath.endsWith("tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
339
+ const exported = findDefaultExport(sourceFile);
340
+ if (!exported) {
341
+ throw invalidOverrides(filePath, sourceFile, [
342
+ {
343
+ message: "No default export was found; export `defineComponents({ mdx, layout })` (or a plain object literal) as the default."
344
+ }
345
+ ]);
346
+ }
347
+ const object = unwrapObject(exported.expression);
348
+ if (!object) {
349
+ throw invalidOverrides(filePath, sourceFile, [
350
+ {
351
+ message: "The default export isn't an object literal or a `defineComponents({ ... })` call.",
352
+ node: exported
353
+ }
354
+ ]);
355
+ }
356
+ const context = {
357
+ dir: dirname(filePath),
358
+ errors: [],
359
+ imports: collectImports(sourceFile),
360
+ warnings: result.warnings
361
+ };
362
+ for (const property of object.properties) {
363
+ collectGroupOverrides(property, context, result);
364
+ }
365
+ if (context.errors.length > 0) {
366
+ throw invalidOverrides(filePath, sourceFile, context.errors);
367
+ }
368
+ return result;
369
+ };
370
+
371
+ export { emptyComponentOverrides, ComponentOverridesError, analyzeComponentOverrides };
372
+
373
+ //# debugId=D84ED7D5A5A4CC7064756E2164756E21
374
+ //# sourceMappingURL=chunk-vtk4a6dg.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/component-overrides.ts"],
4
+ "sourcesContent": [
5
+ "import { existsSync } from \"node:fs\";\n\nimport { basename, dirname, extname, isAbsolute, join, resolve } from \"pathe\";\nimport ts from \"typescript\";\n\nimport { BlumeError } from \"./diagnostics.ts\";\nimport type { HydrationMode } from \"./schema.ts\";\nimport type { Diagnostic } from \"./types.ts\";\n\n/**\n * Static analysis of a user `components.ts`/`.tsx`.\n *\n * Astro can only hydrate a component it imports *statically by path*, so to honor\n * hydration on overrides Blume needs each override's source path and client mode\n * at generate time — before Vite compiles anything. We read that here by parsing\n * the file with the TypeScript compiler API (never executing it, so `.astro`/React\n * imports don't need a Node loader).\n *\n * Only statically-analyzable authoring is accepted: a default export that is an\n * object literal or a `defineComponents({ ... })` call, whose `mdx`/`layout`\n * groups are object literals with entries that are imported identifiers, path\n * strings, or `{ component, client, media }` object literals, and a relative\n * or absolute path must name a file that exists. Anything else is a config\n * error ({@link ComponentOverridesError}, `BLUME_COMPONENTS_INVALID`) naming the\n * entry, its line, and the accepted forms — there is no runtime fallback, so an\n * override that can't be planned never silently renders without hydration, and\n * a missing file never surfaces as a bundler error inside the generated runtime.\n */\n\nexport type OverrideFramework = \"react\" | \"svelte\" | \"vue\";\n\n/** How a wrapper should import an override's component. */\nexport interface OverrideImport {\n /** Framework inferred from the file extension, or null (e.g. `.astro`). */\n framework: OverrideFramework | null;\n /** Exported name to import: `\"default\"` or a named export. */\n name: string;\n /** Absolute path (for relative/absolute specifiers) or a bare specifier. */\n path: string;\n}\n\n/** A normalized override entry, keyed by its MDX tag / layout-slot name. */\nexport interface NormalizedOverride {\n /** Present when the override should hydrate; drives the `client:*` directive. */\n client?: HydrationMode;\n key: string;\n /** Media query for `client: \"media\"`. */\n media?: string;\n /** How to obtain the component. */\n source: OverrideImport;\n}\n\nexport interface ComponentOverrideAnalysis {\n layout: NormalizedOverride[];\n mdx: NormalizedOverride[];\n warnings: string[];\n}\n\n/** The analysis of a project with no `components.ts`. */\nexport const emptyComponentOverrides = (): ComponentOverrideAnalysis => ({\n layout: [],\n mdx: [],\n warnings: [],\n});\n\nconst GROUPS = [\"mdx\", \"layout\"] as const;\nconst GROUP_SET = new Set<string>(GROUPS);\ntype Group = (typeof GROUPS)[number];\n\nconst isGroup = (name: string): name is Group => GROUP_SET.has(name);\n\n/** The authoring forms an override accepts; the fix every rejection points at. */\nexport const ACCEPTED_OVERRIDE_FORMS =\n \"Each override must be an imported identifier, a path string, or a `{ component, client, media }` object literal whose `component` is an imported identifier or a path string.\";\n\nconst FRAMEWORK_BY_EXT = new Map<string, OverrideFramework>([\n [\"jsx\", \"react\"],\n [\"svelte\", \"svelte\"],\n [\"tsx\", \"react\"],\n [\"vue\", \"vue\"],\n]);\n\nconst FRAMEWORK_LABEL = {\n react: \"React\",\n svelte: \"Svelte\",\n vue: \"Vue\",\n} satisfies Record<OverrideFramework, string>;\n\n/** Extensions probed (in order) when a specifier omits one. */\nconst COMPONENT_EXTS = [\n \"astro\",\n \"tsx\",\n \"ts\",\n \"jsx\",\n \"js\",\n \"mjs\",\n \"vue\",\n \"svelte\",\n];\n\nconst HYDRATION_MODES: ReadonlySet<string> = new Set<HydrationMode>([\n \"idle\",\n \"load\",\n \"media\",\n \"only\",\n \"visible\",\n]);\n\nconst HYDRATION_MODE_LIST = '\"load\", \"idle\", \"visible\", \"media\", or \"only\"';\n\nconst isHydrationMode = (value: string): value is HydrationMode =>\n HYDRATION_MODES.has(value);\n\ninterface ImportBinding {\n /** Exported name: `\"default\"` or a named export. */\n imported: string;\n /** The import statement, where a missing file is reported. */\n node: ts.ImportDeclaration;\n specifier: string;\n}\n\n/** Why one entry was rejected, and the node it's about (for its line). */\ninterface Rejection {\n message: string;\n /** A path that names no file: the fix is the path, not the entry's form. */\n missingFile?: boolean;\n node?: ts.Node;\n}\n\n/** An override's declared component before framework/path resolution. */\ninterface RawDescriptor {\n client?: HydrationMode;\n media?: string;\n source: OverrideImport | null;\n}\n\n/** Everything one analysis pass needs to resolve and report an entry. */\ninterface AnalysisContext {\n dir: string;\n /** Rejections collected across the file; thrown together at the end. */\n errors: Rejection[];\n imports: Map<string, ImportBinding>;\n warnings: string[];\n}\n\nconst reject = (\n context: AnalysisContext,\n message: string,\n node?: ts.Node,\n missingFile?: boolean\n): void => {\n context.errors.push({ message, missingFile, node });\n};\n\nconst propName = (name: ts.PropertyName): string | undefined =>\n ts.isIdentifier(name) || ts.isStringLiteral(name) ? name.text : undefined;\n\n/** Record the bindings declared by one import statement into `map`. */\nconst addImportBindings = (\n map: Map<string, ImportBinding>,\n statement: ts.Statement\n): void => {\n if (\n !ts.isImportDeclaration(statement) ||\n !ts.isStringLiteral(statement.moduleSpecifier)\n ) {\n return;\n }\n const specifier = statement.moduleSpecifier.text;\n const clause = statement.importClause;\n if (!clause) {\n return;\n }\n if (clause.name) {\n map.set(clause.name.text, {\n imported: \"default\",\n node: statement,\n specifier,\n });\n }\n const named = clause.namedBindings;\n if (named && ts.isNamedImports(named)) {\n for (const element of named.elements) {\n map.set(element.name.text, {\n imported: (element.propertyName ?? element.name).text,\n node: statement,\n specifier,\n });\n }\n }\n};\n\n/** Map each local binding name to the module + exported name it came from. */\nconst collectImports = (\n sourceFile: ts.SourceFile\n): Map<string, ImportBinding> => {\n const map = new Map<string, ImportBinding>();\n for (const statement of sourceFile.statements) {\n addImportBindings(map, statement);\n }\n return map;\n};\n\n/** Unwrap `defineComponents({...})`, `({...})`, or `{...} as T` to the object. */\nconst unwrapObject = (\n expression: ts.Expression\n): ts.ObjectLiteralExpression | undefined => {\n if (ts.isObjectLiteralExpression(expression)) {\n return expression;\n }\n if (ts.isCallExpression(expression)) {\n const [arg] = expression.arguments;\n return arg && ts.isObjectLiteralExpression(arg) ? arg : undefined;\n }\n if (\n ts.isAsExpression(expression) ||\n ts.isParenthesizedExpression(expression)\n ) {\n return unwrapObject(expression.expression);\n }\n return undefined;\n};\n\nconst findDefaultExport = (\n sourceFile: ts.SourceFile\n): ts.ExportAssignment | undefined =>\n sourceFile.statements.find(\n (statement): statement is ts.ExportAssignment =>\n ts.isExportAssignment(statement) && !statement.isExportEquals\n );\n\nconst probeExtension = (base: string): string | null => {\n for (const extension of COMPONENT_EXTS) {\n const candidate = `${base}.${extension}`;\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n};\n\n// A `.js` specifier in a TypeScript file may name its `.ts`/`.tsx` source, as\n// Vite resolves it; the same holds for `.jsx` and `.mjs`.\nconst SCRIPT_EXT = /\\.(?:jsx?|mjs)$/u;\nconst TS_SOURCE_EXTS = [\"ts\", \"tsx\", \"mts\"];\n\n/**\n * Whether a local path names something the bundler can import: the file\n * itself, the file with a component extension added, a folder's `index`, or\n * the TypeScript source a `.js` specifier stands for.\n */\nconst resolvesLocally = (absolute: string): boolean => {\n if (existsSync(absolute) || probeExtension(absolute)) {\n return true;\n }\n if (probeExtension(join(absolute, \"index\"))) {\n return true;\n }\n const base = absolute.replace(SCRIPT_EXT, \"\");\n return (\n base !== absolute &&\n TS_SOURCE_EXTS.some((extension) => existsSync(`${base}.${extension}`))\n );\n};\n\n/** Resolve a module specifier to a wrapper-importable path + framework. */\nconst toImport = (\n specifier: string,\n imported: string,\n dir: string\n): OverrideImport => {\n const relative = specifier.startsWith(\".\") || isAbsolute(specifier);\n let path = specifier;\n let extension = extname(specifier).slice(1).toLowerCase();\n if (relative) {\n const absolute = isAbsolute(specifier)\n ? specifier\n : resolve(dir, specifier);\n if (extension) {\n path = absolute;\n } else {\n const probed = probeExtension(absolute);\n path = probed ?? absolute;\n extension = probed ? extname(probed).slice(1).toLowerCase() : \"\";\n }\n }\n return {\n framework: FRAMEWORK_BY_EXT.get(extension) ?? null,\n name: imported,\n path,\n };\n};\n\n/**\n * Resolve a specifier to its import, or record that the file it names doesn't\n * exist. A bare package specifier is left to the bundler.\n */\nconst sourceFor = (\n specifier: string,\n imported: string,\n label: string,\n node: ts.Node,\n context: AnalysisContext\n): OverrideImport | null => {\n const local = specifier.startsWith(\".\") || isAbsolute(specifier);\n if (local && !resolvesLocally(resolve(context.dir, specifier))) {\n reject(\n context,\n `${label} points at \"${specifier}\", but no file exists there; fix the path or restore the file.`,\n node,\n true\n );\n return null;\n }\n return toImport(specifier, imported, context.dir);\n};\n\n/**\n * Resolve an identifier to the import it names, or record why it can't be: a\n * local binding (a `const`, a function declared in the file) has no source path\n * a wrapper could import.\n */\nconst resolveIdentifier = (\n name: string,\n label: string,\n node: ts.Node,\n context: AnalysisContext\n): OverrideImport | null => {\n const binding = context.imports.get(name);\n if (binding) {\n return sourceFor(\n binding.specifier,\n binding.imported,\n label,\n binding.node,\n context\n );\n }\n reject(\n context,\n `${label} refers to \"${name}\", which isn't imported in this file; import the component from its file.`,\n node\n );\n return null;\n};\n\nconst ALLOWED_FIELDS =\n \"only `component`, `client`, and `media` are allowed in a descriptor.\";\n\n/** Fold one descriptor-object property into the accumulating descriptor. */\nconst applyDescriptorProperty = (\n descriptor: RawDescriptor,\n property: ts.ObjectLiteralElementLike,\n label: string,\n context: AnalysisContext\n): void => {\n if (ts.isShorthandPropertyAssignment(property)) {\n if (property.name.text === \"component\") {\n descriptor.source = resolveIdentifier(\n property.name.text,\n `${label}'s \\`component\\``,\n property,\n context\n );\n return;\n }\n const shorthand = property.name.text;\n if (shorthand === \"client\" || shorthand === \"media\") {\n reject(\n context,\n `${label} writes \\`${shorthand}\\` as a shorthand property; only \\`component\\` may be shorthand, \\`${shorthand}\\` must be a string literal.`,\n property\n );\n return;\n }\n reject(\n context,\n `${label} has a \\`${shorthand}\\` field; ${ALLOWED_FIELDS}`,\n property\n );\n return;\n }\n if (!ts.isPropertyAssignment(property)) {\n reject(\n context,\n `${label} contains a spread, method, or accessor; write it as a plain \\`{ component, client, media }\\` object literal.`,\n property\n );\n return;\n }\n const name = propName(property.name);\n const init = property.initializer;\n if (name === \"component\") {\n if (ts.isStringLiteral(init)) {\n descriptor.source = sourceFor(\n init.text,\n \"default\",\n `${label}'s \\`component\\``,\n init,\n context\n );\n } else if (ts.isIdentifier(init)) {\n descriptor.source = resolveIdentifier(\n init.text,\n `${label}'s \\`component\\``,\n init,\n context\n );\n } else {\n reject(\n context,\n `${label}'s \\`component\\` must be an imported identifier or a path string.`,\n init\n );\n }\n } else if (name === \"client\") {\n if (ts.isStringLiteral(init) && isHydrationMode(init.text)) {\n descriptor.client = init.text;\n } else {\n reject(\n context,\n `${label}'s \\`client\\` must be a string literal: ${HYDRATION_MODE_LIST}.`,\n init\n );\n }\n } else if (name === \"media\") {\n if (ts.isStringLiteral(init)) {\n descriptor.media = init.text;\n } else {\n reject(context, `${label}'s \\`media\\` must be a string literal.`, init);\n }\n } else {\n reject(\n context,\n `${label} has a \\`${name ?? property.name.getText()}\\` field; ${ALLOWED_FIELDS}`,\n property\n );\n }\n};\n\n/**\n * Read a `{ component, client, media }` descriptor. Returns null (after\n * recording the reason) when it can't be planned.\n */\nconst readDescriptor = (\n object: ts.ObjectLiteralExpression,\n label: string,\n context: AnalysisContext\n): RawDescriptor | null => {\n const descriptor: RawDescriptor = { source: null };\n const before = context.errors.length;\n let hadComponent = false;\n for (const property of object.properties) {\n if (property.name && propName(property.name) === \"component\") {\n hadComponent = true;\n }\n applyDescriptorProperty(descriptor, property, label, context);\n }\n if (!hadComponent) {\n reject(\n context,\n `${label} is an object literal without a \\`component\\` field.`,\n object\n );\n }\n return context.errors.length === before ? descriptor : null;\n};\n\n/** Apply cross-cutting validation and produce the final normalized override. */\nconst finalize = (\n key: string,\n descriptor: RawDescriptor,\n label: string,\n warnings: string[]\n): NormalizedOverride | null => {\n const { client, media, source } = descriptor;\n if (!source) {\n return null;\n }\n\n if (client === \"media\" && !media) {\n warnings.push(\n `Override \"${key}\" uses client: \"media\" but no \\`media\\` query was given; it will hydrate as if \\`client: \"load\"\\`.`\n );\n }\n\n if (client === \"only\" && !source.framework) {\n warnings.push(\n `Override \"${key}\" uses client: \"only\" but its framework couldn't be inferred; reference a .tsx/.jsx/.vue/.svelte file.`\n );\n }\n\n if (!client && source.framework) {\n warnings.push(\n `Override \"${key}\" points to a ${FRAMEWORK_LABEL[source.framework]} component (${label}) but has no hydration mode, so it renders as static HTML with no interactivity. Add one, e.g. \\`${key}: { component: ${JSON.stringify(label)}, client: \"load\" }\\`.`\n );\n }\n\n const normalized: NormalizedOverride = { key, source };\n if (client) {\n normalized.client = client;\n }\n if (media) {\n normalized.media = media;\n }\n return normalized;\n};\n\n/** Normalize one `key: value` entry of a group, or record why it's rejected. */\nconst normalizeEntry = (\n entry: ts.ObjectLiteralElementLike,\n group: Group,\n context: AnalysisContext\n): NormalizedOverride | null => {\n const { warnings } = context;\n\n if (ts.isShorthandPropertyAssignment(entry)) {\n const name = entry.name.text;\n return finalize(\n name,\n { source: resolveIdentifier(name, `${group}.${name}`, entry, context) },\n name,\n warnings\n );\n }\n\n if (ts.isSpreadAssignment(entry)) {\n reject(\n context,\n `${group} contains a spread (\\`...${entry.expression.getText()}\\`); list each override explicitly.`,\n entry\n );\n return null;\n }\n const key = propName(entry.name);\n if (!key) {\n reject(\n context,\n `${group} has an entry with a computed key (\\`${entry.name.getText()}\\`); keys must be plain names.`,\n entry\n );\n return null;\n }\n const label = `${group}.${key}`;\n if (!ts.isPropertyAssignment(entry)) {\n reject(\n context,\n `${label} is a method or accessor, which Blume can't analyze statically.`,\n entry\n );\n return null;\n }\n const value = entry.initializer;\n\n if (ts.isIdentifier(value)) {\n return finalize(\n key,\n { source: resolveIdentifier(value.text, label, entry, context) },\n value.text,\n warnings\n );\n }\n if (ts.isStringLiteral(value)) {\n return finalize(\n key,\n { source: sourceFor(value.text, \"default\", label, value, context) },\n value.text,\n warnings\n );\n }\n if (ts.isObjectLiteralExpression(value)) {\n const descriptor = readDescriptor(value, label, context);\n return descriptor ? finalize(key, descriptor, key, warnings) : null;\n }\n\n reject(\n context,\n `${label} is an inline expression, which Blume can't analyze statically.`,\n entry\n );\n return null;\n};\n\n/** Normalize one top-level `{ mdx | layout }` group into `result`. */\nconst collectGroupOverrides = (\n property: ts.ObjectLiteralElementLike,\n context: AnalysisContext,\n result: ComponentOverrideAnalysis\n): void => {\n if (ts.isSpreadAssignment(property)) {\n reject(\n context,\n `The top-level object contains a spread (\\`...${property.expression.getText()}\\`); list \\`mdx\\` and \\`layout\\` explicitly.`,\n property\n );\n return;\n }\n const name = propName(property.name);\n if (name === \"islands\") {\n reject(\n context,\n 'The `islands` group was folded into `mdx`: move each entry there and give it a `client` mode, e.g. `mdx: { Counter: { component: Counter, client: \"visible\" } }`.',\n property\n );\n return;\n }\n if (!(name && isGroup(name))) {\n reject(\n context,\n `\\`${name ?? property.name.getText()}\\` isn't an override group; use \\`mdx\\` or \\`layout\\`.`,\n property\n );\n return;\n }\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isObjectLiteralExpression(property.initializer)\n ) {\n reject(\n context,\n `\\`${name}\\` must be an object literal of overrides.`,\n property\n );\n return;\n }\n for (const entry of property.initializer.properties) {\n const normalized = normalizeEntry(entry, name, context);\n if (normalized) {\n result[name].push(normalized);\n }\n }\n};\n\n/**\n * A `components.ts` Blume can't plan. The diagnostic lists every rejected entry\n * at once (at the first one's line); `issues` holds each on its own, with its\n * line, for a caller that reports them one by one (`blume upgrade`).\n */\nexport class ComponentOverridesError extends BlumeError {\n readonly issues: Diagnostic[];\n\n constructor(diagnostic: Diagnostic, issues: Diagnostic[]) {\n super(diagnostic);\n this.name = \"ComponentOverridesError\";\n this.issues = issues;\n }\n}\n\n/** A rejection as a diagnostic, at its node's line when it has one. */\nconst rejectionDiagnostic = (\n filePath: string,\n sourceFile: ts.SourceFile,\n rejection: Rejection\n): Diagnostic => {\n const position = rejection.node\n ? sourceFile.getLineAndCharacterOfPosition(\n rejection.node.getStart(sourceFile)\n )\n : undefined;\n return {\n code: \"BLUME_COMPONENTS_INVALID\",\n column: position && position.character + 1,\n file: filePath,\n line: position && position.line + 1,\n message: rejection.message,\n severity: \"error\",\n suggestion: rejection.missingFile ? undefined : ACCEPTED_OVERRIDE_FORMS,\n };\n};\n\nconst invalidOverrides = (\n filePath: string,\n sourceFile: ts.SourceFile,\n rejections: Rejection[]\n): ComponentOverridesError => {\n const issues = rejections.map((rejection) =>\n rejectionDiagnostic(filePath, sourceFile, rejection)\n );\n const first = issues.find((issue) => issue.line !== undefined);\n return new ComponentOverridesError(\n {\n code: \"BLUME_COMPONENTS_INVALID\",\n column: first?.column,\n file: filePath,\n line: first?.line,\n message: `${basename(filePath)} has ${rejections.length} override(s) Blume can't plan:\\n${rejections.map((rejection) => ` - ${rejection.message}`).join(\"\\n\")}`,\n severity: \"error\",\n suggestion: rejections.every((rejection) => rejection.missingFile)\n ? undefined\n : ACCEPTED_OVERRIDE_FORMS,\n },\n issues\n );\n};\n\n/**\n * Parse a user `components.ts`/`.tsx` and return its normalized overrides. Never\n * executes the file. Throws a `BLUME_COMPONENTS_INVALID`\n * {@link ComponentOverridesError} listing every entry that isn't one of the\n * accepted forms or points at a file that doesn't exist.\n */\nexport const analyzeComponentOverrides = (\n source: string,\n filePath: string\n): ComponentOverrideAnalysis => {\n const result = emptyComponentOverrides();\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith(\"tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n const exported = findDefaultExport(sourceFile);\n if (!exported) {\n throw invalidOverrides(filePath, sourceFile, [\n {\n message:\n \"No default export was found; export `defineComponents({ mdx, layout })` (or a plain object literal) as the default.\",\n },\n ]);\n }\n const object = unwrapObject(exported.expression);\n if (!object) {\n throw invalidOverrides(filePath, sourceFile, [\n {\n message:\n \"The default export isn't an object literal or a `defineComponents({ ... })` call.\",\n node: exported,\n },\n ]);\n }\n\n const context: AnalysisContext = {\n dir: dirname(filePath),\n errors: [],\n imports: collectImports(sourceFile),\n warnings: result.warnings,\n };\n\n for (const property of object.properties) {\n collectGroupOverrides(property, context, result);\n }\n\n if (context.errors.length > 0) {\n throw invalidOverrides(filePath, sourceFile, context.errors);\n }\n return result;\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "D84ED7D5A5A4CC7064756E2164756E21",
9
+ "names": []
10
+ }