void 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/README.md +1 -1
  2. package/dist/{account-cmd-HP8bixYo.mjs → account-cmd-ChVKPZ-w.mjs} +7 -8
  3. package/dist/{action-key-XZ9HkWAO.mjs → action-key-XtKKbbsi.mjs} +1 -2
  4. package/dist/{agents-CuNtT0D_.mjs → agents-DRo8gzni.mjs} +2 -3
  5. package/dist/{application-analysis-DDOQwiXk.mjs → application-analysis-2vGZrKzg.mjs} +18 -24
  6. package/dist/{application-routing-4719u_kf.mjs → application-routing-DnUQoOJD.mjs} +2 -3
  7. package/dist/{ast-CsZ_q_gc.mjs → ast-Cv0JwXqb.mjs} +1 -2
  8. package/dist/{ast-bindings-C3yaPs1y.mjs → ast-bindings-BkivMJIo.mjs} +6 -11
  9. package/dist/{atomic-write-Dq6R0BPN.mjs → atomic-write-DA6eD1Kp.mjs} +1 -2
  10. package/dist/{auth-g2TQbDLD.d.mts → auth-CH4PLAX1.d.mts} +0 -2
  11. package/dist/{auth-Cbqi1iVX.mjs → auth-CL-p_rqV.mjs} +1 -1
  12. package/dist/{auth-B6iOCjKI.mjs → auth-Dy8svcqQ.mjs} +6 -7
  13. package/dist/{auth-3sGB0zJ1.mjs → auth-YVjBX5NY.mjs} +1 -2
  14. package/dist/{auth-client-Bawdj38n.d.mts → auth-client-6-Ft9i9T.d.mts} +0 -2
  15. package/dist/{auth-client-BWBT8HLp.mjs → auth-client-DwCdwKbw.mjs} +1 -2
  16. package/dist/{auth-client-react-CMLwT2xI.mjs → auth-client-react-CJdeErvM.mjs} +1 -2
  17. package/dist/{auth-client-react-7GFffu8R.d.mts → auth-client-react-DvQLe5Zb.d.mts} +0 -2
  18. package/dist/{auth-client-solid-UoreJWZG.mjs → auth-client-solid-BRvgvp6h.mjs} +1 -2
  19. package/dist/{auth-client-solid-DyTFL4cq.d.mts → auth-client-solid-P9pEtKGp.d.mts} +0 -2
  20. package/dist/{auth-client-svelte-zetW0KIH.d.mts → auth-client-svelte-B5j8irT6.d.mts} +0 -2
  21. package/dist/{auth-client-svelte-Cv_WvrRk.mjs → auth-client-svelte-BSqUCEed.mjs} +1 -2
  22. package/dist/{auth-client-vue-bChShbQP.d.mts → auth-client-vue-BEiAfavk.d.mts} +0 -2
  23. package/dist/{auth-client-vue-CFk7Xbv3.mjs → auth-client-vue-CPkbRtOO.mjs} +1 -2
  24. package/dist/{auth-link-CedYpDCy.mjs → auth-link-D4uMdOsw.mjs} +7 -8
  25. package/dist/{auth-migrations-BO27GDNr.mjs → auth-migrations-DDeifS3v.mjs} +1 -2
  26. package/dist/{auth-router-vafo7x8w.mjs → auth-router-62dna450.mjs} +6 -7
  27. package/dist/{base64-DVrOndmI.mjs → base64-ikl9yBy3.mjs} +1 -2
  28. package/dist/{better-auth-shared-BHB8kiTE.d.mts → better-auth-shared-BJyG2mH0.d.mts} +2 -6
  29. package/dist/{better-auth-shared-7FM3Uk2N.mjs → better-auth-shared-CiclgPde.mjs} +4 -5
  30. package/dist/{build-cmd-9vUAQ1_V.mjs → build-cmd-D93K_4Sa.mjs} +7 -8
  31. package/dist/{cache-jvwLNb0h.mjs → cache-CiIzEED4.mjs} +7 -8
  32. package/dist/{cancel-deploy-Dw0UmWKO.mjs → cancel-deploy-BNoGfn2e.mjs} +6 -7
  33. package/dist/{cf-access-CWP4avfP.mjs → cf-access-BmBT2h8_.mjs} +3 -4
  34. package/dist/{cf-access-BM9G0lhO.mjs → cf-access-pejlJmuy.mjs} +1 -2
  35. package/dist/{cf-build-output-XpNR9zoh.mjs → cf-build-output-B1C8U83u.mjs} +41 -314
  36. package/dist/cf-build-output-CmDOcA7K.mjs +1 -0
  37. package/dist/{cf-command-values-ByHk0xg4.mjs → cf-command-values-Ccl-zRhl.mjs} +10 -7
  38. package/dist/cf-config-migrate-Dy8MrKgF.mjs +326 -0
  39. package/dist/{cf-worker-settings-Dg27RzyT.mjs → cf-worker-settings-CARs4Wy9.mjs} +3 -5
  40. package/dist/cli/cli.mjs +66 -76
  41. package/dist/cli/cloudflare-operation-process.mjs +14 -18
  42. package/dist/cli/env-schema-probe.d.mts +1 -5
  43. package/dist/cli/env-schema-probe.mjs +4 -5
  44. package/dist/client-DVtAKeUm.mjs +1 -0
  45. package/dist/{client-B3LnB_bE.mjs → client-Qayy9xEh.mjs} +10 -12
  46. package/dist/{cloudflare-auth-DyD_kVFr.mjs → cloudflare-auth-CEu-1Ps_.mjs} +2 -3
  47. package/dist/{cloudflare-cmd-D-b_u3T4.mjs → cloudflare-cmd-DiFGaLow.mjs} +7 -8
  48. package/dist/{cloudflare-config-CH1AylZT.mjs → cloudflare-config-Chet188_.mjs} +22 -17
  49. package/dist/{cloudflare-connect-zTJh8UnN.mjs → cloudflare-connect-BdgAQBc7.mjs} +5 -6
  50. package/dist/{cloudflare-operations-Bc-7fN44.mjs → cloudflare-operations-CWA24vCh.mjs} +8 -9
  51. package/dist/{cloudflare-operations-BtulCNOg.mjs → cloudflare-operations-D8MoezuN.mjs} +1 -1
  52. package/dist/{cloudflare-process-8jEYIeim.mjs → cloudflare-process-DjJ638A-.mjs} +7 -9
  53. package/dist/{cloudflare-user-output-Q-k0QoNQ.mjs → cloudflare-user-output-zEwuGrEJ.mjs} +1 -2
  54. package/dist/collect-8i0wU63d.mjs +1 -0
  55. package/dist/{collect-Dew86qce.mjs → collect-C6Blu9yw.mjs} +2 -3
  56. package/dist/{config-BV2ASlpn.mjs → config-BszFVhpk.mjs} +1 -1
  57. package/dist/{config-tqMM6DwY.mjs → config-Bt4rw93x.mjs} +5 -6
  58. package/dist/{config-CAdZVTLN.d.mts → config-CzsNzGVH.d.mts} +2 -6
  59. package/dist/{config-OFOAimzt.mjs → config-DkA9jYF2.mjs} +4 -5
  60. package/dist/{config-D-6q7EBH.mjs → config-WlvEcL82.mjs} +3 -4
  61. package/dist/config-entry.d.mts +1 -3
  62. package/dist/config-entry.mjs +1 -2
  63. package/dist/{connect-BOM6zvFX.mjs → connect-b9mJbb6X.mjs} +10 -11
  64. package/dist/{create-project-Bxd02EHN.mjs → create-project-eomwm0wa.mjs} +9 -11
  65. package/dist/{create-project-C2K0DN2O.mjs → create-project-rnjum4_V.mjs} +1 -1
  66. package/dist/{database-provider-Cx525bwX.mjs → database-provider-DkZo4VwN.mjs} +1 -2
  67. package/dist/database-provider.d.mts +1 -3
  68. package/dist/database-provider.mjs +1 -1
  69. package/dist/{db-Cdvr3zwG.mjs → db-UPWmiSk1.mjs} +52 -54
  70. package/dist/{db-types-0eCiqYb1.mjs → db-types-C_8amnB0.mjs} +3 -4
  71. package/dist/{delete-lETE6Tpt.mjs → delete-BeeYi1WO.mjs} +7 -8
  72. package/dist/deploy-CfU7CR-b.mjs +2 -0
  73. package/dist/{deploy-CdM-LAxX.mjs → deploy-CwmCcTlq.mjs} +83 -112
  74. package/dist/{deploy-managed-static-DjeBFG2c.mjs → deploy-managed-static-gPDxyp3v.mjs} +33 -40
  75. package/dist/{deploy-transport-DIq_gFTP.mjs → deploy-transport-L6zzPE9T.mjs} +6 -7
  76. package/dist/deploy.d.mts +1 -3
  77. package/dist/deploy.mjs +10 -11
  78. package/dist/{dev-inbox-D0jxye_D.mjs → dev-inbox-CwH5VuZj.mjs} +3 -4
  79. package/dist/discover-D4mQthao.mjs +1 -0
  80. package/dist/{discover-LaV0tbIu.mjs → discover-Dhkzxgdt.mjs} +3 -4
  81. package/dist/{dispatch-CLa2LThw.mjs → dispatch-CiJ1Xrba.mjs} +12 -15
  82. package/dist/{dist-Cegxq8gs.mjs → dist-B6eN80gc.mjs} +199 -118
  83. package/dist/{dist-D15hFhP0.mjs → dist-BWNkVq50.mjs} +8 -15
  84. package/dist/{dist-Cor9XGoz.mjs → dist-D23AAMxT.mjs} +9 -16
  85. package/dist/{dist-ipQi0Q8y.mjs → dist-DMYe8CZJ.mjs} +1 -2
  86. package/dist/{dist-B1PLt4_8.mjs → dist-eV_Ep60B.mjs} +1 -1
  87. package/dist/{domain-DyhNtdYf.mjs → domain-3xdH9p2L.mjs} +8 -9
  88. package/dist/{dotenv-CNazY3-w.mjs → dotenv-CEI8hapP.mjs} +1 -2
  89. package/dist/{drizzle-9TubSZvI.mjs → drizzle-C8MPqt5m.mjs} +1 -1
  90. package/dist/{drizzle-BQfyvQKX.mjs → drizzle-lFdzSEa9.mjs} +2 -3
  91. package/dist/{email-B9ayYQEG.mjs → email-BHY72ixO.mjs} +3 -4
  92. package/dist/{email-DM2wDcBN.mjs → email-Du3YRnM5.mjs} +14 -15
  93. package/dist/{email-cloudflare-PMbAev9Q.mjs → email-cloudflare-CtD8qE13.mjs} +18 -21
  94. package/dist/{email-protocol-D9nTvhCp.mjs → email-protocol-DTs_TjCS.mjs} +1 -2
  95. package/dist/{entry-BEM8ZuGP.mjs → entry-CBZsCy3O.mjs} +5 -6
  96. package/dist/{env-78hbN-oI.mjs → env-Cnvp0pGy.mjs} +10 -11
  97. package/dist/{env-BaMz0j7H.mjs → env-CuzZZyjB.mjs} +3 -4
  98. package/dist/{env-0jrMQJI_.mjs → env-DtKg5G26.mjs} +2 -3
  99. package/dist/{env-helpers--wFmQ_5Q.mjs → env-helpers-Dj_SIwPu.mjs} +1 -2
  100. package/dist/{env-helpers-CyKtOBpj.d.mts → env-helpers-U56xuFgL.d.mts} +1 -3
  101. package/dist/{env-public-6lqiSD2b.d.mts → env-public-CeNeO_AT.d.mts} +2 -4
  102. package/dist/{env-raw-D74P4ebM.mjs → env-raw-e8qgqAzQ.mjs} +1 -2
  103. package/dist/{env-types-BicfKBhV.mjs → env-types-DqzVBKnS.mjs} +4 -5
  104. package/dist/{env-validation-BUfFZ6bt.mjs → env-validation-C8Cmvas0.mjs} +1 -1
  105. package/dist/{env-validation-B3VobvXm.mjs → env-validation-GV1oD4EV.mjs} +9 -10
  106. package/dist/{error-pages-CLIJ7aYq.mjs → error-pages-COVBnzK7.mjs} +6 -12
  107. package/dist/{fetch-CUX0tB78.d.mts → fetch-B-gLGYVl.d.mts} +0 -4
  108. package/dist/{fetch-CtESUYWd.mjs → fetch-C8yhLoF3.mjs} +3 -4
  109. package/dist/{fetch-error-Bw0n-IY-.mjs → fetch-error-DmlRM6e4.mjs} +2 -4
  110. package/dist/{fetch-stream-BspOeTAI.mjs → fetch-stream-DafNtVJC.mjs} +4 -5
  111. package/dist/{fetch-stream-DfkAzZf-.d.mts → fetch-stream-DuwxWmBM.d.mts} +1 -3
  112. package/dist/{gen-CFmsUsW1.mjs → gen-BvVmpZ5f.mjs} +12 -13
  113. package/dist/gen-i61rdQgg.mjs +1 -0
  114. package/dist/{generate-DkEb9rL-.mjs → generate-BOp1g1H_.mjs} +1 -1
  115. package/dist/{generate-B1m4Cm4n.mjs → generate-CWb8aOsm.mjs} +4 -5
  116. package/dist/{generated-wrangler-config-DeWj5F9Y.mjs → generated-wrangler-config-CoDaaFsA.mjs} +1 -2
  117. package/dist/{git-metadata-D-gurjzG.mjs → git-metadata-Cukp5kV5.mjs} +1 -2
  118. package/dist/{github-cmd-De-_IWbM.mjs → github-cmd-X2GKiLi-.mjs} +8 -9
  119. package/dist/{handler-BHktmuTL.d.mts → handler-Drm_lyrV.d.mts} +13 -26
  120. package/dist/{handler-BZ1t7-Rv.mjs → handler-xmzz0U38.mjs} +4 -5
  121. package/dist/{head-D2VF4ApL.mjs → head-5XPcnG-j.mjs} +1 -2
  122. package/dist/{head-C8K_iGe6.d.mts → head-MeF_5M_3.d.mts} +0 -2
  123. package/dist/{headers--vaK_chu.mjs → headers-DEUBAM6W.mjs} +4 -5
  124. package/dist/help-BcZDUcTw.mjs +1 -0
  125. package/dist/{help-CKbrhZha.mjs → help-EWDNxST-.mjs} +19 -11
  126. package/dist/{inbound-VrOLqwZY.mjs → inbound-DQfekMtz.mjs} +5 -6
  127. package/dist/{inbound-Da7XsjH3.d.mts → inbound-DSKSHDUj.d.mts} +0 -4
  128. package/dist/index.d.mts +23 -13
  129. package/dist/index.mjs +452 -208
  130. package/dist/{info-Yg0-V5Rs.mjs → info-jW8_d3VI.mjs} +6 -7
  131. package/dist/{init-CDiJQycf.mjs → init-jDQ5G9QC.mjs} +42 -59
  132. package/dist/{isr-config-fZaJJ8t7.mjs → isr-config-DhBkzCdY.mjs} +5 -9
  133. package/dist/{limits-D0vD1M9A.mjs → limits-CrHLm5Tk.mjs} +1 -2
  134. package/dist/{limits-CFsDKQvU.d.mts → limits-_xIf5z_P.d.mts} +0 -2
  135. package/dist/{link-Dllip08S.mjs → link-DOyxX5Xs.mjs} +8 -9
  136. package/dist/{list-BYRP6am0.mjs → list-C9pTYDtl.mjs} +8 -9
  137. package/dist/{live-BllfDuzA.d.mts → live-CDBHyYiR.d.mts} +2 -4
  138. package/dist/{live-BcHoTDFe.mjs → live-DF4HUl2m.mjs} +5 -7
  139. package/dist/{load-user-env-DD5qveNU.mjs → load-user-env-CSwdofj0.mjs} +1 -2
  140. package/dist/{local-d1-CAwAs9GH.mjs → local-d1-CKfek6Z4.mjs} +4 -5
  141. package/dist/{log-BMwmN5Ae.mjs → log-D9hwSySP.mjs} +3 -4
  142. package/dist/login-C0MiQrYs.mjs +1 -0
  143. package/dist/{login-PcFy5mlC.mjs → login-koQbjzPd.mjs} +6 -7
  144. package/dist/{logs-DmJTBhed.mjs → logs-cTU5TsRW.mjs} +8 -9
  145. package/dist/migrate-BG09-KOv.mjs +1 -0
  146. package/dist/{migrate-B8S2xTcb.mjs → migrate-C62pGTfr.mjs} +20 -16
  147. package/dist/{migration-handler-CwlEQUoo.d.mts → migration-handler-D8mDx3Ew.d.mts} +0 -4
  148. package/dist/{migration-handler-Cg0Y4EPu.mjs → migration-handler-DCehTlWs.mjs} +1 -2
  149. package/dist/{mime-BAyHPskU.mjs → mime-DKkO7ZtA.mjs} +2 -3
  150. package/dist/{mysql-migration-sql-BIS5vbNk.mjs → mysql-migration-sql-CI9VTwjt.mjs} +3 -5
  151. package/dist/{neon-DTZr7Bu7.mjs → neon-CJzQSycr.mjs} +2 -3
  152. package/dist/nitro.d.mts +0 -2
  153. package/dist/nitro.mjs +5 -6
  154. package/dist/{node-CDOPrGSl.mjs → node-BfAt2rz8.mjs} +8 -9
  155. package/dist/{operator-args-BsJIYXaT.mjs → operator-args-D79WQP70.mjs} +2 -3
  156. package/dist/{operator-auth-Cr2zCc-J.mjs → operator-auth-CfDcmzpo.mjs} +2 -3
  157. package/dist/{operator-client-C-ROjk1I.mjs → operator-client-BIY4-N_6.mjs} +3 -4
  158. package/dist/operator-cmd-BhHXIL2G.mjs +1 -0
  159. package/dist/{operator-cmd-DmkmS2wL.mjs → operator-cmd-CnAvSqJ5.mjs} +8 -9
  160. package/dist/{output-BpgYODYx.mjs → output-BCdLioKP.mjs} +4 -5
  161. package/dist/output-E6gecbbV.mjs +1 -0
  162. package/dist/{package-json-BjYqR-So.mjs → package-json-DvS6IFRv.mjs} +2 -3
  163. package/dist/pages/client.d.mts +9 -25
  164. package/dist/pages/client.mjs +28 -33
  165. package/dist/pages/head.d.mts +1 -1
  166. package/dist/pages/head.mjs +1 -1
  167. package/dist/pages/index.d.mts +4 -16
  168. package/dist/pages/index.mjs +9 -11
  169. package/dist/pages/islands-plugin.d.mts +29 -11
  170. package/dist/pages/islands-plugin.mjs +3 -4
  171. package/dist/pages/prefetch.d.mts +1 -1
  172. package/dist/pages/prefetch.mjs +1 -1
  173. package/dist/pages/protocol.d.mts +2 -2
  174. package/dist/pages/protocol.mjs +2 -2
  175. package/dist/pages/serialize.d.mts +1 -1
  176. package/dist/pages/serialize.mjs +1 -1
  177. package/dist/{pg-J2HbZIkX.mjs → pg-DoyPxa_X.mjs} +1 -2
  178. package/dist/{picocolors-BsDfhxIw.mjs → picocolors-D1NxSLw-.mjs} +2 -3
  179. package/dist/{plan-BhLO2p4w.mjs → plan-BOD70XGS.mjs} +1 -2
  180. package/dist/plan-CQ-N4gws.mjs +1 -0
  181. package/dist/{platform-args-BMD2gjc_.mjs → platform-args-Bv9hoLEL.mjs} +4 -7
  182. package/dist/platform-args-C1kqYUen.mjs +1 -0
  183. package/dist/{platform-auth-config-CImnfohz.mjs → platform-auth-config-CLj0EvnB.mjs} +10 -11
  184. package/dist/{platform-auth-protection-BogLhtHi.mjs → platform-auth-protection-DQDSxVhr.mjs} +10 -11
  185. package/dist/{platform-auth-recovery-B-mEaWEi.mjs → platform-auth-recovery-DD3oLerq.mjs} +9 -11
  186. package/dist/{platform-cmd-DZK2ixMl.mjs → platform-cmd-PLNLg-2N.mjs} +12 -13
  187. package/dist/{platform-cmd-CV8NxIIn.mjs → platform-cmd-WnOmdLzR.mjs} +1 -1
  188. package/dist/{platform-discovery-CHhNs8Nn.mjs → platform-discovery-B0eZjZ3B.mjs} +2 -3
  189. package/dist/{platform-domain-CRvelPGE.mjs → platform-domain-Bnq0vg0q.mjs} +7 -8
  190. package/dist/{platform-lifecycle-CPYY7E9B.mjs → platform-lifecycle-BCsFg1Tl.mjs} +53 -88
  191. package/dist/{platform-lifecycle-DwXq7kZt.mjs → platform-lifecycle-BQiN9HN5.mjs} +1 -1
  192. package/dist/{platform-management-lXdgGgAM.mjs → platform-management-CMJR8Zi-.mjs} +1 -1
  193. package/dist/{platform-management-BOnGbMSM.mjs → platform-management-nzCDwtiN.mjs} +7 -9
  194. package/dist/{platform-plans-config-CeydDSj0.mjs → platform-plans-config-Dx1agneU.mjs} +5 -6
  195. package/dist/{platform-recovery-noaALXnE.mjs → platform-recovery-DBNoME3I.mjs} +5 -6
  196. package/dist/{platform-registry-B9mWX9LO.mjs → platform-registry-DZ_2Xuqd.mjs} +4 -6
  197. package/dist/{platform-setup-Ca53gtt0.mjs → platform-setup-VEcHu0Vq.mjs} +4 -5
  198. package/dist/{plugin-inference-CeiB6BG5.mjs → plugin-inference-DmwjC3y2.mjs} +16 -24
  199. package/dist/{prefetch-Ce6la4EI.d.mts → prefetch-CG0K6JPd.d.mts} +0 -2
  200. package/dist/{prefetch-Bsc_Pb6c.mjs → prefetch-L93_1Jk7.mjs} +1 -2
  201. package/dist/prepare-BJMmfq3W.mjs +1 -0
  202. package/dist/{prepare-BuOS18AM.mjs → prepare-BPsfLWaW.mjs} +4 -5
  203. package/dist/{prepare-D604Yiyr.mjs → prepare-pfl2LIMy.mjs} +12 -13
  204. package/dist/{prerender-render-CaShbHJ3.mjs → prerender-render-RlAj6hh8.mjs} +2 -3
  205. package/dist/prerender-render.d.mts +1 -3
  206. package/dist/prerender-render.mjs +1 -1
  207. package/dist/{project-rqDnVsJN.mjs → project-CLwxcEdq.mjs} +3 -4
  208. package/dist/{project-zdB3fs9G.mjs → project-DVsTAWFh.mjs} +1 -1
  209. package/dist/{project-cmd-DBYqAIbe.mjs → project-cmd-5Izu4Pg3.mjs} +21 -23
  210. package/dist/{project-paths-DGu_QZ_Q.mjs → project-paths-CdGv9Tmi.mjs} +3 -5
  211. package/dist/project-slug-BUy0lmyR.mjs +1 -0
  212. package/dist/{project-slug-23TpquG4.mjs → project-slug-CO6ci9XG.mjs} +0 -1
  213. package/dist/{project-team-BjCLgTRC.mjs → project-team-DSUyjZFh.mjs} +7 -8
  214. package/dist/{project-token-BB6PwaA9.mjs → project-token-wj09YQSB.mjs} +7 -8
  215. package/dist/{project-tsconfig-CVvk6Z_e.mjs → project-tsconfig-Cf2NFjlM.mjs} +4 -6
  216. package/dist/{project-zero-trust-CWDh1P_t.mjs → project-zero-trust-BMHf2YF0.mjs} +7 -8
  217. package/dist/{protocol-DimNxVRr.mjs → protocol-0-lp9ZYx.mjs} +6 -7
  218. package/dist/{protocol-D5XDySYu.d.mts → protocol-xdrl-In0.d.mts} +3 -5
  219. package/dist/{providers-BNKRacMr.d.mts → providers-D5P8j_8D.d.mts} +0 -2
  220. package/dist/{providers-BUHwJlmM.mjs → providers-ZARwX2cL.mjs} +1 -2
  221. package/dist/{provision-DztLJ97X.mjs → provision-CRiNnlfE.mjs} +6 -7
  222. package/dist/{provision-DfxLCg-d.mjs → provision-CxHIGBIZ.mjs} +1 -1
  223. package/dist/{queues-BWKt1Xo4.d.mts → queues-DdM42xXW.d.mts} +0 -2
  224. package/dist/{r2-conditions-B8xUgJRc.mjs → r2-conditions-BqkQNt2n.mjs} +1 -2
  225. package/dist/{requests-D_pbzDyz.mjs → requests-DicgB5jU.mjs} +6 -7
  226. package/dist/resolve-project-CgfjtOwz.mjs +1 -0
  227. package/dist/{resolve-project-Xoi6eTWY.mjs → resolve-project-D0YNnJfm.mjs} +4 -5
  228. package/dist/{resource-name-C7LVpcRm.mjs → resource-name-DlJ9QXzg.mjs} +1 -2
  229. package/dist/{response-Tn7rU0MV.mjs → response-HmNjB30w.mjs} +1 -2
  230. package/dist/{rollback-CjfIYsJx.mjs → rollback-DrDZOKNE.mjs} +7 -8
  231. package/dist/{rolldown-runtime-3h0WiCiA.mjs → rolldown-runtime-uD8oG6U2.mjs} +1 -2
  232. package/dist/{route-types-DvEGmPif.mjs → route-types-irZc1txT.mjs} +43 -8
  233. package/dist/route-url-BGOiyKNz.d.mts +24 -0
  234. package/dist/route-url-CRDF-I0I.mjs +57 -0
  235. package/dist/routes-stub.d.mts +4 -3
  236. package/dist/routes-stub.mjs +1 -1
  237. package/dist/{routing-assets-DdSFxoLp.mjs → routing-assets-DJIVOrCh.mjs} +1 -2
  238. package/dist/{runner-3uGC-oLF.mjs → runner-5MCSimKx.mjs} +5 -6
  239. package/dist/{runner-WCdfeI0q.mjs → runner-QMeOpScZ.mjs} +1 -1
  240. package/dist/{runner-mysql-BcHnLUuM.mjs → runner-mysql-0zVmB1JW.mjs} +1 -1
  241. package/dist/{runner-mysql-BWmbk5IE.mjs → runner-mysql-Bdmsp_x4.mjs} +3 -4
  242. package/dist/{runner-pg-Cgp-cr_p.mjs → runner-pg-2pjltt0t.mjs} +1 -1
  243. package/dist/{runner-pg-Cr3qrqi4.mjs → runner-pg-mYc75KfH.mjs} +2 -3
  244. package/dist/runtime/ai.d.mts +0 -4
  245. package/dist/runtime/ai.mjs +6 -8
  246. package/dist/runtime/auth-client-react.d.mts +1 -1
  247. package/dist/runtime/auth-client-react.mjs +1 -1
  248. package/dist/runtime/auth-client-solid.d.mts +1 -1
  249. package/dist/runtime/auth-client-solid.mjs +1 -1
  250. package/dist/runtime/auth-client-svelte.d.mts +1 -1
  251. package/dist/runtime/auth-client-svelte.mjs +1 -1
  252. package/dist/runtime/auth-client-vue.d.mts +1 -1
  253. package/dist/runtime/auth-client-vue.mjs +1 -1
  254. package/dist/runtime/auth-client.d.mts +1 -1
  255. package/dist/runtime/auth-client.mjs +1 -1
  256. package/dist/runtime/auth.d.mts +1 -1
  257. package/dist/runtime/auth.mjs +1 -1
  258. package/dist/runtime/better-auth-mysql.d.mts +2 -4
  259. package/dist/runtime/better-auth-mysql.mjs +3 -4
  260. package/dist/runtime/better-auth-pg.d.mts +2 -4
  261. package/dist/runtime/better-auth-pg.mjs +4 -5
  262. package/dist/runtime/better-auth.d.mts +2 -4
  263. package/dist/runtime/better-auth.mjs +3 -4
  264. package/dist/runtime/client-react.d.mts +4 -4
  265. package/dist/runtime/client-react.mjs +4 -4
  266. package/dist/runtime/client-solid.d.mts +4 -4
  267. package/dist/runtime/client-solid.mjs +4 -4
  268. package/dist/runtime/client-svelte.d.mts +4 -4
  269. package/dist/runtime/client-svelte.mjs +4 -4
  270. package/dist/runtime/client-vue.d.mts +4 -4
  271. package/dist/runtime/client-vue.mjs +4 -4
  272. package/dist/runtime/client.d.mts +4 -4
  273. package/dist/runtime/client.mjs +4 -4
  274. package/dist/runtime/db.d.mts +0 -2
  275. package/dist/runtime/db.mjs +2 -3
  276. package/dist/runtime/durable.d.mts +0 -2
  277. package/dist/runtime/durable.mjs +3 -4
  278. package/dist/runtime/email/testing.d.mts +1 -5
  279. package/dist/runtime/email/testing.mjs +5 -6
  280. package/dist/runtime/email-protocol.d.mts +0 -2
  281. package/dist/runtime/email-protocol.mjs +1 -1
  282. package/dist/runtime/email.d.mts +1 -5
  283. package/dist/runtime/email.mjs +6 -7
  284. package/dist/runtime/env-public-client.d.mts +1 -3
  285. package/dist/runtime/env-public-client.mjs +2 -3
  286. package/dist/runtime/env-public.d.mts +2 -2
  287. package/dist/runtime/env-public.mjs +5 -7
  288. package/dist/runtime/env.d.mts +0 -4
  289. package/dist/runtime/env.mjs +1 -1
  290. package/dist/runtime/fetch-server.d.mts +1 -3
  291. package/dist/runtime/fetch-server.mjs +3 -4
  292. package/dist/runtime/fetch-stream.d.mts +2 -2
  293. package/dist/runtime/fetch-stream.mjs +2 -2
  294. package/dist/runtime/fetch.d.mts +1 -1
  295. package/dist/runtime/fetch.mjs +2 -2
  296. package/dist/runtime/handler.d.mts +1 -1
  297. package/dist/runtime/handler.mjs +2 -2
  298. package/dist/runtime/isr.d.mts +1 -3
  299. package/dist/runtime/isr.mjs +2 -3
  300. package/dist/runtime/kv.d.mts +1 -3
  301. package/dist/runtime/kv.mjs +2 -3
  302. package/dist/runtime/limits.d.mts +1 -1
  303. package/dist/runtime/limits.mjs +1 -1
  304. package/dist/runtime/live-client.d.mts +1 -3
  305. package/dist/runtime/live-client.mjs +1 -2
  306. package/dist/runtime/live-server.d.mts +0 -2
  307. package/dist/runtime/live-server.mjs +3 -4
  308. package/dist/runtime/live.d.mts +1 -1
  309. package/dist/runtime/live.mjs +1 -1
  310. package/dist/runtime/log.d.mts +3 -3
  311. package/dist/runtime/log.mjs +26 -18
  312. package/dist/runtime/migration-handler-mysql.d.mts +2 -4
  313. package/dist/runtime/migration-handler-mysql.mjs +2 -3
  314. package/dist/runtime/migration-handler-pg.d.mts +2 -4
  315. package/dist/runtime/migration-handler-pg.mjs +2 -3
  316. package/dist/runtime/migration-handler.d.mts +1 -1
  317. package/dist/runtime/migration-handler.mjs +1 -1
  318. package/dist/runtime/queues.d.mts +1 -1
  319. package/dist/runtime/queues.mjs +2 -3
  320. package/dist/runtime/remote/binding-handler.d.mts +1 -3
  321. package/dist/runtime/remote/binding-handler.mjs +3 -4
  322. package/dist/runtime/remote/index.d.mts +1 -3
  323. package/dist/runtime/remote/index.mjs +8 -13
  324. package/dist/runtime/response.d.mts +1 -3
  325. package/dist/runtime/response.mjs +1 -1
  326. package/dist/runtime/route-url.d.mts +2 -2
  327. package/dist/runtime/route-url.mjs +1 -1
  328. package/dist/runtime/routing.d.mts +7 -10
  329. package/dist/runtime/routing.mjs +18 -19
  330. package/dist/runtime/sandbox-container.d.mts +1 -1
  331. package/dist/runtime/sandbox-container.mjs +1 -1
  332. package/dist/runtime/sandbox.d.mts +2 -2
  333. package/dist/runtime/sandbox.mjs +5 -6
  334. package/dist/runtime/seed.d.mts +0 -2
  335. package/dist/runtime/seed.mjs +1 -2
  336. package/dist/runtime/sse-client.d.mts +1 -3
  337. package/dist/runtime/sse-client.mjs +1 -2
  338. package/dist/runtime/sse.d.mts +1 -3
  339. package/dist/runtime/sse.mjs +1 -1
  340. package/dist/runtime/storage.d.mts +1 -3
  341. package/dist/runtime/storage.mjs +2 -3
  342. package/dist/runtime/validator.d.mts +1 -1
  343. package/dist/runtime/validator.mjs +1 -1
  344. package/dist/runtime/ws-server.d.mts +3 -5
  345. package/dist/runtime/ws-server.mjs +3 -4
  346. package/dist/runtime/ws.d.mts +1 -1
  347. package/dist/runtime/ws.mjs +3 -4
  348. package/dist/{sandbox-q3waMc2T.d.mts → sandbox-DE1WsxuB.d.mts} +2 -4
  349. package/dist/{sandbox-container-a9LRUtii.mjs → sandbox-container-BuxhwCgt.mjs} +1 -2
  350. package/dist/{sandbox-container-ChQRum-j.d.mts → sandbox-container-CZFZdMso.d.mts} +0 -2
  351. package/dist/{scan-N9WzdcAl.mjs → scan-DSQtH3oS.mjs} +31 -25
  352. package/dist/{secret-3X0PxmuX.mjs → secret-C_QtTzJG.mjs} +17 -15
  353. package/dist/{serialize-YHvlcG3Q.mjs → serialize-DUuYuaY3.mjs} +2 -4
  354. package/dist/{serialize-DtR8Vwa_.d.mts → serialize-I4EmS-Wf.d.mts} +0 -2
  355. package/dist/{skills-CrUO3PJ0.mjs → skills-D393E4lB.mjs} +4 -5
  356. package/dist/{sqlite-validation-BzKMWnO4.mjs → sqlite-validation-CLJXXN93.mjs} +1 -2
  357. package/dist/{sse-CMvCgjNk.mjs → sse-CxR30yMF.mjs} +1 -2
  358. package/dist/{standard-schema-Fo_vCAZh.d.mts → standard-schema-CuDawHOC.d.mts} +0 -2
  359. package/dist/{static-asset-marker-Btf-6oCD.mjs → static-asset-marker-NR1XS2z5.mjs} +1 -2
  360. package/dist/{subcommand-prompt-D9OhhbGG.mjs → subcommand-prompt-CxJXporl.mjs} +3 -4
  361. package/dist/sveltekit.d.mts +0 -2
  362. package/dist/sveltekit.mjs +2 -3
  363. package/dist/{terminal-log-text-D9ACPOuG.mjs → terminal-log-text-DNsWJREL.mjs} +1 -2
  364. package/dist/{types-w72dljaA.d.mts → types-agfx0alu.d.mts} +0 -4
  365. package/dist/validate-DY1U9rET.mjs +1 -0
  366. package/dist/{validate-CnZPMq4q.mjs → validate-Ddzl-IwT.mjs} +4 -5
  367. package/dist/{validation-error-Dg9Recn1.mjs → validation-error-rDVbUJet.mjs} +2 -4
  368. package/dist/{validator-BTOu0fB0.mjs → validator-CTfmzZYb.mjs} +2 -5
  369. package/dist/{version-metadata-D2vfMQzv.mjs → version-metadata-Blf5H9BQ.mjs} +4 -6
  370. package/dist/{worker-conditions-AWFRcFxR.mjs → worker-conditions-CBZ0RYsZ.mjs} +1 -2
  371. package/dist/wrangler-CPRX2d9A.mjs +1 -0
  372. package/dist/{wrangler-I-scB_1t.mjs → wrangler-p-kLCJqF.mjs} +6 -8
  373. package/dist/{wrapper-BBl1rC32.mjs → wrapper-iejSJDwL.mjs} +17 -14
  374. package/dist/{ws-B3ClMVDh.d.mts → ws-DzBD-NUj.d.mts} +3 -5
  375. package/dist/{yarn-pnp-DLbEFMT0.mjs → yarn-pnp-DgWbE7z5.mjs} +2 -3
  376. package/docs/guide/database.md +4 -4
  377. package/docs/guide/deployment.md +1 -1
  378. package/docs/guide/edge/headers.md +2 -6
  379. package/docs/guide/edge/redirects.md +4 -4
  380. package/docs/guide/edge/static-assets.md +0 -10
  381. package/docs/guide/email/domains.md +3 -1
  382. package/docs/guide/email/receiving.md +3 -3
  383. package/docs/guide/email/sending.md +1 -1
  384. package/docs/guide/pages-routing/actions-and-forms.md +6 -9
  385. package/docs/guide/pages-routing/islands.md +2 -2
  386. package/docs/guide/pages-routing/loaders.md +3 -3
  387. package/docs/guide/pages-routing/markdown.md +6 -6
  388. package/docs/guide/pages-routing/overview.md +34 -27
  389. package/docs/guide/platform/administration/email.md +6 -8
  390. package/docs/guide/platform/installation/credentials.md +6 -6
  391. package/docs/guide/platform/installation/maintenance.md +9 -25
  392. package/docs/guide/platform/installation/prerequisites.md +1 -1
  393. package/docs/guide/platform/installation/setup.md +1 -1
  394. package/docs/guide/platform/installation/uninstall.md +1 -1
  395. package/docs/guide/queues.md +4 -8
  396. package/docs/guide/self-hosted-platform.md +3 -3
  397. package/docs/guide/server-routing.md +7 -7
  398. package/docs/guide/type-safety.md +42 -0
  399. package/docs/guide/typed-fetch.md +1 -1
  400. package/docs/guide/websockets.md +1 -1
  401. package/docs/integrations/cloudflare.md +2 -2
  402. package/docs/integrations/frameworks/analog.md +1 -1
  403. package/docs/integrations/frameworks/nuxt.md +1 -1
  404. package/docs/integrations/frameworks/sveltekit.md +1 -1
  405. package/docs/integrations/frameworks/tanstack-start.md +1 -1
  406. package/docs/integrations/hono.md +5 -5
  407. package/docs/reference/api/auth.md +1 -1
  408. package/docs/reference/api/deploy.md +6 -6
  409. package/docs/reference/api/pages.md +9 -1
  410. package/docs/reference/api/plugin.md +4 -4
  411. package/docs/reference/api/resources.md +4 -1
  412. package/docs/reference/api/rewrites.md +20 -2
  413. package/docs/reference/api/types.md +41 -0
  414. package/docs/reference/api.md +2 -2
  415. package/docs/reference/cli/database.md +15 -9
  416. package/docs/reference/cli/email.md +4 -2
  417. package/docs/reference/cli/platform-installation.md +2 -2
  418. package/docs/reference/cli/project.md +2 -2
  419. package/docs/reference/cli/secrets.md +3 -1
  420. package/docs/reference/cli/setup.md +3 -3
  421. package/docs/reference/cli.md +1 -1
  422. package/docs/reference/config.md +2 -2
  423. package/package.json +35 -32
  424. package/sandbox.Dockerfile +1 -1
  425. package/dist/cf-build-output-bd8Uwv1P.mjs +0 -1
  426. package/dist/client-BZb9j66F.mjs +0 -1
  427. package/dist/collect-BWhkgtAn.mjs +0 -1
  428. package/dist/deploy-CX94CmKa.mjs +0 -2
  429. package/dist/discover-D4TPKo57.mjs +0 -1
  430. package/dist/gen-BhWBT4iu.mjs +0 -1
  431. package/dist/help-qOZr3wng.mjs +0 -1
  432. package/dist/login-BAPmYnb7.mjs +0 -1
  433. package/dist/migrate-BIYTPQE6.mjs +0 -1
  434. package/dist/operator-cmd-CjazwOyb.mjs +0 -1
  435. package/dist/output-BW9uK099.mjs +0 -1
  436. package/dist/plan-CKX_jWnD.mjs +0 -1
  437. package/dist/platform-args-BC8_hsDj.mjs +0 -1
  438. package/dist/prepare-DU-tOpS5.mjs +0 -1
  439. package/dist/project-slug-6cyz8E7k.mjs +0 -1
  440. package/dist/resolve-project-DD1vu8s9.mjs +0 -1
  441. package/dist/route-url-BgPja1GS.d.mts +0 -5
  442. package/dist/route-url-BjGv_KKY.mjs +0 -28
  443. package/dist/validate-D7Wn8PUX.mjs +0 -1
  444. package/dist/wrangler-UnwdISay.mjs +0 -1
@@ -100,9 +100,9 @@ Repair recreates missing infrastructure that the installer owns. It does not res
100
100
 
101
101
  ### Upgrade the platform
102
102
 
103
- Keep the platform runtime current when updating the Void CLI. Upgrade the platform before your team updates its CLI: a newer CLI refuses to work with an older platform and asks for `void platform upgrade`. Install the new CLI on the administrator's machine, run the upgrade below, then have the team update.
103
+ Upgrade the platform before your team updates its CLI. Install the new CLI on the administrator's machine, run the upgrade below, then have the team update.
104
104
 
105
- If the platform will deploy apps that use `void/sandbox`, its runtime token needs **Account → Containers → Edit** and **Account → Cloudchamber → Edit**. A token made from an older setup link may lack them, and an upgrade does not add them. Edit the token in the Cloudflare dashboard, or set `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN` to a new token when you upgrade. See [Cloudflare API Tokens](/guide/platform/installation/credentials#runtime-token-permissions).
105
+ For apps using `void/sandbox`, add **Account → Containers → Edit** and **Account → Cloudchamber → Edit** to the runtime token. Edit its permissions in Cloudflare, or supply a replacement with `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN`. See [Cloudflare API Tokens](/guide/platform/installation/credentials#runtime-token-permissions).
106
106
 
107
107
  Use the installed CLI's packaged runtime to upgrade:
108
108
 
@@ -115,11 +115,11 @@ An upgrade validates the runtime, applies supported pending migrations, deploys
115
115
 
116
116
  Before starting, Void checks access to the installation's Cloudflare account, Workers, and existing R2 buckets. If credentials are rejected, set `CLOUDFLARE_API_TOKEN` to a management token scoped to that account and retry. This overrides the installation's saved management token.
117
117
 
118
- Some upgrades pause application traffic during the cutover to the new version. Traffic resumes after the new version passes its health checks. If an upgrade or another lifecycle command fails after it paused traffic, traffic stays paused until a later run succeeds. To resume:
118
+ Some upgrades pause application traffic until the new version passes health checks. If a command fails while traffic is paused:
119
119
 
120
120
  1. Run `void platform status <id>` to see the saved progress.
121
- 2. Fix the problem that the error names.
122
- 3. Run the resume command that the CLI printed. It is the same command, with the same runtime.
121
+ 2. Fix the reported problem.
122
+ 3. Run the printed resume command with the same runtime. Traffic resumes when it succeeds.
123
123
 
124
124
  ::: details Migration safety, credential rotation, and rollback
125
125
 
@@ -149,29 +149,13 @@ Let running rotations finish before you roll back. If an older proxy runs next t
149
149
 
150
150
  ### Platform Workers changed outside Void {#workers-changed-outside-void}
151
151
 
152
- Void manages the platform's own Workers. Do not change them in the Cloudflare dashboard or with the Cloudflare API. To change the platform, use the Void commands on this page.
152
+ Use Void commands to manage the platform's Workers. If their configuration was changed in Cloudflare, or Void cannot identify the active version, maintenance asks you to approve replacing it. Preview the affected Workers with `--plan`.
153
153
 
154
- `upgrade`, `repair`, `enable`, `rollback`, and `install --resume` deploy the platform Workers again. Before they change a platform Worker or pause traffic, Void finds each platform Worker that:
154
+ Run the printed command in a terminal and review **Replace the configuration of these Workers?** The default is No. Accepting restores Void's configuration, including removing manually added variables. You may see another confirmation with the configuration differences before deployment. Declining that later prompt leaves any resource and database preparation in place.
155
155
 
156
- - was changed in the Cloudflare dashboard or with the Cloudflare API.
157
- - has an active version without a Void deployment record. This can occur when an earlier run replaced a change made outside Void, and then stopped or failed. If that run stopped during the cutover to the new version, the command first makes the earlier versions active again. Void checks those earlier versions too. A version that an older Void release deployed can also have no record.
156
+ CI and `--yes` runs stop when this approval is needed. Complete the interactive command once, then resume automation. If a Worker uses a gradual deployment, first select one version for 100% of traffic in Cloudflare.
158
157
 
159
- The `--plan` preview of `upgrade`, `repair`, `enable`, and `rollback` shows the same list as a warning.
160
-
161
- In a terminal, Void lists these Workers and asks **Replace the configuration of these Workers?** The default answer is No.
162
-
163
- - If you answer No, the command stops. No platform Worker changed, and the command did not pause traffic.
164
- - If you answer Yes, the command continues. First, Void prepares the platform resources and the database. Then, before it pauses traffic or deploys a Worker, the Cloudflare CLI asks you again for each Worker changed in the dashboard or with the API. For a dashboard change, it shows the differences. Void uploads a new version of each of these Workers and does not deploy it yet. For a Worker that has an active version without a Void deployment record, the Cloudflare CLI does not ask again.
165
-
166
- If you refuse in the Cloudflare CLI, the command stops. Void does not undo the resource and database changes. No deployment changed, and the command did not pause traffic.
167
-
168
- The replacement removes values that Void does not set, for example an `EMAIL_FROM` variable that you added. It also resets values that Void sets, for example `AUTH_REDIRECT_URI`.
169
-
170
- Without a terminal, for example in CI, or with `--yes`, the command stops before it changes a platform Worker, and it does not pause traffic. Run the command that Void prints once in a terminal, and answer the questions there. After that run completes, the command works in CI again.
171
-
172
- If Void cannot read a platform Worker, the command also stops before it changes a platform Worker or pauses traffic. Run the command again. If a platform Worker has no single version that gets 100% of traffic, for example after a gradual deployment, deploy one version of it to 100% of traffic in the Cloudflare dashboard. Then run the command once in a terminal, so that you can approve the dashboard change.
173
-
174
- If an earlier run failed after it paused traffic, traffic stays paused after these stops. To resume traffic, see [Upgrade the platform](#upgrade-the-platform).
158
+ If traffic was already paused by an earlier failed run, follow [Upgrade the platform](#upgrade-the-platform) to resume it.
175
159
 
176
160
  ### Follow upgrade and rollback progress
177
161
 
@@ -37,7 +37,7 @@ If your account's dashboard has no **Enable** action, create a disposable Hello
37
37
 
38
38
  ## Install the CLI and Preview
39
39
 
40
- With Node.js 24.21.0 or later, install the CLI:
40
+ With Node.js 24.22+ or 26.12+, install the CLI:
41
41
 
42
42
  ```sh
43
43
  pnpm add --global void
@@ -260,6 +260,6 @@ You can also rerun `void platform install` and choose **Continue setup** for an
260
260
 
261
261
  Resume restores your selected Hyperdrive. If that selection is missing from the saved checkpoint, add `--hyperdrive <existing-id>` when resuming, using the same configuration you originally selected.
262
262
 
263
- If Cloudflare rejects a saved runtime token during continued credential setup, Void opens the token page and asks for a replacement in the same run. A missing [email permission](/guide/platform/installation/credentials#enable-email) does not discard the saved token: add the permission to the same token, then resume. Network or service failures do not discard saved tokens. Tokens supplied through the environment must be corrected there instead.
263
+ If Cloudflare rejects a saved runtime token, Void opens the token page and asks for a replacement. For a missing [email permission](/guide/platform/installation/credentials#enable-email), update the existing token's permissions and resume. If you supplied a token through an environment variable, update that variable.
264
264
 
265
265
  :::
@@ -91,7 +91,7 @@ If installation configured Cloudflare Access, the uninstall plan lists its recor
91
91
 
92
92
  Uninstall does not remove the applications created for [project Zero Trust](/guide/platform/administration/zero-trust). While Zero Trust is enabled or still has Access applications, uninstall and `--plan` stop before any change and list those applications. Run `void platform zero-trust disable` first. Uninstall reads this from the installation database, so it also stops when the database cannot be reached.
93
93
 
94
- If the installation database is permanently gone and cannot be restored, there is no uninstall command that can clear the local installation record or list its Cloudflare resources. Once you have decided not to recover that installation, delete `~/.void/platforms/<account-id>/<installation-id>.json` and any sibling `<installation-id>.recovery.enc` or `<installation-id>.secrets.enc` files. This removes only local state and encrypted credentials; it does not delete Cloudflare resources. Review and remove those resources manually using [Remove retained resources](#remove-retained-resources).
94
+ If the installation database is permanently lost, [remove its Cloudflare resources manually](#remove-retained-resources). Once cleanup is complete, delete the local record at `~/.void/platforms/<account-id>/<installation-id>.json` and its sibling `<installation-id>.recovery.enc` and `<installation-id>.secrets.enc` files. These files contain installation metadata and encrypted credentials; deleting them leaves Cloudflare resources in place.
95
95
 
96
96
  If no platform user exists yet, for example because first administrator setup did
97
97
  not finish, nobody can run `zero-trust disable`. Uninstall then turns off project
@@ -76,7 +76,7 @@ export default defineQueue<Message>(async (batch, env) => {
76
76
  - `batch.ackAll()`: acknowledge all messages in the batch
77
77
  - `batch.retryAll(options?)`: retry all messages in the batch
78
78
 
79
- The first call wins for each message. Calling `ack()` after `retry()`, or the reverse, does nothing. Messages with no explicit decision are acknowledged if the handler succeeds, or retried if it throws.
79
+ The first `ack()` or `retry()` call wins for each message. Messages without an explicit decision are acknowledged when the handler succeeds and retried when it throws. Void logs handler errors automatically.
80
80
 
81
81
  The `timestamp` field on each message is a `Date` object.
82
82
 
@@ -118,15 +118,11 @@ Void provisions queues and connects their producers and consumers when you deplo
118
118
 
119
119
  ### Cloudflare queue names
120
120
 
121
- Queue names are unique per Cloudflare account. So `void deploy --platform cloudflare` names each queue after the Worker: in a Worker named `app-staging`, `queues/jobs.ts` uses the Cloudflare queue `app-staging-jobs` (a `_` in the Worker name becomes `-`). Two Workers in one account, such as `app-staging` and `app-production`, get separate queues. Your code keeps using the name from `queues/` (`queues.jobs.send()`), and `vp dev` uses that name too.
121
+ With `void deploy --platform cloudflare`, queue names include the Worker name: `queues/jobs.ts` in `app-staging` creates `app-staging-jobs`. Underscores in the Worker name become hyphens. Your app uses `queues.jobs.send()` in every environment.
122
122
 
123
- The deploy stops before creating anything when:
123
+ Keep the full name within 63 characters and unique within the account. Each Cloudflare queue supports one consumer; Void reports naming or consumer conflicts during deploy.
124
124
 
125
- - a new queue's full name is longer than 63 characters. Shorten the Worker name or the file name.
126
- - one queue's full name is the name of another file in `queues/`, such as `queues/jobs.ts` and `queues/app-jobs.ts` in Worker `app`. Rename one of the files.
127
- - another Worker already consumes the Cloudflare queue the deploy would use. A Cloudflare queue has one consumer.
128
-
129
- A queue that the Worker already consumes keeps its name, so an app deployed before Worker-named queues keeps its queue (for example `jobs`) and the messages in it. The deploy prints a note when it keeps a name. To move to the Worker-named queue, remove the Worker's consumer from the old queue in the Cloudflare dashboard, then deploy again. Messages that reach the old queue before that deploy finishes stay there, so do this when the app is not sending messages, and check that the old queue is empty before you delete it.
125
+ Existing deployments keep their queues and messages. To adopt the new naming, pause producers, drain the old queue, remove its Worker consumer in Cloudflare, and redeploy. Check that the old queue is empty before deleting it.
130
126
 
131
127
  ## Local development
132
128
 
@@ -6,11 +6,11 @@ outline: deep
6
6
 
7
7
  A Void platform lets your team deploy apps into a shared Cloudflare account. As an administrator, you install and maintain the platform. Developers connect the Void CLI to its URL, sign in through an enabled login method, and deploy their apps.
8
8
 
9
- If you're deploying an app for yourself, [deploy directly to Cloudflare](/integrations/cloudflare#deploy-to-your-own-cloudflare-account). You don't need to install a platform first.
9
+ For an individual app, [deploy directly to Cloudflare](/integrations/cloudflare#deploy-to-your-own-cloudflare-account).
10
10
 
11
11
  The core platform supports GitHub, Google, generic OIDC, and Cloudflare Access login, CLI deploys, D1, KV, R2, Queues, cron jobs, Workers AI, WebSockets, SSE, ISR, routing, logs, and rollback.
12
12
 
13
- The core installation includes managed Sandboxes and an email gateway; email is enabled when you configure a shared mail domain and zone. The user dashboard, GitHub builds and webhooks, and build Containers aren't part of the core installation. [Project custom domains](/guide/platform/installation/domains#project-custom-domains) are opt-in with `--custom-domains`. Source-built platforms that add the optional GitHub services should follow the [isolated webhook ingress setup](/guide/platform/development/runtime#optional-github-webhook-ingress-for-access-protected-apis) when Access protects the API.
13
+ The core installation also includes managed Sandboxes and an email gateway. Configure a shared mail domain and zone to enable email, and add `--custom-domains` for [project custom domains](/guide/platform/installation/domains#project-custom-domains). A user dashboard and managed GitHub builds require a [custom platform build](/guide/platform-development).
14
14
 
15
15
  ## Deployment features
16
16
 
@@ -26,7 +26,7 @@ Both targets use the same application APIs. A core platform adds shared access a
26
26
  | Application rollback | Worker versions | Retained platform deployments |
27
27
  | Typed Durable State and native Durable Objects | Supported | Supported |
28
28
  | Sandboxes | Requires Workers Paid and Docker | Requires Workers Paid on the platform account |
29
- | Custom application domains | Supported | Unavailable in the core installation |
29
+ | Custom application domains | Supported | Enable with `--custom-domains` |
30
30
  | Generated GitHub deployment workflow | Supported | Use your CI with a scoped developer token |
31
31
  | User dashboard and managed GitHub builds | Not required | Not included in a standard installation |
32
32
 
@@ -12,7 +12,7 @@ Create route handlers in `routes/` using `.ts`, `.tsx`, `.js`, `.jsx`, `.mts`, o
12
12
 
13
13
  <RoutesFileTree />
14
14
 
15
- Dynamic segments use brackets: `[id]` becomes a route parameter and `[...slug]` becomes a catch-all. Files or directories starting with `_` are ignored, and so are those starting with `.`, except `.well-known`. Directories wrapped in parentheses like `(admin)` are route groups. They help organize files without changing the URL.
15
+ Dynamic segments use brackets: `[id]` becomes a route parameter and `[...slug]` becomes a catch-all. Prefix files or directories with `_` or `.` to exclude them from routing; `.well-known` remains available for standard discovery endpoints. Directories wrapped in parentheses like `(admin)` are route groups. They help organize files without changing the URL.
16
16
 
17
17
  ### Environment-only routes
18
18
 
@@ -45,8 +45,8 @@ export const GET = defineHandler((c) => {
45
45
  A file can export multiple methods:
46
46
 
47
47
  ```ts
48
- import { users } from '@schema';
49
48
  // routes/api/users/index.ts → GET + POST /api/users
49
+ import { users } from '@schema';
50
50
  import { defineHandler } from 'void';
51
51
  import { db } from 'void/db';
52
52
 
@@ -61,13 +61,13 @@ export const POST = defineHandler(async (c) => {
61
61
  });
62
62
  ```
63
63
 
64
- `GET` also answers `HEAD` requests, so route files can't export `HEAD`.
64
+ `GET` handlers also answer `HEAD` requests automatically.
65
65
 
66
66
  See [Database](./database.md) for queries with D1, PostgreSQL, or MySQL.
67
67
 
68
68
  ### JSX handlers
69
69
 
70
- Use `.tsx` or `.jsx` when a server handler contains JSX. Void doesn't choose a JSX runtime: route files compile with the same JSX settings as the rest of your Vite app. In a React or Solid app, that is the framework's JSX, so render it with the framework's server renderer and return HTML. For example, in a React app:
70
+ Use `.tsx` or `.jsx` when a server handler contains JSX. Route files use your app's JSX settings. In React or Solid, render JSX to HTML with the framework's server renderer. For example, in React:
71
71
 
72
72
  ```tsx
73
73
  // routes/hello.tsx → GET /hello
@@ -77,7 +77,7 @@ import { defineHandler } from 'void';
77
77
  export const GET = defineHandler((c) => c.html(renderToStaticMarkup(<h1>Hello!</h1>)));
78
78
  ```
79
79
 
80
- In an app without a JSX framework (API only, Vue, or Svelte), use [Hono's JSX](https://hono.dev/docs/guides/jsx). Your app needs `hono` in its own dependencies (new Void apps have it). Set the runtime in `vite.config.ts`, so it applies to `.tsx` and `.jsx` files alike:
80
+ For API-only, Vue, or Svelte apps, add `hono` as a dependency and configure [Hono's JSX](https://hono.dev/docs/guides/jsx) in `vite.config.ts`:
81
81
 
82
82
  ```ts
83
83
  // vite.config.ts
@@ -115,8 +115,8 @@ Return values are automatically converted:
115
115
  `defineHandler.withValidator()` adds input validation for `body`, `query`, and `params`. The recommended approach is to derive validators from your [Drizzle schema](./database.md#schema-derived-validators), which keeps validation in sync with the database.
116
116
 
117
117
  ```ts
118
- import { users, insertUserSchema } from '@schema';
119
118
  // routes/api/users/index.ts
119
+ import { users, insertUserSchema } from '@schema';
120
120
  import { defineHandler } from 'void';
121
121
  import { db } from 'void/db';
122
122
 
@@ -254,8 +254,8 @@ defineHandler(middleware1, middleware2, handler);
254
254
  Middleware runs in order. Each can short-circuit (return a response without calling `next()`) or post-process (modify the response after `await next()`). Both `defineMiddleware`-wrapped functions and raw Hono `MiddlewareHandler` functions are accepted.
255
255
 
256
256
  ```ts
257
- import { cors } from 'hono/cors';
258
257
  // routes/api/stats.ts
258
+ import { cors } from 'hono/cors';
259
259
  import { defineHandler } from 'void';
260
260
 
261
261
  export const GET = defineHandler(cors({ origin: 'https://app.example.com' }), (c) => ({
@@ -102,6 +102,47 @@ const deleteForm = useForm('/users/:id?delete', { id: '' }, { params: { id } });
102
102
 
103
103
  The `action()` helper gets the same type checking. See [Actions & Forms](./pages-routing/actions-and-forms) for the full API.
104
104
 
105
+ ## Typed URLs and Navigation
106
+
107
+ Use `routeUrl()` from `void/routes` to build URLs from your app's page, HTTP, and WebSocket route patterns. For a page at `pages/users/[id].tsx`, the pattern is `/users/:id`:
108
+
109
+ ```ts
110
+ import { routeUrl } from 'void/routes';
111
+
112
+ const url = routeUrl('/users/:id', {
113
+ params: { id: 42 },
114
+ query: { tab: 'activity' },
115
+ hash: 'details',
116
+ });
117
+ // /users/42?tab=activity#details
118
+ ```
119
+
120
+ Your editor autocompletes route patterns and parameter names. TypeScript checks that the route exists and all required parameters are supplied. Parameter values accept strings or numbers; Void encodes them for the URL. Query keys are chosen by your app, and values can be strings, numbers, booleans, or arrays of those values. Arrays become repeated query parameters; `null` and `undefined` values are omitted.
121
+
122
+ Pass the returned string to `Link`, a plain `<a>`, or `c.redirect()`. For programmatic navigation and `c.rewrite()`, you can pass a destination object directly:
123
+
124
+ ```ts
125
+ import type { RouteDestination } from 'void/routes';
126
+
127
+ const profile = {
128
+ pathname: '/users/:id',
129
+ params: { id: 42 },
130
+ query: { tab: 'activity' },
131
+ hash: 'details',
132
+ } satisfies RouteDestination;
133
+ ```
134
+
135
+ Destination objects use the same parameter checking and URL encoding as `routeUrl()`. See [Pages Routing](./pages-routing/overview.md#typed-navigation) for links and router methods, and [Rewrites](../reference/api/rewrites.md#c-rewrite-destination) for server navigation.
136
+
137
+ For a catch-all page such as `pages/files/[...path].tsx`, use `/files/:path{.+}` and pass the full path as one value:
138
+
139
+ ```ts
140
+ routeUrl('/files/:path{.+}', { params: { path: 'docs/get started' } });
141
+ // /files/docs/get%20started
142
+ ```
143
+
144
+ Route types update with the dev server. For CI or standalone typechecking, run `void prepare` and follow [Setup](#setup). The [API reference](../reference/api/types.md#void-routes) lists the URL helper and route types.
145
+
105
146
  ## What Gets Checked
106
147
 
107
148
  | Layer | What's type-checked |
@@ -109,6 +150,7 @@ The `action()` helper gets the same type checking. See [Actions & Forms](./pages
109
150
  | Database | Table columns, value types, insert/update shapes from Drizzle schema |
110
151
  | Handlers | `c.env` bindings, validator input, return type |
111
152
  | Fetch client | Route paths, HTTP methods, `body`/`query`/`params`, response type |
153
+ | Navigation | Route patterns and required parameter names and values in `routeUrl()` and destination objects |
112
154
  | `useForm` | Action URLs, `data` fields, `errors` keys, `reset()` args (including `{ initial: true }`), `params`, `resetOnSuccess` |
113
155
  | `action()` | Action URLs, `data` payload, `params` |
114
156
 
@@ -106,4 +106,4 @@ export default defineRender(async (c, assetTags) => {
106
106
  });
107
107
  ```
108
108
 
109
- Server-side calls to your app forward the incoming request's `cookie` and `authorization` headers. Explicit headers take precedence. Calls to an external `baseURL` use HTTP and do not inherit these headers.
109
+ Server-side calls to your app forward the incoming request's `cookie` and `authorization` headers. Explicit headers take precedence. For an external `baseURL`, supply authentication headers explicitly.
@@ -32,7 +32,7 @@ Filename rules match regular server routes:
32
32
  - route groups like `(marketing)/chat.ws.ts` are ignored in the URL
33
33
  - `chat.dev.ws.ts` / `chat.prod.ws.ts` restrict the route to one environment
34
34
 
35
- The environment suffix goes **before** `.ws`. `chat.ws.dev.ts` is not a WebSocket route.
35
+ Place the environment suffix **before** `.ws`, as in `chat.dev.ws.ts`.
36
36
 
37
37
  ## `defineRoom()`
38
38
 
@@ -160,7 +160,7 @@ By default, Void sends Access credentials only to `workers.dev` URLs. If `worker
160
160
  export CF_ACCESS_READINESS_ORIGIN="https://app.example.com"
161
161
  ```
162
162
 
163
- Use one exact `https:` origin, without a wildcard or a path. Set the variable in the shell or CI environment that runs `void deploy`. Void ignores a value that `void.config.ts` sets, for example through a dotenv import. Set it only for a hostname that you control and that serves this Worker, because Void sends your Access credentials to it.
163
+ Set this variable in the shell or CI environment running `void deploy`. Use an exact HTTPS origin for a hostname you control that serves this Worker; Void sends your Access credentials there.
164
164
 
165
165
  ### Databases and secrets
166
166
 
@@ -193,7 +193,7 @@ void project status
193
193
  void project rollback [version]
194
194
  ```
195
195
 
196
- Void restores recorded triggers along with the code. Versions without a complete trigger snapshot keep current routes and schedules. Rollback does not reverse database migrations. To undo D1 migrations, run [`void db restore`](../reference/cli/database.md#void-db-restore) with the restore point that deploy printed before it applied them, within 7 days on Workers Free or 30 days on Workers Paid.
196
+ Void restores recorded triggers along with the code. Versions without a complete trigger snapshot keep current routes and schedules. Database recovery is separate: use [`void db restore`](../reference/cli/database.md#void-db-restore) to undo D1 migrations.
197
197
 
198
198
  #### Scope and limitations
199
199
 
@@ -109,8 +109,8 @@ Declare variables in `env.ts` and read them with `import { env } from "void/env"
109
109
  You can also access raw Cloudflare bindings via the H3 event context or the `cloudflare:workers` module:
110
110
 
111
111
  ```ts
112
- import { env } from 'cloudflare:workers';
113
112
  // src/server/routes/api/users.ts
113
+ import { env } from 'cloudflare:workers';
114
114
  import { eventHandler } from 'h3';
115
115
 
116
116
  export default eventHandler(async () => {
@@ -80,8 +80,8 @@ Void-managed auth is not supported in framework mode yet. Use Better Auth's offi
80
80
  ### Database
81
81
 
82
82
  ```ts
83
- import { users } from '@schema';
84
83
  // server/api/users.get.ts
84
+ import { users } from '@schema';
85
85
  import { db } from 'void/db';
86
86
 
87
87
  export default defineEventHandler(async () => {
@@ -91,8 +91,8 @@ Void-managed auth is not supported in framework mode yet. Use Better Auth's offi
91
91
  ### Database
92
92
 
93
93
  ```ts
94
- import { users } from '@schema';
95
94
  // src/routes/users/+page.server.ts
95
+ import { users } from '@schema';
96
96
  import { db } from 'void/db';
97
97
 
98
98
  export async function load() {
@@ -92,7 +92,7 @@ export { Counter } from './counter';
92
92
  export default handler;
93
93
  ```
94
94
 
95
- Void preserves these named exports in development, production builds, and deploys. Without `cloudflare.main`, Void uses TanStack's default server entry. A package entry such as `@tanstack/react-start/server-entry` is resolved as a module.
95
+ Void uses TanStack's default server entry unless you set `cloudflare.main`. You can also use a package entry such as `@tanstack/react-start/server-entry`.
96
96
 
97
97
  Bind an exported Durable Object or Workflow class under `cloudflare` as well, for example in `cloudflare.durable_objects`. These settings apply when you deploy with `void deploy --platform cloudflare`. On a Void platform, use [Durable State](../../guide/durable-state.md) instead.
98
98
 
@@ -17,16 +17,16 @@ Once `hono` is installed in your app, you can use built-in middleware, helpers,
17
17
  Use Hono's built-in middleware in your global middleware files or per-route:
18
18
 
19
19
  ```ts
20
- import { cors } from 'hono/cors';
21
20
  // middleware/01.cors.ts
21
+ import { cors } from 'hono/cors';
22
22
  import { defineMiddleware } from 'void';
23
23
 
24
24
  export default defineMiddleware(cors({ origin: 'https://example.com' }));
25
25
  ```
26
26
 
27
27
  ```ts
28
- import { cache } from 'hono/cache';
29
28
  // routes/api/products.ts (per-route cache)
29
+ import { cache } from 'hono/cache';
30
30
  import { defineHandler } from 'void';
31
31
  import { listProducts } from '../../lib/products';
32
32
 
@@ -41,8 +41,8 @@ export const GET = defineHandler(
41
41
  :::
42
42
 
43
43
  ```ts
44
- import { bearerAuth } from 'hono/bearer-auth';
45
44
  // routes/api/webhooks/stripe.ts (per-route usage)
45
+ import { bearerAuth } from 'hono/bearer-auth';
46
46
  import { defineHandler } from 'void';
47
47
 
48
48
  export const POST = defineHandler(bearerAuth({ token: 'webhook-secret' }), async (c) => {
@@ -56,8 +56,8 @@ export const POST = defineHandler(bearerAuth({ token: 'webhook-secret' }), async
56
56
  Hono's context helpers are available on `c` in every handler:
57
57
 
58
58
  ```ts
59
- import { stream } from 'hono/streaming';
60
59
  // routes/api/download.ts
60
+ import { stream } from 'hono/streaming';
61
61
  import { defineHandler } from 'void';
62
62
 
63
63
  export const GET = defineHandler((c) => {
@@ -84,8 +84,8 @@ export const GET = defineHandler((c) => {
84
84
  Any `hono/*` or `@hono/*` package works. Install the package in your app, then use it directly:
85
85
 
86
86
  ```ts
87
- import { rateLimiter } from 'hono-rate-limiter';
88
87
  // middleware/01.rate-limit.ts
88
+ import { rateLimiter } from 'hono-rate-limiter';
89
89
  import { defineMiddleware } from 'void';
90
90
 
91
91
  export default defineMiddleware(rateLimiter({ windowMs: 60_000, limit: 100 }));
@@ -111,7 +111,7 @@ interface AuthSession {
111
111
  ```
112
112
 
113
113
  ::: tip Types inside `auth.ts`
114
- `AuthUser` and `AuthSession` are built from `auth.ts`. Inside `auth.ts` and the files it imports, don't use them, or values from `getUser()`, `getSession()` and `requireAuth()`, to type a hook's parameters or returned data. TypeScript reports a circular reference and the extra fields are lost. Let Better Auth infer those types, or use its own `User` and `Session` types. Better Auth callbacks such as `sendResetPassword` pass its base `User`, without plugin fields.
114
+ In `auth.ts` and its imports, let Better Auth infer hook types or use its `User` and `Session` types. Using Void's inferred auth types or auth helper results there creates a circular reference. Callbacks such as `sendResetPassword` receive Better Auth's base `User` type.
115
115
  :::
116
116
 
117
117
  ## `AuthState` {#authstate}
@@ -8,7 +8,7 @@ Build the app in managed mode inside its isolated environment:
8
8
  VOID_DEPLOY_BUILD=1 VOID_DEPLOY_PROJECT_ID=artifact npm run build
9
9
  ```
10
10
 
11
- These values select a platform-compatible build. `artifact` is a build marker, not an existing project ID or a credential; the target project is selected during publish approval.
11
+ These values select a platform-compatible build. The target project is selected during publish approval.
12
12
 
13
13
  ```ts
14
14
  import { prepareDeployArtifact } from 'void/deploy';
@@ -16,9 +16,9 @@ import { prepareDeployArtifact } from 'void/deploy';
16
16
  const { artifact, assets } = await prepareDeployArtifact('/path/to/app');
17
17
  ```
18
18
 
19
- `artifact` contains the deployment manifest, content-addressed asset metadata, and base64 Worker modules when the app needs a Worker. SPAs and static sites contain only assets, using the same app detection, output directory and routing configuration as `void deploy`. `assets` maps asset URL paths to base64 bytes. Keep this result immutable while requesting [publish approval](/guide/platform/administration/connected-apps).
19
+ `artifact` contains the deployment manifest, asset metadata, and any Worker modules. `assets` maps asset URL paths to base64 bytes. SPAs and static sites use the same output directory and routing configuration as `void deploy`. Keep the prepared result unchanged while requesting [publish approval](/guide/platform/administration/connected-apps).
20
20
 
21
- Preparation packages existing build output; it does not build, contact a platform, provision resources, or deploy. It supports Void Cloudflare Worker builds, SPAs, and static sites. Node targets, Pages `output: 'static'`, remote data, deploy-time prerendering, Sandbox, and Live resources require the normal `void deploy` workflow instead.
21
+ Use this API for built Cloudflare Worker apps, SPAs, and static sites. For Node targets, Pages `output: 'static'`, remote data, deploy-time prerendering, Sandbox, or Live resources, use `void deploy`.
22
22
 
23
23
  Run preparation inside the same isolated environment as the app build. App configuration and build plugins execute project code; keep platform credentials on the publishing server.
24
24
 
@@ -28,7 +28,7 @@ Run preparation inside the same isolated environment as the app build. App confi
28
28
  `prepareCfBuildOutput` follows Cloudflare's draft Build Output format. Its options and the prepared directory can change between Void releases.
29
29
  :::
30
30
 
31
- Use `prepareCfBuildOutput` to convert an existing Cloudflare Worker build into a disposable Cloudflare Build Output directory:
31
+ Use `prepareCfBuildOutput` to prepare an existing Worker build for Cloudflare publication:
32
32
 
33
33
  ```ts
34
34
  import { prepareCfBuildOutput } from 'void/deploy';
@@ -48,7 +48,7 @@ try {
48
48
  }
49
49
  ```
50
50
 
51
- Pass the Worker output directory that contains a generated `wrangler.json`, such as `dist/ssr`, `dist/rsc`, or `dist/server`. When Cloudflare's build tooling built the app, pass the project root that contains its native Build Output at `.cloudflare/output/v0` instead. Preparation copies modules and assets without changing that input. Native output keeps its module types, auxiliary Workers, Container declarations, and build metadata. Preparation does not provision resources, upload a Worker, or activate a deployment. Container images built from a local Dockerfile exist only in the Docker environment that built them, so publish from that environment.
51
+ Pass a Worker output directory containing a generated `wrangler.json`, such as `dist/ssr` or `dist/server`. For native Cloudflare Build Output, pass the project root containing `.cloudflare/output/v0`. The result is a temporary copy for your publication workflow. For Containers built from a local Dockerfile, publish from the same Docker environment used to build the image.
52
52
 
53
53
  | Option | Description |
54
54
  | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -56,4 +56,4 @@ Pass the Worker output directory that contains a generated `wrangler.json`, such
56
56
  | `mode` | Vite build mode. Native output keeps the mode it was built with, and a different value returns `null`. For other output it defaults to `production`. |
57
57
  | `projectRoot` | App directory containing `package.json` and its installed dependencies. Defaults to the input directory. |
58
58
 
59
- The result contains `directory`, an optional `assetsDirectory` pointing to the input assets, and an asynchronous `dispose()` method. Always dispose the result after use. Unsupported build configuration returns `null`. A directory without a Worker build, a missing or invalid Worker module, or an asset symlink outside the asset directory throws an error.
59
+ The result provides `directory`, an optional `assetsDirectory` pointing to the input assets, and an async `dispose()` method. Dispose the result after publication. Unsupported configurations return `null`; missing or invalid build files throw an error.
@@ -6,6 +6,14 @@ outline: deep
6
6
 
7
7
  Framework adaptors for [Pages Routing](../../guide/pages-routing/overview). Each adaptor provides a Vite plugin and client-side runtime.
8
8
 
9
+ ## Navigation destinations {#navigation-destinations}
10
+
11
+ All four adapters support typed URLs through [`routeUrl()`](./types.md#routeurl-path-options). Pass the returned string to `Link`'s `href`.
12
+
13
+ The router's `visit(destination, options?)`, `prefetch(destination, options?)`, and `flush(destination, method?)` accept [`RouteUrlInput`](./types.md#route-types): a string, `URL`, or typed destination object.
14
+
15
+ See [Typed navigation](../../guide/pages-routing/overview.md#typed-navigation) for framework examples.
16
+
9
17
  ## `@void/vue` {#void-vue}
10
18
 
11
19
  ### `voidVue(options?)` {#voidvue-options}
@@ -109,7 +117,7 @@ Imported from `"@void/react"`.
109
117
 
110
118
  React `Link` GET `data` is merged into the rendered `href` query string. Primitive values are serialized with `String(value)`, arrays become repeated keys, `null` and `undefined` are omitted, and nested objects throw. `prefetch` and `reloadDocument` are GET-only and throw for mutation links.
111
119
 
112
- React `useForm()` options accept `onSuccess?: () => void | Promise<void>` and `onError?: (error: Record<string, string> | VoidActionError) => void | Promise<void>`. Each submission captures its callbacks, runs them before the updated UI commits, and awaits any returned promise. See [submission callbacks](../../guide/pages-routing/actions-and-forms.md#react-submission-callbacks).
120
+ React `useForm()` accepts `onSuccess?: () => void | Promise<void>` and `onError?: (error: Record<string, string> | VoidActionError) => void | Promise<void>`. `pending` stays true until callbacks finish. See [submission callbacks](../../guide/pages-routing/actions-and-forms.md#react-submission-callbacks).
113
121
 
114
122
  React deferred props returned from `defer()` are Suspense resources. Read them
115
123
  with React's `use()` inside a `<Suspense>` boundary. React Pages requires React
@@ -16,10 +16,10 @@ export default defineConfig({
16
16
  });
17
17
  ```
18
18
 
19
- | Option | Type | Description |
20
- | ------------------ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
21
- | `persistTo` | `string` | Directory path for persisting local dev state (D1, KV, R2). Defaults to `.void/` in the project root. |
22
- | `auxiliaryWorkers` | `AuxiliaryWorkerConfig[]` | Additional workers to run inside the same Miniflare instance during dev. Passed through to `@cloudflare/vite-plugin`. Useful for running multiple workers that share bindings (e.g. a separate API worker alongside a dashboard). |
19
+ | Option | Type | Description |
20
+ | ------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
21
+ | `persistTo` | `string` | Directory path for persisting local dev state (D1, KV, R2). Defaults to `.void/` in the project root. |
22
+ | `auxiliaryWorkers` | `AuxiliaryWorkerConfig[]` | Additional Workers to run alongside your app, such as a separate API Worker and dashboard that share bindings. Each entry accepts `configPath` (JSON, JSONC, or TOML), `config` (settings or a callback), `viteEnvironment`, and `devOnly`. |
23
23
 
24
24
  ## Project configuration {#project-configuration}
25
25
 
@@ -128,6 +128,9 @@ import { logger } from 'void/log';
128
128
 
129
129
  logger.info('checkout completed', { orderId, userId });
130
130
  logger.error('webhook failed', { provider: 'stripe', attempt: 3 });
131
+
132
+ const log = logger.child({ component: 'queue', queue: 'tasks' });
133
+ log.info('task.started', { taskId });
131
134
  ```
132
135
 
133
- **Methods:** `logger.error(message, fields?)`, `logger.warn(message, fields?)`, `logger.info(message, fields?)`.
136
+ **Methods:** `logger.error(message, fields?)`, `logger.warn(message, fields?)`, `logger.info(message, fields?)`, `logger.child(fields)`.
@@ -10,7 +10,25 @@ URL rewrites re-dispatch a request at a different internal path without changing
10
10
 
11
11
  Re-dispatches the current request at `destination` and returns the resulting `Response`. The browser URL does not change — this is a server-side hop. If `destination` has no query string, the original request query is preserved. If `destination` includes a query string, it replaces the original query. `destination` must start with `/`; known generated routes autocomplete via [`RewriteDestination`](#rewritedestination), while arbitrary strings remain accepted for dynamic paths.
12
12
 
13
- `c.redirect()` also preserves request query params for internal destinations, but it merges rather than replaces: destination params win on collision, and request-only params are appended. On a request to a [named action](../../guide/pages-routing/actions-and-forms.md#named-actions), the action key (`?delete` in `POST /users/42?delete`) is not carried over, whether the action or middleware redirects. A redirect after which the browser sends the same request again keeps it: `307` and `308`, and `301` or `302` after a `PUT`, `PATCH` or `DELETE`.
13
+ Pass a [`RouteDestination`](./types.md#route-types) object to check the route pattern and its parameters:
14
+
15
+ ```ts
16
+ return c.rewrite({
17
+ pathname: '/users/:id',
18
+ params: { id: 42 },
19
+ query: { tab: 'activity' },
20
+ });
21
+ ```
22
+
23
+ For a typed redirect, build the URL with [`routeUrl()`](./types.md#routeurl-path-options):
24
+
25
+ ```ts
26
+ import { routeUrl } from 'void/routes';
27
+
28
+ return c.redirect(routeUrl('/users/:id', { params: { id: 42 } }));
29
+ ```
30
+
31
+ `c.redirect()` merges request query parameters into internal destinations, with destination values taking precedence. Redirecting a [named action](../../guide/pages-routing/actions-and-forms.md#named-actions) to a GET page drops the action key: `POST /users/42?delete&tab=profile` redirects to `/users/42?tab=profile`. Redirects that preserve the request method keep the action key: `307` and `308`, or `301` and `302` after a `PUT`, `PATCH`, or `DELETE`.
14
32
 
15
33
  ```ts
16
34
  import { defineHandler } from 'void';
@@ -25,7 +43,7 @@ export const GET = defineHandler((c) => {
25
43
 
26
44
  ```ts
27
45
  interface CloudContext {
28
- rewrite(destination: RewriteDestination): Promise<Response>;
46
+ rewrite(destination: RewriteDestination | RouteDestination): Promise<Response>;
29
47
  }
30
48
  ```
31
49
 
@@ -91,3 +91,44 @@ Generated route types used by the typed `fetch` client. Contains each route’s
91
91
  ```ts
92
92
  import type { RouteMap } from 'void/routes';
93
93
  ```
94
+
95
+ ## `void/routes` {#void-routes}
96
+
97
+ ### `routeUrl(path, options?)` {#routeurl-path-options}
98
+
99
+ Build a relative URL string from a known page, HTTP, or WebSocket route pattern:
100
+
101
+ ```ts
102
+ import { routeUrl } from 'void/routes';
103
+
104
+ routeUrl('/users/:id', {
105
+ params: { id: 42 },
106
+ query: { tab: 'activity' },
107
+ hash: 'details',
108
+ });
109
+ // /users/42?tab=activity#details
110
+ ```
111
+
112
+ | Option | Type | Description |
113
+ | -------- | -------------- | ---------------------------------------------------------------------------------- |
114
+ | `params` | Route-specific | Required for dynamic routes. Each parameter accepts a `string` or `number`. |
115
+ | `query` | `RouteQuery` | Query parameters. Arrays become repeated keys; `null` and `undefined` are omitted. |
116
+ | `hash` | `string` | URL fragment, such as `'details'` or `'#details'`. |
117
+
118
+ Static routes accept optional `query` and `hash` options. Pass raw parameter values for URL encoding. Catch-all parameters preserve `/` separators between segments. Invalid or missing path parameters throw a `TypeError`.
119
+
120
+ Use the returned string with `Link`, `<a>`, and `c.redirect()`. See [Typed URLs and Navigation](../../guide/type-safety.md#typed-urls-and-navigation) for setup and examples.
121
+
122
+ ### Route types {#route-types}
123
+
124
+ Import these types from `void/routes`:
125
+
126
+ | Type | Description |
127
+ | --------------------- | ----------------------------------------------------------------------------------------------- |
128
+ | `RoutePathMap` | Generated map of page, HTTP, and WebSocket route patterns to their parameter names. |
129
+ | `RoutePath` | Union of the known route patterns in `RoutePathMap`. |
130
+ | `RouteOptions<P>` | Options for a route pattern `P`, including its required `params`, optional `query`, and `hash`. |
131
+ | `RouteDestination<P>` | `{ pathname: P }` with `RouteOptions<P>`. Defaults to all known routes when `P` is omitted. |
132
+ | `RouteUrlInput` | `string`, `URL`, or `RouteDestination`; accepted by router navigation methods. |
133
+ | `RouteQuery` | Query keys mapped to `RouteQueryValue` or readonly arrays of those values. |
134
+ | `RouteQueryValue` | `string`, `number`, `boolean`, `null`, or `undefined`. |