void 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +3 -1
  2. package/dist/{account-cmd-l-FM7Ioq.mjs → account-cmd-Ci00cncT.mjs} +5 -5
  3. package/dist/{agents-B_pX_HmQ.mjs → agents-CuNtT0D_.mjs} +5 -2
  4. package/dist/{application-analysis-DKy02UY0.mjs → application-analysis-D72ZQfMZ.mjs} +118 -135
  5. package/dist/{application-routing-DQyUh_5S.mjs → application-routing-Dy589Vgn.mjs} +1 -2
  6. package/dist/atomic-write-Dq6R0BPN.mjs +18 -0
  7. package/dist/{auth-Dn2vw-SG.mjs → auth-B6iOCjKI.mjs} +23 -56
  8. package/dist/{auth-link-vz9Z2kmG.mjs → auth-link-DWr6Afao.mjs} +10 -10
  9. package/dist/{auth-migrations-BwHgeEsD.mjs → auth-migrations-Cgs0k6lS.mjs} +28 -5
  10. package/dist/{auth-router-DvsCUVw4.mjs → auth-router-DP14wVkZ.mjs} +4 -4
  11. package/dist/auth-wn6F8dB8.mjs +2 -0
  12. package/dist/base64-DVrOndmI.mjs +16 -0
  13. package/dist/{better-auth-shared-CPvWD3nG.d.mts → better-auth-shared-B74NJIus.d.mts} +8 -13
  14. package/dist/{better-auth-shared-DPpj8zxc.mjs → better-auth-shared-CMXlZG7W.mjs} +56 -68
  15. package/dist/{build-cmd-D6we0VjO.mjs → build-cmd-Cr3FJxv0.mjs} +5 -5
  16. package/dist/{cache-CZRdzKx1.mjs → cache-D0Tt28cn.mjs} +5 -5
  17. package/dist/{cancel-deploy-CQ3NnMvf.mjs → cancel-deploy-CJKvk7AN.mjs} +4 -4
  18. package/dist/{cf-access-TWNzXltp.mjs → cf-access-BM9G0lhO.mjs} +4 -3
  19. package/dist/{cf-access-BcIBSKqG.mjs → cf-access-CWP4avfP.mjs} +3 -7
  20. package/dist/cf-build-output-2u583yJK.mjs +2 -0
  21. package/dist/{cf-build-output-DjvB_872.mjs → cf-build-output-Bc8i3dzE.mjs} +2 -2
  22. package/dist/cf-user-agent-ChjQp2MU.mjs +33 -0
  23. package/dist/cli/cli.mjs +198 -311
  24. package/dist/cli/cloudflare-operation-process.mjs +41 -15
  25. package/dist/cli/env-schema-probe.d.mts +5 -43
  26. package/dist/cli/env-schema-probe.mjs +14 -80
  27. package/dist/client-C1BjRn3g.mjs +2 -0
  28. package/dist/{client-DlDJuY0s.mjs → client-DM9Kcf4e.mjs} +161 -415
  29. package/dist/{cloudflare-auth-CuxfF6OA.mjs → cloudflare-auth-CqFBDo52.mjs} +12 -39
  30. package/dist/{cloudflare-cmd-lHqNlJGW.mjs → cloudflare-cmd-CTrn-lXJ.mjs} +6 -5
  31. package/dist/{cloudflare-config-BmhBv3HV.mjs → cloudflare-config-DV60XFFK.mjs} +16 -28
  32. package/dist/{cloudflare-connect-2G3rL2rP.mjs → cloudflare-connect-BosmCNlq.mjs} +3 -3
  33. package/dist/{cloudflare-operations-CwI1bChl.mjs → cloudflare-operations-BKdSfNBN.mjs} +26 -34
  34. package/dist/{cloudflare-operations-BlYLlowZ.mjs → cloudflare-operations-Ds-lX3Ts.mjs} +1 -1
  35. package/dist/{cloudflare-process-2-TfIEzB.mjs → cloudflare-process-CeDWJRhj.mjs} +12 -7
  36. package/dist/collect-NUlJMpLY.mjs +2 -0
  37. package/dist/{collect-DiTn9yr6.mjs → collect-xjffdCdk.mjs} +1 -1
  38. package/dist/{config-CSa15FvD.d.mts → config-7qoq2p9v.d.mts} +2 -2
  39. package/dist/{config-CLYAosnQ.mjs → config-BEm9vRvS.mjs} +11 -5
  40. package/dist/{config-DiowPT80.mjs → config-Bx_1SpnO.mjs} +87 -177
  41. package/dist/config-CNnrSMYm.mjs +2 -0
  42. package/dist/{config-DPByhVck.mjs → config-D0GY5ItR.mjs} +1 -1
  43. package/dist/config-entry.d.mts +1 -1
  44. package/dist/{connect-BfPBHHm-.mjs → connect-nukQSoEO.mjs} +8 -8
  45. package/dist/{create-project-BdXEFKal.mjs → create-project-D4APeBwX.mjs} +7 -7
  46. package/dist/{create-project-qFDC45zg.mjs → create-project-DL7YXpjj.mjs} +1 -1
  47. package/dist/{db-Xs80hcaA.mjs → db-27RztQLy.mjs} +173 -263
  48. package/dist/{delete-d2vuou3j.mjs → delete-BbsZFZIw.mjs} +5 -5
  49. package/dist/deploy-B06EQq4t.mjs +6009 -0
  50. package/dist/deploy-Db2ALnQP.mjs +3 -0
  51. package/dist/deploy-managed-static-CGswbcay.mjs +2277 -0
  52. package/dist/deploy-transport-BiicfoQW.mjs +180 -0
  53. package/dist/deploy.d.mts +10 -0
  54. package/dist/deploy.mjs +82 -0
  55. package/dist/dev-inbox-Rd6j_8vM.mjs +217 -0
  56. package/dist/discover-CTUiSsfG.mjs +2 -0
  57. package/dist/{discover-CkCYv9T_.mjs → discover-D2PGT63u.mjs} +2 -2
  58. package/dist/{dist-BVqXeR_h.mjs → dist-ipQi0Q8y.mjs} +2 -3
  59. package/dist/{domain-BsDUBAvt.mjs → domain-Bfq9n03H.mjs} +7 -22
  60. package/dist/{dotenv-BfU6eqFt.mjs → dotenv-CNazY3-w.mjs} +4 -16
  61. package/dist/{email-d_Aux1vM.mjs → email-BcjSyAL0.mjs} +4 -20
  62. package/dist/{email-_lGAHOhp.mjs → email-DIwaQU4P.mjs} +99 -191
  63. package/dist/email-cloudflare-CH053RxK.mjs +1096 -0
  64. package/dist/email-protocol-D9nTvhCp.mjs +82 -0
  65. package/dist/{entry-CMAkqBmU.mjs → entry-ehmBvs5w.mjs} +2 -2
  66. package/dist/{env-BxocywBB.mjs → env-BJjULvL0.mjs} +2 -2
  67. package/dist/{env-DMA3cXZt.mjs → env-BhdWMrNy.mjs} +2 -13
  68. package/dist/{env-C74QepDE.mjs → env-C6ipBLp3.mjs} +8 -8
  69. package/dist/{env-public-DR7ZM6d-.d.mts → env-public-CCdykygU.d.mts} +6 -23
  70. package/dist/{env-raw-jZpP5n47.mjs → env-raw-Cklzcde3.mjs} +3 -20
  71. package/dist/{env-types-CwXgeMgL.mjs → env-types-DS2_y4X8.mjs} +2 -2
  72. package/dist/{env-validation-CrVNjsPm.mjs → env-validation-CTn-HhG1.mjs} +1 -1
  73. package/dist/env-validation-cE0zcmzO.mjs +486 -0
  74. package/dist/{gen-DtkQhvQg.mjs → gen-CnN1Xidx.mjs} +131 -253
  75. package/dist/gen-F8pSZnhc.mjs +2 -0
  76. package/dist/{generate-GDbL7sUr.mjs → generate-Dat0UTry.mjs} +38 -4
  77. package/dist/generate-Rii9klHB.mjs +2 -0
  78. package/dist/generated-wrangler-config-DeWj5F9Y.mjs +18 -0
  79. package/dist/{github-cmd-DaDdBbSS.mjs → github-cmd-BdkU4Nhe.mjs} +27 -71
  80. package/dist/{handler-BHAn2fZJ.mjs → handler-BZ1t7-Rv.mjs} +2 -2
  81. package/dist/{handler-CNAwjRcW.d.mts → handler-_PqY82xe.d.mts} +1 -1
  82. package/dist/{headers-DlfR78Nu.mjs → headers-Di1FsD3e.mjs} +26 -81
  83. package/dist/{help-0bTe_lID.mjs → help-Bug7pyK_.mjs} +18 -10
  84. package/dist/help-s9q7LTcu.mjs +2 -0
  85. package/dist/{inbound-PfQDLXc5.mjs → inbound-DmkTQeWp.mjs} +71 -222
  86. package/dist/{inbound-CH5Mksyy.d.mts → inbound-brj2-TM5.d.mts} +19 -58
  87. package/dist/index.d.mts +2 -18
  88. package/dist/index.mjs +200 -496
  89. package/dist/{info-PYWwkWyt.mjs → info-CujPwtMe.mjs} +5 -5
  90. package/dist/{init-DaBGmaXC.mjs → init-ZWOJvc-Z.mjs} +179 -388
  91. package/dist/isr-config-DPjXM8J2.mjs +194 -0
  92. package/dist/{link-C6fjafep.mjs → link-UEc7bnF4.mjs} +8 -8
  93. package/dist/{list-BTFBlqKl.mjs → list-CuWeOnzk.mjs} +6 -17
  94. package/dist/{live-CgQuTpqD.mjs → live-BxLX-JqJ.mjs} +19 -17
  95. package/dist/{live-Du8jXwOW.d.mts → live-DJONVlQK.d.mts} +1 -1
  96. package/dist/load-user-env-DD5qveNU.mjs +49 -0
  97. package/dist/{local-d1-ga5O_idV.mjs → local-d1-BM3p74mm.mjs} +6 -6
  98. package/dist/{login-GKcNUmtI.mjs → login-CZ2Cqa-D.mjs} +11 -11
  99. package/dist/login-DhK7o1oJ.mjs +2 -0
  100. package/dist/{logs-BiMSULmc.mjs → logs-TihRcLTk.mjs} +5 -5
  101. package/dist/migrate-BgT-hmu8.mjs +2 -0
  102. package/dist/{migrate-NLsjBbuM.mjs → migrate-uFwojusJ.mjs} +69 -21
  103. package/dist/migration-handler-Cg0Y4EPu.mjs +470 -0
  104. package/dist/{migration-handler-DM4clYj5.d.mts → migration-handler-CwlEQUoo.d.mts} +17 -26
  105. package/dist/{mime-DxCznlJq.mjs → mime-srOklVVv.mjs} +92 -395
  106. package/dist/{node-DJicPvPj.mjs → node-DoKbo1SZ.mjs} +8 -24
  107. package/dist/{operator-args-DOBhIaIg.mjs → operator-args-UnE8Y2eK.mjs} +27 -26
  108. package/dist/{operator-auth-BEZ_u0Cz.mjs → operator-auth-Cr2zCc-J.mjs} +2 -2
  109. package/dist/{operator-client-DbDv4vtE.mjs → operator-client-C-ROjk1I.mjs} +4 -4
  110. package/dist/{operator-cmd-BT4hgavL.mjs → operator-cmd-C5lCctnc.mjs} +8 -8
  111. package/dist/operator-cmd-Cjk5DiRx.mjs +2 -0
  112. package/dist/{output-C50ag2r3.mjs → output-FNHKw5Ac.mjs} +36 -5
  113. package/dist/{package-json-DXfiT1jV.mjs → package-json-BjYqR-So.mjs} +1 -1
  114. package/dist/pages/client.d.mts +1 -1
  115. package/dist/pages/client.mjs +91 -5
  116. package/dist/pages/index.d.mts +1 -2
  117. package/dist/pages/index.mjs +6 -6
  118. package/dist/pages/islands-plugin.mjs +5 -83
  119. package/dist/pages/protocol.d.mts +2 -2
  120. package/dist/pages/protocol.mjs +1 -1
  121. package/dist/pages/serialize.mjs +1 -1
  122. package/dist/{platform-args-DUeXY9Om.mjs → platform-args-C6Mb_I3a.mjs} +34 -58
  123. package/dist/platform-args-Cm7x-fot.mjs +2 -0
  124. package/dist/{platform-auth-config-CkSx3usH.mjs → platform-auth-config-CJmNkFT2.mjs} +10 -11
  125. package/dist/{platform-auth-protection-BJimB_p9.mjs → platform-auth-protection-D5wvsI-Y.mjs} +36 -26
  126. package/dist/{platform-auth-recovery-BU6izFAU.mjs → platform-auth-recovery-D_0I3n-1.mjs} +8 -9
  127. package/dist/{platform-cmd-BbmJiq5O.mjs → platform-cmd-Cuj4oUVo.mjs} +1 -1
  128. package/dist/{platform-cmd-BbY1dWiM.mjs → platform-cmd-DxxZO6e5.mjs} +15 -15
  129. package/dist/{platform-discovery-DIYz8V63.mjs → platform-discovery-CHhNs8Nn.mjs} +1 -1
  130. package/dist/{platform-domain-CHVS6cV0.mjs → platform-domain-zLXnW1G_.mjs} +5 -5
  131. package/dist/{platform-lifecycle-DzCwqhFq.mjs → platform-lifecycle-DOW-wLfx.mjs} +1398 -2043
  132. package/dist/{platform-lifecycle-ByAlpkhV.mjs → platform-lifecycle-_gfnjUBr.mjs} +1 -1
  133. package/dist/{platform-management-CBOT4BSM.mjs → platform-management-CYrLvTGH.mjs} +1 -1
  134. package/dist/{platform-management-CuuVDhyt.mjs → platform-management-t7HKy4-U.mjs} +632 -124
  135. package/dist/{platform-plans-config-CN-heS4q.mjs → platform-plans-config-CNH6zbPX.mjs} +15 -11
  136. package/dist/{platform-recovery-CskSJgLh.mjs → platform-recovery-DeucI7A9.mjs} +6 -9
  137. package/dist/{platform-registry-Cjv2Qf0r.mjs → platform-registry-B9mWX9LO.mjs} +13 -18
  138. package/dist/{platform-setup-BBxRxmFC.mjs → platform-setup-CTf6MMT9.mjs} +19 -26
  139. package/dist/{plugin-inference-BlQbOL0P.mjs → plugin-inference-DsARdQKE.mjs} +18 -33
  140. package/dist/{prepare-Dq9hTIbo.mjs → prepare-C4zfwks4.mjs} +3 -3
  141. package/dist/{prepare-Do96654b.mjs → prepare-CSH9dKTI.mjs} +11 -13
  142. package/dist/prepare-dr9uxQSV.mjs +2 -0
  143. package/dist/{prerender-render-Ct20jftc.mjs → prerender-render-Bfsumdkv.mjs} +8 -2
  144. package/dist/prerender-render.d.mts +2 -0
  145. package/dist/prerender-render.mjs +2 -2
  146. package/dist/project-DiiOBZPF.mjs +2 -0
  147. package/dist/{project-cmd-DaoRrn-8.mjs → project-cmd-Dq75AXzy.mjs} +19 -19
  148. package/dist/{project-paths-GgcMozYz.mjs → project-paths-DMvEeSau.mjs} +9 -14
  149. package/dist/{project-BAm2aB6Q.mjs → project-rqDnVsJN.mjs} +8 -4
  150. package/dist/{project-team-Q_lCA7Io.mjs → project-team-B3_QcStG.mjs} +6 -6
  151. package/dist/{project-token-BArgK9o1.mjs → project-token-CvsRvv2I.mjs} +5 -5
  152. package/dist/{project-tsconfig-CVJhNMxs.mjs → project-tsconfig-bveqhlYA.mjs} +3 -5
  153. package/dist/{project-zero-trust-KO9Hu2Pq.mjs → project-zero-trust-D1ICiwN_.mjs} +5 -5
  154. package/dist/{protocol-BPZaNqBo.d.mts → protocol-4H7V_3Os.d.mts} +1 -1
  155. package/dist/{protocol-CfaUwNs8.mjs → protocol-RNP0u7UY.mjs} +9 -3
  156. package/dist/{provision-BfaLiWbj.mjs → provision-DDh7ITVS.mjs} +118 -865
  157. package/dist/{requests-C7Oeoh5u.mjs → requests-3CL3BuZh.mjs} +4 -4
  158. package/dist/resolve-project-B9Hr0D3n.mjs +2 -0
  159. package/dist/resolve-project-C_Cu7E8a.mjs +48 -0
  160. package/dist/{rollback-DVAtrLAl.mjs → rollback-Ce1d_0J9.mjs} +7 -17
  161. package/dist/{route-types-CbtsIeFn.mjs → route-types-IrBuwJ7u.mjs} +35 -70
  162. package/dist/routing-assets-VkrKIbxE.mjs +139 -0
  163. package/dist/{runner-9wjsSZx-.mjs → runner-B5huK2eC.mjs} +1 -1
  164. package/dist/{runner-DMBKSrRk.mjs → runner-DcVDrzuR.mjs} +7 -28
  165. package/dist/{runner-mysql-CEzKtmFb.mjs → runner-mysql-CCtyI0p6.mjs} +4 -3
  166. package/dist/runner-mysql-CaJq-hd6.mjs +2 -0
  167. package/dist/runner-pg-BJhFZZG4.mjs +2 -0
  168. package/dist/{runner-pg-DV8p_zjA.mjs → runner-pg-CPd-CB_F.mjs} +1 -1
  169. package/dist/runtime/ai.mjs +9 -22
  170. package/dist/runtime/better-auth-mysql.d.mts +2 -5
  171. package/dist/runtime/better-auth-mysql.mjs +6 -31
  172. package/dist/runtime/better-auth-pg.d.mts +2 -5
  173. package/dist/runtime/better-auth-pg.mjs +6 -32
  174. package/dist/runtime/better-auth.d.mts +2 -4
  175. package/dist/runtime/better-auth.mjs +9 -19
  176. package/dist/runtime/db.mjs +1 -1
  177. package/dist/runtime/durable.d.mts +16 -0
  178. package/dist/runtime/durable.mjs +26 -2
  179. package/dist/runtime/email/testing.d.mts +1 -1
  180. package/dist/runtime/email/testing.mjs +9 -23
  181. package/dist/runtime/email-protocol.d.mts +12 -0
  182. package/dist/runtime/email-protocol.mjs +2 -70
  183. package/dist/runtime/email.d.mts +1 -1
  184. package/dist/runtime/email.mjs +79 -221
  185. package/dist/runtime/env-public.d.mts +1 -1
  186. package/dist/runtime/env-public.mjs +12 -38
  187. package/dist/runtime/env.d.mts +1 -12
  188. package/dist/runtime/env.mjs +1 -1
  189. package/dist/runtime/handler.d.mts +1 -1
  190. package/dist/runtime/handler.mjs +1 -1
  191. package/dist/runtime/isr.mjs +1 -1
  192. package/dist/runtime/kv.mjs +1 -1
  193. package/dist/runtime/live-client.d.mts +1 -1
  194. package/dist/runtime/live-server.mjs +1 -16
  195. package/dist/runtime/live.d.mts +1 -1
  196. package/dist/runtime/live.mjs +1 -1
  197. package/dist/runtime/migration-handler-mysql.d.mts +2 -2
  198. package/dist/runtime/migration-handler-mysql.mjs +3 -2
  199. package/dist/runtime/migration-handler-pg.d.mts +2 -2
  200. package/dist/runtime/migration-handler-pg.mjs +1 -1
  201. package/dist/runtime/migration-handler.d.mts +2 -2
  202. package/dist/runtime/migration-handler.mjs +2 -470
  203. package/dist/runtime/queues.mjs +1 -1
  204. package/dist/runtime/remote/binding-handler.mjs +62 -62
  205. package/dist/runtime/remote/index.mjs +16 -77
  206. package/dist/runtime/routing.d.mts +1 -4
  207. package/dist/runtime/routing.mjs +82 -218
  208. package/dist/runtime/sandbox-container.d.mts +2 -2
  209. package/dist/runtime/sandbox-container.mjs +2 -2
  210. package/dist/runtime/sandbox.d.mts +2 -2
  211. package/dist/runtime/sandbox.mjs +13 -6
  212. package/dist/runtime/storage.mjs +1 -1
  213. package/dist/runtime/validator.d.mts +1 -1
  214. package/dist/runtime/ws-server.d.mts +2 -3
  215. package/dist/runtime/ws-server.mjs +6 -28
  216. package/dist/runtime/ws.d.mts +1 -1
  217. package/dist/{sandbox-container-Bo0eiFKz.d.mts → sandbox-container-ChQRum-j.d.mts} +3 -1
  218. package/dist/{sandbox-container-C6ItmVuN.mjs → sandbox-container-DBKIqDEK.mjs} +12 -1
  219. package/dist/{sandbox-C5LFoJMf.d.mts → sandbox-q3waMc2T.d.mts} +1 -1
  220. package/dist/{scan-C3uDzz6J.mjs → scan-C0BMdmEd.mjs} +84 -7
  221. package/dist/{secret-BvtB7IjY.mjs → secret-B5J8bBsI.mjs} +62 -80
  222. package/dist/{serialize-BPvnNQuA.mjs → serialize-BtQyaYoC.mjs} +10 -4
  223. package/dist/{skills-BgVMvQdy.mjs → skills-BJsan98C.mjs} +2 -2
  224. package/dist/{subcommand-prompt-BSlnD1fI.mjs → subcommand-prompt-gQ-NDA-u.mjs} +38 -43
  225. package/dist/sveltekit.mjs +1 -1
  226. package/dist/validate-C9xtFOYR.mjs +2 -0
  227. package/dist/{validate-C9qJArv7.mjs → validate-CheZGRE7.mjs} +4 -8
  228. package/dist/version-metadata-DIrqEHQo.mjs +73 -0
  229. package/dist/{wrangler-D9KTuqnv.mjs → wrangler-BYs07Rxy.mjs} +119 -378
  230. package/dist/{ws-CChrrAU-.d.mts → ws-aKVYB-fA.d.mts} +1 -1
  231. package/dist/yarn-pnp-DLbEFMT0.mjs +92 -0
  232. package/docs/guide/auth.md +2 -0
  233. package/docs/guide/database/postgresql.md +2 -0
  234. package/docs/guide/database.md +2 -0
  235. package/docs/guide/durable-state.md +24 -0
  236. package/docs/guide/platform/administration/access.md +4 -0
  237. package/docs/guide/platform/administration/connected-apps.md +55 -0
  238. package/docs/guide/platform/installation/credentials.md +3 -1
  239. package/docs/guide/quickstart.md +2 -0
  240. package/docs/guide/sandboxes.md +2 -0
  241. package/docs/reference/api/deploy.md +23 -0
  242. package/docs/reference/api/pages.md +2 -0
  243. package/docs/reference/api.md +2 -1
  244. package/docs/reference/cli/database.md +9 -3
  245. package/docs/reference/cli/platform-installation.md +1 -1
  246. package/docs/reference/cli/setup.md +2 -0
  247. package/package.json +13 -16
  248. package/skills/void/SKILL.md +1 -0
  249. package/dist/auth-LMJcNESe.mjs +0 -2
  250. package/dist/cf-build-output-H9a97vME.mjs +0 -2
  251. package/dist/cf-user-agent-lKblH3zU.mjs +0 -17
  252. package/dist/client-tso2OfcG.mjs +0 -2
  253. package/dist/collect-DLyFDiKW.mjs +0 -2
  254. package/dist/config-5r-YpMC-.mjs +0 -2
  255. package/dist/config-B_ggY-IO.mjs +0 -89
  256. package/dist/config-BtSFvXZx.mjs +0 -2
  257. package/dist/config-write-AHGesphx.mjs +0 -61
  258. package/dist/deploy-Bqe1PYBw.mjs +0 -10458
  259. package/dist/deploy-VsWsVQkw.mjs +0 -2
  260. package/dist/dev-inbox-CK-UuPob.mjs +0 -297
  261. package/dist/discover-EDUf6JJw.mjs +0 -2
  262. package/dist/dist-_UUlL6bg.mjs +0 -2
  263. package/dist/env-validation-Dxdx_5wo.mjs +0 -951
  264. package/dist/gen-dA9hW7AV.mjs +0 -2
  265. package/dist/head-client-DzmJGN4C.mjs +0 -90
  266. package/dist/help-DfQYVfGY.mjs +0 -2
  267. package/dist/login-mx_ydhmp.mjs +0 -2
  268. package/dist/migrate-BHp07yJE.mjs +0 -2
  269. package/dist/operator-cmd-CwBB-1yb.mjs +0 -2
  270. package/dist/pages/head-client.d.mts +0 -13
  271. package/dist/pages/head-client.mjs +0 -2
  272. package/dist/platform-args-D4E1PjVw.mjs +0 -2
  273. package/dist/prepare-DRUV-g3X.mjs +0 -2
  274. package/dist/project-DedqCp59.mjs +0 -2
  275. package/dist/provision-Wu9ZBk9L.mjs +0 -2
  276. package/dist/resolve-project-BIeYs9Cw.mjs +0 -2
  277. package/dist/resolve-project-CP8rZs_p.mjs +0 -28
  278. package/dist/runner-mysql-CkFqZ6CE.mjs +0 -2
  279. package/dist/runner-pg-BGYRFdRp.mjs +0 -2
  280. package/dist/runtime/env-helpers.d.mts +0 -2
  281. package/dist/runtime/env-helpers.mjs +0 -2
  282. package/dist/validate-BJr9LfXy.mjs +0 -2
  283. package/dist/yarn-pnp-CUX_iTPA.mjs +0 -188
@@ -1,6 +1,6 @@
1
1
  import { t as StandardSchemaV1 } from "./standard-schema-Fo_vCAZh.mjs";
2
2
  import { r as AuthUser } from "./auth-DkcFflXV.mjs";
3
- import { a as CloudEnv } from "./handler-CNAwjRcW.mjs";
3
+ import { a as CloudEnv } from "./handler-_PqY82xe.mjs";
4
4
  import { WebSocketRouteMap } from "void/routes";
5
5
  //#region src/runtime/ws.d.ts
6
6
  type MaybePromise<T> = T | Promise<T>;
@@ -0,0 +1,92 @@
1
+ import { a as join, n as dirname } from "./dist-ipQi0Q8y.mjs";
2
+ import { existsSync, readdirSync } from "node:fs";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ //#region src/cli/yarn-pnp.ts
5
+ const drizzleKitBin = join(fileURLToPath(import.meta.resolve("drizzle-kit")), "..", "bin.cjs");
6
+ /** Read the PnP runtime files in `dir` only, or `undefined` when neither exists. */
7
+ function readPnpRuntimeAt(dir) {
8
+ const cjs = join(dir, ".pnp.cjs");
9
+ const loader = join(dir, ".pnp.loader.mjs");
10
+ const cjsExists = existsSync(cjs);
11
+ const loaderExists = existsSync(loader);
12
+ if (!cjsExists && !loaderExists) return;
13
+ return {
14
+ pnpCjs: cjsExists ? cjs : void 0,
15
+ pnpLoader: loaderExists ? loader : void 0
16
+ };
17
+ }
18
+ /**
19
+ * Whether `dir` has its own package-manager lockfile, i.e. it is an install
20
+ * root: workspace members share the root lockfile. `packageManager` is not a
21
+ * signal, because a Yarn workspace member may pin it and still resolve through
22
+ * the root's `.pnp.cjs`.
23
+ */
24
+ function hasLocalLockfile(dir) {
25
+ return existsSync(join(dir, "pnpm-lock.yaml")) || existsSync(join(dir, "package-lock.json")) || existsSync(join(dir, "yarn.lock")) || existsSync(join(dir, "bun.lock")) || existsSync(join(dir, "bun.lockb"));
26
+ }
27
+ /**
28
+ * Find Yarn Berry PnP runtime files at `start` or its nearest ancestor, since a
29
+ * monorepo keeps `.pnp.cjs` at the workspace root. A lockfile at `start` stops
30
+ * the walk: an outer PnP graph lacks the local install's dependencies.
31
+ */
32
+ function findYarnPnpRuntime(start) {
33
+ const local = readPnpRuntimeAt(start);
34
+ if (local !== void 0) return {
35
+ dir: start,
36
+ runtime: local
37
+ };
38
+ if (hasLocalLockfile(start)) return;
39
+ let dir = dirname(start);
40
+ if (dir === start) return;
41
+ while (true) {
42
+ const found = readPnpRuntimeAt(dir);
43
+ if (found !== void 0) return {
44
+ dir,
45
+ runtime: found
46
+ };
47
+ const parent = dirname(dir);
48
+ if (parent === dir) return;
49
+ dir = parent;
50
+ }
51
+ }
52
+ /**
53
+ * Like {@link findYarnPnpRuntime}, but only when Yarn has installed into that
54
+ * same directory. A committed `.pnp.cjs` alone does not prove an install: its
55
+ * ZIP archives may not be fetched yet.
56
+ */
57
+ function findInstalledYarnPnpRuntime(start) {
58
+ const found = findYarnPnpRuntime(start);
59
+ return found && isYarnPnpInstalled(found.dir) ? found.runtime : void 0;
60
+ }
61
+ /**
62
+ * Yarn writes `.yarn/install-state.gz` on every install; a zero-install
63
+ * checkout instead commits a populated `.yarn/cache`.
64
+ */
65
+ function isYarnPnpInstalled(dir) {
66
+ if (existsSync(join(dir, ".yarn", "install-state.gz"))) return true;
67
+ const cacheDir = join(dir, ".yarn", "cache");
68
+ if (!existsSync(cacheDir)) return false;
69
+ try {
70
+ return readdirSync(cacheDir).some((e) => e.endsWith(".zip"));
71
+ } catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Build a child env that loads the Yarn PnP runtime found at or above `root`,
77
+ * like `yarn node` does. Existing `NODE_OPTIONS` go after our flags so the PnP
78
+ * `--require` patches resolution first.
79
+ */
80
+ function buildDrizzleKitSpawnEnv(root) {
81
+ const env = { ...process.env };
82
+ const pnp = findYarnPnpRuntime(root)?.runtime;
83
+ if (!pnp) return env;
84
+ const flags = [];
85
+ if (pnp.pnpCjs) flags.push(`--require ${JSON.stringify(pnp.pnpCjs)}`);
86
+ if (pnp.pnpLoader) flags.push(`--experimental-loader ${pathToFileURL(pnp.pnpLoader).href}`);
87
+ const injected = flags.join(" ");
88
+ env.NODE_OPTIONS = process.env.NODE_OPTIONS ? `${injected} ${process.env.NODE_OPTIONS}` : injected;
89
+ return env;
90
+ }
91
+ //#endregion
92
+ export { hasLocalLockfile as i, drizzleKitBin as n, findInstalledYarnPnpRuntime as r, buildDrizzleKitSpawnEnv as t };
@@ -127,6 +127,8 @@ Auth sessions use the same database as your app. Void creates `BETTER_AUTH_SECRE
127
127
 
128
128
  Local development needs no secret setup. To preview a production build locally, provide `BETTER_AUTH_SECRET`.
129
129
 
130
+ Responses to signed-in requests get `Cache-Control: no-store`, so neither the browser cache nor a shared cache keeps a user's data. A route keeps its own policy when it sets `no-store`, or `private` together with `no-cache`. To answer repeat requests with `304`, use `private, no-cache` with Hono's [`etag()`](https://hono.dev/docs/middleware/builtin/etag) middleware. If you set the `ETag` yourself, make it differ per user, so the `304` doesn't reuse another account's page. The browser cache keeps a copy of a `private, no-cache` page, so the Back button can show it again after the user signs out. Keep the default `no-store` for pages that must not stay in the browser cache.
131
+
130
132
  `POST`, `PUT`, `PATCH` and `DELETE` requests and WebSocket connections from another origin don't use the signed-in session unless that origin is in `trustedOrigins`. If a separate frontend calls your app, add its origin there (see [Customization](#customization)). If your routes use their own cookies, check the request `Origin` yourself, for example with Hono's [`csrf()`](https://hono.dev/docs/middleware/builtin/csrf) middleware.
131
133
 
132
134
  Deployed apps on Cloudflare limit auth requests per client IP with Better Auth's defaults, for example 3 sign-in attempts per 10 seconds. Each Worker instance keeps its own count. Change or turn off the limits with `rateLimit` in `auth.ts`. To share one count across instances, set `rateLimit: { storage: 'database' }`, then run `void db generate` for a direct Cloudflare deploy.
@@ -40,6 +40,8 @@ For a Void platform, deploy prompts for the connection string if needed. You can
40
40
 
41
41
  Void provisions Hyperdrive without saving the connection string in project config. Both `postgres://` and `postgresql://` URLs are supported, including provider query strings such as `?sslmode=require`.
42
42
 
43
+ The Hyperdrive that Void creates connects with TLS in Cloudflare's default `require` mode. Hyperdrive does not use the `sslmode=verify-ca`, `sslmode=verify-full`, or `sslrootcert` settings from your connection string. To have Hyperdrive verify your database against a specific certificate authority on a direct Cloudflare deploy, [create the Hyperdrive in Cloudflare with that certificate](https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/) and add its ID to [`cloudflare.hyperdrive`](../../integrations/cloudflare.md#databases-and-secrets).
44
+
43
45
  ## Schema Definition
44
46
 
45
47
  Import schema helpers from `void/schema-pg`:
@@ -47,6 +47,8 @@ Choose a database during `void init`, or set `database` in `void.config.ts`:
47
47
  | Managed by | Void | Bring your own database | Bring your own database |
48
48
  | Connection | Automatic D1 binding | Hyperdrive | Hyperdrive |
49
49
 
50
+ A Void platform keeps Hyperdrive query caching off for your database connection, so reads reflect completed writes. An existing connection is updated on the project's next deploy.
51
+
50
52
  ## Schema Definition
51
53
 
52
54
  Define your tables in `db/schema.ts` using column helpers from `void/schema-d1`, `void/schema-pg`, or `void/schema-mysql`.
@@ -163,3 +163,27 @@ Typed state works in local development and direct Cloudflare deploys of native V
163
163
  Custom Durable Object modules are not supported on Void platforms, in meta-frameworks, or on Node.js, Bun, and Deno.
164
164
 
165
165
  This is separate from [typed WebSocket routes](./websockets.md), which also use SQLite-backed Durable Objects and work on both direct Cloudflare and hosted Void deployments.
166
+
167
+ ## Native Durable Object classes
168
+
169
+ Use `defineDurableObject` to keep a native Cloudflare class, including classes extending Cloudflare Agents. Void discovers its binding and exports the class without replacing its constructor, lifecycle, or RPC methods. Like Durable State, this supports direct Cloudflare deployments.
170
+
171
+ ```ts
172
+ // durable-objects/workspace.ts
173
+ import { DurableObject } from 'cloudflare:workers';
174
+ import { defineDurableObject } from 'void/durable';
175
+
176
+ class WorkspaceObject extends DurableObject {
177
+ async fetch() {
178
+ return new Response('Workspace');
179
+ }
180
+ }
181
+
182
+ export const Workspace = defineDurableObject({
183
+ name: 'workspace',
184
+ class: WorkspaceObject,
185
+ });
186
+ export default Workspace;
187
+ ```
188
+
189
+ Call `Workspace.get('project-id')` from a server handler to obtain its typed stub. Keep the resource name and instance name stable across deployments to retain storage.
@@ -158,3 +158,7 @@ Invitation history remains available after an involved account is removed. The s
158
158
  remains visible when that account's login no longer exists.
159
159
 
160
160
  `void platform signup open` allows anyone to sign up. Everyone who signs up can deploy apps on your application domain, so check how those apps [share cookies](/guide/platform/installation/domains#adding-a-domain) before opening signup. Use `void platform signup restrict` to require an allowlist match again. Disallowing an entry affects future signup; it does not suspend an existing account.
161
+
162
+ ## Connected apps
163
+
164
+ Register separate applications as OAuth clients through [Connected apps](./connected-apps.md). Users connect their identity and approve each publish on Void.
@@ -0,0 +1,55 @@
1
+ # Connected apps
2
+
3
+ A connected app is a separate application registered as an OAuth client on your Void installation. Users sign in on Void and decide whether to connect it. The application operator may be different from the platform administrator.
4
+
5
+ ## Register an application
6
+
7
+ Open **Admin → Connected apps**. Enter the app name, its operator, and each exact HTTPS callback URL on a separate line. Wildcards and callback query strings are not supported. Enable individual publish approvals if the app builds and deploys projects.
8
+
9
+ Save the returned client ID and secret on the app's server. Void shows the secret once. The client secret authenticates that application; it does not grant access to users' accounts. Register a new client if you need replacement credentials, then disable the old one.
10
+
11
+ **Disable and revoke access** invalidates the client's grants, pending sign-ins, and publish approvals. Registration and disablement appear in the operator audit.
12
+
13
+ Local development permits exact HTTP callbacks on localhost when the platform's development authentication bypass is explicitly enabled. Production clients require HTTPS.
14
+
15
+ ## Connect and disconnect
16
+
17
+ The app sends users to Void's authorization page, where Void displays its registered name, operator, callback origin, and requested permission. Sign-in permits reading the user's ID and username. It does not provide an account token or project management access.
18
+
19
+ Users can disconnect applications at `<platform API URL>/oauth/connections`. Grants also expire after an hour and become invalid when their platform login session is revoked or their account is suspended. Applications must request a new sign-in when access expires.
20
+
21
+ ## Approve a publish
22
+
23
+ The app builds first, then sends the user to Void with the prepared artifact. Void displays the project name, checkpoint label, resources, manifest, and artifact digest. The user must explicitly approve on Void.
24
+
25
+ Approval permits one deployment to that user's chosen project. Void creates a missing project during approval; existing projects require ownership. The app receives a credential valid for up to fifteen minutes, restricted to that artifact's asset uploads, deployment, and receipt. Retries use the same receipt.
26
+
27
+ Published code can use that project's existing secrets and resources. Review the app operator and deployment details before approving code for an existing project. Migrations and resource changes in the approved manifest take effect during deployment.
28
+
29
+ Disabling the app or disconnecting its grant stops authorization for subsequent actions and is checked again before a queued deployment publishes. Disconnecting does not remove an app that has already been published; manage that project through Void.
30
+
31
+ ## Build an OAuth client
32
+
33
+ Discover endpoints at `/.well-known/oauth-authorization-server` on the platform API origin. Use authorization code flow with `scope=profile`, a random `state`, and S256 PKCE. Authenticate token exchanges using HTTP Basic client authentication. Send access tokens as Bearer credentials to `/oauth/userinfo`; its response contains `sub` and `preferred_username`.
34
+
35
+ For publishing, package the built app with [`prepareDeployArtifact`](/reference/api/deploy). POST to `/oauth/deployment-requests` using the profile token:
36
+
37
+ ```ts
38
+ {
39
+ redirect_uri: registeredCallback,
40
+ state: publishState,
41
+ code_challenge: publishChallenge,
42
+ code_challenge_method: 'S256',
43
+ slug: projectSlug,
44
+ checkpoint: checkpointLabel,
45
+ artifact: prepared.artifact
46
+ }
47
+ ```
48
+
49
+ Redirect the browser to the returned `authorization_url`. Exchange its code with the publish verifier and the same registered callback. The response includes `project_id`, `approval_id`, and a `deploy:approve` access token. This publish flow is a Void extension; requesting that scope in an ordinary sign-in does not authorize deployment.
50
+
51
+ Use the token to request URLs from `POST /projects/:id/deploy/upload-urls`, upload the declared assets, and send the artifact to `POST /projects/:id/deploy`. Set `x-void-deploy-idempotency-key` to `approval_id`. Deployment uses Void's managed deployment protocol and requires the platform deployment Queue. The credential cannot read secrets, mint project tokens, delete projects, or deploy different bytes.
52
+
53
+ Revoke identity grants with `POST /oauth/revoke`, authenticated as the client. No refresh token or OpenID Connect ID token is issued.
54
+
55
+ If the API is protected by Cloudflare Access, the application operator must also configure a service identity permitted by that Access application's policy. Server OAuth endpoints and approved deployment requests still validate their own client, grant, and project authority; browser consent requires the user's company identity.
@@ -39,6 +39,8 @@ Use the following permissions for the core platform. Cloudflare may label write
39
39
  | Account | Hyperdrive | Write | Write |
40
40
  | Account | Account Analytics | Read | Read |
41
41
  | Account | AI Gateway | Edit | Edit when installing with browser login |
42
+ | Account | Containers | — | Edit |
43
+ | Account | Cloudchamber | — | Edit |
42
44
  | Zone | Zone | Read | — |
43
45
  | Zone | DNS | Edit | — |
44
46
  | Zone | Workers Routes | Edit | — |
@@ -72,7 +74,7 @@ The installer deploys the email gateway, prepares the shared mail route, and ver
72
74
 
73
75
  ## R2 Upload Credentials
74
76
 
75
- In the **R2 token creation** form opened by the installer, select **Object Read & Write** and **Apply to all buckets in this account (including newly created buckets)**. Create an account token, or a user token if your role requires it. Save its **Access Key ID** and **Secret Access Key** in your password manager. These differ from the management and runtime API tokens. See [R2’s token instructions](https://developers.cloudflare.com/r2/api/tokens/).
77
+ The installer opens the **R2 token creation** form with a token name based on your platform's display name, **Object Read & Write**, and **Apply to all buckets in this account (including newly created buckets)** preselected. Review the settings and create an account token, or a user token if your role requires it. Save its **Access Key ID** and **Secret Access Key** in your password manager, then paste both into the installer. These differ from the management and runtime API tokens. See [R2’s token instructions](https://developers.cloudflare.com/r2/api/tokens/).
76
78
 
77
79
  ## Signing and Encryption Keys {#signing-and-encryption-keys}
78
80
 
@@ -36,6 +36,8 @@ bunx void init
36
36
 
37
37
  Choose your UI framework, a starter, and a deployment target. Vite+ is the default build tool. D1 is a good first database: it runs locally without a separate database server. Choose Cloudflare to deploy to your own account, or skip deployment setup for now.
38
38
 
39
+ You do not need to install Vite+ globally. Setup preserves your existing package-manager versions and lockfiles.
40
+
39
41
  With pnpm, `pnpm create void my-app` also creates the project directory and configures native build permissions for you.
40
42
 
41
43
  ## Run locally
@@ -56,6 +56,8 @@ File operations live under `sandbox.files`: `readFile`, `writeFile`, `stat`, `ls
56
56
 
57
57
  To reach a server inside the container, await `sandbox.fetch(port, new Request(url))`. `sandbox.running()` checks whether the container is running; `sandbox.destroy()` stops it.
58
58
 
59
+ On native Cloudflare deployments, `sandbox.fetch()` also supports WebSocket upgrade requests. Return its response from your Worker handler to connect the client to the container. WebSocket upgrades are currently unavailable on managed Void deployments.
60
+
59
61
  `getSandbox()` options include `inactivityTimeoutMs` (default ten minutes, maximum six hours), `enableInternet` (default `false`), and string `labels`. Internet access and labels take effect on the next container start. `binding` selects a custom native binding; managed platforms use the configured binding.
60
62
 
61
63
  For code that runs on both deployment targets, use `getSandbox()`. Direct access through `c.env.SANDBOX` is available only on local and native Cloudflare deployments.
@@ -0,0 +1,23 @@
1
+ # Deployment artifacts
2
+
3
+ Use `void/deploy` from Node.js to prepare a built Void app for a managed platform deployment without platform credentials.
4
+
5
+ Build the app in managed mode inside its isolated environment:
6
+
7
+ ```sh
8
+ VOID_DEPLOY_BUILD=1 VOID_DEPLOY_PROJECT_ID=artifact npm run build
9
+ ```
10
+
11
+ These values select a platform-compatible build. `artifact` is a build marker, not an existing project ID or a credential; the target project is selected during publish approval.
12
+
13
+ ```ts
14
+ import { prepareDeployArtifact } from 'void/deploy';
15
+
16
+ const { artifact, assets } = await prepareDeployArtifact('/path/to/app');
17
+ ```
18
+
19
+ `artifact` contains the deployment manifest, content-addressed asset metadata, and base64 Worker modules. `assets` maps asset URL paths to base64 bytes. Keep this result immutable while requesting [publish approval](/guide/platform/administration/connected-apps).
20
+
21
+ Preparation packages existing build output; it does not build, contact a platform, provision resources, or deploy. It supports Void Cloudflare Worker builds. Node targets, static output, remote data, deploy-time prerendering, Sandbox, and Live resources require the normal `void deploy` workflow instead.
22
+
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.
@@ -218,6 +218,8 @@ Imported from `"@void/solid"`.
218
218
 
219
219
  Solid `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.
220
220
 
221
+ Solid re-creates the page on GET navigation and whenever the route or its params change, so `useForm()` picks up the destination record's URL and defaults; layouts persist. Within the same record, back/forward, mutations, and `router.refresh()` keep the page and update its props in place, as do resolved deferred props, so read props inside JSX or memos instead of copying them in the component body. Set `preserveState` explicitly to override the default for navigation within the same record.
222
+
221
223
  ## Markdown Package {#markdown-package}
222
224
 
223
225
  The optional `@void/md` package adds Markdown pages to Pages Routing. Install it alongside a Pages adapter and add `voidMarkdown()` to your Vite plugins.
@@ -25,6 +25,7 @@ Use this reference to find public imports, signatures, and return types. For set
25
25
  | [Durable State and WebSockets](./api/durable.md) | Persistent objects and typed connections. |
26
26
  | [Database and seeding](./api/database.md) | Queries, operators, and seed scripts. |
27
27
  | [KV, storage, AI, and logging](./api/resources.md) | Resource clients, cache revalidation, and logs. |
28
+ | [Deployment artifacts](./api/deploy.md) | Package built apps for managed deployment. |
28
29
  | [Types](./api/types.md) | Handler context, route types, and head metadata. |
29
30
  | [Environment variables](./api/env.md) | Validated environment values and binding types. |
30
31
  | [Pages adapters](./api/pages.md) | React, Vue, Svelte, Solid, and Markdown. |
@@ -41,7 +42,7 @@ Import Void's app-facing APIs from these paths:
41
42
  | `void/client` | `fetch`, `fetchStream`, `FetchError`, `auth`, `createAuthClient`, `AuthUser`, `AuthSession`, `AuthState` |
42
43
  | `void/client/{framework}` | Same as `void/client`, with framework-specific Better Auth clients for `react`, `vue`, `svelte`, and `solid` |
43
44
  | `void/ws` | `defineRoom`, `defineWebSocket`, `connect`, WebSocket context and connection types |
44
- | `void/durable` | `defineDurableState`, typed state/RPC/context/migration types |
45
+ | `void/durable` | `defineDurableState`, `defineDurableObject`, typed state/RPC/context/migration types |
45
46
  | `void/sse` | `eventStream`, `formatSse`, `formatSseText`, `getLastEventId`, `SseStreamClosedError`, SSE message and stream types |
46
47
  | `void/sse/client` | `connectEventStream`, browser `EventSource` wrapper types |
47
48
  | `void/live` | `defineLiveStream`, SSE topic fanout runtime types. Server-only. |
@@ -24,15 +24,21 @@ Show migration status. Displays which migrations are applied or pending locally,
24
24
 
25
25
  ## `void db reset` {#void-db-reset}
26
26
 
27
- Drop the development database and re-apply all migrations. D1 resets the local database; PostgreSQL and MySQL drop all tables in the `DATABASE_URL` database from `.env`. Does not affect the deployed database.
27
+ ```
28
+ void db reset [--yes]
29
+ ```
30
+
31
+ Drop the development database and re-apply all migrations. D1 resets the local database; PostgreSQL and MySQL drop all tables in the `DATABASE_URL` database from `.env`.
32
+
33
+ When that `DATABASE_URL` points to a host other than `localhost`, Void names the database and asks before dropping its tables. Pass `--yes` to skip the prompt in scripts and CI; without a terminal, the command stops unless `--yes` is set. If `.env` uses the same URL as your deployment (for example after `void db connect`), reset drops the deployed tables.
28
34
 
29
35
  ## `void db seed` {#void-db-seed}
30
36
 
31
37
  ```
32
- void db seed [--file <path>]
38
+ void db seed [--file <path>] [--yes]
33
39
  ```
34
40
 
35
- Reset the local database, re-apply all migrations, then execute a seed file.
41
+ Reset the local database, re-apply all migrations, then execute a seed file. The reset works like `void db reset`, including the prompt and `--yes`.
36
42
 
37
43
  If `--file` is omitted, Void looks for default seed files in this order: `db/seed.ts`, `db/seed.mts`, `db/seed.js`, `db/seed.mjs`, `db/seed.sql`.
38
44
 
@@ -40,7 +40,7 @@ The installed platform needs a separate runtime token to provision resources for
40
40
 
41
41
  To enable email during install or upgrade, set both `VOID_EMAIL_SENDER_DOMAIN` and `VOID_EMAIL_SHARED_ZONE_ID`. Void records the pair for later upgrades; supplying only one is an error.
42
42
 
43
- Use `--dashboard-url https://dash.example.com` when deploying the optional user
43
+ Use `--dashboard-url `[`https://dash.example.com`](https://dash.example.com) when deploying the optional user
44
44
  dashboard separately. The URL must be an HTTPS origin without credentials, a
45
45
  path, query, or fragment. Void permits that origin's login callbacks and saves
46
46
  it for later maintenance; it does not deploy a dashboard Worker. Omission keeps
@@ -33,6 +33,8 @@ void init [--tsconfig] [--github] [--git | --no-git]
33
33
 
34
34
  Set up a new or existing Void project. In an empty directory, choose Vite+ or Vite, a framework, and a D1, PostgreSQL, MySQL, or Static Pages starter.
35
35
 
36
+ Vite+ projects install dependencies through `vp install`; no global Vite+ installation is required. Void preserves existing package-manager versions and lockfiles. New Vite+ projects without a package-manager configuration use pnpm without pinning a version.
37
+
36
38
  In an existing app, Void adds missing dependencies and scripts and updates the Vite config. If it cannot edit your config, it prints the snippet to add.
37
39
 
38
40
  The wizard also sets up TypeScript, agent instructions, environment declarations, and a deployment target. Choose Cloudflare, a Void platform, or skip deployment setup. If you skip sign-in, run `void connect` when you're ready. See [Quick Start](../../guide/quickstart.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "void",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "Full-stack framework and deployment CLI for Cloudflare Workers, powered by Vite.",
5
5
  "homepage": "https://void.cloud",
6
6
  "bugs": {
@@ -26,23 +26,15 @@
26
26
  ],
27
27
  "type": "module",
28
28
  "imports": {
29
- "#self": "./dist/index.mjs",
30
29
  "#self/_env": "./dist/runtime/env.mjs",
31
30
  "#self/email": "./dist/runtime/email.mjs",
32
31
  "#self/env": "./dist/runtime/env-public.mjs",
33
32
  "#self/client": "./dist/runtime/client.mjs",
34
33
  "#self/handler": "./dist/runtime/handler.mjs",
35
- "#self/pages-head": "./dist/pages/head.mjs",
36
- "#self/pages-protocol": "./dist/pages/protocol.mjs",
37
34
  "#self/queues": "./dist/runtime/queues.mjs",
38
35
  "#self/remote": "./dist/runtime/remote/index.mjs",
39
36
  "#self/remote/binding-handler": "./dist/runtime/remote/binding-handler.mjs",
40
- "#self/response": "./dist/runtime/response.mjs",
41
37
  "#self/sandbox": "./dist/runtime/sandbox.mjs",
42
- "#self/sse": "./dist/runtime/sse.mjs",
43
- "#self/sse/client": "./dist/runtime/sse-client.mjs",
44
- "#self/live": "./dist/runtime/live.mjs",
45
- "#self/live/client": "./dist/runtime/live-client.mjs",
46
38
  "#self/runtime/live-server": "./dist/runtime/live-server.mjs",
47
39
  "#self/runtime/fetch": "./dist/runtime/fetch.mjs",
48
40
  "#self/runtime/fetch-stream": "./dist/runtime/fetch-stream.mjs",
@@ -335,6 +327,10 @@
335
327
  "types": "./dist/runtime/limits.d.mts",
336
328
  "import": "./dist/runtime/limits.mjs",
337
329
  "require": "./dist/runtime/limits.mjs"
330
+ },
331
+ "./deploy": {
332
+ "types": "./dist/deploy.d.mts",
333
+ "import": "./dist/deploy.mjs"
338
334
  }
339
335
  },
340
336
  "dependencies": {
@@ -346,11 +342,11 @@
346
342
  "@cloudflare/workers-auth": "^0.13.1",
347
343
  "@cloudflare/workers-types": "^5.20261009.1",
348
344
  "@napi-rs/keyring": "^2.1.0",
349
- "@void/deploy-cloudflare": "0.27.0",
350
- "@void/deploy-core": "0.27.0",
351
- "@void/edge": "0.27.0",
352
- "@void/isr": "0.27.0",
353
- "@void/platform": "0.27.0",
345
+ "@void/deploy-cloudflare": "0.28.0",
346
+ "@void/deploy-core": "0.28.0",
347
+ "@void/edge": "0.28.0",
348
+ "@void/isr": "0.28.0",
349
+ "@void/platform": "0.28.0",
354
350
  "better-auth": "^1.7.7",
355
351
  "better-sqlite3": "^13.0.3",
356
352
  "blake3-jit": "^1.1.0",
@@ -371,7 +367,8 @@
371
367
  "mysql2": "^3.24.5",
372
368
  "pg": "^8.23.1",
373
369
  "postal-mime": "^4.0.5",
374
- "proper-lockfile": "^4.1.2"
370
+ "proper-lockfile": "^4.1.2",
371
+ "terminal-link": "^5.0.0"
375
372
  },
376
373
  "devDependencies": {
377
374
  "@electric-sql/pglite": "0.5.8",
@@ -397,7 +394,7 @@
397
394
  "zod": "^4.6.5"
398
395
  },
399
396
  "peerDependencies": {
400
- "@void/md": "0.27.0",
397
+ "@void/md": "0.28.0",
401
398
  "arktype": ">=2.0.0",
402
399
  "valibot": ">=1.0.0-beta.7",
403
400
  "vite": "^8.0.0",
@@ -51,6 +51,7 @@ the app's existing saved destination, including when the target project is new.
51
51
  | SSR and caching | `docs/guide/ssr.md`, `docs/guide/edge/*.md` |
52
52
  | Rewrites, redirects, fallbacks | `docs/guide/edge/rewrites.md`, `docs/guide/edge/redirects.md`, `docs/reference/config.md` |
53
53
  | Static site generation | `docs/guide/ssg.md` |
54
+ | Connected apps and artifact preparation | `docs/guide/platform/administration/connected-apps.md`, `docs/reference/api/deploy.md` |
54
55
  | Deployment and CI | `docs/guide/deployment.md`, `docs/reference/cli/deploy.md` |
55
56
  | Install or maintain a company platform | `docs/guide/self-hosted-platform.md`, `docs/reference/cli/platform-installation.md` |
56
57
  | Develop or deploy a platform fork | `docs/guide/platform-development.md`, `docs/guide/self-hosted-platform.md` |
@@ -1,2 +0,0 @@
1
- import { a as getApiUrl, m as runPlatformLogin, s as getSiteDomain } from "./auth-Dn2vw-SG.mjs";
2
- export { getApiUrl, getSiteDomain, runPlatformLogin };
@@ -1,2 +0,0 @@
1
- import { t as prepareCfBuildOutput } from "./cf-build-output-DjvB_872.mjs";
2
- export { prepareCfBuildOutput };
@@ -1,17 +0,0 @@
1
- import { a as join } from "./dist-BVqXeR_h.mjs";
2
- import { n as getPackageDir } from "./agents-B_pX_HmQ.mjs";
3
- import { readFileSync } from "node:fs";
4
- //#region src/cli/cf-user-agent.ts
5
- let voidUserAgent;
6
- let cfCliVersion;
7
- function getVoidUserAgent() {
8
- if (voidUserAgent === void 0) voidUserAgent = `void/${JSON.parse(readFileSync(join(getPackageDir(), "package.json"), "utf8")).version}`;
9
- return voidUserAgent;
10
- }
11
- /** cf prepends `cf-cli/` to CLI_VERSION for both API requests and uploads. */
12
- function getCfCliVersion() {
13
- if (cfCliVersion === void 0) cfCliVersion = `${JSON.parse(readFileSync(new URL(import.meta.resolve("cf/package.json")), "utf8")).version} ${getVoidUserAgent()}`;
14
- return cfCliVersion;
15
- }
16
- //#endregion
17
- export { getVoidUserAgent as n, getCfCliVersion as t };
@@ -1,2 +0,0 @@
1
- import { r as PlatformClient } from "./client-DlDJuY0s.mjs";
2
- export { PlatformClient };
@@ -1,2 +0,0 @@
1
- import { t as collectMigrations } from "./collect-DiTn9yr6.mjs";
2
- export { collectMigrations };
@@ -1,2 +0,0 @@
1
- import { m as readConfig, u as getDatabaseDialect } from "./config-DiowPT80.mjs";
2
- export { getDatabaseDialect, readConfig };
@@ -1,89 +0,0 @@
1
- import { a as join, i as isAbsolute } from "./dist-BVqXeR_h.mjs";
2
- import { fileURLToPath } from "node:url";
3
- import { isSandboxRegistryImage } from "@void/deploy-core";
4
- //#region src/sandbox/config.ts
5
- const DEFAULT_SANDBOX_BINDING = "SANDBOX";
6
- const DEFAULT_SANDBOX_CLASS_NAME = "SandboxV1";
7
- const DEFAULT_SANDBOX_CONTAINER_NAME = "void-sandbox-v1";
8
- const SANDBOX_MIGRATION_TAG = "void-sandbox-v2";
9
- function isSandboxEnabled(config) {
10
- return config.sandbox !== void 0 && config.sandbox !== false;
11
- }
12
- function getDefaultSandboxImage() {
13
- return fileURLToPath(new URL("../../sandbox.Dockerfile", import.meta.resolve("void/sandbox")));
14
- }
15
- function getDefaultSandboxPlatformImage() {
16
- return "cloudflare/debian-trixie";
17
- }
18
- function isLocalSandboxImage(image) {
19
- return isAbsolute(image) || image.startsWith("./") || image.startsWith("../") || image.toLowerCase().includes("dockerfile");
20
- }
21
- function requiresSandboxPlatformImage(config) {
22
- if (typeof config.sandbox !== "object" || config.sandbox === null) return false;
23
- return typeof config.sandbox.image === "string" && isLocalSandboxImage(config.sandbox.image) && config.sandbox.platformImage === void 0;
24
- }
25
- function resolveSandboxConfig(config, root = process.cwd()) {
26
- const raw = typeof config.sandbox === "object" ? config.sandbox : {};
27
- const image = raw.image ?? getDefaultSandboxImage();
28
- const imageBuildContext = raw.imageBuildContext;
29
- const platformImage = raw.platformImage ?? (raw.image && !isLocalSandboxImage(raw.image) ? raw.image : getDefaultSandboxPlatformImage());
30
- if (!isLocalSandboxImage(image) && !isSandboxRegistryImage(image)) throw new Error("sandbox.image must be a Dockerfile or a digest-pinned Cloudflare registry image (registry.cloudflare.com/<account>/<image>@sha256:<digest>).");
31
- if (platformImage !== getDefaultSandboxPlatformImage() && !isSandboxRegistryImage(platformImage)) throw new Error("sandbox.platformImage must be a digest-pinned Cloudflare registry image (registry.cloudflare.com/<account>/<image>@sha256:<digest>).");
32
- return {
33
- binding: raw.binding ?? "SANDBOX",
34
- className: raw.className ?? "SandboxV1",
35
- containerName: raw.containerName ?? DEFAULT_SANDBOX_CONTAINER_NAME,
36
- image: resolveSandboxImage(image, root),
37
- platformImage,
38
- ...imageBuildContext && { imageBuildContext: isAbsolute(imageBuildContext) ? imageBuildContext : join(root, imageBuildContext) },
39
- ...raw.instanceType && { instanceType: raw.instanceType }
40
- };
41
- }
42
- function resolveSandboxImage(image, root) {
43
- if (!isLocalSandboxImage(image) || isAbsolute(image)) return image;
44
- return join(root, image);
45
- }
46
- function sandboxContainerConfig(sandbox) {
47
- return {
48
- name: sandbox.containerName,
49
- class_name: sandbox.className,
50
- scheduling_policy: "durable_object",
51
- images: { default: isLocalSandboxImage(sandbox.image) ? {
52
- dockerfile: sandbox.image,
53
- ...sandbox.imageBuildContext && { build_context: sandbox.imageBuildContext }
54
- } : { image: sandbox.image } }
55
- };
56
- }
57
- /** Resolve the final local storage kind without recreating a renamed or deleted class. */
58
- function resolveSandboxMigrationStorage(migrations, className) {
59
- const storage = /* @__PURE__ */ new Map();
60
- for (const migration of migrations) {
61
- for (const name of migration.new_classes ?? []) storage.set(name, "legacy-kv");
62
- for (const name of migration.new_sqlite_classes ?? []) storage.set(name, "sqlite");
63
- for (const rename of migration.renamed_classes ?? []) {
64
- const sqlite = storage.get(rename.from);
65
- storage.delete(rename.from);
66
- storage.set(rename.to, sqlite ?? "unknown");
67
- }
68
- for (const transfer of migration.transferred_classes ?? []) storage.set(transfer.to, "unknown");
69
- for (const name of migration.deleted_classes ?? []) storage.delete(name);
70
- }
71
- return storage.get(className);
72
- }
73
- function hasSandboxSqliteMigration(migrations, className) {
74
- return resolveSandboxMigrationStorage(migrations, className) === "sqlite";
75
- }
76
- /** Refuse namespace reuse before either uploader can change a live Worker. */
77
- function assertSandboxNamespaceConfig(config, sandbox) {
78
- const containers = Array.isArray(config.containers) ? config.containers : [];
79
- const durable = config.durable_objects;
80
- const binding = durable?.bindings?.find((entry) => entry.name === sandbox.binding);
81
- if (binding && (binding.script_name !== void 0 || binding.environment !== void 0)) throw new Error(`sandbox: binding '${sandbox.binding}' must reference the local '${sandbox.className}' class. Choose another sandbox.binding name to preserve the existing external Durable Object.`);
82
- const migrations = Array.isArray(config.migrations) ? config.migrations : [];
83
- const storage = resolveSandboxMigrationStorage(migrations, sandbox.className);
84
- if (storage === "legacy-kv" || storage === "unknown") throw new Error(`sandbox: class '${sandbox.className}' needs SQLite storage, but its existing namespace has ${storage} storage. Preserve the existing migration history and choose a fresh Worker name or a new sandbox.className and sandbox.binding.`);
85
- if (storage !== "sqlite" && migrations.some((migration) => migration.tag === "void-sandbox-v2")) throw new Error(`sandbox: migration tag '${SANDBOX_MIGRATION_TAG}' is already configured for another class. Keep the existing history and choose a fresh Worker for Sandbox.`);
86
- if (containers.some((container) => container.class_name === sandbox.className && container.scheduling_policy !== "durable_object") || durable?.bindings?.some((binding) => binding.name === sandbox.binding && binding.class_name !== sandbox.className)) throw new Error("Sandbox SDK 1.0 needs a new Durable Object namespace. Back up existing Sandbox data and deploy to a fresh Worker name with the new Sandbox configuration; remove legacy Sandbox bindings, containers, and migrations from that new Worker configuration. See https://developers.cloudflare.com/containers/guides/migrate-to-durable-object-scheduling-policy/.");
87
- }
88
- //#endregion
89
- export { hasSandboxSqliteMigration as a, resolveSandboxConfig as c, assertSandboxNamespaceConfig as i, sandboxContainerConfig as l, DEFAULT_SANDBOX_CLASS_NAME as n, isSandboxEnabled as o, SANDBOX_MIGRATION_TAG as r, requiresSandboxPlatformImage as s, DEFAULT_SANDBOX_BINDING as t };
@@ -1,2 +0,0 @@
1
- import { n as writeDrizzleConfig, t as withPrivateDrizzleConfig } from "./config-CLYAosnQ.mjs";
2
- export { withPrivateDrizzleConfig, writeDrizzleConfig };