void 0.22.0 → 0.23.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 (276) hide show
  1. package/README.md +5 -1
  2. package/dist/{account-cmd-CjyxcGkM.mjs → account-cmd-C84Ee8cO.mjs} +4 -4
  3. package/dist/{scan-ClYmX3sa.mjs → application-analysis-BVsVqc11.mjs} +135 -18
  4. package/dist/application-routing-B7QEjqSR.mjs +27 -0
  5. package/dist/{auth-CZuiVsFh.mjs → auth-CCjt0hcq.mjs} +1 -1
  6. package/dist/{auth-DLNN0D3Z.mjs → auth-CSkdO2Bb.mjs} +4 -47
  7. package/dist/{auth-link-BLO4ptzo.mjs → auth-link-CioEg6uY.mjs} +4 -4
  8. package/dist/{auth-router-ZUg9MF_U.mjs → auth-router-BsR981d4.mjs} +4 -4
  9. package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
  10. package/dist/{build-cmd-BxR5FROK.mjs → build-cmd-LzvNJORH.mjs} +17 -5
  11. package/dist/{cache-D0sWhgKI.mjs → cache-C4MvnrMH.mjs} +2 -2
  12. package/dist/{cancel-deploy-D4NUqFbi.mjs → cancel-deploy-abUxpP2n.mjs} +2 -2
  13. package/dist/{cf-build-output-BJ6yGEIS.mjs → cf-build-output-BPqOT964.mjs} +2 -1
  14. package/dist/cf-build-output-_0HNWysu.mjs +2 -0
  15. package/dist/cli/cli.mjs +80 -455
  16. package/dist/cli/{cf-compat.mjs → cloudflare-operation-process.mjs} +442 -421
  17. package/dist/cli/env-schema-probe.d.mts +2 -1
  18. package/dist/cli/env-schema-probe.mjs +3 -3
  19. package/dist/client-Cu7jWiF1.mjs +2 -0
  20. package/dist/{client-BTZ3XkrB.mjs → client-RV8NVeB8.mjs} +140 -21
  21. package/dist/{cloudflare-auth-DQkqoMYa.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -38
  22. package/dist/{cloudflare-cmd-BKlfGHAy.mjs → cloudflare-cmd-BcrVyTmJ.mjs} +5 -5
  23. package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
  24. package/dist/{cloudflare-connect-Ctmrw579.mjs → cloudflare-connect-B8uPZ4nx.mjs} +3 -3
  25. package/dist/{cloudflare-operations-BT6OWFBk.mjs → cloudflare-operations-AiWashgg.mjs} +1 -1
  26. package/dist/{cloudflare-operations-B9tzgjmf.mjs → cloudflare-operations-fxHb-byx.mjs} +116 -172
  27. package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
  28. package/dist/{config-VavjpDnp.d.mts → config-BMHb8RCj.d.mts} +1 -0
  29. package/dist/config-C_XRIPx2.mjs +89 -0
  30. package/dist/config-entry.d.mts +1 -1
  31. package/dist/{connect-Dg-WkW-C.mjs → connect-Bd4kJd9U.mjs} +5 -5
  32. package/dist/{create-project-DdoqwFLF.mjs → create-project-Boczwj5r.mjs} +1 -1
  33. package/dist/{create-project-l9J7pbtm.mjs → create-project-bMf6ffLZ.mjs} +2 -2
  34. package/dist/{db-gp2sCXyN.mjs → db-8uG64XLl.mjs} +21 -21
  35. package/dist/{delete-TTedbH6B.mjs → delete-NvbiyeJf.mjs} +2 -2
  36. package/dist/{deploy-CH-o2CaZ.mjs → deploy-DzAIwqNU.mjs} +908 -582
  37. package/dist/{deploy-B19L2Bra.mjs → deploy-bjXdFCtn.mjs} +1 -1
  38. package/dist/{domain-JRF59P_r.mjs → domain-y5Tvydvo.mjs} +3 -3
  39. package/dist/{email-Bo6G9LOZ.mjs → email-B3umsW75.mjs} +13 -28
  40. package/dist/{env-BYOrWQnv.mjs → env-BS6qYHDb.mjs} +4 -4
  41. package/dist/{env-public-BxU_0yTL.d.mts → env-public-BX_r8HR6.d.mts} +1 -1
  42. package/dist/{env-validation-BB4GkLxn.mjs → env-validation-BPn7vk-V.mjs} +18 -71
  43. package/dist/{env-validation-BXge7uyK.mjs → env-validation-DbTg7-ar.mjs} +1 -1
  44. package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
  45. package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
  46. package/dist/{gen-sCtlCOdA.mjs → gen-B580--vC.mjs} +2 -2
  47. package/dist/gen-BVaUUumi.mjs +2 -0
  48. package/dist/{github-cmd-0-7PexDq.mjs → github-cmd-v45BdfKX.mjs} +2 -2
  49. package/dist/{handler-HEcZsaij.d.mts → handler-CZ4nAylQ.d.mts} +1 -1
  50. package/dist/help-DofyZuY7.mjs +2 -0
  51. package/dist/{help-GKtwl07I.mjs → help-daGKjXGk.mjs} +229 -747
  52. package/dist/index.d.mts +1 -1
  53. package/dist/index.mjs +288 -1502
  54. package/dist/info-B97bTX9N.mjs +113 -0
  55. package/dist/{init-FZx3Elvz.mjs → init-Bvy7zrBo.mjs} +46 -15
  56. package/dist/limits-Bq5LG8Id.d.mts +27 -0
  57. package/dist/limits-Cjuk2VPm.mjs +68 -0
  58. package/dist/{link-BrQfb_CU.mjs → link-CDqqCjFl.mjs} +3 -3
  59. package/dist/{list-D44jmIAM.mjs → list-CZj0dzKY.mjs} +3 -3
  60. package/dist/{live-CKJlvlNp.d.mts → live-Chw1eIMv.d.mts} +1 -1
  61. package/dist/{local-d1-Bg9OzEEO.mjs → local-d1-2CMnpuW_.mjs} +2 -2
  62. package/dist/login-DYt_An22.mjs +2 -0
  63. package/dist/{login-CAsAsQ-_.mjs → login-UZKFM_u7.mjs} +3 -3
  64. package/dist/{logs-BjKvFnVM.mjs → logs-CUZ6t9t3.mjs} +3 -3
  65. package/dist/migrate-8_2u55MD.mjs +2 -0
  66. package/dist/{migrate-BPITvDJN.mjs → migrate-DHul7PRV.mjs} +2 -1
  67. package/dist/{node-Dt7z256D.mjs → node-BkyRWRx8.mjs} +1 -1
  68. package/dist/operator-args-CLgKGlwU.mjs +690 -0
  69. package/dist/{operator-cmd-BK5CCiT9.mjs → operator-cmd-DBA6dl0m.mjs} +68 -22
  70. package/dist/pages/client.d.mts +34 -2
  71. package/dist/pages/client.mjs +59 -3
  72. package/dist/pages/index.d.mts +1 -1
  73. package/dist/pages/index.mjs +1 -1
  74. package/dist/pages/islands-plugin.mjs +1 -1
  75. package/dist/pages/protocol.d.mts +2 -2
  76. package/dist/pages/protocol.mjs +2 -308
  77. package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
  78. package/dist/plan-D1Q5rf-r.mjs +2 -0
  79. package/dist/plan-NPpwZ_kc.mjs +58 -0
  80. package/dist/platform-args-BJdRtlLq.mjs +506 -0
  81. package/dist/platform-args-D3RXyR6h.mjs +2 -0
  82. package/dist/{platform-auth-config-BlN8xTdD.mjs → platform-auth-config-B56E9YP1.mjs} +3 -3
  83. package/dist/{platform-auth-protection-7d5aV2Jg.mjs → platform-auth-protection-BDWO_aER.mjs} +2 -2
  84. package/dist/{platform-auth-recovery-Dxij8ZbR.mjs → platform-auth-recovery-1gg4CSRe.mjs} +3 -3
  85. package/dist/{platform-cmd-E0FuL212.mjs → platform-cmd-Bt-1w6pY.mjs} +1 -1
  86. package/dist/{platform-cmd-B3hwKrFK.mjs → platform-cmd-DMcQStSc.mjs} +24 -3
  87. package/dist/{platform-domain-D6Xcy9ZX.mjs → platform-domain-BNkcz0OB.mjs} +2 -2
  88. package/dist/{platform-lifecycle-k0E0xoxx.mjs → platform-lifecycle-9OyBALhH.mjs} +327 -215
  89. package/dist/{platform-lifecycle-DMh_qrry.mjs → platform-lifecycle-BE6C_jxh.mjs} +1 -1
  90. package/dist/{platform-management-Brz_BDiT.mjs → platform-management-CjwLVQwN.mjs} +6 -3
  91. package/dist/{platform-management-DOtss0BN.mjs → platform-management-CnyTdcWX.mjs} +1 -1
  92. package/dist/platform-plans-config-BNGKGr4P.mjs +359 -0
  93. package/dist/{platform-recovery-BvtcXON5.mjs → platform-recovery-D6KSpuFm.mjs} +2 -2
  94. package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
  95. package/dist/{prepare-C-6YZyyg.mjs → prepare-B5Mkic5u.mjs} +1 -1
  96. package/dist/{prepare-CRhJbVrG.mjs → prepare-DOsL0CC9.mjs} +4 -20
  97. package/dist/prepare-cgvDMtSb.mjs +2 -0
  98. package/dist/{project-cmd-BZLCqOqw.mjs → project-cmd-CNzrqvBv.mjs} +16 -16
  99. package/dist/{project-team-BvgM0WoX.mjs → project-team-DQOWPfQT.mjs} +2 -2
  100. package/dist/{project-token-l5DqK6Az.mjs → project-token-CTDYU0Cc.mjs} +2 -2
  101. package/dist/{project-zero-trust-v6Mvpp8y.mjs → project-zero-trust-BNAkW-_0.mjs} +2 -2
  102. package/dist/{protocol-BBa6cstI.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
  103. package/dist/protocol-U7bfjHmA.mjs +331 -0
  104. package/dist/{provision-Fr9pRqce.mjs → provision-C4ORE7G7.mjs} +1 -1
  105. package/dist/{provision-C4IGqkBf.mjs → provision-CJFgTZY8.mjs} +89 -198
  106. package/dist/{requests-DN-BbNiM.mjs → requests-MhxYnau8.mjs} +2 -2
  107. package/dist/resource-name-C7LVpcRm.mjs +11 -0
  108. package/dist/{rollback-D7rzSaZM.mjs → rollback-CJ6iSDoU.mjs} +3 -3
  109. package/dist/route-url-CG7U-cRN.mjs +15 -0
  110. package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
  111. package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
  112. package/dist/runtime/ai.d.mts +12 -8
  113. package/dist/runtime/ai.mjs +84 -17
  114. package/dist/runtime/better-auth-mysql.mjs +1 -1
  115. package/dist/runtime/better-auth-pg.mjs +1 -1
  116. package/dist/runtime/better-auth.mjs +1 -1
  117. package/dist/runtime/client-react.mjs +2 -2
  118. package/dist/runtime/client-solid.mjs +2 -2
  119. package/dist/runtime/client-svelte.mjs +2 -2
  120. package/dist/runtime/client-vue.mjs +2 -2
  121. package/dist/runtime/client.mjs +2 -2
  122. package/dist/runtime/durable.d.mts +3 -1
  123. package/dist/runtime/durable.mjs +4 -1
  124. package/dist/runtime/email/testing.mjs +1 -1
  125. package/dist/runtime/env-public.d.mts +1 -1
  126. package/dist/runtime/fetch-stream.mjs +1 -1
  127. package/dist/runtime/fetch.mjs +1 -1
  128. package/dist/runtime/handler.d.mts +1 -1
  129. package/dist/runtime/kv.mjs +0 -1
  130. package/dist/runtime/limits.d.mts +2 -0
  131. package/dist/runtime/limits.mjs +2 -0
  132. package/dist/runtime/live-client.d.mts +1 -1
  133. package/dist/runtime/live-server.mjs +25 -16
  134. package/dist/runtime/live.d.mts +1 -1
  135. package/dist/runtime/migration-handler.mjs +62 -42
  136. package/dist/runtime/route-url.d.mts +4 -0
  137. package/dist/runtime/route-url.mjs +2 -0
  138. package/dist/runtime/routing.d.mts +180 -0
  139. package/dist/runtime/routing.mjs +1082 -0
  140. package/dist/runtime/sandbox-container.d.mts +1 -1
  141. package/dist/runtime/sandbox-container.mjs +1 -1
  142. package/dist/runtime/sandbox.d.mts +3 -3
  143. package/dist/runtime/sandbox.mjs +75 -45
  144. package/dist/runtime/sse.mjs +1 -1
  145. package/dist/runtime/validator.d.mts +1 -1
  146. package/dist/runtime/ws-server.d.mts +4 -2
  147. package/dist/runtime/ws-server.mjs +27 -2
  148. package/dist/runtime/ws.d.mts +2 -2
  149. package/dist/runtime/ws.mjs +8 -6
  150. package/dist/{sandbox-qpNBT8a3.d.mts → sandbox-XZAqzFlG.d.mts} +11 -8
  151. package/dist/{sandbox-container-DdNEBfCc.d.mts → sandbox-container-Bo0eiFKz.d.mts} +2 -1
  152. package/dist/{sandbox-container-4fdqLnyb.mjs → sandbox-container-C6ItmVuN.mjs} +4 -2
  153. package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
  154. package/dist/{secret-BOtOl_cb.mjs → secret-Dli5fP0B.mjs} +4 -4
  155. package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
  156. package/dist/validate-Dq_L3s0S.mjs +2 -0
  157. package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
  158. package/dist/{wrangler-DQF1vKyf.mjs → wrangler-7K-bW_DL.mjs} +8 -239
  159. package/dist/{ws-BoY7vQML.d.mts → ws-CL1w7GXU.d.mts} +13 -2
  160. package/package.json +15 -8
  161. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
  162. package/skills/void/SKILL.md +50 -135
  163. package/skills/void/docs/guide/ai.md +94 -84
  164. package/skills/void/docs/guide/app-types.md +3 -32
  165. package/skills/void/docs/guide/auth.md +12 -116
  166. package/skills/void/docs/guide/database/d1.md +9 -54
  167. package/skills/void/docs/guide/database/mysql.md +1 -1
  168. package/skills/void/docs/guide/database/postgresql.md +5 -26
  169. package/skills/void/docs/guide/database.md +23 -75
  170. package/skills/void/docs/guide/deployment.md +27 -113
  171. package/skills/void/docs/guide/durable-state.md +43 -18
  172. package/skills/void/docs/guide/edge/headers.md +3 -47
  173. package/skills/void/docs/guide/edge/prerendering.md +5 -20
  174. package/skills/void/docs/guide/edge/redirects.md +11 -64
  175. package/skills/void/docs/guide/edge/revalidation.md +5 -18
  176. package/skills/void/docs/guide/edge/rewrites.md +56 -284
  177. package/skills/void/docs/guide/edge/static-assets.md +22 -72
  178. package/skills/void/docs/guide/email/domains.md +112 -0
  179. package/skills/void/docs/guide/email/receiving.md +139 -0
  180. package/skills/void/docs/guide/email/sending.md +231 -0
  181. package/skills/void/docs/guide/email.md +13 -619
  182. package/skills/void/docs/guide/env-migration.md +11 -11
  183. package/skills/void/docs/guide/env-vars.md +9 -29
  184. package/skills/void/docs/guide/index.md +0 -15
  185. package/skills/void/docs/guide/jobs.md +3 -18
  186. package/skills/void/docs/guide/kv.md +5 -11
  187. package/skills/void/docs/guide/live.md +5 -56
  188. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
  189. package/skills/void/docs/guide/pages-routing/head.md +10 -10
  190. package/skills/void/docs/guide/pages-routing/islands.md +6 -36
  191. package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
  192. package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
  193. package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
  194. package/skills/void/docs/guide/pages-routing/overview.md +7 -17
  195. package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
  196. package/skills/void/docs/guide/platform/administration/access.md +1 -4
  197. package/skills/void/docs/guide/platform/administration/email.md +35 -8
  198. package/skills/void/docs/guide/platform/administration/operations.md +26 -4
  199. package/skills/void/docs/guide/platform/administration/plans.md +126 -0
  200. package/skills/void/docs/guide/platform/administration/projects.md +5 -2
  201. package/skills/void/docs/guide/platform/administration/zero-trust.md +23 -152
  202. package/skills/void/docs/guide/platform/development/runtime.md +3 -13
  203. package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
  204. package/skills/void/docs/guide/platform/installation/credentials.md +6 -4
  205. package/skills/void/docs/guide/platform/installation/domains.md +30 -2
  206. package/skills/void/docs/guide/platform/installation/first-deployment.md +2 -0
  207. package/skills/void/docs/guide/platform/installation/maintenance.md +3 -1
  208. package/skills/void/docs/guide/platform/installation/prerequisites.md +20 -15
  209. package/skills/void/docs/guide/platform/installation/setup.md +9 -5
  210. package/skills/void/docs/guide/platform-administration.md +1 -0
  211. package/skills/void/docs/guide/queues.md +7 -9
  212. package/skills/void/docs/guide/quickstart.md +38 -37
  213. package/skills/void/docs/guide/remote-dev.md +4 -9
  214. package/skills/void/docs/guide/sandboxes.md +29 -21
  215. package/skills/void/docs/guide/server-routing.md +9 -72
  216. package/skills/void/docs/guide/sse.md +4 -18
  217. package/skills/void/docs/guide/ssg.md +3 -15
  218. package/skills/void/docs/guide/ssr.md +14 -62
  219. package/skills/void/docs/guide/storage.md +9 -4
  220. package/skills/void/docs/guide/type-safety.md +3 -14
  221. package/skills/void/docs/guide/typed-fetch.md +3 -7
  222. package/skills/void/docs/guide/websockets.md +68 -40
  223. package/skills/void/docs/integrations/agents.md +3 -3
  224. package/skills/void/docs/integrations/cloudflare.md +85 -316
  225. package/skills/void/docs/integrations/frameworks/analog.md +5 -64
  226. package/skills/void/docs/integrations/frameworks/astro.md +4 -73
  227. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
  228. package/skills/void/docs/integrations/frameworks/overview.md +11 -54
  229. package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
  230. package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
  231. package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
  232. package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
  233. package/skills/void/docs/reference/api/auth.md +156 -0
  234. package/skills/void/docs/reference/api/client.md +87 -0
  235. package/skills/void/docs/reference/api/database.md +95 -0
  236. package/skills/void/docs/reference/api/durable.md +46 -0
  237. package/skills/void/docs/reference/api/env.md +50 -0
  238. package/skills/void/docs/reference/api/handlers.md +254 -0
  239. package/skills/void/docs/reference/api/pages.md +241 -0
  240. package/skills/void/docs/reference/api/plugin.md +39 -0
  241. package/skills/void/docs/reference/api/resources.md +109 -0
  242. package/skills/void/docs/reference/api/rewrites.md +76 -0
  243. package/skills/void/docs/reference/api/types.md +92 -0
  244. package/skills/void/docs/reference/api.md +56 -1218
  245. package/skills/void/docs/reference/cli/auth.md +88 -0
  246. package/skills/void/docs/reference/cli/database.md +128 -0
  247. package/skills/void/docs/reference/cli/deploy.md +85 -0
  248. package/skills/void/docs/reference/cli/domains.md +41 -0
  249. package/skills/void/docs/reference/cli/email.md +129 -0
  250. package/skills/void/docs/reference/cli/generate.md +116 -0
  251. package/skills/void/docs/reference/cli/github.md +189 -0
  252. package/skills/void/docs/reference/cli/platform-config.md +92 -0
  253. package/skills/void/docs/reference/cli/platform-email.md +81 -0
  254. package/skills/void/docs/reference/cli/platform-installation.md +127 -0
  255. package/skills/void/docs/reference/cli/platform-operations.md +90 -0
  256. package/skills/void/docs/reference/cli/platform-users.md +89 -0
  257. package/skills/void/docs/reference/cli/platform-zero-trust.md +45 -0
  258. package/skills/void/docs/reference/cli/platform.md +70 -0
  259. package/skills/void/docs/reference/cli/project.md +214 -0
  260. package/skills/void/docs/reference/cli/secrets.md +76 -0
  261. package/skills/void/docs/reference/cli/setup.md +70 -0
  262. package/skills/void/docs/reference/cli.md +32 -1682
  263. package/skills/void/docs/reference/config.md +12 -18
  264. package/skills/void/docs/reference/resource-inference.md +3 -58
  265. package/skills/void/docs/reference/structure.md +14 -41
  266. package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
  267. package/dist/client-Czz8o5jP.mjs +0 -2
  268. package/dist/gen-CNJ62MM7.mjs +0 -2
  269. package/dist/help-CmZzxUba.mjs +0 -2
  270. package/dist/login-CGcRKEoi.mjs +0 -2
  271. package/dist/migrate-CYfbKkXh.mjs +0 -2
  272. package/dist/plan-BEZ8VJW0.mjs +0 -256
  273. package/dist/plan-DpuOr14e.mjs +0 -2
  274. package/dist/prepare-Bm3iq-u4.mjs +0 -2
  275. package/dist/validate-EKmJWxmy.mjs +0 -2
  276. /package/dist/cli/{cf-compat.d.mts → cloudflare-operation-process.d.mts} +0 -0
@@ -1,243 +1,12 @@
1
- import { a as join, i as isAbsolute, n as dirname, o as normalize, t as basename } from "./dist-BVqXeR_h.mjs";
1
+ import { a as join, n as dirname, o as normalize, t as basename } from "./dist-BVqXeR_h.mjs";
2
2
  import "./project-paths-GgcMozYz.mjs";
3
3
  import { m as readConfig } from "./config-Br_JZD6u.mjs";
4
- import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
5
- import { fileURLToPath } from "node:url";
6
- import { appendSqliteClassMigration, isSandboxRegistryImage } from "@void/deploy-core";
7
- import { createHash, randomUUID } from "node:crypto";
4
+ import { a as hasSandboxSqliteMigration, c as resolveSandboxConfig, i as assertSandboxNamespaceConfig, l as sandboxContainerConfig, r as SANDBOX_MIGRATION_TAG } from "./config-C_XRIPx2.mjs";
5
+ import { i as persistCloudflareConfig, r as materializeCloudflareConfig } from "./cloudflare-config-Bktvwtpf.mjs";
6
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { appendSqliteClassMigration } from "@void/deploy-core";
8
+ import { createHash } from "node:crypto";
8
9
  import { SyntaxKind, applyEdits, createScanner, findNodeAtLocation, modify, parse, parseTree } from "jsonc-parser";
9
- import { isDeepStrictEqual } from "node:util";
10
- //#region src/cloudflare-config.ts
11
- const MATERIALIZED_CLOUDFLARE_FILE = ".void-wrangler.jsonc";
12
- const VOID_LOCK_FILE = "void.lock.json";
13
- const PREVIEW_POINTER_FILE = "preview-deploy-config.json";
14
- function isObject(value) {
15
- return typeof value === "object" && value !== null && !Array.isArray(value);
16
- }
17
- function arrayIdentity(value) {
18
- if (isObject(value)) {
19
- for (const key of [
20
- "binding",
21
- "name",
22
- "tag",
23
- "class_name",
24
- "pattern",
25
- "route"
26
- ]) if (typeof value[key] === "string") return `${key}:${value[key]}`;
27
- }
28
- return JSON.stringify(value) ?? String(value);
29
- }
30
- /** Keep authored values authoritative while retaining fields produced by Void. */
31
- function mergeConfig(previous, resolved, authored) {
32
- if (isDeepStrictEqual(previous, authored)) return resolved;
33
- if (Array.isArray(previous) && Array.isArray(resolved) && Array.isArray(authored)) {
34
- const previousByIdentity = new Map(previous.map((item) => [arrayIdentity(item), item]));
35
- const resolvedByIdentity = new Map(resolved.map((item) => [arrayIdentity(item), item]));
36
- const authoredIdentities = new Set(authored.map(arrayIdentity));
37
- return [...authored.map((item) => {
38
- const identity = arrayIdentity(item);
39
- return previousByIdentity.has(identity) && resolvedByIdentity.has(identity) ? mergeConfig(previousByIdentity.get(identity), resolvedByIdentity.get(identity), item) : item;
40
- }), ...resolved.filter((item) => {
41
- const identity = arrayIdentity(item);
42
- return !previousByIdentity.has(identity) && !authoredIdentities.has(identity);
43
- })];
44
- }
45
- if (isObject(previous) && isObject(resolved) && isObject(authored)) {
46
- const result = {};
47
- for (const key of /* @__PURE__ */ new Set([
48
- ...Object.keys(previous),
49
- ...Object.keys(resolved),
50
- ...Object.keys(authored)
51
- ])) {
52
- if (!(key in authored)) {
53
- if (!(key in previous) && key in resolved) Object.defineProperty(result, key, {
54
- value: resolved[key],
55
- enumerable: true,
56
- writable: true,
57
- configurable: true
58
- });
59
- continue;
60
- }
61
- const value = mergeConfig(previous[key], resolved[key], authored[key]);
62
- Object.defineProperty(result, key, {
63
- value,
64
- enumerable: true,
65
- writable: true,
66
- configurable: true
67
- });
68
- }
69
- return result;
70
- }
71
- return authored;
72
- }
73
- function parseCloudflareText(text, path) {
74
- const errors = [];
75
- const value = parse(text.replace(/^\uFEFF/, ""), errors, { allowTrailingComma: true });
76
- if (errors.length > 0 || !isObject(value)) throw new Error(`config: ${path} must contain a valid JSON/JSONC object.`);
77
- return value;
78
- }
79
- function readState(root) {
80
- const path = join(root, VOID_LOCK_FILE);
81
- if (!existsSync(path)) return;
82
- let value;
83
- try {
84
- value = JSON.parse(readFileSync(path, "utf8"));
85
- } catch {
86
- throw new Error(`config: Invalid ${VOID_LOCK_FILE}. Fix or restore it before continuing.`);
87
- }
88
- if (!isObject(value) || value.version !== 1 || !isObject(value.source) || !isObject(value.resolved) || typeof value.text !== "string") throw new Error(`config: Invalid ${VOID_LOCK_FILE}. Fix or restore it before continuing.`);
89
- const state = value;
90
- if (!isDeepStrictEqual(parseCloudflareText(state.text, "void.lock.json"), state.resolved)) state.text = `${provenance(state.text)}${JSON.stringify(state.resolved, null, 2)}\n`;
91
- return state;
92
- }
93
- function writeAtomic(path, content) {
94
- const temporary = `${path}.${randomUUID()}.tmp`;
95
- writeFileSync(temporary, content, { flag: "wx" });
96
- try {
97
- renameSync(temporary, path);
98
- } finally {
99
- rmSync(temporary, { force: true });
100
- }
101
- }
102
- function writeState(root, state) {
103
- const path = join(root, VOID_LOCK_FILE);
104
- const content = `${JSON.stringify(state, null, 2)}\n`;
105
- if (existsSync(path)) try {
106
- if (isDeepStrictEqual(JSON.parse(readFileSync(path, "utf8")), state)) return;
107
- } catch {}
108
- writeAtomic(path, content);
109
- }
110
- /** Keep Vite preview usable without leaving Wrangler's implicit deploy pointer after a build. */
111
- function stashCloudflareDeployPointer(root) {
112
- const pointer = join(root, ".wrangler", "deploy", "config.json");
113
- if (!existsSync(pointer)) return;
114
- const directory = join(root, ".void");
115
- mkdirSync(directory, { recursive: true });
116
- writeAtomic(join(directory, PREVIEW_POINTER_FILE), readFileSync(pointer, "utf8"));
117
- rmSync(pointer, { force: true });
118
- }
119
- function restoreCloudflarePreviewPointer(root) {
120
- const saved = join(root, ".void", PREVIEW_POINTER_FILE);
121
- if (!existsSync(saved)) return false;
122
- const directory = join(root, ".wrangler", "deploy");
123
- mkdirSync(directory, { recursive: true });
124
- writeAtomic(join(directory, "config.json"), readFileSync(saved, "utf8"));
125
- return true;
126
- }
127
- /** Preserve Void's JSONC provenance comments when authored settings change. */
128
- function provenance(text) {
129
- const lines = text.match(/^\s*\/\/ void:(?:managed-queues|published-traffic):v1:[A-Za-z0-9_-]+\s*$/gm);
130
- return lines ? `${lines.join("\n")}\n` : "";
131
- }
132
- /** Resolve the config file passed to Cloudflare tooling. Typed projects use a generated file. */
133
- function materializeCloudflareConfig(root) {
134
- if (!existsSync(join(root, "void.config.ts"))) {
135
- for (const name of ["wrangler.jsonc", "wrangler.json"]) if (existsSync(join(root, name))) return join(root, name);
136
- return join(root, "wrangler.jsonc");
137
- }
138
- if (["wrangler.jsonc", "wrangler.json"].some((name) => existsSync(join(root, name)))) throw new Error("config: Run `void migrate` to move the root Wrangler config into void.config.ts.");
139
- const authored = readConfig(root).cloudflare ?? {};
140
- const state = readState(root);
141
- const resolved = state ? mergeConfig(state.source, state.resolved, authored) : authored;
142
- const text = state && isDeepStrictEqual(resolved, state.resolved) && isDeepStrictEqual(authored, state.source) ? state.text : `${provenance(state?.text ?? "")}${JSON.stringify(resolved, null, 2)}\n`;
143
- const path = join(root, MATERIALIZED_CLOUDFLARE_FILE);
144
- if (!existsSync(path) || readFileSync(path, "utf8") !== text) writeAtomic(path, text);
145
- if (state) writeState(root, {
146
- version: 1,
147
- source: authored,
148
- resolved,
149
- text
150
- });
151
- return path;
152
- }
153
- /** Record Cloudflare settings written by Void so later builds reproduce them. */
154
- function persistCloudflareConfig(root) {
155
- if (!existsSync(join(root, "void.config.ts"))) return;
156
- const path = join(root, MATERIALIZED_CLOUDFLARE_FILE);
157
- if (!existsSync(path)) throw new Error(`config: Missing generated ${MATERIALIZED_CLOUDFLARE_FILE}.`);
158
- const text = readFileSync(path, "utf8");
159
- const resolved = parseCloudflareText(text, path);
160
- const authored = readConfig(root).cloudflare ?? {};
161
- if (readState(root) || !isDeepStrictEqual(resolved, authored) || text !== `${JSON.stringify(authored, null, 2)}\n`) writeState(root, {
162
- version: 1,
163
- source: authored,
164
- resolved,
165
- text
166
- });
167
- }
168
- /** Seed the checked-in lock from a root Wrangler file during migration. */
169
- function seedCloudflareConfig(root, source, text) {
170
- const existing = readState(root);
171
- if (existing) {
172
- if (isDeepStrictEqual(existing.source, source) && isDeepStrictEqual(existing.resolved, source)) return;
173
- throw new Error(`migrate: ${VOID_LOCK_FILE} already exists with different settings. Resolve it before migrating.`);
174
- }
175
- if (!isDeepStrictEqual(parseCloudflareText(text, ".void-wrangler.jsonc"), source)) throw new Error("migrate: The Cloudflare config changed during migration. Retry.");
176
- writeState(root, {
177
- version: 1,
178
- source,
179
- resolved: source,
180
- text
181
- });
182
- }
183
- const DEFAULT_SANDBOX_CLASS_NAME = "SandboxV1";
184
- const SANDBOX_MIGRATION_TAG = "void-sandbox-v2";
185
- function isSandboxEnabled(config) {
186
- return config.sandbox !== void 0 && config.sandbox !== false;
187
- }
188
- function getDefaultSandboxImage() {
189
- return fileURLToPath(new URL("../../sandbox.Dockerfile", import.meta.resolve("void/sandbox")));
190
- }
191
- function getDefaultSandboxPlatformImage() {
192
- return "cloudflare/debian-trixie";
193
- }
194
- function isLocalSandboxImage(image) {
195
- const lowerImage = image.toLowerCase();
196
- return isAbsolute(image) || image.startsWith("./") || image.startsWith("../") || lowerImage === "dockerfile" || lowerImage.includes("dockerfile") || lowerImage.endsWith("/dockerfile") || lowerImage.endsWith("\\dockerfile");
197
- }
198
- function requiresSandboxPlatformImage(config) {
199
- if (typeof config.sandbox !== "object" || config.sandbox === null) return false;
200
- return typeof config.sandbox.image === "string" && isLocalSandboxImage(config.sandbox.image) && config.sandbox.platformImage === void 0;
201
- }
202
- function resolveSandboxConfig(config, root = process.cwd()) {
203
- const raw = typeof config.sandbox === "object" ? config.sandbox : {};
204
- const image = raw.image ?? getDefaultSandboxImage();
205
- const imageBuildContext = raw.imageBuildContext;
206
- const platformImage = raw.platformImage ?? (raw.image && !isLocalSandboxImage(raw.image) ? raw.image : getDefaultSandboxPlatformImage());
207
- 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>).");
208
- 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>).");
209
- return {
210
- binding: raw.binding ?? "SANDBOX",
211
- className: raw.className ?? "SandboxV1",
212
- containerName: raw.containerName ?? "void-sandbox-v1",
213
- image: resolveSandboxImage(image, root),
214
- platformImage,
215
- ...imageBuildContext && { imageBuildContext: isAbsolute(imageBuildContext) ? imageBuildContext : join(root, imageBuildContext) },
216
- ...raw.instanceType && { instanceType: raw.instanceType }
217
- };
218
- }
219
- function resolveSandboxImage(image, root) {
220
- if (!isLocalSandboxImage(image) || isAbsolute(image)) return image;
221
- return join(root, image);
222
- }
223
- function sandboxContainerConfig(sandbox) {
224
- return {
225
- name: sandbox.containerName,
226
- class_name: sandbox.className,
227
- scheduling_policy: "durable_object",
228
- images: { default: isLocalSandboxImage(sandbox.image) ? {
229
- dockerfile: sandbox.image,
230
- ...sandbox.imageBuildContext && { build_context: sandbox.imageBuildContext }
231
- } : { image: sandbox.image } }
232
- };
233
- }
234
- /** Refuse namespace reuse before either uploader can change a live Worker. */
235
- function assertSandboxNamespaceConfig(config, sandbox) {
236
- const containers = Array.isArray(config.containers) ? config.containers : [];
237
- const durable = config.durable_objects;
238
- 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/.");
239
- }
240
- //#endregion
241
10
  //#region src/cli/wrangler.ts
242
11
  const COMPAT_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
243
12
  /** UTF-8 byte-order mark. Node's utf-8 read preserves a leading one. */
@@ -620,7 +389,7 @@ function syncWranglerBindings(root, bindings, options) {
620
389
  modified = true;
621
390
  }
622
391
  const migrations = Array.isArray(parsed.migrations) ? parsed.migrations : [];
623
- if (!migrations.some((migration) => migration.tag === "void-sandbox-v2" || migration.new_sqlite_classes?.includes(className))) {
392
+ if (!hasSandboxSqliteMigration(migrations, className)) {
624
393
  parsed.migrations = [...migrations, {
625
394
  tag: SANDBOX_MIGRATION_TAG,
626
395
  new_sqlite_classes: [className]
@@ -1991,4 +1760,4 @@ function canonicalize(value) {
1991
1760
  return value;
1992
1761
  }
1993
1762
  //#endregion
1994
- export { writeWranglerPublishedTrafficSnapshot as A, materializeCloudflareConfig as B, readWranglerWebSocketTombstones as C, syncWranglerWebSockets as D, syncWranglerDurableObjects as E, requiresSandboxPlatformImage as F, restoreCloudflarePreviewPointer as H, resolveSandboxConfig as I, sandboxContainerConfig as L, SANDBOX_MIGRATION_TAG as M, assertSandboxNamespaceConfig as N, updateWranglerCustomDomain as O, isSandboxEnabled as P, MATERIALIZED_CLOUDFLARE_FILE as R, readWranglerPublishedTrafficSnapshot as S, syncWranglerBindings as T, seedCloudflareConfig as U, persistCloudflareConfig as V, stashCloudflareDeployPointer as W, readProvisionedBindingEntry as _, LIVE_MIGRATION_TAG as a, readWranglerCustomDomains as b, bindingEntriesForField as c, ensureWranglerNodejsAlsFlag as d, findBindingNameOwner as f, readExistingLiveBindingConfig as g, normalizeWranglerCompatibilityFlags as h, LATEST_KNOWN_COMPAT_DATE as i, DEFAULT_SANDBOX_CLASS_NAME as j, writeProvisionedWranglerConfig as k, ensureWranglerCompat as l, nextDurableObjectMigrationTag as m, DEFAULT_LIVE_CLASS as n, acknowledgeWranglerManagedQueueRemovals as o, hasDurableObjectSqliteMigration as p, FRIENDLY_BINDING_NAMES as r, assertNoDuplicateMembers as s, DEFAULT_LIVE_BINDING as t, ensureWranglerCompatibilityDate as u, readRootWranglerConfig as v, resolveLiveBindingConfig as w, readWranglerManagedQueueCleanupCandidates as x, readWranglerCompat as y, VOID_LOCK_FILE as z };
1763
+ export { writeProvisionedWranglerConfig as A, readWranglerPublishedTrafficSnapshot as C, syncWranglerDurableObjects as D, syncWranglerBindings as E, syncWranglerWebSockets as O, readWranglerManagedQueueCleanupCandidates as S, resolveLiveBindingConfig as T, readExistingLiveBindingConfig as _, LIVE_MIGRATION_TAG as a, readWranglerCompat as b, bindingEntriesForField as c, ensureWranglerCompatibilityDate as d, ensureWranglerNodejsAlsFlag as f, normalizeWranglerCompatibilityFlags as g, nextDurableObjectMigrationTag as h, LATEST_KNOWN_COMPAT_DATE as i, writeWranglerPublishedTrafficSnapshot as j, updateWranglerCustomDomain as k, bindingNamesForField as l, hasDurableObjectSqliteMigration as m, DEFAULT_LIVE_CLASS as n, acknowledgeWranglerManagedQueueRemovals as o, findBindingNameOwner as p, FRIENDLY_BINDING_NAMES as r, assertNoDuplicateMembers as s, DEFAULT_LIVE_BINDING as t, ensureWranglerCompat as u, readProvisionedBindingEntry as v, readWranglerWebSocketTombstones as w, readWranglerCustomDomains as x, readRootWranglerConfig as y };
@@ -1,10 +1,13 @@
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-HEcZsaij.mjs";
3
+ import { a as CloudEnv } from "./handler-CZ4nAylQ.mjs";
4
4
  import { WebSocketRouteMap } from "void/routes";
5
5
  //#region src/runtime/ws.d.ts
6
6
  type MaybePromise<T> = T | Promise<T>;
7
7
  type ParamsRecord = Record<string, string>;
8
+ type WebSocketInstanceKey = (context: {
9
+ params: ParamsRecord;
10
+ }) => string;
8
11
  type WsEntry<P extends keyof WebSocketRouteMap> = WebSocketRouteMap[P];
9
12
  type ParamsOf<P extends keyof WebSocketRouteMap> = WsEntry<P> extends {
10
13
  params: infer T;
@@ -45,6 +48,10 @@ type SocketContext<ServerEvent = unknown> = WebSocketBaseContext & {
45
48
  };
46
49
  type RoomDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, ServerSchema extends StandardSchemaV1 = StandardSchemaV1> = {
47
50
  readonly __kind: "room";
51
+ /** Optional persistent resource name. Pin the name reported by `void info` before moving this route. */
52
+ readonly name?: string;
53
+ /** Optional instance key; preserve existing keys when renaming route parameters. */
54
+ readonly key?: WebSocketInstanceKey;
48
55
  readonly messages: {
49
56
  client: ClientSchema;
50
57
  server: ServerSchema;
@@ -61,6 +68,10 @@ type RoomDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, Se
61
68
  };
62
69
  type SocketDefinition<ClientSchema extends StandardSchemaV1 = StandardSchemaV1, ServerSchema extends StandardSchemaV1 = StandardSchemaV1> = {
63
70
  readonly __kind: "socket";
71
+ /** Optional persistent resource name. Pin the name reported by `void info` before moving this route. */
72
+ readonly name?: string;
73
+ /** Optional instance key; preserve existing keys when renaming route parameters. */
74
+ readonly key?: WebSocketInstanceKey;
64
75
  readonly messages: {
65
76
  client: ClientSchema;
66
77
  server: ServerSchema;
@@ -119,4 +130,4 @@ declare class VoidSocket<P extends keyof WebSocketRouteMap & string> {
119
130
  declare function connect<P extends keyof WebSocketRouteMap & string>(path: HasParams<P> extends false ? P : never): VoidSocket<P>;
120
131
  declare function connect<P extends keyof WebSocketRouteMap & string>(path: P, options: ConnectOptions<P>): VoidSocket<P>;
121
132
  //#endregion
122
- export { RoomDefinition as a, VoidSocket as c, WebSocketConnection as d, connect as f, RoomController as i, VoidSocketCloseEvent as l, defineWebSocket as m, ConnectCommonOptions as n, SocketContext as o, defineRoom as p, RoomContext as r, SocketDefinition as s, AnyWebSocketDefinition as t, WebSocketBaseContext as u };
133
+ export { RoomDefinition as a, VoidSocket as c, WebSocketConnection as d, WebSocketInstanceKey as f, defineWebSocket as h, RoomController as i, VoidSocketCloseEvent as l, defineRoom as m, ConnectCommonOptions as n, SocketContext as o, connect as p, RoomContext as r, SocketDefinition as s, AnyWebSocketDefinition as t, WebSocketBaseContext as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "void",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voidzero-dev/void.git",
@@ -39,10 +39,12 @@
39
39
  "#self/runtime/live-server": "./dist/runtime/live-server.mjs",
40
40
  "#self/runtime/fetch": "./dist/runtime/fetch.mjs",
41
41
  "#self/runtime/fetch-stream": "./dist/runtime/fetch-stream.mjs",
42
+ "#self/runtime/route-url": "./dist/runtime/route-url.mjs",
42
43
  "#self/runtime/migration-handler": "./dist/runtime/migration-handler.mjs",
43
44
  "#self/runtime/migration-handler-pg": "./dist/runtime/migration-handler-pg.mjs",
44
45
  "#self/runtime/migration-handler-mysql": "./dist/runtime/migration-handler-mysql.mjs",
45
- "#self/runtime/ws-server": "./dist/runtime/ws-server.mjs"
46
+ "#self/runtime/ws-server": "./dist/runtime/ws-server.mjs",
47
+ "#self/runtime/routing": "./dist/runtime/routing.mjs"
46
48
  },
47
49
  "exports": {
48
50
  ".": {
@@ -321,6 +323,11 @@
321
323
  "./_sandbox-container": {
322
324
  "types": "./dist/runtime/sandbox-container.d.mts",
323
325
  "import": "./dist/runtime/sandbox-container.mjs"
326
+ },
327
+ "./limits": {
328
+ "types": "./dist/runtime/limits.d.mts",
329
+ "import": "./dist/runtime/limits.mjs",
330
+ "require": "./dist/runtime/limits.mjs"
324
331
  }
325
332
  },
326
333
  "dependencies": {
@@ -332,11 +339,11 @@
332
339
  "@cloudflare/workers-auth": "0.9.5",
333
340
  "@cloudflare/workers-types": "^4.20260702.1",
334
341
  "@napi-rs/keyring": "2.1.0",
335
- "@void/deploy-cloudflare": "0.22.0",
336
- "@void/deploy-core": "0.22.0",
337
- "@void/edge": "0.22.0",
338
- "@void/isr": "0.22.0",
339
- "@void/platform": "0.22.0",
342
+ "@void/deploy-cloudflare": "0.23.0",
343
+ "@void/deploy-core": "0.23.0",
344
+ "@void/edge": "0.23.0",
345
+ "@void/isr": "0.23.0",
346
+ "@void/platform": "0.23.0",
340
347
  "acorn": "^8.18.0",
341
348
  "better-auth": "^1.7.6",
342
349
  "better-sqlite3": "^13.0.3",
@@ -387,7 +394,7 @@
387
394
  "zod": "^4.6.5"
388
395
  },
389
396
  "peerDependencies": {
390
- "@void/md": "0.22.0",
397
+ "@void/md": "0.23.0",
391
398
  "arktype": ">=2.0.0",
392
399
  "valibot": ">=1.0.0-beta.7",
393
400
  "vite": "^8.0.0",
@@ -1,175 +1,52 @@
1
1
  ---
2
2
  name: migrate-cloudflare-to-void
3
- description: Migrate an existing Vite app using @cloudflare/vite-plugin to Vite + void. Use when a project already runs on Cloudflare Workers but needs Void file-based routes, inferred bindings, and void deploy workflow.
3
+ description: Migrate an existing Vite app using @cloudflare/vite-plugin to Void while preserving its routes, bindings, and deployment identity.
4
4
  ---
5
5
 
6
- # Migrate Vite + Cloudflare Plugin to Void
6
+ # Migrate a Cloudflare Vite app to Void
7
7
 
8
- ## When to use
8
+ Read the app's package manifest, Vite config, Worker entry, Cloudflare config,
9
+ and migrations. Identify its framework, endpoints, bindings, and deployed Worker
10
+ before changing them.
9
11
 
10
- Use this skill when the user has an existing Vite app with `@cloudflare/vite-plugin` and wants to migrate to `void` with minimal breakage.
12
+ Use the bundled guides under `../void/docs/`:
11
13
 
12
- Do not use this for greenfield apps started via `npm install -D void` + `npx void init`.
14
+ - `integrations/cloudflare.md` for existing Worker handoff and configuration.
15
+ - `integrations/frameworks/overview.md` and the matching framework guide when
16
+ another framework owns routing and SSR.
17
+ - `guide/server-routing.md` for native Void handlers and middleware.
18
+ - `guide/database.md` for schema and migration setup.
19
+ - `reference/cli.md` before running commands.
13
20
 
14
- ## Inputs to gather first
21
+ Add `void` and replace `cloudflare()` with `voidPlugin()`, preserving the
22
+ framework plugins and unrelated Vite settings. Remove dependencies and scripts
23
+ only when their replacement is working and no other workflow uses them.
15
24
 
16
- Read these files before editing:
17
-
18
- - `package.json`
19
- - `vite.config.*`
20
- - `wrangler.jsonc` (if present)
21
- - Current worker entrypoint (`src/worker.*`, `src/index.*`, etc.)
22
- - Any existing API handlers and migration SQL files
23
-
24
- Confirm:
25
-
26
- - existing routes/endpoints and HTTP methods
27
- - bindings currently used (`DB`, `KV`, `R2`, etc.)
28
- - whether the app uses framework SSR or only SPA + API
29
-
30
- ## Migration workflow
31
-
32
- 1. Update dependencies
33
-
34
- - Remove `@cloudflare/vite-plugin` if it is only used for runtime/deploy.
35
- - Add `void`.
36
- - Keep existing framework plugins (React/Vue/Svelte/etc.).
37
-
38
- 2. Update Vite config
39
-
40
- - Replace `cloudflare(...)` plugin usage with `voidPlugin()`.
41
- - Keep plugin order stable unless there is a known conflict.
42
- - Keep unrelated Vite settings unchanged.
43
-
44
- Target shape:
25
+ For native Void routes, use one file per URL with named HTTP method exports:
45
26
 
46
27
  ```ts
47
- import { defineConfig } from 'vite';
48
- import { voidPlugin } from 'void';
28
+ // routes/api/users/[id].ts
29
+ import { defineHandler } from 'void';
49
30
 
50
- export default defineConfig({
51
- plugins: [voidPlugin()],
31
+ export const GET = defineHandler((c) => {
32
+ return { id: c.req.param('id') };
52
33
  });
53
34
  ```
54
35
 
55
- 3. Migrate API surface to file-based routes
56
-
57
- - Create `routes/` if missing.
58
- - Convert each existing endpoint into route files:
59
- - `routes/api/users.get.ts`
60
- - `routes/api/users.post.ts`
61
- - `routes/api/users/[id].get.ts`
62
- - Use `defineHandler` from `void`.
63
- - If there is shared logic, move it into regular modules and import from route files.
64
-
65
- 4. Migrate middleware
66
-
67
- - Move request-wide middleware to `middleware/*.ts`.
68
- - Export with `defineMiddleware`.
69
- - Preserve behavior order by filename prefix when needed (`01.auth.ts`, `02.logger.ts`).
70
-
71
- 5. Preserve bindings with Void conventions
72
-
73
- - Keep Cloudflare-style uppercase names on `c.env` (`DB`, `KV`, `STORAGE`, etc.).
74
- - Remove manual binding config from Vite plugin config where Void now infers usage.
75
- - Ensure route code actually references required bindings so inference can detect them.
76
-
77
- 6. Migrations
78
-
79
- - Place SQL files in `migrations/` (sorted by filename).
80
- - Keep destructive operations gated by explicit pragma if needed.
81
- - If old migrations live elsewhere, copy/rename into this directory with stable ordering.
82
-
83
- 7. Deploy workflow migration
84
-
85
- - Replace old deploy instructions with:
86
- - `void account login`
87
- - `void deploy`
88
- - If CI must target a specific project, use:
89
- - `void deploy --project <slug>`
90
- - or `VOID_PROJECT=<slug> void deploy`
91
-
92
- 8. Post-migration cleanup (remove obsolete Wrangler wiring)
93
-
94
- - If the app no longer uses direct Wrangler workflows, remove `wrangler.jsonc`.
95
- - Remove direct `wrangler` dependency/devDependency from `package.json` when it is only used for old deploy/dev scripts.
96
- - Remove or rewrite npm scripts that call `wrangler` directly (for example old deploy/publish scripts).
97
- - Keep Wrangler only if the project still has explicit non-Void workflows that require it.
98
-
99
- ## Routing behavior reference (use during file conversion)
100
-
101
- Apply these filename rules exactly when mapping old handlers to `routes/`:
102
-
103
- 1. Extension and suffix parsing order
104
-
105
- - Strip extension (`.ts`, `.js`, `.mts`, `.mjs`).
106
- - Strip env suffix (`.dev`, `.prod`). The suffix restricts the route to that environment, so only use it for handlers that must not ship to the other one.
107
- - Strip HTTP method suffix (`.get`, `.post`, `.put`, `.delete`, `.patch`).
108
- - Strip trailing `index` segment.
109
- - Remove route group segments `(group-name)` from URL path.
110
-
111
- 2. Method mapping
112
-
113
- - `users.get.ts` matches only `GET /users`.
114
- - `users.post.ts` matches only `POST /users`.
115
- - `users.ts` matches all methods.
116
- - Split multi-method handlers into one file per method when preserving behavior matters.
117
-
118
- 3. Dynamic and catch-all params
119
-
120
- - `[id]` -> `:id`
121
- - `[...slug]` -> catch-all named param
122
- - `[...]` -> catch-all unnamed fallback
123
- - Use folder nesting for multiple params: `routes/api/org/[org]/repo/[repo].get.ts`.
124
-
125
- 4. Route groups and organization
126
-
127
- - Directories like `(internal)` are for code organization only and do not appear in URL.
128
- - Use them when reorganizing large route sets without changing public paths.
129
-
130
- 5. Ignored files
131
-
132
- - Files or directories starting with `_` are ignored by route scanner.
133
- - Do not place active handlers under `_legacy`, `_draft`, etc.
134
-
135
- 6. Middleware behavior
136
-
137
- - Middleware files live in `middleware/` and run in filename order.
138
- - Prefix numerically if order is important (`01.auth.ts`, `02.logger.ts`).
139
-
140
- 7. Concrete mapping examples
141
-
142
- - `src/worker.ts` handling `GET /api/users/:id` -> `routes/api/users/[id].get.ts`
143
- - single handler switching on method for `/api/users` -> `routes/api/users.get.ts` and `routes/api/users.post.ts`
144
- - legacy `GET /health` endpoint -> `routes/health.get.ts`
145
-
146
- ## Verification checklist
147
-
148
- Run and validate:
149
-
150
- 1. `npm run dev` (or project dev command)
151
- 2. Exercise representative API routes locally.
152
- 3. `npm run build`
153
- 4. `void deploy` and verify live URL responds.
154
- 5. Confirm no deploy-critical scripts still depend on `wrangler`.
155
-
156
- In the Void deploy output, verify:
157
-
158
- - worker modules uploaded
159
- - static assets uploaded
160
- - migrations applied (if present)
161
-
162
- ## Common migration pitfalls
163
-
164
- - Importing from the main `void` runtime in worker route files when a lighter handler import is expected by tooling.
165
- - Forgetting to split method-specific handlers (`GET`/`POST`) into filename suffixes.
166
- - Keeping old custom worker entry wiring that conflicts with generated route runtime.
167
- - Binding names changed to lowercase (`db`) instead of expected uppercase (`DB`), breaking inference/provisioning.
36
+ Keep GET and POST for the same URL in the same file. Middleware lives in
37
+ `middleware/` and runs in filename order. Preserve existing URLs and behavior;
38
+ framework apps keep their framework's routing conventions.
168
39
 
169
- ## Deliverable format
40
+ Preserve configured bindings and resource IDs. Use `void.config.ts` for authored
41
+ settings and `void.lock.json` for provisioned state. Let Void migrate supported
42
+ root Cloudflare configuration rather than deleting it before the handoff.
43
+ Database migrations live in `db/migrations/`; preserve their journal, ordering,
44
+ and deployed history instead of recreating them.
170
45
 
171
- When applying this migration, produce:
46
+ Verify the app's development server, representative routes, and production build.
47
+ When deployment is part of the user's request, follow the existing Worker
48
+ handoff in the Cloudflare guide and verify the reported URL. Keep new resources,
49
+ auth setup, and database or secret changes separate from that first handoff;
50
+ follow its explicit ISR cache choice when needed.
172
51
 
173
- 1. A change summary grouped by config/routes/migrations/CI.
174
- 2. A list of moved or newly created route files.
175
- 3. Exact commands to run locally and in CI.
52
+ Summarize the changes and any remaining migration work.