@supatype/cli 0.1.0-alpha.9 → 0.1.1

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 (407) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/.turbo/turbo-test.log +285 -69
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -1
  6. package/dist/app/framework.js +1 -3
  7. package/dist/app/framework.js.map +1 -1
  8. package/dist/app/proxy-dev-app.d.ts +14 -0
  9. package/dist/app/proxy-dev-app.d.ts.map +1 -1
  10. package/dist/app/proxy-dev-app.js +110 -6
  11. package/dist/app/proxy-dev-app.js.map +1 -1
  12. package/dist/app-config.d.ts +10 -0
  13. package/dist/app-config.d.ts.map +1 -1
  14. package/dist/app-config.js +72 -0
  15. package/dist/app-config.js.map +1 -1
  16. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  17. package/dist/binary-cache.d.ts +19 -7
  18. package/dist/binary-cache.d.ts.map +1 -1
  19. package/dist/binary-cache.js +92 -46
  20. package/dist/binary-cache.js.map +1 -1
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +17 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/add.d.ts +3 -0
  26. package/dist/commands/add.d.ts.map +1 -0
  27. package/dist/commands/add.js +86 -0
  28. package/dist/commands/add.js.map +1 -0
  29. package/dist/commands/admin.d.ts +28 -1
  30. package/dist/commands/admin.d.ts.map +1 -1
  31. package/dist/commands/admin.js +297 -149
  32. package/dist/commands/admin.js.map +1 -1
  33. package/dist/commands/adopt.d.ts +3 -0
  34. package/dist/commands/adopt.d.ts.map +1 -0
  35. package/dist/commands/adopt.js +55 -0
  36. package/dist/commands/adopt.js.map +1 -0
  37. package/dist/commands/app.d.ts.map +1 -1
  38. package/dist/commands/app.js +20 -17
  39. package/dist/commands/app.js.map +1 -1
  40. package/dist/commands/cache.d.ts.map +1 -1
  41. package/dist/commands/cache.js +11 -10
  42. package/dist/commands/cache.js.map +1 -1
  43. package/dist/commands/cloud.d.ts +4 -9
  44. package/dist/commands/cloud.d.ts.map +1 -1
  45. package/dist/commands/cloud.js +75 -125
  46. package/dist/commands/cloud.js.map +1 -1
  47. package/dist/commands/db.d.ts.map +1 -1
  48. package/dist/commands/db.js +37 -58
  49. package/dist/commands/db.js.map +1 -1
  50. package/dist/commands/deploy.d.ts.map +1 -1
  51. package/dist/commands/deploy.js +140 -96
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.d.ts.map +1 -1
  54. package/dist/commands/dev.js +74 -39
  55. package/dist/commands/dev.js.map +1 -1
  56. package/dist/commands/diff.d.ts.map +1 -1
  57. package/dist/commands/diff.js +39 -39
  58. package/dist/commands/diff.js.map +1 -1
  59. package/dist/commands/doctor.d.ts +3 -0
  60. package/dist/commands/doctor.d.ts.map +1 -0
  61. package/dist/commands/doctor.js +78 -0
  62. package/dist/commands/doctor.js.map +1 -0
  63. package/dist/commands/engine.d.ts.map +1 -1
  64. package/dist/commands/engine.js +5 -4
  65. package/dist/commands/engine.js.map +1 -1
  66. package/dist/commands/functions.d.ts.map +1 -1
  67. package/dist/commands/functions.js +172 -119
  68. package/dist/commands/functions.js.map +1 -1
  69. package/dist/commands/generate.d.ts.map +1 -1
  70. package/dist/commands/generate.js +5 -4
  71. package/dist/commands/generate.js.map +1 -1
  72. package/dist/commands/init.d.ts +35 -1
  73. package/dist/commands/init.d.ts.map +1 -1
  74. package/dist/commands/init.js +883 -107
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/introspect.d.ts +3 -0
  77. package/dist/commands/introspect.d.ts.map +1 -0
  78. package/dist/commands/introspect.js +35 -0
  79. package/dist/commands/introspect.js.map +1 -0
  80. package/dist/commands/keys.d.ts +15 -1
  81. package/dist/commands/keys.d.ts.map +1 -1
  82. package/dist/commands/keys.js +46 -10
  83. package/dist/commands/keys.js.map +1 -1
  84. package/dist/commands/link-helpers.d.ts +15 -0
  85. package/dist/commands/link-helpers.d.ts.map +1 -0
  86. package/dist/commands/link-helpers.js +225 -0
  87. package/dist/commands/link-helpers.js.map +1 -0
  88. package/dist/commands/logs.d.ts.map +1 -1
  89. package/dist/commands/logs.js +5 -4
  90. package/dist/commands/logs.js.map +1 -1
  91. package/dist/commands/migrate-from-v1.d.ts.map +1 -1
  92. package/dist/commands/migrate-from-v1.js +3 -2
  93. package/dist/commands/migrate-from-v1.js.map +1 -1
  94. package/dist/commands/migrate.d.ts.map +1 -1
  95. package/dist/commands/migrate.js +119 -26
  96. package/dist/commands/migrate.js.map +1 -1
  97. package/dist/commands/pg.d.ts.map +1 -1
  98. package/dist/commands/pg.js +11 -12
  99. package/dist/commands/pg.js.map +1 -1
  100. package/dist/commands/plugins.d.ts.map +1 -1
  101. package/dist/commands/plugins.js +55 -46
  102. package/dist/commands/plugins.js.map +1 -1
  103. package/dist/commands/pull.d.ts.map +1 -1
  104. package/dist/commands/pull.js +33 -5
  105. package/dist/commands/pull.js.map +1 -1
  106. package/dist/commands/push.d.ts.map +1 -1
  107. package/dist/commands/push.js +111 -138
  108. package/dist/commands/push.js.map +1 -1
  109. package/dist/commands/seed.d.ts.map +1 -1
  110. package/dist/commands/seed.js +4 -3
  111. package/dist/commands/seed.js.map +1 -1
  112. package/dist/commands/self-host.d.ts +2 -2
  113. package/dist/commands/self-host.d.ts.map +1 -1
  114. package/dist/commands/self-host.js +65 -50
  115. package/dist/commands/self-host.js.map +1 -1
  116. package/dist/commands/self-update.d.ts.map +1 -1
  117. package/dist/commands/self-update.js +3 -2
  118. package/dist/commands/self-update.js.map +1 -1
  119. package/dist/commands/status.d.ts +1 -1
  120. package/dist/commands/status.d.ts.map +1 -1
  121. package/dist/commands/status.js +95 -29
  122. package/dist/commands/status.js.map +1 -1
  123. package/dist/commands/types.d.ts.map +1 -1
  124. package/dist/commands/types.js +3 -2
  125. package/dist/commands/types.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +54 -21
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/compose-rename.d.ts +10 -0
  130. package/dist/compose-rename.d.ts.map +1 -0
  131. package/dist/compose-rename.js +67 -0
  132. package/dist/compose-rename.js.map +1 -0
  133. package/dist/config.d.ts +2 -1
  134. package/dist/config.d.ts.map +1 -1
  135. package/dist/config.js.map +1 -1
  136. package/dist/dev-compose.d.ts +26 -0
  137. package/dist/dev-compose.d.ts.map +1 -1
  138. package/dist/dev-compose.js +357 -79
  139. package/dist/dev-compose.js.map +1 -1
  140. package/dist/dev-log-bus.d.ts +30 -0
  141. package/dist/dev-log-bus.d.ts.map +1 -0
  142. package/dist/dev-log-bus.js +87 -0
  143. package/dist/dev-log-bus.js.map +1 -0
  144. package/dist/dev-log-filter.d.ts +10 -0
  145. package/dist/dev-log-filter.d.ts.map +1 -0
  146. package/dist/dev-log-filter.js +36 -0
  147. package/dist/dev-log-filter.js.map +1 -0
  148. package/dist/dev-logo.d.ts +12 -0
  149. package/dist/dev-logo.d.ts.map +1 -0
  150. package/dist/dev-logo.js +56 -0
  151. package/dist/dev-logo.js.map +1 -0
  152. package/dist/dev-ports.d.ts +27 -0
  153. package/dist/dev-ports.d.ts.map +1 -0
  154. package/dist/dev-ports.js +171 -0
  155. package/dist/dev-ports.js.map +1 -0
  156. package/dist/dev-session-lock.d.ts +25 -0
  157. package/dist/dev-session-lock.d.ts.map +1 -0
  158. package/dist/dev-session-lock.js +81 -0
  159. package/dist/dev-session-lock.js.map +1 -0
  160. package/dist/dev-session.d.ts +26 -0
  161. package/dist/dev-session.d.ts.map +1 -0
  162. package/dist/dev-session.js +106 -0
  163. package/dist/dev-session.js.map +1 -0
  164. package/dist/dev-shutdown.d.ts +25 -0
  165. package/dist/dev-shutdown.d.ts.map +1 -0
  166. package/dist/dev-shutdown.js +114 -0
  167. package/dist/dev-shutdown.js.map +1 -0
  168. package/dist/dev-task-colors.d.ts +13 -0
  169. package/dist/dev-task-colors.d.ts.map +1 -0
  170. package/dist/dev-task-colors.js +43 -0
  171. package/dist/dev-task-colors.js.map +1 -0
  172. package/dist/dev-tui.d.ts +24 -0
  173. package/dist/dev-tui.d.ts.map +1 -0
  174. package/dist/dev-tui.js +188 -0
  175. package/dist/dev-tui.js.map +1 -0
  176. package/dist/diff-output.d.ts +5 -1
  177. package/dist/diff-output.d.ts.map +1 -1
  178. package/dist/diff-output.js +69 -0
  179. package/dist/diff-output.js.map +1 -1
  180. package/dist/docker-runtime.d.ts +30 -0
  181. package/dist/docker-runtime.d.ts.map +1 -0
  182. package/dist/docker-runtime.js +118 -0
  183. package/dist/docker-runtime.js.map +1 -0
  184. package/dist/engine-client.d.ts +10 -1
  185. package/dist/engine-client.d.ts.map +1 -1
  186. package/dist/engine-client.js +76 -17
  187. package/dist/engine-client.js.map +1 -1
  188. package/dist/engine-push-output.d.ts +17 -0
  189. package/dist/engine-push-output.d.ts.map +1 -0
  190. package/dist/engine-push-output.js +64 -0
  191. package/dist/engine-push-output.js.map +1 -0
  192. package/dist/ensure-binary.js +2 -2
  193. package/dist/ensure-binary.js.map +1 -1
  194. package/dist/env-file.d.ts +5 -0
  195. package/dist/env-file.d.ts.map +1 -0
  196. package/dist/env-file.js +33 -0
  197. package/dist/env-file.js.map +1 -0
  198. package/dist/gitignore.d.ts +8 -0
  199. package/dist/gitignore.d.ts.map +1 -0
  200. package/dist/gitignore.js +41 -0
  201. package/dist/gitignore.js.map +1 -0
  202. package/dist/kong-config.d.ts +9 -0
  203. package/dist/kong-config.d.ts.map +1 -1
  204. package/dist/kong-config.js +18 -1
  205. package/dist/kong-config.js.map +1 -1
  206. package/dist/link.d.ts +66 -0
  207. package/dist/link.d.ts.map +1 -0
  208. package/dist/link.js +160 -0
  209. package/dist/link.js.map +1 -0
  210. package/dist/process-manager.d.ts +8 -0
  211. package/dist/process-manager.d.ts.map +1 -1
  212. package/dist/process-manager.js +53 -9
  213. package/dist/process-manager.js.map +1 -1
  214. package/dist/project-config.d.ts +30 -3
  215. package/dist/project-config.d.ts.map +1 -1
  216. package/dist/project-config.js +37 -4
  217. package/dist/project-config.js.map +1 -1
  218. package/dist/prompts.d.ts +3 -0
  219. package/dist/prompts.d.ts.map +1 -0
  220. package/dist/prompts.js +3 -0
  221. package/dist/prompts.js.map +1 -0
  222. package/dist/pull-utils.d.ts +50 -14
  223. package/dist/pull-utils.d.ts.map +1 -1
  224. package/dist/pull-utils.js +152 -12
  225. package/dist/pull-utils.js.map +1 -1
  226. package/dist/resolve-target.d.ts +86 -0
  227. package/dist/resolve-target.d.ts.map +1 -0
  228. package/dist/resolve-target.js +291 -0
  229. package/dist/resolve-target.js.map +1 -0
  230. package/dist/restore-system-relation-targets.d.ts +3 -0
  231. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  232. package/dist/restore-system-relation-targets.js +45 -0
  233. package/dist/restore-system-relation-targets.js.map +1 -0
  234. package/dist/runtime-routes.d.ts.map +1 -1
  235. package/dist/runtime-routes.js +7 -0
  236. package/dist/runtime-routes.js.map +1 -1
  237. package/dist/schema-ast-v2.d.ts +1 -1
  238. package/dist/schema-ast-v2.d.ts.map +1 -1
  239. package/dist/schema-ast-v2.js +2 -2
  240. package/dist/schema-ast-v2.js.map +1 -1
  241. package/dist/schema-sources.d.ts +40 -0
  242. package/dist/schema-sources.d.ts.map +1 -0
  243. package/dist/schema-sources.js +183 -0
  244. package/dist/schema-sources.js.map +1 -0
  245. package/dist/scripts/postinstall.js +5 -1
  246. package/dist/scripts/postinstall.js.map +1 -1
  247. package/dist/self-host-compose.d.ts +37 -1
  248. package/dist/self-host-compose.d.ts.map +1 -1
  249. package/dist/self-host-compose.js +234 -43
  250. package/dist/self-host-compose.js.map +1 -1
  251. package/dist/storage-provision.d.ts +4 -0
  252. package/dist/storage-provision.d.ts.map +1 -1
  253. package/dist/storage-provision.js +24 -2
  254. package/dist/storage-provision.js.map +1 -1
  255. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  256. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  257. package/dist/supatype-eval-1781522769253.mjs +3 -0
  258. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  259. package/dist/systemd.js +2 -2
  260. package/dist/systemd.js.map +1 -1
  261. package/dist/target-client.d.ts +10 -0
  262. package/dist/target-client.d.ts.map +1 -0
  263. package/dist/target-client.js +22 -0
  264. package/dist/target-client.js.map +1 -0
  265. package/dist/type-extractor.d.ts +11 -0
  266. package/dist/type-extractor.d.ts.map +1 -1
  267. package/dist/type-extractor.js +95 -8
  268. package/dist/type-extractor.js.map +1 -1
  269. package/dist/ui/brand.d.ts +9 -0
  270. package/dist/ui/brand.d.ts.map +1 -0
  271. package/dist/ui/brand.js +11 -0
  272. package/dist/ui/brand.js.map +1 -0
  273. package/dist/ui/confirm.d.ts +12 -0
  274. package/dist/ui/confirm.d.ts.map +1 -0
  275. package/dist/ui/confirm.js +28 -0
  276. package/dist/ui/confirm.js.map +1 -0
  277. package/dist/ui/fatal.d.ts +10 -0
  278. package/dist/ui/fatal.d.ts.map +1 -0
  279. package/dist/ui/fatal.js +34 -0
  280. package/dist/ui/fatal.js.map +1 -0
  281. package/dist/ui/index.d.ts +9 -0
  282. package/dist/ui/index.d.ts.map +1 -0
  283. package/dist/ui/index.js +9 -0
  284. package/dist/ui/index.js.map +1 -0
  285. package/dist/ui/interactive.d.ts +3 -0
  286. package/dist/ui/interactive.d.ts.map +1 -0
  287. package/dist/ui/interactive.js +5 -0
  288. package/dist/ui/interactive.js.map +1 -0
  289. package/dist/ui/messages.d.ts +10 -0
  290. package/dist/ui/messages.d.ts.map +1 -0
  291. package/dist/ui/messages.js +35 -0
  292. package/dist/ui/messages.js.map +1 -0
  293. package/dist/ui/next-steps.d.ts +3 -0
  294. package/dist/ui/next-steps.d.ts.map +1 -0
  295. package/dist/ui/next-steps.js +10 -0
  296. package/dist/ui/next-steps.js.map +1 -0
  297. package/dist/ui/progress.d.ts +5 -0
  298. package/dist/ui/progress.d.ts.map +1 -0
  299. package/dist/ui/progress.js +24 -0
  300. package/dist/ui/progress.js.map +1 -0
  301. package/dist/ui/prompts.d.ts +14 -0
  302. package/dist/ui/prompts.d.ts.map +1 -0
  303. package/dist/ui/prompts.js +34 -0
  304. package/dist/ui/prompts.js.map +1 -0
  305. package/package.json +5 -2
  306. package/src/app/framework.ts +1 -3
  307. package/src/app/proxy-dev-app.ts +114 -6
  308. package/src/app-config.ts +80 -0
  309. package/src/binary-cache.ts +102 -52
  310. package/src/cli.ts +16 -2
  311. package/src/commands/add.ts +97 -0
  312. package/src/commands/admin.ts +381 -190
  313. package/src/commands/adopt.ts +82 -0
  314. package/src/commands/app.ts +20 -17
  315. package/src/commands/cache.ts +11 -10
  316. package/src/commands/cloud.ts +91 -142
  317. package/src/commands/db.ts +40 -63
  318. package/src/commands/deploy.ts +186 -126
  319. package/src/commands/dev.ts +98 -55
  320. package/src/commands/diff.ts +52 -43
  321. package/src/commands/doctor.ts +103 -0
  322. package/src/commands/engine.ts +5 -4
  323. package/src/commands/functions.ts +187 -123
  324. package/src/commands/generate.ts +5 -4
  325. package/src/commands/init.ts +1087 -104
  326. package/src/commands/introspect.ts +48 -0
  327. package/src/commands/keys.ts +56 -14
  328. package/src/commands/link-helpers.ts +273 -0
  329. package/src/commands/logs.ts +5 -4
  330. package/src/commands/migrate-from-v1.ts +3 -2
  331. package/src/commands/migrate.ts +167 -27
  332. package/src/commands/pg.ts +13 -18
  333. package/src/commands/plugins.ts +55 -46
  334. package/src/commands/pull.ts +38 -9
  335. package/src/commands/push.ts +148 -175
  336. package/src/commands/seed.ts +5 -4
  337. package/src/commands/self-host.ts +85 -54
  338. package/src/commands/self-update.ts +3 -2
  339. package/src/commands/status.ts +102 -33
  340. package/src/commands/types.ts +3 -2
  341. package/src/commands/update.ts +59 -23
  342. package/src/compose-rename.ts +76 -0
  343. package/src/config.ts +2 -1
  344. package/src/dev-compose.ts +462 -76
  345. package/src/dev-log-bus.ts +101 -0
  346. package/src/dev-log-filter.ts +32 -0
  347. package/src/dev-logo.ts +61 -0
  348. package/src/dev-ports.ts +212 -0
  349. package/src/dev-session-lock.ts +101 -0
  350. package/src/dev-session.ts +130 -0
  351. package/src/dev-shutdown.ts +147 -0
  352. package/src/dev-task-colors.ts +47 -0
  353. package/src/dev-tui.ts +232 -0
  354. package/src/diff-output.ts +79 -1
  355. package/src/docker-runtime.ts +151 -0
  356. package/src/engine-client.ts +81 -17
  357. package/src/engine-push-output.ts +75 -0
  358. package/src/ensure-binary.ts +2 -2
  359. package/src/env-file.ts +37 -0
  360. package/src/gitignore.ts +48 -0
  361. package/src/kong-config.ts +24 -1
  362. package/src/link.ts +243 -0
  363. package/src/process-manager.ts +66 -10
  364. package/src/project-config.ts +62 -7
  365. package/src/prompts.ts +2 -0
  366. package/src/pull-utils.ts +217 -23
  367. package/src/resolve-target.ts +419 -0
  368. package/src/restore-system-relation-targets.ts +45 -0
  369. package/src/runtime-routes.ts +7 -0
  370. package/src/schema-ast-v2.ts +2 -1
  371. package/src/schema-sources.ts +248 -0
  372. package/src/scripts/postinstall.ts +7 -1
  373. package/src/self-host-compose.ts +262 -46
  374. package/src/storage-provision.ts +33 -1
  375. package/src/supatype-eval-1781522769253.mts +1 -0
  376. package/src/systemd.ts +2 -2
  377. package/src/target-client.ts +40 -0
  378. package/src/type-extractor.ts +124 -11
  379. package/src/ui/README.md +17 -0
  380. package/src/ui/brand.ts +12 -0
  381. package/src/ui/confirm.ts +38 -0
  382. package/src/ui/fatal.ts +43 -0
  383. package/src/ui/index.ts +8 -0
  384. package/src/ui/interactive.ts +4 -0
  385. package/src/ui/messages.ts +43 -0
  386. package/src/ui/next-steps.ts +10 -0
  387. package/src/ui/progress.ts +28 -0
  388. package/src/ui/prompts.ts +40 -0
  389. package/tests/admin-ensure.test.ts +59 -0
  390. package/tests/cli-help.test.ts +27 -2
  391. package/tests/config.test.ts +29 -2
  392. package/tests/dev-ports.test.ts +41 -0
  393. package/tests/dev-session-lock.test.ts +54 -0
  394. package/tests/dev-ui.test.ts +162 -0
  395. package/tests/docker-runtime.test.ts +236 -0
  396. package/tests/engine-push-output.test.ts +67 -0
  397. package/tests/init.test.ts +197 -18
  398. package/tests/link.test.ts +148 -0
  399. package/tests/minisign.test.ts +102 -0
  400. package/tests/proxy-dev-app.test.ts +45 -1
  401. package/tests/pull-utils.test.ts +5 -4
  402. package/tests/runtime-contract.test.ts +186 -2
  403. package/tests/schema-sources.test.ts +119 -0
  404. package/tests/storage-provision.test.ts +100 -0
  405. package/tests/ui-confirm.test.ts +41 -0
  406. package/tests/ui-messages.test.ts +66 -0
  407. package/tsconfig.tsbuildinfo +1 -1
@@ -5,12 +5,14 @@
5
5
  */
6
6
  import { loadConfig } from "../config.js";
7
7
  import { connectionString } from "../project-config.js";
8
- import { loadCloudConfig } from "./cloud.js";
8
+ import { loadProjectLink } from "../link.js";
9
+ import { resolveTarget } from "../resolve-target.js";
10
+ import { targetFetch } from "../target-client.js";
11
+ import { error, info, plain } from "../ui/messages.js";
9
12
  export function registerDb(program) {
10
13
  const db = program
11
14
  .command("db")
12
15
  .description("Database connection management");
13
- // supatype db connection-string
14
16
  db
15
17
  .command("connection-string")
16
18
  .description("Show the database connection string for the linked project")
@@ -19,96 +21,73 @@ export function registerDb(program) {
19
21
  .action(async (opts) => {
20
22
  const cwd = process.cwd();
21
23
  const config = loadConfig(cwd);
22
- const cloudCfg = loadCloudConfig(cwd);
24
+ const link = loadProjectLink(cwd);
23
25
  const localConn = connectionString(config);
24
- // If no cloud project linked, show the local connection string.
25
- if (!cloudCfg?.projectSlug) {
26
+ if (!link || link.kind !== "cloud") {
26
27
  const connStr = opts.transaction ? localConn.replace(/:5432\//, ":6432/") : localConn;
27
- console.log(connStr);
28
- console.log();
29
- console.log("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
30
- console.log("Transaction mode (port 6432): for application servers and serverless functions");
28
+ plain(connStr);
29
+ plain();
30
+ plain("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
31
+ plain("Transaction mode (port 6432): for application servers and serverless functions");
31
32
  return;
32
33
  }
33
- // If linked to a cloud project, fetch from the API
34
- const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
35
- const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
34
+ const target = resolveTarget(cwd, { env: opts.env });
36
35
  const envName = opts.env || "production";
37
36
  try {
38
- const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/environments`, {
39
- headers: {
40
- Authorization: `Bearer ${token}`,
41
- },
37
+ const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
38
+ method: "GET",
39
+ path: `/projects/${target.projectRef}/environments`,
40
+ token: target.token,
41
+ orgId: target.orgId,
42
42
  });
43
- if (!res.ok) {
44
- console.error(`Failed to fetch project info: ${res.status}`);
45
- process.exitCode = 1;
46
- return;
47
- }
48
- const { data } = (await res.json());
49
43
  const env = data.find((e) => e.name === envName);
50
44
  if (!env) {
51
- console.error(`Environment "${envName}" not found`);
45
+ error(`Environment "${envName}" not found`);
52
46
  process.exitCode = 1;
53
47
  return;
54
48
  }
55
49
  const connStr = env.databaseUrl || "Connection string not available";
56
- if (opts.transaction) {
57
- console.log(connStr.replace(/:5432\//, ":6432/"));
58
- }
59
- else {
60
- console.log(connStr);
61
- }
62
- console.log();
63
- console.log("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
64
- console.log("Transaction mode (port 6432): for application servers and serverless functions");
50
+ plain(opts.transaction ? connStr.replace(/:5432\//, ":6432/") : connStr);
51
+ plain();
52
+ plain("Session mode (port 5432): for interactive tools (psql, DataGrip, TablePlus)");
53
+ plain("Transaction mode (port 6432): for application servers and serverless functions");
65
54
  }
66
55
  catch (err) {
67
- console.error("Failed to fetch connection string:", err.message);
56
+ error(`Failed to fetch connection string: ${err.message}`);
68
57
  process.exitCode = 1;
69
58
  }
70
59
  });
71
- // supatype db reset-password
72
60
  db
73
61
  .command("reset-password")
74
62
  .description("Reset the database password for the linked project")
75
63
  .option("--env <name>", "Environment name", "production")
76
64
  .action(async (opts) => {
77
65
  const cwd = process.cwd();
78
- const cloudCfg = loadCloudConfig(cwd);
79
- if (!cloudCfg?.projectSlug) {
80
- console.error("Not linked to a cloud project. Run: supatype link --project <ref>");
66
+ const link = loadProjectLink(cwd);
67
+ if (!link || link.kind !== "cloud") {
68
+ error("Not linked to a cloud project. Run: supatype link --project <ref>");
81
69
  process.exitCode = 1;
82
70
  return;
83
71
  }
84
- const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
85
- const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
72
+ const target = resolveTarget(cwd, { env: opts.env });
86
73
  const envName = opts.env || "production";
87
74
  try {
88
- const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/environments/${envName}/reset-db-password`, {
75
+ const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
89
76
  method: "POST",
90
- headers: {
91
- Authorization: `Bearer ${token}`,
92
- "Content-Type": "application/json",
93
- },
77
+ path: `/projects/${target.projectRef}/environments/${envName}/reset-db-password`,
78
+ token: target.token,
79
+ orgId: target.orgId,
94
80
  });
95
- if (!res.ok) {
96
- const body = await res.text();
97
- console.error(`Failed to reset password: ${res.status} ${body}`);
98
- process.exitCode = 1;
99
- return;
81
+ info("Database password reset successfully.");
82
+ if (data.databaseUrl) {
83
+ plain(`\nNew connection string:\n${data.databaseUrl}`);
84
+ }
85
+ else if (data.password) {
86
+ plain(`\nNew password: ${data.password}`);
100
87
  }
101
- const { data } = (await res.json());
102
- console.log("Database password reset successfully.");
103
- console.log();
104
- console.log(`New password: ${data.password}`);
105
- console.log(`Connection string: ${data.connectionString}`);
106
- console.log();
107
- console.log("Warning: Existing database connections have been terminated.");
108
- console.log("Update your application with the new connection string.");
109
88
  }
110
89
  catch (err) {
111
- console.error("Failed to reset password:", err.message);
90
+ error(`Failed to reset password: ${err.message}`);
112
91
  process.exitCode = 1;
113
92
  }
114
93
  });
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsRrD"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAgBxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwSrD"}
@@ -10,19 +10,25 @@
10
10
  * supatype deploy status — show current deployment info
11
11
  * supatype deploy logs <version> — show build logs
12
12
  */
13
- import { join } from "node:path";
13
+ import { readdirSync, statSync, mkdirSync, cpSync } from "node:fs";
14
+ import { join, relative } from "node:path";
14
15
  import { loadConfig, loadSchemaAst } from "../config.js";
15
16
  import { connectionString, schemaPathFromProject } from "../project-config.js";
16
17
  import { deploySchemaToLinkedProject, loadCloudConfig, pushSchemaToLinkedProject } from "./cloud.js";
18
+ import { loadProjectLink } from "../link.js";
19
+ import { resolveTarget } from "../resolve-target.js";
20
+ import { targetFetch } from "../target-client.js";
17
21
  import { ensureEngine, engineRequest } from "../engine-client.js";
18
22
  import { resolveAppConfig, validateStaticMode, validateBuildOutput, detectPackageManager } from "../app/framework.js";
19
23
  import { spawnSync } from "node:child_process";
24
+ import { error, info, plain, step } from "../ui/messages.js";
20
25
  export function registerDeploy(program) {
21
26
  const deploy = program
22
27
  .command("deploy")
23
28
  .description("Deploy schema and app — Supatype Cloud by default when linked (`supatype link`); pass --local for engine + your database")
24
29
  .option("--local", "Use local schema engine and database_url from config (skip cloud control plane)")
25
- .option("--environment <name>", "Cloud environment when using linked project", "production")
30
+ .option("--environment <name>", "Target environment when linked", "production")
31
+ .option("--env <name>", "Alias for --environment")
26
32
  .option("--app-only", "Skip schema push, only deploy the static site")
27
33
  .option("--schema-only", "Skip app build, only push schema changes")
28
34
  .option("--skip-build", "Deploy existing build output without building")
@@ -31,14 +37,15 @@ export function registerDeploy(program) {
31
37
  .action(async (opts) => {
32
38
  const cwd = process.cwd();
33
39
  const config = loadConfig(cwd);
40
+ const link = loadProjectLink(cwd);
34
41
  const cloudCfg = loadCloudConfig(cwd);
42
+ const envName = opts.env ?? opts.environment ?? "production";
35
43
  let schemaDone = false;
36
- // Default: cloud — .supatype/cloud.json → control plane schema deploy
37
44
  if (!opts.local &&
38
- cloudCfg?.projectSlug &&
45
+ link &&
39
46
  !opts.appOnly &&
40
47
  !opts.skipBuild) {
41
- await deploySchemaToLinkedProject(cwd, opts.environment ?? "production");
48
+ await deploySchemaToLinkedProject(cwd, envName);
42
49
  schemaDone = true;
43
50
  if (opts.schemaOnly) {
44
51
  return;
@@ -48,7 +55,7 @@ export function registerDeploy(program) {
48
55
  if (!opts.appOnly && !opts.skipBuild && !schemaDone) {
49
56
  const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd);
50
57
  if (opts.local) {
51
- console.log("=== Schema Push (local) ===");
58
+ step("Schema Push (local)");
52
59
  await ensureEngine();
53
60
  const diff = await engineRequest("/diff", {
54
61
  ast,
@@ -57,25 +64,25 @@ export function registerDeploy(program) {
57
64
  });
58
65
  const ops = diff.operations ?? [];
59
66
  if (ops.length > 0) {
60
- console.log(`${ops.length} schema change(s) to apply.`);
67
+ info(`${ops.length} schema change(s) to apply.`);
61
68
  await engineRequest("/push", {
62
69
  ast,
63
70
  database_url: connectionString(config),
64
71
  schema: "public",
65
72
  force: true,
66
73
  });
67
- console.log("Schema changes applied.");
74
+ info("Schema changes applied.");
68
75
  }
69
76
  else {
70
- console.log("Schema is up to date.");
77
+ info("Schema is up to date.");
71
78
  }
72
79
  }
73
- else if (cloudCfg?.projectSlug) {
74
- console.log("=== Schema Push (cloud) ===");
75
- await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true });
80
+ else if (link) {
81
+ step("Schema Push (linked)");
82
+ await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true, env: envName });
76
83
  }
77
84
  else {
78
- console.error("Not linked to Supatype Cloud. Run: supatype link\n" +
85
+ error("Not linked to Supatype Cloud. Run: supatype link\n" +
79
86
  "Or deploy against your own database: supatype deploy --local");
80
87
  process.exit(1);
81
88
  }
@@ -84,26 +91,26 @@ export function registerDeploy(program) {
84
91
  if (!opts.schemaOnly) {
85
92
  if (!config.build) {
86
93
  if (opts.appOnly) {
87
- console.error("No build section found in supatype.config.ts");
94
+ error("No build section found in supatype.config.ts");
88
95
  process.exit(1);
89
96
  }
90
97
  // No build config — skip app deployment silently
91
98
  return;
92
99
  }
93
- console.log("\n=== App Build & Deploy ===");
100
+ step("App Build & Deploy");
94
101
  const appConfig = resolveAppConfig(config.build, cwd);
95
102
  // Validate static mode
96
103
  const staticError = validateStaticMode(appConfig.framework, appConfig.directory);
97
104
  if (staticError) {
98
- console.error(staticError);
105
+ error(staticError);
99
106
  process.exit(1);
100
107
  }
101
108
  // Build step
102
109
  if (!opts.skipBuild && appConfig.buildCommand) {
103
- console.log(`Framework: ${appConfig.framework}`);
104
- console.log(`Build command: ${appConfig.buildCommand}`);
105
- console.log(`Output directory: ${appConfig.outputDirectory}`);
106
- console.log();
110
+ info(`Framework: ${appConfig.framework}`);
111
+ info(`Build command: ${appConfig.buildCommand}`);
112
+ info(`Output directory: ${appConfig.outputDirectory}`);
113
+ plain();
107
114
  // Inject environment variables
108
115
  const buildEnv = {
109
116
  ...process.env,
@@ -118,7 +125,7 @@ export function registerDeploy(program) {
118
125
  }
119
126
  // Install dependencies
120
127
  const pm = detectPackageManager(appConfig.directory);
121
- console.log(`Installing dependencies (${pm})...`);
128
+ info(`Installing dependencies (${pm})...`);
122
129
  const installResult = spawnSync(pm, ["install"], {
123
130
  cwd: appConfig.directory,
124
131
  stdio: "inherit",
@@ -126,11 +133,11 @@ export function registerDeploy(program) {
126
133
  timeout: 5 * 60 * 1000, // 5 minute timeout
127
134
  });
128
135
  if (installResult.status !== 0) {
129
- console.error("Dependency installation failed.");
136
+ error("Dependency installation failed.");
130
137
  process.exit(1);
131
138
  }
132
139
  // Run build
133
- console.log("\nBuilding...");
140
+ plain("\nBuilding...");
134
141
  const [buildCmd, ...buildArgs] = appConfig.buildCommand.split(" ");
135
142
  const buildResult = spawnSync(buildCmd, buildArgs, {
136
143
  cwd: appConfig.directory,
@@ -139,7 +146,7 @@ export function registerDeploy(program) {
139
146
  timeout: 10 * 60 * 1000, // 10 minute timeout
140
147
  });
141
148
  if (buildResult.status !== 0) {
142
- console.error("Build failed.");
149
+ error("Build failed.");
143
150
  process.exit(1);
144
151
  }
145
152
  }
@@ -147,22 +154,26 @@ export function registerDeploy(program) {
147
154
  const maxSizeMb = 500; // Default, should be tier-aware in cloud
148
155
  const validationError = validateBuildOutput(appConfig.outputDirectory, maxSizeMb);
149
156
  if (validationError) {
150
- console.error(validationError);
157
+ error(validationError);
151
158
  process.exit(1);
152
159
  }
153
160
  // Deploy (--local never uploads to cloud, even if linked)
154
- if (cloudCfg?.projectSlug && !opts.local) {
155
- await deployToCloud({ projectRef: cloudCfg.projectSlug, apiUrl: cloudCfg.apiUrl, accessToken: cloudCfg.token }, appConfig.outputDirectory, opts.preview ?? false);
161
+ if (link && !opts.local) {
162
+ await deployStaticSite(cwd, appConfig.outputDirectory, {
163
+ preview: opts.preview ?? false,
164
+ env: envName,
165
+ });
156
166
  }
157
167
  else {
158
168
  deploySelfHost(appConfig.outputDirectory, cwd);
159
169
  }
160
- console.log("\nDeployment complete!");
161
- if (cloudCfg?.projectSlug && !opts.local) {
170
+ info("Deployment complete!");
171
+ if (link && !opts.local) {
172
+ const target = resolveTarget(cwd, { env: envName });
162
173
  const url = opts.preview
163
- ? `https://preview-${Date.now().toString(36)}.${cloudCfg.projectSlug}.supatype.dev`
164
- : `https://${cloudCfg.projectSlug}.supatype.dev`;
165
- console.log(`URL: ${url}`);
174
+ ? `${target.apiBaseUrl}/preview`
175
+ : target.apiBaseUrl;
176
+ info(`URL: ${url}`);
166
177
  }
167
178
  }
168
179
  });
@@ -170,93 +181,128 @@ export function registerDeploy(program) {
170
181
  deploy
171
182
  .command("rollback")
172
183
  .description("Roll back to the previous static site deployment")
173
- .action(async () => {
174
- const cloudCfg = loadCloudConfig(process.cwd());
175
- if (!cloudCfg?.projectSlug) {
176
- console.error("Not linked to a cloud project. Rollback is only available for cloud deployments.");
184
+ .option("--env <name>", "Target environment when linked")
185
+ .option("--to <id>", "Roll back to a specific deployment id or version")
186
+ .action(async (opts) => {
187
+ const cwd = process.cwd();
188
+ const link = loadProjectLink(cwd);
189
+ if (!link) {
190
+ error("Not linked to a project. Rollback requires a linked target.");
177
191
  process.exit(1);
178
192
  }
179
- const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
180
- const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
181
- const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/rollback`, {
193
+ const target = resolveTarget(cwd, { env: opts.env });
194
+ const body = opts.to ? { to: opts.to } : undefined;
195
+ const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
182
196
  method: "POST",
183
- headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
197
+ path: `/projects/${target.projectRef}/deployments/rollback`,
198
+ body,
199
+ token: target.token,
200
+ orgId: target.orgId,
201
+ environment: target.mode === "cloud" ? target.environment : undefined,
184
202
  });
185
- if (!res.ok) {
186
- const body = await res.text();
187
- console.error(`Rollback failed: ${res.status} ${body}`);
188
- process.exit(1);
189
- }
190
- const { data } = await res.json();
191
- console.log(`Rolled back to deployment ${data.version}.`);
203
+ info(`Rolled back to deployment ${data.version ?? "previous"}.`);
192
204
  });
193
205
  // supatype deploy status
194
206
  deploy
195
207
  .command("status")
196
208
  .description("Show current deployment status")
197
- .action(async () => {
198
- const cloudCfg = loadCloudConfig(process.cwd());
199
- if (!cloudCfg?.projectSlug) {
200
- console.error("Not linked to a cloud project.");
209
+ .option("--env <name>", "Target environment when linked")
210
+ .action(async (opts) => {
211
+ const cwd = process.cwd();
212
+ const link = loadProjectLink(cwd);
213
+ if (!link) {
214
+ error("Not linked to a project.");
201
215
  process.exit(1);
202
216
  }
203
- const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
204
- const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
205
- const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/current`, {
206
- headers: { Authorization: `Bearer ${token}` },
217
+ const target = resolveTarget(cwd, { env: opts.env });
218
+ const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
219
+ method: "GET",
220
+ path: `/projects/${target.projectRef}/deployments/current`,
221
+ token: target.token,
222
+ orgId: target.orgId,
223
+ environment: target.mode === "cloud" ? target.environment : undefined,
207
224
  });
208
- if (!res.ok) {
209
- console.error("No active deployment found.");
225
+ if (!data) {
226
+ info("No active deployment found.");
210
227
  return;
211
228
  }
212
- const { data } = await res.json();
213
- console.log(`Deployment: ${data.version}`);
214
- console.log(`Status: ${data.status}`);
215
- console.log(`Deployed: ${data.timestamp}`);
216
- console.log(`Size: ${(data.size / (1024 * 1024)).toFixed(1)}MB`);
217
- console.log(`Build duration: ${data.buildDuration}s`);
218
- console.log(`URL: ${data.url}`);
229
+ info(`Deployment: ${data.version ?? data.id ?? "unknown"}`);
230
+ info(`Status: ${data.status ?? "live"}`);
231
+ if (data.timestamp ?? data.createdAt) {
232
+ info(`Deployed: ${data.timestamp ?? data.createdAt}`);
233
+ }
234
+ if (data.size)
235
+ info(`Size: ${(data.size / (1024 * 1024)).toFixed(1)}MB`);
236
+ if (data.buildDuration)
237
+ info(`Build duration: ${data.buildDuration}s`);
238
+ if (data.url)
239
+ info(`URL: ${data.url}`);
219
240
  });
220
241
  // supatype deploy logs <version>
221
242
  deploy
222
243
  .command("logs [version]")
223
244
  .description("Show build logs for a deployment")
224
- .action(async (version) => {
225
- const cloudCfg = loadCloudConfig(process.cwd());
226
- if (!cloudCfg?.projectSlug) {
227
- console.error("Not linked to a cloud project.");
245
+ .option("--env <name>", "Target environment when linked")
246
+ .action(async (version, opts) => {
247
+ const cwd = process.cwd();
248
+ const link = loadProjectLink(cwd);
249
+ if (!link) {
250
+ error("Not linked to a project.");
228
251
  process.exit(1);
229
252
  }
230
- const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com";
231
- const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
253
+ const target = resolveTarget(cwd, { env: opts.env });
232
254
  const versionPath = version ? `/${version}` : "/current";
233
- const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments${versionPath}/logs`, {
234
- headers: { Authorization: `Bearer ${token}` },
255
+ const data = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
256
+ method: "GET",
257
+ path: `/projects/${target.projectRef}/deployments${versionPath}/logs`,
258
+ token: target.token,
259
+ orgId: target.orgId,
260
+ environment: target.mode === "cloud" ? target.environment : undefined,
235
261
  });
236
- if (!res.ok) {
237
- console.error("Logs not found.");
238
- process.exit(1);
239
- }
240
- const { data } = await res.json();
241
- console.log(data.logs);
262
+ plain(data.logs ?? "(no logs)");
242
263
  });
243
264
  }
244
- async function deployToCloud(config, outputDir, isPreview) {
245
- const apiUrl = config.apiUrl || "https://api.supatype.com";
246
- const token = config.accessToken || process.env["SUPATYPE_ACCESS_TOKEN"] || "";
247
- console.log("Uploading build artifacts...");
248
- // Collect files from output directory
265
+ async function deployStaticSite(cwd, outputDir, opts) {
266
+ const target = resolveTarget(cwd, { env: opts.env });
267
+ const token = target.token;
268
+ if (!token) {
269
+ throw new Error("No token for linked target. Re-run supatype link --token ...");
270
+ }
271
+ info("Uploading build artifacts...");
249
272
  const files = collectFiles(outputDir, outputDir);
250
- console.log(`${files.length} files to upload (${formatSize(files.reduce((s, f) => s + f.size, 0))})`);
251
- // Create deployment
252
- const createRes = await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments`, {
273
+ info(`${files.length} files to upload (${formatSize(files.reduce((s, f) => s + f.size, 0))})`);
274
+ const { readFileSync } = await import("node:fs");
275
+ if (target.apiPrefix === "/platform/v1") {
276
+ const filePayload = files.map((f) => ({
277
+ path: f.relativePath,
278
+ content: readFileSync(f.absolutePath).toString("base64"),
279
+ encoding: "base64",
280
+ }));
281
+ const created = await targetFetch(target.apiBaseUrl, target.apiPrefix, {
282
+ method: "POST",
283
+ path: `/projects/${target.projectRef}/deployments`,
284
+ body: { preview: opts.preview ?? false, files: filePayload },
285
+ token,
286
+ orgId: target.orgId,
287
+ });
288
+ await targetFetch(target.apiBaseUrl, target.apiPrefix, {
289
+ method: "POST",
290
+ path: `/projects/${target.projectRef}/deployments/${created.id}/finalize`,
291
+ token,
292
+ orgId: target.orgId,
293
+ });
294
+ return;
295
+ }
296
+ const createRes = await fetch(`${target.apiBaseUrl}/api/v1/projects/${target.projectRef}/deployments`, {
253
297
  method: "POST",
254
298
  headers: {
255
299
  Authorization: `Bearer ${token}`,
256
300
  "Content-Type": "application/json",
301
+ ...(target.orgId ? { "X-Org-Id": target.orgId } : {}),
302
+ ...(target.environment ? { "X-Supatype-Environment": target.environment } : {}),
257
303
  },
258
304
  body: JSON.stringify({
259
- preview: isPreview,
305
+ preview: opts.preview ?? false,
260
306
  fileCount: files.length,
261
307
  totalSize: files.reduce((s, f) => s + f.size, 0),
262
308
  files: files.map((f) => ({ path: f.relativePath, size: f.size })),
@@ -267,9 +313,8 @@ async function deployToCloud(config, outputDir, isPreview) {
267
313
  throw new Error(`Failed to create deployment: ${createRes.status} ${body}`);
268
314
  }
269
315
  const { data } = await createRes.json();
270
- // Upload files (simplified — in production, use multipart or presigned URLs)
271
316
  for (const file of files) {
272
- const content = require("node:fs").readFileSync(file.absolutePath);
317
+ const content = readFileSync(file.absolutePath);
273
318
  await fetch(`${data.uploadUrl}/${file.relativePath}`, {
274
319
  method: "PUT",
275
320
  headers: {
@@ -280,23 +325,22 @@ async function deployToCloud(config, outputDir, isPreview) {
280
325
  body: content,
281
326
  });
282
327
  }
283
- // Finalize deployment
284
- await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments/${data.deploymentId}/finalize`, {
328
+ await fetch(`${target.apiBaseUrl}/api/v1/projects/${target.projectRef}/deployments/${data.deploymentId}/finalize`, {
285
329
  method: "POST",
286
- headers: { Authorization: `Bearer ${token}` },
330
+ headers: {
331
+ Authorization: `Bearer ${token}`,
332
+ ...(target.orgId ? { "X-Org-Id": target.orgId } : {}),
333
+ },
287
334
  });
288
335
  }
289
336
  function deploySelfHost(outputDir, cwd) {
290
337
  const servingDir = join(cwd, ".supatype", "static");
291
- const { mkdirSync, cpSync } = require("node:fs");
292
338
  mkdirSync(servingDir, { recursive: true });
293
339
  cpSync(outputDir, servingDir, { recursive: true });
294
- console.log(`Static files deployed to ${servingDir}`);
340
+ info(`Static files deployed to ${servingDir}`);
295
341
  }
296
342
  function collectFiles(dir, baseDir) {
297
343
  const files = [];
298
- const { readdirSync, statSync } = require("node:fs");
299
- const { relative } = require("node:path");
300
344
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
301
345
  const fullPath = join(dir, entry.name);
302
346
  if (entry.isFile()) {