void 0.21.9 → 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 (293) hide show
  1. package/README.md +5 -1
  2. package/dist/{account-cmd-DZZGK80W.mjs → account-cmd-C84Ee8cO.mjs} +5 -5
  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-B_CeugBw.mjs → auth-link-CioEg6uY.mjs} +5 -5
  8. package/dist/{auth-router-BgEFRuvZ.mjs → auth-router-BsR981d4.mjs} +5 -5
  9. package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
  10. package/dist/{build-cmd-Dpt0jd-x.mjs → build-cmd-LzvNJORH.mjs} +19 -7
  11. package/dist/{cache-7_UeZdTk.mjs → cache-C4MvnrMH.mjs} +4 -4
  12. package/dist/{cancel-deploy-D23R1RXT.mjs → cancel-deploy-abUxpP2n.mjs} +4 -4
  13. package/dist/{cf-build-output-CGT03qCD.mjs → cf-build-output-BPqOT964.mjs} +141 -63
  14. package/dist/cf-build-output-_0HNWysu.mjs +2 -0
  15. package/dist/cli/cli.mjs +114 -460
  16. package/dist/cli/cloudflare-operation-process.mjs +1103 -0
  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-QTl6ko_D.mjs → client-RV8NVeB8.mjs} +165 -21
  21. package/dist/{cloudflare-auth-C4_GPZr0.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -43
  22. package/dist/{cloudflare-cmd-bSmZ1d5L.mjs → cloudflare-cmd-BcrVyTmJ.mjs} +9 -10
  23. package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
  24. package/dist/{cloudflare-connect-jAwacxxP.mjs → cloudflare-connect-B8uPZ4nx.mjs} +4 -4
  25. package/dist/{cloudflare-operations-BipGMJ5O.mjs → cloudflare-operations-AiWashgg.mjs} +1 -1
  26. package/dist/{cloudflare-operations-sMZXpk_S.mjs → cloudflare-operations-fxHb-byx.mjs} +118 -203
  27. package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
  28. package/dist/{config-CF69HgXc.d.mts → config-BMHb8RCj.d.mts} +2 -2
  29. package/dist/{config-CafTW6Cz.mjs → config-Br_JZD6u.mjs} +2 -7
  30. package/dist/config-C_XRIPx2.mjs +89 -0
  31. package/dist/{config-s7Xj7tPb.mjs → config-CyQ-wVd7.mjs} +1 -1
  32. package/dist/config-entry.d.mts +1 -1
  33. package/dist/{config-write-BSduPMY8.mjs → config-write-B1f88wJA.mjs} +1 -1
  34. package/dist/{connect-BsUSRzln.mjs → connect-Bd4kJd9U.mjs} +6 -6
  35. package/dist/{create-project-BniEV0OW.mjs → create-project-Boczwj5r.mjs} +1 -1
  36. package/dist/{create-project-DBfFSZKY.mjs → create-project-bMf6ffLZ.mjs} +9 -5
  37. package/dist/{db-hRrvZaq_.mjs → db-8uG64XLl.mjs} +26 -26
  38. package/dist/{delete-D6dZ9B6B.mjs → delete-NvbiyeJf.mjs} +4 -4
  39. package/dist/{deploy-WaAQez1O.mjs → deploy-DzAIwqNU.mjs} +944 -607
  40. package/dist/{deploy-DDz7c8LK.mjs → deploy-bjXdFCtn.mjs} +1 -1
  41. package/dist/{dist-BR1quN_w.mjs → dist-AoCzRTJE.mjs} +226 -60
  42. package/dist/{dist-C5fND3R0.mjs → dist-BuDuKZJv.mjs} +1 -1
  43. package/dist/{dist-Dn6nn2IU.mjs → dist-CTBk70IR.mjs} +42 -42
  44. package/dist/{domain-Dmhvb2oU.mjs → domain-y5Tvydvo.mjs} +5 -5
  45. package/dist/{email-DFi-s2t4.mjs → email-B3umsW75.mjs} +15 -30
  46. package/dist/{env-Csi-tMbT.mjs → env-BS6qYHDb.mjs} +6 -6
  47. package/dist/{env-public-D_6u46fX.d.mts → env-public-BX_r8HR6.d.mts} +2 -1
  48. package/dist/{env-validation-BB4GkLxn.mjs → env-validation-BPn7vk-V.mjs} +18 -71
  49. package/dist/{env-validation-BXge7uyK.mjs → env-validation-DbTg7-ar.mjs} +1 -1
  50. package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
  51. package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
  52. package/dist/{gen-Dz3X1Qab.mjs → gen-B580--vC.mjs} +5 -5
  53. package/dist/gen-BVaUUumi.mjs +2 -0
  54. package/dist/{github-cmd-BED3_9JD.mjs → github-cmd-v45BdfKX.mjs} +6 -8
  55. package/dist/{handler-BXJTXd02.d.mts → handler-CZ4nAylQ.d.mts} +2 -1
  56. package/dist/{headers-BOg_velo.mjs → headers-DWi2IXWx.mjs} +1 -1
  57. package/dist/help-DofyZuY7.mjs +2 -0
  58. package/dist/{help-DC7gdz7L.mjs → help-daGKjXGk.mjs} +268 -666
  59. package/dist/index.d.mts +1 -1
  60. package/dist/index.mjs +305 -1490
  61. package/dist/info-B97bTX9N.mjs +113 -0
  62. package/dist/{init-WO0JlPx8.mjs → init-Bvy7zrBo.mjs} +51 -20
  63. package/dist/limits-Bq5LG8Id.d.mts +27 -0
  64. package/dist/limits-Cjuk2VPm.mjs +68 -0
  65. package/dist/{link-CsHOinF7.mjs → link-CDqqCjFl.mjs} +5 -5
  66. package/dist/{list-CDb-4bZ1.mjs → list-CZj0dzKY.mjs} +5 -5
  67. package/dist/{live-CKiJilLr.d.mts → live-Chw1eIMv.d.mts} +1 -1
  68. package/dist/{local-d1-CC8sKFGu.mjs → local-d1-2CMnpuW_.mjs} +2 -2
  69. package/dist/login-DYt_An22.mjs +2 -0
  70. package/dist/{login-DvqXsfGs.mjs → login-UZKFM_u7.mjs} +5 -5
  71. package/dist/{logs-BdfiOezj.mjs → logs-CUZ6t9t3.mjs} +5 -5
  72. package/dist/migrate-8_2u55MD.mjs +2 -0
  73. package/dist/{migrate-B8KuoYsO.mjs → migrate-DHul7PRV.mjs} +5 -4
  74. package/dist/{node-BM43oz4G.mjs → node-BkyRWRx8.mjs} +2 -2
  75. package/dist/operator-args-CLgKGlwU.mjs +690 -0
  76. package/dist/{operator-cmd-03819ATr.mjs → operator-cmd-DBA6dl0m.mjs} +69 -23
  77. package/dist/output-Dm_A4Tbv.mjs +81 -0
  78. package/dist/pages/client.d.mts +34 -2
  79. package/dist/pages/client.mjs +59 -3
  80. package/dist/pages/index.d.mts +1 -1
  81. package/dist/pages/index.mjs +3 -3
  82. package/dist/pages/islands-plugin.d.mts +16 -6
  83. package/dist/pages/islands-plugin.mjs +2 -2
  84. package/dist/pages/protocol.d.mts +2 -2
  85. package/dist/pages/protocol.mjs +2 -308
  86. package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
  87. package/dist/{output-CCH48AMM.mjs → picocolors-BTps1_gs.mjs} +2 -76
  88. package/dist/plan-D1Q5rf-r.mjs +2 -0
  89. package/dist/plan-NPpwZ_kc.mjs +58 -0
  90. package/dist/platform-args-BJdRtlLq.mjs +506 -0
  91. package/dist/platform-args-D3RXyR6h.mjs +2 -0
  92. package/dist/{platform-auth-config-z92h63q5.mjs → platform-auth-config-B56E9YP1.mjs} +4 -4
  93. package/dist/{platform-auth-protection-DeE3yr2R.mjs → platform-auth-protection-BDWO_aER.mjs} +3 -3
  94. package/dist/{platform-auth-recovery-o_340Ixx.mjs → platform-auth-recovery-1gg4CSRe.mjs} +4 -4
  95. package/dist/{platform-cmd-C4ZV3Vpy.mjs → platform-cmd-Bt-1w6pY.mjs} +1 -1
  96. package/dist/{platform-cmd-DNl8WosH.mjs → platform-cmd-DMcQStSc.mjs} +26 -5
  97. package/dist/{platform-domain-CU1JtJkW.mjs → platform-domain-BNkcz0OB.mjs} +36 -9
  98. package/dist/{platform-lifecycle-Bc047IeT.mjs → platform-lifecycle-9OyBALhH.mjs} +850 -276
  99. package/dist/{platform-lifecycle-Bs2qx1E3.mjs → platform-lifecycle-BE6C_jxh.mjs} +1 -1
  100. package/dist/{platform-management-CVpGI9Y5.mjs → platform-management-CjwLVQwN.mjs} +59 -11
  101. package/dist/{platform-management-C8tt6D8h.mjs → platform-management-CnyTdcWX.mjs} +1 -1
  102. package/dist/platform-plans-config-BNGKGr4P.mjs +359 -0
  103. package/dist/{platform-recovery-dvUaptLr.mjs → platform-recovery-D6KSpuFm.mjs} +2 -2
  104. package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
  105. package/dist/{prepare-DyZ-Yok5.mjs → prepare-B5Mkic5u.mjs} +3 -3
  106. package/dist/{prepare-C3kt3Rst.mjs → prepare-DOsL0CC9.mjs} +4 -20
  107. package/dist/prepare-cgvDMtSb.mjs +2 -0
  108. package/dist/{project-cmd-B44I8J_W.mjs → project-cmd-CNzrqvBv.mjs} +30 -16
  109. package/dist/{project-team-BkbYIsXN.mjs → project-team-DQOWPfQT.mjs} +4 -4
  110. package/dist/{project-token-C8xEEQnB.mjs → project-token-CTDYU0Cc.mjs} +4 -4
  111. package/dist/project-zero-trust-BNAkW-_0.mjs +63 -0
  112. package/dist/{protocol-ZH3jP4a7.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
  113. package/dist/protocol-U7bfjHmA.mjs +331 -0
  114. package/dist/{provision-DNtrtaVD.mjs → provision-C4ORE7G7.mjs} +1 -1
  115. package/dist/{provision-BhreDAOS.mjs → provision-CJFgTZY8.mjs} +111 -215
  116. package/dist/{requests-DFyhBMaf.mjs → requests-MhxYnau8.mjs} +4 -4
  117. package/dist/resource-name-C7LVpcRm.mjs +11 -0
  118. package/dist/{rollback-DHHxXZiS.mjs → rollback-CJ6iSDoU.mjs} +5 -5
  119. package/dist/route-url-CG7U-cRN.mjs +15 -0
  120. package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
  121. package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
  122. package/dist/runtime/ai.d.mts +12 -8
  123. package/dist/runtime/ai.mjs +84 -17
  124. package/dist/runtime/better-auth-mysql.mjs +1 -1
  125. package/dist/runtime/better-auth-pg.mjs +1 -1
  126. package/dist/runtime/better-auth.mjs +1 -1
  127. package/dist/runtime/client-react.mjs +2 -2
  128. package/dist/runtime/client-solid.mjs +2 -2
  129. package/dist/runtime/client-svelte.mjs +2 -2
  130. package/dist/runtime/client-vue.mjs +2 -2
  131. package/dist/runtime/client.mjs +2 -2
  132. package/dist/runtime/durable.d.mts +3 -1
  133. package/dist/runtime/durable.mjs +4 -1
  134. package/dist/runtime/email/testing.mjs +1 -1
  135. package/dist/runtime/env-public.d.mts +1 -1
  136. package/dist/runtime/fetch-stream.mjs +1 -1
  137. package/dist/runtime/fetch.mjs +1 -1
  138. package/dist/runtime/handler.d.mts +1 -1
  139. package/dist/runtime/kv.mjs +0 -1
  140. package/dist/runtime/limits.d.mts +2 -0
  141. package/dist/runtime/limits.mjs +2 -0
  142. package/dist/runtime/live-client.d.mts +1 -1
  143. package/dist/runtime/live-server.mjs +25 -16
  144. package/dist/runtime/live.d.mts +1 -1
  145. package/dist/runtime/migration-handler.mjs +62 -42
  146. package/dist/runtime/route-url.d.mts +4 -0
  147. package/dist/runtime/route-url.mjs +2 -0
  148. package/dist/runtime/routing.d.mts +180 -0
  149. package/dist/runtime/routing.mjs +1082 -0
  150. package/dist/runtime/sandbox-container.d.mts +3 -0
  151. package/dist/runtime/sandbox-container.mjs +2 -0
  152. package/dist/runtime/sandbox.d.mts +4 -32
  153. package/dist/runtime/sandbox.mjs +151 -75
  154. package/dist/runtime/sse.mjs +1 -1
  155. package/dist/runtime/validator.d.mts +1 -1
  156. package/dist/runtime/ws-server.d.mts +4 -2
  157. package/dist/runtime/ws-server.mjs +27 -2
  158. package/dist/runtime/ws.d.mts +2 -2
  159. package/dist/runtime/ws.mjs +8 -6
  160. package/dist/sandbox-XZAqzFlG.d.mts +52 -0
  161. package/dist/sandbox-container-Bo0eiFKz.d.mts +73 -0
  162. package/dist/sandbox-container-C6ItmVuN.mjs +281 -0
  163. package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
  164. package/dist/{secret-DN9sSNiV.mjs → secret-Dli5fP0B.mjs} +6 -6
  165. package/dist/{skills-O6FUaizK.mjs → skills-D1II1Juz.mjs} +1 -1
  166. package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
  167. package/dist/{subcommand-prompt-BuGYkAkC.mjs → subcommand-prompt-CY1C4fvl.mjs} +2 -2
  168. package/dist/validate-Dq_L3s0S.mjs +2 -0
  169. package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
  170. package/dist/{wrangler-BymcxrRa.mjs → wrangler-7K-bW_DL.mjs} +14 -235
  171. package/dist/{ws-BwcqizuH.d.mts → ws-CL1w7GXU.d.mts} +13 -2
  172. package/package.json +48 -33
  173. package/sandbox.Dockerfile +4 -0
  174. package/schema.json +10 -22
  175. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
  176. package/skills/void/SKILL.md +50 -133
  177. package/skills/void/docs/guide/ai.md +94 -84
  178. package/skills/void/docs/guide/app-types.md +3 -32
  179. package/skills/void/docs/guide/auth.md +12 -116
  180. package/skills/void/docs/guide/database/d1.md +9 -54
  181. package/skills/void/docs/guide/database/mysql.md +1 -1
  182. package/skills/void/docs/guide/database/postgresql.md +5 -26
  183. package/skills/void/docs/guide/database.md +23 -75
  184. package/skills/void/docs/guide/deployment.md +27 -113
  185. package/skills/void/docs/guide/durable-state.md +43 -18
  186. package/skills/void/docs/guide/edge/headers.md +3 -47
  187. package/skills/void/docs/guide/edge/prerendering.md +5 -20
  188. package/skills/void/docs/guide/edge/redirects.md +11 -64
  189. package/skills/void/docs/guide/edge/revalidation.md +6 -19
  190. package/skills/void/docs/guide/edge/rewrites.md +56 -284
  191. package/skills/void/docs/guide/edge/static-assets.md +23 -72
  192. package/skills/void/docs/guide/email/domains.md +112 -0
  193. package/skills/void/docs/guide/email/receiving.md +139 -0
  194. package/skills/void/docs/guide/email/sending.md +231 -0
  195. package/skills/void/docs/guide/email.md +13 -619
  196. package/skills/void/docs/guide/env-migration.md +11 -11
  197. package/skills/void/docs/guide/env-vars.md +9 -29
  198. package/skills/void/docs/guide/index.md +0 -15
  199. package/skills/void/docs/guide/jobs.md +3 -18
  200. package/skills/void/docs/guide/kv.md +5 -11
  201. package/skills/void/docs/guide/live.md +5 -56
  202. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
  203. package/skills/void/docs/guide/pages-routing/head.md +10 -10
  204. package/skills/void/docs/guide/pages-routing/islands.md +6 -36
  205. package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
  206. package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
  207. package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
  208. package/skills/void/docs/guide/pages-routing/overview.md +7 -17
  209. package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
  210. package/skills/void/docs/guide/platform/administration/access.md +1 -4
  211. package/skills/void/docs/guide/platform/administration/email.md +35 -8
  212. package/skills/void/docs/guide/platform/administration/operations.md +26 -4
  213. package/skills/void/docs/guide/platform/administration/plans.md +126 -0
  214. package/skills/void/docs/guide/platform/administration/projects.md +5 -2
  215. package/skills/void/docs/guide/platform/administration/zero-trust.md +189 -0
  216. package/skills/void/docs/guide/platform/development/local.md +2 -2
  217. package/skills/void/docs/guide/platform/development/runtime.md +3 -13
  218. package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
  219. package/skills/void/docs/guide/platform/installation/credentials.md +6 -4
  220. package/skills/void/docs/guide/platform/installation/domains.md +31 -3
  221. package/skills/void/docs/guide/platform/installation/first-deployment.md +6 -0
  222. package/skills/void/docs/guide/platform/installation/maintenance.md +3 -1
  223. package/skills/void/docs/guide/platform/installation/prerequisites.md +21 -16
  224. package/skills/void/docs/guide/platform/installation/setup.md +9 -5
  225. package/skills/void/docs/guide/platform/installation/uninstall.md +17 -2
  226. package/skills/void/docs/guide/platform-administration.md +2 -0
  227. package/skills/void/docs/guide/queues.md +7 -9
  228. package/skills/void/docs/guide/quickstart.md +38 -37
  229. package/skills/void/docs/guide/remote-dev.md +4 -9
  230. package/skills/void/docs/guide/sandboxes.md +78 -41
  231. package/skills/void/docs/guide/server-routing.md +9 -72
  232. package/skills/void/docs/guide/sse.md +4 -18
  233. package/skills/void/docs/guide/ssg.md +3 -15
  234. package/skills/void/docs/guide/ssr.md +14 -62
  235. package/skills/void/docs/guide/storage.md +9 -4
  236. package/skills/void/docs/guide/type-safety.md +3 -14
  237. package/skills/void/docs/guide/typed-fetch.md +3 -7
  238. package/skills/void/docs/guide/websockets.md +68 -40
  239. package/skills/void/docs/integrations/agents.md +3 -3
  240. package/skills/void/docs/integrations/cloudflare.md +85 -316
  241. package/skills/void/docs/integrations/frameworks/analog.md +5 -64
  242. package/skills/void/docs/integrations/frameworks/astro.md +4 -73
  243. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
  244. package/skills/void/docs/integrations/frameworks/overview.md +11 -54
  245. package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
  246. package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
  247. package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
  248. package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
  249. package/skills/void/docs/reference/api/auth.md +156 -0
  250. package/skills/void/docs/reference/api/client.md +87 -0
  251. package/skills/void/docs/reference/api/database.md +95 -0
  252. package/skills/void/docs/reference/api/durable.md +46 -0
  253. package/skills/void/docs/reference/api/env.md +50 -0
  254. package/skills/void/docs/reference/api/handlers.md +254 -0
  255. package/skills/void/docs/reference/api/pages.md +241 -0
  256. package/skills/void/docs/reference/api/plugin.md +39 -0
  257. package/skills/void/docs/reference/api/resources.md +109 -0
  258. package/skills/void/docs/reference/api/rewrites.md +76 -0
  259. package/skills/void/docs/reference/api/types.md +92 -0
  260. package/skills/void/docs/reference/api.md +56 -1218
  261. package/skills/void/docs/reference/cli/auth.md +88 -0
  262. package/skills/void/docs/reference/cli/database.md +128 -0
  263. package/skills/void/docs/reference/cli/deploy.md +85 -0
  264. package/skills/void/docs/reference/cli/domains.md +41 -0
  265. package/skills/void/docs/reference/cli/email.md +129 -0
  266. package/skills/void/docs/reference/cli/generate.md +116 -0
  267. package/skills/void/docs/reference/cli/github.md +189 -0
  268. package/skills/void/docs/reference/cli/platform-config.md +92 -0
  269. package/skills/void/docs/reference/cli/platform-email.md +81 -0
  270. package/skills/void/docs/reference/cli/platform-installation.md +127 -0
  271. package/skills/void/docs/reference/cli/platform-operations.md +90 -0
  272. package/skills/void/docs/reference/cli/platform-users.md +89 -0
  273. package/skills/void/docs/reference/cli/platform-zero-trust.md +45 -0
  274. package/skills/void/docs/reference/cli/platform.md +70 -0
  275. package/skills/void/docs/reference/cli/project.md +214 -0
  276. package/skills/void/docs/reference/cli/secrets.md +76 -0
  277. package/skills/void/docs/reference/cli/setup.md +70 -0
  278. package/skills/void/docs/reference/cli.md +33 -1621
  279. package/skills/void/docs/reference/config.md +26 -32
  280. package/skills/void/docs/reference/resource-inference.md +3 -58
  281. package/skills/void/docs/reference/structure.md +14 -41
  282. package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
  283. package/dist/cli/cf-compat.mjs +0 -968
  284. package/dist/client-4cDVv7BO.mjs +0 -2
  285. package/dist/gen-Vnv2f65C.mjs +0 -2
  286. package/dist/help-DQMfeKMz.mjs +0 -2
  287. package/dist/login-DFQk7rbW.mjs +0 -2
  288. package/dist/migrate-TsHGBnDA.mjs +0 -2
  289. package/dist/plan-BEZ8VJW0.mjs +0 -256
  290. package/dist/plan-DpuOr14e.mjs +0 -2
  291. package/dist/prepare-BZXkjdNe.mjs +0 -2
  292. package/dist/validate-EKmJWxmy.mjs +0 -2
  293. /package/dist/cli/{cf-compat.d.mts → cloudflare-operation-process.d.mts} +0 -0
package/README.md CHANGED
@@ -6,10 +6,11 @@ You can also administer a team platform with the same CLI. Sign in with
6
6
  `void platform auth login`, then manage users, signup access, projects, and logs.
7
7
  Commands show a preview before applying changes and support `--json` for scripts.
8
8
  See [Platform Administration](../../docs/guide/platform-administration.md) for a
9
- walkthrough and the [CLI reference](../../docs/reference/cli.md#operator-commands)
9
+ walkthrough and the [CLI reference](../../docs/reference/cli/platform.md#operator-commands)
10
10
  for every command.
11
11
 
12
12
  Use `void platform config auth` to manage login methods and company signup.
13
+ Use `void platform config plans` to manage account plans, enforced limits, and the default for new accounts. See [Plans and Limits](../../docs/guide/platform/administration/plans.md).
13
14
  Cloudflare Access protection has separate create/connect controls. Users can
14
15
  link another enabled login to their account with `void account link`.
15
16
 
@@ -57,6 +58,7 @@ export default defineConfig({
57
58
 
58
59
  - `voidPlugin()` — Vite integration, routing, pages mode, codegen, migrations, packaging
59
60
  - `void prepare` — generate `.void` artifacts for CI, editors, and fresh clones
61
+ - `void info [--json]` — discover persistent resource names before moving definitions
60
62
  - `void auth login` — sign in to the project's saved Cloudflare or Void destination
61
63
  - `void account login` — platform auth
62
64
  - `void connect [url]` — choose Cloudflare or a Void platform, sign in, and save the deployment destination
@@ -98,6 +100,8 @@ Runtime helpers include:
98
100
 
99
101
  Direct Cloudflare deployments also support D1, KV, R2, Queues, Hyperdrive, auth, cron jobs, AI, ISR, typed SQLite Durable Objects, and WebSocket rooms. They upload an immutable Worker Version, probe it before activation (using a 0%-traffic version override when Durable Objects disable preview URLs), and retain version metadata for migration-aware rollback.
100
102
 
103
+ Durable State and WebSocket definitions accept optional `name` to preserve their resource identity when files move. Run `void info` and pin the displayed name before moving deployed code. See [Durable State](../../docs/guide/durable-state.md#rename-a-file-while-keeping-its-state) and [WebSockets](../../docs/guide/websockets.md#move-a-route-while-keeping-its-state), including how to preserve room instances when renaming route parameters.
104
+
101
105
  Self-hosted platform upgrades verify every packaged PostgreSQL migration and require the live Drizzle history to be an exact prefix. Pending SQL is allowed only for an explicitly attested old-version/schema compatibility edge, runs in one transaction, and leaves the old Worker version authoritative until the target runtime passes discovery and health checks.
102
106
 
103
107
  An upgrade that changes the authenticated usage protocol briefly gates application traffic while it verifies the complete Worker set. An interruption leaves the gate closed for the next resumable upgrade instead of enabling an unsigned compatibility path.
@@ -1,13 +1,13 @@
1
- import { c as getToken, p as removeToken } from "./auth-DLNN0D3Z.mjs";
2
- import { j as log } from "./dist-Dn6nn2IU.mjs";
3
- import { n as PlatformClient } from "./client-QTl6ko_D.mjs";
4
- import { n as runLoginCommand } from "./login-DvqXsfGs.mjs";
1
+ import { c as getToken, p as removeToken } from "./auth-CSkdO2Bb.mjs";
2
+ import { j as log } from "./dist-CTBk70IR.mjs";
3
+ import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
4
+ import { n as runLoginCommand } from "./login-UZKFM_u7.mjs";
5
5
  import { execSync } from "node:child_process";
6
6
  //#region src/cli/account-cmd.ts
7
7
  async function runAccountCommand(root, args) {
8
8
  switch (args.subcommand) {
9
9
  case "login": return runLoginCommand(root);
10
- case "link": return import("./auth-link-B_CeugBw.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
10
+ case "link": return import("./auth-link-CioEg6uY.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
11
11
  case "logout":
12
12
  if (removeToken(root)) log.success("Logged out.");
13
13
  else log.info("Not logged in.");
@@ -1,12 +1,17 @@
1
1
  import { a as join, i as isAbsolute, t as basename } from "./dist-BVqXeR_h.mjs";
2
- import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
2
+ import { c as scanWebSocketRoutes, f as readResourceDefinition, i as inferProjectBindings, l as scanWebSocketRoutesSync, m as needsApplicationDatabase, n as FRAMEWORK_SCAN_DIRS, r as detectFramework, s as isWebSocketPatternFile } from "./plugin-inference-CXWnn79A.mjs";
3
+ import { i as resolveProjectPaths, n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
4
+ import { t as findVoidAuthConfig } from "./config-DPByhVck.mjs";
5
+ import { h as resolveBindingNames, u as getDatabaseDialect } from "./config-Br_JZD6u.mjs";
3
6
  import { n as globSync, t as glob } from "./dist-Bn8Kodjp.mjs";
4
7
  import { n as isIdentifier } from "./ast-CPGPjb0V.mjs";
5
- import { c as unwrapStaticExpression, o as staticExportInitializers, s as staticLiteral, t as scanPages } from "./scan-4tfN-PSn.mjs";
6
- import { a as isWebSocketPatternFile, o as scanWebSocketRoutes } from "./plugin-inference-BMfKRSqE.mjs";
7
- import { n as parseRouteFilename, t as isRouteEnabledForEnvironment } from "./parse-filename-DioPHiR9.mjs";
8
- import { i as scanEmailHandlers } from "./email--tEtMoj_.mjs";
9
- import { readFileSync } from "node:fs";
8
+ import { a as staticLiteral, i as staticExportInitializers, n as parseRouteFilename, o as unwrapStaticExpression, t as isRouteEnabledForEnvironment } from "./parse-filename-CUbj-1MP.mjs";
9
+ import { n as resourceNameWords } from "./resource-name-C7LVpcRm.mjs";
10
+ import { t as collectMigrations } from "./collect-DiTn9yr6.mjs";
11
+ import { a as scanEmailHandlersSync, i as scanEmailHandlers, r as hasEmailHandlers } from "./email--tEtMoj_.mjs";
12
+ import { t as scanPages } from "./scan-C7okrLyM.mjs";
13
+ import { o as isSandboxEnabled } from "./config-C_XRIPx2.mjs";
14
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
10
15
  import { parseSync } from "vite";
11
16
  //#region src/crons/scan.ts
12
17
  const JOB_EXTENSIONS = [
@@ -65,6 +70,44 @@ function scanJobsSync(root, jobsDir = "crons") {
65
70
  return parseJobFiles(root, jobsDir, files);
66
71
  }
67
72
  //#endregion
73
+ //#region src/durable/scan.ts
74
+ const MODULE_PATTERN = /\.(?:[cm]?[jt]s)$/;
75
+ function inferDurableResourceName(filePath) {
76
+ return filePath.replace(/\\/g, "/").split("/").pop().replace(MODULE_PATTERN, "");
77
+ }
78
+ const DURABLE_HELPERS = /* @__PURE__ */ new Set(["defineDurableState"]);
79
+ function deriveDurableResourceIdentity(name) {
80
+ const parts = resourceNameWords(name);
81
+ const classBase = parts.map((part) => part[0].toUpperCase() + part.slice(1)).join("");
82
+ return {
83
+ bindingName: parts.join("_").toUpperCase(),
84
+ className: `${classBase}DurableObject`,
85
+ migrationTag: `void-durable-${parts.join("-").toLowerCase()}-v1`
86
+ };
87
+ }
88
+ function scanDurableObjectModules(root) {
89
+ const directory = join(root, "durable-objects");
90
+ if (!existsSync(directory)) return [];
91
+ const modules = readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isFile() && MODULE_PATTERN.test(entry.name) && !entry.name.endsWith(".d.ts")).sort((a, b) => a.name.localeCompare(b.name)).map((entry) => {
92
+ const filePath = join(directory, entry.name);
93
+ const name = readResourceDefinition(filePath, readFileSync(filePath, "utf-8"), DURABLE_HELPERS)?.name;
94
+ if (resourceNameWords(name ?? inferDurableResourceName(entry.name)).length === 0) throw new Error(`durable: cannot derive a name from durable-objects/${entry.name}.`);
95
+ return {
96
+ filePath,
97
+ ...deriveDurableResourceIdentity(name ?? inferDurableResourceName(entry.name)),
98
+ ...name === void 0 ? {} : { name }
99
+ };
100
+ });
101
+ const bindings = /* @__PURE__ */ new Set();
102
+ const classes = /* @__PURE__ */ new Set();
103
+ for (const module of modules) {
104
+ if (bindings.has(module.bindingName) || classes.has(module.className)) throw new Error(`durable: duplicate generated name for '${module.filePath}'. Choose a different resource name or rename one of the durable-objects files.`);
105
+ bindings.add(module.bindingName);
106
+ classes.add(module.className);
107
+ }
108
+ return modules;
109
+ }
110
+ //#endregion
68
111
  //#region src/queues/scan.ts
69
112
  const QUEUE_EXTENSIONS = [
70
113
  "ts",
@@ -226,31 +269,31 @@ function compareRouteSpecificity(a, b) {
226
269
  async function scanRoutes(root, options) {
227
270
  const paths = options?.paths ?? readProjectPaths(root);
228
271
  const [routeFiles, websockets, middlewareFiles, jobs, queues, pages, email] = await Promise.all([
229
- glob(ROUTE_PATTERN, {
272
+ options?.inventory ? [] : glob(ROUTE_PATTERN, {
230
273
  cwd: paths.routesDir,
231
274
  absolute: false
232
275
  }),
233
- scanWebSocketRoutes(root, paths, options?.environment),
234
- glob(ROUTE_PATTERN, {
276
+ options?.inventory?.websockets ?? scanWebSocketRoutes(root, paths, options?.environment),
277
+ options?.inventory ? [] : glob(ROUTE_PATTERN, {
235
278
  cwd: paths.middlewareDir,
236
279
  absolute: false
237
280
  }).catch(() => []),
238
- scanJobs(root, paths.cronsDir),
239
- scanQueues(root, paths.queuesDir),
281
+ options?.inventory?.jobs ?? scanJobs(root, paths.cronsDir),
282
+ options?.inventory?.queues ?? scanQueues(root, paths.queuesDir),
240
283
  scanPages(root, {
241
284
  output: options?.output,
242
285
  paths
243
286
  }),
244
- scanEmailHandlers(paths.sourceRoot)
287
+ options?.inventory?.email ?? scanEmailHandlers(paths.sourceRoot)
245
288
  ]);
246
289
  const routesDir = paths.routesDir;
247
290
  return {
248
- routes: routeFiles.filter((f) => !isWebSocketPatternFile(f)).filter((f) => !f.split("/").some((s) => s.startsWith("_"))).map((file) => parseRouteFilename(file)).filter((route) => isRouteEnabledForEnvironment(route, options?.environment)).map((route) => {
249
- route.methods = detectHttpExports(join(routesDir, route.filePath));
250
- return route;
251
- }).sort(compareRouteSpecificity),
291
+ routes: (options?.inventory?.routes ?? routeFiles.filter((f) => !isWebSocketPatternFile(f)).filter((f) => !f.split("/").some((s) => s.startsWith("_"))).map((file) => parseRouteFilename(file)).filter((route) => isRouteEnabledForEnvironment(route, options?.environment))).map((route) => ({
292
+ ...route,
293
+ methods: detectHttpExports(join(routesDir, route.filePath))
294
+ })).sort(compareRouteSpecificity),
252
295
  websockets,
253
- middleware: parseMiddlewareDefinitions(middlewareFiles),
296
+ middleware: options?.inventory?.middleware ?? parseMiddlewareDefinitions(middlewareFiles),
254
297
  jobs,
255
298
  queues,
256
299
  pages,
@@ -282,4 +325,78 @@ function scanRoutePatternsSync(root, paths = readProjectPaths(root), environment
282
325
  return routeFiles.filter((f) => !isWebSocketPatternFile(f)).filter((f) => !f.split("/").some((s) => s.startsWith("_"))).map((f) => parseRouteFilename(f)).filter((route) => isRouteEnabledForEnvironment(route, environment)).sort(compareRouteSpecificity);
283
326
  }
284
327
  //#endregion
285
- export { scanJobsSync as a, scanQueuesSync as i, scanRoutePatternsSync as n, scanRoutes as r, scanMiddlewareSync as t };
328
+ //#region src/application-analysis.ts
329
+ /**
330
+ * Discover application source features once for a consumer's environment.
331
+ * Resource ids, generated provider configuration and migration history remain
332
+ * the responsibility of the target consuming this analysis.
333
+ */
334
+ function analyzeApplicationSync(root, options) {
335
+ const { config, environment } = options;
336
+ const paths = resolveProjectPaths(root, config);
337
+ const framework = detectFramework(root);
338
+ const scanDirs = config.inference?.scanDirs ?? (framework ? FRAMEWORK_SCAN_DIRS : void 0);
339
+ const inferred = inferProjectBindings(root, {
340
+ paths,
341
+ environment,
342
+ bindings: config.inference?.bindings
343
+ }, scanDirs);
344
+ const authConfigPath = findVoidAuthConfig(root, paths);
345
+ const authEnabled = inferred.needsAuth || authConfigPath !== null || config.auth !== void 0;
346
+ const bindings = {
347
+ ...inferred,
348
+ needsAuth: authEnabled,
349
+ needsSandbox: inferred.needsSandbox || isSandboxEnabled(config)
350
+ };
351
+ const dialect = getDatabaseDialect(config);
352
+ const migrations = collectMigrations(paths.migrationsDir);
353
+ const jobs = scanJobsSync(root, paths.cronsDir);
354
+ const queues = scanQueuesSync(root, paths.queuesDir);
355
+ const allWebsockets = scanWebSocketRoutesSync(root, paths);
356
+ const websockets = allWebsockets.filter((route) => isRouteEnabledForEnvironment(route, environment));
357
+ const durableObjects = scanDurableObjectModules(root);
358
+ const email = scanEmailHandlersSync(paths.sourceRoot);
359
+ const overrides = config.inference?.bindings;
360
+ const bindingReason = (key, label, inferredReason) => overrides?.[key] ? `inference.bindings.${key} enables ${label}` : inferredReason;
361
+ const reasons = {
362
+ database: [],
363
+ kv: bindings.needsKV ? [bindingReason("kv", "KV", "app uses env.KV")] : [],
364
+ r2: bindings.needsR2 ? [bindingReason("storage", "R2", "app uses env.STORAGE (R2)")] : [],
365
+ ai: bindings.needsAI ? [bindingReason("ai", "Workers AI", "app uses Workers AI")] : [],
366
+ sandbox: bindings.needsSandbox ? [isSandboxEnabled(config) ? "void.config.ts enables Sandbox" : "app uses void/sandbox"] : [],
367
+ live: bindings.needsLive ? ["app uses void/live"] : [],
368
+ email: bindings.needsEmail ? [bindingReason("email", "email", "app uses void/email")] : [],
369
+ queues: bindings.needsQueues ? ["app uses void/queues"] : []
370
+ };
371
+ const databaseName = dialect === "sqlite" ? "a D1 database" : "a Hyperdrive database";
372
+ if (bindings.needsD1) reasons.database.push(bindingReason("db", databaseName, dialect === "sqlite" ? "app uses env.DB (D1)" : "app uses a database"));
373
+ if (authEnabled) reasons.database.push(`auth requires ${databaseName}`);
374
+ if (migrations.length > 0) reasons.database.push(`checked-in migrations need ${databaseName}`);
375
+ for (const queue of queues) reasons.queues.push(`queues/${queue.filePath} requires ${queue.bindingName}`);
376
+ if (hasEmailHandlers(email)) reasons.email.push("email/ contains inbound email handlers");
377
+ return {
378
+ root,
379
+ config,
380
+ environment,
381
+ paths,
382
+ framework,
383
+ bindings,
384
+ authConfigPath,
385
+ authEnabled,
386
+ dialect,
387
+ bindingNames: resolveBindingNames(config.inference?.bindings),
388
+ needsDatabase: needsApplicationDatabase(bindings, migrations.length),
389
+ migrations,
390
+ jobs,
391
+ queues,
392
+ websockets,
393
+ allWebsockets,
394
+ durableObjects,
395
+ email,
396
+ routes: scanRoutePatternsSync(root, paths, environment),
397
+ middleware: scanMiddlewareSync(root, paths),
398
+ reasons
399
+ };
400
+ }
401
+ //#endregion
402
+ export { inferDurableResourceName as a, deriveDurableResourceIdentity as i, scanRoutes as n, scanDurableObjectModules as o, scanQueuesSync as r, scanJobsSync as s, analyzeApplicationSync as t };
@@ -0,0 +1,27 @@
1
+ import { n as scanRoutes, t as analyzeApplicationSync } from "./application-analysis-BVsVqc11.mjs";
2
+ //#region src/application-routing.ts
3
+ /** Complete route/page analysis using the same resource and handler inventories. */
4
+ async function completeApplicationAnalysis(analysis) {
5
+ const scan = await scanRoutes(analysis.root, {
6
+ output: analysis.config.output,
7
+ paths: analysis.paths,
8
+ environment: analysis.environment,
9
+ inventory: {
10
+ routes: analysis.routes,
11
+ middleware: analysis.middleware,
12
+ jobs: analysis.jobs,
13
+ queues: analysis.queues,
14
+ websockets: analysis.websockets,
15
+ email: analysis.email
16
+ }
17
+ });
18
+ return {
19
+ ...analysis,
20
+ scan
21
+ };
22
+ }
23
+ async function analyzeApplication(root, options) {
24
+ return completeApplicationAnalysis(analyzeApplicationSync(root, options));
25
+ }
26
+ //#endregion
27
+ export { completeApplicationAnalysis as n, analyzeApplication as t };
@@ -1,2 +1,2 @@
1
- import { a as getApiUrl, h as runPlatformLogin, s as getSiteDomain } from "./auth-DLNN0D3Z.mjs";
1
+ import { a as getApiUrl, h as runPlatformLogin, s as getSiteDomain } from "./auth-CSkdO2Bb.mjs";
2
2
  export { getApiUrl, getSiteDomain, runPlatformLogin };
@@ -74,7 +74,7 @@ function getToken(root = process.cwd()) {
74
74
  return null;
75
75
  }
76
76
  const config = readConfig();
77
- return readTokenForOrigin(apiUrl, config, legacyCredentialAccount(root, apiUrl, config));
77
+ return readTokenForOrigin(apiUrl, config);
78
78
  }
79
79
  /** Account actions follow the selected connection, independently of application metadata. */
80
80
  function getAccountCredential() {
@@ -82,39 +82,16 @@ function getAccountCredential() {
82
82
  const apiUrl = normalizePlatformApiUrl(process.env.VOID_API_URL || (process.env.VOID_TOKEN ? DEFAULT_API_URL : getActivePlatformConnection()?.apiUrl ?? config.api ?? readLegacyHostedPlatformSelection()?.apiUrl ?? (keyringGet("token") ? DEFAULT_API_URL : keyringGet("stagingToken") ? STAGING_API_URL : DEFAULT_API_URL)));
83
83
  return {
84
84
  apiUrl,
85
- token: readTokenForOrigin(apiUrl, config, legacyCredentialAccountForMode(apiUrl === STAGING_API_URL, apiUrl, config))
85
+ token: readTokenForOrigin(apiUrl, config)
86
86
  };
87
87
  }
88
- function readTokenForOrigin(apiUrl, config, legacyAccount) {
88
+ function readTokenForOrigin(apiUrl, config) {
89
89
  const envToken = process.env.VOID_TOKEN;
90
90
  if (envToken) {
91
91
  if (apiUrl !== (process.env.VOID_API_URL ? normalizePlatformApiUrl(process.env.VOID_API_URL) : DEFAULT_API_URL)) throw new Error(`auth: VOID_TOKEN is not bound to ${apiUrl}. Set VOID_API_URL to this platform's URL with its matching token, or unset VOID_TOKEN to use the saved login.`);
92
92
  return envToken;
93
93
  }
94
- const normalizedApiUrl = normalizePlatformApiUrl(apiUrl);
95
- const originToken = readOriginScopedToken(normalizedApiUrl, config);
96
- if (originToken) return originToken;
97
- const account = platformCredentialAccount(normalizedApiUrl);
98
- if (legacyAccount) {
99
- const legacyKeyringToken = keyringGet(legacyAccount);
100
- if (legacyKeyringToken) {
101
- keyringSet(account, legacyKeyringToken);
102
- return legacyKeyringToken;
103
- }
104
- }
105
- if (!legacyAccount) return null;
106
- const legacyFileToken = config[legacyAccount];
107
- if (legacyFileToken) {
108
- if (keyringSet(account, legacyFileToken)) {
109
- config.api ??= normalizedApiUrl;
110
- delete config[legacyAccount];
111
- try {
112
- writeConfig(config);
113
- } catch {}
114
- }
115
- return legacyFileToken;
116
- }
117
- return null;
94
+ return readOriginScopedToken(apiUrl, config);
118
95
  }
119
96
  function getTokenSource() {
120
97
  return process.env.VOID_TOKEN ? "ci" : "manual";
@@ -139,13 +116,6 @@ function removeToken(root = process.cwd()) {
139
116
  try {
140
117
  const config = readConfig();
141
118
  let configChanged = false;
142
- const legacyAccount = legacyCredentialAccount(root, apiUrl, config);
143
- if (legacyAccount && keyringDelete(legacyAccount)) removed = true;
144
- if (legacyAccount && config[legacyAccount]) {
145
- delete config[legacyAccount];
146
- configChanged = true;
147
- removed = true;
148
- }
149
119
  if (config.tokens?.[apiUrl]) {
150
120
  delete config.tokens[apiUrl];
151
121
  if (Object.keys(config.tokens).length === 0) delete config.tokens;
@@ -158,19 +128,6 @@ function removeToken(root = process.cwd()) {
158
128
  }
159
129
  const DEFAULT_API_URL = VOID_CLOUD_PLATFORM.apiUrl;
160
130
  const STAGING_API_URL = VOID_CLOUD_STAGING_PLATFORM.apiUrl;
161
- function legacyCredentialAccount(root, normalizedApiUrl, config) {
162
- return legacyCredentialAccountForMode(isStagingMode(root), normalizedApiUrl, config);
163
- }
164
- function legacyCredentialAccountForMode(staging, normalizedApiUrl, config) {
165
- const account = staging ? "stagingToken" : "token";
166
- let configuredUrl;
167
- try {
168
- configuredUrl = normalizePlatformApiUrl(config.api ?? (staging ? STAGING_API_URL : DEFAULT_API_URL));
169
- } catch {
170
- return null;
171
- }
172
- return configuredUrl === normalizedApiUrl ? account : null;
173
- }
174
131
  function base64Url(buffer) {
175
132
  return buffer.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
176
133
  }
@@ -1,8 +1,8 @@
1
- import { a as getApiUrl, c as getToken, d as openBrowser, g as savePlatformToken, h as runPlatformLogin } from "./auth-DLNN0D3Z.mjs";
2
- import { j as log } from "./dist-Dn6nn2IU.mjs";
3
- import { n as PlatformClient } from "./client-QTl6ko_D.mjs";
4
- import { r as selectPlatformLoginMethod } from "./login-DvqXsfGs.mjs";
5
- import { t as discoverPlatform } from "./platform-cmd-DNl8WosH.mjs";
1
+ import { a as getApiUrl, c as getToken, d as openBrowser, g as savePlatformToken, h as runPlatformLogin } from "./auth-CSkdO2Bb.mjs";
2
+ import { j as log } from "./dist-CTBk70IR.mjs";
3
+ import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
4
+ import { r as selectPlatformLoginMethod } from "./login-UZKFM_u7.mjs";
5
+ import { t as discoverPlatform } from "./platform-cmd-DMcQStSc.mjs";
6
6
  import { execFile } from "node:child_process";
7
7
  //#region src/cli/auth-link.ts
8
8
  async function runAuthLink(root, connectionId) {
@@ -1,6 +1,6 @@
1
1
  import { o as listPlatformConnections } from "./platform-registry-QBa4DK32.mjs";
2
2
  import { i as readDeploymentPlatform } from "./project-C0Fqu05O.mjs";
3
- import { I as select, W as isCancel } from "./dist-Dn6nn2IU.mjs";
3
+ import { I as select, W as isCancel } from "./dist-CTBk70IR.mjs";
4
4
  //#region src/cli/auth-router.ts
5
5
  async function chooseDestination(root, args, interactive) {
6
6
  const saved = readDeploymentPlatform(root);
@@ -37,7 +37,7 @@ async function chooseDestination(root, args, interactive) {
37
37
  }
38
38
  async function runAuthRouter(root, args, interactive = Boolean(process.stdin.isTTY)) {
39
39
  if (args.subcommand === "link") {
40
- const { runAccountCommand } = await import("./account-cmd-DZZGK80W.mjs");
40
+ const { runAccountCommand } = await import("./account-cmd-C84Ee8cO.mjs");
41
41
  await runAccountCommand(root, {
42
42
  subcommand: "link",
43
43
  ...args.connectionId ? { connectionId: args.connectionId } : {}
@@ -45,17 +45,17 @@ async function runAuthRouter(root, args, interactive = Boolean(process.stdin.isT
45
45
  return;
46
46
  }
47
47
  if (args.subcommand === "token") {
48
- const { runAccountCommand } = await import("./account-cmd-DZZGK80W.mjs");
48
+ const { runAccountCommand } = await import("./account-cmd-C84Ee8cO.mjs");
49
49
  await runAccountCommand(root, { subcommand: "token" });
50
50
  return;
51
51
  }
52
52
  const destination = await chooseDestination(root, args, interactive);
53
53
  if (destination.platform === "cloudflare") {
54
- const { runCloudflareCommand } = await import("./cloudflare-cmd-bSmZ1d5L.mjs");
54
+ const { runCloudflareCommand } = await import("./cloudflare-cmd-BcrVyTmJ.mjs");
55
55
  await runCloudflareCommand(root, { subcommand: args.subcommand === "whoami" || args.subcommand === "status" ? "status" : args.subcommand });
56
56
  return;
57
57
  }
58
- const { runAccountCommand } = await import("./account-cmd-DZZGK80W.mjs");
58
+ const { runAccountCommand } = await import("./account-cmd-C84Ee8cO.mjs");
59
59
  const subcommand = args.subcommand === "status" ? "whoami" : args.subcommand;
60
60
  if (!destination.apiUrl) {
61
61
  await runAccountCommand(root, { subcommand });
@@ -77,11 +77,17 @@ function resolveSocialProviders(env, configuredProviders) {
77
77
  }
78
78
  return Object.keys(providers).length > 0 ? providers : void 0;
79
79
  }
80
- function appendAuthHeaders(c, source) {
80
+ function appendAuthHeaders(c, source, includeCachePolicy) {
81
81
  if (!source) return;
82
82
  source.forEach((value, key) => {
83
+ if (!includeCachePolicy && ["cache-control", "pragma"].includes(key.toLowerCase())) return;
83
84
  c.header(key, value, { append: key.toLowerCase() === "set-cookie" });
84
85
  });
86
+ if (source.has("set-cookie") && !(source.get("cache-control") ?? "").split(",").some((directive) => [
87
+ "private",
88
+ "no-store",
89
+ "no-cache"
90
+ ].includes(directive.trim().toLowerCase()))) c.header("Cache-Control", "private, no-store");
85
91
  }
86
92
  function resolveUserConfig(userConfig, defaults, request, env, dialect) {
87
93
  const mergeEmailAndPasswordDefaults = (options) => {
@@ -175,7 +181,12 @@ function createVoidAuthRuntime(dialect, resolveDatabase, runVoidAuthMigrations)
175
181
  }, async () => {
176
182
  await next();
177
183
  });
178
- appendAuthHeaders(c, result.headers);
184
+ const credentialed = [
185
+ "cookie",
186
+ "authorization",
187
+ "cf-access-jwt-assertion"
188
+ ].some((header) => c.req.raw.headers.has(header));
189
+ appendAuthHeaders(c, result.headers, state !== null || credentialed || result.headers?.has("set-cookie") === true);
179
190
  } finally {
180
191
  await dispose();
181
192
  }
@@ -1,12 +1,18 @@
1
- import { a as dim, c as import_picocolors, r as cliTitle } from "./output-CCH48AMM.mjs";
2
- import { c as getToken } from "./auth-DLNN0D3Z.mjs";
1
+ import { c as getToken } from "./auth-CSkdO2Bb.mjs";
3
2
  import { o as readProjectConfig } from "./project-C0Fqu05O.mjs";
4
- import { O as intro, P as outro, j as log } from "./dist-Dn6nn2IU.mjs";
5
- import { n as PlatformClient, t as PlatformApiError } from "./client-QTl6ko_D.mjs";
3
+ import { O as intro, P as outro, j as log } from "./dist-CTBk70IR.mjs";
4
+ import { n as PlatformClient, t as PlatformApiError } from "./client-RV8NVeB8.mjs";
5
+ import { a as dim, c as import_picocolors, r as cliTitle } from "./output-Dm_A4Tbv.mjs";
6
6
  import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
7
7
  import { appendFileSync, writeFileSync } from "node:fs";
8
8
  //#region src/cli/build-cmd.ts
9
9
  const POLL_MS = 1e3;
10
+ const BUILD_LOG_DRAIN_TIMEOUT_MS = 12e4;
11
+ function isBuildLogComplete(page) {
12
+ if (!page.terminal) return false;
13
+ if (page.logsComplete === null || page.logsComplete === void 0) throw new Error("This platform cannot confirm that the final build logs were captured. Ask its administrator to upgrade the platform runtime, or read the retained logs without --follow.");
14
+ return page.logsComplete === true;
15
+ }
10
16
  function sleep(ms) {
11
17
  return new Promise((resolve) => setTimeout(resolve, ms));
12
18
  }
@@ -24,7 +30,7 @@ function isFatalFollowError(err) {
24
30
  }
25
31
  /**
26
32
  * Pure follow-loop: repeatedly fetch pages since a cursor, write each new
27
- * line, and stop when the build reaches a terminal status. `fetchPage`,
33
+ * line, and stop when the terminal build confirms its final logs were captured. `fetchPage`,
28
34
  * `write`, and `sleep` are injected so this is unit-testable. Returns the
29
35
  * final status + terminal flag.
30
36
  *
@@ -37,6 +43,7 @@ function isFatalFollowError(err) {
37
43
  async function followBuildLogs(opts) {
38
44
  let cursor = opts.since;
39
45
  let status = opts.status;
46
+ let terminalSince = null;
40
47
  const pollMs = opts.pollMs ?? POLL_MS;
41
48
  for (;;) {
42
49
  await opts.sleep(pollMs);
@@ -51,10 +58,15 @@ async function followBuildLogs(opts) {
51
58
  for (const l of pageResult.lines) opts.write(l.line);
52
59
  cursor = pageResult.lastSeq;
53
60
  status = pageResult.status;
54
- if (pageResult.terminal) return {
61
+ if (isBuildLogComplete(pageResult)) return {
55
62
  status,
56
63
  terminal: true
57
64
  };
65
+ if (pageResult.terminal) {
66
+ const now = Date.now();
67
+ terminalSince ??= now;
68
+ if (now - terminalSince >= BUILD_LOG_DRAIN_TIMEOUT_MS) throw new Error("Build finished, but its log producer did not confirm completion. Retry the command to recover the final log tail.");
69
+ } else terminalSince = null;
58
70
  }
59
71
  }
60
72
  async function runBuildCommand(root, args) {
@@ -123,7 +135,7 @@ async function runBuildLogsCommand(root, args) {
123
135
  for (const l of first.lines) write(l.line);
124
136
  let status = first.status;
125
137
  let terminal = first.terminal;
126
- if (args.follow && !terminal) ({status, terminal} = await followBuildLogs({
138
+ if (args.follow && !isBuildLogComplete(first)) ({status, terminal} = await followBuildLogs({
127
139
  fetchPage: (since) => client.getBuildLogs(projectId, buildId, since),
128
140
  write,
129
141
  sleep,
@@ -1,8 +1,8 @@
1
- import { a as dim, i as createSpinner, r as cliTitle } from "./output-CCH48AMM.mjs";
2
- import { c as getToken } from "./auth-DLNN0D3Z.mjs";
1
+ import { c as getToken } from "./auth-CSkdO2Bb.mjs";
3
2
  import { o as readProjectConfig } from "./project-C0Fqu05O.mjs";
4
- import { O as intro, P as outro, j as log } from "./dist-Dn6nn2IU.mjs";
5
- import { n as PlatformClient } from "./client-QTl6ko_D.mjs";
3
+ import { O as intro, P as outro, j as log } from "./dist-CTBk70IR.mjs";
4
+ import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
5
+ import { a as dim, i as createSpinner, r as cliTitle } from "./output-Dm_A4Tbv.mjs";
6
6
  import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
7
7
  //#region src/cli/cache.ts
8
8
  async function runPurgeCacheCommand(root, projectSlug) {
@@ -1,8 +1,8 @@
1
- import { r as cliTitle } from "./output-CCH48AMM.mjs";
2
- import { c as getToken } from "./auth-DLNN0D3Z.mjs";
1
+ import { c as getToken } from "./auth-CSkdO2Bb.mjs";
3
2
  import { o as readProjectConfig } from "./project-C0Fqu05O.mjs";
4
- import { E as confirm, O as intro, P as outro, W as isCancel, j as log } from "./dist-Dn6nn2IU.mjs";
5
- import { n as PlatformClient } from "./client-QTl6ko_D.mjs";
3
+ import { E as confirm, O as intro, P as outro, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
4
+ import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
5
+ import { r as cliTitle } from "./output-Dm_A4Tbv.mjs";
6
6
  //#region src/cli/cancel-deploy.ts
7
7
  const ACTIVE_STATUSES = /* @__PURE__ */ new Set([
8
8
  "pending",