@supatype/cli 0.1.0-alpha.7 → 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 (123) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +67 -62
  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/binary-cache.d.ts +5 -0
  9. package/dist/binary-cache.d.ts.map +1 -1
  10. package/dist/binary-cache.js +13 -0
  11. package/dist/binary-cache.js.map +1 -1
  12. package/dist/commands/cloud.d.ts +11 -3
  13. package/dist/commands/cloud.d.ts.map +1 -1
  14. package/dist/commands/cloud.js +33 -25
  15. package/dist/commands/cloud.js.map +1 -1
  16. package/dist/commands/deploy.d.ts.map +1 -1
  17. package/dist/commands/deploy.js +3 -17
  18. package/dist/commands/deploy.js.map +1 -1
  19. package/dist/commands/dev.d.ts +3 -3
  20. package/dist/commands/dev.d.ts.map +1 -1
  21. package/dist/commands/dev.js +66 -59
  22. package/dist/commands/dev.js.map +1 -1
  23. package/dist/commands/diff.d.ts.map +1 -1
  24. package/dist/commands/diff.js +11 -1
  25. package/dist/commands/diff.js.map +1 -1
  26. package/dist/commands/init.js +16 -3
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/push.d.ts.map +1 -1
  29. package/dist/commands/push.js +42 -12
  30. package/dist/commands/push.js.map +1 -1
  31. package/dist/commands/update.d.ts.map +1 -1
  32. package/dist/commands/update.js +16 -0
  33. package/dist/commands/update.js.map +1 -1
  34. package/dist/dev-compose.d.ts +17 -0
  35. package/dist/dev-compose.d.ts.map +1 -0
  36. package/dist/dev-compose.js +374 -0
  37. package/dist/dev-compose.js.map +1 -0
  38. package/dist/diff-output.d.ts +4 -0
  39. package/dist/diff-output.d.ts.map +1 -0
  40. package/dist/diff-output.js +12 -0
  41. package/dist/diff-output.js.map +1 -0
  42. package/dist/docker-postgres.d.ts +21 -3
  43. package/dist/docker-postgres.d.ts.map +1 -1
  44. package/dist/docker-postgres.js +130 -18
  45. package/dist/docker-postgres.js.map +1 -1
  46. package/dist/engine-client.d.ts +5 -3
  47. package/dist/engine-client.d.ts.map +1 -1
  48. package/dist/engine-client.js +2 -1
  49. package/dist/engine-client.js.map +1 -1
  50. package/dist/kong-config.d.ts +4 -0
  51. package/dist/kong-config.d.ts.map +1 -1
  52. package/dist/kong-config.js +12 -1
  53. package/dist/kong-config.js.map +1 -1
  54. package/dist/process-manager.d.ts +2 -0
  55. package/dist/process-manager.d.ts.map +1 -1
  56. package/dist/process-manager.js +16 -1
  57. package/dist/process-manager.js.map +1 -1
  58. package/dist/project-config.d.ts +21 -1
  59. package/dist/project-config.d.ts.map +1 -1
  60. package/dist/project-config.js +15 -0
  61. package/dist/project-config.js.map +1 -1
  62. package/dist/runtime-routes.d.ts +9 -0
  63. package/dist/runtime-routes.d.ts.map +1 -1
  64. package/dist/runtime-routes.js +75 -12
  65. package/dist/runtime-routes.js.map +1 -1
  66. package/dist/schema-ast-v2.d.ts +127 -0
  67. package/dist/schema-ast-v2.d.ts.map +1 -0
  68. package/dist/schema-ast-v2.js +226 -0
  69. package/dist/schema-ast-v2.js.map +1 -0
  70. package/dist/self-host-compose.d.ts +12 -4
  71. package/dist/self-host-compose.d.ts.map +1 -1
  72. package/dist/self-host-compose.js +146 -35
  73. package/dist/self-host-compose.js.map +1 -1
  74. package/dist/studio-admin-roles.d.ts +7 -0
  75. package/dist/studio-admin-roles.d.ts.map +1 -0
  76. package/dist/studio-admin-roles.js +14 -0
  77. package/dist/studio-admin-roles.js.map +1 -0
  78. package/dist/studio-dev-server.d.ts +22 -0
  79. package/dist/studio-dev-server.d.ts.map +1 -0
  80. package/dist/studio-dev-server.js +28 -0
  81. package/dist/studio-dev-server.js.map +1 -0
  82. package/dist/type-extractor.d.ts +3 -30
  83. package/dist/type-extractor.d.ts.map +1 -1
  84. package/dist/type-extractor.js +485 -148
  85. package/dist/type-extractor.js.map +1 -1
  86. package/dist/type-resolver.d.ts +33 -0
  87. package/dist/type-resolver.d.ts.map +1 -0
  88. package/dist/type-resolver.js +338 -0
  89. package/dist/type-resolver.js.map +1 -0
  90. package/package.json +1 -1
  91. package/src/TYPE-RESOLUTION.md +294 -0
  92. package/src/app/proxy-dev-app.ts +67 -0
  93. package/src/binary-cache.ts +20 -0
  94. package/src/commands/cloud.ts +40 -30
  95. package/src/commands/deploy.ts +3 -18
  96. package/src/commands/dev.ts +72 -69
  97. package/src/commands/diff.ts +11 -1
  98. package/src/commands/init.ts +16 -3
  99. package/src/commands/push.ts +49 -13
  100. package/src/commands/update.ts +17 -0
  101. package/src/dev-compose.ts +455 -0
  102. package/src/diff-output.ts +12 -0
  103. package/src/docker-postgres.ts +184 -27
  104. package/src/engine-client.ts +9 -4
  105. package/src/kong-config.ts +16 -1
  106. package/src/process-manager.ts +18 -1
  107. package/src/project-config.ts +34 -1
  108. package/src/runtime-routes.ts +87 -12
  109. package/src/schema-ast-v2.ts +324 -0
  110. package/src/self-host-compose.ts +168 -36
  111. package/src/studio-admin-roles.ts +16 -0
  112. package/src/studio-dev-server.ts +53 -0
  113. package/src/type-extractor.ts +649 -186
  114. package/src/type-resolver.ts +457 -0
  115. package/tests/config.test.ts +34 -3
  116. package/tests/docker-postgres.test.ts +39 -0
  117. package/tests/normalize-admin-config.test.ts +48 -0
  118. package/tests/proxy-dev-app.test.ts +33 -0
  119. package/tests/runtime-contract.test.ts +119 -4
  120. package/tests/studio-admin-roles.test.ts +27 -0
  121. package/tests/type-extractor.test.ts +607 -23
  122. package/tests/type-resolver.test.ts +59 -0
  123. package/tsconfig.tsbuildinfo +1 -1
@@ -1,4 +1,4 @@
1
- import type { SupatypeProjectConfig } from "./project-config.js";
1
+ import { type SupatypeProjectConfig } from "./project-config.js";
2
2
  export interface SelfHostComposePaths {
3
3
  dir: string;
4
4
  composePath: string;
@@ -8,7 +8,15 @@ export interface SelfHostComposePaths {
8
8
  export declare function selfHostComposePaths(cwd: string): SelfHostComposePaths;
9
9
  export declare function appUpstreamForCompose(config: SupatypeProjectConfig): string | undefined;
10
10
  export declare function staticDirForCompose(config: SupatypeProjectConfig): string | undefined;
11
- export declare function renderSelfHostCompose(config: SupatypeProjectConfig, cwd?: string): string;
12
- export declare function writeSelfHostCompose(cwd: string, config: SupatypeProjectConfig): SelfHostComposePaths;
13
- export declare function runDockerCompose(composePath: string, args: string[], projectRoot?: string): number;
11
+ /** Host Vite dev server as seen from Kong inside Docker Compose. */
12
+ export declare const COMPOSE_STUDIO_HOST_URL = "http://host.docker.internal:3002";
13
+ export interface SelfHostComposeOptions {
14
+ /** `supatype dev` with provider docker: internal-only db/server; Kong on host :18473. */
15
+ devLocal?: boolean;
16
+ }
17
+ export declare function renderSelfHostCompose(config: SupatypeProjectConfig, cwd?: string, options?: SelfHostComposeOptions): string;
18
+ export declare function writeSelfHostCompose(cwd: string, config: SupatypeProjectConfig, options?: SelfHostComposeOptions): SelfHostComposePaths;
19
+ export declare function runDockerCompose(composePath: string, args: string[], projectRoot?: string, composeProject?: string): number;
20
+ /** Compose project name for a Supatype project — isolates docker state per project. */
21
+ export declare function composeProjectName(projectName: string): string;
14
22
  //# sourceMappingURL=self-host-compose.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-host-compose.d.ts","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAGhE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAQtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAIvF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAIrF;AAuBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CA4JxG;AAgBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,oBAAoB,CAarG;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,GAAE,MAAsB,GAAG,MAAM,CAajH"}
1
+ {"version":3,"file":"self-host-compose.d.ts","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqC,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAInG,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAQtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAIvF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,GAAG,SAAS,CAIrF;AAwBD,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,qCAAqC,CAAA;AA+CzE,MAAM,WAAW,sBAAsB;IACrC,yFAAyF;IACzF,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,GAAG,GAAE,MAAsB,EAC3B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAqMR;AAoBD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,qBAAqB,EAC7B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,oBAAoB,CAmBtB;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,GAAE,MAAsB,EACnC,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAoBR;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9D"}
@@ -1,6 +1,8 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join, relative, resolve } from "node:path";
3
3
  import { spawnSync } from "node:child_process";
4
+ import { preferredFunctionsPathFromProject } from "./project-config.js";
5
+ import { hasEngineOverride, hasStudioOverride } from "./binary-cache.js";
4
6
  import { buildKongDeclarative } from "./kong-config.js";
5
7
  export function selfHostComposePaths(cwd) {
6
8
  const dir = resolve(cwd, ".supatype", "self-host");
@@ -23,15 +25,61 @@ export function staticDirForCompose(config) {
23
25
  const dir = config.app.static_dir?.trim();
24
26
  return dir && dir.length > 0 ? dir : "./public";
25
27
  }
26
- function projectMountPath(cwd) {
27
- const composeDir = resolve(cwd, ".supatype", "self-host");
28
- let rel = relative(composeDir, resolve(cwd)).replace(/\\/g, "/");
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, "/");
29
39
  if (!rel.startsWith(".") && !rel.startsWith("/")) {
30
40
  rel = `./${rel}`;
31
41
  }
32
- return rel || "../..";
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`;
33
64
  }
34
- function serverAppEnvForCompose(config) {
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) {
35
83
  const mode = config.app.mode ?? "none";
36
84
  const lines = [` SUPATYPE_APP_MODE: ${mode}`];
37
85
  if (mode === "static") {
@@ -39,25 +87,62 @@ function serverAppEnvForCompose(config) {
39
87
  lines.push(` SUPATYPE_APP_STATIC_DIR: /project/${dir.replace(/^\.\//, "")}`);
40
88
  }
41
89
  else if (mode === "proxy" && config.app.upstream?.trim()) {
42
- lines.push(` SUPATYPE_APP_UPSTREAM: ${config.app.upstream.trim()}`);
90
+ lines.push(` SUPATYPE_APP_UPSTREAM: ${proxyUpstreamForCompose(config.app.upstream, devLocal)}`);
43
91
  }
44
92
  return lines.join("\n");
45
93
  }
46
- export function renderSelfHostCompose(config, cwd = process.cwd()) {
94
+ export function renderSelfHostCompose(config, cwd = process.cwd(), options) {
47
95
  const projectMount = projectMountPath(cwd);
48
- const appEnv = serverAppEnvForCompose(config);
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
+ `;
49
136
  return `# Generated by supatype self-host compose
50
137
  # Kong → supatype-server (unified gateway) → internal PostgREST / storage / etc.
51
138
  services:
52
139
  db:
53
- image: \${SUPATYPE_POSTGRES_IMAGE:-supatype/postgres:17-latest}
140
+ image: \${SUPATYPE_POSTGRES_IMAGE:-supatype/postgres:latest}
54
141
  environment:
55
142
  POSTGRES_USER: \${POSTGRES_USER:-supatype_admin}
56
143
  POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
57
144
  POSTGRES_DB: \${POSTGRES_DB:-supatype}
58
- ports:
59
- - "5432:5432"
60
- volumes:
145
+ ${dbPorts} volumes:
61
146
  - db-data:/var/lib/postgresql/data
62
147
  healthcheck:
63
148
  test: ["CMD-SHELL", "pg_isready -U \${POSTGRES_USER:-supatype_admin}"]
@@ -71,7 +156,7 @@ services:
71
156
  - "3000"
72
157
  environment:
73
158
  PGRST_DB_URI: postgresql://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}
74
- PGRST_DB_SCHEMA: "public, supatype"
159
+ PGRST_DB_SCHEMA: "public, supatype, graphql_public"
75
160
  PGRST_DB_ANON_ROLE: anon
76
161
  PGRST_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
77
162
  PGRST_DB_EXTRA_SEARCH_PATH: public,extensions
@@ -110,19 +195,20 @@ services:
110
195
  SUPATYPE_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
111
196
  SUPATYPE_ANON_KEY: \${ANON_KEY:-}
112
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}}
113
201
  depends_on:
114
202
  db:
115
203
  condition: service_healthy
116
204
 
117
205
  server:
118
206
  image: \${SUPATYPE_SERVER_IMAGE:-\${SUPATYPE_AUTH_IMAGE:-supatype/server:latest}}
119
- ports:
120
- - "9999:9999"
121
- volumes:
207
+ ${serverPorts} volumes:
122
208
  - ${projectMount}:/project:ro
123
209
  working_dir: /project
124
210
  environment:
125
- SUPATYPE_MODE: standalone
211
+ SUPATYPE_MODE: ${devLocal ? "dev" : "standalone"}
126
212
  SUPATYPE_MANIFEST_PATH: /project/.supatype/manifest.json
127
213
  SUPATYPE_ADMIN_CONFIG_PATH: /project/.supatype/admin-config.json
128
214
  SUPATYPE_API_CONFIG_PATH: /project/.supatype/api-config.json
@@ -150,6 +236,7 @@ ${appEnv}
150
236
  GOTRUE_JWT_ADMIN_ROLES: service_role,supatype_admin
151
237
  GOTRUE_MAILER_AUTOCONFIRM: \${GOTRUE_MAILER_AUTOCONFIRM:-true}
152
238
  GOTRUE_DISABLE_SIGNUP: \${DISABLE_SIGNUP:-false}
239
+ ${devLocal ? " STUDIO_OPEN_DEV: \"1\"\n" : ""}
153
240
  depends_on:
154
241
  db:
155
242
  condition: service_healthy
@@ -166,17 +253,20 @@ ${appEnv}
166
253
  environment:
167
254
  MINIO_ROOT_USER: supatype
168
255
  MINIO_ROOT_PASSWORD: supatype-secret
169
- ports:
170
- - "9000:9000"
171
- - "9001:9001"
172
- volumes:
256
+ ${minioPorts} volumes:
173
257
  - minio-data:/data
174
258
 
175
- studio:
176
- image: \${SUPATYPE_STUDIO_IMAGE:-supatype/studio:latest}
177
- expose:
178
- - "3002"
179
-
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}
180
270
  kong:
181
271
  image: kong:3.6
182
272
  environment:
@@ -187,12 +277,11 @@ ${appEnv}
187
277
  KONG_PROXY_ERROR_LOG: /dev/stderr
188
278
  KONG_ADMIN_ERROR_LOG: /dev/stderr
189
279
  volumes:
190
- - ./kong.yml:/etc/kong/kong.yml:ro
280
+ - ${kongMount}:/etc/kong/kong.yml:ro
191
281
  ports:
192
- - "18473:8000"
282
+ - "\${SUPATYPE_KONG_PORT:-18473}:8000"
193
283
  depends_on:
194
- - server
195
- - studio
284
+ ${kongDependsOn}
196
285
 
197
286
  volumes:
198
287
  db-data:
@@ -213,24 +302,46 @@ function ensureComposeManifest(cwd) {
213
302
  };
214
303
  writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
215
304
  }
216
- export function writeSelfHostCompose(cwd, config) {
305
+ function ensureProjectFunctionsDir(cwd, config) {
306
+ mkdirSync(preferredFunctionsPathFromProject(config, cwd), { recursive: true });
307
+ }
308
+ export function writeSelfHostCompose(cwd, config, options) {
217
309
  const paths = selfHostComposePaths(cwd);
218
310
  mkdirSync(paths.dir, { recursive: true });
311
+ ensureProjectFunctionsDir(cwd, config);
219
312
  ensureComposeManifest(cwd);
220
- writeFileSync(paths.composePath, renderSelfHostCompose(config, cwd), "utf8");
313
+ writeFileSync(paths.composePath, renderSelfHostCompose(config, cwd, options), "utf8");
314
+ const studioHostDev = options?.devLocal === true && hasStudioOverride(config);
221
315
  writeFileSync(paths.kongPath, buildKongDeclarative({
222
316
  unifiedGateway: true,
317
+ ...(studioHostDev && {
318
+ studioServiceUrl: COMPOSE_STUDIO_HOST_URL,
319
+ studioStripPath: false,
320
+ }),
223
321
  }), "utf8");
224
322
  return paths;
225
323
  }
226
- export function runDockerCompose(composePath, args, projectRoot = process.cwd()) {
324
+ export function runDockerCompose(composePath, args, projectRoot = process.cwd(), composeProject) {
227
325
  const envFile = resolve(projectRoot, ".env");
228
- const composeArgs = ["compose", "-f", composePath];
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);
229
335
  if (existsSync(envFile)) {
230
336
  composeArgs.push("--env-file", envFile);
231
337
  }
232
338
  composeArgs.push(...args);
233
- const result = spawnSync("docker", composeArgs, { stdio: "inherit", cwd: dirname(composePath) });
339
+ const result = spawnSync("docker", composeArgs, { stdio: "inherit", cwd: projectRoot });
234
340
  return result.status ?? 1;
235
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
+ }
236
347
  //# sourceMappingURL=self-host-compose.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-host-compose.js","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-host-compose.js","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -1,31 +1,4 @@
1
- type FieldAst = Record<string, unknown> & {
2
- kind: string;
3
- };
4
- interface ModelAst {
5
- name: string;
6
- tableName: string;
7
- fields: Record<string, FieldAst>;
8
- access: Record<string, unknown>;
9
- indexes: unknown[];
10
- options: Record<string, unknown>;
11
- }
12
- /** Resolved row for `storage.buckets` — matches engine `StorageBucketAst` (camelCase JSON). */
13
- export interface ExtractedStorageBucketAst {
14
- id: string;
15
- public: boolean;
16
- /** `public` / `private` / `custom` — drives DB `access_mode` and S3 helpers (engine + storage server). */
17
- accessMode?: "public" | "private" | "custom";
18
- allowedMimeTypes?: string[];
19
- fileSizeLimit?: number;
20
- /** Bucket-scoped `storage.objects` RLS (`read`, `create`, `delete`). */
21
- access?: Record<string, unknown>;
22
- /** Raw S3 bucket policy JSON; overrides default public-read when `public` is true if set. */
23
- s3BucketPolicy?: string;
24
- }
25
- export interface ExtractedSchemaAst {
26
- models: ModelAst[];
27
- storageBuckets?: ExtractedStorageBucketAst[];
28
- }
29
- export declare function extractSchemaAstFromTypes(schemaPath: string, cwd?: string): ExtractedSchemaAst | null;
30
- export {};
1
+ import { type ExtractedSchemaAstV2 } from "./schema-ast-v2.js";
2
+ export type { ExtractedSchemaAstV2 as ExtractedSchemaAst, ExtractedStorageBucketAst } from "./schema-ast-v2.js";
3
+ export declare function extractSchemaAstFromTypes(schemaPath: string, cwd?: string): ExtractedSchemaAstV2 | null;
31
4
  //# sourceMappingURL=type-extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"type-extractor.d.ts","sourceRoot":"","sources":["../src/type-extractor.ts"],"names":[],"mappings":"AAIA,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAQ1D,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,+FAA+F;AAC/F,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,0GAA0G;IAC1G,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;IAC5C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,cAAc,CAAC,EAAE,yBAAyB,EAAE,CAAA;CAC7C;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAsB,GAC1B,kBAAkB,GAAG,IAAI,CAiF3B"}
1
+ {"version":3,"file":"type-extractor.d.ts","sourceRoot":"","sources":["../src/type-extractor.ts"],"names":[],"mappings":"AAaA,OAAO,EAOL,KAAK,oBAAoB,EAI1B,MAAM,oBAAoB,CAAA;AAE3B,YAAY,EAAE,oBAAoB,IAAI,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAM/G,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAsB,GAC1B,oBAAoB,GAAG,IAAI,CA4G7B"}