@supatype/cli 0.1.0-alpha.6 → 0.1.0-alpha.8

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 (350) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +208 -1
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/dist/app/proxy-dev-app.d.ts +13 -0
  5. package/dist/app/proxy-dev-app.d.ts.map +1 -0
  6. package/dist/app/proxy-dev-app.js +53 -0
  7. package/dist/app/proxy-dev-app.js.map +1 -0
  8. package/dist/app-config.d.ts +7 -0
  9. package/dist/app-config.d.ts.map +1 -0
  10. package/dist/app-config.js +113 -0
  11. package/dist/app-config.js.map +1 -0
  12. package/dist/augmentation-generator.d.ts +2 -0
  13. package/dist/augmentation-generator.d.ts.map +1 -0
  14. package/dist/augmentation-generator.js +111 -0
  15. package/dist/augmentation-generator.js.map +1 -0
  16. package/dist/binary-cache.d.ts +94 -0
  17. package/dist/binary-cache.d.ts.map +1 -0
  18. package/dist/binary-cache.js +669 -0
  19. package/dist/binary-cache.js.map +1 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +13 -7
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/admin.d.ts.map +1 -1
  24. package/dist/commands/admin.js +4 -3
  25. package/dist/commands/admin.js.map +1 -1
  26. package/dist/commands/app.d.ts.map +1 -1
  27. package/dist/commands/app.js +56 -209
  28. package/dist/commands/app.js.map +1 -1
  29. package/dist/commands/cache.d.ts +6 -0
  30. package/dist/commands/cache.d.ts.map +1 -0
  31. package/dist/commands/cache.js +105 -0
  32. package/dist/commands/cache.js.map +1 -0
  33. package/dist/commands/cloud.d.ts +20 -0
  34. package/dist/commands/cloud.d.ts.map +1 -1
  35. package/dist/commands/cloud.js +50 -52
  36. package/dist/commands/cloud.js.map +1 -1
  37. package/dist/commands/db.d.ts.map +1 -1
  38. package/dist/commands/db.js +47 -54
  39. package/dist/commands/db.js.map +1 -1
  40. package/dist/commands/deploy.d.ts +2 -1
  41. package/dist/commands/deploy.d.ts.map +1 -1
  42. package/dist/commands/deploy.js +79 -52
  43. package/dist/commands/deploy.js.map +1 -1
  44. package/dist/commands/dev.d.ts +11 -0
  45. package/dist/commands/dev.d.ts.map +1 -1
  46. package/dist/commands/dev.js +759 -385
  47. package/dist/commands/dev.js.map +1 -1
  48. package/dist/commands/diff.d.ts.map +1 -1
  49. package/dist/commands/diff.js +30 -15
  50. package/dist/commands/diff.js.map +1 -1
  51. package/dist/commands/engine.d.ts +1 -3
  52. package/dist/commands/engine.d.ts.map +1 -1
  53. package/dist/commands/engine.js +13 -85
  54. package/dist/commands/engine.js.map +1 -1
  55. package/dist/commands/functions.d.ts.map +1 -1
  56. package/dist/commands/functions.js +92 -105
  57. package/dist/commands/functions.js.map +1 -1
  58. package/dist/commands/generate.d.ts.map +1 -1
  59. package/dist/commands/generate.js +22 -12
  60. package/dist/commands/generate.js.map +1 -1
  61. package/dist/commands/init.d.ts +1 -1
  62. package/dist/commands/init.d.ts.map +1 -1
  63. package/dist/commands/init.js +137 -410
  64. package/dist/commands/init.js.map +1 -1
  65. package/dist/commands/migrate-from-v1.d.ts +5 -0
  66. package/dist/commands/migrate-from-v1.d.ts.map +1 -0
  67. package/dist/commands/migrate-from-v1.js +125 -0
  68. package/dist/commands/migrate-from-v1.js.map +1 -0
  69. package/dist/commands/migrate.d.ts.map +1 -1
  70. package/dist/commands/migrate.js +27 -23
  71. package/dist/commands/migrate.js.map +1 -1
  72. package/dist/commands/pg.d.ts +8 -0
  73. package/dist/commands/pg.d.ts.map +1 -0
  74. package/dist/commands/pg.js +102 -0
  75. package/dist/commands/pg.js.map +1 -0
  76. package/dist/commands/pull.d.ts.map +1 -1
  77. package/dist/commands/pull.js +5 -66
  78. package/dist/commands/pull.js.map +1 -1
  79. package/dist/commands/push.d.ts.map +1 -1
  80. package/dist/commands/push.js +128 -38
  81. package/dist/commands/push.js.map +1 -1
  82. package/dist/commands/seed.d.ts +2 -0
  83. package/dist/commands/seed.d.ts.map +1 -1
  84. package/dist/commands/seed.js +44 -11
  85. package/dist/commands/seed.js.map +1 -1
  86. package/dist/commands/self-host.d.ts +7 -1
  87. package/dist/commands/self-host.d.ts.map +1 -1
  88. package/dist/commands/self-host.js +272 -758
  89. package/dist/commands/self-host.js.map +1 -1
  90. package/dist/commands/self-update.d.ts +9 -0
  91. package/dist/commands/self-update.d.ts.map +1 -0
  92. package/dist/commands/self-update.js +33 -0
  93. package/dist/commands/self-update.js.map +1 -0
  94. package/dist/commands/status.d.ts.map +1 -1
  95. package/dist/commands/status.js +4 -3
  96. package/dist/commands/status.js.map +1 -1
  97. package/dist/commands/types.d.ts +3 -0
  98. package/dist/commands/types.d.ts.map +1 -0
  99. package/dist/commands/types.js +62 -0
  100. package/dist/commands/types.js.map +1 -0
  101. package/dist/commands/update.d.ts +7 -0
  102. package/dist/commands/update.d.ts.map +1 -0
  103. package/dist/commands/update.js +93 -0
  104. package/dist/commands/update.js.map +1 -0
  105. package/dist/components.d.ts +5 -0
  106. package/dist/components.d.ts.map +1 -0
  107. package/dist/components.js +3 -0
  108. package/dist/components.js.map +1 -0
  109. package/dist/config.d.ts +10 -51
  110. package/dist/config.d.ts.map +1 -1
  111. package/dist/config.js +101 -33
  112. package/dist/config.js.map +1 -1
  113. package/dist/dev-compose.d.ts +17 -0
  114. package/dist/dev-compose.d.ts.map +1 -0
  115. package/dist/dev-compose.js +374 -0
  116. package/dist/dev-compose.js.map +1 -0
  117. package/dist/diff-output.d.ts +4 -0
  118. package/dist/diff-output.d.ts.map +1 -0
  119. package/dist/diff-output.js +12 -0
  120. package/dist/diff-output.js.map +1 -0
  121. package/dist/docker-postgres.d.ts +57 -0
  122. package/dist/docker-postgres.d.ts.map +1 -0
  123. package/dist/docker-postgres.js +208 -0
  124. package/dist/docker-postgres.js.map +1 -0
  125. package/dist/engine-client.d.ts +69 -0
  126. package/dist/engine-client.d.ts.map +1 -0
  127. package/dist/engine-client.js +157 -0
  128. package/dist/engine-client.js.map +1 -0
  129. package/dist/ensure-binary.d.ts +7 -0
  130. package/dist/ensure-binary.d.ts.map +1 -0
  131. package/dist/ensure-binary.js +17 -0
  132. package/dist/ensure-binary.js.map +1 -0
  133. package/dist/functions-router-gen.d.ts +14 -0
  134. package/dist/functions-router-gen.d.ts.map +1 -0
  135. package/dist/functions-router-gen.js +199 -0
  136. package/dist/functions-router-gen.js.map +1 -0
  137. package/dist/index.d.ts +4 -5
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +2 -3
  140. package/dist/index.js.map +1 -1
  141. package/dist/kong-config.d.ts +25 -0
  142. package/dist/kong-config.d.ts.map +1 -0
  143. package/dist/kong-config.js +71 -0
  144. package/dist/kong-config.js.map +1 -0
  145. package/dist/local-gateway.d.ts +7 -0
  146. package/dist/local-gateway.d.ts.map +1 -0
  147. package/dist/local-gateway.js +9 -0
  148. package/dist/local-gateway.js.map +1 -0
  149. package/dist/local-storage.d.ts +8 -0
  150. package/dist/local-storage.d.ts.map +1 -0
  151. package/dist/local-storage.js +14 -0
  152. package/dist/local-storage.js.map +1 -0
  153. package/dist/pgbouncer-userlist.d.ts +5 -0
  154. package/dist/pgbouncer-userlist.d.ts.map +1 -0
  155. package/dist/pgbouncer-userlist.js +14 -0
  156. package/dist/pgbouncer-userlist.js.map +1 -0
  157. package/dist/postgres-ctl.d.ts +44 -0
  158. package/dist/postgres-ctl.d.ts.map +1 -0
  159. package/dist/postgres-ctl.js +137 -0
  160. package/dist/postgres-ctl.js.map +1 -0
  161. package/dist/process-manager.d.ts +43 -0
  162. package/dist/process-manager.d.ts.map +1 -0
  163. package/dist/process-manager.js +135 -0
  164. package/dist/process-manager.js.map +1 -0
  165. package/dist/project-config.d.ts +235 -0
  166. package/dist/project-config.d.ts.map +1 -0
  167. package/dist/project-config.js +160 -0
  168. package/dist/project-config.js.map +1 -0
  169. package/dist/pull-utils.d.ts +15 -0
  170. package/dist/pull-utils.d.ts.map +1 -1
  171. package/dist/pull-utils.js +12 -0
  172. package/dist/pull-utils.js.map +1 -1
  173. package/dist/release-pins.d.ts +7 -0
  174. package/dist/release-pins.d.ts.map +1 -0
  175. package/dist/release-pins.js +27 -0
  176. package/dist/release-pins.js.map +1 -0
  177. package/dist/release-public-key.d.ts +8 -0
  178. package/dist/release-public-key.d.ts.map +1 -0
  179. package/dist/release-public-key.js +13 -0
  180. package/dist/release-public-key.js.map +1 -0
  181. package/dist/runtime-routes.d.ts +34 -0
  182. package/dist/runtime-routes.d.ts.map +1 -0
  183. package/dist/runtime-routes.js +252 -0
  184. package/dist/runtime-routes.js.map +1 -0
  185. package/dist/schema-ast-v2.d.ts +127 -0
  186. package/dist/schema-ast-v2.d.ts.map +1 -0
  187. package/dist/schema-ast-v2.js +226 -0
  188. package/dist/schema-ast-v2.js.map +1 -0
  189. package/dist/scripts/postinstall.d.ts +5 -6
  190. package/dist/scripts/postinstall.d.ts.map +1 -1
  191. package/dist/scripts/postinstall.js +36 -20
  192. package/dist/scripts/postinstall.js.map +1 -1
  193. package/dist/self-host-compose.d.ts +22 -0
  194. package/dist/self-host-compose.d.ts.map +1 -0
  195. package/dist/self-host-compose.js +347 -0
  196. package/dist/self-host-compose.js.map +1 -0
  197. package/dist/storage-provision.d.ts +24 -0
  198. package/dist/storage-provision.d.ts.map +1 -0
  199. package/dist/storage-provision.js +44 -0
  200. package/dist/storage-provision.js.map +1 -0
  201. package/dist/studio-admin-roles.d.ts +7 -0
  202. package/dist/studio-admin-roles.d.ts.map +1 -0
  203. package/dist/studio-admin-roles.js +14 -0
  204. package/dist/studio-admin-roles.js.map +1 -0
  205. package/dist/studio-dev-server.d.ts +22 -0
  206. package/dist/studio-dev-server.d.ts.map +1 -0
  207. package/dist/studio-dev-server.js +28 -0
  208. package/dist/studio-dev-server.js.map +1 -0
  209. package/dist/systemd.d.ts +26 -0
  210. package/dist/systemd.d.ts.map +1 -0
  211. package/dist/systemd.js +102 -0
  212. package/dist/systemd.js.map +1 -0
  213. package/dist/tsx-runner.d.ts.map +1 -1
  214. package/dist/tsx-runner.js +9 -2
  215. package/dist/tsx-runner.js.map +1 -1
  216. package/dist/type-extractor.d.ts +4 -0
  217. package/dist/type-extractor.d.ts.map +1 -0
  218. package/dist/type-extractor.js +1213 -0
  219. package/dist/type-extractor.js.map +1 -0
  220. package/dist/type-resolver.d.ts +33 -0
  221. package/dist/type-resolver.d.ts.map +1 -0
  222. package/dist/type-resolver.js +338 -0
  223. package/dist/type-resolver.js.map +1 -0
  224. package/package.json +4 -3
  225. package/releases/deno/VERSION +1 -0
  226. package/scripts/mirror-deno-release.sh +76 -0
  227. package/src/TYPE-RESOLUTION.md +294 -0
  228. package/src/app/proxy-dev-app.ts +67 -0
  229. package/src/app-config.ts +128 -0
  230. package/src/augmentation-generator.ts +126 -0
  231. package/src/binary-cache.ts +822 -0
  232. package/src/cli.ts +13 -8
  233. package/src/commands/admin.ts +4 -3
  234. package/src/commands/app.ts +67 -231
  235. package/src/commands/cache.ts +117 -0
  236. package/src/commands/cloud.ts +63 -64
  237. package/src/commands/db.ts +54 -63
  238. package/src/commands/deploy.ts +96 -62
  239. package/src/commands/dev.ts +933 -405
  240. package/src/commands/diff.ts +31 -29
  241. package/src/commands/engine.ts +13 -116
  242. package/src/commands/functions.ts +97 -115
  243. package/src/commands/generate.ts +23 -10
  244. package/src/commands/init.ts +149 -414
  245. package/src/commands/migrate-from-v1.ts +131 -0
  246. package/src/commands/migrate.ts +27 -23
  247. package/src/commands/pg.ts +133 -0
  248. package/src/commands/pull.ts +6 -85
  249. package/src/commands/push.ts +161 -56
  250. package/src/commands/seed.ts +54 -12
  251. package/src/commands/self-host.ts +312 -880
  252. package/src/commands/self-update.ts +45 -0
  253. package/src/commands/status.ts +4 -3
  254. package/src/commands/types.ts +76 -0
  255. package/src/commands/update.ts +109 -0
  256. package/src/components.ts +6 -0
  257. package/src/config.ts +127 -94
  258. package/src/dev-compose.ts +455 -0
  259. package/src/diff-output.ts +12 -0
  260. package/src/docker-postgres.ts +295 -0
  261. package/src/engine-client.ts +236 -0
  262. package/src/ensure-binary.ts +28 -0
  263. package/src/functions-router-gen.ts +224 -0
  264. package/src/index.ts +4 -12
  265. package/src/kong-config.ts +93 -0
  266. package/src/local-gateway.ts +9 -0
  267. package/src/local-storage.ts +14 -0
  268. package/src/pgbouncer-userlist.ts +15 -0
  269. package/src/postgres-ctl.ts +171 -0
  270. package/src/process-manager.ts +168 -0
  271. package/src/project-config.ts +386 -0
  272. package/src/pull-utils.ts +24 -0
  273. package/src/release-pins.ts +31 -0
  274. package/src/release-public-key.ts +12 -0
  275. package/src/runtime-routes.ts +291 -0
  276. package/src/schema-ast-v2.ts +324 -0
  277. package/src/scripts/postinstall.ts +36 -25
  278. package/src/self-host-compose.ts +389 -0
  279. package/src/storage-provision.ts +58 -0
  280. package/src/studio-admin-roles.ts +16 -0
  281. package/src/studio-dev-server.ts +53 -0
  282. package/src/systemd.ts +137 -0
  283. package/src/tsx-runner.ts +11 -1
  284. package/src/type-extractor.ts +1479 -0
  285. package/src/type-resolver.ts +457 -0
  286. package/tests/app-command.test.ts +54 -0
  287. package/tests/augmentation-generator.test.ts +59 -0
  288. package/tests/binary-cache-cloud-overrides.test.ts +123 -0
  289. package/tests/cached-artifact-format.test.ts +84 -0
  290. package/tests/cli-help.test.ts +40 -14
  291. package/tests/config.test.ts +171 -37
  292. package/tests/docker-postgres.test.ts +39 -0
  293. package/tests/engine-distribution.test.ts +3 -3
  294. package/tests/ensure-binary.test.ts +59 -0
  295. package/tests/init.test.ts +28 -86
  296. package/tests/migrate-from-v1.test.ts +29 -0
  297. package/tests/normalize-admin-config.test.ts +48 -0
  298. package/tests/pg-spawn-env.test.ts +18 -0
  299. package/tests/postgres-archive-tag.test.ts +9 -0
  300. package/tests/proxy-dev-app.test.ts +33 -0
  301. package/tests/pull-utils.test.ts +36 -1
  302. package/tests/release-pins.test.ts +28 -0
  303. package/tests/runtime-contract.test.ts +351 -0
  304. package/tests/seed-discover.test.ts +31 -0
  305. package/tests/studio-admin-roles.test.ts +27 -0
  306. package/tests/tsconfig.json +9 -0
  307. package/tests/type-extractor.test.ts +985 -0
  308. package/tests/type-resolver.test.ts +59 -0
  309. package/tsconfig.tsbuildinfo +1 -1
  310. package/vitest.config.ts +12 -0
  311. package/dist/engine/cache.d.ts +0 -37
  312. package/dist/engine/cache.d.ts.map +0 -1
  313. package/dist/engine/cache.js +0 -121
  314. package/dist/engine/cache.js.map +0 -1
  315. package/dist/engine/download.d.ts +0 -19
  316. package/dist/engine/download.d.ts.map +0 -1
  317. package/dist/engine/download.js +0 -108
  318. package/dist/engine/download.js.map +0 -1
  319. package/dist/engine/platform.d.ts +0 -24
  320. package/dist/engine/platform.d.ts.map +0 -1
  321. package/dist/engine/platform.js +0 -50
  322. package/dist/engine/platform.js.map +0 -1
  323. package/dist/engine/resolve.d.ts +0 -37
  324. package/dist/engine/resolve.d.ts.map +0 -1
  325. package/dist/engine/resolve.js +0 -133
  326. package/dist/engine/resolve.js.map +0 -1
  327. package/dist/engine/update-notify.d.ts +0 -11
  328. package/dist/engine/update-notify.d.ts.map +0 -1
  329. package/dist/engine/update-notify.js +0 -43
  330. package/dist/engine/update-notify.js.map +0 -1
  331. package/dist/engine/verify.d.ts +0 -50
  332. package/dist/engine/verify.d.ts.map +0 -1
  333. package/dist/engine/verify.js +0 -161
  334. package/dist/engine/verify.js.map +0 -1
  335. package/dist/engine-version.d.ts +0 -35
  336. package/dist/engine-version.d.ts.map +0 -1
  337. package/dist/engine-version.js +0 -35
  338. package/dist/engine-version.js.map +0 -1
  339. package/dist/engine.d.ts +0 -34
  340. package/dist/engine.d.ts.map +0 -1
  341. package/dist/engine.js +0 -76
  342. package/dist/engine.js.map +0 -1
  343. package/src/engine/cache.ts +0 -135
  344. package/src/engine/download.ts +0 -143
  345. package/src/engine/platform.ts +0 -66
  346. package/src/engine/resolve.ts +0 -197
  347. package/src/engine/update-notify.ts +0 -50
  348. package/src/engine/verify.ts +0 -206
  349. package/src/engine-version.ts +0 -39
  350. package/src/engine.ts +0 -99
@@ -1,18 +1,41 @@
1
1
  import type { Command } from "commander"
2
- import { existsSync, mkdirSync, writeFileSync } from "node:fs"
3
- import { resolve, join } from "node:path"
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
3
+ import { resolve, join, dirname } from "node:path"
4
+ import { fileURLToPath } from "node:url"
5
+ import { fetchAllLatestVersions } from "../binary-cache.js"
4
6
 
5
7
  export { scaffold }
6
8
 
7
- // ─── Markers used by `supatype app add / remove` ─────────────────────────────
9
+ // ─── Markers used by `supatype app add / remove` (app.ts) ────────────────────
8
10
  export const APP_COMPOSE_MARKER = " # ─── App service (run: supatype app add) ───"
9
11
  export const KONG_APP_MARKER = " # ─── App fallback route (run: supatype app add) ───"
10
12
 
13
+ const CLI_PACKAGE_JSON = join(
14
+ dirname(fileURLToPath(import.meta.url)),
15
+ "..",
16
+ "..",
17
+ "package.json",
18
+ )
19
+
20
+ function cliPackageVersion(): string {
21
+ try {
22
+ const pkg = JSON.parse(readFileSync(CLI_PACKAGE_JSON, "utf8")) as { version?: string }
23
+ return pkg.version ?? "0.1.0"
24
+ } catch {
25
+ return "0.1.0"
26
+ }
27
+ }
28
+
11
29
  export function registerInit(program: Command): void {
12
30
  program
13
31
  .command("init [name]")
14
32
  .description("Scaffold a new Supatype project")
15
- .action((name?: string) => {
33
+ .option(
34
+ "--mode <mode>",
35
+ "Server mode in supatype.config.ts: dev (default) | standalone (native ACME — not Compose self-host)",
36
+ "dev",
37
+ )
38
+ .action(async (name?: string, opts: { mode: string } = { mode: "dev" }) => {
16
39
  const projectName = name ?? "my-project"
17
40
  const dir = name ? resolve(process.cwd(), name) : process.cwd()
18
41
 
@@ -23,19 +46,37 @@ export function registerInit(program: Command): void {
23
46
 
24
47
  if (name) mkdirSync(dir, { recursive: true })
25
48
 
26
- scaffold(dir, projectName)
49
+ let versions: Record<string, string> = {}
50
+ try {
51
+ console.log("Fetching latest component versions from CDN...")
52
+ versions = await fetchAllLatestVersions()
53
+ } catch {
54
+ // Non-fatal: scaffold with placeholder versions; user can run `supatype update`.
55
+ }
56
+
57
+ scaffold(dir, projectName, opts.mode as "dev" | "standalone", versions)
27
58
 
28
59
  console.log(`\nSupatype project ready${name ? ` in ${name}/` : ""}.\n`)
29
60
  console.log("Next steps:")
30
61
  if (name) console.log(` cd ${name}`)
31
- console.log(" pnpm install")
32
- console.log(" supatype keys # generate ANON_KEY + SERVICE_ROLE_KEY, add to .env")
33
- console.log(" supatype dev # start local Postgres + PgBouncer + GoTrue + PostgREST")
34
- console.log(" supatype push # apply schema + generate types\n")
62
+ console.log(" npm install")
63
+ console.log(" supatype keys")
64
+ console.log(" supatype dev # native Postgres + supatype-server")
65
+ console.log(" supatype push # apply schema + generate types")
66
+ console.log("\nStatic frontend (self-host):")
67
+ console.log(" supatype app add --static ./public")
68
+ console.log(" npm run build # write files into public/")
69
+ console.log(" supatype self-host compose up -d")
70
+ if (opts.mode === "standalone") {
71
+ console.log("\nStandalone (native TLS with ACME):")
72
+ console.log(" Edit supatype.config.ts — set server.domain")
73
+ console.log(" supatype dev # or run supatype-server with your TLS setup")
74
+ }
75
+ console.log()
35
76
  })
36
77
  }
37
78
 
38
- function scaffold(dir: string, projectName: string): void {
79
+ function scaffold(dir: string, projectName: string, mode: "dev" | "standalone" = "dev", versions: Record<string, string> = {}): void {
39
80
  const write = (rel: string, content: string) => {
40
81
  const full = join(dir, rel)
41
82
  mkdirSync(resolve(full, ".."), { recursive: true })
@@ -43,69 +84,120 @@ function scaffold(dir: string, projectName: string): void {
43
84
  console.log(` created ${rel}`)
44
85
  }
45
86
 
46
- write("supatype.config.ts", configTemplate(projectName))
87
+ const pkgPath = join(dir, "package.json")
88
+ if (!existsSync(pkgPath)) {
89
+ write("package.json", packageJsonTemplate(projectName, cliPackageVersion()))
90
+ } else {
91
+ console.log(" skipped package.json (already exists)")
92
+ }
93
+
94
+ write("supatype.config.ts", tsConfigTemplate(projectName, mode, versions))
47
95
  write("schema/index.ts", schemaTemplate())
48
96
  write(".env", envTemplate(projectName))
49
- write("docker-compose.yml", dockerComposeTemplate(projectName))
50
- write(".supatype/kong.yml", kongTemplate())
51
- write(".supatype/pgbouncer.ini", pgbouncerIniTemplate())
52
- write(".supatype/userlist.txt", pgbouncerUserlistTemplate())
53
97
  write("seed.ts", seedTemplate(projectName))
98
+ write("seeds/.gitkeep", "")
99
+ write("public/.gitkeep", "")
54
100
  write(".gitignore", gitignoreTemplate())
55
101
  }
56
102
 
57
103
  // ─── Templates ───────────────────────────────────────────────────────────────
58
104
 
59
- function configTemplate(projectName: string): string {
105
+ function packageJsonTemplate(projectName: string, cliVersion: string): string {
106
+ return `{
107
+ "name": "${projectName}",
108
+ "private": true,
109
+ "type": "module",
110
+ "scripts": {
111
+ "dev": "supatype dev",
112
+ "push": "supatype push",
113
+ "seed": "tsx seed.ts"
114
+ },
115
+ "dependencies": {
116
+ "@supatype/cli": "^${cliVersion}",
117
+ "@supatype/types": "^${cliVersion}"
118
+ },
119
+ "devDependencies": {
120
+ "tsx": "^4.19.2",
121
+ "typescript": "^5"
122
+ }
123
+ }
124
+ `
125
+ }
126
+
127
+ function tsConfigTemplate(projectName: string, mode: "dev" | "standalone", versions: Record<string, string> = {}): string {
128
+ const domainField =
129
+ mode === "standalone"
130
+ ? ` domain: "", // e.g. "api.example.com" for ACME TLS\n`
131
+ : ""
132
+ const v = (key: string, fallback: string) => versions[key] ?? fallback
60
133
  return `import { defineConfig } from "@supatype/cli"
61
134
 
62
135
  export default defineConfig({
63
- connection:
64
- process.env["DATABASE_URL"] ??
65
- "postgresql://postgres:postgres@localhost:5432/${projectName}",
66
- schema: "./schema/index.ts",
67
- output: {
68
- types: "./src/types/supatype.d.ts",
69
- client: "./src/lib/supatype.ts",
136
+ project: { name: "${projectName}" },
137
+ provider: "native",
138
+ // provider: "docker" // full self-host Compose stack (Kong :18473)
139
+ database: {
140
+ provider: "native",
141
+ },
142
+ server: {
143
+ mode: "${mode}",
144
+ port: 54321,
145
+ ${domainField} },
146
+ app: {
147
+ mode: "none",
148
+ // mode: "static", static_dir: "./public", // supatype app add --static ./public
149
+ // mode: "proxy", upstream: "http://localhost:3000", start: "dev",
150
+ // vite_dev_url: "http://127.0.0.1:5173", // dev HMR at /_vite (when using a separate Vite server)
151
+ },
152
+ versions: {
153
+ engine: "${v("engine", "latest")}",
154
+ server: "${v("server", "latest")}",
155
+ postgres: "${v("postgres", "latest")}",
156
+ deno: "${v("deno", "latest")}",
70
157
  },
71
- // Self-hosted production deployment (run: supatype self-host setup)
72
- // selfHost: {
73
- // domain: "${projectName}.example.com",
74
- // app: {
75
- // dockerfile: "./Dockerfile",
76
- // port: 3000,
77
- // },
78
- // ssl: {
79
- // provider: "caddy",
80
- // email: "you@example.com",
81
- // },
82
- // },
158
+ email: { provider: "console" },
159
+ storage: { provider: "local", local_path: ".supatype/storage" },
160
+ schema: { path: "schema/index.ts", pg_schema: "public" },
161
+ // Self-host production: supatype self-host compose (Docker only). Standalone + domain = native ACME dev.
83
162
  })
84
163
  `
85
164
  }
86
165
 
87
166
  function schemaTemplate(): string {
88
- return `import { model, field, access } from "@supatype/schema"
89
-
90
- export const User = model("user", {
91
- fields: {
92
- id: field.uuid({ required: true, default: { kind: "genRandomUuid" } }),
93
- email: field.email({ required: true, unique: true }),
94
- name: field.text({ required: true }),
95
- },
167
+ return `import type { Model, Public, Owner, Role, SupatypeAuthUserId, Unique, Email, UUID } from "@supatype/types"
168
+
169
+ export type User = Model<{
170
+ id: SupatypeAuthUserId
171
+ email: Unique<Email>
172
+ name: string
173
+ created_at: string
174
+ updated_at: string
175
+ }, {
96
176
  access: {
97
- read: access.public(),
98
- create: access.public(),
99
- update: access.owner("id"),
100
- delete: access.role("admin"),
101
- },
102
- options: { timestamps: true },
103
- })
177
+ read: Public
178
+ create: Public
179
+ update: Owner<"id">
180
+ delete: Role<"admin">
181
+ }
182
+ }>
183
+
184
+ /** Example singleton global — editable in Studio under Settings. */
185
+ export type SiteSettings = Model<{
186
+ id: UUID
187
+ site_name: string
188
+ }, {
189
+ singleton: true
190
+ access: {
191
+ read: Public
192
+ update: Role<"admin">
193
+ }
194
+ }>
104
195
  `
105
196
  }
106
197
 
107
198
  function envTemplate(projectName: string): string {
108
- return `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/${projectName}
199
+ return `DATABASE_URL=postgresql://supatype_admin:postgres@localhost:5432/${projectName}
200
+ POSTGRES_USER=supatype_admin
109
201
  POSTGRES_PASSWORD=postgres
110
202
  POSTGRES_DB=${projectName}
111
203
 
@@ -128,369 +220,8 @@ SMTP_SENDER_NAME=${projectName}
128
220
  S3_ENDPOINT=http://localhost:9000
129
221
  S3_ACCESS_KEY=supatype
130
222
  S3_SECRET_KEY=supatype-secret
131
- `
132
- }
133
-
134
- function dockerComposeTemplate(projectName: string): string {
135
- return `services:
136
- db:
137
- image: supatype/postgres:17-latest
138
- environment:
139
- POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
140
- POSTGRES_DB: \${POSTGRES_DB:-${projectName}}
141
- ports:
142
- - "5432:5432"
143
- volumes:
144
- - db-data:/var/lib/postgresql/data
145
- healthcheck:
146
- test: ["CMD-SHELL", "pg_isready -U postgres"]
147
- interval: 5s
148
- timeout: 5s
149
- retries: 20
150
-
151
- pgbouncer:
152
- image: pgbouncer/pgbouncer:latest
153
- volumes:
154
- - ./.supatype/pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini:ro
155
- - ./.supatype/userlist.txt:/etc/pgbouncer/userlist.txt:ro
156
- depends_on:
157
- db:
158
- condition: service_healthy
159
- healthcheck:
160
- test: ["CMD", "pg_isready", "-h", "localhost", "-p", "6432", "-U", "postgres"]
161
- interval: 5s
162
- timeout: 5s
163
- retries: 10
164
-
165
- gotrue:
166
- image: supatype/auth:v1.0.0
167
- environment:
168
- GOTRUE_API_HOST: 0.0.0.0
169
- GOTRUE_API_PORT: 9999
170
- GOTRUE_DB_DRIVER: postgres
171
- GOTRUE_DB_DATABASE_URL: "postgres://postgres:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}?search_path=auth"
172
- GOTRUE_SITE_URL: \${SITE_URL:-http://localhost:3000}
173
- GOTRUE_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
174
- GOTRUE_JWT_EXP: 3600
175
- GOTRUE_JWT_AUD: authenticated
176
- GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
177
- GOTRUE_JWT_ADMIN_ROLES: service_role
178
- # Email autoconfirm — set to false and configure SMTP for production
179
- GOTRUE_MAILER_AUTOCONFIRM: \${GOTRUE_MAILER_AUTOCONFIRM:-true}
180
- GOTRUE_SMTP_HOST: \${SMTP_HOST:-}
181
- GOTRUE_SMTP_PORT: \${SMTP_PORT:-587}
182
- GOTRUE_SMTP_USER: \${SMTP_USER:-}
183
- GOTRUE_SMTP_PASS: \${SMTP_PASS:-}
184
- GOTRUE_SMTP_SENDER_NAME: \${SMTP_SENDER_NAME:-${projectName}}
185
- GOTRUE_MAILER_URLPATHS_CONFIRMATION: /auth/v1/verify
186
- GOTRUE_MAILER_URLPATHS_RECOVERY: /auth/v1/verify
187
- GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: /auth/v1/verify
188
- GOTRUE_MAILER_URLPATHS_INVITE: /auth/v1/verify
189
- GOTRUE_DISABLE_SIGNUP: \${DISABLE_SIGNUP:-false}
190
- ports:
191
- - "9999:9999"
192
- depends_on:
193
- pgbouncer:
194
- condition: service_healthy
195
-
196
- postgrest:
197
- image: postgrest/postgrest:v12.2.8
198
- environment:
199
- PGRST_DB_URI: postgresql://authenticator:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}
200
- PGRST_DB_SCHEMA: public
201
- PGRST_DB_ANON_ROLE: anon
202
- PGRST_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
203
- PGRST_DB_EXTRA_SEARCH_PATH: public,extensions
204
- PGRST_DB_POOL: 3
205
- ports:
206
- - "3000:3000"
207
- depends_on:
208
- pgbouncer:
209
- condition: service_healthy
210
-
211
- minio:
212
- image: minio/minio:RELEASE.2024-11-07T00-52-20Z
213
- command: server /data --console-address ":9001"
214
- environment:
215
- MINIO_ROOT_USER: supatype
216
- MINIO_ROOT_PASSWORD: supatype-secret
217
- ports:
218
- - "9000:9000"
219
- - "9001:9001"
220
- volumes:
221
- - minio-data:/data
222
- healthcheck:
223
- test: ["CMD", "mc", "ready", "local"]
224
- interval: 5s
225
- timeout: 5s
226
- retries: 10
227
-
228
- storage:
229
- image: supatype/storage:latest
230
- environment:
231
- PORT: 5000
232
- DATABASE_URL: "postgresql://postgres:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}"
233
- JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
234
- S3_ENDPOINT: http://minio:9000
235
- S3_REGION: us-east-1
236
- S3_ACCESS_KEY: supatype
237
- S3_SECRET_KEY: supatype-secret
238
- S3_FORCE_PATH_STYLE: "true"
239
- ports:
240
- - "5000:5000"
241
- depends_on:
242
- pgbouncer:
243
- condition: service_healthy
244
- minio:
245
- condition: service_healthy
246
-
247
- realtime:
248
- image: supatype/realtime:latest
249
- environment:
250
- PORT: 4000
251
- DATABASE_URL: "postgresql://postgres:\${POSTGRES_PASSWORD:-postgres}@pgbouncer:6432/\${POSTGRES_DB:-${projectName}}"
252
- JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
253
- REPLICATION_MODE: RLS
254
- REPLICATION_POLL_INTERVAL: 100
255
- SECURE_CHANNELS: "true"
256
- SLOT_NAME: realtime_slot
257
- ports:
258
- - "4000:4000"
259
- depends_on:
260
- pgbouncer:
261
- condition: service_healthy
262
-
263
- studio:
264
- image: supatype/studio:latest
265
- ports:
266
- - "3002:3002"
267
-
268
- kong:
269
- image: kong:3.6
270
- environment:
271
- KONG_DATABASE: "off"
272
- KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml
273
- KONG_PROXY_ACCESS_LOG: /dev/stdout
274
- KONG_ADMIN_ACCESS_LOG: /dev/stdout
275
- KONG_PROXY_ERROR_LOG: /dev/stderr
276
- KONG_ADMIN_ERROR_LOG: /dev/stderr
277
- volumes:
278
- - ./.supatype/kong.yml:/etc/kong/kong.yml:ro
279
- ports:
280
- - "8000:8000"
281
- depends_on:
282
- - postgrest
283
- - gotrue
284
- - storage
285
- - realtime
286
- - studio
287
-
288
- ${APP_COMPOSE_MARKER}
289
- # app:
290
- # build:
291
- # context: .
292
- # dockerfile: ./Dockerfile
293
- # ports:
294
- # - "3000:3000"
295
- # environment:
296
- # SUPATYPE_URL: http://kong:8000
297
- # SUPATYPE_ANON_KEY: \${ANON_KEY}
298
- # SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY}
299
- # volumes:
300
- # - .:/app
301
- # - /app/node_modules
302
- # depends_on:
303
- # kong:
304
- # condition: service_healthy
305
-
306
- volumes:
307
- db-data:
308
- minio-data:
309
- `
310
- }
311
-
312
- function kongTemplate(): string {
313
- return `_format_version: "3.0"
314
-
315
- services:
316
- - name: rest-v1
317
- url: http://postgrest:3000
318
- routes:
319
- - name: rest-v1-all
320
- strip_path: true
321
- paths:
322
- - /rest/v1/
323
- plugins:
324
- - name: cors
325
- config:
326
- origins:
327
- - "*"
328
- methods:
329
- - GET
330
- - POST
331
- - PATCH
332
- - DELETE
333
- - OPTIONS
334
- headers:
335
- - Authorization
336
- - Content-Type
337
- - apikey
338
- - Prefer
339
- credentials: true
340
-
341
- - name: graphql-v1
342
- url: http://postgrest:3000/rpc/graphql
343
- routes:
344
- - name: graphql-v1-all
345
- strip_path: true
346
- paths:
347
- - /graphql/v1
348
- plugins:
349
- - name: cors
350
- config:
351
- origins:
352
- - "*"
353
- methods:
354
- - GET
355
- - POST
356
- - OPTIONS
357
- headers:
358
- - Authorization
359
- - Content-Type
360
- - apikey
361
- credentials: true
362
-
363
- - name: auth-v1
364
- url: http://gotrue:9999
365
- routes:
366
- - name: auth-v1-all
367
- strip_path: true
368
- paths:
369
- - /auth/v1/
370
- plugins:
371
- - name: cors
372
- config:
373
- origins:
374
- - "*"
375
- methods:
376
- - GET
377
- - POST
378
- - PUT
379
- - DELETE
380
- - OPTIONS
381
- headers:
382
- - Authorization
383
- - Content-Type
384
- - apikey
385
- credentials: true
386
-
387
- - name: storage-v1
388
- url: http://storage:5000
389
- routes:
390
- - name: storage-v1-all
391
- strip_path: true
392
- paths:
393
- - /storage/v1/
394
- plugins:
395
- - name: cors
396
- config:
397
- origins:
398
- - "*"
399
- methods:
400
- - GET
401
- - POST
402
- - PUT
403
- - DELETE
404
- - OPTIONS
405
- headers:
406
- - Authorization
407
- - Content-Type
408
- - apikey
409
- - x-upsert
410
- credentials: true
411
-
412
- - name: realtime-v1
413
- url: http://realtime:4000
414
- routes:
415
- - name: realtime-v1-all
416
- strip_path: true
417
- paths:
418
- - /realtime/v1/
419
- protocols:
420
- - http
421
- - https
422
- - ws
423
- - wss
424
- plugins:
425
- - name: cors
426
- config:
427
- origins:
428
- - "*"
429
- methods:
430
- - GET
431
- - OPTIONS
432
- headers:
433
- - Authorization
434
- - Content-Type
435
- - apikey
436
- credentials: true
437
-
438
- - name: studio
439
- url: http://studio:3002
440
- routes:
441
- - name: studio-all
442
- strip_path: true
443
- paths:
444
- - /studio/
445
- plugins:
446
- - name: cors
447
- config:
448
- origins:
449
- - "*"
450
- methods:
451
- - GET
452
- - POST
453
- - OPTIONS
454
- headers:
455
- - Authorization
456
- - Content-Type
457
- credentials: true
458
-
459
- ${KONG_APP_MARKER}
460
- # - name: app
461
- # url: http://app:3000
462
- # routes:
463
- # - name: app-root
464
- # paths:
465
- # - /
466
- # strip_path: false
467
- `
468
- }
469
-
470
- function pgbouncerIniTemplate(): string {
471
- return `[databases]
472
- # Forward all databases to Postgres (Docker service name: db)
473
- * = host=db port=5432
474
-
475
- [pgbouncer]
476
- listen_addr = 0.0.0.0
477
- listen_port = 6432
478
- # trust = accept any client on the internal Docker network (safe for local dev)
479
- auth_type = trust
480
- auth_file = /etc/pgbouncer/userlist.txt
481
- pool_mode = transaction
482
- default_pool_size = 20
483
- max_db_connections = 60
484
- max_client_conn = 100
485
- # Required for PostgREST compatibility
486
- server_reset_query = DEALLOCATE ALL
487
- ignore_startup_parameters = extra_float_digits
488
- `
489
- }
490
223
 
491
- function pgbouncerUserlistTemplate(): string {
492
- return `# PgBouncer userlist — auth_type = trust for local dev, so passwords here are unused.
493
- # For production, this file is regenerated by: supatype self-host setup
224
+ # Self-host compose uses the same DATABASE_URL when Postgres is published on localhost:5432
494
225
  `
495
226
  }
496
227
 
@@ -500,7 +231,7 @@ function seedTemplate(projectName: string): string {
500
231
  // Connect using DATABASE_URL from environment
501
232
  const db = sql(
502
233
  process.env["DATABASE_URL"] ??
503
- "postgresql://postgres:postgres@localhost:5432/${projectName}",
234
+ "postgresql://supatype_admin:postgres@localhost:5432/${projectName}",
504
235
  )
505
236
 
506
237
  async function seed() {
@@ -525,6 +256,10 @@ function gitignoreTemplate(): string {
525
256
  node_modules/
526
257
  dist/
527
258
  .supatype/engine/
259
+ # Local overrides — never commit
260
+ supatype.local.config.ts
261
+ supatype.local.config.js
262
+ supatype.local.config.mjs
528
263
  # Generated by supatype push
529
264
  src/types/supatype.d.ts
530
265
  src/lib/supatype.ts