void 1.0.3 → 1.1.11

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 (194) hide show
  1. package/dist/{account-cmd-BTcUzv9L.mjs → account-cmd-R35a4Oa8.mjs} +3 -3
  2. package/dist/{application-analysis-AB_YYWgH.mjs → application-analysis-D7nNmNJb.mjs} +6 -6
  3. package/dist/{application-routing-L7V-TFhZ.mjs → application-routing-CZH66gXn.mjs} +1 -1
  4. package/dist/{auth-link-DUJuvRx5.mjs → auth-link-VHmiKZmP.mjs} +3 -3
  5. package/dist/{auth-migrations-Cgs0k6lS.mjs → auth-migrations-BO27GDNr.mjs} +38 -2
  6. package/dist/{auth-router-CIxiMG7i.mjs → auth-router-O_Wrs5kg.mjs} +5 -4
  7. package/dist/{better-auth-shared-B74NJIus.d.mts → better-auth-shared-Bv18bB-l.d.mts} +2 -0
  8. package/dist/{better-auth-shared-CMXlZG7W.mjs → better-auth-shared-D-6z0q0f.mjs} +28 -1
  9. package/dist/{build-cmd-BkIv25PA.mjs → build-cmd-CMZiMn46.mjs} +1 -1
  10. package/dist/{cache-Ctzfig-W.mjs → cache-TZ5Ab3d7.mjs} +1 -1
  11. package/dist/{cancel-deploy-CD9o-SsC.mjs → cancel-deploy-DXoR6oC3.mjs} +1 -1
  12. package/dist/cli/cli.mjs +69 -50
  13. package/dist/cli/env-schema-probe.mjs +3 -3
  14. package/dist/client-DrdeJgHR.mjs +1 -0
  15. package/dist/{client-DM9Kcf4e.mjs → client-GuSO3v_x.mjs} +1 -1
  16. package/dist/{cloudflare-auth-CqFBDo52.mjs → cloudflare-auth-DSvBc1Gu.mjs} +1 -1
  17. package/dist/{cloudflare-cmd-BIAF_BIY.mjs → cloudflare-cmd-ZSErUl6Y.mjs} +3 -3
  18. package/dist/{cloudflare-config-DV60XFFK.mjs → cloudflare-config-rdFOys4X.mjs} +2 -2
  19. package/dist/{cloudflare-connect-WjwnVOJA.mjs → cloudflare-connect-BN-k2kD-.mjs} +2 -2
  20. package/dist/{cloudflare-operations-CrSUFRzJ.mjs → cloudflare-operations-Cm8lVx7W.mjs} +1 -1
  21. package/dist/{cloudflare-operations-B42EZeJy.mjs → cloudflare-operations-DH3GedbV.mjs} +6 -6
  22. package/dist/{cloudflare-process-CeDWJRhj.mjs → cloudflare-process-CZJ4viYl.mjs} +2 -2
  23. package/dist/collect-BWhkgtAn.mjs +1 -0
  24. package/dist/{collect-xjffdCdk.mjs → collect-Dew86qce.mjs} +4 -3
  25. package/dist/{config-D0GY5ItR.mjs → config-CyUJzi3q.mjs} +1 -1
  26. package/dist/{config-Bx_1SpnO.mjs → config-D26zcdKy.mjs} +2 -2
  27. package/dist/{config-BEm9vRvS.mjs → config-DC5llZaI.mjs} +2 -2
  28. package/dist/{config-QrJWu0IX.mjs → config-DYJV8aEH.mjs} +1 -1
  29. package/dist/{connect-CKtk-EZe.mjs → connect-yQuLbuiJ.mjs} +4 -4
  30. package/dist/{create-project-B-ewF_Af.mjs → create-project-CGOo_OL_.mjs} +1 -1
  31. package/dist/{create-project-yInGo72M.mjs → create-project-DEEWJX_M.mjs} +1 -1
  32. package/dist/database-provider.d.mts +6 -0
  33. package/dist/{db-7I_gfdVq.mjs → db-COI-yTJE.mjs} +255 -110
  34. package/dist/{db-types-Bb4WBWIs.mjs → db-types-NGxPwnlt.mjs} +1 -1
  35. package/dist/{delete-Cy-M1u-r.mjs → delete-PgN6L_9N.mjs} +1 -1
  36. package/dist/deploy-CxNgEYr4.mjs +2 -0
  37. package/dist/{deploy-BYYlnsiy.mjs → deploy-DsW-PrRQ.mjs} +38 -36
  38. package/dist/{deploy-managed-static-Ca4TFdmx.mjs → deploy-managed-static-Dqz06S2u.mjs} +20 -20
  39. package/dist/{deploy-transport-DWlWBe6M.mjs → deploy-transport-nY3vLXPL.mjs} +2 -2
  40. package/dist/deploy.mjs +5 -5
  41. package/dist/discover-D4TPKo57.mjs +1 -0
  42. package/dist/{discover-D2PGT63u.mjs → discover-LaV0tbIu.mjs} +1 -1
  43. package/dist/{dispatch-DrTTk8Xg.mjs → dispatch-BAbbn3jg.mjs} +6 -6
  44. package/dist/{domain-CZGxPv9u.mjs → domain-DKlNI0SR.mjs} +2 -2
  45. package/dist/{drizzle-CF84FOVM.mjs → drizzle-BQfyvQKX.mjs} +13 -2
  46. package/dist/{email-DzyNVuoU.mjs → email-C0s3OvJk.mjs} +10 -11
  47. package/dist/{email-cloudflare-DfG6UEMm.mjs → email-cloudflare-etpKiITL.mjs} +7 -10
  48. package/dist/{entry-ehmBvs5w.mjs → entry-B_0IhV64.mjs} +1 -1
  49. package/dist/{env-Nx3yf50r.mjs → env-BX2JFsgF.mjs} +4 -4
  50. package/dist/{env-types-DS2_y4X8.mjs → env-types-GRchm5dw.mjs} +1 -1
  51. package/dist/{env-validation-BT7z-qpQ.mjs → env-validation-CuGfWRJd.mjs} +1 -1
  52. package/dist/{env-validation-DYxjz_Wo.mjs → env-validation-D_KyMdab.mjs} +2 -2
  53. package/dist/{fetch-BPCYVi3H.d.mts → fetch-DHLOuPyk.d.mts} +2 -2
  54. package/dist/{fetch-stream-obvZ7fvO.d.mts → fetch-stream-CNxOrBdP.d.mts} +1 -1
  55. package/dist/{gen-CufHEf42.mjs → gen-Bj6ZkOcI.mjs} +25 -19
  56. package/dist/gen-DsCukhuw.mjs +1 -0
  57. package/dist/{generate-Dat0UTry.mjs → generate-B1m4Cm4n.mjs} +1 -1
  58. package/dist/{generate-ClI89brV.mjs → generate-DkEb9rL-.mjs} +1 -1
  59. package/dist/{github-cmd-FU8EjFyU.mjs → github-cmd-DQDryS-5.mjs} +1 -1
  60. package/dist/{headers-Di1FsD3e.mjs → headers-Bi4bOAwp.mjs} +1 -1
  61. package/dist/{help-BT2hovNI.mjs → help-D49SL_lN.mjs} +16 -12
  62. package/dist/help-DOFygYi4.mjs +1 -0
  63. package/dist/{inbound-brj2-TM5.d.mts → inbound-Da7XsjH3.d.mts} +6 -12
  64. package/dist/index.mjs +103 -57
  65. package/dist/{info-l249eUdH.mjs → info-Bxunp14X.mjs} +4 -4
  66. package/dist/{init-D0A6M64Q.mjs → init-DyTEY04s.mjs} +50 -27
  67. package/dist/{link-WMoJFf4i.mjs → link-CgOVn9EC.mjs} +2 -2
  68. package/dist/{list-CQ2EQEHL.mjs → list-CUfD9RSb.mjs} +2 -2
  69. package/dist/{local-d1-BxvQYEFi.mjs → local-d1-CpaPbd_L.mjs} +5 -5
  70. package/dist/{login-C2T1oVG-.mjs → login-BJvGW5Eu.mjs} +2 -2
  71. package/dist/login-alAlxw4S.mjs +1 -0
  72. package/dist/{logs-DnC1d7xB.mjs → logs-DeizBI4j.mjs} +2 -2
  73. package/dist/{migrate-BDIprOYd.mjs → migrate-8rk56vV8.mjs} +4 -4
  74. package/dist/migrate-D2odrAmh.mjs +1 -0
  75. package/dist/{neon-n74ta1Pr.mjs → neon-DTZr7Bu7.mjs} +0 -1
  76. package/dist/nitro.mjs +3 -3
  77. package/dist/{node-cPadMgUO.mjs → node-uN8_zxJr.mjs} +15 -9
  78. package/dist/{operator-cmd-DHieWtFp.mjs → operator-cmd-CA5QQyvE.mjs} +3 -3
  79. package/dist/operator-cmd-D7toMPJ9.mjs +1 -0
  80. package/dist/pages/client.d.mts +1 -1
  81. package/dist/pages/index.d.mts +1 -1
  82. package/dist/pages/index.mjs +4 -4
  83. package/dist/pages/islands-plugin.d.mts +1 -1
  84. package/dist/pages/islands-plugin.mjs +1 -1
  85. package/dist/pages/protocol.d.mts +1 -1
  86. package/dist/{platform-args-CaCL_1Ch.mjs → platform-args-B7ke06up.mjs} +1 -4
  87. package/dist/platform-args-B_LrqEZB.mjs +1 -0
  88. package/dist/{platform-auth-config-Z16-I8nT.mjs → platform-auth-config-CZaY812e.mjs} +3 -3
  89. package/dist/{platform-auth-protection-BXwZiJSF.mjs → platform-auth-protection-U9HCqoXv.mjs} +2 -2
  90. package/dist/{platform-auth-recovery-CXjfqyOv.mjs → platform-auth-recovery-B0BV2hfV.mjs} +2 -2
  91. package/dist/{platform-cmd-DaAOiWTl.mjs → platform-cmd-CXrjk4fb.mjs} +4 -4
  92. package/dist/{platform-cmd-PT4YwMLM.mjs → platform-cmd-D9lwFpcl.mjs} +1 -1
  93. package/dist/{platform-domain-CxpvUeo0.mjs → platform-domain-CXyq-68_.mjs} +2 -2
  94. package/dist/{platform-lifecycle-DBiS0cJd.mjs → platform-lifecycle-D0TdyXbN.mjs} +20 -11
  95. package/dist/{platform-lifecycle-u9pMOvxC.mjs → platform-lifecycle-Dz2cJsLX.mjs} +1 -1
  96. package/dist/{platform-management-DvBS83rC.mjs → platform-management-BvgbusqL.mjs} +1 -1
  97. package/dist/{platform-management-DhEFdQAf.mjs → platform-management-CnXhgxTM.mjs} +1 -3
  98. package/dist/{platform-recovery-BUGOB4RC.mjs → platform-recovery-CH_fThW6.mjs} +2 -2
  99. package/dist/{plugin-inference-DsARdQKE.mjs → plugin-inference-Bekzjuqw.mjs} +2 -2
  100. package/dist/{prepare-PQCgsny0.mjs → prepare-2XD6kh77.mjs} +1 -1
  101. package/dist/{prepare-DEB5SeVJ.mjs → prepare-DepAGBcV.mjs} +9 -9
  102. package/dist/prepare-EVEbQ9n2.mjs +1 -0
  103. package/dist/{project-cmd-DVatD8Ev.mjs → project-cmd-CpLYflCH.mjs} +16 -16
  104. package/dist/{project-paths-DMvEeSau.mjs → project-paths-DGu_QZ_Q.mjs} +1 -1
  105. package/dist/{project-team-DJrWEAG1.mjs → project-team-CTSY7W7Q.mjs} +1 -1
  106. package/dist/{project-token-CBgLBuL6.mjs → project-token-Cybtlfbl.mjs} +1 -1
  107. package/dist/{project-tsconfig-bveqhlYA.mjs → project-tsconfig-Itv1f4WC.mjs} +1 -1
  108. package/dist/{project-zero-trust-92gLtZ25.mjs → project-zero-trust-DKOtqyvu.mjs} +1 -1
  109. package/dist/{protocol-4H7V_3Os.d.mts → protocol-B8sI8dRD.d.mts} +1 -1
  110. package/dist/{providers-BXuhmuub.mjs → providers-BUHwJlmM.mjs} +10 -1
  111. package/dist/{provision-BnSSkiED.mjs → provision-BuifYvLc.mjs} +63 -64
  112. package/dist/provision-UcYjpTRh.mjs +1 -0
  113. package/dist/r2-conditions-B8xUgJRc.mjs +61 -0
  114. package/dist/{requests-7W1Pygt2.mjs → requests-Ryiazz9i.mjs} +1 -1
  115. package/dist/{rollback-BcASVnwP.mjs → rollback-Or0EV3rP.mjs} +2 -2
  116. package/dist/{runner-CabsQ-iM.mjs → runner-3uGC-oLF.mjs} +9 -7
  117. package/dist/{runner-So9mYfcm.mjs → runner-WCdfeI0q.mjs} +1 -1
  118. package/dist/{runner-mysql-BhRaONkO.mjs → runner-mysql-BWmbk5IE.mjs} +1 -1
  119. package/dist/{runner-mysql-DWwE8jKi.mjs → runner-mysql-BcHnLUuM.mjs} +1 -1
  120. package/dist/{runner-pg-_Xncr3H5.mjs → runner-pg-Cgp-cr_p.mjs} +1 -1
  121. package/dist/{runner-pg-BRemq_GX.mjs → runner-pg-Cr3qrqi4.mjs} +1 -1
  122. package/dist/runtime/ai.d.mts +4 -0
  123. package/dist/runtime/ai.mjs +2 -37
  124. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  125. package/dist/runtime/better-auth-mysql.mjs +2 -2
  126. package/dist/runtime/better-auth-pg.d.mts +1 -1
  127. package/dist/runtime/better-auth-pg.mjs +2 -2
  128. package/dist/runtime/better-auth.d.mts +1 -1
  129. package/dist/runtime/better-auth.mjs +2 -2
  130. package/dist/runtime/client-react.d.mts +2 -2
  131. package/dist/runtime/client-solid.d.mts +2 -2
  132. package/dist/runtime/client-svelte.d.mts +2 -2
  133. package/dist/runtime/client-vue.d.mts +2 -2
  134. package/dist/runtime/client.d.mts +2 -2
  135. package/dist/runtime/email/testing.d.mts +1 -1
  136. package/dist/runtime/email.d.mts +2 -3
  137. package/dist/runtime/email.mjs +2 -3
  138. package/dist/runtime/fetch-stream.d.mts +2 -2
  139. package/dist/runtime/fetch.d.mts +1 -1
  140. package/dist/runtime/migration-handler-mysql.mjs +4 -4
  141. package/dist/runtime/migration-handler-pg.mjs +9 -1
  142. package/dist/runtime/remote/binding-handler.mjs +25 -25
  143. package/dist/runtime/remote/index.d.mts +3 -0
  144. package/dist/runtime/remote/index.mjs +86 -23
  145. package/dist/runtime/routing.d.mts +2 -2
  146. package/dist/runtime/sse-client.d.mts +4 -0
  147. package/dist/runtime/ws-server.d.mts +2 -2
  148. package/dist/runtime/ws.d.mts +1 -1
  149. package/dist/{scan-C0BMdmEd.mjs → scan-D2-FcLHs.mjs} +13 -5
  150. package/dist/{secret-bg73f1Ge.mjs → secret-CClHaFxm.mjs} +3 -3
  151. package/dist/{types-BAp5AEBU.d.mts → types-7AIz0OZu.d.mts} +1 -1
  152. package/dist/{validate-CheZGRE7.mjs → validate-CnZPMq4q.mjs} +22 -17
  153. package/dist/validate-D7Wn8PUX.mjs +1 -0
  154. package/dist/{version-metadata-DIrqEHQo.mjs → version-metadata-B1Bm2wSq.mjs} +1 -1
  155. package/dist/{wrangler-BYs07Rxy.mjs → wrangler-C9XSzrju.mjs} +3 -3
  156. package/dist/wrangler-DAdxHEzh.mjs +1 -0
  157. package/dist/{wrapper-CwhpNWtH.mjs → wrapper-BOigE1xJ.mjs} +4 -4
  158. package/dist/{ws-aKVYB-fA.d.mts → ws-CsBNxv86.d.mts} +5 -0
  159. package/docs/guide/auth.md +1 -1
  160. package/docs/guide/database/d1.md +2 -2
  161. package/docs/guide/database/mysql.md +1 -1
  162. package/docs/guide/edge/headers.md +10 -2
  163. package/docs/guide/edge/revalidation.md +2 -0
  164. package/docs/guide/email/receiving.md +1 -1
  165. package/docs/guide/email/sending.md +1 -1
  166. package/docs/guide/pages-routing/islands.md +2 -2
  167. package/docs/guide/platform/administration/connected-apps.md +18 -2
  168. package/docs/guide/remote-dev.md +2 -0
  169. package/docs/guide/websockets.md +2 -2
  170. package/docs/index.md +78 -22
  171. package/docs/reference/api/pages.md +7 -5
  172. package/docs/reference/api.md +2 -0
  173. package/docs/reference/cli/database.md +7 -5
  174. package/docs/reference/cli/deploy.md +12 -10
  175. package/docs/reference/cli/email.md +1 -1
  176. package/docs/reference/cli/generate.md +1 -1
  177. package/docs/reference/cli/platform-installation.md +2 -2
  178. package/docs/reference/cli/project.md +4 -2
  179. package/docs/reference/cli.md +1 -1
  180. package/docs/reference/config.md +11 -1
  181. package/package.json +7 -7
  182. package/dist/client-B60PwCC4.mjs +0 -1
  183. package/dist/collect-Cae8A7Zr.mjs +0 -1
  184. package/dist/deploy-9lgfhrXS.mjs +0 -2
  185. package/dist/discover-ClzFSwns.mjs +0 -1
  186. package/dist/gen-sXyp5DFO.mjs +0 -1
  187. package/dist/help-i2YGGnTH.mjs +0 -1
  188. package/dist/login-XD844Xs-.mjs +0 -1
  189. package/dist/migrate-BRwU-blY.mjs +0 -1
  190. package/dist/operator-cmd-D6gnZsnK.mjs +0 -1
  191. package/dist/platform-args-B0HeTh0C.mjs +0 -1
  192. package/dist/prepare-CYT6tAzD.mjs +0 -1
  193. package/dist/r2-conditions-D1Wk8i7b.mjs +0 -30
  194. package/dist/validate-BQFdf0Pi.mjs +0 -1
@@ -1,14 +1,14 @@
1
1
  import { c as getToken, f as removeToken } from "./auth-B6iOCjKI.mjs";
2
2
  import { L as log } from "./dist-BVdsO7Py.mjs";
3
3
  import { m as printSuccess } from "./output-Ba6ZbrzY.mjs";
4
- import { r as PlatformClient } from "./client-DM9Kcf4e.mjs";
5
- import { n as runLoginCommand } from "./login-C2T1oVG-.mjs";
4
+ import { r as PlatformClient } from "./client-GuSO3v_x.mjs";
5
+ import { n as runLoginCommand } from "./login-BJvGW5Eu.mjs";
6
6
  import { execSync } from "node:child_process";
7
7
  //#region src/cli/account-cmd.ts
8
8
  async function runAccountCommand(root, args) {
9
9
  switch (args.subcommand) {
10
10
  case "login": return runLoginCommand(root);
11
- case "link": return import("./auth-link-DUJuvRx5.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
11
+ case "link": return import("./auth-link-VHmiKZmP.mjs").then(({ runAuthLink }) => runAuthLink(root, args.connectionId));
12
12
  case "logout":
13
13
  if (removeToken(root)) printSuccess("Logged out.");
14
14
  else log.info("Not logged in.");
@@ -1,15 +1,15 @@
1
1
  import { a as join, i as isAbsolute, t as basename } from "./dist-ipQi0Q8y.mjs";
2
- import { c as scanWebSocketRoutesSync, f as readResourceDefinition, h as needsApplicationDatabase, i as inferProjectBindings, n as FRAMEWORK_SCAN_DIRS, p as listConventionFiles, r as detectFramework, s as isWebSocketPatternFile } from "./plugin-inference-DsARdQKE.mjs";
3
- import { i as resolveProjectPaths, n as readProjectPaths } from "./project-paths-DMvEeSau.mjs";
4
- import { t as findVoidAuthConfig } from "./config-D0GY5ItR.mjs";
5
- import { f as resolveBindingNames, s as getDatabaseDialect } from "./config-Bx_1SpnO.mjs";
2
+ import { c as scanWebSocketRoutesSync, f as readResourceDefinition, h as needsApplicationDatabase, i as inferProjectBindings, n as FRAMEWORK_SCAN_DIRS, p as listConventionFiles, r as detectFramework, s as isWebSocketPatternFile } from "./plugin-inference-Bekzjuqw.mjs";
3
+ import { i as resolveProjectPaths, n as readProjectPaths } from "./project-paths-DGu_QZ_Q.mjs";
4
+ import { t as findVoidAuthConfig } from "./config-CyUJzi3q.mjs";
5
+ import { f as resolveBindingNames, s as getDatabaseDialect } from "./config-D26zcdKy.mjs";
6
6
  import { n as globSync } from "./dist-Bn8Kodjp.mjs";
7
7
  import { n as isIdentifier } from "./ast-CPGPjb0V.mjs";
8
8
  import { a as staticLiteral, i as staticExportInitializers, n as parseRouteFilename, o as unwrapStaticExpression, t as isRouteEnabledForEnvironment } from "./parse-filename-CUbj-1MP.mjs";
9
9
  import { n as resourceNameWords } from "./resource-name-C7LVpcRm.mjs";
10
- import { t as collectMigrations } from "./collect-xjffdCdk.mjs";
10
+ import { t as collectMigrations } from "./collect-Dew86qce.mjs";
11
11
  import { i as scanEmailHandlersSync } from "./email-BcjSyAL0.mjs";
12
- import { t as scanPages } from "./scan-C0BMdmEd.mjs";
12
+ import { t as scanPages } from "./scan-D2-FcLHs.mjs";
13
13
  import { existsSync, readFileSync, readdirSync } from "node:fs";
14
14
  import { fileURLToPath } from "node:url";
15
15
  import { parseSync } from "vite";
@@ -1,4 +1,4 @@
1
- import { l as scanRoutes, t as analyzeApplicationSync } from "./application-analysis-AB_YYWgH.mjs";
1
+ import { l as scanRoutes, t as analyzeApplicationSync } from "./application-analysis-D7nNmNJb.mjs";
2
2
  //#region src/application-routing.ts
3
3
  /** Complete route/page analysis using the same resource and handler inventories. */
4
4
  async function completeApplicationAnalysis(analysis) {
@@ -1,9 +1,9 @@
1
1
  import { a as getApiUrl, c as getToken, m as savePlatformToken, p as runPlatformLogin, u as openBrowser } from "./auth-B6iOCjKI.mjs";
2
2
  import { L as log } from "./dist-BVdsO7Py.mjs";
3
3
  import { l as formatUrl } from "./output-Ba6ZbrzY.mjs";
4
- import { r as PlatformClient } from "./client-DM9Kcf4e.mjs";
5
- import { r as selectPlatformLoginMethod } from "./login-C2T1oVG-.mjs";
6
- import { t as discoverPlatform } from "./platform-cmd-DaAOiWTl.mjs";
4
+ import { r as PlatformClient } from "./client-GuSO3v_x.mjs";
5
+ import { r as selectPlatformLoginMethod } from "./login-BJvGW5Eu.mjs";
6
+ import { t as discoverPlatform } from "./platform-cmd-CXrjk4fb.mjs";
7
7
  //#region src/cli/auth-link.ts
8
8
  async function runAuthLink(root, connectionId) {
9
9
  const token = getToken(root);
@@ -48,7 +48,7 @@ function resolveColumnType(dialect, idStrategy, fieldName, field) {
48
48
  if (useIdType) {
49
49
  if (fieldName === "id" && idStrategy === "serial") return "integer GENERATED BY DEFAULT AS IDENTITY";
50
50
  if (idStrategy === "serial") return "integer";
51
- if (idStrategy === "uuid") return "uuid";
51
+ if (idStrategy === "uuid") return fieldName === "id" ? "uuid DEFAULT gen_random_uuid()" : "uuid";
52
52
  return "text";
53
53
  }
54
54
  if (field.type === "boolean") return "boolean";
@@ -61,10 +61,18 @@ function resolveColumnType(dialect, idStrategy, fieldName, field) {
61
61
  if (field.type === "boolean" || field.type === "date" || field.type === "number") return "INTEGER";
62
62
  return "TEXT";
63
63
  }
64
+ function renderDefaultLiteral(dialect, value) {
65
+ if (typeof value === "boolean") return dialect === "sqlite" ? value ? "1" : "0" : value ? "TRUE" : "FALSE";
66
+ if (typeof value === "number") return String(value);
67
+ if (dialect === "mysql" && value.includes("\\")) return `_utf8mb4 X'${Array.from(new TextEncoder().encode(value), (byte) => byte.toString(16).padStart(2, "0")).join("")}'`;
68
+ if (dialect === "postgresql" && value.includes("\\")) return `E'${value.replaceAll("\\", "\\\\").replaceAll("'", "''")}'`;
69
+ return `'${value.replaceAll("'", "''")}'`;
70
+ }
64
71
  function buildColumnDefinition(dialect, schema, fieldName, field, options = {}) {
65
72
  const parts = [`${quoteIdentifier(fieldName, dialect)} ${resolveColumnType(dialect, schema.idStrategy, fieldName, field)}`];
66
73
  if (options.primaryKey) parts.push("PRIMARY KEY");
67
74
  if (field.required || options.primaryKey) parts.push("NOT NULL");
75
+ if (options.withDefault && field.defaultValue !== void 0) parts.push(`DEFAULT ${renderDefaultLiteral(dialect, field.defaultValue)}`);
68
76
  if (field.references) parts.push(`REFERENCES ${quoteIdentifier(field.references.table, dialect)}(${quoteIdentifier(field.references.field, dialect)}) ON DELETE ${String(field.references.onDelete ?? "cascade").toUpperCase()}`);
69
77
  return parts.join(" ");
70
78
  }
@@ -81,7 +89,7 @@ function buildCreateTableSql(schema, table) {
81
89
  }
82
90
  function buildAddColumnSql(schema, tableName, fieldName, field) {
83
91
  const ifNotExists = schema.dialect === "postgresql" ? " IF NOT EXISTS" : "";
84
- return `ALTER TABLE ${quoteIdentifier(tableName, schema.dialect)} ADD COLUMN${ifNotExists} ${buildColumnDefinition(schema.dialect, schema, fieldName, field)}`;
92
+ return `ALTER TABLE ${quoteIdentifier(tableName, schema.dialect)} ADD COLUMN${ifNotExists} ${buildColumnDefinition(schema.dialect, schema, fieldName, field, { withDefault: true })}`;
85
93
  }
86
94
  function buildModifyMySqlColumnSql(schema, tableName, fieldName, field) {
87
95
  return `ALTER TABLE ${quoteIdentifier(tableName, "mysql")} MODIFY COLUMN ${buildColumnDefinition("mysql", schema, fieldName, field)}`;
@@ -105,6 +113,31 @@ async function ensurePgIndexes(runner, schemaName, table) {
105
113
  const indexRows = await runner.all("SELECT indexname FROM pg_indexes WHERE schemaname = $1 AND tablename = $2", [schemaName, table.name]);
106
114
  await createMissingIndexes(runner, "postgresql", table, new Set(indexRows.map((row) => String(row.indexname))));
107
115
  }
116
+ /**
117
+ * Name the fields that a table with rows cannot take, and the fix, before the table changes.
118
+ * SQLite and PostgreSQL cannot add a NOT NULL column with no default to a table that has rows;
119
+ * MySQL fills those rows itself. On each dialect, a new required column gives every row the same
120
+ * value, so its unique index fails when the table has two or more rows.
121
+ */
122
+ async function assertRequiredColumnsCanBeAdded(runner, dialect, table, missing) {
123
+ const required = missing.filter((fieldName) => table.fields[fieldName].required);
124
+ const unique = required.filter((fieldName) => table.fields[fieldName].unique);
125
+ const noDefault = dialect === "mysql" ? [] : required.filter((fieldName) => table.fields[fieldName].defaultValue === void 0);
126
+ if (unique.length === 0 && noDefault.length === 0) return;
127
+ const rows = await runner.all(`SELECT 1 AS present FROM ${quoteIdentifier(table.name, dialect)} LIMIT 2`);
128
+ const describe = (fieldNames) => ({
129
+ names: fieldNames.map((fieldName) => JSON.stringify(fieldName)).join(", "),
130
+ noun: fieldNames.length === 1 ? "field" : "fields"
131
+ });
132
+ if (rows.length >= 2 && unique.length > 0) {
133
+ const { names, noun } = describe(unique);
134
+ throw new Error(`Cannot add required unique auth ${noun} ${names} to table ${JSON.stringify(table.name)}: the table has more than one row, and a new column gives every row the same value. Set \`required: false\` on the ${noun}, or add the ${unique.length === 1 ? "column" : "columns"} in a migration that gives each row its own value.`);
135
+ }
136
+ if (rows.length >= 1 && noDefault.length > 0) {
137
+ const { names, noun } = describe(noDefault);
138
+ throw new Error(`Cannot add required auth ${noun} ${names} to table ${JSON.stringify(table.name)}: the table has rows, and there is no fixed default value to fill them. Set \`required: false\` on the ${noun}. A string, number or boolean field can use a fixed \`defaultValue\` instead.`);
139
+ }
140
+ }
108
141
  async function applySqliteAuthMigrations(runner, schema) {
109
142
  const tableRows = await runner.all("SELECT name FROM sqlite_master WHERE type = 'table'");
110
143
  const existingTables = new Set(tableRows.map((row) => String(row.name)));
@@ -117,6 +150,7 @@ async function applySqliteAuthMigrations(runner, schema) {
117
150
  }
118
151
  const columnRows = await runner.all(`PRAGMA table_info(${quotePragmaArg(table.name)})`);
119
152
  const existingColumns = new Set(columnRows.map((row) => String(row.name)));
153
+ await assertRequiredColumnsCanBeAdded(runner, "sqlite", table, Object.keys(table.fields).filter((fieldName) => !existingColumns.has(fieldName)));
120
154
  for (const [fieldName, field] of Object.entries(table.fields)) {
121
155
  if (existingColumns.has(fieldName)) continue;
122
156
  await runner.run(buildAddColumnSql(schema, table.name, fieldName, field));
@@ -138,6 +172,7 @@ async function applyPgAuthMigrations(runner, schema) {
138
172
  }
139
173
  const columnRows = await runner.all("SELECT column_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2", [schemaName, table.name]);
140
174
  const existingColumns = new Set(columnRows.map((row) => String(row.column_name)));
175
+ await assertRequiredColumnsCanBeAdded(runner, "postgresql", table, Object.keys(table.fields).filter((fieldName) => !existingColumns.has(fieldName)));
141
176
  for (const [fieldName, field] of Object.entries(table.fields)) {
142
177
  if (existingColumns.has(fieldName)) continue;
143
178
  await runner.run(buildAddColumnSql(schema, table.name, fieldName, field));
@@ -157,6 +192,7 @@ async function applyMySqlAuthMigrations(runner, schema) {
157
192
  } else {
158
193
  const columnRows = await runner.all("SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type FROM information_schema.columns WHERE table_schema = ? AND table_name = ?", [databaseName, table.name]);
159
194
  const existingColumns = new Map(columnRows.map((row) => [String(row.column_name), row]));
195
+ await assertRequiredColumnsCanBeAdded(runner, "mysql", table, Object.keys(table.fields).filter((fieldName) => !existingColumns.has(fieldName)));
160
196
  for (const [fieldName, field] of Object.entries(table.fields)) {
161
197
  const existingColumn = existingColumns.get(fieldName);
162
198
  if (!existingColumn) await runner.run(buildAddColumnSql(schema, table.name, fieldName, field));
@@ -22,7 +22,8 @@ async function chooseDestination(root, args, interactive) {
22
22
  ...connections.length === 0 ? [{
23
23
  value: "void",
24
24
  label: "Void platform",
25
- hint: "Use the current Void account origin"
25
+ hint: "Run `void connect <url>` first",
26
+ disabled: true
26
27
  }] : []
27
28
  ];
28
29
  const selected = await select({
@@ -32,17 +33,17 @@ async function chooseDestination(root, args, interactive) {
32
33
  if (isCancel(selected) || typeof selected !== "string") throw new Error("auth: Cancelled.");
33
34
  return selected === "cloudflare" ? { platform: "cloudflare" } : {
34
35
  platform: "void",
35
- ...selected === "void" ? {} : { apiUrl: selected }
36
+ apiUrl: selected
36
37
  };
37
38
  }
38
39
  async function runAuthRouter(root, args, interactive = Boolean(process.stdin.isTTY)) {
39
40
  const destination = await chooseDestination(root, args, interactive);
40
41
  if (destination.platform === "cloudflare") {
41
- const { runCloudflareCommand } = await import("./cloudflare-cmd-BIAF_BIY.mjs");
42
+ const { runCloudflareCommand } = await import("./cloudflare-cmd-ZSErUl6Y.mjs");
42
43
  await runCloudflareCommand(root, { subcommand: args.subcommand });
43
44
  return;
44
45
  }
45
- const { runAccountCommand } = await import("./account-cmd-BTcUzv9L.mjs");
46
+ const { runAccountCommand } = await import("./account-cmd-R35a4Oa8.mjs");
46
47
  const subcommand = args.subcommand === "status" ? "whoami" : args.subcommand;
47
48
  if (!destination.apiUrl) {
48
49
  await runAccountCommand(root, { subcommand });
@@ -12,6 +12,8 @@ type VoidAuthMigrationField = {
12
12
  index: boolean;
13
13
  bigint: boolean;
14
14
  unbounded?: boolean;
15
+ /** A fixed default of a required field. Adding the column fills rows that exist with it. */
16
+ defaultValue?: string | number | boolean;
15
17
  references?: {
16
18
  table: string;
17
19
  field: string;
@@ -1,4 +1,4 @@
1
- import { a as isVoidSocialAuthProvider, r as getVoidAuthProviderEnvNames } from "./providers-BXuhmuub.mjs";
1
+ import { i as getVoidAuthProviderSettingEnvNames, o as isVoidSocialAuthProvider, r as getVoidAuthProviderEnvNames } from "./providers-BUHwJlmM.mjs";
2
2
  import { t as authContext } from "./auth-3sGB0zJ1.mjs";
3
3
  import { randomBytes, scrypt, timingSafeEqual } from "node:crypto";
4
4
  import { betterAuth } from "better-auth";
@@ -64,11 +64,37 @@ function resolveSocialProviderCredentials(env, provider) {
64
64
  const clientId = readEnvString(env, envNames.clientId);
65
65
  const clientSecret = readEnvString(env, envNames.clientSecret);
66
66
  if (!clientId || !clientSecret) throw new Error(`auth: Missing credentials for provider '${provider}'. Set ${envNames.clientId} and ${envNames.clientSecret}, or remove '${provider}' from auth.providers.`);
67
+ const settings = {};
68
+ for (const [option, envName] of Object.entries(getVoidAuthProviderSettingEnvNames(provider))) {
69
+ const value = readEnvString(env, envName);
70
+ if (value) settings[option] = value;
71
+ }
67
72
  return {
73
+ ...settings,
68
74
  clientId,
69
75
  clientSecret
70
76
  };
71
77
  }
78
+ /** Fail early when a configured provider still lacks a required setting after auth.ts runs. */
79
+ function assertSocialProviderSettings(options, configuredProviders) {
80
+ const socialProviders = options.socialProviders;
81
+ for (const provider of configuredProviders ?? []) {
82
+ if (!isVoidSocialAuthProvider(provider)) continue;
83
+ const config = socialProviders?.[provider];
84
+ if (typeof config !== "object" || config === null) continue;
85
+ const values = config;
86
+ if (values.enabled === false) continue;
87
+ const missing = Object.entries(getVoidAuthProviderSettingEnvNames(provider)).filter(([option]) => !values[option]);
88
+ if (missing.length > 0) {
89
+ const options = joinNames(missing.map(([option]) => option));
90
+ throw new Error(`auth: Missing ${options} for the ${provider} provider. Set ${joinNames(missing.map(([, envName]) => envName))}, or set ${options} in auth.ts.`);
91
+ }
92
+ }
93
+ }
94
+ /** `a`, `a and b`, `a, b and c`. */
95
+ function joinNames(names) {
96
+ return names.length > 1 ? `${names.slice(0, -1).join(", ")} and ${names.at(-1)}` : names[0];
97
+ }
72
98
  function resolveSocialProviders(env, configuredProviders) {
73
99
  if (!configuredProviders) return;
74
100
  const providers = {};
@@ -215,6 +241,7 @@ function createVoidAuthRuntime(dialect, applyMigrations) {
215
241
  trustedOrigins: [origin]
216
242
  };
217
243
  const resolved = resolveUserConfig(runtime.userConfig, defaults, request, env, dialect);
244
+ assertSocialProviderSettings(resolved, runtime.providers);
218
245
  return runtime.dev !== true && cloudflareClientIp(request) ? applyCloudflareRateLimitDefaults(resolved) : resolved;
219
246
  }
220
247
  async function createVoidAuth(request, env, runtime, database) {
@@ -2,7 +2,7 @@ import { r as readProjectConfig } from "./project-rqDnVsJN.mjs";
2
2
  import { c as getToken } from "./auth-B6iOCjKI.mjs";
3
3
  import { H as outro, L as log } from "./dist-BVdsO7Py.mjs";
4
4
  import { f as import_picocolors, i as dim, m as printSuccess } from "./output-Ba6ZbrzY.mjs";
5
- import { n as PlatformApiError, r as PlatformClient } from "./client-DM9Kcf4e.mjs";
5
+ import { n as PlatformApiError, r as PlatformClient } from "./client-GuSO3v_x.mjs";
6
6
  import { a as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-WpwkCB_c.mjs";
7
7
  import { appendFileSync, writeFileSync } from "node:fs";
8
8
  //#region src/cli/build-cmd.ts
@@ -2,7 +2,7 @@ import { r as readProjectConfig } from "./project-rqDnVsJN.mjs";
2
2
  import { c as getToken } from "./auth-B6iOCjKI.mjs";
3
3
  import { L as log } from "./dist-BVdsO7Py.mjs";
4
4
  import { m as printSuccess, o as formatCount, r as createSpinner } from "./output-Ba6ZbrzY.mjs";
5
- import { r as PlatformClient } from "./client-DM9Kcf4e.mjs";
5
+ import { r as PlatformClient } from "./client-GuSO3v_x.mjs";
6
6
  import { a as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-WpwkCB_c.mjs";
7
7
  //#region src/cli/cache.ts
8
8
  async function runPurgeCacheCommand(root, projectSlug) {
@@ -2,7 +2,7 @@ import { r as readProjectConfig } from "./project-rqDnVsJN.mjs";
2
2
  import { c as getToken } from "./auth-B6iOCjKI.mjs";
3
3
  import { A as confirm, H as outro, L as log, tt as isCancel } from "./dist-BVdsO7Py.mjs";
4
4
  import { m as printSuccess } from "./output-Ba6ZbrzY.mjs";
5
- import { r as PlatformClient } from "./client-DM9Kcf4e.mjs";
5
+ import { r as PlatformClient } from "./client-GuSO3v_x.mjs";
6
6
  //#region src/cli/cancel-deploy.ts
7
7
  const ACTIVE_STATUSES = /* @__PURE__ */ new Set([
8
8
  "pending",
package/dist/cli/cli.mjs CHANGED
@@ -3,9 +3,10 @@ import { L as log } from "../dist-BVdsO7Py.mjs";
3
3
  import { f as import_picocolors, l as formatUrl } from "../output-Ba6ZbrzY.mjs";
4
4
  import { t as formatCloudflareUserMessage } from "../cloudflare-user-output-Q-k0QoNQ.mjs";
5
5
  import { n as getOwnVersion } from "../agents-CuNtT0D_.mjs";
6
- import { i as printVoidHeader, n as printGlobalHelp, r as printHelpPage, t as getHelpPath } from "../help-BT2hovNI.mjs";
6
+ import { i as printVoidHeader, n as printGlobalHelp, r as printHelpPage, t as getHelpPath } from "../help-D49SL_lN.mjs";
7
7
  import { r as OperatorClientError } from "../operator-client-C-ROjk1I.mjs";
8
- import { n as platformSubcommands, t as parsePlatformArgs } from "../platform-args-CaCL_1Ch.mjs";
8
+ import { n as operatorGroups } from "../operator-args-UnE8Y2eK.mjs";
9
+ import { n as platformSubcommands, t as parsePlatformArgs } from "../platform-args-B7ke06up.mjs";
9
10
  import { parseArgs } from "node:util";
10
11
  //#region src/cli/account-args.ts
11
12
  const accountSubcommands = [
@@ -245,7 +246,7 @@ function parseConnectArgs(args) {
245
246
  const dbSubcommands = [
246
247
  {
247
248
  name: "push",
248
- description: "Push schema to local D1 (no migration files)"
249
+ description: "Push schema to the development database (no migration files)"
249
250
  },
250
251
  {
251
252
  name: "generate",
@@ -287,7 +288,7 @@ const dbSubcommands = [
287
288
  },
288
289
  {
289
290
  name: "studio",
290
- description: "Open Drizzle Studio against the database (use --remote for the deployed PostgreSQL database)",
291
+ description: "Open Drizzle Studio against the database (use --remote for the deployed PostgreSQL or MySQL database)",
291
292
  flags: [{
292
293
  name: "--remote",
293
294
  description: "Open Studio against the deployed database"
@@ -366,6 +367,30 @@ const MAX_POSITIONALS = {
366
367
  "rename-migrations": 0,
367
368
  export: 0
368
369
  };
370
+ const ACTION_FLAGS = {
371
+ push: [],
372
+ generate: [],
373
+ status: [],
374
+ reset: ["yes"],
375
+ seed: ["file", "yes"],
376
+ execute: ["file", "remote"],
377
+ migrate: ["remote"],
378
+ studio: ["remote"],
379
+ "set-url": [],
380
+ connect: [
381
+ "provider",
382
+ "name",
383
+ "region",
384
+ "local-only"
385
+ ],
386
+ "rename-migrations": [],
387
+ export: [
388
+ "output",
389
+ "no-data",
390
+ "no-schema",
391
+ "table"
392
+ ]
393
+ };
369
394
  function isDbAction(value) {
370
395
  return value !== void 0 && Object.hasOwn(MAX_POSITIONALS, value);
371
396
  }
@@ -390,7 +415,9 @@ function parseDbArgs(args) {
390
415
  });
391
416
  const [action, ...rest] = positionals;
392
417
  if (!isDbAction(action)) throw new Error("db: Usage: void db <push|generate|status|reset|seed|execute|migrate|studio|export|connect|set-url|rename-migrations>.");
393
- if (action === "export" && values.remote) throw new Error("`void db export --remote` is not yet supported. Local export only for now.");
418
+ if (action === "export" && values.remote) throw new Error("db: `void db export` reads only the local database; --remote is not supported.");
419
+ const unsupported = Object.keys(values).find((flag) => !ACTION_FLAGS[action].includes(flag));
420
+ if (unsupported) throw new Error(`db: \`void db ${action}\` does not support --${unsupported}.`);
394
421
  const maxPositionals = MAX_POSITIONALS[action];
395
422
  if (rest.length > maxPositionals) throw new Error(`db: Unexpected argument '${rest[maxPositionals]}'.`);
396
423
  switch (action) {
@@ -525,7 +552,7 @@ const emailSubcommands = [
525
552
  },
526
553
  {
527
554
  name: "status",
528
- description: "Show the email setup state and address map",
555
+ description: "Show the email setup state on your own Cloudflare account (--platform cloudflare)",
529
556
  flags: [PLATFORM_FLAG]
530
557
  },
531
558
  {
@@ -544,7 +571,6 @@ const EMAIL_SUBCOMMANDS = [
544
571
  "status",
545
572
  "setup"
546
573
  ];
547
- const SUBDOMAIN_ADD_ONLY = "email: --subdomain applies to `void email domain add` only.";
548
574
  const EMAIL_DOMAIN_VERBS = [
549
575
  "add",
550
576
  "status",
@@ -581,7 +607,6 @@ function parseEmailArgs(args) {
581
607
  let limit;
582
608
  const projectValues = [];
583
609
  const platformValues = [];
584
- const subdomainValues = [];
585
610
  const positional = [];
586
611
  const rest = args.slice(1);
587
612
  for (let i = 0; i < rest.length; i++) if (rest[i] === "--project" || rest[i]?.startsWith("--project=")) {
@@ -602,12 +627,8 @@ function parseEmailArgs(args) {
602
627
  platformValues.push(value);
603
628
  i = next;
604
629
  } else if (rest[i] === "--backend" || rest[i]?.startsWith("--backend=")) throw new Error("email: Unknown option '--backend'.");
605
- else if (rest[i] === "--subdomain" || rest[i]?.startsWith("--subdomain=")) {
606
- const { value, next } = readFlagValue(rest, i, "--subdomain");
607
- if (value === void 0 || value.trim() === "") throw new Error("email: --subdomain requires a value (a subdomain label or host).");
608
- subdomainValues.push(value);
609
- i = next;
610
- } else positional.push(rest[i]);
630
+ else if (rest[i] === "--subdomain" || rest[i]?.startsWith("--subdomain=")) throw new Error("email: Unknown option '--subdomain'.");
631
+ else positional.push(rest[i]);
611
632
  if (projectValues.length > 1) throw new Error("email: --project can only be specified once.");
612
633
  const projectSlug = projectValues[0];
613
634
  if (platformValues.length > 1) throw new Error("email: --platform can only be specified once.");
@@ -617,18 +638,14 @@ function parseEmailArgs(args) {
617
638
  if (platformValue !== "cloudflare" && platformValue !== "void") throw new Error("email: --platform must be 'cloudflare' or 'void'.");
618
639
  platform = platformValue;
619
640
  }
620
- if (subdomainValues.length > 1) throw new Error("email: --subdomain can only be specified once.");
621
- const subdomain = subdomainValues[0];
622
641
  if (subcommand === "domain") {
623
642
  if (platform === "cloudflare") throw new Error("email: --platform cloudflare applies to `void email status` and `void email setup` only (`domain` is a Void platform command).");
624
643
  return parseEmailDomainArgs(positional, {
625
644
  projectSlug,
626
645
  limit,
627
- platform,
628
- subdomain
646
+ platform
629
647
  });
630
648
  }
631
- if (subdomain !== void 0) throw new Error(SUBDOMAIN_ADD_ONLY);
632
649
  if (positional.length > 1) throw new Error(`email: \`void email ${subcommand}\` takes exactly one positional argument (got ${positional.length}: ${positional.map((p) => JSON.stringify(p)).join(", ")}).`);
633
650
  const address = positional[0];
634
651
  if ((subcommand === "allow" || subcommand === "disallow") && !address) throw new Error(`email: Usage: void email ${subcommand} <address> [--project <name>].`);
@@ -652,7 +669,6 @@ function parseEmailArgs(args) {
652
669
  function parseEmailDomainArgs(positional, flags) {
653
670
  const verb = positional[0];
654
671
  if (!verb || !EMAIL_DOMAIN_VERBS.includes(verb)) throw new Error("email: Usage: void email domain <add|status|list|sync|rotate-secret|remove> [<domain>] [--project <name>].");
655
- if (flags.subdomain !== void 0 && verb !== "add") throw new Error(SUBDOMAIN_ADD_ONLY);
656
672
  const domain = positional[1];
657
673
  if (verb === "list") {
658
674
  if (domain !== void 0) throw new Error("email: `void email domain list` takes no domain argument.");
@@ -662,7 +678,6 @@ function parseEmailDomainArgs(positional, flags) {
662
678
  subcommand: "domain",
663
679
  domainVerb: verb,
664
680
  domain,
665
- subdomain: flags.subdomain,
666
681
  projectSlug: flags.projectSlug,
667
682
  limit: flags.limit,
668
683
  platform: flags.platform
@@ -708,7 +723,7 @@ const genSubcommands = [
708
723
  {
709
724
  name: "model",
710
725
  arg: "<name>",
711
- description: "Generate migration + CRUD routes + db types",
726
+ description: "Scaffold a Drizzle table, API routes, and DB types",
712
727
  followUp: {
713
728
  type: "repeat-input",
714
729
  placeholder: "name:type or name:type?"
@@ -1138,7 +1153,7 @@ const projectSubcommands = [
1138
1153
  },
1139
1154
  {
1140
1155
  name: "purge-cache",
1141
- description: "Purge all cached pages"
1156
+ description: "Purge all cached pages (Void platform)"
1142
1157
  }
1143
1158
  ];
1144
1159
  function parseProjectArgs(args) {
@@ -1513,19 +1528,19 @@ const args = process.argv.slice(2);
1513
1528
  const command = args[0];
1514
1529
  const helpPath = getHelpPath(args);
1515
1530
  const subcommandGroups = {
1516
- auth: () => runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-router-CIxiMG7i.mjs").then(({ runAuthRouter }) => runAuthRouter(root, parsed))),
1517
- account: () => runSubcommandGroup("account", accountSubcommands, parseAccountArgs, (root, parsed) => import("../account-cmd-BTcUzv9L.mjs").then(({ runAccountCommand }) => runAccountCommand(root, parsed))),
1518
- platform: () => runSubcommandGroup("platform", platformSubcommands, parsePlatformArgs, (root, parsed) => import("../platform-cmd-PT4YwMLM.mjs").then(({ runPlatformCommand }) => runPlatformCommand(root, parsed))),
1519
- cloudflare: () => runSubcommandGroup("cloudflare", cloudflareSubcommands, parseCloudflareArgs, (root, parsed) => import("../cloudflare-cmd-BIAF_BIY.mjs").then(({ runCloudflareCommand }) => runCloudflareCommand(root, parsed))),
1520
- project: () => runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-DVatD8Ev.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed))),
1521
- secret: () => runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-bg73f1Ge.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed))),
1522
- domain: () => runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-CZGxPv9u.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed))),
1523
- email: () => runSubcommandGroup("email", emailSubcommands, parseEmailArgs, (root, parsed) => import("../email-DzyNVuoU.mjs").then(({ runEmailCommand }) => runEmailCommand(root, parsed))),
1524
- db: () => runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-7I_gfdVq.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed))),
1525
- env: () => runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-Nx3yf50r.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed))),
1526
- gen: () => runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-sXyp5DFO.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed))),
1527
- github: () => runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (root, parsed) => import("../github-cmd-FU8EjFyU.mjs").then(({ runGithubCommand }) => runGithubCommand(root, parsed))),
1528
- build: () => runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (root, parsed) => import("../build-cmd-BkIv25PA.mjs").then(({ runBuildCommand }) => runBuildCommand(root, parsed)))
1531
+ auth: () => runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-router-O_Wrs5kg.mjs").then(({ runAuthRouter }) => runAuthRouter(root, parsed))),
1532
+ account: () => runSubcommandGroup("account", accountSubcommands, parseAccountArgs, (root, parsed) => import("../account-cmd-R35a4Oa8.mjs").then(({ runAccountCommand }) => runAccountCommand(root, parsed))),
1533
+ platform: () => runSubcommandGroup("platform", platformSubcommands, parsePlatformArgs, (root, parsed) => import("../platform-cmd-D9lwFpcl.mjs").then(({ runPlatformCommand }) => runPlatformCommand(root, parsed))),
1534
+ cloudflare: () => runSubcommandGroup("cloudflare", cloudflareSubcommands, parseCloudflareArgs, (root, parsed) => import("../cloudflare-cmd-ZSErUl6Y.mjs").then(({ runCloudflareCommand }) => runCloudflareCommand(root, parsed))),
1535
+ project: () => runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-CpLYflCH.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed))),
1536
+ secret: () => runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-CClHaFxm.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed))),
1537
+ domain: () => runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-DKlNI0SR.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed))),
1538
+ email: () => runSubcommandGroup("email", emailSubcommands, parseEmailArgs, (root, parsed) => import("../email-C0s3OvJk.mjs").then(({ runEmailCommand }) => runEmailCommand(root, parsed))),
1539
+ db: () => runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-COI-yTJE.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed))),
1540
+ env: () => runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-BX2JFsgF.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed))),
1541
+ gen: () => runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-DsCukhuw.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed))),
1542
+ github: () => runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (root, parsed) => import("../github-cmd-DQDryS-5.mjs").then(({ runGithubCommand }) => runGithubCommand(root, parsed))),
1543
+ build: () => runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (root, parsed) => import("../build-cmd-CMZiMn46.mjs").then(({ runBuildCommand }) => runBuildCommand(root, parsed)))
1529
1544
  };
1530
1545
  if (helpPath) {
1531
1546
  if (helpPath.length === 0) printGlobalHelp();
@@ -1544,7 +1559,7 @@ if (helpPath) {
1544
1559
  log.error(formatCloudflareUserMessage(err instanceof Error ? err.message : String(err)));
1545
1560
  process.exit(1);
1546
1561
  }
1547
- import("../deploy-9lgfhrXS.mjs").then(({ runDeploy }) => {
1562
+ import("../deploy-CxNgEYr4.mjs").then(({ runDeploy }) => {
1548
1563
  runDeploy(root, deployArgs).catch((err) => {
1549
1564
  log.error(formatCloudflareUserMessage(err.message ?? String(err)));
1550
1565
  process.exit(1);
@@ -1552,14 +1567,14 @@ if (helpPath) {
1552
1567
  });
1553
1568
  } else if (command === "connect") (async () => {
1554
1569
  const parsed = parseConnectArgs(args.slice(1));
1555
- const { runConnectCommand } = await import("../connect-CKtk-EZe.mjs");
1570
+ const { runConnectCommand } = await import("../connect-yQuLbuiJ.mjs");
1556
1571
  await runConnectCommand(process.cwd(), parsed);
1557
1572
  })().catch((err) => {
1558
1573
  log.error(formatCloudflareUserMessage(err instanceof Error ? err.message : String(err)));
1559
1574
  process.exit(1);
1560
1575
  });
1561
1576
  else if (command && Object.hasOwn(subcommandGroups, command)) subcommandGroups[command]();
1562
- else if (command === "info") import("../info-l249eUdH.mjs").then(async ({ runInfoCommand }) => {
1577
+ else if (command === "info") import("../info-Bxunp14X.mjs").then(async ({ runInfoCommand }) => {
1563
1578
  try {
1564
1579
  await runInfoCommand(process.cwd(), parseInfoArgs(args.slice(1)));
1565
1580
  } catch (err) {
@@ -1580,7 +1595,7 @@ else if (command === "prepare") {
1580
1595
  log.error(formatCloudflareUserMessage(err instanceof Error ? err.message : String(err)));
1581
1596
  process.exit(1);
1582
1597
  }
1583
- import("../prepare-PQCgsny0.mjs").then(({ runPrepareCommand }) => {
1598
+ import("../prepare-2XD6kh77.mjs").then(({ runPrepareCommand }) => {
1584
1599
  runPrepareCommand(root).catch((err) => {
1585
1600
  log.error(formatCloudflareUserMessage(err.message ?? String(err)));
1586
1601
  process.exit(1);
@@ -1588,7 +1603,7 @@ else if (command === "prepare") {
1588
1603
  });
1589
1604
  } else if (command === "init") {
1590
1605
  const root = process.cwd();
1591
- import("../init-D0A6M64Q.mjs").then(({ runInitCommand, parseInitArgs }) => {
1606
+ import("../init-DyTEY04s.mjs").then(({ runInitCommand, parseInitArgs }) => {
1592
1607
  let initArgs;
1593
1608
  try {
1594
1609
  initArgs = parseInitArgs(args.slice(1));
@@ -1606,7 +1621,7 @@ else if (command === "prepare") {
1606
1621
  log.error("migrate: This command takes no arguments.");
1607
1622
  process.exit(1);
1608
1623
  }
1609
- import("../migrate-BRwU-blY.mjs").then(({ runMigrateCommand }) => {
1624
+ import("../migrate-D2odrAmh.mjs").then(({ runMigrateCommand }) => {
1610
1625
  runMigrateCommand(process.cwd()).catch((err) => {
1611
1626
  log.error(formatCloudflareUserMessage(err instanceof Error ? err.message : String(err)));
1612
1627
  process.exit(1);
@@ -1652,7 +1667,11 @@ else if (command) {
1652
1667
  },
1653
1668
  {
1654
1669
  name: "platform",
1655
- hint: "config | auth | user | project | deployment | signup | email | zero-trust | system | install",
1670
+ hint: [
1671
+ "config",
1672
+ ...operatorGroups,
1673
+ "install"
1674
+ ].join(" | "),
1656
1675
  description: "Install platforms and administer plans, users, projects, access, and operations"
1657
1676
  },
1658
1677
  {
@@ -1692,7 +1711,7 @@ else if (command) {
1692
1711
  },
1693
1712
  {
1694
1713
  name: "db",
1695
- hint: "connect | status | reset | seed | execute | migrate | studio | export",
1714
+ hint: dbSubcommands.map(({ name }) => name).join(" | "),
1696
1715
  description: "Database migrations and management"
1697
1716
  },
1698
1717
  {
@@ -1724,32 +1743,32 @@ else if (command) {
1724
1743
  if (Object.hasOwn(subcommandGroups, cmd)) return subcommandGroups[cmd]();
1725
1744
  switch (cmd) {
1726
1745
  case "connect": {
1727
- const { runConnectCommand } = await import("../connect-CKtk-EZe.mjs");
1746
+ const { runConnectCommand } = await import("../connect-yQuLbuiJ.mjs");
1728
1747
  await runConnectCommand(root, parseConnectArgs([]));
1729
1748
  return;
1730
1749
  }
1731
1750
  case "init": {
1732
- const { runInitCommand, parseInitArgs } = await import("../init-D0A6M64Q.mjs");
1751
+ const { runInitCommand, parseInitArgs } = await import("../init-DyTEY04s.mjs");
1733
1752
  await runInitCommand(root, parseInitArgs([]));
1734
1753
  return;
1735
1754
  }
1736
1755
  case "migrate": {
1737
- const { runMigrateCommand } = await import("../migrate-BRwU-blY.mjs");
1756
+ const { runMigrateCommand } = await import("../migrate-D2odrAmh.mjs");
1738
1757
  await runMigrateCommand(root);
1739
1758
  return;
1740
1759
  }
1741
1760
  case "deploy": {
1742
- const { runDeploy } = await import("../deploy-9lgfhrXS.mjs");
1761
+ const { runDeploy } = await import("../deploy-CxNgEYr4.mjs");
1743
1762
  await runDeploy(root);
1744
1763
  return;
1745
1764
  }
1746
1765
  case "info": {
1747
- const { runInfoCommand } = await import("../info-l249eUdH.mjs");
1766
+ const { runInfoCommand } = await import("../info-Bxunp14X.mjs");
1748
1767
  await runInfoCommand(root, parseInfoArgs([]));
1749
1768
  return;
1750
1769
  }
1751
1770
  case "prepare": {
1752
- const { runPrepareCommand } = await import("../prepare-PQCgsny0.mjs");
1771
+ const { runPrepareCommand } = await import("../prepare-2XD6kh77.mjs");
1753
1772
  await runPrepareCommand(root);
1754
1773
  return;
1755
1774
  }
@@ -1,4 +1,4 @@
1
- import { t as findEnvFile } from "../env-types-DS2_y4X8.mjs";
1
+ import { t as findEnvFile } from "../env-types-GRchm5dw.mjs";
2
2
  import { writeSync } from "node:fs";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { spawnSync } from "node:child_process";
@@ -109,7 +109,7 @@ function emitResult(result) {
109
109
  writeSync(RESULT_FD, JSON.stringify(result));
110
110
  }
111
111
  async function runFactsChild(root) {
112
- const { deriveSelfHostSchemaFacts, SelfHostSchemaError } = await import("../env-validation-BT7z-qpQ.mjs");
112
+ const { deriveSelfHostSchemaFacts, SelfHostSchemaError } = await import("../env-validation-CuGfWRJd.mjs");
113
113
  try {
114
114
  emitResult({
115
115
  kind: "ok",
@@ -128,7 +128,7 @@ async function runFactsChild(root) {
128
128
  }
129
129
  /** The parent already found the emitted config, so a read failure here fails closed. */
130
130
  async function runValidateEmittedChild(root) {
131
- const { computeInvalidEmittedKeys, readEmittedWorkerVars, SelfHostSchemaError } = await import("../env-validation-BT7z-qpQ.mjs");
131
+ const { computeInvalidEmittedKeys, readEmittedWorkerVars, SelfHostSchemaError } = await import("../env-validation-CuGfWRJd.mjs");
132
132
  const emitted = readEmittedWorkerVars(root);
133
133
  if (!emitted.ok) {
134
134
  emitResult({
@@ -0,0 +1 @@
1
+ export { r as PlatformClient } from "./client-GuSO3v_x.mjs";
@@ -95,7 +95,7 @@ function readCliVersion() {
95
95
  }
96
96
  const VOID_CLI_VERSION = readCliVersion();
97
97
  /** The oldest Void platform release this CLI supports. */
98
- const MIN_PLATFORM_VERSION = "0.28.0";
98
+ const MIN_PLATFORM_VERSION = "1.1.11";
99
99
  const RELEASE_VERSION = /^(\d+)\.(\d+)\.(\d+)(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/;
100
100
  /**
101
101
  * Version checks keyed by platform base URL. Every outcome (pass, inconclusive,