void 1.4.0 → 1.6.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-DRhmCWcm.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-HRFsZOv3.mjs} +18 -24
- package/dist/{application-routing-4719u_kf.mjs → application-routing-P4TggvWp.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-CVXP1G6G.mjs} +7 -8
- package/dist/{auth-migrations-BO27GDNr.mjs → auth-migrations-DDeifS3v.mjs} +1 -2
- package/dist/{auth-router-vafo7x8w.mjs → auth-router-D1pGdbvB.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-C958aM7W.mjs} +31 -7
- package/dist/{build-cmd-9vUAQ1_V.mjs → build-cmd-DmjbuT6d.mjs} +7 -8
- package/dist/{cache-jvwLNb0h.mjs → cache-2khBO1MR.mjs} +7 -8
- package/dist/{cancel-deploy-Dw0UmWKO.mjs → cancel-deploy-_itbbvY3.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-CEtr5UOR.mjs +1 -0
- package/dist/{client-B3LnB_bE.mjs → client-CoxPEhJq.mjs} +15 -13
- package/dist/{cloudflare-auth-DyD_kVFr.mjs → cloudflare-auth-CEu-1Ps_.mjs} +2 -3
- package/dist/{cloudflare-cmd-D-b_u3T4.mjs → cloudflare-cmd-fZ6AMSWk.mjs} +7 -8
- package/dist/{cloudflare-config-CH1AylZT.mjs → cloudflare-config-eQunqX6A.mjs} +22 -17
- package/dist/{cloudflare-connect-zTJh8UnN.mjs → cloudflare-connect-9OZe4XVQ.mjs} +5 -6
- package/dist/{cloudflare-operations-Bc-7fN44.mjs → cloudflare-operations-CrskD4_O.mjs} +8 -9
- package/dist/{cloudflare-operations-BtulCNOg.mjs → cloudflare-operations-oLvAd9Nd.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-tqMM6DwY.mjs → config-BBlVXZCU.mjs} +5 -6
- package/dist/{config-OFOAimzt.mjs → config-BITKQ3O6.mjs} +5 -5
- package/dist/{config-BV2ASlpn.mjs → config-BgysUhnm.mjs} +1 -1
- package/dist/{config-CAdZVTLN.d.mts → config-CPxJmt4M.d.mts} +4 -6
- 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-CKvmkl2R.mjs} +10 -11
- package/dist/{create-project-C2K0DN2O.mjs → create-project-BiMmR5wA.mjs} +1 -1
- package/dist/{create-project-Bxd02EHN.mjs → create-project-Bq0M8MtO.mjs} +9 -11
- 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-cq5RW4Vy.mjs} +52 -54
- package/dist/{db-types-0eCiqYb1.mjs → db-types-C_8amnB0.mjs} +3 -4
- package/dist/{delete-lETE6Tpt.mjs → delete-CY4L8fi2.mjs} +7 -8
- package/dist/deploy-B029oHlE.mjs +2 -0
- package/dist/{deploy-CdM-LAxX.mjs → deploy-D_gEojD2.mjs} +144 -136
- package/dist/{deploy-managed-static-DjeBFG2c.mjs → deploy-managed-static-BHVbB_-A.mjs} +33 -40
- package/dist/{deploy-transport-DIq_gFTP.mjs → deploy-transport-DEyOUfac.mjs} +6 -7
- package/dist/deploy.d.mts +1 -3
- package/dist/deploy.mjs +11 -11
- package/dist/{dev-inbox-D0jxye_D.mjs → dev-inbox-CUUS6iUg.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-BNLB5_Gm.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-BlH90Ods.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-Bkq8ZL1p.mjs} +14 -15
- package/dist/{email-cloudflare-PMbAev9Q.mjs → email-cloudflare-MvJIxrwx.mjs} +18 -123
- 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-AvuCSeCH.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-BD-dfjxY.mjs} +12 -13
- package/dist/gen-CIHXh9I8.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-CA-lBdkn.mjs} +8 -9
- package/dist/{handler-BHktmuTL.d.mts → handler-BR6Tvjkp.d.mts} +18 -26
- package/dist/{handler-BZ1t7-Rv.mjs → handler-CKeTtYID.mjs} +6 -17
- 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-CuTEdP9C.mjs +445 -0
- package/dist/{help-CKbrhZha.mjs → help-1OCFDsRr.mjs} +28 -12
- package/dist/help-Ba8Dq5-r.mjs +1 -0
- package/dist/{inbound-Da7XsjH3.d.mts → inbound-BHt4dIlL.d.mts} +16 -9
- package/dist/{inbound-VrOLqwZY.mjs → inbound-CdO-qY0w.mjs} +6 -81
- package/dist/index.d.mts +23 -13
- package/dist/index.mjs +495 -223
- package/dist/{info-Yg0-V5Rs.mjs → info-CJxua_db.mjs} +6 -7
- package/dist/{init-CDiJQycf.mjs → init-B-4CluYx.mjs} +43 -59
- package/dist/{isr-config-fZaJJ8t7.mjs → isr-config-Czzb4mIq.mjs} +5 -55
- 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-DAXOT-G_.mjs} +8 -9
- package/dist/{list-BYRP6am0.mjs → list-BYSOo9fm.mjs} +8 -9
- package/dist/{live-BllfDuzA.d.mts → live-0xrcVpyq.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-BLgsNUj9.mjs} +4 -5
- package/dist/{log-BMwmN5Ae.mjs → log-D9hwSySP.mjs} +3 -4
- package/dist/login-BpbYeu-n.mjs +1 -0
- package/dist/{login-PcFy5mlC.mjs → login-CJopTWX4.mjs} +6 -7
- package/dist/{logs-DmJTBhed.mjs → logs-DE0weBsR.mjs} +19 -18
- package/dist/{migrate-B8S2xTcb.mjs → migrate-ChHHZBTi.mjs} +20 -16
- package/dist/migrate-HdA6Kh2p.mjs +1 -0
- 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-CtP6-qAF.mjs} +145 -18
- 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-CZ6lGNLn.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-DmkmS2wL.mjs → operator-cmd-BUqsdk2K.mjs} +32 -15
- package/dist/operator-cmd-wBYyp8iQ.mjs +1 -0
- 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 +147 -31
- package/dist/pages/client.mjs +199 -43
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/head.mjs +1 -1
- package/dist/pages/index.d.mts +25 -18
- package/dist/pages/index.mjs +24 -12
- package/dist/pages/islands-plugin.d.mts +75 -13
- package/dist/pages/islands-plugin.mjs +92 -7
- package/dist/pages/prefetch.d.mts +2 -2
- 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-C7XUw9mw.mjs +1 -0
- package/dist/{platform-args-BMD2gjc_.mjs → platform-args-Cx1M-7bq.mjs} +22 -11
- package/dist/{platform-auth-config-CImnfohz.mjs → platform-auth-config-K4m_LE8b.mjs} +10 -11
- package/dist/{platform-auth-protection-BogLhtHi.mjs → platform-auth-protection-KF5Vo-1I.mjs} +10 -11
- package/dist/{platform-auth-recovery-B-mEaWEi.mjs → platform-auth-recovery-BOdFrl7R.mjs} +9 -11
- package/dist/{platform-cmd-CV8NxIIn.mjs → platform-cmd-DpCHawGF.mjs} +1 -1
- package/dist/{platform-cmd-DZK2ixMl.mjs → platform-cmd-Ds3EAV5t.mjs} +13 -13
- package/dist/{platform-discovery-CHhNs8Nn.mjs → platform-discovery-B0eZjZ3B.mjs} +2 -3
- package/dist/{platform-domain-CRvelPGE.mjs → platform-domain-rWJshybd.mjs} +7 -8
- package/dist/{platform-lifecycle-DwXq7kZt.mjs → platform-lifecycle-BH34I0rh.mjs} +1 -1
- package/dist/{platform-lifecycle-CPYY7E9B.mjs → platform-lifecycle-D9RdGub1.mjs} +110 -110
- package/dist/{platform-management-BOnGbMSM.mjs → platform-management-BRefdHGD.mjs} +27 -11
- package/dist/{platform-management-lXdgGgAM.mjs → platform-management-BfLW0Zlo.mjs} +1 -1
- package/dist/{platform-plans-config-CeydDSj0.mjs → platform-plans-config-Dx1agneU.mjs} +5 -6
- package/dist/{platform-recovery-noaALXnE.mjs → platform-recovery-DZuZGJtt.mjs} +5 -6
- package/dist/{platform-registry-B9mWX9LO.mjs → platform-registry-DZ_2Xuqd.mjs} +4 -6
- package/dist/platform-runtime-logs-CdJGnk3f.mjs +68 -0
- package/dist/{platform-setup-Ca53gtt0.mjs → platform-setup-Vw1AaUN8.mjs} +19 -7
- package/dist/{plugin-inference-CeiB6BG5.mjs → plugin-inference-CdLbxZL_.mjs} +16 -24
- package/dist/{prefetch-Bsc_Pb6c.mjs → prefetch-Dx2jIbtg.mjs} +20 -3
- package/dist/{prefetch-Ce6la4EI.d.mts → prefetch-NdNeubbH.d.mts} +7 -3
- package/dist/{prepare-D604Yiyr.mjs → prepare-BJW-f1f1.mjs} +13 -14
- package/dist/{prepare-BuOS18AM.mjs → prepare-BMGeKL16.mjs} +4 -5
- package/dist/prepare-BdxJJCMv.mjs +1 -0
- 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-B_bUyZ3J.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-MjT5K4rQ.mjs} +7 -8
- package/dist/{project-token-BB6PwaA9.mjs → project-token-BKHGwY3k.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-Bzdd05-h.mjs} +7 -8
- package/dist/{protocol-DimNxVRr.mjs → protocol-COyySMki.mjs} +135 -113
- package/dist/{protocol-D5XDySYu.d.mts → protocol-CkwjASep.d.mts} +4 -6
- 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-BbCzpbXs.mjs} +6 -7
- package/dist/{provision-DfxLCg-d.mjs → provision-DQF6Kw-6.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-daJmVpjk.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-BgL0wY1J.mjs} +7 -8
- package/dist/{rolldown-runtime-3h0WiCiA.mjs → rolldown-runtime-uD8oG6U2.mjs} +1 -2
- package/dist/{route-types-DvEGmPif.mjs → route-types-CZc1YXjF.mjs} +80 -9
- package/dist/route-url-CRDF-I0I.mjs +57 -0
- package/dist/route-url-C_YIH_zO.d.mts +37 -0
- package/dist/routes-stub.d.mts +8 -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 +8 -11
- package/dist/runtime/routing.mjs +52 -32
- 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-X2rDDRNa.mjs} +49 -35
- package/dist/{secret-3X0PxmuX.mjs → secret-CPq-B_vp.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-DsQKz6lt.mjs} +9 -3
- 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-uAAjlsiW.mjs +82 -0
- package/dist/{validator-BTOu0fB0.mjs → validator-CTfmzZYb.mjs} +2 -5
- package/dist/{version-metadata-D2vfMQzv.mjs → version-metadata-C8hLzQkv.mjs} +4 -6
- package/dist/{worker-conditions-AWFRcFxR.mjs → worker-conditions-CBZ0RYsZ.mjs} +1 -2
- package/dist/{wrangler-I-scB_1t.mjs → wrangler-DESSbN8L.mjs} +6 -8
- package/dist/wrangler-DUB3MGHV.mjs +1 -0
- package/dist/{wrapper-BBl1rC32.mjs → wrapper-C9SUxoj7.mjs} +17 -14
- package/dist/{ws-B3ClMVDh.d.mts → ws-Dmjg5NH2.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 +4 -6
- package/docs/guide/edge/redirects.md +4 -4
- package/docs/guide/edge/rewrites.md +1 -1
- package/docs/guide/edge/static-assets.md +0 -10
- package/docs/guide/email/domains.md +3 -1
- package/docs/guide/email/receiving.md +4 -4
- package/docs/guide/email/sending.md +43 -13
- package/docs/guide/pages-routing/actions-and-forms.md +26 -9
- package/docs/guide/pages-routing/islands.md +5 -5
- package/docs/guide/pages-routing/layouts.md +16 -2
- package/docs/guide/pages-routing/loaders.md +5 -5
- package/docs/guide/pages-routing/markdown.md +7 -7
- package/docs/guide/pages-routing/overview.md +137 -27
- package/docs/guide/platform/administration/connected-apps.md +4 -2
- package/docs/guide/platform/administration/email.md +6 -8
- package/docs/guide/platform/installation/credentials.md +12 -10
- package/docs/guide/platform/installation/maintenance.md +18 -21
- package/docs/guide/platform/installation/prerequisites.md +1 -1
- package/docs/guide/platform/installation/setup.md +23 -2
- 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/ssg.md +3 -3
- package/docs/guide/type-safety.md +84 -1
- 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/astro.md +17 -12
- package/docs/integrations/frameworks/nuxt.md +1 -1
- package/docs/integrations/frameworks/overview.md +2 -2
- 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 +109 -50
- package/docs/reference/api/plugin.md +4 -4
- package/docs/reference/api/resources.md +4 -1
- package/docs/reference/api/rewrites.md +24 -3
- package/docs/reference/api/types.md +45 -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 +6 -3
- package/docs/reference/cli/project.md +2 -2
- package/docs/reference/cli/secrets.md +3 -1
- package/docs/reference/cli/setup.md +4 -4
- package/docs/reference/cli.md +1 -1
- package/docs/reference/config.md +12 -2
- package/package.json +36 -32
- package/sandbox.Dockerfile +1 -1
- package/schema.json +4 -0
- package/skills/void/SKILL.md +5 -0
- 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/headers--vaK_chu.mjs +0 -226
- 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/validation-error-Dg9Recn1.mjs +0 -49
- package/dist/wrangler-UnwdISay.mjs +0 -1
|
@@ -8,7 +8,7 @@ Keep one password-manager entry for this platform. Paste the saved values into t
|
|
|
8
8
|
|
|
9
9
|
| Credential | Created by | Why the platform needs it |
|
|
10
10
|
| -------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
11
|
-
| Management API token | You, in Cloudflare | Lets the CLI change DNS and
|
|
11
|
+
| Management API token | You, in Cloudflare | Lets the CLI create a zone, change DNS, and set up Access. |
|
|
12
12
|
| Runtime API token | You, in Cloudflare | Stored as a Worker secret so the platform can deploy apps after you close your terminal. |
|
|
13
13
|
| PostgreSQL URL | You, with your database provider | Stores platform users, projects, and deployments. |
|
|
14
14
|
| Login provider client ID and secret | You, or Void for Access login | Signs people in to the platform. |
|
|
@@ -20,11 +20,13 @@ Keep one password-manager entry for this platform. Paste the saved values into t
|
|
|
20
20
|
|
|
21
21
|
## Cloudflare API Tokens {#runtime-token-permissions}
|
|
22
22
|
|
|
23
|
-
For a domain installation or Cloudflare Access setup, the installer guides you through creating
|
|
23
|
+
For a domain installation or Cloudflare Access setup, the installer guides you through creating tokens using Cloudflare's [API token setup](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/): a runtime token, and a separate management token when the installation creates the zone or its wildcard DNS record, or sets up Access. Its links preselect the permissions and suggest names based on your platform's display name, but Cloudflare's form cannot preselect a zone: for a domain installation, change the zone policy from **All Domains** to **Specified Domains** and select your zone. If Void will create the zone, keep **All Domains** on both tokens: the zone does not exist yet, and the runtime token needs it to purge cache. Save the tokens in your password manager and paste them into the masked CLI prompts.
|
|
24
24
|
|
|
25
25
|
For workers.dev testing with the default API hostname, browser login can authorize
|
|
26
|
-
infrastructure setup.
|
|
27
|
-
|
|
26
|
+
infrastructure setup. So can a domain installation on an existing zone whose
|
|
27
|
+
`*.<application domain>` record is already proxied. Void also checks account-wide
|
|
28
|
+
Access requirements; if the current credential cannot read them, the installer
|
|
29
|
+
asks for a scoped Access token.
|
|
28
30
|
Protected apps and public apps under Default-Deny need an ongoing app-management
|
|
29
31
|
token, stored encrypted. Access setup requires a management token even on
|
|
30
32
|
workers.dev. Skip zone permissions until you add a domain.
|
|
@@ -70,7 +72,7 @@ Void checks access before provisioning. If it reports a missing permission, upda
|
|
|
70
72
|
|
|
71
73
|
Choose a shared sender domain and its Cloudflare zone ID. The mail zone may differ from the application zone, but it must belong to the platform's Cloudflare account.
|
|
72
74
|
|
|
73
|
-
Before
|
|
75
|
+
Before enabling platform email, configure [Cloudflare Email Routing](https://developers.cloudflare.com/email-service/get-started/route-emails/) for the shared sender domain. For a subdomain, add it under **Email Routing → Settings → Subdomains**. Let Cloudflare add the required MX and SPF records, then confirm that the domain's MX records point to Cloudflare.
|
|
74
76
|
|
|
75
77
|
Enabling email lets administrators [register email domains for projects](/guide/platform/administration/email#registering-email-domains-for-projects) and lets projects register destination addresses through the runtime token. The runtime token needs these permissions:
|
|
76
78
|
|
|
@@ -86,7 +88,7 @@ The zone permissions must include each zone that will carry mail, including the
|
|
|
86
88
|
|
|
87
89
|
For a new installation, set `VOID_EMAIL_SENDER_DOMAIN` and `VOID_EMAIL_SHARED_ZONE_ID` before `void platform install`. The runtime-token link then preselects these permissions.
|
|
88
90
|
|
|
89
|
-
For an existing installation,
|
|
91
|
+
For an existing installation, edit its runtime token's permissions in Cloudflare, or supply a replacement with `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN`. Then run:
|
|
90
92
|
|
|
91
93
|
```sh
|
|
92
94
|
VOID_EMAIL_SENDER_DOMAIN=mail.example.com \
|
|
@@ -94,13 +96,13 @@ VOID_EMAIL_SHARED_ZONE_ID=your-zone-id \
|
|
|
94
96
|
void platform upgrade your-installation-id
|
|
95
97
|
```
|
|
96
98
|
|
|
97
|
-
Void
|
|
99
|
+
Void saves this domain and zone for later upgrades. Choose them for the lifetime of the installation.
|
|
98
100
|
|
|
99
|
-
|
|
101
|
+
If setup reports a missing permission, add it to the runtime token and rerun the command. Select all permissions in the table, including Edit access and Email Sending.
|
|
100
102
|
|
|
101
|
-
|
|
103
|
+
When maintaining the platform from another machine, set `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN` to the current runtime token so the CLI checks its permissions.
|
|
102
104
|
|
|
103
|
-
The installer
|
|
105
|
+
The installer configures the email gateway and shared mail route. If setup fails, fix the reported permission, DNS, or routing problem and rerun the command. Resume a fresh installation with `void platform install --resume --name <installation-id>`.
|
|
104
106
|
|
|
105
107
|
## R2 Upload Credentials
|
|
106
108
|
|
|
@@ -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
|
|
|
@@ -147,31 +147,28 @@ Let running rotations finish before you roll back. If an older proxy runs next t
|
|
|
147
147
|
|
|
148
148
|
:::
|
|
149
149
|
|
|
150
|
-
###
|
|
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.
|
|
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:
|
|
150
|
+
### Change runtime logs {#runtime-logs}
|
|
155
151
|
|
|
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.
|
|
152
|
+
Switch an installed platform between [full and minimal runtime logs](/guide/platform/installation/setup#runtime-logs) with an upgrade:
|
|
158
153
|
|
|
159
|
-
|
|
154
|
+
```sh
|
|
155
|
+
void platform upgrade [id] --runtime-logs minimal
|
|
156
|
+
void platform upgrade [id] --runtime-logs full
|
|
157
|
+
```
|
|
160
158
|
|
|
161
|
-
|
|
159
|
+
Later upgrades keep the setting. The upgrade also changes Workers Logs on the projects' existing deployments. If that step fails, the upgrade still finishes and prints what to run next: `void platform repair [id]` after switching to minimal, or the same upgrade again after switching to full. Records stored before the change are not removed; they expire with Cloudflare's retention.
|
|
162
160
|
|
|
163
|
-
|
|
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.
|
|
161
|
+
While runtime logs are minimal, `void platform rollback` refuses a runtime that does not support the setting. Run `void platform upgrade [id] --runtime-logs full` first.
|
|
165
162
|
|
|
166
|
-
|
|
163
|
+
### Platform Workers changed outside Void {#workers-changed-outside-void}
|
|
167
164
|
|
|
168
|
-
|
|
165
|
+
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`.
|
|
169
166
|
|
|
170
|
-
|
|
167
|
+
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.
|
|
171
168
|
|
|
172
|
-
|
|
169
|
+
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.
|
|
173
170
|
|
|
174
|
-
If
|
|
171
|
+
If traffic was already paused by an earlier failed run, follow [Upgrade the platform](#upgrade-the-platform) to resume it.
|
|
175
172
|
|
|
176
173
|
### Follow upgrade and rollback progress
|
|
177
174
|
|
|
@@ -12,7 +12,7 @@ For workers.dev testing, start the interactive install and choose your login met
|
|
|
12
12
|
void platform install --workers-dev
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
When a domain installation creates the zone or its wildcard DNS record, or you set up Access, Void guides you to create a management API token and paste it into a masked prompt. Browser login can preview DNS and use an existing proxied `*.<application domain>` record, but cannot change DNS or configure Access. The token-creation link preselects the permissions for your choices. When using an existing domain, change the zone policy from **All Domains** to **Specified Domains** and select your zone, as the CLI prompt describes. No shell environment variable is needed for interactive installation.
|
|
16
16
|
|
|
17
17
|
::: details Use an existing management token from the shell
|
|
18
18
|
|
|
@@ -93,6 +93,25 @@ Keep the file’s existing `connections` configuration. For `mode: "platform"`,
|
|
|
93
93
|
same-account identity and policy selections are reused. Headless setup requires an
|
|
94
94
|
explicit app-management token; it never silently retains an installer-only token.
|
|
95
95
|
|
|
96
|
+
## Choose what runtime logs record {#runtime-logs}
|
|
97
|
+
|
|
98
|
+
By default, the platform records each request's URL, console output, and exception messages. Project owners see them with `void project logs`, and administrators with `void platform deployment logs`. They are kept in your Cloudflare account, in Workers Logs and in the platform's log history.
|
|
99
|
+
|
|
100
|
+
If your apps can put personal data in URLs, logs, or error messages, install with minimal runtime logs:
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
void platform install --runtime-logs minimal
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
With minimal runtime logs:
|
|
107
|
+
|
|
108
|
+
- Platform and project Workers do not send anything to Workers Logs.
|
|
109
|
+
- Log history keeps each request's time, method, status, outcome, deployment, log levels, and exception names, but not its URL, log messages, or exception messages.
|
|
110
|
+
- `--level` filters still work. `--filter` can match exception names, but not the messages that are no longer recorded.
|
|
111
|
+
- Log views say that messages and URLs are not recorded on this platform.
|
|
112
|
+
|
|
113
|
+
The setting covers the whole platform. To change it later, see [Change runtime logs](/guide/platform/installation/maintenance#runtime-logs).
|
|
114
|
+
|
|
96
115
|
## Finish login configuration
|
|
97
116
|
|
|
98
117
|
For Google, create an OAuth client and register the printed callback URL. You
|
|
@@ -260,6 +279,8 @@ You can also rerun `void platform install` and choose **Continue setup** for an
|
|
|
260
279
|
|
|
261
280
|
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
281
|
|
|
263
|
-
If Cloudflare rejects a saved runtime token
|
|
282
|
+
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.
|
|
283
|
+
|
|
284
|
+
To replace the runtime token, for example after revoking it, resume with the new token in `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN`. Void checks it, saves it, and updates the platform Workers that the interrupted run already deployed.
|
|
264
285
|
|
|
265
286
|
:::
|
|
@@ -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) => ({
|
package/docs/guide/ssg.md
CHANGED
|
@@ -58,8 +58,8 @@ With the default `output: "server"`, use `export const prerender = true` for dep
|
|
|
58
58
|
|
|
59
59
|
`void deploy` chooses the deployment automatically:
|
|
60
60
|
|
|
61
|
-
- **Fully static:** if every page is prerendered and there are no API routes, middleware, cron jobs, or queues, Void deploys as a
|
|
62
|
-
- **Hybrid:** if any pages are not prerenderable, such as dynamic pages without `getPrerenderPaths()` or pages with `export const prerender = false`, a
|
|
61
|
+
- **Fully static:** if every page is prerendered and there are no API routes, middleware, cron jobs, or queues, Void deploys the built files as a static site. With `--platform cloudflare`, pages and files are served without running a Worker. If you use [edge rules](./edge/headers.md) (`routing` headers, redirects, rewrites, fallbacks, or `alwaysUseHttps`) or a `_headers` or `_redirects` file in `public/`, a small Worker runs on every request to apply them.
|
|
62
|
+
- **Hybrid:** if any pages are not prerenderable, such as dynamic pages without `getPrerenderPaths()` or pages with `export const prerender = false`, a Worker is deployed to handle those routes at runtime. With `--platform cloudflare`, prerendered pages without a `.server.ts` file are served as static files without running the Worker. API routes, pages with a `.server.ts` file, and dynamic pages run in the Worker. Every page runs through the Worker when the app uses middleware, auth, live updates, edge rules (including a `_headers` or `_redirects` file in `public/`), a custom Vite `base`, a `routing.notFound` setting other than `"none"`, or a dynamic page at the top level of `pages/`, such as `pages/[slug].vue`.
|
|
63
63
|
|
|
64
64
|
## Relationship to `inference.appType: "static"`
|
|
65
65
|
|
|
@@ -68,5 +68,5 @@ The `inference.appType` field describes app type (SPA, static, void), while `out
|
|
|
68
68
|
| | `inference.appType: "static"` | `output: "static"` |
|
|
69
69
|
| ------------ | ----------------------------------------------- | --------------------------------------------- |
|
|
70
70
|
| **What** | Deploy a pre-built static site (no Void plugin) | Prerender a Void app at build time |
|
|
71
|
-
| **Worker** | None (static assets only) | Only
|
|
71
|
+
| **Worker** | None (static assets only) | Only for server code and edge rules |
|
|
72
72
|
| **Use case** | VitePress, plain HTML, external SSG tools | Void apps with mostly or fully static content |
|
|
@@ -65,7 +65,7 @@ export const loader = defineHandler(async (c) => {
|
|
|
65
65
|
<!-- pages/users/index.vue -->
|
|
66
66
|
<script setup lang="ts">
|
|
67
67
|
import type { Props } from './index.server';
|
|
68
|
-
defineProps<Props>(); // ←
|
|
68
|
+
const { users } = defineProps<Props>(); // ← users: { id: number; name: string; ... }[]
|
|
69
69
|
</script>
|
|
70
70
|
```
|
|
71
71
|
|
|
@@ -102,6 +102,87 @@ 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
|
+
### Checked URL strings
|
|
145
|
+
|
|
146
|
+
[`routing.typedRoutes`](../reference/config.md#routing-typedroutes) checks plain URL strings in `Link`'s `href`, `router.visit()`, `router.prefetch()`, `router.flush()`, and `c.rewrite()`. Apps created with `void init` have it on. To turn it on in an existing app:
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
// void.config.ts
|
|
150
|
+
import { defineConfig } from 'void/config';
|
|
151
|
+
|
|
152
|
+
export default defineConfig({
|
|
153
|
+
routing: { typedRoutes: true },
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
A string must then match one of your routes, optionally followed by a query string or hash:
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
<Link href="/about">About</Link>
|
|
161
|
+
<Link href={`/users/${user.id}?tab=activity`}>Profile</Link>
|
|
162
|
+
<Link href={routeUrl('/users/:id', { params: { id } })}>Profile</Link>
|
|
163
|
+
<Link href="/abuot">About</Link> // Type error: no route matches
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Links can also point to the current page (`?page=2`, `#comments`) and to `http://`, `https://`, `mailto:`, and `tel:` URLs. Relative paths such as `../settings` are rejected; use the absolute path. A fixed part with spaces or non-ASCII characters can be written as is (`/café menu`) or percent-encoded in uppercase, as `routeUrl()` returns it (`/caf%C3%A9%20menu`). A dynamic segment matches any text, including none, so `/users/:id` also accepts `/users/` and `/users/42/edit`. With a root dynamic page such as `pages/[slug].tsx`, a protocol-relative URL like `//example.com` passes too.
|
|
167
|
+
|
|
168
|
+
`void/routes` exports two types for these strings:
|
|
169
|
+
|
|
170
|
+
- `RouteUrl`: the URL of one of your routes. `routeUrl()` returns it, and `c.rewrite()` accepts it.
|
|
171
|
+
- `Href`: anything a link can point to: a `RouteUrl`, a same-page query or hash, or an external URL.
|
|
172
|
+
|
|
173
|
+
Cast a string that TypeScript can't check, such as a path from your CMS or a file in `public/`:
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
import type { Href, RouteUrl } from 'void/routes';
|
|
177
|
+
|
|
178
|
+
<Link href={post.path as RouteUrl}>{post.title}</Link>
|
|
179
|
+
<Link href={user.website as Href}>Website</Link>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Restart the dev server or run `void prepare` after changing `routing.typedRoutes`.
|
|
183
|
+
|
|
184
|
+
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.
|
|
185
|
+
|
|
105
186
|
## What Gets Checked
|
|
106
187
|
|
|
107
188
|
| Layer | What's type-checked |
|
|
@@ -109,6 +190,8 @@ The `action()` helper gets the same type checking. See [Actions & Forms](./pages
|
|
|
109
190
|
| Database | Table columns, value types, insert/update shapes from Drizzle schema |
|
|
110
191
|
| Handlers | `c.env` bindings, validator input, return type |
|
|
111
192
|
| Fetch client | Route paths, HTTP methods, `body`/`query`/`params`, response type |
|
|
193
|
+
| Navigation | Route patterns and required parameter names and values in `routeUrl()` and destination objects |
|
|
194
|
+
| Links | With `routing.typedRoutes`, URL strings in `Link`, router methods, and `c.rewrite()` |
|
|
112
195
|
| `useForm` | Action URLs, `data` fields, `errors` keys, `reset()` args (including `{ initial: true }`), `params`, `resetOnSuccess` |
|
|
113
196
|
| `action()` | Action URLs, `data` payload, `params` |
|
|
114
197
|
|
|
@@ -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 () => {
|
|
@@ -6,9 +6,9 @@ outline: deep
|
|
|
6
6
|
|
|
7
7
|
Use Void with [Astro](https://astro.build/) for resource detection, typed database queries, and migrations. Astro keeps its own build and Cloudflare integration; Void plugs into its Vite configuration.
|
|
8
8
|
|
|
9
|
-
::: warning Astro
|
|
9
|
+
::: warning Astro 7 required
|
|
10
10
|
|
|
11
|
-
- [Astro
|
|
11
|
+
- [Astro 7+](https://astro.build/blog/astro-7/) is required because Void needs Vite 8.
|
|
12
12
|
- You also need to enable `"nodejs_als"` under `compatibility_flags` in your Cloudflare config.
|
|
13
13
|
:::
|
|
14
14
|
|
|
@@ -67,16 +67,15 @@ void deploy
|
|
|
67
67
|
|
|
68
68
|
## Using Void Features
|
|
69
69
|
|
|
70
|
-
Most [Void platform features](../../guide/app-types.md#void-apps) work with Astro in both local dev and production when using Astro
|
|
70
|
+
Most [Void platform features](../../guide/app-types.md#void-apps) work with Astro in both local dev and production when using Astro 7+ with `nodejs_als`.
|
|
71
71
|
|
|
72
72
|
Void-managed auth is not supported in framework mode yet. Use Better Auth's official Astro integration directly for now.
|
|
73
73
|
|
|
74
|
-
Pages that access runtime bindings must opt out of prerendering:
|
|
74
|
+
Pages and API routes that access runtime bindings must opt out of prerendering:
|
|
75
75
|
|
|
76
76
|
```astro
|
|
77
77
|
---
|
|
78
78
|
export const prerender = false;
|
|
79
|
-
// now Astro.locals.runtime is available
|
|
80
79
|
---
|
|
81
80
|
```
|
|
82
81
|
|
|
@@ -89,6 +88,8 @@ import { users } from '@schema';
|
|
|
89
88
|
import type { APIRoute } from 'astro';
|
|
90
89
|
import { db } from 'void/db';
|
|
91
90
|
|
|
91
|
+
export const prerender = false;
|
|
92
|
+
|
|
92
93
|
export const GET: APIRoute = async () => {
|
|
93
94
|
const rows = await db.select().from(users);
|
|
94
95
|
return Response.json(rows);
|
|
@@ -105,18 +106,20 @@ Declare variables in `env.ts` and read them with `import { env } from "void/env"
|
|
|
105
106
|
|
|
106
107
|
Void always uses `VITE_*` for client-exposed schema keys, including in Astro projects. Astro's separate `PUBLIC_*` convention still applies to direct `import.meta.env` access, but it does not change the `void/env` server/client boundary.
|
|
107
108
|
|
|
108
|
-
`void/env` replaces [`astro:env`](https://docs.astro.build/en/guides/environment-variables/)
|
|
109
|
+
`void/env` replaces [`astro:env`](https://docs.astro.build/en/guides/environment-variables/) for env-var access. Use `env` from `cloudflare:workers` when you need raw binding access (D1, KV, R2, etc.).
|
|
109
110
|
|
|
110
111
|
## Accessing Bindings Directly
|
|
111
112
|
|
|
112
|
-
Access bindings
|
|
113
|
+
Access bindings with `env` from `cloudflare:workers` (works in both dev and production):
|
|
113
114
|
|
|
114
115
|
```ts
|
|
115
116
|
import type { APIRoute } from 'astro';
|
|
117
|
+
import { env } from 'cloudflare:workers';
|
|
118
|
+
|
|
119
|
+
export const prerender = false;
|
|
116
120
|
|
|
117
|
-
export const GET: APIRoute = async (
|
|
118
|
-
const {
|
|
119
|
-
const { results } = await DB.prepare('SELECT * FROM users').all();
|
|
121
|
+
export const GET: APIRoute = async () => {
|
|
122
|
+
const { results } = await env.DB.prepare('SELECT * FROM users').all();
|
|
120
123
|
return Response.json(results);
|
|
121
124
|
};
|
|
122
125
|
```
|
|
@@ -125,8 +128,10 @@ In `.astro` pages (remember to set `prerender = false`):
|
|
|
125
128
|
|
|
126
129
|
```astro
|
|
127
130
|
---
|
|
131
|
+
import { env } from 'cloudflare:workers';
|
|
132
|
+
|
|
128
133
|
export const prerender = false;
|
|
129
|
-
|
|
130
|
-
const { results } = await DB.prepare("SELECT * FROM users").all();
|
|
134
|
+
|
|
135
|
+
const { results } = await env.DB.prepare("SELECT * FROM users").all();
|
|
131
136
|
---
|
|
132
137
|
```
|
|
@@ -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 () => {
|