@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
@@ -0,0 +1,347 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, relative, resolve } from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { preferredFunctionsPathFromProject } from "./project-config.js";
5
+ import { hasEngineOverride, hasStudioOverride } from "./binary-cache.js";
6
+ import { buildKongDeclarative } from "./kong-config.js";
7
+ export function selfHostComposePaths(cwd) {
8
+ const dir = resolve(cwd, ".supatype", "self-host");
9
+ return {
10
+ dir,
11
+ composePath: join(dir, "docker-compose.yml"),
12
+ kongPath: join(dir, "kong.yml"),
13
+ nginxPath: join(dir, "nginx.conf"),
14
+ };
15
+ }
16
+ export function appUpstreamForCompose(config) {
17
+ if (config.app.mode !== "proxy")
18
+ return undefined;
19
+ const upstream = config.app.upstream?.trim();
20
+ return upstream && upstream.length > 0 ? upstream : undefined;
21
+ }
22
+ export function staticDirForCompose(config) {
23
+ if (config.app.mode !== "static")
24
+ return undefined;
25
+ const dir = config.app.static_dir?.trim();
26
+ return dir && dir.length > 0 ? dir : "./public";
27
+ }
28
+ /**
29
+ * Bind-mount source for `/project` in generated compose files.
30
+ * Paths are resolved from `--project-directory` (always the project root in `runDockerCompose`),
31
+ * not from the compose file directory — use `.` not `../..`.
32
+ */
33
+ function projectMountPath(_cwd) {
34
+ return ".";
35
+ }
36
+ /** Paths in generated compose are resolved from `--project-directory` (project root). */
37
+ function relativeFromProjectRoot(cwd, target) {
38
+ let rel = relative(resolve(cwd), resolve(target)).replace(/\\/g, "/");
39
+ if (!rel.startsWith(".") && !rel.startsWith("/")) {
40
+ rel = `./${rel}`;
41
+ }
42
+ return rel;
43
+ }
44
+ function kongMountPath(_cwd) {
45
+ return ".supatype/self-host/kong.yml";
46
+ }
47
+ /** Host Vite dev server as seen from Kong inside Docker Compose. */
48
+ export const COMPOSE_STUDIO_HOST_URL = "http://host.docker.internal:3002";
49
+ /** Local monorepo Studio image for `supatype dev` (dogfooding). */
50
+ function studioServiceBlock(cwd, devLocal) {
51
+ if (!devLocal) {
52
+ return ` image: \${SUPATYPE_STUDIO_IMAGE:-supatype/studio:latest}`;
53
+ }
54
+ const monorepoRoot = resolve(cwd, "..", "supatype");
55
+ const studioDockerfile = join(monorepoRoot, "packages", "studio", "Dockerfile");
56
+ if (!existsSync(studioDockerfile) || !existsSync(join(monorepoRoot, "pnpm-workspace.yaml"))) {
57
+ return ` image: \${SUPATYPE_STUDIO_IMAGE:-supatype/studio:latest}`;
58
+ }
59
+ const context = relativeFromProjectRoot(cwd, monorepoRoot);
60
+ return ` build:
61
+ context: ${context}
62
+ dockerfile: packages/studio/Dockerfile
63
+ image: supatype/studio:dev-local`;
64
+ }
65
+ /** Host dev app (Astro/Vite on the machine) as seen from inside compose services. */
66
+ function proxyUpstreamForCompose(upstream, devLocal) {
67
+ const trimmed = upstream.trim();
68
+ if (!devLocal)
69
+ return trimmed;
70
+ try {
71
+ const url = new URL(trimmed);
72
+ if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
73
+ url.hostname = "host.docker.internal";
74
+ return url.toString();
75
+ }
76
+ }
77
+ catch {
78
+ // keep literal upstream when not a URL
79
+ }
80
+ return trimmed;
81
+ }
82
+ function serverAppEnvForCompose(config, devLocal) {
83
+ const mode = config.app.mode ?? "none";
84
+ const lines = [` SUPATYPE_APP_MODE: ${mode}`];
85
+ if (mode === "static") {
86
+ const dir = staticDirForCompose(config) ?? "./public";
87
+ lines.push(` SUPATYPE_APP_STATIC_DIR: /project/${dir.replace(/^\.\//, "")}`);
88
+ }
89
+ else if (mode === "proxy" && config.app.upstream?.trim()) {
90
+ lines.push(` SUPATYPE_APP_UPSTREAM: ${proxyUpstreamForCompose(config.app.upstream, devLocal)}`);
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ export function renderSelfHostCompose(config, cwd = process.cwd(), options) {
95
+ const projectMount = projectMountPath(cwd);
96
+ const kongMount = kongMountPath(cwd);
97
+ const devLocal = options?.devLocal === true;
98
+ const studioHostDev = devLocal && hasStudioOverride(config);
99
+ const appEnv = serverAppEnvForCompose(config, devLocal);
100
+ const studioService = studioServiceBlock(cwd, devLocal);
101
+ const studioBlock = studioHostDev
102
+ ? ""
103
+ : `
104
+ studio:
105
+ ${studioService}
106
+ environment:
107
+ SUPATYPE_CLOUD_JSON: '{"url":"\${API_EXTERNAL_URL:-http://localhost:18473}","anonKey":"\${ANON_KEY:-}"}'
108
+ expose:
109
+ - "3002"
110
+ `;
111
+ const kongDependsOn = studioHostDev
112
+ ? ` - server`
113
+ : ` - server
114
+ - studio`;
115
+ const publishDbToHost = !devLocal || hasEngineOverride(config);
116
+ const dbPorts = publishDbToHost
117
+ ? devLocal
118
+ ? ` ports:
119
+ - "127.0.0.1:\${SUPATYPE_DEV_DB_PORT:-54329}:5432"
120
+ `
121
+ : ` ports:
122
+ - "5432:5432"
123
+ `
124
+ : "";
125
+ const serverPorts = devLocal
126
+ ? ""
127
+ : ` ports:
128
+ - "9999:9999"
129
+ `;
130
+ const minioPorts = devLocal
131
+ ? ""
132
+ : ` ports:
133
+ - "9000:9000"
134
+ - "9001:9001"
135
+ `;
136
+ return `# Generated by supatype self-host compose
137
+ # Kong → supatype-server (unified gateway) → internal PostgREST / storage / etc.
138
+ services:
139
+ db:
140
+ image: \${SUPATYPE_POSTGRES_IMAGE:-supatype/postgres:latest}
141
+ environment:
142
+ POSTGRES_USER: \${POSTGRES_USER:-supatype_admin}
143
+ POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
144
+ POSTGRES_DB: \${POSTGRES_DB:-supatype}
145
+ ${dbPorts} volumes:
146
+ - db-data:/var/lib/postgresql/data
147
+ healthcheck:
148
+ test: ["CMD-SHELL", "pg_isready -U \${POSTGRES_USER:-supatype_admin}"]
149
+ interval: 5s
150
+ timeout: 5s
151
+ retries: 20
152
+
153
+ postgrest:
154
+ image: postgrest/postgrest:v12.2.8
155
+ expose:
156
+ - "3000"
157
+ environment:
158
+ PGRST_DB_URI: postgresql://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}
159
+ PGRST_DB_SCHEMA: "public, supatype, graphql_public"
160
+ PGRST_DB_ANON_ROLE: anon
161
+ PGRST_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
162
+ PGRST_DB_EXTRA_SEARCH_PATH: public,extensions
163
+ PGRST_DB_POOL: 3
164
+ depends_on:
165
+ db:
166
+ condition: service_healthy
167
+
168
+ storage:
169
+ image: \${SUPATYPE_STORAGE_IMAGE:-supatype/storage:latest}
170
+ expose:
171
+ - "5000"
172
+ environment:
173
+ PORT: 5000
174
+ DATABASE_URL: "postgresql://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}"
175
+ JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
176
+ S3_ENDPOINT: http://minio:9000
177
+ S3_REGION: us-east-1
178
+ S3_ACCESS_KEY: supatype
179
+ S3_SECRET_KEY: supatype-secret
180
+ S3_FORCE_PATH_STYLE: "true"
181
+ depends_on:
182
+ db:
183
+ condition: service_healthy
184
+
185
+ functions-worker:
186
+ image: \${SUPATYPE_FUNCTIONS_WORKER_IMAGE:-supatype/functions-worker:latest}
187
+ expose:
188
+ - "8001"
189
+ volumes:
190
+ - ${projectMount}:/project:ro
191
+ environment:
192
+ SUPATYPE_FUNCTIONS_ROOT: /project/functions
193
+ SUPATYPE_DENO_FUNCTIONS_DIR: /project/functions
194
+ PORT: "8001"
195
+ SUPATYPE_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
196
+ SUPATYPE_ANON_KEY: \${ANON_KEY:-}
197
+ SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY:-}
198
+ STRIPE_SECRET_KEY: \${STRIPE_SECRET_KEY:-}
199
+ STRIPE_WEBHOOK_SECRET: \${STRIPE_WEBHOOK_SECRET:-}
200
+ SITE_URL: \${SITE_URL:-\${API_EXTERNAL_URL:-http://localhost:18473}}
201
+ depends_on:
202
+ db:
203
+ condition: service_healthy
204
+
205
+ server:
206
+ image: \${SUPATYPE_SERVER_IMAGE:-\${SUPATYPE_AUTH_IMAGE:-supatype/server:latest}}
207
+ ${serverPorts} volumes:
208
+ - ${projectMount}:/project:ro
209
+ working_dir: /project
210
+ environment:
211
+ SUPATYPE_MODE: ${devLocal ? "dev" : "standalone"}
212
+ SUPATYPE_MANIFEST_PATH: /project/.supatype/manifest.json
213
+ SUPATYPE_ADMIN_CONFIG_PATH: /project/.supatype/admin-config.json
214
+ SUPATYPE_API_CONFIG_PATH: /project/.supatype/api-config.json
215
+ SUPATYPE_POSTGREST_URL: http://postgrest:3000
216
+ SUPATYPE_GRAPHQL_URL: http://postgrest:3000
217
+ SUPATYPE_STORAGE_URL: http://storage:5000
218
+ SUPATYPE_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
219
+ SUPATYPE_ANON_KEY: \${ANON_KEY:-}
220
+ SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY:-}
221
+ SUPATYPE_SQL_DATABASE_URL: "postgresql://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}"
222
+ SUPATYPE_DENO_FUNCTIONS_DIR: /project/functions
223
+ SUPATYPE_FUNCTIONS_WORKER_URL: http://functions-worker:8001
224
+ ${appEnv}
225
+ GOTRUE_API_HOST: 0.0.0.0
226
+ GOTRUE_API_PORT: 9999
227
+ API_EXTERNAL_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
228
+ GOTRUE_API_EXTERNAL_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
229
+ GOTRUE_DB_DRIVER: postgres
230
+ GOTRUE_DB_DATABASE_URL: "postgres://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}?search_path=auth"
231
+ GOTRUE_SITE_URL: \${SITE_URL:-http://localhost:3000}
232
+ GOTRUE_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
233
+ GOTRUE_JWT_EXP: 3600
234
+ GOTRUE_JWT_AUD: authenticated
235
+ GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
236
+ GOTRUE_JWT_ADMIN_ROLES: service_role,supatype_admin
237
+ GOTRUE_MAILER_AUTOCONFIRM: \${GOTRUE_MAILER_AUTOCONFIRM:-true}
238
+ GOTRUE_DISABLE_SIGNUP: \${DISABLE_SIGNUP:-false}
239
+ ${devLocal ? " STUDIO_OPEN_DEV: \"1\"\n" : ""}
240
+ depends_on:
241
+ db:
242
+ condition: service_healthy
243
+ postgrest:
244
+ condition: service_started
245
+ storage:
246
+ condition: service_started
247
+ functions-worker:
248
+ condition: service_started
249
+
250
+ minio:
251
+ image: minio/minio:RELEASE.2024-11-07T00-52-20Z
252
+ command: server /data --console-address ":9001"
253
+ environment:
254
+ MINIO_ROOT_USER: supatype
255
+ MINIO_ROOT_PASSWORD: supatype-secret
256
+ ${minioPorts} volumes:
257
+ - minio-data:/data
258
+
259
+ schema-engine:
260
+ image: \${SUPATYPE_ENGINE_IMAGE:-supatype/schema-engine:latest}
261
+ profiles: ["tools"]
262
+ entrypoint: ["supatype-engine"]
263
+ volumes:
264
+ - ${projectMount}:/project
265
+ working_dir: /project
266
+ depends_on:
267
+ db:
268
+ condition: service_healthy
269
+ ${studioBlock}
270
+ kong:
271
+ image: kong:3.6
272
+ environment:
273
+ KONG_DATABASE: "off"
274
+ KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml
275
+ KONG_PROXY_ACCESS_LOG: /dev/stdout
276
+ KONG_ADMIN_ACCESS_LOG: /dev/stdout
277
+ KONG_PROXY_ERROR_LOG: /dev/stderr
278
+ KONG_ADMIN_ERROR_LOG: /dev/stderr
279
+ volumes:
280
+ - ${kongMount}:/etc/kong/kong.yml:ro
281
+ ports:
282
+ - "\${SUPATYPE_KONG_PORT:-18473}:8000"
283
+ depends_on:
284
+ ${kongDependsOn}
285
+
286
+ volumes:
287
+ db-data:
288
+ minio-data:
289
+ `;
290
+ }
291
+ function ensureComposeManifest(cwd) {
292
+ const manifestPath = join(cwd, ".supatype", "manifest.json");
293
+ if (existsSync(manifestPath))
294
+ return;
295
+ mkdirSync(dirname(manifestPath), { recursive: true });
296
+ const manifest = {
297
+ schema: "public",
298
+ postgrest_url: "http://postgrest:3000",
299
+ storage_url: "http://storage:5000",
300
+ realtime_enabled: true,
301
+ functions_enabled: false,
302
+ };
303
+ writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
304
+ }
305
+ function ensureProjectFunctionsDir(cwd, config) {
306
+ mkdirSync(preferredFunctionsPathFromProject(config, cwd), { recursive: true });
307
+ }
308
+ export function writeSelfHostCompose(cwd, config, options) {
309
+ const paths = selfHostComposePaths(cwd);
310
+ mkdirSync(paths.dir, { recursive: true });
311
+ ensureProjectFunctionsDir(cwd, config);
312
+ ensureComposeManifest(cwd);
313
+ writeFileSync(paths.composePath, renderSelfHostCompose(config, cwd, options), "utf8");
314
+ const studioHostDev = options?.devLocal === true && hasStudioOverride(config);
315
+ writeFileSync(paths.kongPath, buildKongDeclarative({
316
+ unifiedGateway: true,
317
+ ...(studioHostDev && {
318
+ studioServiceUrl: COMPOSE_STUDIO_HOST_URL,
319
+ studioStripPath: false,
320
+ }),
321
+ }), "utf8");
322
+ return paths;
323
+ }
324
+ export function runDockerCompose(composePath, args, projectRoot = process.cwd(), composeProject) {
325
+ const envFile = resolve(projectRoot, ".env");
326
+ const composeArgs = ["compose"];
327
+ // Per-project name isolates containers/volumes/network so multiple Supatype
328
+ // projects on one machine never share a database (default would be the
329
+ // ".supatype/self-host" dir name, identical for every project).
330
+ if (composeProject)
331
+ composeArgs.push("-p", composeProject);
332
+ // Resolve ${VAR} in compose.yml from the project root .env (not .supatype/self-host/).
333
+ composeArgs.push("--project-directory", projectRoot);
334
+ composeArgs.push("-f", composePath);
335
+ if (existsSync(envFile)) {
336
+ composeArgs.push("--env-file", envFile);
337
+ }
338
+ composeArgs.push(...args);
339
+ const result = spawnSync("docker", composeArgs, { stdio: "inherit", cwd: projectRoot });
340
+ return result.status ?? 1;
341
+ }
342
+ /** Compose project name for a Supatype project — isolates docker state per project. */
343
+ export function composeProjectName(projectName) {
344
+ const slug = projectName.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
345
+ return `supatype-${slug || "project"}`;
346
+ }
347
+ //# sourceMappingURL=self-host-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-host-compose.js","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Provision storage buckets declared in a schema AST via the storage server API.
3
+ *
4
+ * The storage server is the authority on bucket existence — going through the API
5
+ * ensures it creates any backing resources (directories, S3 buckets, etc.).
6
+ * Buckets already registered return 409 Conflict, which is treated as success.
7
+ */
8
+ export interface BucketSpec {
9
+ id: string;
10
+ public: boolean;
11
+ allowed_mime_types?: string[] | null;
12
+ file_size_limit?: number | null;
13
+ access_mode?: "public" | "private" | "custom";
14
+ s3_bucket_policy?: string | null;
15
+ }
16
+ /**
17
+ * Ensure all declared buckets exist in the storage server.
18
+ *
19
+ * @param storageApiUrl Base URL of the storage API, e.g. "http://localhost:54321/storage/v1"
20
+ * @param serviceRoleKey A service_role JWT for the storage server
21
+ * @param buckets Buckets to provision (from the resolved AST)
22
+ */
23
+ export declare function provisionBuckets(storageApiUrl: string, serviceRoleKey: string, buckets: BucketSpec[]): Promise<void>;
24
+ //# sourceMappingURL=storage-provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-provision.d.ts","sourceRoot":"","sources":["../src/storage-provision.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC7C,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,UAAU,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Provision storage buckets declared in a schema AST via the storage server API.
3
+ *
4
+ * The storage server is the authority on bucket existence — going through the API
5
+ * ensures it creates any backing resources (directories, S3 buckets, etc.).
6
+ * Buckets already registered return 409 Conflict, which is treated as success.
7
+ */
8
+ /**
9
+ * Ensure all declared buckets exist in the storage server.
10
+ *
11
+ * @param storageApiUrl Base URL of the storage API, e.g. "http://localhost:54321/storage/v1"
12
+ * @param serviceRoleKey A service_role JWT for the storage server
13
+ * @param buckets Buckets to provision (from the resolved AST)
14
+ */
15
+ export async function provisionBuckets(storageApiUrl, serviceRoleKey, buckets) {
16
+ const base = storageApiUrl.replace(/\/$/, "");
17
+ const headers = {
18
+ "Authorization": `Bearer ${serviceRoleKey}`,
19
+ "Content-Type": "application/json",
20
+ };
21
+ for (const bucket of buckets) {
22
+ const body = JSON.stringify({
23
+ id: bucket.id,
24
+ name: bucket.id,
25
+ public: bucket.public,
26
+ ...(bucket.allowed_mime_types != null && { allowed_mime_types: bucket.allowed_mime_types }),
27
+ ...(bucket.file_size_limit != null && { file_size_limit: bucket.file_size_limit }),
28
+ ...(bucket.access_mode != null && { access_mode: bucket.access_mode }),
29
+ ...(bucket.s3_bucket_policy != null &&
30
+ bucket.s3_bucket_policy !== "" && { s3_bucket_policy: bucket.s3_bucket_policy }),
31
+ });
32
+ const res = await fetch(`${base}/bucket`, { method: "POST", headers, body })
33
+ .catch(() => null);
34
+ if (res === null)
35
+ continue; // server not reachable — skip silently
36
+ if (res.status === 409)
37
+ continue; // already exists — fine
38
+ if (!res.ok) {
39
+ const msg = await res.text().catch(() => res.statusText);
40
+ console.warn(`[storage] Failed to provision bucket "${bucket.id}": ${msg}`);
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=storage-provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-provision.js","sourceRoot":"","sources":["../src/storage-provision.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,cAAsB,EACtB,OAAqB;IAErB,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG;QACd,eAAe,EAAE,UAAU,cAAc,EAAE;QAC3C,cAAc,EAAE,kBAAkB;KACnC,CAAA;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,EAAE;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC3F,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;YAClF,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YACtE,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,IAAI;gBACjC,MAAM,CAAC,gBAAgB,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;SACnF,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACzE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAEpB,IAAI,GAAG,KAAK,IAAI;YAAE,SAAQ,CAAC,uCAAuC;QAClE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,SAAQ,CAAC,wBAAwB;QACzD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACxD,OAAO,CAAC,IAAI,CAAC,yCAAyC,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SupatypeProjectConfig } from "./project-config.js";
2
+ export declare const DEFAULT_STUDIO_ADMIN_ROLES: readonly ["admin", "supatype_admin"];
3
+ /** Studio admin roles from `supatype.config.ts` `admin.roles` or defaults. */
4
+ export declare function studioAdminRoles(cfg: SupatypeProjectConfig): string[];
5
+ /** Merge `adminRoles` into engine admin-config JSON for Studio and supatype-server. */
6
+ export declare function withAdminRoles(admin: unknown, cfg: SupatypeProjectConfig): Record<string, unknown>;
7
+ //# sourceMappingURL=studio-admin-roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-admin-roles.d.ts","sourceRoot":"","sources":["../src/studio-admin-roles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,eAAO,MAAM,0BAA0B,sCAAuC,CAAA;AAE9E,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAIrE;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGlG"}
@@ -0,0 +1,14 @@
1
+ export const DEFAULT_STUDIO_ADMIN_ROLES = ["admin", "supatype_admin"];
2
+ /** Studio admin roles from `supatype.config.ts` `admin.roles` or defaults. */
3
+ export function studioAdminRoles(cfg) {
4
+ const roles = cfg.admin?.roles;
5
+ if (roles !== undefined && roles.length > 0)
6
+ return roles;
7
+ return [...DEFAULT_STUDIO_ADMIN_ROLES];
8
+ }
9
+ /** Merge `adminRoles` into engine admin-config JSON for Studio and supatype-server. */
10
+ export function withAdminRoles(admin, cfg) {
11
+ const base = typeof admin === "object" && admin !== null ? admin : {};
12
+ return { ...base, adminRoles: studioAdminRoles(cfg) };
13
+ }
14
+ //# sourceMappingURL=studio-admin-roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-admin-roles.js","sourceRoot":"","sources":["../src/studio-admin-roles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,OAAO,EAAE,gBAAgB,CAAU,CAAA;AAE9E,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,GAA0B;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAA;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACzD,OAAO,CAAC,GAAG,0BAA0B,CAAC,CAAA;AACxC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,GAA0B;IACvE,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;IAClG,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAA;AACvD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { ProcessManager } from "./process-manager.js";
2
+ export interface StudioDevServerOptions {
3
+ cwd: string;
4
+ studioOverride: string;
5
+ pidDir: string;
6
+ serviceRoleKey: string;
7
+ /**
8
+ * Where Vite proxies API requests (Kong gateway port for compose dev, or
9
+ * supatype-server port for native `supatype dev`).
10
+ */
11
+ proxyTarget: string;
12
+ /**
13
+ * Public Supatype URL the browser uses. Compose dev: Kong on the host.
14
+ * Native dev: Vite dev server (same origin as Studio).
15
+ */
16
+ viteSupatypeUrl: string;
17
+ /** Vite `base` — `/studio/` when behind Kong at `/studio/`; `/` for native dev on :3002. */
18
+ basePath?: string;
19
+ }
20
+ /** Start @supatype/studio Vite dev server when `overrides.studio` is set. */
21
+ export declare function startStudioViteDevServer(opts: StudioDevServerOptions): ProcessManager | null;
22
+ //# sourceMappingURL=studio-dev-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-dev-server.d.ts","sourceRoot":"","sources":["../src/studio-dev-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIrD,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAA;IACvB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,cAAc,GAAG,IAAI,CA0B5F"}
@@ -0,0 +1,28 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { ProcessManager } from "./process-manager.js";
4
+ const STUDIO_PORT = 3002;
5
+ /** Start @supatype/studio Vite dev server when `overrides.studio` is set. */
6
+ export function startStudioViteDevServer(opts) {
7
+ const studioDir = resolve(opts.cwd, opts.studioOverride);
8
+ const viteJs = join(studioDir, "node_modules", "vite", "bin", "vite.js");
9
+ if (!existsSync(viteJs)) {
10
+ console.warn(`[supatype] ⚠ Studio override set but vite not found at ${viteJs}. Run: pnpm install`);
11
+ return null;
12
+ }
13
+ const basePath = opts.basePath ?? "/";
14
+ return new ProcessManager(process.execPath, [viteJs, "--port", String(STUDIO_PORT), "--strictPort", "--host"], {
15
+ label: "studio",
16
+ pidDir: opts.pidDir,
17
+ cwd: studioDir,
18
+ colour: "\x1b[35m",
19
+ env: {
20
+ VITE_SUPATYPE_URL: opts.viteSupatypeUrl,
21
+ SUPATYPE_PROXY_TARGET: opts.proxyTarget,
22
+ VITE_SUPATYPE_ANON_KEY: opts.serviceRoleKey,
23
+ VITE_SUPATYPE_SERVICE_ROLE_KEY: opts.serviceRoleKey,
24
+ VITE_BASE_PATH: basePath,
25
+ },
26
+ });
27
+ }
28
+ //# sourceMappingURL=studio-dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-dev-server.js","sourceRoot":"","sources":["../src/studio-dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,WAAW,GAAG,IAAI,CAAA;AAqBxB,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,IAA4B;IACnE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IACxE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,2DAA2D,MAAM,qBAAqB,CAAC,CAAA;QACpG,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAA;IACrC,OAAO,IAAI,cAAc,CACvB,OAAO,CAAC,QAAQ,EAChB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,EACjE;QACE,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE;YACH,iBAAiB,EAAE,IAAI,CAAC,eAAe;YACvC,qBAAqB,EAAE,IAAI,CAAC,WAAW;YACvC,sBAAsB,EAAE,IAAI,CAAC,cAAc;YAC3C,8BAA8B,EAAE,IAAI,CAAC,cAAc;YACnD,cAAc,EAAE,QAAQ;SACzB;KACF,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * systemd.ts — generate systemd unit files for self-hosted deployments.
3
+ *
4
+ * Usage:
5
+ * generateUnits(config, outputDir)
6
+ * → writes supatype-postgres.service + supatype-server.service to outputDir
7
+ */
8
+ import type { SupatypeProjectConfig } from "./project-config.js";
9
+ export interface SystemdOptions {
10
+ /** Directory where unit files are written. Defaults to .supatype/systemd/. */
11
+ outputDir?: string;
12
+ /** User to run services as. Defaults to current user. */
13
+ user?: string;
14
+ /** EnvironmentFile path injected into the units. Defaults to project .env. */
15
+ envFile?: string;
16
+ }
17
+ /**
18
+ * Generate supatype-postgres.service and supatype-server.service.
19
+ *
20
+ * Returns the paths of the written files.
21
+ */
22
+ export declare function generateUnits(config: SupatypeProjectConfig, projectDir: string, opts?: SystemdOptions): {
23
+ postgres: string;
24
+ server: string;
25
+ };
26
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../src/systemd.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,cAAmB,GACxB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAetC"}