@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
package/dist/config.js CHANGED
@@ -1,66 +1,134 @@
1
- import { existsSync } from "node:fs";
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
2
2
  import { resolve } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
3
5
  import { evalTsSnippet } from "./tsx-runner.js";
6
+ import { mergeProjectConfig, validateProjectConfig, } from "./project-config.js";
7
+ import { extractSchemaAstFromTypes } from "./type-extractor.js";
4
8
  /** Identity helper — provides type inference for config files. */
5
9
  export function defineConfig(config) {
6
10
  return config;
7
11
  }
8
- const CONFIG_CANDIDATES = [
12
+ const LEGACY_TOML = "supatype.config.toml";
13
+ const MAIN_CONFIG_CANDIDATES = [
9
14
  "supatype.config.ts",
10
15
  "supatype.config.js",
11
16
  "supatype.config.mjs",
12
17
  ];
13
- /** Load and evaluate supatype.config.ts from the given directory. */
18
+ const LOCAL_CONFIG_CANDIDATES = [
19
+ "supatype.local.config.ts",
20
+ "supatype.local.config.js",
21
+ "supatype.local.config.mjs",
22
+ ];
23
+ /**
24
+ * Normalize a config object parsed from JSON (e.g. shorthand `schema: "./x"`).
25
+ */
26
+ function normalizeProjectJson(raw) {
27
+ if (typeof raw !== "object" || raw === null)
28
+ return raw;
29
+ const o = { ...raw };
30
+ const sch = o["schema"];
31
+ if (typeof sch === "string") {
32
+ o["schema"] = {
33
+ path: sch,
34
+ pg_schema: typeof o["pg_schema"] === "string" ? o["pg_schema"] : "public",
35
+ };
36
+ delete o["pg_schema"];
37
+ }
38
+ return o;
39
+ }
40
+ /**
41
+ * Load project config from `supatype.config.ts` (or .js/.mjs), merged with
42
+ * optional `supatype.local.config.*` (gitignored overrides).
43
+ */
14
44
  export function loadConfig(cwd = process.cwd()) {
15
- for (const candidate of CONFIG_CANDIDATES) {
45
+ if (existsSync(resolve(cwd, LEGACY_TOML))) {
46
+ throw new Error(`Found ${LEGACY_TOML}, which is no longer supported.\n` +
47
+ "Move settings into supatype.config.ts (export default { project, database, server, app, versions, … }).\n" +
48
+ "Run `supatype init` in a new folder for a fresh template.");
49
+ }
50
+ const baseRaw = loadFirstTsConfig(cwd, MAIN_CONFIG_CANDIDATES);
51
+ if (baseRaw === null) {
52
+ throw new Error("No supatype.config.ts (or .js/.mjs) found in the current directory.\n" +
53
+ "Run: supatype init");
54
+ }
55
+ const baseNorm = normalizeProjectJson(baseRaw);
56
+ const base = validateProjectConfig(baseNorm, "supatype.config.ts");
57
+ const localRaw = loadFirstTsConfig(cwd, LOCAL_CONFIG_CANDIDATES);
58
+ if (localRaw === null)
59
+ return base;
60
+ const localNorm = normalizeProjectJson(localRaw);
61
+ return mergeProjectConfig(base, localNorm);
62
+ }
63
+ function loadFirstTsConfig(cwd, candidates) {
64
+ for (const candidate of candidates) {
16
65
  const configPath = resolve(cwd, candidate);
17
66
  if (!existsSync(configPath))
18
67
  continue;
19
68
  const urlPath = "file:///" + configPath.replace(/\\/g, "/");
20
- // Use dynamic import so we can always access .default —
21
- // files without a parent package.json are treated as CJS by tsx,
22
- // meaning export default becomes module.exports.default rather than
23
- // the namespace default. Dynamic import + fallback handles both.
24
69
  const snippet = `
25
70
  const mod = await import(${JSON.stringify(urlPath)})
26
71
  const config = mod.default ?? mod
27
72
  process.stdout.write(JSON.stringify(config))
28
73
  `;
29
74
  const result = evalTsSnippet(snippet, { cwd });
30
- if (result.exitCode !== 0) {
31
- throw new Error(`Failed to load ${candidate}:\n${result.stderr || result.stdout}`);
75
+ if (result.exitCode === 0) {
76
+ return JSON.parse(result.stdout);
77
+ }
78
+ const failure = result.stderr || result.stdout;
79
+ if (!failure.includes("ERR_PACKAGE_PATH_NOT_EXPORTED")) {
80
+ throw new Error(`Failed to load ${candidate}:\n${failure}`);
81
+ }
82
+ const fallback = loadTsConfigWithoutCliImport(configPath, cwd);
83
+ if (fallback !== null)
84
+ return fallback;
85
+ throw new Error(`Failed to load ${candidate}:\n${failure}`);
86
+ }
87
+ return null;
88
+ }
89
+ function loadTsConfigWithoutCliImport(configPath, cwd) {
90
+ const original = readFileSync(configPath, "utf8");
91
+ const patched = original
92
+ .replace(/^import\s+type\s+\{[^}]*\}\s+from\s+["']@supatype\/cli["'];?\s*$/gm, "")
93
+ .replace(/^import\s+\{[^}]*defineConfig[^}]*\}\s+from\s+["']@supatype\/cli["'];?\s*$/gm, "");
94
+ // If the file didn't import from @supatype/cli, this fallback won't help.
95
+ if (patched === original)
96
+ return null;
97
+ const tmpPath = join(tmpdir(), `supatype-config-fallback-${Date.now()}.mts`);
98
+ const wrapper = `const defineConfig = (config) => config\n${patched}`;
99
+ writeFileSync(tmpPath, wrapper, "utf8");
100
+ try {
101
+ const urlPath = "file:///" + tmpPath.replace(/\\/g, "/");
102
+ const snippet = `
103
+ const mod = await import(${JSON.stringify(urlPath)})
104
+ const config = mod.default ?? mod
105
+ process.stdout.write(JSON.stringify(config))
106
+ `;
107
+ const result = evalTsSnippet(snippet, { cwd });
108
+ if (result.exitCode !== 0)
109
+ return null;
110
+ return JSON.parse(result.stdout);
111
+ }
112
+ finally {
113
+ try {
114
+ unlinkSync(tmpPath);
32
115
  }
33
- const parsed = JSON.parse(result.stdout);
34
- if (!parsed.connection || !parsed.schema) {
35
- throw new Error(`${candidate} must export { connection, schema } via defineConfig()`);
116
+ catch {
117
+ // ignore cleanup errors
36
118
  }
37
- return parsed;
38
119
  }
39
- throw new Error("No supatype.config.ts found in the current directory.\n" +
40
- "Run: supatype init");
41
120
  }
42
121
  /** Load schema AST by evaluating the user's schema entry point via tsx. */
43
122
  export function loadSchemaAst(schemaPath, cwd = process.cwd()) {
123
+ const extracted = extractSchemaAstFromTypes(schemaPath, cwd);
124
+ if (extracted !== null)
125
+ return extracted;
44
126
  const absPath = resolve(cwd, schemaPath);
45
127
  if (!existsSync(absPath)) {
46
128
  throw new Error(`Schema file not found: ${absPath}`);
47
129
  }
48
- const urlPath = "file:///" + absPath.replace(/\\/g, "/");
49
- const snippet = `
50
- import { serialiseSchema } from "@supatype/schema"
51
- const mod = await import(${JSON.stringify(urlPath)})
52
- const { default: _default, ...named } = mod
53
- const models = Object.fromEntries(
54
- Object.entries(named).filter(([, v]) =>
55
- v != null && typeof v === "object" && "__modelMeta" in (v as object)
56
- )
57
- )
58
- process.stdout.write(JSON.stringify(serialiseSchema(models)))
59
- `;
60
- const result = evalTsSnippet(snippet, { cwd });
61
- if (result.exitCode !== 0) {
62
- throw new Error(`Failed to load schema from ${absPath}:\n${result.stderr || result.stdout}`);
63
- }
64
- return JSON.parse(result.stdout);
130
+ throw new Error("Runtime model() schemas are no longer supported.\n" +
131
+ `Could not extract type-based models from: ${absPath}\n` +
132
+ "Migrate this file to @supatype/types Model<> definitions (or run `supatype migrate-from-v1`).");
65
133
  }
66
134
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AA0G/C,kEAAkE;AAClE,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,iBAAiB,GAAG;IACxB,oBAAoB;IACpB,oBAAoB;IACpB,qBAAqB;CACtB,CAAA;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAQ;QAErC,MAAM,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAE3D,wDAAwD;QACxD,iEAAiE;QACjE,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,OAAO,GAAG;2BACO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;CAGjD,CAAA;QACG,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAClE,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAmB,CAAA;QAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,wDAAwD,CACrE,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,yDAAyD;QACvD,oBAAoB,CACvB,CAAA;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAExD,MAAM,OAAO,GAAG;;2BAES,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;;;CAQjD,CAAA;IACC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8BAA8B,OAAO,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAC5E,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * docker-postgres — manage a supatype/postgres Docker container for local dev.
3
+ *
4
+ * Used by `supatype dev` when database.provider = "docker".
5
+ * The container is named supatype-{projectName} and persists data in a
6
+ * named Docker volume (supatype-{projectName}-data) across restarts.
7
+ */
8
+ export interface DockerPgOptions {
9
+ /** Docker image to run. Defaults to supatype/postgres:17-latest. */
10
+ image: string;
11
+ /** Project name — used to derive the container and volume names. */
12
+ projectName: string;
13
+ /** Host port to bind to container's 5432. */
14
+ port: number;
15
+ /** Superuser password (dev only). Defaults to "postgres". */
16
+ password?: string;
17
+ }
18
+ /** Derived container name for a project. */
19
+ export declare function containerName(projectName: string): string;
20
+ /**
21
+ * Start the supatype/postgres Docker container.
22
+ * Removes any stopped container with the same name before starting.
23
+ * Throws if `docker run` exits non-zero.
24
+ */
25
+ export declare function dockerPgStart(opts: DockerPgOptions): void;
26
+ /**
27
+ * Stop the container (fast — does not remove it or the data volume).
28
+ * Safe to call even if the container is not running.
29
+ */
30
+ export declare function dockerPgStop(projectName: string): void;
31
+ /**
32
+ * Poll until Postgres accepts connections and the image entrypoint init has
33
+ * finished (anon/authenticated/service_role come from supatype-postgres
34
+ * migrations/db/init-scripts/00000000000000-initial-schema.sql via migrate.sh).
35
+ */
36
+ export declare function dockerPgWaitReady(projectName: string, timeoutMs?: number): Promise<void>;
37
+ /** Connection string for the Docker container (local dev credentials). */
38
+ export declare function dockerDbUrl(projectName: string, port: number): string;
39
+ //# sourceMappingURL=docker-postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-postgres.d.ts","sourceRoot":"","sources":["../src/docker-postgres.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA+BzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrE"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * docker-postgres — manage a supatype/postgres Docker container for local dev.
3
+ *
4
+ * Used by `supatype dev` when database.provider = "docker".
5
+ * The container is named supatype-{projectName} and persists data in a
6
+ * named Docker volume (supatype-{projectName}-data) across restarts.
7
+ */
8
+ import { spawnSync } from "node:child_process";
9
+ const PG_USER = "supatype_admin";
10
+ /** Derived container name for a project. */
11
+ export function containerName(projectName) {
12
+ return `supatype-${projectName}`;
13
+ }
14
+ /**
15
+ * Start the supatype/postgres Docker container.
16
+ * Removes any stopped container with the same name before starting.
17
+ * Throws if `docker run` exits non-zero.
18
+ */
19
+ export function dockerPgStart(opts) {
20
+ const { image, projectName, port, password = "postgres" } = opts;
21
+ const name = containerName(projectName);
22
+ const volume = `${name}-data`;
23
+ // Remove any stopped container from a previous session.
24
+ spawnSync("docker", ["rm", "-f", name], { encoding: "utf8" });
25
+ const result = spawnSync("docker", [
26
+ "run", "-d",
27
+ "--name", name,
28
+ "-e", `POSTGRES_USER=${PG_USER}`,
29
+ "-e", `POSTGRES_PASSWORD=${password}`,
30
+ "-e", `POSTGRES_DB=${projectName}`,
31
+ "-p", `${port}:5432`,
32
+ "-v", `${volume}:/var/lib/postgresql/data`,
33
+ image,
34
+ ], { encoding: "utf8", stdio: "pipe" });
35
+ if (result.status !== 0) {
36
+ const detail = (result.stderr ?? result.stdout ?? "").trim();
37
+ throw new Error(`Failed to start Docker container "${name}".\n` +
38
+ (detail ? ` docker: ${detail}\n` : "") +
39
+ ` Is Docker running? docker info`);
40
+ }
41
+ }
42
+ /**
43
+ * Stop the container (fast — does not remove it or the data volume).
44
+ * Safe to call even if the container is not running.
45
+ */
46
+ export function dockerPgStop(projectName) {
47
+ spawnSync("docker", ["stop", containerName(projectName)], { encoding: "utf8" });
48
+ }
49
+ /**
50
+ * Poll until Postgres accepts connections and the image entrypoint init has
51
+ * finished (anon/authenticated/service_role come from supatype-postgres
52
+ * migrations/db/init-scripts/00000000000000-initial-schema.sql via migrate.sh).
53
+ */
54
+ export async function dockerPgWaitReady(projectName, timeoutMs = 30_000) {
55
+ const name = containerName(projectName);
56
+ const deadline = Date.now() + timeoutMs;
57
+ while (Date.now() < deadline) {
58
+ const ready = spawnSync("docker", ["exec", name, "pg_isready", "-U", PG_USER, "-q"], { encoding: "utf8" });
59
+ if (ready.status === 0) {
60
+ const initDone = spawnSync("docker", [
61
+ "exec", name,
62
+ "psql", "-U", PG_USER, "-d", projectName, "-tAc",
63
+ "SELECT EXISTS (SELECT FROM pg_roles WHERE rolname = 'anon')",
64
+ ], { encoding: "utf8", stdio: "pipe" });
65
+ if (initDone.status === 0 && initDone.stdout?.trim() === "t")
66
+ return;
67
+ }
68
+ await sleep(300);
69
+ }
70
+ const logs = spawnSync("docker", ["logs", "--tail", "30", name], {
71
+ encoding: "utf8",
72
+ });
73
+ throw new Error(`Docker Postgres "${name}" did not finish image init within ${timeoutMs}ms.\n` +
74
+ " API roles (anon, authenticated, service_role) are created by the supatype/postgres\n" +
75
+ " entrypoint (99-supatype-migrate.sh), not by the CLI.\n" +
76
+ " If you upgraded the image, remove the stale volume:\n" +
77
+ ` docker volume rm ${name}-data\n` +
78
+ (logs.stdout ? ` stdout:\n${indent(logs.stdout)}\n` : "") +
79
+ (logs.stderr ? ` stderr:\n${indent(logs.stderr)}\n` : ""));
80
+ }
81
+ /** Connection string for the Docker container (local dev credentials). */
82
+ export function dockerDbUrl(projectName, port) {
83
+ // Local image has no TLS; sqlx/libpq default "prefer" can mis-handle the SSLRequest on some hosts.
84
+ return `postgres://${PG_USER}:postgres@127.0.0.1:${port}/${projectName}?sslmode=disable`;
85
+ }
86
+ function sleep(ms) {
87
+ return new Promise((resolve) => setTimeout(resolve, ms));
88
+ }
89
+ function indent(s) {
90
+ return s
91
+ .trimEnd()
92
+ .split("\n")
93
+ .map((l) => ` ${l}`)
94
+ .join("\n");
95
+ }
96
+ //# sourceMappingURL=docker-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-postgres.js","sourceRoot":"","sources":["../src/docker-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * engine-client.ts — subprocess-based engine invocation.
3
+ *
4
+ * Replaces the former HTTP-based engine client (Docker container API).
5
+ * All callers use the same interface; only the transport changed.
6
+ *
7
+ * The engine binary reads a request JSON file passed via --request-file and
8
+ * writes a response JSON to stdout.
9
+ */
10
+ export interface Operation {
11
+ kind: "create_table" | "alter_table" | "drop_table" | "create_index" | "drop_index" | "create_policy" | "drop_policy" | "add_column" | "drop_column" | "alter_column";
12
+ description: string;
13
+ risk?: "safe" | "warn" | "danger";
14
+ sql?: string;
15
+ }
16
+ export interface DiffResult {
17
+ operations: Operation[];
18
+ warnings?: string[];
19
+ summary?: string;
20
+ }
21
+ export interface IntrospectResult {
22
+ models: Array<{
23
+ name: string;
24
+ table: string;
25
+ columns: Array<{
26
+ name: string;
27
+ type: string;
28
+ nullable: boolean;
29
+ default?: string;
30
+ primaryKey?: boolean;
31
+ unique?: boolean;
32
+ references?: {
33
+ table: string;
34
+ column: string;
35
+ };
36
+ }>;
37
+ }>;
38
+ }
39
+ export interface EngineResult<T = unknown> {
40
+ ok: boolean;
41
+ data: T;
42
+ message?: string;
43
+ error?: string;
44
+ }
45
+ export declare class EngineError extends Error {
46
+ readonly endpoint: string;
47
+ readonly exitCode: number | null;
48
+ constructor(message: string, endpoint: string, exitCode: number | null);
49
+ }
50
+ /** Verify the engine binary is accessible. Throws if not found. */
51
+ export declare function ensureEngine(): Promise<void>;
52
+ /** Check if the engine can be invoked. Returns true/false. */
53
+ export declare function engineHealth(): Promise<boolean>;
54
+ /**
55
+ * Invoke the engine and return a typed result.
56
+ *
57
+ * The endpoint maps to a subcommand:
58
+ * /diff → engine diff
59
+ * /push → engine push
60
+ * /generate → engine generate
61
+ * /migrations → engine migrations
62
+ * /introspect → engine introspect
63
+ * /validate → engine validate
64
+ * /admin → engine admin (admin-config JSON on stdout)
65
+ */
66
+ export declare function engineRequest<T = unknown>(endpoint: string, body: Record<string, unknown>): Promise<T>;
67
+ //# sourceMappingURL=engine-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-client.d.ts","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,YAAY,GAC7E,eAAe,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAAA;IACrF,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAA;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,OAAO,CAAA;YACjB,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,MAAM,CAAC,EAAE,OAAO,CAAA;YAChB,UAAU,CAAC,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAA;SAC/C,CAAC,CAAA;KACH,CAAC,CAAA;CACH;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,CAAC,CAAA;IACP,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;aAGlB,QAAQ,EAAE,MAAM;aAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAFvC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GAAG,IAAI;CAK1C;AA4CD,mEAAmE;AACnE,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAQrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CA0CZ"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * engine-client.ts — subprocess-based engine invocation.
3
+ *
4
+ * Replaces the former HTTP-based engine client (Docker container API).
5
+ * All callers use the same interface; only the transport changed.
6
+ *
7
+ * The engine binary reads a request JSON file passed via --request-file and
8
+ * writes a response JSON to stdout.
9
+ */
10
+ import { spawnSync } from "node:child_process";
11
+ import { mkdirSync, writeFileSync, unlinkSync, existsSync, readdirSync } from "node:fs";
12
+ import { tmpdir, homedir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { loadConfig } from "./config.js";
15
+ import { resolveBinary, currentPlatform, cachePath } from "./binary-cache.js";
16
+ export class EngineError extends Error {
17
+ endpoint;
18
+ exitCode;
19
+ constructor(message, endpoint, exitCode) {
20
+ super(message);
21
+ this.endpoint = endpoint;
22
+ this.exitCode = exitCode;
23
+ this.name = "EngineError";
24
+ }
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Engine binary resolution
28
+ // ---------------------------------------------------------------------------
29
+ let _engineBin = null;
30
+ async function getEngineBin() {
31
+ if (_engineBin)
32
+ return _engineBin;
33
+ const cwd = process.cwd();
34
+ try {
35
+ const config = loadConfig(cwd);
36
+ _engineBin = await resolveBinary("engine", config);
37
+ return _engineBin;
38
+ }
39
+ catch {
40
+ // No valid project config — fall through to default cache path.
41
+ }
42
+ // No config found — scan the cache for any available engine binary.
43
+ const platform = currentPlatform();
44
+ const engineCacheDir = join(homedir(), ".supatype", "cache", "engine");
45
+ try {
46
+ const cachedVersions = readdirSync(engineCacheDir).sort();
47
+ for (const version of cachedVersions.reverse()) {
48
+ const bin = join(cachePath("engine", version), `supatype-engine-${platform.os}-${platform.arch}`);
49
+ if (existsSync(bin)) {
50
+ _engineBin = bin;
51
+ return _engineBin;
52
+ }
53
+ }
54
+ }
55
+ catch { /* cache dir doesn't exist */ }
56
+ throw new Error("Engine binary not found. Run: supatype update");
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Public API
60
+ // ---------------------------------------------------------------------------
61
+ /** Verify the engine binary is accessible. Throws if not found. */
62
+ export async function ensureEngine() {
63
+ await getEngineBin();
64
+ }
65
+ /** Check if the engine can be invoked. Returns true/false. */
66
+ export async function engineHealth() {
67
+ try {
68
+ const bin = await getEngineBin();
69
+ const result = spawnSync(bin, ["--version"], { encoding: "utf8" });
70
+ return result.status === 0;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ /**
77
+ * Invoke the engine and return a typed result.
78
+ *
79
+ * The endpoint maps to a subcommand:
80
+ * /diff → engine diff
81
+ * /push → engine push
82
+ * /generate → engine generate
83
+ * /migrations → engine migrations
84
+ * /introspect → engine introspect
85
+ * /validate → engine validate
86
+ * /admin → engine admin (admin-config JSON on stdout)
87
+ */
88
+ export async function engineRequest(endpoint, body) {
89
+ const bin = await getEngineBin();
90
+ // Write request to a temp file.
91
+ // For CLI-mode endpoints the engine reads the input file as a raw SchemaAst,
92
+ // so we extract the `ast` field when present, otherwise write the full body.
93
+ const tmpDir = join(tmpdir(), "supatype-engine");
94
+ mkdirSync(tmpDir, { recursive: true });
95
+ const reqFile = join(tmpDir, `req-${Date.now()}.json`);
96
+ const inputPayload = body["ast"] !== undefined ? body["ast"] : body;
97
+ writeFileSync(reqFile, JSON.stringify(inputPayload));
98
+ const args = endpointToArgs(endpoint, body, reqFile);
99
+ const result = spawnSync(bin, args, {
100
+ encoding: "utf8",
101
+ cwd: process.cwd(),
102
+ });
103
+ // Clean up temp file.
104
+ try {
105
+ unlinkSync(reqFile);
106
+ }
107
+ catch { /* ignore */ }
108
+ if (result.status !== 0) {
109
+ const stderr = result.stderr?.trim() || "(no output)";
110
+ throw new EngineError(`Engine ${endpoint} failed (exit ${result.status}): ${stderr}`, endpoint, result.status);
111
+ }
112
+ if (!result.stdout?.trim()) {
113
+ // Some subcommands print nothing on success.
114
+ return {};
115
+ }
116
+ try {
117
+ return JSON.parse(result.stdout);
118
+ }
119
+ catch {
120
+ // Non-JSON stdout — return as message.
121
+ return { message: result.stdout.trim() };
122
+ }
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // Endpoint → CLI args mapping
126
+ // ---------------------------------------------------------------------------
127
+ function endpointToArgs(endpoint, body, reqFile) {
128
+ const dbUrl = body["database_url"] ?? "";
129
+ const schema = body["schema"] ?? "public";
130
+ const force = body["force"] ? ["--force"] : [];
131
+ switch (endpoint) {
132
+ case "/diff":
133
+ return ["diff", "--input", reqFile, "--database-url", dbUrl, "--schema", schema];
134
+ case "/push":
135
+ return ["push", "--input", reqFile, "--database-url", dbUrl, "--schema", schema, ...force];
136
+ case "/parse":
137
+ return ["parse", "--input", reqFile];
138
+ case "/generate": {
139
+ const lang = body["lang"] ?? "typescript";
140
+ return ["generate", "--input", reqFile, "--lang", lang];
141
+ }
142
+ case "/introspect":
143
+ return ["introspect", "--database-url", dbUrl, "--schema", schema];
144
+ case "/validate":
145
+ return ["validate", "--input", reqFile];
146
+ case "/admin":
147
+ return ["admin", "--input", reqFile];
148
+ default:
149
+ if (endpoint.startsWith("/migrations")) {
150
+ const action = body["action"] ?? "list";
151
+ return ["migrations", action, "--database-url", dbUrl];
152
+ }
153
+ return [endpoint.replace(/^\//, ""), "--input", reqFile];
154
+ }
155
+ }
156
+ //# sourceMappingURL=engine-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-client.js","sourceRoot":"","sources":["../src/engine-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve component binaries, downloading from the CDN when not cached.
3
+ */
4
+ import { type Component } from "./binary-cache.js";
5
+ import type { SupatypeProjectConfig } from "./project-config.js";
6
+ export declare function ensureBinary(component: Component, config: SupatypeProjectConfig): Promise<string>;
7
+ //# sourceMappingURL=ensure-binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-binary.d.ts","sourceRoot":"","sources":["../src/ensure-binary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAWjB"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Resolve component binaries, downloading from the CDN when not cached.
3
+ */
4
+ import { resolveBinary, download, currentPlatform, versionFor, } from "./binary-cache.js";
5
+ export async function ensureBinary(component, config) {
6
+ try {
7
+ return await resolveBinary(component, config);
8
+ }
9
+ catch (err) {
10
+ const message = err instanceof Error ? err.message : String(err);
11
+ if (!message.includes("not found in cache")) {
12
+ throw err;
13
+ }
14
+ }
15
+ return download(component, versionFor(component, config), currentPlatform());
16
+ }
17
+ //# sourceMappingURL=ensure-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-binary.js","sourceRoot":"","sources":["../src/ensure-binary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,aAAa,EACb,QAAQ,EACR,eAAe,EACf,UAAU,GAEX,MAAM,mBAAmB,CAAA;AAG1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAoB,EACpB,MAA6B;IAE7B,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface DiscoveredFunctionRoute {
2
+ name: string;
3
+ entrypoint: string;
4
+ }
5
+ /** Discover *.ts handlers and `{name}/index.ts` dirs; skips `_shared`, dotfiles. */
6
+ export declare function discoverTsFunctionsInDir(functionsDir: string): DiscoveredFunctionRoute[];
7
+ /** Router source rooted at routerFilePath (defines import paths). */
8
+ export declare function generateFunctionsRouterSource(routerFilePath: string, fns: DiscoveredFunctionRoute[]): string;
9
+ /**
10
+ * Writes `.supatype/functions-router.ts` under project cwd. Returns absolute path or null if no handlers.
11
+ * Pass `routes` when callers already scanned the dir to avoid duplicate I/O.
12
+ */
13
+ export declare function writeDevFunctionsRouter(cwd: string, functionsDir: string, routes?: DiscoveredFunctionRoute[]): string | null;
14
+ //# sourceMappingURL=functions-router-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions-router-gen.d.ts","sourceRoot":"","sources":["../src/functions-router-gen.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAsBxF;AAQD,qEAAqE;AACrE,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,uBAAuB,EAAE,GAC7B,MAAM,CAsJR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,uBAAuB,EAAE,GACjC,MAAM,GAAG,IAAI,CAUf"}