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.
- package/README.md +1 -1
- package/dist/{account-cmd-HP8bixYo.mjs → account-cmd-ChVKPZ-w.mjs} +7 -8
- package/dist/{action-key-XZ9HkWAO.mjs → action-key-XtKKbbsi.mjs} +1 -2
- package/dist/{agents-CuNtT0D_.mjs → agents-DRo8gzni.mjs} +2 -3
- package/dist/{application-analysis-DDOQwiXk.mjs → application-analysis-2vGZrKzg.mjs} +18 -24
- package/dist/{application-routing-4719u_kf.mjs → application-routing-DnUQoOJD.mjs} +2 -3
- package/dist/{ast-CsZ_q_gc.mjs → ast-Cv0JwXqb.mjs} +1 -2
- package/dist/{ast-bindings-C3yaPs1y.mjs → ast-bindings-BkivMJIo.mjs} +6 -11
- package/dist/{atomic-write-Dq6R0BPN.mjs → atomic-write-DA6eD1Kp.mjs} +1 -2
- package/dist/{auth-g2TQbDLD.d.mts → auth-CH4PLAX1.d.mts} +0 -2
- package/dist/{auth-Cbqi1iVX.mjs → auth-CL-p_rqV.mjs} +1 -1
- package/dist/{auth-B6iOCjKI.mjs → auth-Dy8svcqQ.mjs} +6 -7
- package/dist/{auth-3sGB0zJ1.mjs → auth-YVjBX5NY.mjs} +1 -2
- package/dist/{auth-client-Bawdj38n.d.mts → auth-client-6-Ft9i9T.d.mts} +0 -2
- package/dist/{auth-client-BWBT8HLp.mjs → auth-client-DwCdwKbw.mjs} +1 -2
- package/dist/{auth-client-react-CMLwT2xI.mjs → auth-client-react-CJdeErvM.mjs} +1 -2
- package/dist/{auth-client-react-7GFffu8R.d.mts → auth-client-react-DvQLe5Zb.d.mts} +0 -2
- package/dist/{auth-client-solid-UoreJWZG.mjs → auth-client-solid-BRvgvp6h.mjs} +1 -2
- package/dist/{auth-client-solid-DyTFL4cq.d.mts → auth-client-solid-P9pEtKGp.d.mts} +0 -2
- package/dist/{auth-client-svelte-zetW0KIH.d.mts → auth-client-svelte-B5j8irT6.d.mts} +0 -2
- package/dist/{auth-client-svelte-Cv_WvrRk.mjs → auth-client-svelte-BSqUCEed.mjs} +1 -2
- package/dist/{auth-client-vue-bChShbQP.d.mts → auth-client-vue-BEiAfavk.d.mts} +0 -2
- package/dist/{auth-client-vue-CFk7Xbv3.mjs → auth-client-vue-CPkbRtOO.mjs} +1 -2
- package/dist/{auth-link-CedYpDCy.mjs → auth-link-D4uMdOsw.mjs} +7 -8
- package/dist/{auth-migrations-BO27GDNr.mjs → auth-migrations-DDeifS3v.mjs} +1 -2
- package/dist/{auth-router-vafo7x8w.mjs → auth-router-62dna450.mjs} +6 -7
- package/dist/{base64-DVrOndmI.mjs → base64-ikl9yBy3.mjs} +1 -2
- package/dist/{better-auth-shared-BHB8kiTE.d.mts → better-auth-shared-BJyG2mH0.d.mts} +2 -6
- package/dist/{better-auth-shared-7FM3Uk2N.mjs → better-auth-shared-CiclgPde.mjs} +4 -5
- package/dist/{build-cmd-9vUAQ1_V.mjs → build-cmd-D93K_4Sa.mjs} +7 -8
- package/dist/{cache-jvwLNb0h.mjs → cache-CiIzEED4.mjs} +7 -8
- package/dist/{cancel-deploy-Dw0UmWKO.mjs → cancel-deploy-BNoGfn2e.mjs} +6 -7
- package/dist/{cf-access-CWP4avfP.mjs → cf-access-BmBT2h8_.mjs} +3 -4
- package/dist/{cf-access-BM9G0lhO.mjs → cf-access-pejlJmuy.mjs} +1 -2
- package/dist/{cf-build-output-XpNR9zoh.mjs → cf-build-output-B1C8U83u.mjs} +41 -314
- package/dist/cf-build-output-CmDOcA7K.mjs +1 -0
- package/dist/{cf-command-values-ByHk0xg4.mjs → cf-command-values-Ccl-zRhl.mjs} +10 -7
- package/dist/cf-config-migrate-Dy8MrKgF.mjs +326 -0
- package/dist/{cf-worker-settings-Dg27RzyT.mjs → cf-worker-settings-CARs4Wy9.mjs} +3 -5
- package/dist/cli/cli.mjs +66 -76
- package/dist/cli/cloudflare-operation-process.mjs +14 -18
- package/dist/cli/env-schema-probe.d.mts +1 -5
- package/dist/cli/env-schema-probe.mjs +4 -5
- package/dist/client-DVtAKeUm.mjs +1 -0
- package/dist/{client-B3LnB_bE.mjs → client-Qayy9xEh.mjs} +10 -12
- package/dist/{cloudflare-auth-DyD_kVFr.mjs → cloudflare-auth-CEu-1Ps_.mjs} +2 -3
- package/dist/{cloudflare-cmd-D-b_u3T4.mjs → cloudflare-cmd-DiFGaLow.mjs} +7 -8
- package/dist/{cloudflare-config-CH1AylZT.mjs → cloudflare-config-Chet188_.mjs} +22 -17
- package/dist/{cloudflare-connect-zTJh8UnN.mjs → cloudflare-connect-BdgAQBc7.mjs} +5 -6
- package/dist/{cloudflare-operations-Bc-7fN44.mjs → cloudflare-operations-CWA24vCh.mjs} +8 -9
- package/dist/{cloudflare-operations-BtulCNOg.mjs → cloudflare-operations-D8MoezuN.mjs} +1 -1
- package/dist/{cloudflare-process-8jEYIeim.mjs → cloudflare-process-DjJ638A-.mjs} +7 -9
- package/dist/{cloudflare-user-output-Q-k0QoNQ.mjs → cloudflare-user-output-zEwuGrEJ.mjs} +1 -2
- package/dist/collect-8i0wU63d.mjs +1 -0
- package/dist/{collect-Dew86qce.mjs → collect-C6Blu9yw.mjs} +2 -3
- package/dist/{config-BV2ASlpn.mjs → config-BszFVhpk.mjs} +1 -1
- package/dist/{config-tqMM6DwY.mjs → config-Bt4rw93x.mjs} +5 -6
- package/dist/{config-CAdZVTLN.d.mts → config-CzsNzGVH.d.mts} +2 -6
- package/dist/{config-OFOAimzt.mjs → config-DkA9jYF2.mjs} +4 -5
- package/dist/{config-D-6q7EBH.mjs → config-WlvEcL82.mjs} +3 -4
- package/dist/config-entry.d.mts +1 -3
- package/dist/config-entry.mjs +1 -2
- package/dist/{connect-BOM6zvFX.mjs → connect-b9mJbb6X.mjs} +10 -11
- package/dist/{create-project-Bxd02EHN.mjs → create-project-eomwm0wa.mjs} +9 -11
- package/dist/{create-project-C2K0DN2O.mjs → create-project-rnjum4_V.mjs} +1 -1
- package/dist/{database-provider-Cx525bwX.mjs → database-provider-DkZo4VwN.mjs} +1 -2
- package/dist/database-provider.d.mts +1 -3
- package/dist/database-provider.mjs +1 -1
- package/dist/{db-Cdvr3zwG.mjs → db-UPWmiSk1.mjs} +52 -54
- package/dist/{db-types-0eCiqYb1.mjs → db-types-C_8amnB0.mjs} +3 -4
- package/dist/{delete-lETE6Tpt.mjs → delete-BeeYi1WO.mjs} +7 -8
- package/dist/deploy-CfU7CR-b.mjs +2 -0
- package/dist/{deploy-CdM-LAxX.mjs → deploy-CwmCcTlq.mjs} +83 -112
- package/dist/{deploy-managed-static-DjeBFG2c.mjs → deploy-managed-static-gPDxyp3v.mjs} +33 -40
- package/dist/{deploy-transport-DIq_gFTP.mjs → deploy-transport-L6zzPE9T.mjs} +6 -7
- package/dist/deploy.d.mts +1 -3
- package/dist/deploy.mjs +10 -11
- package/dist/{dev-inbox-D0jxye_D.mjs → dev-inbox-CwH5VuZj.mjs} +3 -4
- package/dist/discover-D4mQthao.mjs +1 -0
- package/dist/{discover-LaV0tbIu.mjs → discover-Dhkzxgdt.mjs} +3 -4
- package/dist/{dispatch-CLa2LThw.mjs → dispatch-CiJ1Xrba.mjs} +12 -15
- package/dist/{dist-Cegxq8gs.mjs → dist-B6eN80gc.mjs} +199 -118
- package/dist/{dist-D15hFhP0.mjs → dist-BWNkVq50.mjs} +8 -15
- package/dist/{dist-Cor9XGoz.mjs → dist-D23AAMxT.mjs} +9 -16
- package/dist/{dist-ipQi0Q8y.mjs → dist-DMYe8CZJ.mjs} +1 -2
- package/dist/{dist-B1PLt4_8.mjs → dist-eV_Ep60B.mjs} +1 -1
- package/dist/{domain-DyhNtdYf.mjs → domain-3xdH9p2L.mjs} +8 -9
- package/dist/{dotenv-CNazY3-w.mjs → dotenv-CEI8hapP.mjs} +1 -2
- package/dist/{drizzle-9TubSZvI.mjs → drizzle-C8MPqt5m.mjs} +1 -1
- package/dist/{drizzle-BQfyvQKX.mjs → drizzle-lFdzSEa9.mjs} +2 -3
- package/dist/{email-B9ayYQEG.mjs → email-BHY72ixO.mjs} +3 -4
- package/dist/{email-DM2wDcBN.mjs → email-Du3YRnM5.mjs} +14 -15
- package/dist/{email-cloudflare-PMbAev9Q.mjs → email-cloudflare-CtD8qE13.mjs} +18 -21
- package/dist/{email-protocol-D9nTvhCp.mjs → email-protocol-DTs_TjCS.mjs} +1 -2
- package/dist/{entry-BEM8ZuGP.mjs → entry-CBZsCy3O.mjs} +5 -6
- package/dist/{env-78hbN-oI.mjs → env-Cnvp0pGy.mjs} +10 -11
- package/dist/{env-BaMz0j7H.mjs → env-CuzZZyjB.mjs} +3 -4
- package/dist/{env-0jrMQJI_.mjs → env-DtKg5G26.mjs} +2 -3
- package/dist/{env-helpers--wFmQ_5Q.mjs → env-helpers-Dj_SIwPu.mjs} +1 -2
- package/dist/{env-helpers-CyKtOBpj.d.mts → env-helpers-U56xuFgL.d.mts} +1 -3
- package/dist/{env-public-6lqiSD2b.d.mts → env-public-CeNeO_AT.d.mts} +2 -4
- package/dist/{env-raw-D74P4ebM.mjs → env-raw-e8qgqAzQ.mjs} +1 -2
- package/dist/{env-types-BicfKBhV.mjs → env-types-DqzVBKnS.mjs} +4 -5
- package/dist/{env-validation-BUfFZ6bt.mjs → env-validation-C8Cmvas0.mjs} +1 -1
- package/dist/{env-validation-B3VobvXm.mjs → env-validation-GV1oD4EV.mjs} +9 -10
- package/dist/{error-pages-CLIJ7aYq.mjs → error-pages-COVBnzK7.mjs} +6 -12
- package/dist/{fetch-CUX0tB78.d.mts → fetch-B-gLGYVl.d.mts} +0 -4
- package/dist/{fetch-CtESUYWd.mjs → fetch-C8yhLoF3.mjs} +3 -4
- package/dist/{fetch-error-Bw0n-IY-.mjs → fetch-error-DmlRM6e4.mjs} +2 -4
- package/dist/{fetch-stream-BspOeTAI.mjs → fetch-stream-DafNtVJC.mjs} +4 -5
- package/dist/{fetch-stream-DfkAzZf-.d.mts → fetch-stream-DuwxWmBM.d.mts} +1 -3
- package/dist/{gen-CFmsUsW1.mjs → gen-BvVmpZ5f.mjs} +12 -13
- package/dist/gen-i61rdQgg.mjs +1 -0
- package/dist/{generate-DkEb9rL-.mjs → generate-BOp1g1H_.mjs} +1 -1
- package/dist/{generate-B1m4Cm4n.mjs → generate-CWb8aOsm.mjs} +4 -5
- package/dist/{generated-wrangler-config-DeWj5F9Y.mjs → generated-wrangler-config-CoDaaFsA.mjs} +1 -2
- package/dist/{git-metadata-D-gurjzG.mjs → git-metadata-Cukp5kV5.mjs} +1 -2
- package/dist/{github-cmd-De-_IWbM.mjs → github-cmd-X2GKiLi-.mjs} +8 -9
- package/dist/{handler-BHktmuTL.d.mts → handler-Drm_lyrV.d.mts} +13 -26
- package/dist/{handler-BZ1t7-Rv.mjs → handler-xmzz0U38.mjs} +4 -5
- package/dist/{head-D2VF4ApL.mjs → head-5XPcnG-j.mjs} +1 -2
- package/dist/{head-C8K_iGe6.d.mts → head-MeF_5M_3.d.mts} +0 -2
- package/dist/{headers--vaK_chu.mjs → headers-DEUBAM6W.mjs} +4 -5
- package/dist/help-BcZDUcTw.mjs +1 -0
- package/dist/{help-CKbrhZha.mjs → help-EWDNxST-.mjs} +19 -11
- package/dist/{inbound-VrOLqwZY.mjs → inbound-DQfekMtz.mjs} +5 -6
- package/dist/{inbound-Da7XsjH3.d.mts → inbound-DSKSHDUj.d.mts} +0 -4
- package/dist/index.d.mts +23 -13
- package/dist/index.mjs +452 -208
- package/dist/{info-Yg0-V5Rs.mjs → info-jW8_d3VI.mjs} +6 -7
- package/dist/{init-CDiJQycf.mjs → init-jDQ5G9QC.mjs} +42 -59
- package/dist/{isr-config-fZaJJ8t7.mjs → isr-config-DhBkzCdY.mjs} +5 -9
- package/dist/{limits-D0vD1M9A.mjs → limits-CrHLm5Tk.mjs} +1 -2
- package/dist/{limits-CFsDKQvU.d.mts → limits-_xIf5z_P.d.mts} +0 -2
- package/dist/{link-Dllip08S.mjs → link-DOyxX5Xs.mjs} +8 -9
- package/dist/{list-BYRP6am0.mjs → list-C9pTYDtl.mjs} +8 -9
- package/dist/{live-BllfDuzA.d.mts → live-CDBHyYiR.d.mts} +2 -4
- package/dist/{live-BcHoTDFe.mjs → live-DF4HUl2m.mjs} +5 -7
- package/dist/{load-user-env-DD5qveNU.mjs → load-user-env-CSwdofj0.mjs} +1 -2
- package/dist/{local-d1-CAwAs9GH.mjs → local-d1-CKfek6Z4.mjs} +4 -5
- package/dist/{log-BMwmN5Ae.mjs → log-D9hwSySP.mjs} +3 -4
- package/dist/login-C0MiQrYs.mjs +1 -0
- package/dist/{login-PcFy5mlC.mjs → login-koQbjzPd.mjs} +6 -7
- package/dist/{logs-DmJTBhed.mjs → logs-cTU5TsRW.mjs} +8 -9
- package/dist/migrate-BG09-KOv.mjs +1 -0
- package/dist/{migrate-B8S2xTcb.mjs → migrate-C62pGTfr.mjs} +20 -16
- package/dist/{migration-handler-CwlEQUoo.d.mts → migration-handler-D8mDx3Ew.d.mts} +0 -4
- package/dist/{migration-handler-Cg0Y4EPu.mjs → migration-handler-DCehTlWs.mjs} +1 -2
- package/dist/{mime-BAyHPskU.mjs → mime-DKkO7ZtA.mjs} +2 -3
- package/dist/{mysql-migration-sql-BIS5vbNk.mjs → mysql-migration-sql-CI9VTwjt.mjs} +3 -5
- package/dist/{neon-DTZr7Bu7.mjs → neon-CJzQSycr.mjs} +2 -3
- package/dist/nitro.d.mts +0 -2
- package/dist/nitro.mjs +5 -6
- package/dist/{node-CDOPrGSl.mjs → node-BfAt2rz8.mjs} +8 -9
- package/dist/{operator-args-BsJIYXaT.mjs → operator-args-D79WQP70.mjs} +2 -3
- package/dist/{operator-auth-Cr2zCc-J.mjs → operator-auth-CfDcmzpo.mjs} +2 -3
- package/dist/{operator-client-C-ROjk1I.mjs → operator-client-BIY4-N_6.mjs} +3 -4
- package/dist/operator-cmd-BhHXIL2G.mjs +1 -0
- package/dist/{operator-cmd-DmkmS2wL.mjs → operator-cmd-CnAvSqJ5.mjs} +8 -9
- package/dist/{output-BpgYODYx.mjs → output-BCdLioKP.mjs} +4 -5
- package/dist/output-E6gecbbV.mjs +1 -0
- package/dist/{package-json-BjYqR-So.mjs → package-json-DvS6IFRv.mjs} +2 -3
- package/dist/pages/client.d.mts +9 -25
- package/dist/pages/client.mjs +28 -33
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/head.mjs +1 -1
- package/dist/pages/index.d.mts +4 -16
- package/dist/pages/index.mjs +9 -11
- package/dist/pages/islands-plugin.d.mts +29 -11
- package/dist/pages/islands-plugin.mjs +3 -4
- package/dist/pages/prefetch.d.mts +1 -1
- package/dist/pages/prefetch.mjs +1 -1
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -2
- package/dist/pages/serialize.d.mts +1 -1
- package/dist/pages/serialize.mjs +1 -1
- package/dist/{pg-J2HbZIkX.mjs → pg-DoyPxa_X.mjs} +1 -2
- package/dist/{picocolors-BsDfhxIw.mjs → picocolors-D1NxSLw-.mjs} +2 -3
- package/dist/{plan-BhLO2p4w.mjs → plan-BOD70XGS.mjs} +1 -2
- package/dist/plan-CQ-N4gws.mjs +1 -0
- package/dist/{platform-args-BMD2gjc_.mjs → platform-args-Bv9hoLEL.mjs} +4 -7
- package/dist/platform-args-C1kqYUen.mjs +1 -0
- package/dist/{platform-auth-config-CImnfohz.mjs → platform-auth-config-CLj0EvnB.mjs} +10 -11
- package/dist/{platform-auth-protection-BogLhtHi.mjs → platform-auth-protection-DQDSxVhr.mjs} +10 -11
- package/dist/{platform-auth-recovery-B-mEaWEi.mjs → platform-auth-recovery-DD3oLerq.mjs} +9 -11
- package/dist/{platform-cmd-DZK2ixMl.mjs → platform-cmd-PLNLg-2N.mjs} +12 -13
- package/dist/{platform-cmd-CV8NxIIn.mjs → platform-cmd-WnOmdLzR.mjs} +1 -1
- package/dist/{platform-discovery-CHhNs8Nn.mjs → platform-discovery-B0eZjZ3B.mjs} +2 -3
- package/dist/{platform-domain-CRvelPGE.mjs → platform-domain-Bnq0vg0q.mjs} +7 -8
- package/dist/{platform-lifecycle-CPYY7E9B.mjs → platform-lifecycle-BCsFg1Tl.mjs} +53 -88
- package/dist/{platform-lifecycle-DwXq7kZt.mjs → platform-lifecycle-BQiN9HN5.mjs} +1 -1
- package/dist/{platform-management-lXdgGgAM.mjs → platform-management-CMJR8Zi-.mjs} +1 -1
- package/dist/{platform-management-BOnGbMSM.mjs → platform-management-nzCDwtiN.mjs} +7 -9
- package/dist/{platform-plans-config-CeydDSj0.mjs → platform-plans-config-Dx1agneU.mjs} +5 -6
- package/dist/{platform-recovery-noaALXnE.mjs → platform-recovery-DBNoME3I.mjs} +5 -6
- package/dist/{platform-registry-B9mWX9LO.mjs → platform-registry-DZ_2Xuqd.mjs} +4 -6
- package/dist/{platform-setup-Ca53gtt0.mjs → platform-setup-VEcHu0Vq.mjs} +4 -5
- package/dist/{plugin-inference-CeiB6BG5.mjs → plugin-inference-DmwjC3y2.mjs} +16 -24
- package/dist/{prefetch-Ce6la4EI.d.mts → prefetch-CG0K6JPd.d.mts} +0 -2
- package/dist/{prefetch-Bsc_Pb6c.mjs → prefetch-L93_1Jk7.mjs} +1 -2
- package/dist/prepare-BJMmfq3W.mjs +1 -0
- package/dist/{prepare-BuOS18AM.mjs → prepare-BPsfLWaW.mjs} +4 -5
- package/dist/{prepare-D604Yiyr.mjs → prepare-pfl2LIMy.mjs} +12 -13
- package/dist/{prerender-render-CaShbHJ3.mjs → prerender-render-RlAj6hh8.mjs} +2 -3
- package/dist/prerender-render.d.mts +1 -3
- package/dist/prerender-render.mjs +1 -1
- package/dist/{project-rqDnVsJN.mjs → project-CLwxcEdq.mjs} +3 -4
- package/dist/{project-zdB3fs9G.mjs → project-DVsTAWFh.mjs} +1 -1
- package/dist/{project-cmd-DBYqAIbe.mjs → project-cmd-5Izu4Pg3.mjs} +21 -23
- package/dist/{project-paths-DGu_QZ_Q.mjs → project-paths-CdGv9Tmi.mjs} +3 -5
- package/dist/project-slug-BUy0lmyR.mjs +1 -0
- package/dist/{project-slug-23TpquG4.mjs → project-slug-CO6ci9XG.mjs} +0 -1
- package/dist/{project-team-BjCLgTRC.mjs → project-team-DSUyjZFh.mjs} +7 -8
- package/dist/{project-token-BB6PwaA9.mjs → project-token-wj09YQSB.mjs} +7 -8
- package/dist/{project-tsconfig-CVvk6Z_e.mjs → project-tsconfig-Cf2NFjlM.mjs} +4 -6
- package/dist/{project-zero-trust-CWDh1P_t.mjs → project-zero-trust-BMHf2YF0.mjs} +7 -8
- package/dist/{protocol-DimNxVRr.mjs → protocol-0-lp9ZYx.mjs} +6 -7
- package/dist/{protocol-D5XDySYu.d.mts → protocol-xdrl-In0.d.mts} +3 -5
- package/dist/{providers-BNKRacMr.d.mts → providers-D5P8j_8D.d.mts} +0 -2
- package/dist/{providers-BUHwJlmM.mjs → providers-ZARwX2cL.mjs} +1 -2
- package/dist/{provision-DztLJ97X.mjs → provision-CRiNnlfE.mjs} +6 -7
- package/dist/{provision-DfxLCg-d.mjs → provision-CxHIGBIZ.mjs} +1 -1
- package/dist/{queues-BWKt1Xo4.d.mts → queues-DdM42xXW.d.mts} +0 -2
- package/dist/{r2-conditions-B8xUgJRc.mjs → r2-conditions-BqkQNt2n.mjs} +1 -2
- package/dist/{requests-D_pbzDyz.mjs → requests-DicgB5jU.mjs} +6 -7
- package/dist/resolve-project-CgfjtOwz.mjs +1 -0
- package/dist/{resolve-project-Xoi6eTWY.mjs → resolve-project-D0YNnJfm.mjs} +4 -5
- package/dist/{resource-name-C7LVpcRm.mjs → resource-name-DlJ9QXzg.mjs} +1 -2
- package/dist/{response-Tn7rU0MV.mjs → response-HmNjB30w.mjs} +1 -2
- package/dist/{rollback-CjfIYsJx.mjs → rollback-DrDZOKNE.mjs} +7 -8
- package/dist/{rolldown-runtime-3h0WiCiA.mjs → rolldown-runtime-uD8oG6U2.mjs} +1 -2
- package/dist/{route-types-DvEGmPif.mjs → route-types-irZc1txT.mjs} +43 -8
- package/dist/route-url-BGOiyKNz.d.mts +24 -0
- package/dist/route-url-CRDF-I0I.mjs +57 -0
- package/dist/routes-stub.d.mts +4 -3
- package/dist/routes-stub.mjs +1 -1
- package/dist/{routing-assets-DdSFxoLp.mjs → routing-assets-DJIVOrCh.mjs} +1 -2
- package/dist/{runner-3uGC-oLF.mjs → runner-5MCSimKx.mjs} +5 -6
- package/dist/{runner-WCdfeI0q.mjs → runner-QMeOpScZ.mjs} +1 -1
- package/dist/{runner-mysql-BcHnLUuM.mjs → runner-mysql-0zVmB1JW.mjs} +1 -1
- package/dist/{runner-mysql-BWmbk5IE.mjs → runner-mysql-Bdmsp_x4.mjs} +3 -4
- package/dist/{runner-pg-Cgp-cr_p.mjs → runner-pg-2pjltt0t.mjs} +1 -1
- package/dist/{runner-pg-Cr3qrqi4.mjs → runner-pg-mYc75KfH.mjs} +2 -3
- package/dist/runtime/ai.d.mts +0 -4
- package/dist/runtime/ai.mjs +6 -8
- package/dist/runtime/auth-client-react.d.mts +1 -1
- package/dist/runtime/auth-client-react.mjs +1 -1
- package/dist/runtime/auth-client-solid.d.mts +1 -1
- package/dist/runtime/auth-client-solid.mjs +1 -1
- package/dist/runtime/auth-client-svelte.d.mts +1 -1
- package/dist/runtime/auth-client-svelte.mjs +1 -1
- package/dist/runtime/auth-client-vue.d.mts +1 -1
- package/dist/runtime/auth-client-vue.mjs +1 -1
- package/dist/runtime/auth-client.d.mts +1 -1
- package/dist/runtime/auth-client.mjs +1 -1
- package/dist/runtime/auth.d.mts +1 -1
- package/dist/runtime/auth.mjs +1 -1
- package/dist/runtime/better-auth-mysql.d.mts +2 -4
- package/dist/runtime/better-auth-mysql.mjs +3 -4
- package/dist/runtime/better-auth-pg.d.mts +2 -4
- package/dist/runtime/better-auth-pg.mjs +4 -5
- package/dist/runtime/better-auth.d.mts +2 -4
- package/dist/runtime/better-auth.mjs +3 -4
- package/dist/runtime/client-react.d.mts +4 -4
- package/dist/runtime/client-react.mjs +4 -4
- package/dist/runtime/client-solid.d.mts +4 -4
- package/dist/runtime/client-solid.mjs +4 -4
- package/dist/runtime/client-svelte.d.mts +4 -4
- package/dist/runtime/client-svelte.mjs +4 -4
- package/dist/runtime/client-vue.d.mts +4 -4
- package/dist/runtime/client-vue.mjs +4 -4
- package/dist/runtime/client.d.mts +4 -4
- package/dist/runtime/client.mjs +4 -4
- package/dist/runtime/db.d.mts +0 -2
- package/dist/runtime/db.mjs +2 -3
- package/dist/runtime/durable.d.mts +0 -2
- package/dist/runtime/durable.mjs +3 -4
- package/dist/runtime/email/testing.d.mts +1 -5
- package/dist/runtime/email/testing.mjs +5 -6
- package/dist/runtime/email-protocol.d.mts +0 -2
- package/dist/runtime/email-protocol.mjs +1 -1
- package/dist/runtime/email.d.mts +1 -5
- package/dist/runtime/email.mjs +6 -7
- package/dist/runtime/env-public-client.d.mts +1 -3
- package/dist/runtime/env-public-client.mjs +2 -3
- package/dist/runtime/env-public.d.mts +2 -2
- package/dist/runtime/env-public.mjs +5 -7
- package/dist/runtime/env.d.mts +0 -4
- package/dist/runtime/env.mjs +1 -1
- package/dist/runtime/fetch-server.d.mts +1 -3
- package/dist/runtime/fetch-server.mjs +3 -4
- package/dist/runtime/fetch-stream.d.mts +2 -2
- package/dist/runtime/fetch-stream.mjs +2 -2
- package/dist/runtime/fetch.d.mts +1 -1
- package/dist/runtime/fetch.mjs +2 -2
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/handler.mjs +2 -2
- package/dist/runtime/isr.d.mts +1 -3
- package/dist/runtime/isr.mjs +2 -3
- package/dist/runtime/kv.d.mts +1 -3
- package/dist/runtime/kv.mjs +2 -3
- package/dist/runtime/limits.d.mts +1 -1
- package/dist/runtime/limits.mjs +1 -1
- package/dist/runtime/live-client.d.mts +1 -3
- package/dist/runtime/live-client.mjs +1 -2
- package/dist/runtime/live-server.d.mts +0 -2
- package/dist/runtime/live-server.mjs +3 -4
- package/dist/runtime/live.d.mts +1 -1
- package/dist/runtime/live.mjs +1 -1
- package/dist/runtime/log.d.mts +3 -3
- package/dist/runtime/log.mjs +26 -18
- package/dist/runtime/migration-handler-mysql.d.mts +2 -4
- package/dist/runtime/migration-handler-mysql.mjs +2 -3
- package/dist/runtime/migration-handler-pg.d.mts +2 -4
- package/dist/runtime/migration-handler-pg.mjs +2 -3
- package/dist/runtime/migration-handler.d.mts +1 -1
- package/dist/runtime/migration-handler.mjs +1 -1
- package/dist/runtime/queues.d.mts +1 -1
- package/dist/runtime/queues.mjs +2 -3
- package/dist/runtime/remote/binding-handler.d.mts +1 -3
- package/dist/runtime/remote/binding-handler.mjs +3 -4
- package/dist/runtime/remote/index.d.mts +1 -3
- package/dist/runtime/remote/index.mjs +8 -13
- package/dist/runtime/response.d.mts +1 -3
- package/dist/runtime/response.mjs +1 -1
- package/dist/runtime/route-url.d.mts +2 -2
- package/dist/runtime/route-url.mjs +1 -1
- package/dist/runtime/routing.d.mts +7 -10
- package/dist/runtime/routing.mjs +18 -19
- package/dist/runtime/sandbox-container.d.mts +1 -1
- package/dist/runtime/sandbox-container.mjs +1 -1
- package/dist/runtime/sandbox.d.mts +2 -2
- package/dist/runtime/sandbox.mjs +5 -6
- package/dist/runtime/seed.d.mts +0 -2
- package/dist/runtime/seed.mjs +1 -2
- package/dist/runtime/sse-client.d.mts +1 -3
- package/dist/runtime/sse-client.mjs +1 -2
- package/dist/runtime/sse.d.mts +1 -3
- package/dist/runtime/sse.mjs +1 -1
- package/dist/runtime/storage.d.mts +1 -3
- package/dist/runtime/storage.mjs +2 -3
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/validator.mjs +1 -1
- package/dist/runtime/ws-server.d.mts +3 -5
- package/dist/runtime/ws-server.mjs +3 -4
- package/dist/runtime/ws.d.mts +1 -1
- package/dist/runtime/ws.mjs +3 -4
- package/dist/{sandbox-q3waMc2T.d.mts → sandbox-DE1WsxuB.d.mts} +2 -4
- package/dist/{sandbox-container-a9LRUtii.mjs → sandbox-container-BuxhwCgt.mjs} +1 -2
- package/dist/{sandbox-container-ChQRum-j.d.mts → sandbox-container-CZFZdMso.d.mts} +0 -2
- package/dist/{scan-N9WzdcAl.mjs → scan-DSQtH3oS.mjs} +31 -25
- package/dist/{secret-3X0PxmuX.mjs → secret-C_QtTzJG.mjs} +17 -15
- package/dist/{serialize-YHvlcG3Q.mjs → serialize-DUuYuaY3.mjs} +2 -4
- package/dist/{serialize-DtR8Vwa_.d.mts → serialize-I4EmS-Wf.d.mts} +0 -2
- package/dist/{skills-CrUO3PJ0.mjs → skills-D393E4lB.mjs} +4 -5
- package/dist/{sqlite-validation-BzKMWnO4.mjs → sqlite-validation-CLJXXN93.mjs} +1 -2
- package/dist/{sse-CMvCgjNk.mjs → sse-CxR30yMF.mjs} +1 -2
- package/dist/{standard-schema-Fo_vCAZh.d.mts → standard-schema-CuDawHOC.d.mts} +0 -2
- package/dist/{static-asset-marker-Btf-6oCD.mjs → static-asset-marker-NR1XS2z5.mjs} +1 -2
- package/dist/{subcommand-prompt-D9OhhbGG.mjs → subcommand-prompt-CxJXporl.mjs} +3 -4
- package/dist/sveltekit.d.mts +0 -2
- package/dist/sveltekit.mjs +2 -3
- package/dist/{terminal-log-text-D9ACPOuG.mjs → terminal-log-text-DNsWJREL.mjs} +1 -2
- package/dist/{types-w72dljaA.d.mts → types-agfx0alu.d.mts} +0 -4
- package/dist/validate-DY1U9rET.mjs +1 -0
- package/dist/{validate-CnZPMq4q.mjs → validate-Ddzl-IwT.mjs} +4 -5
- package/dist/{validation-error-Dg9Recn1.mjs → validation-error-rDVbUJet.mjs} +2 -4
- package/dist/{validator-BTOu0fB0.mjs → validator-CTfmzZYb.mjs} +2 -5
- package/dist/{version-metadata-D2vfMQzv.mjs → version-metadata-Blf5H9BQ.mjs} +4 -6
- package/dist/{worker-conditions-AWFRcFxR.mjs → worker-conditions-CBZ0RYsZ.mjs} +1 -2
- package/dist/wrangler-CPRX2d9A.mjs +1 -0
- package/dist/{wrangler-I-scB_1t.mjs → wrangler-p-kLCJqF.mjs} +6 -8
- package/dist/{wrapper-BBl1rC32.mjs → wrapper-iejSJDwL.mjs} +17 -14
- package/dist/{ws-B3ClMVDh.d.mts → ws-DzBD-NUj.d.mts} +3 -5
- package/dist/{yarn-pnp-DLbEFMT0.mjs → yarn-pnp-DgWbE7z5.mjs} +2 -3
- package/docs/guide/database.md +4 -4
- package/docs/guide/deployment.md +1 -1
- package/docs/guide/edge/headers.md +2 -6
- package/docs/guide/edge/redirects.md +4 -4
- package/docs/guide/edge/static-assets.md +0 -10
- package/docs/guide/email/domains.md +3 -1
- package/docs/guide/email/receiving.md +3 -3
- package/docs/guide/email/sending.md +1 -1
- package/docs/guide/pages-routing/actions-and-forms.md +6 -9
- package/docs/guide/pages-routing/islands.md +2 -2
- package/docs/guide/pages-routing/loaders.md +3 -3
- package/docs/guide/pages-routing/markdown.md +6 -6
- package/docs/guide/pages-routing/overview.md +34 -27
- package/docs/guide/platform/administration/email.md +6 -8
- package/docs/guide/platform/installation/credentials.md +6 -6
- package/docs/guide/platform/installation/maintenance.md +9 -25
- package/docs/guide/platform/installation/prerequisites.md +1 -1
- package/docs/guide/platform/installation/setup.md +1 -1
- package/docs/guide/platform/installation/uninstall.md +1 -1
- package/docs/guide/queues.md +4 -8
- package/docs/guide/self-hosted-platform.md +3 -3
- package/docs/guide/server-routing.md +7 -7
- package/docs/guide/type-safety.md +42 -0
- package/docs/guide/typed-fetch.md +1 -1
- package/docs/guide/websockets.md +1 -1
- package/docs/integrations/cloudflare.md +2 -2
- package/docs/integrations/frameworks/analog.md +1 -1
- package/docs/integrations/frameworks/nuxt.md +1 -1
- package/docs/integrations/frameworks/sveltekit.md +1 -1
- package/docs/integrations/frameworks/tanstack-start.md +1 -1
- package/docs/integrations/hono.md +5 -5
- package/docs/reference/api/auth.md +1 -1
- package/docs/reference/api/deploy.md +6 -6
- package/docs/reference/api/pages.md +9 -1
- package/docs/reference/api/plugin.md +4 -4
- package/docs/reference/api/resources.md +4 -1
- package/docs/reference/api/rewrites.md +20 -2
- package/docs/reference/api/types.md +41 -0
- package/docs/reference/api.md +2 -2
- package/docs/reference/cli/database.md +15 -9
- package/docs/reference/cli/email.md +4 -2
- package/docs/reference/cli/platform-installation.md +2 -2
- package/docs/reference/cli/project.md +2 -2
- package/docs/reference/cli/secrets.md +3 -1
- package/docs/reference/cli/setup.md +3 -3
- package/docs/reference/cli.md +1 -1
- package/docs/reference/config.md +2 -2
- package/package.json +35 -32
- package/sandbox.Dockerfile +1 -1
- package/dist/cf-build-output-bd8Uwv1P.mjs +0 -1
- package/dist/client-BZb9j66F.mjs +0 -1
- package/dist/collect-BWhkgtAn.mjs +0 -1
- package/dist/deploy-CX94CmKa.mjs +0 -2
- package/dist/discover-D4TPKo57.mjs +0 -1
- package/dist/gen-BhWBT4iu.mjs +0 -1
- package/dist/help-qOZr3wng.mjs +0 -1
- package/dist/login-BAPmYnb7.mjs +0 -1
- package/dist/migrate-BIYTPQE6.mjs +0 -1
- package/dist/operator-cmd-CjazwOyb.mjs +0 -1
- package/dist/output-BW9uK099.mjs +0 -1
- package/dist/plan-CKX_jWnD.mjs +0 -1
- package/dist/platform-args-BC8_hsDj.mjs +0 -1
- package/dist/prepare-DU-tOpS5.mjs +0 -1
- package/dist/project-slug-6cyz8E7k.mjs +0 -1
- package/dist/resolve-project-DD1vu8s9.mjs +0 -1
- package/dist/route-url-BgPja1GS.d.mts +0 -5
- package/dist/route-url-BjGv_KKY.mjs +0 -28
- package/dist/validate-D7Wn8PUX.mjs +0 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
122
|
-
3. Run the resume command
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -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
|
|
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
|
|
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
|
package/docs/guide/queues.md
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 |
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
package/docs/guide/websockets.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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()`
|
|
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
|
|
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
|
-
|
|
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`. |
|