void 0.26.0 → 0.26.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 (360) hide show
  1. package/AGENTS_TEMPLATE.md +1 -3
  2. package/README.md +19 -9
  3. package/dist/{account-cmd-CDry3B5V.mjs → account-cmd-CfUXh_nU.mjs} +8 -7
  4. package/dist/{application-analysis-DC2yPvzY.mjs → application-analysis-DKy02UY0.mjs} +21 -32
  5. package/dist/{application-routing-C9khgLiS.mjs → application-routing-DQyUh_5S.mjs} +1 -1
  6. package/dist/{auth-D52yG7hl.mjs → auth-B5_tZLxT.mjs} +7 -7
  7. package/dist/{auth-B60QDbjg.mjs → auth-BgX2qYSY.mjs} +1 -1
  8. package/dist/{auth-link-DjeOptYi.mjs → auth-link-D5RmKnzh.mjs} +5 -5
  9. package/dist/{auth-migrations-9vif1uj8.mjs → auth-migrations-BwHgeEsD.mjs} +8 -18
  10. package/dist/{auth-router-BRxIuqDi.mjs → auth-router-Bap-pvbn.mjs} +4 -17
  11. package/dist/{better-auth-shared-BVkjZ3vM.d.mts → better-auth-shared-CPvWD3nG.d.mts} +0 -4
  12. package/dist/{better-auth-shared-hy6RPh9W.mjs → better-auth-shared-DPpj8zxc.mjs} +94 -16
  13. package/dist/{build-cmd-Ce3C8huo.mjs → build-cmd-B58c8iS8.mjs} +7 -6
  14. package/dist/{cache-CS8Yxr5a.mjs → cache-Bo52trKF.mjs} +7 -7
  15. package/dist/{cancel-deploy-mZsD88Xa.mjs → cancel-deploy-BZNz3Q26.mjs} +5 -4
  16. package/dist/{cf-access-YTlqvAsk.mjs → cf-access-ngGqZpHZ.mjs} +10 -11
  17. package/dist/{cf-build-output-U8o1Gl6X.mjs → cf-build-output-DjvB_872.mjs} +62 -85
  18. package/dist/cf-build-output-H9a97vME.mjs +2 -0
  19. package/dist/cli/cli.mjs +48 -83
  20. package/dist/cli/cloudflare-operation-process.mjs +71 -77
  21. package/dist/cli/env-schema-probe.mjs +5 -6
  22. package/dist/client-By4JjMw_.mjs +2 -0
  23. package/dist/{client-mC-dFGDD.mjs → client-C2Prx_Bi.mjs} +28 -6
  24. package/dist/{cloudflare-auth-Qdc7tw8F.mjs → cloudflare-auth-CuxfF6OA.mjs} +9 -17
  25. package/dist/{cloudflare-cmd-bhwCxAN6.mjs → cloudflare-cmd-lHqNlJGW.mjs} +6 -5
  26. package/dist/{cloudflare-config-Bktvwtpf.mjs → cloudflare-config-BmhBv3HV.mjs} +1 -1
  27. package/dist/{cloudflare-connect-CuhRgk3k.mjs → cloudflare-connect-2G3rL2rP.mjs} +4 -4
  28. package/dist/{cloudflare-operations-DoQrVHAt.mjs → cloudflare-operations-BlYLlowZ.mjs} +1 -1
  29. package/dist/{cloudflare-operations-DYa3coIk.mjs → cloudflare-operations-CwI1bChl.mjs} +41 -70
  30. package/dist/{cloudflare-process-B-wekeR6.mjs → cloudflare-process-2-TfIEzB.mjs} +20 -22
  31. package/dist/{config-CyQ-wVd7.mjs → config-5r-YpMC-.mjs} +1 -1
  32. package/dist/{config-C_XRIPx2.mjs → config-B_ggY-IO.mjs} +3 -3
  33. package/dist/config-BtSFvXZx.mjs +2 -0
  34. package/dist/config-CLYAosnQ.mjs +78 -0
  35. package/dist/{config-BMHb8RCj.d.mts → config-CSa15FvD.d.mts} +1 -1
  36. package/dist/{config-Br_JZD6u.mjs → config-DiowPT80.mjs} +24 -30
  37. package/dist/config-entry.d.mts +1 -1
  38. package/dist/{config-write-B1f88wJA.mjs → config-write-AHGesphx.mjs} +8 -7
  39. package/dist/{connect-H6EvP62X.mjs → connect-X0MUA1gk.mjs} +10 -9
  40. package/dist/{create-project-B2kk9Q0o.mjs → create-project-DxiyW6iX.mjs} +6 -6
  41. package/dist/{create-project-Dbb4uiN-.mjs → create-project-iwkbqiBU.mjs} +1 -1
  42. package/dist/{db-DpCKZto0.mjs → db-XnVMHzoV.mjs} +100 -132
  43. package/dist/{delete-CxlSvsvW.mjs → delete-esYlMiSJ.mjs} +6 -6
  44. package/dist/{deploy-CeEbnv4b.mjs → deploy-BsEvnlJl.mjs} +2346 -2495
  45. package/dist/deploy-C1d-YTfp.mjs +2 -0
  46. package/dist/{dev-inbox-D64ZKUod.mjs → dev-inbox-CK-UuPob.mjs} +7 -16
  47. package/dist/{discover-BcPPiF1o.mjs → discover-CkCYv9T_.mjs} +1 -2
  48. package/dist/discover-EDUf6JJw.mjs +2 -0
  49. package/dist/{prompts-ZAuJlyCj.mjs → dist-Bx1z6Eva.mjs} +1 -1
  50. package/dist/{dist-AoCzRTJE.mjs → dist-Cegxq8gs.mjs} +8 -8
  51. package/dist/{prompts-6OSVA7DJ.mjs → dist-D3m88sjf.mjs} +10 -53
  52. package/dist/{domain-B_9VgOm6.mjs → domain-CbbBWhWE.mjs} +28 -29
  53. package/dist/{dotenv-VQxupEUv.mjs → dotenv-BfU6eqFt.mjs} +20 -32
  54. package/dist/{drizzle-Beb2Am5S.mjs → drizzle-CF84FOVM.mjs} +16 -13
  55. package/dist/{email-BokHgjKj.mjs → email-CpuT42g7.mjs} +23 -18
  56. package/dist/{email--tEtMoj_.mjs → email-d_Aux1vM.mjs} +1 -1
  57. package/dist/{entry-CF5wvH4w.mjs → entry-CMAkqBmU.mjs} +6 -6
  58. package/dist/{env-_v349JBd.mjs → env-BxocywBB.mjs} +25 -6
  59. package/dist/{env-D5liuQYR.mjs → env-DMA3cXZt.mjs} +1 -1
  60. package/dist/{env-raw-Cx8ElDdj.mjs → env-raw-jZpP5n47.mjs} +1 -2
  61. package/dist/{env-types-D5kds_OZ.mjs → env-types-CwXgeMgL.mjs} +1 -1
  62. package/dist/{env-validation-cZBvGWaP.mjs → env-validation-CrVNjsPm.mjs} +1 -1
  63. package/dist/{env-validation-vBSQ8gw5.mjs → env-validation-Dxdx_5wo.mjs} +17 -21
  64. package/dist/{env-BdTc-K2L.mjs → env-w9jOyGZn.mjs} +9 -9
  65. package/dist/{fetch-_SeGZao9.d.mts → fetch-BPCYVi3H.d.mts} +20 -1
  66. package/dist/{fetch-BIZJh7vR.mjs → fetch-sAcwjzLO.mjs} +1 -1
  67. package/dist/{fetch-stream-Nm3hkZbT.mjs → fetch-stream-PGgz4uGz.mjs} +18 -23
  68. package/dist/{fetch-stream-Bjf0hoZb.d.mts → fetch-stream-obvZ7fvO.d.mts} +1 -16
  69. package/dist/{gen-BhDlTpwW.mjs → gen-DtkQhvQg.mjs} +40 -57
  70. package/dist/gen-dA9hW7AV.mjs +2 -0
  71. package/dist/{github-cmd-hhkTzlGS.mjs → github-cmd-D_FsOFxq.mjs} +64 -163
  72. package/dist/{handler-DghKr6dU.mjs → handler-BHAn2fZJ.mjs} +1 -0
  73. package/dist/{handler-BeK3weD4.d.mts → handler-CNAwjRcW.d.mts} +4 -11
  74. package/dist/{head-Do8P4puT.d.mts → head-C8K_iGe6.d.mts} +1 -1
  75. package/dist/{head-D_QRR5Yd.mjs → head-D2VF4ApL.mjs} +29 -51
  76. package/dist/{headers-2rKda9Y6.mjs → headers-DlfR78Nu.mjs} +3 -3
  77. package/dist/{help-Bv44e2tm.mjs → help-CVFBTmBx.mjs} +13 -32
  78. package/dist/help-DzKUrQvk.mjs +2 -0
  79. package/dist/{inbound-fRkqcXaC.mjs → inbound-PfQDLXc5.mjs} +23 -24
  80. package/dist/index.d.mts +19 -2
  81. package/dist/index.mjs +617 -530
  82. package/dist/{info-DhtTKh65.mjs → info-PYWwkWyt.mjs} +4 -4
  83. package/dist/{init-BMf4T03q.mjs → init-Bw-fRKGp.mjs} +160 -197
  84. package/dist/{link-BqYsSS_I.mjs → link-DlPG8iX3.mjs} +9 -9
  85. package/dist/{list-_kBToO-l.mjs → list-2GN7_ueV.mjs} +8 -7
  86. package/dist/{live-CB1y5IuC.mjs → live-CgQuTpqD.mjs} +15 -16
  87. package/dist/{live-iAuEH1hd.d.mts → live-Du8jXwOW.d.mts} +4 -2
  88. package/dist/{local-d1-fGxYrVD6.mjs → local-d1-ga5O_idV.mjs} +2 -2
  89. package/dist/{login-DFuo-RWO.mjs → login-D-Q4xw3Q.mjs} +7 -7
  90. package/dist/login-Dc-wuTDq.mjs +2 -0
  91. package/dist/{logs-DYgnh6dH.mjs → logs-rd8J-OFh.mjs} +27 -10
  92. package/dist/migrate-BHp07yJE.mjs +2 -0
  93. package/dist/{migrate-CV1on-yJ.mjs → migrate-NLsjBbuM.mjs} +34 -20
  94. package/dist/{mime-D5Nmdzf7.mjs → mime-DxCznlJq.mjs} +45 -95
  95. package/dist/{node-C6Q6e1Es.mjs → node-DJicPvPj.mjs} +5 -5
  96. package/dist/{operator-args-DdY54Bgb.mjs → operator-args-BNsW5gfp.mjs} +10 -1
  97. package/dist/{operator-auth-2dsGlTT5.mjs → operator-auth-AzVLbrr3.mjs} +1 -1
  98. package/dist/{operator-client-BFqpp6z0.mjs → operator-client-BQtzyG-g.mjs} +1 -1
  99. package/dist/{operator-cmd-CUGHXrQf.mjs → operator-cmd-B6f6Cg9Z.mjs} +24 -11
  100. package/dist/operator-cmd-Cwn50lOV.mjs +2 -0
  101. package/dist/{output-BvdaehtE.mjs → output-C50ag2r3.mjs} +20 -2
  102. package/dist/pages/client.d.mts +19 -51
  103. package/dist/pages/client.mjs +204 -225
  104. package/dist/pages/head-client.d.mts +1 -1
  105. package/dist/pages/head.d.mts +1 -1
  106. package/dist/pages/head.mjs +1 -1
  107. package/dist/pages/index.d.mts +2 -2
  108. package/dist/pages/index.mjs +6 -12
  109. package/dist/pages/islands-plugin.d.mts +1 -1
  110. package/dist/pages/islands-plugin.mjs +21 -25
  111. package/dist/pages/protocol.d.mts +2 -2
  112. package/dist/pages/protocol.mjs +2 -2
  113. package/dist/{plan-CJGEeTEI.mjs → plan-BhLO2p4w.mjs} +2 -1
  114. package/dist/plan-CH2G51je.mjs +2 -0
  115. package/dist/{platform-args-DSV2p4nY.mjs → platform-args-BoZkWQnJ.mjs} +1 -1
  116. package/dist/platform-args-DYgITk0D.mjs +2 -0
  117. package/dist/{platform-auth-config-Bosx7U1h.mjs → platform-auth-config-n603OANg.mjs} +40 -36
  118. package/dist/{platform-auth-protection-DcbL_LW_.mjs → platform-auth-protection-zxDr0hWW.mjs} +8 -7
  119. package/dist/{platform-auth-recovery-WfTZ8K6o.mjs → platform-auth-recovery-tw9lgtgE.mjs} +7 -6
  120. package/dist/{platform-cmd-DbKtQb_4.mjs → platform-cmd-B8-bCb7t.mjs} +10 -10
  121. package/dist/{platform-cmd-dyFUof0t.mjs → platform-cmd-C00YM14r.mjs} +1 -1
  122. package/dist/{platform-domain-Bsq43AJp.mjs → platform-domain-p0kobLV8.mjs} +5 -5
  123. package/dist/{platform-lifecycle-Cfi0o6xM.mjs → platform-lifecycle-D_QEY32D.mjs} +75 -386
  124. package/dist/{platform-lifecycle--5gWmDoI.mjs → platform-lifecycle-vFqtNPPa.mjs} +1 -1
  125. package/dist/{platform-management-BrF9STZp.mjs → platform-management-BdYblvvE.mjs} +6 -6
  126. package/dist/{platform-management-Bbwf6-Dq.mjs → platform-management-oi-SvI3f.mjs} +1 -1
  127. package/dist/{platform-plans-config-DU-8nC2Y.mjs → platform-plans-config-CjiFv5J4.mjs} +5 -4
  128. package/dist/{platform-recovery-DQAqAQYu.mjs → platform-recovery-PvNS9Nl2.mjs} +2 -2
  129. package/dist/platform-setup-DVe42Ws7.mjs +299 -0
  130. package/dist/{plugin-inference-CXWnn79A.mjs → plugin-inference-BlQbOL0P.mjs} +43 -42
  131. package/dist/prepare-DRUV-g3X.mjs +2 -0
  132. package/dist/{prepare-WoUubFKL.mjs → prepare-Do96654b.mjs} +8 -8
  133. package/dist/{prepare-BMrRWLwP.mjs → prepare-Dq9hTIbo.mjs} +4 -4
  134. package/dist/{prerender-render-D9qbLs2f.mjs → prerender-render-Ct20jftc.mjs} +17 -3
  135. package/dist/prerender-render.mjs +1 -1
  136. package/dist/{project-cmd-BbH2LptN.mjs → project-cmd-ti8_yTcA.mjs} +18 -18
  137. package/dist/{project-team-Yiww3-go.mjs → project-team-CDPE1Tsg.mjs} +14 -17
  138. package/dist/{project-token-BrtT2NkY.mjs → project-token-CkZ1cN0Z.mjs} +13 -16
  139. package/dist/{project-tsconfig-B8GeM0RM.mjs → project-tsconfig-CVJhNMxs.mjs} +2 -1
  140. package/dist/{project-zero-trust-nYJ2V2nc.mjs → project-zero-trust-DdjLR61k.mjs} +11 -8
  141. package/dist/{protocol-BX8t2jiw.d.mts → protocol-BPZaNqBo.d.mts} +4 -2
  142. package/dist/{protocol-U7bfjHmA.mjs → protocol-CfaUwNs8.mjs} +46 -49
  143. package/dist/{providers-CJlNS3kT.mjs → providers-BXuhmuub.mjs} +1 -12
  144. package/dist/{provision-VeqAC77A.mjs → provision-BfaLiWbj.mjs} +38 -41
  145. package/dist/{provision-DMTPG8Rh.mjs → provision-Wu9ZBk9L.mjs} +2 -3
  146. package/dist/{requests-TIz_jtSu.mjs → requests-DFAqyYy8.mjs} +4 -4
  147. package/dist/resolve-project-BIeYs9Cw.mjs +2 -0
  148. package/dist/{resolve-project-BG5ORGID.mjs → resolve-project-CP8rZs_p.mjs} +6 -1
  149. package/dist/{rollback-dBqICPzj.mjs → rollback-BKYXBduI.mjs} +29 -36
  150. package/dist/{route-types-Clm4WD0B.mjs → route-types-CbtsIeFn.mjs} +1 -1
  151. package/dist/route-url-BgPja1GS.d.mts +5 -0
  152. package/dist/route-url-BjGv_KKY.mjs +28 -0
  153. package/dist/runner-9wjsSZx-.mjs +2 -0
  154. package/dist/{runner--2KF6Kua.mjs → runner-DMBKSrRk.mjs} +2 -2
  155. package/dist/{runner-mysql-DmWchSWJ.mjs → runner-mysql-CEzKtmFb.mjs} +8 -8
  156. package/dist/{runner-mysql-CEG5JozK.mjs → runner-mysql-CkFqZ6CE.mjs} +1 -1
  157. package/dist/{runner-pg-Bh4AgZdj.mjs → runner-pg-BGYRFdRp.mjs} +1 -1
  158. package/dist/runtime/ai.d.mts +1 -1
  159. package/dist/runtime/ai.mjs +34 -95
  160. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  161. package/dist/runtime/better-auth-mysql.mjs +4 -9
  162. package/dist/runtime/better-auth-pg.d.mts +1 -1
  163. package/dist/runtime/better-auth-pg.mjs +5 -10
  164. package/dist/runtime/better-auth.d.mts +1 -1
  165. package/dist/runtime/better-auth.mjs +3 -3
  166. package/dist/runtime/client-react.d.mts +2 -3
  167. package/dist/runtime/client-react.mjs +2 -2
  168. package/dist/runtime/client-solid.d.mts +2 -3
  169. package/dist/runtime/client-solid.mjs +2 -2
  170. package/dist/runtime/client-svelte.d.mts +2 -3
  171. package/dist/runtime/client-svelte.mjs +2 -2
  172. package/dist/runtime/client-vue.d.mts +2 -3
  173. package/dist/runtime/client-vue.mjs +2 -2
  174. package/dist/runtime/client.d.mts +2 -3
  175. package/dist/runtime/client.mjs +2 -2
  176. package/dist/runtime/db.mjs +1 -1
  177. package/dist/runtime/durable.mjs +3 -10
  178. package/dist/runtime/email/testing.mjs +5 -5
  179. package/dist/runtime/email.d.mts +2 -1
  180. package/dist/runtime/email.mjs +11 -27
  181. package/dist/runtime/env-public.mjs +15 -20
  182. package/dist/runtime/env.mjs +1 -1
  183. package/dist/runtime/fetch-stream.d.mts +2 -2
  184. package/dist/runtime/fetch-stream.mjs +1 -1
  185. package/dist/runtime/fetch.d.mts +2 -3
  186. package/dist/runtime/fetch.mjs +1 -1
  187. package/dist/runtime/handler.d.mts +1 -1
  188. package/dist/runtime/handler.mjs +2 -2
  189. package/dist/runtime/isr.mjs +1 -1
  190. package/dist/runtime/kv.mjs +10 -11
  191. package/dist/runtime/live-client.d.mts +1 -1
  192. package/dist/runtime/live-client.mjs +12 -22
  193. package/dist/runtime/live-server.mjs +27 -35
  194. package/dist/runtime/live.d.mts +2 -2
  195. package/dist/runtime/live.mjs +2 -2
  196. package/dist/runtime/migration-handler.mjs +4 -81
  197. package/dist/runtime/queues.mjs +1 -1
  198. package/dist/runtime/remote/binding-handler.d.mts +2 -2
  199. package/dist/runtime/remote/binding-handler.mjs +8 -9
  200. package/dist/runtime/remote/index.mjs +27 -77
  201. package/dist/runtime/route-url.d.mts +2 -4
  202. package/dist/runtime/route-url.mjs +1 -1
  203. package/dist/runtime/routing.d.mts +1 -1
  204. package/dist/runtime/routing.mjs +15 -26
  205. package/dist/runtime/sandbox.mjs +2 -2
  206. package/dist/runtime/sse.mjs +1 -1
  207. package/dist/runtime/storage.mjs +1 -1
  208. package/dist/runtime/validator.d.mts +1 -1
  209. package/dist/runtime/ws-server.d.mts +2 -2
  210. package/dist/runtime/ws-server.mjs +30 -61
  211. package/dist/runtime/ws.d.mts +1 -1
  212. package/dist/runtime/ws.mjs +1 -1
  213. package/dist/{scan-C8dA7iM4.mjs → scan-C3uDzz6J.mjs} +12 -13
  214. package/dist/{secret-AKnNXNP5.mjs → secret-BAt2KMmO.mjs} +14 -14
  215. package/dist/{skills-BPQUGClu.mjs → skills-BgVMvQdy.mjs} +2 -2
  216. package/dist/{sse-CQNaDFFV.mjs → sse-CMvCgjNk.mjs} +1 -1
  217. package/dist/{subcommand-prompt-B6WS9Aoz.mjs → subcommand-prompt-BSlnD1fI.mjs} +2 -2
  218. package/dist/sveltekit.d.mts +0 -2
  219. package/dist/terminal-log-text-D9ACPOuG.mjs +32 -0
  220. package/dist/validate-BJr9LfXy.mjs +2 -0
  221. package/dist/{validate-ymhap6M_.mjs → validate-C9qJArv7.mjs} +9 -28
  222. package/dist/{defer-YsYDUoii.mjs → validation-error-Dg9Recn1.mjs} +11 -11
  223. package/dist/{wrangler-DhUerFkW.mjs → wrangler-D9KTuqnv.mjs} +89 -194
  224. package/dist/{ws-C79j4aED.d.mts → ws-CChrrAU-.d.mts} +1 -1
  225. package/dist/{yarn-pnp-BV4AzNul.mjs → yarn-pnp-CUX_iTPA.mjs} +19 -27
  226. package/{skills/void/docs → docs}/guide/ai.md +5 -3
  227. package/{skills/void/docs → docs}/guide/auth.md +37 -1
  228. package/{skills/void/docs → docs}/guide/database/postgresql.md +2 -2
  229. package/{skills/void/docs → docs}/guide/edge/revalidation.md +1 -1
  230. package/{skills/void/docs → docs}/guide/edge/rewrites.md +2 -4
  231. package/{skills/void/docs → docs}/guide/email/receiving.md +2 -2
  232. package/{skills/void/docs → docs}/guide/email/sending.md +0 -2
  233. package/{skills/void/docs → docs}/guide/env-vars.md +4 -0
  234. package/{skills/void/docs → docs}/guide/jobs.md +2 -2
  235. package/{skills/void/docs → docs}/guide/live.md +10 -5
  236. package/{skills/void/docs → docs}/guide/pages-routing/actions-and-forms.md +20 -8
  237. package/{skills/void/docs → docs}/guide/pages-routing/loaders.md +7 -3
  238. package/{skills/void/docs → docs}/guide/pages-routing/markdown.md +15 -23
  239. package/{skills/void/docs → docs}/guide/pages-routing/overview.md +6 -4
  240. package/{skills/void/docs → docs}/guide/platform/administration/access.md +2 -10
  241. package/{skills/void/docs → docs}/guide/platform/administration/operations.md +3 -12
  242. package/{skills/void/docs → docs}/guide/platform/administration/projects.md +1 -1
  243. package/{skills/void/docs → docs}/guide/platform/development/local.md +4 -2
  244. package/{skills/void/docs → docs}/guide/platform/development/runtime.md +1 -1
  245. package/{skills/void/docs → docs}/guide/platform/development/schema-ci.md +1 -1
  246. package/{skills/void/docs → docs}/guide/platform/installation/domains.md +3 -1
  247. package/{skills/void/docs → docs}/guide/platform/installation/first-deployment.md +3 -1
  248. package/{skills/void/docs → docs}/guide/platform/installation/maintenance.md +4 -0
  249. package/{skills/void/docs → docs}/guide/project-collaboration.md +6 -2
  250. package/{skills/void/docs → docs}/guide/queues.md +0 -2
  251. package/{skills/void/docs → docs}/guide/remote-dev.md +5 -5
  252. package/{skills/void/docs → docs}/guide/sandboxes.md +2 -2
  253. package/{skills/void/docs → docs}/guide/sse.md +0 -2
  254. package/{skills/void/docs → docs}/guide/storage.md +7 -2
  255. package/{skills/void/docs → docs}/guide/websockets.md +4 -0
  256. package/docs/integrations/agents.md +37 -0
  257. package/{skills/void/docs → docs}/integrations/frameworks/astro.md +3 -3
  258. package/{skills/void/docs → docs}/integrations/frameworks/nuxt.md +6 -2
  259. package/{skills/void/docs → docs}/integrations/hono.md +15 -7
  260. package/{skills/void/docs → docs}/integrations/nodejs-bun-deno.md +1 -0
  261. package/{skills/void/docs → docs}/reference/api/auth.md +1 -1
  262. package/{skills/void/docs → docs}/reference/api/handlers.md +4 -2
  263. package/{skills/void/docs → docs}/reference/api/pages.md +4 -0
  264. package/{skills/void/docs → docs}/reference/cli/auth.md +0 -5
  265. package/{skills/void/docs → docs}/reference/cli/database.md +3 -4
  266. package/{skills/void/docs → docs}/reference/cli/generate.md +1 -1
  267. package/{skills/void/docs → docs}/reference/cli/github.md +3 -12
  268. package/{skills/void/docs → docs}/reference/cli/platform-config.md +1 -1
  269. package/{skills/void/docs → docs}/reference/cli/platform-email.md +2 -3
  270. package/{skills/void/docs → docs}/reference/cli/platform-installation.md +1 -1
  271. package/{skills/void/docs → docs}/reference/cli/platform-operations.md +3 -0
  272. package/{skills/void/docs → docs}/reference/cli/platform-users.md +2 -2
  273. package/{skills/void/docs → docs}/reference/cli/project.md +5 -4
  274. package/{skills/void/docs → docs}/reference/cli/secrets.md +3 -3
  275. package/{skills/void/docs → docs}/reference/cli/setup.md +9 -11
  276. package/{skills/void/docs → docs}/reference/cli.md +1 -1
  277. package/{skills/void/docs → docs}/reference/config.md +13 -13
  278. package/{skills/void/docs → docs}/reference/resource-inference.md +1 -16
  279. package/package.json +34 -30
  280. package/schema.json +1 -1
  281. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +4 -1
  282. package/skills/void/SKILL.md +6 -3
  283. package/dist/cf-build-output-ChY6-XWP.mjs +0 -2
  284. package/dist/client-BxVixJBI.mjs +0 -2
  285. package/dist/config-0acf1oys.mjs +0 -2
  286. package/dist/config-D8MOgiQV.mjs +0 -32
  287. package/dist/deploy-qmiLE1G1.mjs +0 -2
  288. package/dist/discover-AMCBXivQ.mjs +0 -2
  289. package/dist/fetch-error-Sp1R4mZv.d.mts +0 -20
  290. package/dist/gen-qCBwH3fZ.mjs +0 -2
  291. package/dist/help-Dw5f9Xrg.mjs +0 -2
  292. package/dist/login-D7meQg_3.mjs +0 -2
  293. package/dist/migrate-CEu2X5DB.mjs +0 -2
  294. package/dist/operator-cmd-DRPvhpjM.mjs +0 -2
  295. package/dist/plan-COtUvdMA.mjs +0 -2
  296. package/dist/platform-args-Dcy_5b_Y.mjs +0 -2
  297. package/dist/prepare-BBknoZI1.mjs +0 -2
  298. package/dist/resolve-project-DtbidV4y.mjs +0 -2
  299. package/dist/route-url-CG7U-cRN.mjs +0 -15
  300. package/dist/runner-voIltZrY.mjs +0 -2
  301. package/dist/validate-pna7R3Pv.mjs +0 -2
  302. package/skills/void/docs/integrations/agents.md +0 -26
  303. package/dist/{runner-pg-D4OPlil-.mjs → runner-pg-DV8p_zjA.mjs} +4 -4
  304. package/{skills/void/docs → docs}/guide/app-types.md +0 -0
  305. package/{skills/void/docs → docs}/guide/database/d1.md +2 -2
  306. package/{skills/void/docs → docs}/guide/database/mysql.md +0 -0
  307. package/{skills/void/docs → docs}/guide/database.md +8 -8
  308. package/{skills/void/docs → docs}/guide/deployment.md +0 -0
  309. package/{skills/void/docs → docs}/guide/durable-state.md +0 -0
  310. package/{skills/void/docs → docs}/guide/edge/headers.md +0 -0
  311. package/{skills/void/docs → docs}/guide/edge/prerendering.md +0 -0
  312. package/{skills/void/docs → docs}/guide/edge/redirects.md +0 -0
  313. package/{skills/void/docs → docs}/guide/edge/static-assets.md +0 -0
  314. package/{skills/void/docs → docs}/guide/email/domains.md +0 -0
  315. package/{skills/void/docs → docs}/guide/email.md +0 -0
  316. package/{skills/void/docs → docs}/guide/index.md +0 -0
  317. package/{skills/void/docs → docs}/guide/kv.md +0 -0
  318. package/{skills/void/docs → docs}/guide/pages-routing/head.md +0 -0
  319. package/{skills/void/docs → docs}/guide/pages-routing/islands.md +2 -2
  320. package/{skills/void/docs → docs}/guide/pages-routing/layouts.md +0 -0
  321. package/{skills/void/docs → docs}/guide/pages-routing/view-transitions.md +0 -0
  322. package/{skills/void/docs → docs}/guide/platform/administration/email.md +0 -0
  323. package/{skills/void/docs → docs}/guide/platform/administration/plans.md +0 -0
  324. package/{skills/void/docs → docs}/guide/platform/administration/zero-trust.md +0 -0
  325. package/{skills/void/docs → docs}/guide/platform/installation/ci.md +0 -0
  326. package/{skills/void/docs → docs}/guide/platform/installation/credentials.md +0 -0
  327. package/{skills/void/docs → docs}/guide/platform/installation/prerequisites.md +0 -0
  328. package/{skills/void/docs → docs}/guide/platform/installation/setup.md +0 -0
  329. package/{skills/void/docs → docs}/guide/platform/installation/uninstall.md +0 -0
  330. package/{skills/void/docs → docs}/guide/platform-administration.md +0 -0
  331. package/{skills/void/docs → docs}/guide/platform-development.md +0 -0
  332. package/{skills/void/docs → docs}/guide/quickstart.md +0 -0
  333. package/{skills/void/docs → docs}/guide/self-hosted-platform.md +0 -0
  334. package/{skills/void/docs → docs}/guide/server-routing.md +3 -3
  335. package/{skills/void/docs → docs}/guide/ssg.md +0 -0
  336. package/{skills/void/docs → docs}/guide/ssr.md +0 -0
  337. package/{skills/void/docs → docs}/guide/type-safety.md +0 -0
  338. package/{skills/void/docs → docs}/guide/typed-fetch.md +0 -0
  339. package/{skills/void/docs → docs}/index.md +0 -0
  340. package/{skills/void/docs → docs}/integrations/cloudflare.md +0 -0
  341. package/{skills/void/docs → docs}/integrations/frameworks/analog.md +3 -3
  342. package/{skills/void/docs → docs}/integrations/frameworks/overview.md +0 -0
  343. package/{skills/void/docs → docs}/integrations/frameworks/react-router.md +3 -3
  344. package/{skills/void/docs → docs}/integrations/frameworks/sveltekit.md +1 -1
  345. package/{skills/void/docs → docs}/integrations/frameworks/tanstack-start.md +2 -2
  346. package/{skills/void/docs → docs}/reference/api/client.md +0 -0
  347. package/{skills/void/docs → docs}/reference/api/database.md +2 -2
  348. /package/{skills/void/docs → docs}/reference/api/durable.md +0 -0
  349. /package/{skills/void/docs → docs}/reference/api/env.md +0 -0
  350. /package/{skills/void/docs → docs}/reference/api/plugin.md +0 -0
  351. /package/{skills/void/docs → docs}/reference/api/resources.md +0 -0
  352. /package/{skills/void/docs → docs}/reference/api/rewrites.md +0 -0
  353. /package/{skills/void/docs → docs}/reference/api/types.md +0 -0
  354. /package/{skills/void/docs → docs}/reference/api.md +0 -0
  355. /package/{skills/void/docs → docs}/reference/cli/deploy.md +0 -0
  356. /package/{skills/void/docs → docs}/reference/cli/domains.md +0 -0
  357. /package/{skills/void/docs → docs}/reference/cli/email.md +0 -0
  358. /package/{skills/void/docs → docs}/reference/cli/platform-zero-trust.md +0 -0
  359. /package/{skills/void/docs → docs}/reference/cli/platform.md +0 -0
  360. /package/{skills/void/docs → docs}/reference/structure.md +0 -0
@@ -1,15 +1,15 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
- import { i as persistCloudflareConfig, r as materializeCloudflareConfig } from "./cloudflare-config-Bktvwtpf.mjs";
3
- import { C as readWranglerPublishedTrafficSnapshot, j as writeWranglerPublishedTrafficSnapshot, k as updateWranglerCustomDomain, x as readWranglerCustomDomains } from "./wrangler-DhUerFkW.mjs";
4
- import { r as scanWranglerDotenvKeys } from "./dotenv-VQxupEUv.mjs";
5
- import { t as createCloudflareProcessRunner } from "./cloudflare-process-B-wekeR6.mjs";
6
- import { _ as resolvePinnedApiBaseUrl, g as provisionEnv, r as assertNoTransportRedirectInProjectDotenv, s as deleteEnvVarCaseAware } from "./provision-VeqAC77A.mjs";
2
+ import { i as persistCloudflareConfig, r as materializeCloudflareConfig } from "./cloudflare-config-BmhBv3HV.mjs";
3
+ import { A as updateWranglerCustomDomain, M as writeWranglerPublishedTrafficSnapshot, S as readWranglerCustomDomains, w as readWranglerPublishedTrafficSnapshot } from "./wrangler-D9KTuqnv.mjs";
4
+ import { n as scanWranglerDotenvKeys } from "./dotenv-BfU6eqFt.mjs";
5
+ import { t as createCloudflareProcessRunner } from "./cloudflare-process-2-TfIEzB.mjs";
6
+ import { _ as resolvePinnedApiBaseUrl, g as provisionEnv, r as assertNoTransportRedirectInProjectDotenv, s as deleteEnvVarCaseAware } from "./provision-BfaLiWbj.mjs";
7
7
  import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
8
8
  import { tmpdir } from "node:os";
9
9
  import { deployCloudflareVersionTraffic, encodeCloudflareVersionMessage, parseCloudflareVersionMessage, parseRootWranglerConfig, readBindingFieldPresence, readCloudflareTriggerConfig, readWranglerTopLevelString, resolveD1MigrateTarget, stabilizeCloudflareVersionTriggers } from "@void/deploy-cloudflare";
10
10
  //#region src/cli/cloudflare-operations.ts
11
11
  function resolveCloudflareOperationContext(root, runner) {
12
- const configPath = discoverRootWranglerConfig(root);
12
+ const configPath = materializeCloudflareConfig(root);
13
13
  if (!existsSync(configPath)) throw new Error(`No Cloudflare config found at "${configPath}". Run \`void init\` first.`);
14
14
  assertNoOperationConfigOverride(root);
15
15
  assertNoTransportRedirectInProjectDotenv(root);
@@ -197,14 +197,13 @@ async function activateCloudflareExistingVersion(context, target, current) {
197
197
  }
198
198
  const targetTriggerConfig = target.metadata.triggerConfig;
199
199
  const publishedTraffic = readWranglerPublishedTrafficSnapshot(context.configPath);
200
- const currentTriggerConfig = current?.metadata?.schema === 2 ? publishedTraffic ? {
200
+ const currentTriggerConfig = publishedTraffic ? {
201
201
  ...current.metadata.triggerConfig,
202
202
  ...publishedTraffic
203
- } : current.metadata.triggerConfig : void 0;
203
+ } : current.metadata.triggerConfig;
204
204
  const message = encodeCloudflareVersionMessage(target.metadata.migrations, targetTriggerConfig);
205
- const expectedVersionId = current?.id ?? await readActiveCloudflareVersionId(context);
206
205
  const ownerBeforeActivation = await readActiveCloudflareVersionId(context);
207
- if (ownerBeforeActivation !== expectedVersionId) throw new Error(`Cloudflare production changed from ${expectedVersionId ?? "no active version"} to ${ownerBeforeActivation ?? "no active version"} before rollback activation. Retry from fresh deployment status.`);
206
+ if (ownerBeforeActivation !== current.id) throw new Error(`Cloudflare production changed from ${current.id} to ${ownerBeforeActivation ?? "no active version"} before rollback activation. Retry from fresh deployment status.`);
208
207
  await run(context, {
209
208
  type: "versions.deploy",
210
209
  versions: [{
@@ -215,44 +214,32 @@ async function activateCloudflareExistingVersion(context, target, current) {
215
214
  workerName: context.workerName,
216
215
  message
217
216
  }, { capture: false });
218
- const knownTriggerConfigs = { [target.id]: targetTriggerConfig };
219
- if (currentTriggerConfig && current) knownTriggerConfigs[current.id] = currentTriggerConfig;
220
- const triggers = await stabilizeCloudflareVersionTriggers({
217
+ const knownTriggerConfigs = {
218
+ [target.id]: targetTriggerConfig,
219
+ [current.id]: currentTriggerConfig
220
+ };
221
+ const stabilizeTriggers = (targetVersionId, targetConfig, previousConfig) => stabilizeCloudflareVersionTriggers({
221
222
  runWrangler: context.runWrangler,
222
223
  workerName: context.workerName,
223
224
  configPath: context.configPath,
224
- targetVersionId: target.id,
225
- targetTriggerConfig,
226
- previousTriggerConfig: currentTriggerConfig,
225
+ targetVersionId,
226
+ targetTriggerConfig: targetConfig,
227
+ previousTriggerConfig: previousConfig,
227
228
  knownTriggerConfigs,
228
229
  publishEmptyCustomDomains: createCloudflareEmptyDomainPublisher(context),
229
230
  publishEmptyCrons: createCloudflareEmptyCronPublisher(context)
230
231
  });
232
+ const triggers = await stabilizeTriggers(target.id, targetTriggerConfig, currentTriggerConfig);
231
233
  if (triggers.ok && triggers.targetOwnsTraffic) {
232
- writeWranglerPublishedTrafficSnapshot(context.configPath, {
233
- workers_dev: targetTriggerConfig.workers_dev,
234
- preview_urls: targetTriggerConfig.preview_urls,
235
- routes: [...targetTriggerConfig.routes]
236
- });
234
+ recordPublishedTraffic(context.configPath, targetTriggerConfig);
237
235
  return;
238
236
  }
239
237
  if (triggers.ok) throw new Error(`Cloudflare rollback to ${target.id} was superseded by ${triggers.activeVersionId}; Void restored the active version's triggers. Refresh deployment status before retrying.`);
240
238
  if (triggers.activeVersionId && triggers.activeVersionId !== target.id) throw new Error(`Cloudflare rollback to ${target.id} was superseded by ${triggers.activeVersionId}, but Void could not restore that version's triggers (${triggers.reason}). Inspect the Worker immediately.`);
241
239
  if (!triggers.activeVersionId) throw new Error(`Cloudflare activated ${target.id}, but Void could not verify which version owns production while synchronizing triggers (${triggers.reason}). Inspect the Worker immediately.`);
242
- if (!currentTriggerConfig || !current) throw new Error(`Cloudflare activated version ${target.id}, but trigger synchronization failed and no prior trigger snapshot was available. Inspect the Worker immediately.`);
243
240
  const ownerBeforeCompensation = await readActiveCloudflareVersionId(context);
244
241
  if (ownerBeforeCompensation !== target.id) {
245
- const repair = await stabilizeCloudflareVersionTriggers({
246
- runWrangler: context.runWrangler,
247
- workerName: context.workerName,
248
- configPath: context.configPath,
249
- targetVersionId: target.id,
250
- targetTriggerConfig,
251
- previousTriggerConfig: currentTriggerConfig,
252
- knownTriggerConfigs,
253
- publishEmptyCustomDomains: createCloudflareEmptyDomainPublisher(context),
254
- publishEmptyCrons: createCloudflareEmptyCronPublisher(context)
255
- });
242
+ const repair = await stabilizeTriggers(target.id, targetTriggerConfig, currentTriggerConfig);
256
243
  throw new Error(repair.ok ? `Cloudflare rollback to ${target.id} was superseded by ${repair.activeVersionId}; Void restored the active version's triggers. Refresh deployment status before retrying.` : `Cloudflare rollback to ${target.id} was superseded by ${ownerBeforeCompensation ?? "an unknown version"}, but Void could not restore the active triggers (${repair.reason}). Inspect the Worker immediately.`);
257
244
  }
258
245
  let recoveryFailure = null;
@@ -267,24 +254,10 @@ async function activateCloudflareExistingVersion(context, target, current) {
267
254
  workerName: context.workerName,
268
255
  message: `Void automatic rollback after trigger synchronization failed.`
269
256
  }, { capture: false });
270
- const restoredTriggers = await stabilizeCloudflareVersionTriggers({
271
- runWrangler: context.runWrangler,
272
- workerName: context.workerName,
273
- configPath: context.configPath,
274
- targetVersionId: current.id,
275
- targetTriggerConfig: currentTriggerConfig,
276
- previousTriggerConfig: targetTriggerConfig,
277
- knownTriggerConfigs,
278
- publishEmptyCustomDomains: createCloudflareEmptyDomainPublisher(context),
279
- publishEmptyCrons: createCloudflareEmptyCronPublisher(context)
280
- });
257
+ const restoredTriggers = await stabilizeTriggers(current.id, currentTriggerConfig, targetTriggerConfig);
281
258
  if (!restoredTriggers.ok) recoveryFailure = "previous trigger synchronization failed";
282
259
  else if (!restoredTriggers.targetOwnsTraffic) recoveryFailure = `recovery was superseded by ${restoredTriggers.activeVersionId}`;
283
- else writeWranglerPublishedTrafficSnapshot(context.configPath, {
284
- workers_dev: currentTriggerConfig.workers_dev,
285
- preview_urls: currentTriggerConfig.preview_urls,
286
- routes: [...currentTriggerConfig.routes]
287
- });
260
+ else recordPublishedTraffic(context.configPath, currentTriggerConfig);
288
261
  } catch (error) {
289
262
  recoveryFailure = errorMessage(error);
290
263
  }
@@ -347,14 +320,17 @@ async function changeCloudflareDomain(root, hostname, action, runner, emptyDomai
347
320
  force: true
348
321
  });
349
322
  }
350
- const publishedTraffic = readCloudflareTriggerConfig(before.configPath);
351
- writeWranglerPublishedTrafficSnapshot(before.configPath, {
352
- workers_dev: publishedTraffic.workers_dev,
353
- preview_urls: publishedTraffic.preview_urls,
354
- routes: [...publishedTraffic.routes]
355
- });
323
+ recordPublishedTraffic(before.configPath, readCloudflareTriggerConfig(before.configPath));
356
324
  return update;
357
325
  }
326
+ /** Remember the traffic attachment Void just published for later rollback diffs. */
327
+ function recordPublishedTraffic(configPath, config) {
328
+ writeWranglerPublishedTrafficSnapshot(configPath, {
329
+ workers_dev: config.workers_dev,
330
+ preview_urls: config.preview_urls,
331
+ routes: [...config.routes]
332
+ });
333
+ }
358
334
  /**
359
335
  * Publish an explicit empty Custom Domain set through the pinned cf transport.
360
336
  * Trigger deploy omits empty domain sets; this operation must reconcile them
@@ -378,12 +354,7 @@ function createCloudflareEmptyDomainPublisher(context) {
378
354
  stderr: ""
379
355
  };
380
356
  } catch (error) {
381
- return {
382
- status: 1,
383
- stdout: "",
384
- stderr: errorMessage(error),
385
- error: errorMessage(error)
386
- };
357
+ return failedOperationResult(error);
387
358
  }
388
359
  };
389
360
  }
@@ -397,12 +368,7 @@ function createCloudflareEmptyCronPublisher(context) {
397
368
  workerName: context.workerName
398
369
  });
399
370
  } catch (error) {
400
- return {
401
- status: 1,
402
- stdout: "",
403
- stderr: errorMessage(error),
404
- error: errorMessage(error)
405
- };
371
+ return failedOperationResult(error);
406
372
  }
407
373
  };
408
374
  }
@@ -452,9 +418,6 @@ function createCloudflareOperationRunner(root, accountId, apiBaseUrl) {
452
418
  }
453
419
  });
454
420
  }
455
- function discoverRootWranglerConfig(root) {
456
- return materializeCloudflareConfig(root);
457
- }
458
421
  function assertNoOperationConfigOverride(root) {
459
422
  if (process.env.CLOUDFLARE_ENV?.trim()) throw new Error("CLOUDFLARE_ENV is set. Void Cloudflare operations target the top-level config only.");
460
423
  if (process.env.CLOUDFLARE_VITE_WRANGLER_CONFIG_PATH?.trim()) throw new Error("CLOUDFLARE_VITE_WRANGLER_CONFIG_PATH is set. Void Cloudflare operations use the root Wrangler config only.");
@@ -472,6 +435,14 @@ function parseJson(value, label) {
472
435
  if (value === void 0) throw new Error(label + " did not return structured data.");
473
436
  return value;
474
437
  }
438
+ function failedOperationResult(error) {
439
+ return {
440
+ status: 1,
441
+ stdout: "",
442
+ stderr: errorMessage(error),
443
+ error: errorMessage(error)
444
+ };
445
+ }
475
446
  function errorMessage(error) {
476
447
  return error instanceof Error ? error.message : String(error);
477
448
  }
@@ -1,6 +1,6 @@
1
1
  import { a as join, l as relative, n as dirname, u as resolve } from "./dist-BVqXeR_h.mjs";
2
2
  import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
3
- import { i as hasSsrEntry, r as getSsrServerEntryPath } from "./entry-CF5wvH4w.mjs";
3
+ import { i as hasSsrEntry, r as getSsrServerEntryPath } from "./entry-CMAkqBmU.mjs";
4
4
  import { i as readPackageJson, n as hasPackageDependency, t as getPackageDependencies } from "./package-json-DXfiT1jV.mjs";
5
5
  import { existsSync } from "node:fs";
6
6
  import { fileURLToPath } from "node:url";
@@ -274,14 +274,7 @@ function detectViteBinary(root) {
274
274
  function findBackendSources(root) {
275
275
  const paths = readProjectPaths(root);
276
276
  const found = [];
277
- for (const dir of [
278
- paths.routesDir,
279
- paths.pagesDir,
280
- paths.middlewareDir,
281
- paths.cronsDir,
282
- paths.queuesDir,
283
- paths.emailDir
284
- ]) if (existsSync(dir)) found.push(`${relative(root, dir)}/`);
277
+ for (const dir of backendDirs(paths)) if (existsSync(dir)) found.push(`${relative(root, dir)}/`);
285
278
  const ssrEntry = getSsrServerEntryPath(root, paths);
286
279
  if (ssrEntry) found.push(relative(root, ssrEntry));
287
280
  return found;
@@ -291,14 +284,17 @@ function findBackendSources(root) {
291
284
  */
292
285
  function hasBackendFiles(root) {
293
286
  const paths = readProjectPaths(root);
294
- if (existsSync(paths.routesDir)) return true;
295
- if (existsSync(paths.pagesDir)) return true;
296
- if (existsSync(paths.middlewareDir)) return true;
297
- if (existsSync(paths.cronsDir)) return true;
298
- if (existsSync(paths.queuesDir)) return true;
299
- if (existsSync(paths.emailDir)) return true;
300
- if (hasSsrEntry(root, paths)) return true;
301
- return false;
287
+ return backendDirs(paths).some((dir) => existsSync(dir)) || hasSsrEntry(root, paths);
288
+ }
289
+ function backendDirs(paths) {
290
+ return [
291
+ paths.routesDir,
292
+ paths.pagesDir,
293
+ paths.middlewareDir,
294
+ paths.cronsDir,
295
+ paths.queuesDir,
296
+ paths.emailDir
297
+ ];
302
298
  }
303
299
  //#endregion
304
300
  //#region src/cli/cloudflare-process.ts
@@ -343,6 +339,11 @@ function decodeCloudflareOperationResult(result) {
343
339
  };
344
340
  }
345
341
  }
342
+ /** Echo a decoded result to the terminal when the caller did not capture it. */
343
+ function writeUncapturedOperationOutput(result) {
344
+ if (result.stdout) process.stdout.write(result.stdout);
345
+ if (result.stderr) process.stderr.write(result.stderr);
346
+ }
346
347
  function createCloudflareProcessRunner(options) {
347
348
  const [command, ...prefix] = resolveCloudflareOperationArgv(options.root);
348
349
  return (operation, run) => {
@@ -379,12 +380,9 @@ function createCloudflareProcessRunner(options) {
379
380
  };
380
381
  if (streaming) return raw;
381
382
  const decoded = decodeCloudflareOperationResult(raw);
382
- if (!run.capture) {
383
- if (decoded.stdout) process.stdout.write(decoded.stdout);
384
- if (decoded.stderr) process.stderr.write(decoded.stderr);
385
- }
383
+ if (!run.capture) writeUncapturedOperationOutput(decoded);
386
384
  return decoded;
387
385
  };
388
386
  }
389
387
  //#endregion
390
- export { detectPreset as a, resolveCloudflareOperationArgv as c, FRAMEWORK_PRESETS as i, resolveProjectCommand as l, decodeCloudflareOperationResult as n, formatProjectCommand as o, encodeCloudflareOperation as r, hasBackendFiles as s, createCloudflareProcessRunner as t };
388
+ export { FRAMEWORK_PRESETS as a, hasBackendFiles as c, writeUncapturedOperationOutput as i, resolveCloudflareOperationArgv as l, decodeCloudflareOperationResult as n, detectPreset as o, encodeCloudflareOperation as r, formatProjectCommand as s, createCloudflareProcessRunner as t, resolveProjectCommand as u };
@@ -1,2 +1,2 @@
1
- import { m as readConfig, u as getDatabaseDialect } from "./config-Br_JZD6u.mjs";
1
+ import { m as readConfig, u as getDatabaseDialect } from "./config-DiowPT80.mjs";
2
2
  export { getDatabaseDialect, readConfig };
@@ -4,6 +4,7 @@ import { isSandboxRegistryImage } from "@void/deploy-core";
4
4
  //#region src/sandbox/config.ts
5
5
  const DEFAULT_SANDBOX_BINDING = "SANDBOX";
6
6
  const DEFAULT_SANDBOX_CLASS_NAME = "SandboxV1";
7
+ const DEFAULT_SANDBOX_CONTAINER_NAME = "void-sandbox-v1";
7
8
  const SANDBOX_MIGRATION_TAG = "void-sandbox-v2";
8
9
  function isSandboxEnabled(config) {
9
10
  return config.sandbox !== void 0 && config.sandbox !== false;
@@ -15,8 +16,7 @@ function getDefaultSandboxPlatformImage() {
15
16
  return "cloudflare/debian-trixie";
16
17
  }
17
18
  function isLocalSandboxImage(image) {
18
- const lowerImage = image.toLowerCase();
19
- return isAbsolute(image) || image.startsWith("./") || image.startsWith("../") || lowerImage === "dockerfile" || lowerImage.includes("dockerfile") || lowerImage.endsWith("/dockerfile") || lowerImage.endsWith("\\dockerfile");
19
+ return isAbsolute(image) || image.startsWith("./") || image.startsWith("../") || image.toLowerCase().includes("dockerfile");
20
20
  }
21
21
  function requiresSandboxPlatformImage(config) {
22
22
  if (typeof config.sandbox !== "object" || config.sandbox === null) return false;
@@ -32,7 +32,7 @@ function resolveSandboxConfig(config, root = process.cwd()) {
32
32
  return {
33
33
  binding: raw.binding ?? "SANDBOX",
34
34
  className: raw.className ?? "SandboxV1",
35
- containerName: raw.containerName ?? "void-sandbox-v1",
35
+ containerName: raw.containerName ?? DEFAULT_SANDBOX_CONTAINER_NAME,
36
36
  image: resolveSandboxImage(image, root),
37
37
  platformImage,
38
38
  ...imageBuildContext && { imageBuildContext: isAbsolute(imageBuildContext) ? imageBuildContext : join(root, imageBuildContext) },
@@ -0,0 +1,2 @@
1
+ import { n as writeDrizzleConfig, t as withPrivateDrizzleConfig } from "./config-CLYAosnQ.mjs";
2
+ export { withPrivateDrizzleConfig, writeDrizzleConfig };
@@ -0,0 +1,78 @@
1
+ import { a as join, l as relative } from "./dist-BVqXeR_h.mjs";
2
+ import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
3
+ import { n as schemaSpecifier, t as discoverSchema } from "./discover-CkCYv9T_.mjs";
4
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ //#region src/drizzle/config.ts
7
+ /**
8
+ * Write a temporary drizzle-kit config, by default to `.void/drizzle.config.json`.
9
+ * Schema and migration paths are relative to the project root: drizzle-kit
10
+ * resolves them against its working directory, and `void db` always runs it
11
+ * with `cwd` set to the project root, so the config file itself may live
12
+ * anywhere (see `outDir`).
13
+ *
14
+ * @param options.outDir Directory for the config file. When set, the file is
15
+ * written readable by the owner only.
16
+ * @returns Absolute path to the written config file.
17
+ */
18
+ function writeDrizzleConfig(root, dbPath, dialect = "sqlite", options) {
19
+ const paths = readProjectPaths(root);
20
+ const schema = discoverSchema(root, paths);
21
+ const schemaPaths = [...schema ? [schemaSpecifier(schema, root)] : [], ...(options?.additionalSchemas ?? []).map((path) => `./${relative(root, path)}`)];
22
+ if (schemaPaths.length === 0) throw new Error(`db: No Drizzle schema found. Create ${paths.sourceRelative("db/schema.ts")} or run \`void gen model <name>\`.`);
23
+ const outDir = options?.outDir ?? join(root, ".void");
24
+ mkdirSync(outDir, { recursive: true });
25
+ const config = {
26
+ dialect,
27
+ schema: schemaPaths.length === 1 ? schemaPaths[0] : schemaPaths,
28
+ out: `./${relative(root, paths.migrationsDir)}`,
29
+ migrations: { prefix: "timestamp" },
30
+ dbCredentials: { url: dbPath }
31
+ };
32
+ const configPath = join(outDir, "drizzle.config.json");
33
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n", options?.outDir ? { mode: 384 } : void 0);
34
+ return configPath;
35
+ }
36
+ /**
37
+ * Run `run` with a drizzle-kit config that holds a real database URL, kept
38
+ * out of the project directory (the dev server can serve files under it).
39
+ * The config lives in a private temp directory that is removed afterwards.
40
+ *
41
+ * Older CLI versions wrote such URLs to `.void/drizzle.config.json`; a
42
+ * file left there with one is removed first.
43
+ *
44
+ * A no-op SIGINT listener stays installed while `run` executes: Drizzle
45
+ * Studio is stopped with Ctrl-C, and without a listener Node would exit on
46
+ * the signal before `finally` removes the directory.
47
+ */
48
+ function withPrivateDrizzleConfig(root, dbUrl, dialect, run) {
49
+ removeProjectDrizzleConfigWithUrl(root);
50
+ const dir = mkdtempSync(join(tmpdir(), "void-drizzle-"));
51
+ const noop = () => {};
52
+ process.on("SIGINT", noop);
53
+ try {
54
+ return run(writeDrizzleConfig(root, dbUrl, dialect, { outDir: dir }));
55
+ } finally {
56
+ process.off("SIGINT", noop);
57
+ rmSync(dir, {
58
+ recursive: true,
59
+ force: true
60
+ });
61
+ }
62
+ }
63
+ /**
64
+ * The CLI now writes only local SQLite paths or placeholder URLs to
65
+ * `.void/drizzle.config.json`, so any other URL there is a real one.
66
+ */
67
+ function removeProjectDrizzleConfigWithUrl(root) {
68
+ const configPath = join(root, ".void", "drizzle.config.json");
69
+ let url;
70
+ try {
71
+ url = JSON.parse(readFileSync(configPath, "utf-8"))?.dbCredentials?.url;
72
+ } catch {
73
+ return;
74
+ }
75
+ if (typeof url === "string" && url.includes("://") && url !== "postgresql://dummy" && url !== "mysql://dummy") rmSync(configPath, { force: true });
76
+ }
77
+ //#endregion
78
+ export { writeDrizzleConfig as n, withPrivateDrizzleConfig as t };
@@ -1,6 +1,6 @@
1
1
  import "./types-CKWnYgfy.mjs";
2
2
  import { t as VoidAuthProvider } from "./providers-BNKRacMr.mjs";
3
- import { t as HeadConfig } from "./head-Do8P4puT.mjs";
3
+ import { t as HeadConfig } from "./head-C8K_iGe6.mjs";
4
4
  import "@void/deploy-core";
5
5
  import { RewriteDestination } from "void/routes";
6
6
  //#region src/sandbox/config.d.ts
@@ -1,6 +1,6 @@
1
1
  import { a as validateSourceDir, c as loadVoidConfig } from "./project-paths-GgcMozYz.mjs";
2
- import { i as isVoidAuthProvider, t as VOID_AUTH_PROVIDERS } from "./providers-CJlNS3kT.mjs";
3
- import { a as parseAddress, n as MimeError } from "./mime-D5Nmdzf7.mjs";
2
+ import { i as isVoidAuthProvider, t as VOID_AUTH_PROVIDERS } from "./providers-BXuhmuub.mjs";
3
+ import { a as parseAddress, n as MimeError } from "./mime-DxCznlJq.mjs";
4
4
  //#region src/config.ts
5
5
  const CONFIG_FILE = "void.json";
6
6
  const VALID_TARGETS = /* @__PURE__ */ new Set([
@@ -17,8 +17,8 @@ const VALID_APP_TYPES = /* @__PURE__ */ new Set([
17
17
  ]);
18
18
  const VALID_OUTPUTS = /* @__PURE__ */ new Set(["server", "static"]);
19
19
  /**
20
- * Accepted `routing.notFound` values. Source of truth for the framework, the
21
- * `AssetConfig.not_found_handling` field, and the schema.json enum.
20
+ * Accepted `routing.notFound` values. Keep in sync with the schema.json enum
21
+ * and `AssetConfig.not_found_handling` in `@void/deploy-core`.
22
22
  */
23
23
  const VALID_NOT_FOUND_HANDLING = /* @__PURE__ */ new Set([
24
24
  "single-page-application",
@@ -52,26 +52,22 @@ const VALID_SANDBOX_INSTANCE_TYPES = /* @__PURE__ */ new Set([
52
52
  * Count anonymous `*` wildcards in a pattern, ignoring the `*` that
53
53
  * terminates a `:name*` multi-segment named capture.
54
54
  *
55
- * Both the framework's emitted `__compilePattern` (router/compile.ts) and
56
- * dispatch's `compilePattern` (packages/dispatch/src/pattern.ts) emit a
57
- * distinct `(?<name>.*)` group for `:name*` and a `(?<splat>.*)` group for
58
- * the first bare `*` — those don't clash, so a pattern with both a named
59
- * multi-segment capture and a bare splat is legitimate and must validate.
60
- * Walking raw chars would over-count and cause `assertSingleSplat` to
61
- * reject such patterns.
55
+ * The shared `compilePattern` (`@void/edge`) emits a distinct `(?<name>.*)`
56
+ * group for `:name*` and a `(?<splat>.*)` group for the first bare `*` —
57
+ * those don't clash, so a pattern with both a named multi-segment capture and
58
+ * a bare splat is legitimate and must validate. Walking raw chars would
59
+ * over-count and cause `assertSingleSplat` to reject such patterns.
62
60
  *
63
- * The identifier character class matches `[A-Za-z0-9_]+` from both compilers.
61
+ * The identifier character class matches `compilePattern`'s `[A-Za-z0-9_]+`.
64
62
  */
65
63
  function countSplats(source) {
66
64
  return source.replace(/:[A-Za-z0-9_]+\*/g, "").match(/\*/g)?.length ?? 0;
67
65
  }
68
66
  /**
69
- * Reject a rule source containing more than one `*` wildcard. The dispatch
70
- * worker compiles each `*` into a `(?<splat>...)` named capture group; having
71
- * two of them in one pattern means `new RegExp()` throws at startup with a
72
- * cryptic "duplicate group name" error. Fail at config-read time with a
73
- * clear message instead. `kind` is a capitalised noun (e.g. "Redirect",
74
- * "Rewrite") used in the error text.
67
+ * Reject a rule source containing more than one anonymous `*` wildcard. Only
68
+ * the first `*` is captured (as `:splat`), so a second one is ambiguous.
69
+ * `kind` is a capitalised noun (e.g. "Redirect", "Rewrite") used in the error
70
+ * text.
75
71
  */
76
72
  function assertSingleSplat(source, kind) {
77
73
  const count = countSplats(source);
@@ -88,10 +84,9 @@ function assertSingleSplat(source, kind) {
88
84
  * 2. A `:splat` (named) token alongside a bare `*` — both compile to a
89
85
  * `(?<splat>...)` group.
90
86
  *
91
- * `assertSingleSplat` already prevents two bare `*`s clashing on the
92
- * implicit `splat` name. This complements it. The runtime emitter has a
93
- * try/catch defense-in-depth in `emitApplyRoutingRules`, but failing at
94
- * config-read with a precise message is friendlier than a CLI-log warn.
87
+ * The runtime skips a rule whose pattern fails to compile
88
+ * (`runtime/routing.ts`), but failing at config-read with a precise message
89
+ * is friendlier than a log warning.
95
90
  */
96
91
  function assertUniqueCaptureNames(source, kind) {
97
92
  const seen = /* @__PURE__ */ new Set();
@@ -114,10 +109,9 @@ function assertUniqueCaptureNames(source, kind) {
114
109
  * `//host/path` → `https://host/path`, which silently turns an intended
115
110
  * in-worker rewrite/redirect into a cross-origin proxy.
116
111
  *
117
- * Shared by the `void.json` validators below and the `_redirects` parser
118
- * (`cli/headers.ts`). The `c.rewrite()` codegen in `router/compile.ts`
119
- * inlines an equivalent check in emitted worker code — it validates
120
- * runtime user input rather than config, so it can't call through here.
112
+ * Shared by the config validators below and the `_redirects` parser
113
+ * (`cli/headers.ts`). `c.rewrite()` in `runtime/routing.ts` has an equivalent
114
+ * check for runtime input; it runs in the Worker and cannot import this module.
121
115
  */
122
116
  function isProtocolRelative(dest) {
123
117
  return dest.startsWith("//");
@@ -129,10 +123,10 @@ function assertNotProtocolRelative(dest, source, kind) {
129
123
  /**
130
124
  * Strict literal-hostname regex used by `parseHostPrefixedSource` to validate
131
125
  * the host portion of an `https://host/path` rule source. Mirrors
132
- * `LITERAL_HOSTNAME_REGEX` in `packages/api/src/routes/deploy.ts` and the
133
- * regex in `packages/api/src/routes/domains.ts`. Rejects scheme prefixes,
134
- * ports, paths, whitespace, control chars, wildcards, single-label hosts,
135
- * IPv4 literals, and userinfo. The host is lowercased before testing so the
126
+ * `LITERAL_HOSTNAME_REGEX` in `packages/deploy-core/src/validate.ts` and the
127
+ * regex in `platform/packages/api/src/routes/domains.ts`. Rejects scheme
128
+ * prefixes, ports, paths, whitespace, control chars, wildcards, single-label
129
+ * hosts, IPv4 literals, and userinfo. The host is lowercased before testing so the
136
130
  * same byte-exact form reaches dispatch (which compares against the
137
131
  * lowercase `url.hostname`).
138
132
  */
@@ -1,4 +1,4 @@
1
- import { t as VoidConfig } from "./config-BMHb8RCj.mjs";
1
+ import { t as VoidConfig } from "./config-CSa15FvD.mjs";
2
2
  //#region src/config-entry.d.ts
3
3
  /** Define a typed Void project configuration without loading the Vite plugin. */
4
4
  export declare function defineConfig<const T extends VoidConfig>(config: T): T;
@@ -1,8 +1,8 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
2
  import { o as TYPED_CONFIG_FILE, s as loadTypedVoidConfigFile } from "./project-paths-GgcMozYz.mjs";
3
- import { g as validateConfig } from "./config-Br_JZD6u.mjs";
3
+ import { g as validateConfig } from "./config-DiowPT80.mjs";
4
4
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
5
- import { parse } from "acorn";
5
+ import { parseSync } from "vite";
6
6
  //#region src/config-write.ts
7
7
  const GENERATED_MARKERS = [
8
8
  "// Generated by void migrate.",
@@ -26,18 +26,19 @@ function isStaticValue(node) {
26
26
  }
27
27
  function isGeneratedStaticConfig(source) {
28
28
  if (!GENERATED_MARKERS.some((marker) => source.startsWith(marker))) return false;
29
- const comments = [];
30
29
  let program;
31
30
  try {
32
- program = parse(source, {
33
- ecmaVersion: "latest",
31
+ const parsed = parseSync(TYPED_CONFIG_FILE, source, {
32
+ lang: "js",
34
33
  sourceType: "module",
35
- onComment: (_block, comment) => comments.push(comment.trim())
34
+ preserveParens: false,
35
+ showSemanticErrors: true
36
36
  });
37
+ if (parsed.errors.length > 0 || parsed.comments.length !== 1 || !GENERATED_MARKERS.includes(`// ${parsed.comments[0]?.value.trim()}`)) return false;
38
+ program = parsed.program;
37
39
  } catch {
38
40
  return false;
39
41
  }
40
- if (comments.length !== 1 || !GENERATED_MARKERS.includes(`// ${comments[0]}`)) return false;
41
42
  const [importDeclaration, exportDeclaration] = program.body ?? [];
42
43
  const call = exportDeclaration?.declaration;
43
44
  return program.body?.length === 2 && importDeclaration?.type === "ImportDeclaration" && importDeclaration.source?.value === "void/config" && importDeclaration.specifiers?.length === 1 && importDeclaration.specifiers[0]?.imported?.name === "defineConfig" && importDeclaration.specifiers[0]?.local?.name === "defineConfig" && exportDeclaration?.type === "ExportDefaultDeclaration" && call?.type === "CallExpression" && call.callee?.name === "defineConfig" && call.arguments?.length === 1 && isStaticValue(call.arguments[0]);
@@ -1,11 +1,12 @@
1
1
  import { c as normalizePlatformApiUrl, s as listPlatformConnections } from "./platform-registry-P387v42A.mjs";
2
2
  import { c as writePlatformSelection, n as readDeploymentPlatform, s as writeDeploymentPlatform } from "./project-DQstYTxO.mjs";
3
- import { d as readPlatformToken } from "./auth-D52yG7hl.mjs";
4
- import { K as select, L as log, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
5
- import { a as isExpiredTokenError, r as PlatformClient } from "./client-mC-dFGDD.mjs";
6
- import { t as promptForLoginToken } from "./login-DFuo-RWO.mjs";
7
- import { i as saveDiscoveredPlatform, n as promptPlatformUrl, t as discoverPlatform } from "./platform-cmd-DbKtQb_4.mjs";
8
- import { t as connectCloudflare } from "./cloudflare-connect-CuhRgk3k.mjs";
3
+ import { d as readPlatformToken } from "./auth-B5_tZLxT.mjs";
4
+ import { K as select, L as log, tt as isCancel } from "./dist-D3m88sjf.mjs";
5
+ import { d as printSuccess } from "./output-C50ag2r3.mjs";
6
+ import { a as isExpiredTokenError, r as PlatformClient } from "./client-C2Prx_Bi.mjs";
7
+ import { t as promptForLoginToken } from "./login-D-Q4xw3Q.mjs";
8
+ import { i as saveDiscoveredPlatform, n as promptPlatformUrl, t as discoverPlatform } from "./platform-cmd-B8-bCb7t.mjs";
9
+ import { t as connectCloudflare } from "./cloudflare-connect-2G3rL2rP.mjs";
9
10
  //#region src/cli/connect.ts
10
11
  async function selectVoidPlatform(interactive) {
11
12
  if (!interactive) throw new Error("connect: Supply a Void platform URL in non-interactive mode.");
@@ -35,7 +36,7 @@ async function authenticateConnection(root, discovery, interactive) {
35
36
  apiUrl: discovery.apiUrl,
36
37
  checkPlatformVersion: false
37
38
  }).whoami();
38
- log.success(`Authenticated with ${discovery.displayName}.`);
39
+ log.step(`Authenticated with ${discovery.displayName}.`);
39
40
  return;
40
41
  } catch (error) {
41
42
  if (!isExpiredTokenError(error)) throw error;
@@ -67,7 +68,7 @@ async function runConnectCommand(root, args, interactive = Boolean(process.stdin
67
68
  if (target === "cloudflare") {
68
69
  await connectCloudflare(root, interactive);
69
70
  writeDeploymentPlatform(root, "cloudflare");
70
- log.success("Connected to Cloudflare. Run `void deploy` to deploy this project.");
71
+ printSuccess("Connected to Cloudflare. Run `void deploy` to deploy this project.");
71
72
  return;
72
73
  }
73
74
  const discovery = await discoverPlatform(args.url || await selectVoidPlatform(interactive));
@@ -75,10 +76,10 @@ async function runConnectCommand(root, args, interactive = Boolean(process.stdin
75
76
  saveDiscoveredPlatform(discovery);
76
77
  const envUrl = process.env.VOID_API_URL;
77
78
  const selected = Boolean(envUrl && normalizePlatformApiUrl(envUrl) !== discovery.apiUrl) ? false : writePlatformSelection(root, discovery);
78
- log.success(`Connected to ${discovery.displayName} at ${discovery.apiUrl}.`);
79
79
  if (!selected) log.info("Saved the connection. The current project link or environment still selects its existing destination.");
80
80
  if (args.noLogin) log.info("Connection saved without login. Run `void account login` in a project using this platform when ready.");
81
81
  else if (selected) log.info("Run `void project link` to select a project, then `void deploy`.");
82
+ printSuccess(`Connected to ${discovery.displayName} at ${discovery.apiUrl}.`);
82
83
  }
83
84
  //#endregion
84
85
  export { runConnectCommand };
@@ -1,10 +1,10 @@
1
1
  import { l as writeProjectConfig, t as attachSelectedPlatform } from "./project-DQstYTxO.mjs";
2
- import { s as getSiteDomain } from "./auth-D52yG7hl.mjs";
3
- import { A as confirm, K as select, L as log, O as cancel, X as text, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
4
- import { n as PlatformApiError } from "./client-mC-dFGDD.mjs";
5
- import { c as import_picocolors, u as sanitizeTerminalText } from "./output-BvdaehtE.mjs";
2
+ import { s as getSiteDomain } from "./auth-B5_tZLxT.mjs";
3
+ import { A as confirm, K as select, L as log, O as cancel, X as text, tt as isCancel } from "./dist-D3m88sjf.mjs";
4
+ import { f as sanitizeTerminalText, l as import_picocolors } from "./output-C50ag2r3.mjs";
5
+ import { n as PlatformApiError } from "./client-C2Prx_Bi.mjs";
6
6
  import { t as validateProjectSlug } from "./project-slug-23TpquG4.mjs";
7
- import { n as inferDefaultSlug } from "./resolve-project-BG5ORGID.mjs";
7
+ import { n as inferDefaultSlug } from "./resolve-project-CP8rZs_p.mjs";
8
8
  //#region src/cli/prompt.ts
9
9
  async function promptProjectSetupAction(message = "Set up a Void project:", options = {}) {
10
10
  const result = await select({
@@ -86,7 +86,7 @@ async function createProjectWithSlugRetry(client, initialDefaultSlug, promptSlug
86
86
  try {
87
87
  log.step(`Creating project ${import_picocolors.default.blue(slug)}...`);
88
88
  const project = await client.createProject(slug);
89
- log.success(`Project created: ${import_picocolors.default.blue(project.slug)}`);
89
+ log.step(`Project created: ${import_picocolors.default.blue(project.slug)}`);
90
90
  reportProjectCreationWarnings(project);
91
91
  return project;
92
92
  } catch (error) {
@@ -1,2 +1,2 @@
1
- import { t as createProjectWithSlugRetry } from "./create-project-B2kk9Q0o.mjs";
1
+ import { t as createProjectWithSlugRetry } from "./create-project-DxiyW6iX.mjs";
2
2
  export { createProjectWithSlugRetry };