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

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 (309) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +203 -1
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/dist/app-config.d.ts +7 -0
  5. package/dist/app-config.d.ts.map +1 -0
  6. package/dist/app-config.js +113 -0
  7. package/dist/app-config.js.map +1 -0
  8. package/dist/augmentation-generator.d.ts +2 -0
  9. package/dist/augmentation-generator.d.ts.map +1 -0
  10. package/dist/augmentation-generator.js +111 -0
  11. package/dist/augmentation-generator.js.map +1 -0
  12. package/dist/binary-cache.d.ts +89 -0
  13. package/dist/binary-cache.d.ts.map +1 -0
  14. package/dist/binary-cache.js +656 -0
  15. package/dist/binary-cache.js.map +1 -0
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +13 -7
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/admin.d.ts.map +1 -1
  20. package/dist/commands/admin.js +4 -3
  21. package/dist/commands/admin.js.map +1 -1
  22. package/dist/commands/app.d.ts.map +1 -1
  23. package/dist/commands/app.js +56 -209
  24. package/dist/commands/app.js.map +1 -1
  25. package/dist/commands/cache.d.ts +6 -0
  26. package/dist/commands/cache.d.ts.map +1 -0
  27. package/dist/commands/cache.js +105 -0
  28. package/dist/commands/cache.js.map +1 -0
  29. package/dist/commands/cloud.d.ts +12 -0
  30. package/dist/commands/cloud.d.ts.map +1 -1
  31. package/dist/commands/cloud.js +36 -46
  32. package/dist/commands/cloud.js.map +1 -1
  33. package/dist/commands/db.d.ts.map +1 -1
  34. package/dist/commands/db.js +47 -54
  35. package/dist/commands/db.js.map +1 -1
  36. package/dist/commands/deploy.d.ts +2 -1
  37. package/dist/commands/deploy.d.ts.map +1 -1
  38. package/dist/commands/deploy.js +92 -51
  39. package/dist/commands/deploy.js.map +1 -1
  40. package/dist/commands/dev.d.ts +11 -0
  41. package/dist/commands/dev.d.ts.map +1 -1
  42. package/dist/commands/dev.js +751 -384
  43. package/dist/commands/dev.js.map +1 -1
  44. package/dist/commands/diff.d.ts.map +1 -1
  45. package/dist/commands/diff.js +20 -15
  46. package/dist/commands/diff.js.map +1 -1
  47. package/dist/commands/engine.d.ts +1 -3
  48. package/dist/commands/engine.d.ts.map +1 -1
  49. package/dist/commands/engine.js +13 -85
  50. package/dist/commands/engine.js.map +1 -1
  51. package/dist/commands/functions.d.ts.map +1 -1
  52. package/dist/commands/functions.js +92 -105
  53. package/dist/commands/functions.js.map +1 -1
  54. package/dist/commands/generate.d.ts.map +1 -1
  55. package/dist/commands/generate.js +22 -12
  56. package/dist/commands/generate.js.map +1 -1
  57. package/dist/commands/init.d.ts +1 -1
  58. package/dist/commands/init.d.ts.map +1 -1
  59. package/dist/commands/init.js +124 -410
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/commands/migrate-from-v1.d.ts +5 -0
  62. package/dist/commands/migrate-from-v1.d.ts.map +1 -0
  63. package/dist/commands/migrate-from-v1.js +125 -0
  64. package/dist/commands/migrate-from-v1.js.map +1 -0
  65. package/dist/commands/migrate.d.ts.map +1 -1
  66. package/dist/commands/migrate.js +27 -23
  67. package/dist/commands/migrate.js.map +1 -1
  68. package/dist/commands/pg.d.ts +8 -0
  69. package/dist/commands/pg.d.ts.map +1 -0
  70. package/dist/commands/pg.js +102 -0
  71. package/dist/commands/pg.js.map +1 -0
  72. package/dist/commands/pull.d.ts.map +1 -1
  73. package/dist/commands/pull.js +5 -66
  74. package/dist/commands/pull.js.map +1 -1
  75. package/dist/commands/push.d.ts.map +1 -1
  76. package/dist/commands/push.js +99 -39
  77. package/dist/commands/push.js.map +1 -1
  78. package/dist/commands/seed.d.ts +2 -0
  79. package/dist/commands/seed.d.ts.map +1 -1
  80. package/dist/commands/seed.js +44 -11
  81. package/dist/commands/seed.js.map +1 -1
  82. package/dist/commands/self-host.d.ts +7 -1
  83. package/dist/commands/self-host.d.ts.map +1 -1
  84. package/dist/commands/self-host.js +272 -758
  85. package/dist/commands/self-host.js.map +1 -1
  86. package/dist/commands/self-update.d.ts +9 -0
  87. package/dist/commands/self-update.d.ts.map +1 -0
  88. package/dist/commands/self-update.js +33 -0
  89. package/dist/commands/self-update.js.map +1 -0
  90. package/dist/commands/status.d.ts.map +1 -1
  91. package/dist/commands/status.js +4 -3
  92. package/dist/commands/status.js.map +1 -1
  93. package/dist/commands/types.d.ts +3 -0
  94. package/dist/commands/types.d.ts.map +1 -0
  95. package/dist/commands/types.js +62 -0
  96. package/dist/commands/types.js.map +1 -0
  97. package/dist/commands/update.d.ts +7 -0
  98. package/dist/commands/update.d.ts.map +1 -0
  99. package/dist/commands/update.js +77 -0
  100. package/dist/commands/update.js.map +1 -0
  101. package/dist/components.d.ts +5 -0
  102. package/dist/components.d.ts.map +1 -0
  103. package/dist/components.js +3 -0
  104. package/dist/components.js.map +1 -0
  105. package/dist/config.d.ts +10 -51
  106. package/dist/config.d.ts.map +1 -1
  107. package/dist/config.js +101 -33
  108. package/dist/config.js.map +1 -1
  109. package/dist/docker-postgres.d.ts +39 -0
  110. package/dist/docker-postgres.d.ts.map +1 -0
  111. package/dist/docker-postgres.js +96 -0
  112. package/dist/docker-postgres.js.map +1 -0
  113. package/dist/engine-client.d.ts +67 -0
  114. package/dist/engine-client.d.ts.map +1 -0
  115. package/dist/engine-client.js +156 -0
  116. package/dist/engine-client.js.map +1 -0
  117. package/dist/ensure-binary.d.ts +7 -0
  118. package/dist/ensure-binary.d.ts.map +1 -0
  119. package/dist/ensure-binary.js +17 -0
  120. package/dist/ensure-binary.js.map +1 -0
  121. package/dist/functions-router-gen.d.ts +14 -0
  122. package/dist/functions-router-gen.d.ts.map +1 -0
  123. package/dist/functions-router-gen.js +199 -0
  124. package/dist/functions-router-gen.js.map +1 -0
  125. package/dist/index.d.ts +4 -5
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +2 -3
  128. package/dist/index.js.map +1 -1
  129. package/dist/kong-config.d.ts +21 -0
  130. package/dist/kong-config.d.ts.map +1 -0
  131. package/dist/kong-config.js +60 -0
  132. package/dist/kong-config.js.map +1 -0
  133. package/dist/local-gateway.d.ts +7 -0
  134. package/dist/local-gateway.d.ts.map +1 -0
  135. package/dist/local-gateway.js +9 -0
  136. package/dist/local-gateway.js.map +1 -0
  137. package/dist/local-storage.d.ts +8 -0
  138. package/dist/local-storage.d.ts.map +1 -0
  139. package/dist/local-storage.js +14 -0
  140. package/dist/local-storage.js.map +1 -0
  141. package/dist/pgbouncer-userlist.d.ts +5 -0
  142. package/dist/pgbouncer-userlist.d.ts.map +1 -0
  143. package/dist/pgbouncer-userlist.js +14 -0
  144. package/dist/pgbouncer-userlist.js.map +1 -0
  145. package/dist/postgres-ctl.d.ts +44 -0
  146. package/dist/postgres-ctl.d.ts.map +1 -0
  147. package/dist/postgres-ctl.js +137 -0
  148. package/dist/postgres-ctl.js.map +1 -0
  149. package/dist/process-manager.d.ts +41 -0
  150. package/dist/process-manager.d.ts.map +1 -0
  151. package/dist/process-manager.js +120 -0
  152. package/dist/process-manager.js.map +1 -0
  153. package/dist/project-config.d.ts +215 -0
  154. package/dist/project-config.d.ts.map +1 -0
  155. package/dist/project-config.js +145 -0
  156. package/dist/project-config.js.map +1 -0
  157. package/dist/pull-utils.d.ts +15 -0
  158. package/dist/pull-utils.d.ts.map +1 -1
  159. package/dist/pull-utils.js +12 -0
  160. package/dist/pull-utils.js.map +1 -1
  161. package/dist/release-pins.d.ts +7 -0
  162. package/dist/release-pins.d.ts.map +1 -0
  163. package/dist/release-pins.js +27 -0
  164. package/dist/release-pins.js.map +1 -0
  165. package/dist/release-public-key.d.ts +8 -0
  166. package/dist/release-public-key.d.ts.map +1 -0
  167. package/dist/release-public-key.js +13 -0
  168. package/dist/release-public-key.js.map +1 -0
  169. package/dist/runtime-routes.d.ts +25 -0
  170. package/dist/runtime-routes.d.ts.map +1 -0
  171. package/dist/runtime-routes.js +189 -0
  172. package/dist/runtime-routes.js.map +1 -0
  173. package/dist/scripts/postinstall.d.ts +5 -6
  174. package/dist/scripts/postinstall.d.ts.map +1 -1
  175. package/dist/scripts/postinstall.js +36 -20
  176. package/dist/scripts/postinstall.js.map +1 -1
  177. package/dist/self-host-compose.d.ts +14 -0
  178. package/dist/self-host-compose.d.ts.map +1 -0
  179. package/dist/self-host-compose.js +236 -0
  180. package/dist/self-host-compose.js.map +1 -0
  181. package/dist/storage-provision.d.ts +24 -0
  182. package/dist/storage-provision.d.ts.map +1 -0
  183. package/dist/storage-provision.js +44 -0
  184. package/dist/storage-provision.js.map +1 -0
  185. package/dist/systemd.d.ts +26 -0
  186. package/dist/systemd.d.ts.map +1 -0
  187. package/dist/systemd.js +102 -0
  188. package/dist/systemd.js.map +1 -0
  189. package/dist/tsx-runner.d.ts.map +1 -1
  190. package/dist/tsx-runner.js +9 -2
  191. package/dist/tsx-runner.js.map +1 -1
  192. package/dist/type-extractor.d.ts +31 -0
  193. package/dist/type-extractor.d.ts.map +1 -0
  194. package/dist/type-extractor.js +876 -0
  195. package/dist/type-extractor.js.map +1 -0
  196. package/package.json +4 -3
  197. package/releases/deno/VERSION +1 -0
  198. package/scripts/mirror-deno-release.sh +76 -0
  199. package/src/app-config.ts +128 -0
  200. package/src/augmentation-generator.ts +126 -0
  201. package/src/binary-cache.ts +802 -0
  202. package/src/cli.ts +13 -8
  203. package/src/commands/admin.ts +4 -3
  204. package/src/commands/app.ts +67 -231
  205. package/src/commands/cache.ts +117 -0
  206. package/src/commands/cloud.ts +46 -57
  207. package/src/commands/db.ts +54 -63
  208. package/src/commands/deploy.ts +110 -61
  209. package/src/commands/dev.ts +930 -405
  210. package/src/commands/diff.ts +21 -29
  211. package/src/commands/engine.ts +13 -116
  212. package/src/commands/functions.ts +97 -115
  213. package/src/commands/generate.ts +23 -10
  214. package/src/commands/init.ts +136 -414
  215. package/src/commands/migrate-from-v1.ts +131 -0
  216. package/src/commands/migrate.ts +27 -23
  217. package/src/commands/pg.ts +133 -0
  218. package/src/commands/pull.ts +6 -85
  219. package/src/commands/push.ts +128 -59
  220. package/src/commands/seed.ts +54 -12
  221. package/src/commands/self-host.ts +312 -880
  222. package/src/commands/self-update.ts +45 -0
  223. package/src/commands/status.ts +4 -3
  224. package/src/commands/types.ts +76 -0
  225. package/src/commands/update.ts +92 -0
  226. package/src/components.ts +6 -0
  227. package/src/config.ts +127 -94
  228. package/src/docker-postgres.ts +138 -0
  229. package/src/engine-client.ts +231 -0
  230. package/src/ensure-binary.ts +28 -0
  231. package/src/functions-router-gen.ts +224 -0
  232. package/src/index.ts +4 -12
  233. package/src/kong-config.ts +78 -0
  234. package/src/local-gateway.ts +9 -0
  235. package/src/local-storage.ts +14 -0
  236. package/src/pgbouncer-userlist.ts +15 -0
  237. package/src/postgres-ctl.ts +171 -0
  238. package/src/process-manager.ts +151 -0
  239. package/src/project-config.ts +353 -0
  240. package/src/pull-utils.ts +24 -0
  241. package/src/release-pins.ts +31 -0
  242. package/src/release-public-key.ts +12 -0
  243. package/src/runtime-routes.ts +216 -0
  244. package/src/scripts/postinstall.ts +36 -25
  245. package/src/self-host-compose.ts +257 -0
  246. package/src/storage-provision.ts +58 -0
  247. package/src/systemd.ts +137 -0
  248. package/src/tsx-runner.ts +11 -1
  249. package/src/type-extractor.ts +1016 -0
  250. package/tests/app-command.test.ts +54 -0
  251. package/tests/augmentation-generator.test.ts +59 -0
  252. package/tests/binary-cache-cloud-overrides.test.ts +123 -0
  253. package/tests/cached-artifact-format.test.ts +84 -0
  254. package/tests/cli-help.test.ts +40 -14
  255. package/tests/config.test.ts +140 -37
  256. package/tests/engine-distribution.test.ts +3 -3
  257. package/tests/ensure-binary.test.ts +59 -0
  258. package/tests/init.test.ts +28 -86
  259. package/tests/migrate-from-v1.test.ts +29 -0
  260. package/tests/pg-spawn-env.test.ts +18 -0
  261. package/tests/postgres-archive-tag.test.ts +9 -0
  262. package/tests/pull-utils.test.ts +36 -1
  263. package/tests/release-pins.test.ts +28 -0
  264. package/tests/runtime-contract.test.ts +236 -0
  265. package/tests/seed-discover.test.ts +31 -0
  266. package/tests/tsconfig.json +9 -0
  267. package/tests/type-extractor.test.ts +401 -0
  268. package/tsconfig.tsbuildinfo +1 -1
  269. package/vitest.config.ts +12 -0
  270. package/dist/engine/cache.d.ts +0 -37
  271. package/dist/engine/cache.d.ts.map +0 -1
  272. package/dist/engine/cache.js +0 -121
  273. package/dist/engine/cache.js.map +0 -1
  274. package/dist/engine/download.d.ts +0 -19
  275. package/dist/engine/download.d.ts.map +0 -1
  276. package/dist/engine/download.js +0 -108
  277. package/dist/engine/download.js.map +0 -1
  278. package/dist/engine/platform.d.ts +0 -24
  279. package/dist/engine/platform.d.ts.map +0 -1
  280. package/dist/engine/platform.js +0 -50
  281. package/dist/engine/platform.js.map +0 -1
  282. package/dist/engine/resolve.d.ts +0 -37
  283. package/dist/engine/resolve.d.ts.map +0 -1
  284. package/dist/engine/resolve.js +0 -133
  285. package/dist/engine/resolve.js.map +0 -1
  286. package/dist/engine/update-notify.d.ts +0 -11
  287. package/dist/engine/update-notify.d.ts.map +0 -1
  288. package/dist/engine/update-notify.js +0 -43
  289. package/dist/engine/update-notify.js.map +0 -1
  290. package/dist/engine/verify.d.ts +0 -50
  291. package/dist/engine/verify.d.ts.map +0 -1
  292. package/dist/engine/verify.js +0 -161
  293. package/dist/engine/verify.js.map +0 -1
  294. package/dist/engine-version.d.ts +0 -35
  295. package/dist/engine-version.d.ts.map +0 -1
  296. package/dist/engine-version.js +0 -35
  297. package/dist/engine-version.js.map +0 -1
  298. package/dist/engine.d.ts +0 -34
  299. package/dist/engine.d.ts.map +0 -1
  300. package/dist/engine.js +0 -76
  301. package/dist/engine.js.map +0 -1
  302. package/src/engine/cache.ts +0 -135
  303. package/src/engine/download.ts +0 -143
  304. package/src/engine/platform.ts +0 -66
  305. package/src/engine/resolve.ts +0 -197
  306. package/src/engine/update-notify.ts +0 -50
  307. package/src/engine/verify.ts +0 -206
  308. package/src/engine-version.ts +0 -39
  309. 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,107 @@ 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
+ database: {
138
+ provider: "native",
139
+ // provider: "docker", image: "supatype/postgres:17-latest" // full extensions stack via Docker
140
+ },
141
+ server: {
142
+ mode: "${mode}",
143
+ port: 54321,
144
+ ${domainField} },
145
+ app: {
146
+ mode: "none",
147
+ // mode: "static", static_dir: "./public", // supatype app add --static ./public
148
+ // mode: "proxy", upstream: "http://localhost:3000",
149
+ // vite_dev_url: "http://127.0.0.1:5173", // dev HMR at /_vite (when using a separate Vite server)
70
150
  },
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
- // },
151
+ versions: {
152
+ engine: "${v("engine", "latest")}",
153
+ server: "${v("server", "latest")}",
154
+ postgres: "${v("postgres", "latest")}",
155
+ deno: "${v("deno", "latest")}",
156
+ },
157
+ email: { provider: "console" },
158
+ storage: { provider: "local", local_path: ".supatype/storage" },
159
+ schema: { path: "schema/index.ts", pg_schema: "public" },
160
+ // Self-host production: supatype self-host compose (Docker only). Standalone + domain = native ACME dev.
83
161
  })
84
162
  `
85
163
  }
86
164
 
87
165
  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
- },
166
+ return `import type { Model, Public, Owner, Role, SupatypeAuthUserId, Unique, Email } from "@supatype/types"
167
+
168
+ export type User = Model<{
169
+ id: SupatypeAuthUserId
170
+ email: Unique<Email>
171
+ name: string
172
+ created_at: string
173
+ updated_at: string
174
+ }, {
96
175
  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
- })
176
+ read: Public
177
+ create: Public
178
+ update: Owner<"id">
179
+ delete: Role<"admin">
180
+ }
181
+ }>
104
182
  `
105
183
  }
106
184
 
107
185
  function envTemplate(projectName: string): string {
108
- return `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/${projectName}
186
+ return `DATABASE_URL=postgresql://supatype_admin:postgres@localhost:5432/${projectName}
187
+ POSTGRES_USER=supatype_admin
109
188
  POSTGRES_PASSWORD=postgres
110
189
  POSTGRES_DB=${projectName}
111
190
 
@@ -128,369 +207,8 @@ SMTP_SENDER_NAME=${projectName}
128
207
  S3_ENDPOINT=http://localhost:9000
129
208
  S3_ACCESS_KEY=supatype
130
209
  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
210
 
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
211
+ # Self-host compose uses the same DATABASE_URL when Postgres is published on localhost:5432
494
212
  `
495
213
  }
496
214
 
@@ -500,7 +218,7 @@ function seedTemplate(projectName: string): string {
500
218
  // Connect using DATABASE_URL from environment
501
219
  const db = sql(
502
220
  process.env["DATABASE_URL"] ??
503
- "postgresql://postgres:postgres@localhost:5432/${projectName}",
221
+ "postgresql://supatype_admin:postgres@localhost:5432/${projectName}",
504
222
  )
505
223
 
506
224
  async function seed() {
@@ -525,6 +243,10 @@ function gitignoreTemplate(): string {
525
243
  node_modules/
526
244
  dist/
527
245
  .supatype/engine/
246
+ # Local overrides — never commit
247
+ supatype.local.config.ts
248
+ supatype.local.config.js
249
+ supatype.local.config.mjs
528
250
  # Generated by supatype push
529
251
  src/types/supatype.d.ts
530
252
  src/lib/supatype.ts