@supatype/cli 0.1.0-alpha.10

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 (416) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test.log +221 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -0
  6. package/bin/supatype.js +5 -0
  7. package/dist/app/framework.d.ts +44 -0
  8. package/dist/app/framework.d.ts.map +1 -0
  9. package/dist/app/framework.js +200 -0
  10. package/dist/app/framework.js.map +1 -0
  11. package/dist/app/proxy-dev-app.d.ts +13 -0
  12. package/dist/app/proxy-dev-app.d.ts.map +1 -0
  13. package/dist/app/proxy-dev-app.js +54 -0
  14. package/dist/app/proxy-dev-app.js.map +1 -0
  15. package/dist/app-config.d.ts +7 -0
  16. package/dist/app-config.d.ts.map +1 -0
  17. package/dist/app-config.js +113 -0
  18. package/dist/app-config.js.map +1 -0
  19. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  20. package/dist/augmentation-generator.d.ts +2 -0
  21. package/dist/augmentation-generator.d.ts.map +1 -0
  22. package/dist/augmentation-generator.js +111 -0
  23. package/dist/augmentation-generator.js.map +1 -0
  24. package/dist/binary-cache.d.ts +98 -0
  25. package/dist/binary-cache.d.ts.map +1 -0
  26. package/dist/binary-cache.js +687 -0
  27. package/dist/binary-cache.js.map +1 -0
  28. package/dist/cli.d.ts +2 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +61 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/commands/admin.d.ts +4 -0
  33. package/dist/commands/admin.d.ts.map +1 -0
  34. package/dist/commands/admin.js +271 -0
  35. package/dist/commands/admin.js.map +1 -0
  36. package/dist/commands/app.d.ts +3 -0
  37. package/dist/commands/app.d.ts.map +1 -0
  38. package/dist/commands/app.js +82 -0
  39. package/dist/commands/app.js.map +1 -0
  40. package/dist/commands/cache.d.ts +6 -0
  41. package/dist/commands/cache.d.ts.map +1 -0
  42. package/dist/commands/cache.js +105 -0
  43. package/dist/commands/cache.js.map +1 -0
  44. package/dist/commands/cloud.d.ts +23 -0
  45. package/dist/commands/cloud.d.ts.map +1 -0
  46. package/dist/commands/cloud.js +254 -0
  47. package/dist/commands/cloud.js.map +1 -0
  48. package/dist/commands/db.d.ts +8 -0
  49. package/dist/commands/db.d.ts.map +1 -0
  50. package/dist/commands/db.js +116 -0
  51. package/dist/commands/db.js.map +1 -0
  52. package/dist/commands/deploy-types.d.ts +14 -0
  53. package/dist/commands/deploy-types.d.ts.map +1 -0
  54. package/dist/commands/deploy-types.js +38 -0
  55. package/dist/commands/deploy-types.js.map +1 -0
  56. package/dist/commands/deploy.d.ts +15 -0
  57. package/dist/commands/deploy.d.ts.map +1 -0
  58. package/dist/commands/deploy.js +322 -0
  59. package/dist/commands/deploy.js.map +1 -0
  60. package/dist/commands/dev.d.ts +14 -0
  61. package/dist/commands/dev.d.ts.map +1 -0
  62. package/dist/commands/dev.js +806 -0
  63. package/dist/commands/dev.js.map +1 -0
  64. package/dist/commands/diff.d.ts +3 -0
  65. package/dist/commands/diff.d.ts.map +1 -0
  66. package/dist/commands/diff.js +54 -0
  67. package/dist/commands/diff.js.map +1 -0
  68. package/dist/commands/engine.d.ts +7 -0
  69. package/dist/commands/engine.d.ts.map +1 -0
  70. package/dist/commands/engine.js +27 -0
  71. package/dist/commands/engine.js.map +1 -0
  72. package/dist/commands/functions.d.ts +3 -0
  73. package/dist/commands/functions.d.ts.map +1 -0
  74. package/dist/commands/functions.js +749 -0
  75. package/dist/commands/functions.js.map +1 -0
  76. package/dist/commands/generate.d.ts +3 -0
  77. package/dist/commands/generate.d.ts.map +1 -0
  78. package/dist/commands/generate.js +38 -0
  79. package/dist/commands/generate.js.map +1 -0
  80. package/dist/commands/init.d.ts +7 -0
  81. package/dist/commands/init.d.ts.map +1 -0
  82. package/dist/commands/init.js +228 -0
  83. package/dist/commands/init.js.map +1 -0
  84. package/dist/commands/keys.d.ts +4 -0
  85. package/dist/commands/keys.d.ts.map +1 -0
  86. package/dist/commands/keys.js +57 -0
  87. package/dist/commands/keys.js.map +1 -0
  88. package/dist/commands/logs.d.ts +6 -0
  89. package/dist/commands/logs.d.ts.map +1 -0
  90. package/dist/commands/logs.js +52 -0
  91. package/dist/commands/logs.js.map +1 -0
  92. package/dist/commands/migrate-from-v1.d.ts +5 -0
  93. package/dist/commands/migrate-from-v1.d.ts.map +1 -0
  94. package/dist/commands/migrate-from-v1.js +125 -0
  95. package/dist/commands/migrate-from-v1.js.map +1 -0
  96. package/dist/commands/migrate.d.ts +3 -0
  97. package/dist/commands/migrate.d.ts.map +1 -0
  98. package/dist/commands/migrate.js +75 -0
  99. package/dist/commands/migrate.js.map +1 -0
  100. package/dist/commands/pg.d.ts +8 -0
  101. package/dist/commands/pg.d.ts.map +1 -0
  102. package/dist/commands/pg.js +102 -0
  103. package/dist/commands/pg.js.map +1 -0
  104. package/dist/commands/plugins.d.ts +3 -0
  105. package/dist/commands/plugins.d.ts.map +1 -0
  106. package/dist/commands/plugins.js +431 -0
  107. package/dist/commands/plugins.js.map +1 -0
  108. package/dist/commands/pull.d.ts +3 -0
  109. package/dist/commands/pull.d.ts.map +1 -0
  110. package/dist/commands/pull.js +12 -0
  111. package/dist/commands/pull.js.map +1 -0
  112. package/dist/commands/push.d.ts +3 -0
  113. package/dist/commands/push.d.ts.map +1 -0
  114. package/dist/commands/push.js +179 -0
  115. package/dist/commands/push.js.map +1 -0
  116. package/dist/commands/seed.d.ts +5 -0
  117. package/dist/commands/seed.d.ts.map +1 -0
  118. package/dist/commands/seed.js +55 -0
  119. package/dist/commands/seed.js.map +1 -0
  120. package/dist/commands/self-host.d.ts +9 -0
  121. package/dist/commands/self-host.d.ts.map +1 -0
  122. package/dist/commands/self-host.js +310 -0
  123. package/dist/commands/self-host.js.map +1 -0
  124. package/dist/commands/self-update.d.ts +9 -0
  125. package/dist/commands/self-update.d.ts.map +1 -0
  126. package/dist/commands/self-update.js +33 -0
  127. package/dist/commands/self-update.js.map +1 -0
  128. package/dist/commands/status.d.ts +6 -0
  129. package/dist/commands/status.d.ts.map +1 -0
  130. package/dist/commands/status.js +70 -0
  131. package/dist/commands/status.js.map +1 -0
  132. package/dist/commands/types.d.ts +3 -0
  133. package/dist/commands/types.d.ts.map +1 -0
  134. package/dist/commands/types.js +62 -0
  135. package/dist/commands/types.js.map +1 -0
  136. package/dist/commands/update.d.ts +7 -0
  137. package/dist/commands/update.d.ts.map +1 -0
  138. package/dist/commands/update.js +118 -0
  139. package/dist/commands/update.js.map +1 -0
  140. package/dist/components.d.ts +5 -0
  141. package/dist/components.d.ts.map +1 -0
  142. package/dist/components.js +3 -0
  143. package/dist/components.js.map +1 -0
  144. package/dist/config.d.ts +65 -0
  145. package/dist/config.d.ts.map +1 -0
  146. package/dist/config.js +134 -0
  147. package/dist/config.js.map +1 -0
  148. package/dist/dev-compose.d.ts +19 -0
  149. package/dist/dev-compose.d.ts.map +1 -0
  150. package/dist/dev-compose.js +468 -0
  151. package/dist/dev-compose.js.map +1 -0
  152. package/dist/dev-log-bus.d.ts +30 -0
  153. package/dist/dev-log-bus.d.ts.map +1 -0
  154. package/dist/dev-log-bus.js +87 -0
  155. package/dist/dev-log-bus.js.map +1 -0
  156. package/dist/dev-log-filter.d.ts +10 -0
  157. package/dist/dev-log-filter.d.ts.map +1 -0
  158. package/dist/dev-log-filter.js +36 -0
  159. package/dist/dev-log-filter.js.map +1 -0
  160. package/dist/dev-logo.d.ts +12 -0
  161. package/dist/dev-logo.d.ts.map +1 -0
  162. package/dist/dev-logo.js +57 -0
  163. package/dist/dev-logo.js.map +1 -0
  164. package/dist/dev-session.d.ts +26 -0
  165. package/dist/dev-session.d.ts.map +1 -0
  166. package/dist/dev-session.js +106 -0
  167. package/dist/dev-session.js.map +1 -0
  168. package/dist/dev-shutdown.d.ts +9 -0
  169. package/dist/dev-shutdown.d.ts.map +1 -0
  170. package/dist/dev-shutdown.js +50 -0
  171. package/dist/dev-shutdown.js.map +1 -0
  172. package/dist/dev-task-colors.d.ts +14 -0
  173. package/dist/dev-task-colors.d.ts.map +1 -0
  174. package/dist/dev-task-colors.js +44 -0
  175. package/dist/dev-task-colors.js.map +1 -0
  176. package/dist/dev-tui.d.ts +24 -0
  177. package/dist/dev-tui.d.ts.map +1 -0
  178. package/dist/dev-tui.js +188 -0
  179. package/dist/dev-tui.js.map +1 -0
  180. package/dist/diff-output.d.ts +4 -0
  181. package/dist/diff-output.d.ts.map +1 -0
  182. package/dist/diff-output.js +12 -0
  183. package/dist/diff-output.js.map +1 -0
  184. package/dist/docker-postgres.d.ts +57 -0
  185. package/dist/docker-postgres.d.ts.map +1 -0
  186. package/dist/docker-postgres.js +208 -0
  187. package/dist/docker-postgres.js.map +1 -0
  188. package/dist/engine-client.d.ts +69 -0
  189. package/dist/engine-client.d.ts.map +1 -0
  190. package/dist/engine-client.js +157 -0
  191. package/dist/engine-client.js.map +1 -0
  192. package/dist/engine-push-output.d.ts +16 -0
  193. package/dist/engine-push-output.d.ts.map +1 -0
  194. package/dist/engine-push-output.js +61 -0
  195. package/dist/engine-push-output.js.map +1 -0
  196. package/dist/ensure-binary.d.ts +7 -0
  197. package/dist/ensure-binary.d.ts.map +1 -0
  198. package/dist/ensure-binary.js +17 -0
  199. package/dist/ensure-binary.js.map +1 -0
  200. package/dist/functions-router-gen.d.ts +14 -0
  201. package/dist/functions-router-gen.d.ts.map +1 -0
  202. package/dist/functions-router-gen.js +199 -0
  203. package/dist/functions-router-gen.js.map +1 -0
  204. package/dist/index.d.ts +11 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +9 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/jwt.d.ts +3 -0
  209. package/dist/jwt.d.ts.map +1 -0
  210. package/dist/jwt.js +13 -0
  211. package/dist/jwt.js.map +1 -0
  212. package/dist/kong-config.d.ts +25 -0
  213. package/dist/kong-config.d.ts.map +1 -0
  214. package/dist/kong-config.js +71 -0
  215. package/dist/kong-config.js.map +1 -0
  216. package/dist/local-gateway.d.ts +7 -0
  217. package/dist/local-gateway.d.ts.map +1 -0
  218. package/dist/local-gateway.js +9 -0
  219. package/dist/local-gateway.js.map +1 -0
  220. package/dist/local-storage.d.ts +8 -0
  221. package/dist/local-storage.d.ts.map +1 -0
  222. package/dist/local-storage.js +14 -0
  223. package/dist/local-storage.js.map +1 -0
  224. package/dist/pgbouncer-userlist.d.ts +5 -0
  225. package/dist/pgbouncer-userlist.d.ts.map +1 -0
  226. package/dist/pgbouncer-userlist.js +14 -0
  227. package/dist/pgbouncer-userlist.js.map +1 -0
  228. package/dist/postgres-ctl.d.ts +44 -0
  229. package/dist/postgres-ctl.d.ts.map +1 -0
  230. package/dist/postgres-ctl.js +137 -0
  231. package/dist/postgres-ctl.js.map +1 -0
  232. package/dist/process-manager.d.ts +49 -0
  233. package/dist/process-manager.d.ts.map +1 -0
  234. package/dist/process-manager.js +177 -0
  235. package/dist/process-manager.js.map +1 -0
  236. package/dist/project-config.d.ts +238 -0
  237. package/dist/project-config.d.ts.map +1 -0
  238. package/dist/project-config.js +159 -0
  239. package/dist/project-config.js.map +1 -0
  240. package/dist/pull-utils.d.ts +31 -0
  241. package/dist/pull-utils.d.ts.map +1 -0
  242. package/dist/pull-utils.js +77 -0
  243. package/dist/pull-utils.js.map +1 -0
  244. package/dist/release-pins.d.ts +7 -0
  245. package/dist/release-pins.d.ts.map +1 -0
  246. package/dist/release-pins.js +27 -0
  247. package/dist/release-pins.js.map +1 -0
  248. package/dist/release-public-key.d.ts +8 -0
  249. package/dist/release-public-key.d.ts.map +1 -0
  250. package/dist/release-public-key.js +13 -0
  251. package/dist/release-public-key.js.map +1 -0
  252. package/dist/restore-system-relation-targets.d.ts +3 -0
  253. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  254. package/dist/restore-system-relation-targets.js +45 -0
  255. package/dist/restore-system-relation-targets.js.map +1 -0
  256. package/dist/runtime-routes.d.ts +34 -0
  257. package/dist/runtime-routes.d.ts.map +1 -0
  258. package/dist/runtime-routes.js +252 -0
  259. package/dist/runtime-routes.js.map +1 -0
  260. package/dist/schema-ast-v2.d.ts +127 -0
  261. package/dist/schema-ast-v2.d.ts.map +1 -0
  262. package/dist/schema-ast-v2.js +226 -0
  263. package/dist/schema-ast-v2.js.map +1 -0
  264. package/dist/scripts/postinstall.d.ts +11 -0
  265. package/dist/scripts/postinstall.d.ts.map +1 -0
  266. package/dist/scripts/postinstall.js +47 -0
  267. package/dist/scripts/postinstall.js.map +1 -0
  268. package/dist/seed.d.ts +8 -0
  269. package/dist/seed.d.ts.map +1 -0
  270. package/dist/seed.js +32 -0
  271. package/dist/seed.js.map +1 -0
  272. package/dist/self-host-compose.d.ts +43 -0
  273. package/dist/self-host-compose.d.ts.map +1 -0
  274. package/dist/self-host-compose.js +400 -0
  275. package/dist/self-host-compose.js.map +1 -0
  276. package/dist/storage-provision.d.ts +24 -0
  277. package/dist/storage-provision.d.ts.map +1 -0
  278. package/dist/storage-provision.js +44 -0
  279. package/dist/storage-provision.js.map +1 -0
  280. package/dist/studio-admin-roles.d.ts +7 -0
  281. package/dist/studio-admin-roles.d.ts.map +1 -0
  282. package/dist/studio-admin-roles.js +14 -0
  283. package/dist/studio-admin-roles.js.map +1 -0
  284. package/dist/studio-dev-server.d.ts +22 -0
  285. package/dist/studio-dev-server.d.ts.map +1 -0
  286. package/dist/studio-dev-server.js +28 -0
  287. package/dist/studio-dev-server.js.map +1 -0
  288. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  289. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  290. package/dist/supatype-eval-1781522769253.mjs +3 -0
  291. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  292. package/dist/systemd.d.ts +26 -0
  293. package/dist/systemd.d.ts.map +1 -0
  294. package/dist/systemd.js +102 -0
  295. package/dist/systemd.js.map +1 -0
  296. package/dist/tsx-runner.d.ts +18 -0
  297. package/dist/tsx-runner.d.ts.map +1 -0
  298. package/dist/tsx-runner.js +69 -0
  299. package/dist/tsx-runner.js.map +1 -0
  300. package/dist/type-extractor.d.ts +4 -0
  301. package/dist/type-extractor.d.ts.map +1 -0
  302. package/dist/type-extractor.js +1213 -0
  303. package/dist/type-extractor.js.map +1 -0
  304. package/dist/type-resolver.d.ts +33 -0
  305. package/dist/type-resolver.d.ts.map +1 -0
  306. package/dist/type-resolver.js +338 -0
  307. package/dist/type-resolver.js.map +1 -0
  308. package/package.json +41 -0
  309. package/releases/deno/VERSION +1 -0
  310. package/scripts/mirror-deno-release.sh +76 -0
  311. package/src/TYPE-RESOLUTION.md +294 -0
  312. package/src/app/framework.ts +249 -0
  313. package/src/app/proxy-dev-app.ts +68 -0
  314. package/src/app-config.ts +128 -0
  315. package/src/augmentation-generator.ts +126 -0
  316. package/src/binary-cache.ts +845 -0
  317. package/src/cli.ts +63 -0
  318. package/src/commands/admin.ts +372 -0
  319. package/src/commands/app.ts +97 -0
  320. package/src/commands/cache.ts +117 -0
  321. package/src/commands/cloud.ts +325 -0
  322. package/src/commands/db.ts +136 -0
  323. package/src/commands/deploy-types.ts +49 -0
  324. package/src/commands/deploy.ts +400 -0
  325. package/src/commands/dev.ts +1009 -0
  326. package/src/commands/diff.ts +63 -0
  327. package/src/commands/engine.ts +30 -0
  328. package/src/commands/functions.ts +901 -0
  329. package/src/commands/generate.ts +44 -0
  330. package/src/commands/init.ts +253 -0
  331. package/src/commands/keys.ts +66 -0
  332. package/src/commands/logs.ts +58 -0
  333. package/src/commands/migrate-from-v1.ts +131 -0
  334. package/src/commands/migrate.ts +87 -0
  335. package/src/commands/pg.ts +133 -0
  336. package/src/commands/plugins.ts +508 -0
  337. package/src/commands/pull.ts +17 -0
  338. package/src/commands/push.ts +226 -0
  339. package/src/commands/seed.ts +68 -0
  340. package/src/commands/self-host.ts +364 -0
  341. package/src/commands/self-update.ts +45 -0
  342. package/src/commands/status.ts +84 -0
  343. package/src/commands/types.ts +76 -0
  344. package/src/commands/update.ts +136 -0
  345. package/src/components.ts +6 -0
  346. package/src/config.ts +223 -0
  347. package/src/dev-compose.ts +583 -0
  348. package/src/dev-log-bus.ts +101 -0
  349. package/src/dev-log-filter.ts +32 -0
  350. package/src/dev-logo.ts +62 -0
  351. package/src/dev-session.ts +130 -0
  352. package/src/dev-shutdown.ts +54 -0
  353. package/src/dev-task-colors.ts +47 -0
  354. package/src/dev-tui.ts +232 -0
  355. package/src/diff-output.ts +12 -0
  356. package/src/docker-postgres.ts +295 -0
  357. package/src/engine-client.ts +236 -0
  358. package/src/engine-push-output.ts +71 -0
  359. package/src/ensure-binary.ts +28 -0
  360. package/src/functions-router-gen.ts +224 -0
  361. package/src/index.ts +11 -0
  362. package/src/jwt.ts +14 -0
  363. package/src/kong-config.ts +93 -0
  364. package/src/local-gateway.ts +9 -0
  365. package/src/local-storage.ts +14 -0
  366. package/src/pgbouncer-userlist.ts +15 -0
  367. package/src/postgres-ctl.ts +171 -0
  368. package/src/process-manager.ts +220 -0
  369. package/src/project-config.ts +388 -0
  370. package/src/pull-utils.ts +81 -0
  371. package/src/release-pins.ts +31 -0
  372. package/src/release-public-key.ts +12 -0
  373. package/src/restore-system-relation-targets.ts +45 -0
  374. package/src/runtime-routes.ts +291 -0
  375. package/src/schema-ast-v2.ts +324 -0
  376. package/src/scripts/postinstall.ts +51 -0
  377. package/src/seed.ts +43 -0
  378. package/src/self-host-compose.ts +452 -0
  379. package/src/storage-provision.ts +58 -0
  380. package/src/studio-admin-roles.ts +16 -0
  381. package/src/studio-dev-server.ts +53 -0
  382. package/src/supatype-eval-1781522769253.mts +1 -0
  383. package/src/systemd.ts +137 -0
  384. package/src/tsx-runner.ts +89 -0
  385. package/src/type-extractor.ts +1479 -0
  386. package/src/type-resolver.ts +457 -0
  387. package/tests/app-command.test.ts +54 -0
  388. package/tests/augmentation-generator.test.ts +59 -0
  389. package/tests/binary-cache-cloud-overrides.test.ts +123 -0
  390. package/tests/cached-artifact-format.test.ts +84 -0
  391. package/tests/cli-help.test.ts +133 -0
  392. package/tests/config.test.ts +252 -0
  393. package/tests/dev-ui.test.ts +139 -0
  394. package/tests/docker-postgres.test.ts +39 -0
  395. package/tests/engine-distribution.test.ts +418 -0
  396. package/tests/engine-push-output.test.ts +67 -0
  397. package/tests/ensure-binary.test.ts +59 -0
  398. package/tests/init.test.ts +127 -0
  399. package/tests/keys.test.ts +160 -0
  400. package/tests/migrate-from-v1.test.ts +29 -0
  401. package/tests/normalize-admin-config.test.ts +48 -0
  402. package/tests/pg-spawn-env.test.ts +18 -0
  403. package/tests/postgres-archive-tag.test.ts +9 -0
  404. package/tests/proxy-dev-app.test.ts +33 -0
  405. package/tests/pull-utils.test.ts +150 -0
  406. package/tests/release-pins.test.ts +28 -0
  407. package/tests/runtime-contract.test.ts +370 -0
  408. package/tests/seed-discover.test.ts +31 -0
  409. package/tests/studio-admin-roles.test.ts +27 -0
  410. package/tests/tsconfig.json +9 -0
  411. package/tests/tsx-runner.test.ts +66 -0
  412. package/tests/type-extractor.test.ts +985 -0
  413. package/tests/type-resolver.test.ts +59 -0
  414. package/tsconfig.json +10 -0
  415. package/tsconfig.tsbuildinfo +1 -0
  416. package/vitest.config.ts +12 -0
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Deploy commands:
3
+ * supatype deploy — Supatype Cloud by default (linked via supatype link), else platform projectRef; use --local for engine + DB
4
+ * supatype deploy --local — push schema via local engine + optional static app to .supatype/static
5
+ * supatype deploy --app-only — only build & deploy the static site
6
+ * supatype deploy --schema-only — only push schema changes
7
+ * supatype deploy --skip-build — deploy existing build output (no build step)
8
+ * supatype deploy --preview — deploy to a preview URL
9
+ * supatype deploy rollback — roll back to previous deployment
10
+ * supatype deploy status — show current deployment info
11
+ * supatype deploy logs <version> — show build logs
12
+ */
13
+
14
+ import type { Command } from "commander"
15
+ import { existsSync, readdirSync, statSync, createReadStream } from "node:fs"
16
+ import { join } from "node:path"
17
+ import { loadConfig, loadSchemaAst } from "../config.js"
18
+ import { connectionString, schemaPathFromProject } from "../project-config.js"
19
+ import { deploySchemaToLinkedProject, loadCloudConfig, pushSchemaToLinkedProject } from "./cloud.js"
20
+ import { ensureEngine, engineRequest, type DiffResult } from "../engine-client.js"
21
+ import { resolveAppConfig, validateStaticMode, validateBuildOutput, detectPackageManager } from "../app/framework.js"
22
+ import { TIER_LIMITS, type Tier } from "./deploy-types.js"
23
+ import { spawnSync } from "node:child_process"
24
+
25
+ export function registerDeploy(program: Command): void {
26
+ const deploy = program
27
+ .command("deploy")
28
+ .description(
29
+ "Deploy schema and app — Supatype Cloud by default when linked (`supatype link`); pass --local for engine + your database",
30
+ )
31
+ .option("--local", "Use local schema engine and database_url from config (skip cloud control plane)")
32
+ .option("--environment <name>", "Cloud environment when using linked project", "production")
33
+ .option("--app-only", "Skip schema push, only deploy the static site")
34
+ .option("--schema-only", "Skip app build, only push schema changes")
35
+ .option("--skip-build", "Deploy existing build output without building")
36
+ .option("--preview", "Deploy to a temporary preview URL")
37
+ .option("--yes", "Skip confirmation prompts")
38
+ .action(async (opts: {
39
+ local?: boolean
40
+ environment?: string
41
+ appOnly?: boolean
42
+ schemaOnly?: boolean
43
+ skipBuild?: boolean
44
+ preview?: boolean
45
+ yes?: boolean
46
+ }) => {
47
+ const cwd = process.cwd()
48
+ const config = loadConfig(cwd)
49
+ const cloudCfg = loadCloudConfig(cwd)
50
+
51
+ let schemaDone = false
52
+
53
+ // Default: cloud — .supatype/cloud.json → control plane schema deploy
54
+ if (
55
+ !opts.local &&
56
+ cloudCfg?.projectSlug &&
57
+ !opts.appOnly &&
58
+ !opts.skipBuild
59
+ ) {
60
+ await deploySchemaToLinkedProject(cwd, opts.environment ?? "production")
61
+ schemaDone = true
62
+ if (opts.schemaOnly) {
63
+ return
64
+ }
65
+ }
66
+
67
+ // Step 1: Schema push (unless --app-only or --skip-build, or already done via cloud.json)
68
+ if (!opts.appOnly && !opts.skipBuild && !schemaDone) {
69
+ const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
70
+
71
+ if (opts.local) {
72
+ console.log("=== Schema Push (local) ===")
73
+ await ensureEngine()
74
+
75
+ const diff = await engineRequest<DiffResult>("/diff", {
76
+ ast,
77
+ database_url: connectionString(config),
78
+ schema: "public",
79
+ })
80
+
81
+ const ops = diff.operations ?? []
82
+
83
+ if (ops.length > 0) {
84
+ console.log(`${ops.length} schema change(s) to apply.`)
85
+ await engineRequest("/push", {
86
+ ast,
87
+ database_url: connectionString(config),
88
+ schema: "public",
89
+ force: true,
90
+ })
91
+ console.log("Schema changes applied.")
92
+ } else {
93
+ console.log("Schema is up to date.")
94
+ }
95
+ } else if (cloudCfg?.projectSlug) {
96
+ console.log("=== Schema Push (cloud) ===")
97
+ await pushSchemaToLinkedProject(cwd, { force: opts.yes ?? true })
98
+ } else {
99
+ console.error(
100
+ "Not linked to Supatype Cloud. Run: supatype link\n" +
101
+ "Or deploy against your own database: supatype deploy --local",
102
+ )
103
+ process.exit(1)
104
+ }
105
+ }
106
+
107
+ // Step 2: App build & deploy (unless --schema-only)
108
+ if (!opts.schemaOnly) {
109
+ if (!config.build) {
110
+ if (opts.appOnly) {
111
+ console.error("No build section found in supatype.config.ts")
112
+ process.exit(1)
113
+ }
114
+ // No build config — skip app deployment silently
115
+ return
116
+ }
117
+
118
+ console.log("\n=== App Build & Deploy ===")
119
+ const appConfig = resolveAppConfig(config.build, cwd)
120
+
121
+ // Validate static mode
122
+ const staticError = validateStaticMode(appConfig.framework, appConfig.directory)
123
+ if (staticError) {
124
+ console.error(staticError)
125
+ process.exit(1)
126
+ }
127
+
128
+ // Build step
129
+ if (!opts.skipBuild && appConfig.buildCommand) {
130
+ console.log(`Framework: ${appConfig.framework}`)
131
+ console.log(`Build command: ${appConfig.buildCommand}`)
132
+ console.log(`Output directory: ${appConfig.outputDirectory}`)
133
+ console.log()
134
+
135
+ // Inject environment variables
136
+ const buildEnv: Record<string, string> = {
137
+ ...process.env as Record<string, string>,
138
+ ...appConfig.env,
139
+ }
140
+
141
+ // Inject Supatype URLs if project is linked
142
+ if (cloudCfg?.projectSlug) {
143
+ buildEnv["NEXT_PUBLIC_SUPATYPE_URL"] = cloudCfg.apiUrl || `https://${cloudCfg.projectSlug}.supatype.dev`
144
+ buildEnv["VITE_SUPATYPE_URL"] = buildEnv["NEXT_PUBLIC_SUPATYPE_URL"]!
145
+ buildEnv["PUBLIC_SUPATYPE_URL"] = buildEnv["NEXT_PUBLIC_SUPATYPE_URL"]!
146
+ // NEVER inject service_role key — only anon key is safe for client-side
147
+ }
148
+
149
+ // Install dependencies
150
+ const pm = detectPackageManager(appConfig.directory)
151
+ console.log(`Installing dependencies (${pm})...`)
152
+ const installResult = spawnSync(pm, ["install"], {
153
+ cwd: appConfig.directory,
154
+ stdio: "inherit",
155
+ env: buildEnv,
156
+ timeout: 5 * 60 * 1000, // 5 minute timeout
157
+ })
158
+ if (installResult.status !== 0) {
159
+ console.error("Dependency installation failed.")
160
+ process.exit(1)
161
+ }
162
+
163
+ // Run build
164
+ console.log("\nBuilding...")
165
+ const [buildCmd, ...buildArgs] = appConfig.buildCommand.split(" ")
166
+ const buildResult = spawnSync(buildCmd!, buildArgs, {
167
+ cwd: appConfig.directory,
168
+ stdio: "inherit",
169
+ env: buildEnv,
170
+ timeout: 10 * 60 * 1000, // 10 minute timeout
171
+ })
172
+ if (buildResult.status !== 0) {
173
+ console.error("Build failed.")
174
+ process.exit(1)
175
+ }
176
+ }
177
+
178
+ // Validate build output
179
+ const maxSizeMb = 500 // Default, should be tier-aware in cloud
180
+ const validationError = validateBuildOutput(appConfig.outputDirectory, maxSizeMb)
181
+ if (validationError) {
182
+ console.error(validationError)
183
+ process.exit(1)
184
+ }
185
+
186
+ // Deploy (--local never uploads to cloud, even if linked)
187
+ if (cloudCfg?.projectSlug && !opts.local) {
188
+ await deployToCloud(
189
+ { projectRef: cloudCfg.projectSlug, apiUrl: cloudCfg.apiUrl, accessToken: cloudCfg.token },
190
+ appConfig.outputDirectory,
191
+ opts.preview ?? false,
192
+ )
193
+ } else {
194
+ deploySelfHost(appConfig.outputDirectory, cwd)
195
+ }
196
+
197
+ console.log("\nDeployment complete!")
198
+ if (cloudCfg?.projectSlug && !opts.local) {
199
+ const url = opts.preview
200
+ ? `https://preview-${Date.now().toString(36)}.${cloudCfg.projectSlug}.supatype.dev`
201
+ : `https://${cloudCfg.projectSlug}.supatype.dev`
202
+ console.log(`URL: ${url}`)
203
+ }
204
+ }
205
+ })
206
+
207
+ // supatype deploy rollback
208
+ deploy
209
+ .command("rollback")
210
+ .description("Roll back to the previous static site deployment")
211
+ .action(async () => {
212
+ const cloudCfg = loadCloudConfig(process.cwd())
213
+ if (!cloudCfg?.projectSlug) {
214
+ console.error("Not linked to a cloud project. Rollback is only available for cloud deployments.")
215
+ process.exit(1)
216
+ }
217
+
218
+ const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
219
+ const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
220
+
221
+ const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/rollback`, {
222
+ method: "POST",
223
+ headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
224
+ })
225
+
226
+ if (!res.ok) {
227
+ const body = await res.text()
228
+ console.error(`Rollback failed: ${res.status} ${body}`)
229
+ process.exit(1)
230
+ }
231
+
232
+ const { data } = await res.json() as { data: { version: string; message: string } }
233
+ console.log(`Rolled back to deployment ${data.version}.`)
234
+ })
235
+
236
+ // supatype deploy status
237
+ deploy
238
+ .command("status")
239
+ .description("Show current deployment status")
240
+ .action(async () => {
241
+ const cloudCfg = loadCloudConfig(process.cwd())
242
+ if (!cloudCfg?.projectSlug) {
243
+ console.error("Not linked to a cloud project.")
244
+ process.exit(1)
245
+ }
246
+
247
+ const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
248
+ const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
249
+
250
+ const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments/current`, {
251
+ headers: { Authorization: `Bearer ${token}` },
252
+ })
253
+
254
+ if (!res.ok) {
255
+ console.error("No active deployment found.")
256
+ return
257
+ }
258
+
259
+ const { data } = await res.json() as { data: {
260
+ version: string
261
+ timestamp: string
262
+ size: number
263
+ buildDuration: number
264
+ url: string
265
+ status: string
266
+ }}
267
+
268
+ console.log(`Deployment: ${data.version}`)
269
+ console.log(`Status: ${data.status}`)
270
+ console.log(`Deployed: ${data.timestamp}`)
271
+ console.log(`Size: ${(data.size / (1024 * 1024)).toFixed(1)}MB`)
272
+ console.log(`Build duration: ${data.buildDuration}s`)
273
+ console.log(`URL: ${data.url}`)
274
+ })
275
+
276
+ // supatype deploy logs <version>
277
+ deploy
278
+ .command("logs [version]")
279
+ .description("Show build logs for a deployment")
280
+ .action(async (version?: string) => {
281
+ const cloudCfg = loadCloudConfig(process.cwd())
282
+ if (!cloudCfg?.projectSlug) {
283
+ console.error("Not linked to a cloud project.")
284
+ process.exit(1)
285
+ }
286
+
287
+ const apiUrl = cloudCfg.apiUrl || "https://api.supatype.com"
288
+ const token = cloudCfg.token || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
289
+
290
+ const versionPath = version ? `/${version}` : "/current"
291
+ const res = await fetch(`${apiUrl}/platform/v1/projects/${cloudCfg.projectSlug}/deployments${versionPath}/logs`, {
292
+ headers: { Authorization: `Bearer ${token}` },
293
+ })
294
+
295
+ if (!res.ok) {
296
+ console.error("Logs not found.")
297
+ process.exit(1)
298
+ }
299
+
300
+ const { data } = await res.json() as { data: { logs: string } }
301
+ console.log(data.logs)
302
+ })
303
+ }
304
+
305
+ async function deployToCloud(
306
+ config: { projectRef?: string; apiUrl?: string; accessToken?: string },
307
+ outputDir: string,
308
+ isPreview: boolean,
309
+ ): Promise<void> {
310
+ const apiUrl = config.apiUrl || "https://api.supatype.com"
311
+ const token = config.accessToken || process.env["SUPATYPE_ACCESS_TOKEN"] || ""
312
+
313
+ console.log("Uploading build artifacts...")
314
+
315
+ // Collect files from output directory
316
+ const files = collectFiles(outputDir, outputDir)
317
+ console.log(`${files.length} files to upload (${formatSize(files.reduce((s, f) => s + f.size, 0))})`)
318
+
319
+ // Create deployment
320
+ const createRes = await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments`, {
321
+ method: "POST",
322
+ headers: {
323
+ Authorization: `Bearer ${token}`,
324
+ "Content-Type": "application/json",
325
+ },
326
+ body: JSON.stringify({
327
+ preview: isPreview,
328
+ fileCount: files.length,
329
+ totalSize: files.reduce((s, f) => s + f.size, 0),
330
+ files: files.map((f) => ({ path: f.relativePath, size: f.size })),
331
+ }),
332
+ })
333
+
334
+ if (!createRes.ok) {
335
+ const body = await createRes.text()
336
+ throw new Error(`Failed to create deployment: ${createRes.status} ${body}`)
337
+ }
338
+
339
+ const { data } = await createRes.json() as { data: { deploymentId: string; uploadUrl: string } }
340
+
341
+ // Upload files (simplified — in production, use multipart or presigned URLs)
342
+ for (const file of files) {
343
+ const content = require("node:fs").readFileSync(file.absolutePath)
344
+ await fetch(`${data.uploadUrl}/${file.relativePath}`, {
345
+ method: "PUT",
346
+ headers: {
347
+ Authorization: `Bearer ${token}`,
348
+ "Content-Type": "application/octet-stream",
349
+ "X-Deployment-Id": data.deploymentId,
350
+ },
351
+ body: content,
352
+ })
353
+ }
354
+
355
+ // Finalize deployment
356
+ await fetch(`${apiUrl}/platform/v1/projects/${config.projectRef}/deployments/${data.deploymentId}/finalize`, {
357
+ method: "POST",
358
+ headers: { Authorization: `Bearer ${token}` },
359
+ })
360
+ }
361
+
362
+ function deploySelfHost(outputDir: string, cwd: string): void {
363
+ const servingDir = join(cwd, ".supatype", "static")
364
+ const { mkdirSync, cpSync } = require("node:fs") as typeof import("node:fs")
365
+ mkdirSync(servingDir, { recursive: true })
366
+ cpSync(outputDir, servingDir, { recursive: true })
367
+ console.log(`Static files deployed to ${servingDir}`)
368
+ }
369
+
370
+ interface FileEntry {
371
+ absolutePath: string
372
+ relativePath: string
373
+ size: number
374
+ }
375
+
376
+ function collectFiles(dir: string, baseDir: string): FileEntry[] {
377
+ const files: FileEntry[] = []
378
+ const { readdirSync, statSync } = require("node:fs") as typeof import("node:fs")
379
+ const { relative } = require("node:path") as typeof import("node:path")
380
+
381
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
382
+ const fullPath = join(dir, entry.name)
383
+ if (entry.isFile()) {
384
+ files.push({
385
+ absolutePath: fullPath,
386
+ relativePath: relative(baseDir, fullPath).replace(/\\/g, "/"),
387
+ size: statSync(fullPath).size,
388
+ })
389
+ } else if (entry.isDirectory()) {
390
+ files.push(...collectFiles(fullPath, baseDir))
391
+ }
392
+ }
393
+ return files
394
+ }
395
+
396
+ function formatSize(bytes: number): string {
397
+ if (bytes < 1024) return `${bytes}B`
398
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`
399
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`
400
+ }