@supatype/cli 0.1.0-alpha.6

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 (200) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test.log +7 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/bin/dev-entry.ts +2 -0
  5. package/bin/supatype.js +5 -0
  6. package/dist/app/framework.d.ts +44 -0
  7. package/dist/app/framework.d.ts.map +1 -0
  8. package/dist/app/framework.js +200 -0
  9. package/dist/app/framework.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +55 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/admin.d.ts +4 -0
  15. package/dist/commands/admin.d.ts.map +1 -0
  16. package/dist/commands/admin.js +270 -0
  17. package/dist/commands/admin.js.map +1 -0
  18. package/dist/commands/app.d.ts +3 -0
  19. package/dist/commands/app.d.ts.map +1 -0
  20. package/dist/commands/app.js +235 -0
  21. package/dist/commands/app.js.map +1 -0
  22. package/dist/commands/cloud.d.ts +3 -0
  23. package/dist/commands/cloud.d.ts.map +1 -0
  24. package/dist/commands/cloud.js +256 -0
  25. package/dist/commands/cloud.js.map +1 -0
  26. package/dist/commands/db.d.ts +8 -0
  27. package/dist/commands/db.d.ts.map +1 -0
  28. package/dist/commands/db.js +123 -0
  29. package/dist/commands/db.js.map +1 -0
  30. package/dist/commands/deploy-types.d.ts +14 -0
  31. package/dist/commands/deploy-types.d.ts.map +1 -0
  32. package/dist/commands/deploy-types.js +38 -0
  33. package/dist/commands/deploy-types.js.map +1 -0
  34. package/dist/commands/deploy.d.ts +14 -0
  35. package/dist/commands/deploy.d.ts.map +1 -0
  36. package/dist/commands/deploy.js +295 -0
  37. package/dist/commands/deploy.js.map +1 -0
  38. package/dist/commands/dev.d.ts +3 -0
  39. package/dist/commands/dev.d.ts.map +1 -0
  40. package/dist/commands/dev.js +428 -0
  41. package/dist/commands/dev.js.map +1 -0
  42. package/dist/commands/diff.d.ts +3 -0
  43. package/dist/commands/diff.d.ts.map +1 -0
  44. package/dist/commands/diff.js +39 -0
  45. package/dist/commands/diff.js.map +1 -0
  46. package/dist/commands/engine.d.ts +9 -0
  47. package/dist/commands/engine.d.ts.map +1 -0
  48. package/dist/commands/engine.js +99 -0
  49. package/dist/commands/engine.js.map +1 -0
  50. package/dist/commands/functions.d.ts +3 -0
  51. package/dist/commands/functions.d.ts.map +1 -0
  52. package/dist/commands/functions.js +762 -0
  53. package/dist/commands/functions.js.map +1 -0
  54. package/dist/commands/generate.d.ts +3 -0
  55. package/dist/commands/generate.d.ts.map +1 -0
  56. package/dist/commands/generate.js +28 -0
  57. package/dist/commands/generate.js.map +1 -0
  58. package/dist/commands/init.d.ts +7 -0
  59. package/dist/commands/init.d.ts.map +1 -0
  60. package/dist/commands/init.js +515 -0
  61. package/dist/commands/init.js.map +1 -0
  62. package/dist/commands/keys.d.ts +4 -0
  63. package/dist/commands/keys.d.ts.map +1 -0
  64. package/dist/commands/keys.js +57 -0
  65. package/dist/commands/keys.js.map +1 -0
  66. package/dist/commands/logs.d.ts +6 -0
  67. package/dist/commands/logs.d.ts.map +1 -0
  68. package/dist/commands/logs.js +52 -0
  69. package/dist/commands/logs.js.map +1 -0
  70. package/dist/commands/migrate.d.ts +3 -0
  71. package/dist/commands/migrate.d.ts.map +1 -0
  72. package/dist/commands/migrate.js +71 -0
  73. package/dist/commands/migrate.js.map +1 -0
  74. package/dist/commands/plugins.d.ts +3 -0
  75. package/dist/commands/plugins.d.ts.map +1 -0
  76. package/dist/commands/plugins.js +431 -0
  77. package/dist/commands/plugins.js.map +1 -0
  78. package/dist/commands/pull.d.ts +3 -0
  79. package/dist/commands/pull.d.ts.map +1 -0
  80. package/dist/commands/pull.js +73 -0
  81. package/dist/commands/pull.js.map +1 -0
  82. package/dist/commands/push.d.ts +3 -0
  83. package/dist/commands/push.d.ts.map +1 -0
  84. package/dist/commands/push.js +87 -0
  85. package/dist/commands/push.js.map +1 -0
  86. package/dist/commands/seed.d.ts +3 -0
  87. package/dist/commands/seed.d.ts.map +1 -0
  88. package/dist/commands/seed.js +22 -0
  89. package/dist/commands/seed.js.map +1 -0
  90. package/dist/commands/self-host.d.ts +3 -0
  91. package/dist/commands/self-host.d.ts.map +1 -0
  92. package/dist/commands/self-host.js +796 -0
  93. package/dist/commands/self-host.js.map +1 -0
  94. package/dist/commands/status.d.ts +6 -0
  95. package/dist/commands/status.d.ts.map +1 -0
  96. package/dist/commands/status.js +69 -0
  97. package/dist/commands/status.js.map +1 -0
  98. package/dist/config.d.ts +106 -0
  99. package/dist/config.d.ts.map +1 -0
  100. package/dist/config.js +66 -0
  101. package/dist/config.js.map +1 -0
  102. package/dist/engine/cache.d.ts +37 -0
  103. package/dist/engine/cache.d.ts.map +1 -0
  104. package/dist/engine/cache.js +121 -0
  105. package/dist/engine/cache.js.map +1 -0
  106. package/dist/engine/download.d.ts +19 -0
  107. package/dist/engine/download.d.ts.map +1 -0
  108. package/dist/engine/download.js +108 -0
  109. package/dist/engine/download.js.map +1 -0
  110. package/dist/engine/platform.d.ts +24 -0
  111. package/dist/engine/platform.d.ts.map +1 -0
  112. package/dist/engine/platform.js +50 -0
  113. package/dist/engine/platform.js.map +1 -0
  114. package/dist/engine/resolve.d.ts +37 -0
  115. package/dist/engine/resolve.d.ts.map +1 -0
  116. package/dist/engine/resolve.js +133 -0
  117. package/dist/engine/resolve.js.map +1 -0
  118. package/dist/engine/update-notify.d.ts +11 -0
  119. package/dist/engine/update-notify.d.ts.map +1 -0
  120. package/dist/engine/update-notify.js +43 -0
  121. package/dist/engine/update-notify.js.map +1 -0
  122. package/dist/engine/verify.d.ts +50 -0
  123. package/dist/engine/verify.d.ts.map +1 -0
  124. package/dist/engine/verify.js +161 -0
  125. package/dist/engine/verify.js.map +1 -0
  126. package/dist/engine-version.d.ts +35 -0
  127. package/dist/engine-version.d.ts.map +1 -0
  128. package/dist/engine-version.js +35 -0
  129. package/dist/engine-version.js.map +1 -0
  130. package/dist/engine.d.ts +34 -0
  131. package/dist/engine.d.ts.map +1 -0
  132. package/dist/engine.js +76 -0
  133. package/dist/engine.js.map +1 -0
  134. package/dist/index.d.ts +12 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +10 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/jwt.d.ts +3 -0
  139. package/dist/jwt.d.ts.map +1 -0
  140. package/dist/jwt.js +13 -0
  141. package/dist/jwt.js.map +1 -0
  142. package/dist/pull-utils.d.ts +16 -0
  143. package/dist/pull-utils.d.ts.map +1 -0
  144. package/dist/pull-utils.js +65 -0
  145. package/dist/pull-utils.js.map +1 -0
  146. package/dist/scripts/postinstall.d.ts +12 -0
  147. package/dist/scripts/postinstall.d.ts.map +1 -0
  148. package/dist/scripts/postinstall.js +31 -0
  149. package/dist/scripts/postinstall.js.map +1 -0
  150. package/dist/tsx-runner.d.ts +18 -0
  151. package/dist/tsx-runner.d.ts.map +1 -0
  152. package/dist/tsx-runner.js +62 -0
  153. package/dist/tsx-runner.js.map +1 -0
  154. package/package.json +36 -0
  155. package/src/app/framework.ts +249 -0
  156. package/src/cli.ts +58 -0
  157. package/src/commands/admin.ts +371 -0
  158. package/src/commands/app.ts +261 -0
  159. package/src/commands/cloud.ts +326 -0
  160. package/src/commands/db.ts +145 -0
  161. package/src/commands/deploy-types.ts +49 -0
  162. package/src/commands/deploy.ts +366 -0
  163. package/src/commands/dev.ts +477 -0
  164. package/src/commands/diff.ts +61 -0
  165. package/src/commands/engine.ts +133 -0
  166. package/src/commands/functions.ts +919 -0
  167. package/src/commands/generate.ts +31 -0
  168. package/src/commands/init.ts +532 -0
  169. package/src/commands/keys.ts +66 -0
  170. package/src/commands/logs.ts +58 -0
  171. package/src/commands/migrate.ts +83 -0
  172. package/src/commands/plugins.ts +508 -0
  173. package/src/commands/pull.ts +96 -0
  174. package/src/commands/push.ts +119 -0
  175. package/src/commands/seed.ts +26 -0
  176. package/src/commands/self-host.ts +932 -0
  177. package/src/commands/status.ts +83 -0
  178. package/src/config.ts +190 -0
  179. package/src/engine/cache.ts +135 -0
  180. package/src/engine/download.ts +143 -0
  181. package/src/engine/platform.ts +66 -0
  182. package/src/engine/resolve.ts +197 -0
  183. package/src/engine/update-notify.ts +50 -0
  184. package/src/engine/verify.ts +206 -0
  185. package/src/engine-version.ts +39 -0
  186. package/src/engine.ts +99 -0
  187. package/src/index.ts +19 -0
  188. package/src/jwt.ts +14 -0
  189. package/src/pull-utils.ts +57 -0
  190. package/src/scripts/postinstall.ts +40 -0
  191. package/src/tsx-runner.ts +79 -0
  192. package/tests/cli-help.test.ts +107 -0
  193. package/tests/config.test.ts +117 -0
  194. package/tests/engine-distribution.test.ts +418 -0
  195. package/tests/init.test.ts +184 -0
  196. package/tests/keys.test.ts +160 -0
  197. package/tests/pull-utils.test.ts +115 -0
  198. package/tests/tsx-runner.test.ts +66 -0
  199. package/tsconfig.json +10 -0
  200. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,428 @@
1
+ import { spawnSync, spawn } from "node:child_process";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { loadConfig } from "../config.js";
5
+ import { ensureEngine, invokeEngine } from "../engine.js";
6
+ const POSTGREST_URL = "http://localhost:3000";
7
+ const HEALTH_TIMEOUT_MS = 60_000;
8
+ const HEALTH_POLL_MS = 2_000;
9
+ export function registerDev(program) {
10
+ program
11
+ .command("dev")
12
+ .description("Start local Postgres, PostgREST, and Kong via Docker Compose, then watch for schema changes")
13
+ .option("--no-watch", "Start services but do not watch for schema changes")
14
+ .option("--local", "Run storage, realtime, and studio from source (monorepo dev)")
15
+ .action(async (opts) => {
16
+ const cwd = process.cwd();
17
+ // Generate .env with local defaults if missing
18
+ ensureDevEnv(cwd);
19
+ if (opts.local) {
20
+ // Monorepo dev — generate an infra-only compose if needed, then start
21
+ const composePath = resolve(cwd, "docker-compose.yml");
22
+ if (!existsSync(composePath)) {
23
+ ensureInfraCompose(cwd);
24
+ }
25
+ console.log("Starting infra services...");
26
+ const up = spawnSync("docker", ["compose", "up", "-d", "--wait", "db", "pgbouncer", "gotrue", "postgrest", "minio", "kong"], { cwd, stdio: "inherit" });
27
+ if (up.status !== 0) {
28
+ console.error("docker compose up failed.");
29
+ process.exit(1);
30
+ }
31
+ }
32
+ else {
33
+ if (!existsSync(resolve(cwd, "docker-compose.yml"))) {
34
+ console.error("docker-compose.yml not found. Run: supatype init");
35
+ process.exit(1);
36
+ }
37
+ console.log("Starting services...");
38
+ const up = spawnSync("docker", ["compose", "up", "-d", "--wait"], { cwd, stdio: "inherit" });
39
+ if (up.status !== 0) {
40
+ console.error("docker compose up failed.");
41
+ process.exit(1);
42
+ }
43
+ }
44
+ console.log("Waiting for PostgREST to be ready...");
45
+ await waitForPostgREST();
46
+ const children = [];
47
+ if (opts.local) {
48
+ console.log("\nStarting local services from source...");
49
+ children.push(...startLocalServices(cwd));
50
+ }
51
+ console.log("\nServices running:");
52
+ console.log(" Postgres postgresql://localhost:5432");
53
+ console.log(" PostgREST http://localhost:3000");
54
+ console.log(" Kong http://localhost:8000");
55
+ console.log(" REST API http://localhost:8000/rest/v1/");
56
+ console.log(" GraphQL http://localhost:8000/graphql/v1");
57
+ if (opts.local) {
58
+ console.log(" Storage http://localhost:5000 (from source)");
59
+ console.log(" Realtime http://localhost:4000 (from source)");
60
+ console.log(" Studio http://localhost:3002 (from source)");
61
+ }
62
+ console.log();
63
+ // Clean shutdown on Ctrl+C
64
+ const cleanup = () => {
65
+ for (const child of children) {
66
+ child.kill();
67
+ }
68
+ process.exit(0);
69
+ };
70
+ process.on("SIGINT", cleanup);
71
+ process.on("SIGTERM", cleanup);
72
+ if (opts.watch) {
73
+ await watchAndPush(cwd);
74
+ }
75
+ });
76
+ }
77
+ function ensureInfraCompose(cwd) {
78
+ const projectName = resolve(cwd).split(/[\\/]/).pop() ?? "supatype";
79
+ const content = `# Generated by supatype dev --local — infra services only
80
+ services:
81
+ db:
82
+ image: supatype/postgres:17-latest
83
+ environment:
84
+ POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
85
+ POSTGRES_DB: \${POSTGRES_DB:-${projectName}}
86
+ ports:
87
+ - "5432:5432"
88
+ volumes:
89
+ - db-data:/var/lib/postgresql/data
90
+ healthcheck:
91
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
92
+ interval: 5s
93
+ timeout: 5s
94
+ retries: 20
95
+
96
+ pgbouncer:
97
+ image: pgbouncer/pgbouncer:latest
98
+ volumes:
99
+ - ./.supatype/pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini:ro
100
+ - ./.supatype/userlist.txt:/etc/pgbouncer/userlist.txt:ro
101
+ depends_on:
102
+ db:
103
+ condition: service_healthy
104
+ healthcheck:
105
+ test: ["CMD", "pg_isready", "-h", "localhost", "-p", "6432", "-U", "postgres"]
106
+ interval: 5s
107
+ timeout: 5s
108
+ retries: 10
109
+
110
+ gotrue:
111
+ image: supatype/auth:v1.0.0
112
+ environment:
113
+ GOTRUE_API_HOST: 0.0.0.0
114
+ GOTRUE_API_PORT: 9999
115
+ GOTRUE_DB_DRIVER: postgres
116
+ GOTRUE_DB_DATABASE_URL: "postgres://postgres:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}?search_path=auth"
117
+ GOTRUE_SITE_URL: \${SITE_URL:-http://localhost:3000}
118
+ GOTRUE_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
119
+ GOTRUE_JWT_EXP: 3600
120
+ GOTRUE_JWT_AUD: authenticated
121
+ GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
122
+ GOTRUE_JWT_ADMIN_ROLES: service_role
123
+ GOTRUE_MAILER_AUTOCONFIRM: \${GOTRUE_MAILER_AUTOCONFIRM:-true}
124
+ GOTRUE_DISABLE_SIGNUP: \${DISABLE_SIGNUP:-false}
125
+ ports:
126
+ - "9999:9999"
127
+ depends_on:
128
+ pgbouncer:
129
+ condition: service_healthy
130
+
131
+ postgrest:
132
+ image: postgrest/postgrest:v12.2.8
133
+ environment:
134
+ PGRST_DB_URI: postgresql://authenticator:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}
135
+ PGRST_DB_SCHEMA: public
136
+ PGRST_DB_ANON_ROLE: anon
137
+ PGRST_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
138
+ PGRST_DB_EXTRA_SEARCH_PATH: public,extensions
139
+ PGRST_DB_POOL: 3
140
+ ports:
141
+ - "3000:3000"
142
+ depends_on:
143
+ pgbouncer:
144
+ condition: service_healthy
145
+
146
+ minio:
147
+ image: minio/minio:RELEASE.2024-11-07T00-52-20Z
148
+ command: server /data --console-address ":9001"
149
+ environment:
150
+ MINIO_ROOT_USER: supatype
151
+ MINIO_ROOT_PASSWORD: supatype-secret
152
+ ports:
153
+ - "9000:9000"
154
+ - "9001:9001"
155
+ volumes:
156
+ - minio-data:/data
157
+ healthcheck:
158
+ test: ["CMD", "mc", "ready", "local"]
159
+ interval: 5s
160
+ timeout: 5s
161
+ retries: 10
162
+
163
+ kong:
164
+ image: kong:3.6
165
+ environment:
166
+ KONG_DATABASE: "off"
167
+ KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml
168
+ KONG_PROXY_ACCESS_LOG: /dev/stdout
169
+ KONG_ADMIN_ACCESS_LOG: /dev/stdout
170
+ KONG_PROXY_ERROR_LOG: /dev/stderr
171
+ KONG_ADMIN_ERROR_LOG: /dev/stderr
172
+ volumes:
173
+ - ./.supatype/kong.yml:/etc/kong/kong.yml:ro
174
+ ports:
175
+ - "8000:8000"
176
+ depends_on:
177
+ - postgrest
178
+ - gotrue
179
+
180
+ volumes:
181
+ db-data:
182
+ minio-data:
183
+ `;
184
+ writeFileSync(resolve(cwd, "docker-compose.yml"), content, "utf8");
185
+ console.log(" created docker-compose.yml (infra only)\n");
186
+ // Also ensure pgbouncer config exists
187
+ const supatypeDir = resolve(cwd, ".supatype");
188
+ mkdirSync(supatypeDir, { recursive: true });
189
+ if (!existsSync(resolve(supatypeDir, "pgbouncer.ini"))) {
190
+ writeFileSync(resolve(supatypeDir, "pgbouncer.ini"), `[databases]
191
+ * = host=db port=5432
192
+
193
+ [pgbouncer]
194
+ listen_addr = 0.0.0.0
195
+ listen_port = 6432
196
+ auth_type = trust
197
+ auth_file = /etc/pgbouncer/userlist.txt
198
+ pool_mode = transaction
199
+ default_pool_size = 20
200
+ max_db_connections = 60
201
+ max_client_conn = 100
202
+ server_reset_query = DEALLOCATE ALL
203
+ ignore_startup_parameters = extra_float_digits
204
+ `, "utf8");
205
+ }
206
+ if (!existsSync(resolve(supatypeDir, "userlist.txt"))) {
207
+ writeFileSync(resolve(supatypeDir, "userlist.txt"), "", "utf8");
208
+ }
209
+ if (!existsSync(resolve(supatypeDir, "kong.yml"))) {
210
+ writeFileSync(resolve(supatypeDir, "kong.yml"), `_format_version: "3.0"
211
+
212
+ services:
213
+ - name: rest-v1
214
+ url: http://postgrest:3000
215
+ routes:
216
+ - name: rest-v1-all
217
+ strip_path: true
218
+ paths:
219
+ - /rest/v1/
220
+ - name: auth-v1
221
+ url: http://gotrue:9999
222
+ routes:
223
+ - name: auth-v1-all
224
+ strip_path: true
225
+ paths:
226
+ - /auth/v1/
227
+ - name: storage-v1
228
+ url: http://host.docker.internal:5000
229
+ routes:
230
+ - name: storage-v1-all
231
+ strip_path: true
232
+ paths:
233
+ - /storage/v1/
234
+ - name: realtime-v1
235
+ url: http://host.docker.internal:4000
236
+ routes:
237
+ - name: realtime-v1-all
238
+ strip_path: true
239
+ paths:
240
+ - /realtime/v1/
241
+ protocols:
242
+ - http
243
+ - https
244
+ - ws
245
+ - wss
246
+ - name: functions-v1
247
+ url: http://host.docker.internal:54321
248
+ routes:
249
+ - name: functions-v1-all
250
+ strip_path: false
251
+ paths:
252
+ - /functions/v1/
253
+ - name: studio
254
+ url: http://host.docker.internal:3002
255
+ routes:
256
+ - name: studio-all
257
+ strip_path: true
258
+ paths:
259
+ - /studio/
260
+ `, "utf8");
261
+ }
262
+ }
263
+ function ensureDevEnv(cwd) {
264
+ const envPath = resolve(cwd, ".env");
265
+ if (existsSync(envPath))
266
+ return;
267
+ const projectName = resolve(cwd).split(/[\\/]/).pop() ?? "supatype";
268
+ const content = `# Generated by supatype dev — all defaults for local development
269
+ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/${projectName}
270
+ POSTGRES_PASSWORD=postgres
271
+ POSTGRES_DB=${projectName}
272
+
273
+ JWT_SECRET=super-secret-jwt-token-change-in-production
274
+ ANON_KEY=
275
+ SERVICE_ROLE_KEY=
276
+
277
+ SITE_URL=http://localhost:3000
278
+
279
+ # Storage (MinIO)
280
+ S3_ENDPOINT=http://localhost:9000
281
+ S3_REGION=us-east-1
282
+ S3_ACCESS_KEY=supatype
283
+ S3_SECRET_KEY=supatype-secret
284
+ S3_FORCE_PATH_STYLE=true
285
+
286
+ # SMTP — leave empty for email autoconfirm in dev
287
+ SMTP_HOST=
288
+ SMTP_PORT=
289
+ SMTP_USER=
290
+ SMTP_PASS=
291
+ `;
292
+ writeFileSync(envPath, content, "utf8");
293
+ console.log(" created .env (local dev defaults)\n");
294
+ }
295
+ function loadDotEnv(cwd) {
296
+ const envPath = resolve(cwd, ".env");
297
+ if (!existsSync(envPath))
298
+ return {};
299
+ const vars = {};
300
+ for (const line of readFileSync(envPath, "utf8").split("\n")) {
301
+ const trimmed = line.trim();
302
+ if (!trimmed || trimmed.startsWith("#"))
303
+ continue;
304
+ const eq = trimmed.indexOf("=");
305
+ if (eq === -1)
306
+ continue;
307
+ const key = trimmed.slice(0, eq);
308
+ const value = trimmed.slice(eq + 1);
309
+ vars[key] = value;
310
+ }
311
+ return vars;
312
+ }
313
+ function localDevDefaults(cwd) {
314
+ const projectName = resolve(cwd).split(/[\\/]/).pop() ?? "supatype";
315
+ // Known defaults that match docker-compose local dev setup
316
+ const defaults = {
317
+ DATABASE_URL: `postgresql://postgres:postgres@localhost:5432/${projectName}`,
318
+ POSTGRES_PASSWORD: "postgres",
319
+ POSTGRES_DB: projectName,
320
+ JWT_SECRET: "super-secret-jwt-token-change-in-production",
321
+ SITE_URL: "http://localhost:3000",
322
+ S3_ENDPOINT: "http://localhost:9000",
323
+ S3_REGION: "us-east-1",
324
+ S3_ACCESS_KEY: "supatype",
325
+ S3_SECRET_KEY: "supatype-secret",
326
+ S3_FORCE_PATH_STYLE: "true",
327
+ SLOT_NAME: "realtime_slot",
328
+ REPLICATION_POLL_INTERVAL: "100",
329
+ SECURE_CHANNELS: "true",
330
+ };
331
+ // .env file values override defaults
332
+ const dotEnv = loadDotEnv(cwd);
333
+ return { ...defaults, ...dotEnv };
334
+ }
335
+ function startLocalServices(cwd) {
336
+ const children = [];
337
+ const devEnv = localDevDefaults(cwd);
338
+ const services = [
339
+ { name: "storage", filter: "@supatype/storage", color: "\x1b[34m" },
340
+ { name: "realtime", filter: "@supatype/realtime", color: "\x1b[35m" },
341
+ { name: "studio", filter: "@supatype/studio", color: "\x1b[36m" },
342
+ ];
343
+ for (const svc of services) {
344
+ const pkgDir = resolve(cwd, "..", "packages", svc.name);
345
+ if (!existsSync(resolve(pkgDir, "package.json"))) {
346
+ console.warn(` Skipping ${svc.name} — not found at ${pkgDir}`);
347
+ continue;
348
+ }
349
+ const reset = "\x1b[0m";
350
+ const prefix = `${svc.color}[${svc.name}]${reset}`;
351
+ const child = spawn("pnpm", ["dev"], {
352
+ cwd: pkgDir,
353
+ stdio: ["ignore", "pipe", "pipe"],
354
+ shell: true,
355
+ env: {
356
+ ...process.env,
357
+ ...devEnv,
358
+ PORT: svc.name === "storage" ? "5000" : svc.name === "realtime" ? "4000" : "3002",
359
+ },
360
+ });
361
+ child.stdout?.on("data", (data) => {
362
+ for (const line of data.toString().trimEnd().split("\n")) {
363
+ console.log(`${prefix} ${line}`);
364
+ }
365
+ });
366
+ child.stderr?.on("data", (data) => {
367
+ for (const line of data.toString().trimEnd().split("\n")) {
368
+ console.error(`${prefix} ${line}`);
369
+ }
370
+ });
371
+ child.on("exit", (code) => {
372
+ if (code !== 0 && code !== null) {
373
+ console.error(`${prefix} exited with code ${code}`);
374
+ }
375
+ });
376
+ children.push(child);
377
+ console.log(` ${prefix} started (pnpm dev)`);
378
+ }
379
+ return children;
380
+ }
381
+ async function waitForPostgREST() {
382
+ const deadline = Date.now() + HEALTH_TIMEOUT_MS;
383
+ while (Date.now() < deadline) {
384
+ try {
385
+ const res = await fetch(POSTGREST_URL, { signal: AbortSignal.timeout(2000) });
386
+ if (res.ok || res.status === 401)
387
+ return; // 401 = JWT required = server up
388
+ }
389
+ catch {
390
+ // not ready yet
391
+ }
392
+ await sleep(HEALTH_POLL_MS);
393
+ }
394
+ throw new Error(`PostgREST did not become healthy within ${HEALTH_TIMEOUT_MS / 1000}s.\n` +
395
+ "Check: docker compose logs postgrest");
396
+ }
397
+ async function watchAndPush(cwd) {
398
+ const config = loadConfig(cwd);
399
+ const schemaDir = resolve(cwd, config.schema, "..");
400
+ console.log(`Watching ${schemaDir} for changes... (Ctrl+C to stop)\n`);
401
+ // Initial push on start
402
+ await runPush(cwd);
403
+ const { watch } = await import("node:fs");
404
+ watch(schemaDir, { recursive: true }, (eventType, filename) => {
405
+ if (!filename?.endsWith(".ts"))
406
+ return;
407
+ console.log(`\nChange detected in ${filename}, pushing...`);
408
+ runPush(cwd).catch((e) => console.error("Push failed:", e.message));
409
+ });
410
+ // Block forever
411
+ await new Promise(() => undefined);
412
+ }
413
+ async function runPush(cwd) {
414
+ const { loadConfig, loadSchemaAst } = await import("../config.js");
415
+ const config = loadConfig(cwd);
416
+ const ast = loadSchemaAst(config.schema, cwd);
417
+ await ensureEngine();
418
+ const result = invokeEngine(["migrate", "--connection", config.connection], JSON.stringify(ast));
419
+ if (result.exitCode !== 0) {
420
+ console.error(result.stderr || result.stdout);
421
+ return;
422
+ }
423
+ console.log(result.stdout || "Schema up to date.");
424
+ }
425
+ function sleep(ms) {
426
+ return new Promise((r) => setTimeout(r, ms));
427
+ }
428
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerDiff(program: Command): void;
3
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgDnD"}
@@ -0,0 +1,39 @@
1
+ import { loadConfig, loadSchemaAst } from "../config.js";
2
+ import { ensureEngine, invokeEngine } from "../engine.js";
3
+ export function registerDiff(program) {
4
+ program
5
+ .command("diff")
6
+ .description("Show planned schema changes without applying them (dry run)")
7
+ .option("--connection <url>", "Database connection URL (overrides config)")
8
+ .action(async (opts) => {
9
+ const cwd = process.cwd();
10
+ const config = loadConfig(cwd);
11
+ const connection = opts.connection ?? config.connection;
12
+ await ensureEngine();
13
+ console.log("Loading schema...");
14
+ const ast = loadSchemaAst(config.schema, cwd);
15
+ const result = invokeEngine(["diff", "--connection", connection, "--format", "json"], JSON.stringify(ast));
16
+ if (result.exitCode !== 0) {
17
+ console.error(result.stderr || result.stdout);
18
+ process.exit(1);
19
+ }
20
+ const diff = JSON.parse(result.stdout);
21
+ const ops = diff.operations ?? [];
22
+ if (ops.length === 0) {
23
+ console.log("No changes.");
24
+ return;
25
+ }
26
+ const symbol = { safe: "+", cautious: "~", destructive: "!" };
27
+ const legend = { safe: "safe", cautious: "cautious", destructive: "DESTRUCTIVE" };
28
+ console.log(`\n${ops.length} change(s):\n`);
29
+ for (const op of ops) {
30
+ console.log(` [${symbol[op.risk]}] ${op.description} (${legend[op.risk]})`);
31
+ }
32
+ const destructive = ops.filter((o) => o.risk === "destructive").length;
33
+ if (destructive > 0) {
34
+ console.log(`\n ${destructive} destructive operation(s). Run with --yes to skip confirmation.`);
35
+ }
36
+ console.log();
37
+ });
38
+ }
39
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAUzD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACzB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAA;QAEvD,MAAM,YAAY,EAAE,CAAA;QAEpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAChC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,YAAY,CACzB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CACpB,CAAA;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAe,CAAA;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAEjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC1B,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;QAC7D,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,CAAA;QAEjF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,eAAe,CAAC,CAAA;QAC3C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CACT,MAAM,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,MAAM,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CACjE,CAAA;QACH,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,MAAM,CAAA;QACtE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,iEAAiE,CAAC,CAAA;QAClG,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Engine management commands:
3
+ * supatype engine version — show pinned, cached, and latest versions
4
+ * supatype engine update-check — check for newer engine versions
5
+ * supatype engine prune — remove old cached engine versions
6
+ */
7
+ import type { Command } from "commander";
8
+ export declare function registerEngine(program: Command): void;
9
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/commands/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkHrD"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Engine management commands:
3
+ * supatype engine version — show pinned, cached, and latest versions
4
+ * supatype engine update-check — check for newer engine versions
5
+ * supatype engine prune — remove old cached engine versions
6
+ */
7
+ import { ENGINE_VERSION } from "../engine-version.js";
8
+ import { detectPlatform } from "../engine/platform.js";
9
+ import { hasCachedBinary, listCachedVersions, pruneCacheExcept, saveUpdateCheck, } from "../engine/cache.js";
10
+ import { checkLatestVersion } from "../engine/resolve.js";
11
+ export function registerEngine(program) {
12
+ const engine = program
13
+ .command("engine")
14
+ .description("Manage the Supatype engine binary");
15
+ // supatype engine version
16
+ engine
17
+ .command("version")
18
+ .description("Show engine version information")
19
+ .action(async () => {
20
+ const platform = detectPlatform();
21
+ const cached = hasCachedBinary(ENGINE_VERSION, platform);
22
+ const cachedVersions = listCachedVersions();
23
+ console.log(`Engine: v${ENGINE_VERSION} (pinned)`);
24
+ console.log(`Cache: ${cached ? `v${ENGINE_VERSION} ✓` : "not downloaded"}`);
25
+ if (cachedVersions.length > 1) {
26
+ const others = cachedVersions.filter((v) => v !== ENGINE_VERSION);
27
+ console.log(`Other cached versions: ${others.join(", ")}`);
28
+ }
29
+ // Check latest
30
+ try {
31
+ const latest = await checkLatestVersion();
32
+ if (latest) {
33
+ await saveUpdateCheck(latest.version);
34
+ if (latest.version !== ENGINE_VERSION) {
35
+ console.log(`Latest: v${latest.version} — update available, run: npm update @supatype/cli`);
36
+ }
37
+ else {
38
+ console.log(`Latest: v${latest.version} (up to date)`);
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ console.log("Latest: unable to check (offline?)");
44
+ }
45
+ });
46
+ // supatype engine update-check
47
+ engine
48
+ .command("update-check")
49
+ .description("Check if a newer engine version is available")
50
+ .action(async () => {
51
+ const latest = await checkLatestVersion();
52
+ if (!latest) {
53
+ console.error("Could not check for updates. Check your internet connection.");
54
+ process.exitCode = 1;
55
+ return;
56
+ }
57
+ await saveUpdateCheck(latest.version);
58
+ if (latest.version !== ENGINE_VERSION) {
59
+ console.log(`Supatype engine v${latest.version} is available (current: v${ENGINE_VERSION}).`);
60
+ console.log(`Run: npm update @supatype/cli`);
61
+ }
62
+ else {
63
+ console.log(`Engine v${ENGINE_VERSION} is up to date.`);
64
+ }
65
+ });
66
+ // supatype engine prune
67
+ engine
68
+ .command("prune")
69
+ .description("Remove all cached engine versions except the current one")
70
+ .action(() => {
71
+ const { removed, bytesFreed } = pruneCacheExcept(ENGINE_VERSION);
72
+ if (removed.length === 0) {
73
+ console.log("Nothing to prune — only the current version is cached.");
74
+ return;
75
+ }
76
+ const mb = (bytesFreed / (1024 * 1024)).toFixed(1);
77
+ console.log(`Removed ${removed.length} cached version(s): ${removed.join(", ")}`);
78
+ console.log(`Space reclaimed: ${mb}MB`);
79
+ });
80
+ // supatype engine versions (list all released versions)
81
+ engine
82
+ .command("versions")
83
+ .description("List all released engine versions")
84
+ .action(async () => {
85
+ const { fetchJson } = await import("../engine/download.js");
86
+ const { CDN_BASE_URL } = await import("../engine-version.js");
87
+ const versions = await fetchJson(`${CDN_BASE_URL}/versions.json`);
88
+ if (!versions || versions.length === 0) {
89
+ console.log("No released versions found.");
90
+ return;
91
+ }
92
+ console.log("Released engine versions:");
93
+ for (const v of versions) {
94
+ const current = v.version === ENGINE_VERSION ? " (current)" : "";
95
+ console.log(` v${v.version} ${v.date}${current}`);
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/commands/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerFunctions(program: Command): void;
3
+ //# sourceMappingURL=functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/commands/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsBxC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsFxD"}