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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +208 -1
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/dist/app/proxy-dev-app.d.ts +13 -0
  5. package/dist/app/proxy-dev-app.d.ts.map +1 -0
  6. package/dist/app/proxy-dev-app.js +53 -0
  7. package/dist/app/proxy-dev-app.js.map +1 -0
  8. package/dist/app-config.d.ts +7 -0
  9. package/dist/app-config.d.ts.map +1 -0
  10. package/dist/app-config.js +113 -0
  11. package/dist/app-config.js.map +1 -0
  12. package/dist/augmentation-generator.d.ts +2 -0
  13. package/dist/augmentation-generator.d.ts.map +1 -0
  14. package/dist/augmentation-generator.js +111 -0
  15. package/dist/augmentation-generator.js.map +1 -0
  16. package/dist/binary-cache.d.ts +94 -0
  17. package/dist/binary-cache.d.ts.map +1 -0
  18. package/dist/binary-cache.js +669 -0
  19. package/dist/binary-cache.js.map +1 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +13 -7
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/admin.d.ts.map +1 -1
  24. package/dist/commands/admin.js +4 -3
  25. package/dist/commands/admin.js.map +1 -1
  26. package/dist/commands/app.d.ts.map +1 -1
  27. package/dist/commands/app.js +56 -209
  28. package/dist/commands/app.js.map +1 -1
  29. package/dist/commands/cache.d.ts +6 -0
  30. package/dist/commands/cache.d.ts.map +1 -0
  31. package/dist/commands/cache.js +105 -0
  32. package/dist/commands/cache.js.map +1 -0
  33. package/dist/commands/cloud.d.ts +20 -0
  34. package/dist/commands/cloud.d.ts.map +1 -1
  35. package/dist/commands/cloud.js +50 -52
  36. package/dist/commands/cloud.js.map +1 -1
  37. package/dist/commands/db.d.ts.map +1 -1
  38. package/dist/commands/db.js +47 -54
  39. package/dist/commands/db.js.map +1 -1
  40. package/dist/commands/deploy.d.ts +2 -1
  41. package/dist/commands/deploy.d.ts.map +1 -1
  42. package/dist/commands/deploy.js +79 -52
  43. package/dist/commands/deploy.js.map +1 -1
  44. package/dist/commands/dev.d.ts +11 -0
  45. package/dist/commands/dev.d.ts.map +1 -1
  46. package/dist/commands/dev.js +759 -385
  47. package/dist/commands/dev.js.map +1 -1
  48. package/dist/commands/diff.d.ts.map +1 -1
  49. package/dist/commands/diff.js +30 -15
  50. package/dist/commands/diff.js.map +1 -1
  51. package/dist/commands/engine.d.ts +1 -3
  52. package/dist/commands/engine.d.ts.map +1 -1
  53. package/dist/commands/engine.js +13 -85
  54. package/dist/commands/engine.js.map +1 -1
  55. package/dist/commands/functions.d.ts.map +1 -1
  56. package/dist/commands/functions.js +92 -105
  57. package/dist/commands/functions.js.map +1 -1
  58. package/dist/commands/generate.d.ts.map +1 -1
  59. package/dist/commands/generate.js +22 -12
  60. package/dist/commands/generate.js.map +1 -1
  61. package/dist/commands/init.d.ts +1 -1
  62. package/dist/commands/init.d.ts.map +1 -1
  63. package/dist/commands/init.js +137 -410
  64. package/dist/commands/init.js.map +1 -1
  65. package/dist/commands/migrate-from-v1.d.ts +5 -0
  66. package/dist/commands/migrate-from-v1.d.ts.map +1 -0
  67. package/dist/commands/migrate-from-v1.js +125 -0
  68. package/dist/commands/migrate-from-v1.js.map +1 -0
  69. package/dist/commands/migrate.d.ts.map +1 -1
  70. package/dist/commands/migrate.js +27 -23
  71. package/dist/commands/migrate.js.map +1 -1
  72. package/dist/commands/pg.d.ts +8 -0
  73. package/dist/commands/pg.d.ts.map +1 -0
  74. package/dist/commands/pg.js +102 -0
  75. package/dist/commands/pg.js.map +1 -0
  76. package/dist/commands/pull.d.ts.map +1 -1
  77. package/dist/commands/pull.js +5 -66
  78. package/dist/commands/pull.js.map +1 -1
  79. package/dist/commands/push.d.ts.map +1 -1
  80. package/dist/commands/push.js +128 -38
  81. package/dist/commands/push.js.map +1 -1
  82. package/dist/commands/seed.d.ts +2 -0
  83. package/dist/commands/seed.d.ts.map +1 -1
  84. package/dist/commands/seed.js +44 -11
  85. package/dist/commands/seed.js.map +1 -1
  86. package/dist/commands/self-host.d.ts +7 -1
  87. package/dist/commands/self-host.d.ts.map +1 -1
  88. package/dist/commands/self-host.js +272 -758
  89. package/dist/commands/self-host.js.map +1 -1
  90. package/dist/commands/self-update.d.ts +9 -0
  91. package/dist/commands/self-update.d.ts.map +1 -0
  92. package/dist/commands/self-update.js +33 -0
  93. package/dist/commands/self-update.js.map +1 -0
  94. package/dist/commands/status.d.ts.map +1 -1
  95. package/dist/commands/status.js +4 -3
  96. package/dist/commands/status.js.map +1 -1
  97. package/dist/commands/types.d.ts +3 -0
  98. package/dist/commands/types.d.ts.map +1 -0
  99. package/dist/commands/types.js +62 -0
  100. package/dist/commands/types.js.map +1 -0
  101. package/dist/commands/update.d.ts +7 -0
  102. package/dist/commands/update.d.ts.map +1 -0
  103. package/dist/commands/update.js +93 -0
  104. package/dist/commands/update.js.map +1 -0
  105. package/dist/components.d.ts +5 -0
  106. package/dist/components.d.ts.map +1 -0
  107. package/dist/components.js +3 -0
  108. package/dist/components.js.map +1 -0
  109. package/dist/config.d.ts +10 -51
  110. package/dist/config.d.ts.map +1 -1
  111. package/dist/config.js +101 -33
  112. package/dist/config.js.map +1 -1
  113. package/dist/dev-compose.d.ts +17 -0
  114. package/dist/dev-compose.d.ts.map +1 -0
  115. package/dist/dev-compose.js +374 -0
  116. package/dist/dev-compose.js.map +1 -0
  117. package/dist/diff-output.d.ts +4 -0
  118. package/dist/diff-output.d.ts.map +1 -0
  119. package/dist/diff-output.js +12 -0
  120. package/dist/diff-output.js.map +1 -0
  121. package/dist/docker-postgres.d.ts +57 -0
  122. package/dist/docker-postgres.d.ts.map +1 -0
  123. package/dist/docker-postgres.js +208 -0
  124. package/dist/docker-postgres.js.map +1 -0
  125. package/dist/engine-client.d.ts +69 -0
  126. package/dist/engine-client.d.ts.map +1 -0
  127. package/dist/engine-client.js +157 -0
  128. package/dist/engine-client.js.map +1 -0
  129. package/dist/ensure-binary.d.ts +7 -0
  130. package/dist/ensure-binary.d.ts.map +1 -0
  131. package/dist/ensure-binary.js +17 -0
  132. package/dist/ensure-binary.js.map +1 -0
  133. package/dist/functions-router-gen.d.ts +14 -0
  134. package/dist/functions-router-gen.d.ts.map +1 -0
  135. package/dist/functions-router-gen.js +199 -0
  136. package/dist/functions-router-gen.js.map +1 -0
  137. package/dist/index.d.ts +4 -5
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +2 -3
  140. package/dist/index.js.map +1 -1
  141. package/dist/kong-config.d.ts +25 -0
  142. package/dist/kong-config.d.ts.map +1 -0
  143. package/dist/kong-config.js +71 -0
  144. package/dist/kong-config.js.map +1 -0
  145. package/dist/local-gateway.d.ts +7 -0
  146. package/dist/local-gateway.d.ts.map +1 -0
  147. package/dist/local-gateway.js +9 -0
  148. package/dist/local-gateway.js.map +1 -0
  149. package/dist/local-storage.d.ts +8 -0
  150. package/dist/local-storage.d.ts.map +1 -0
  151. package/dist/local-storage.js +14 -0
  152. package/dist/local-storage.js.map +1 -0
  153. package/dist/pgbouncer-userlist.d.ts +5 -0
  154. package/dist/pgbouncer-userlist.d.ts.map +1 -0
  155. package/dist/pgbouncer-userlist.js +14 -0
  156. package/dist/pgbouncer-userlist.js.map +1 -0
  157. package/dist/postgres-ctl.d.ts +44 -0
  158. package/dist/postgres-ctl.d.ts.map +1 -0
  159. package/dist/postgres-ctl.js +137 -0
  160. package/dist/postgres-ctl.js.map +1 -0
  161. package/dist/process-manager.d.ts +43 -0
  162. package/dist/process-manager.d.ts.map +1 -0
  163. package/dist/process-manager.js +135 -0
  164. package/dist/process-manager.js.map +1 -0
  165. package/dist/project-config.d.ts +235 -0
  166. package/dist/project-config.d.ts.map +1 -0
  167. package/dist/project-config.js +160 -0
  168. package/dist/project-config.js.map +1 -0
  169. package/dist/pull-utils.d.ts +15 -0
  170. package/dist/pull-utils.d.ts.map +1 -1
  171. package/dist/pull-utils.js +12 -0
  172. package/dist/pull-utils.js.map +1 -1
  173. package/dist/release-pins.d.ts +7 -0
  174. package/dist/release-pins.d.ts.map +1 -0
  175. package/dist/release-pins.js +27 -0
  176. package/dist/release-pins.js.map +1 -0
  177. package/dist/release-public-key.d.ts +8 -0
  178. package/dist/release-public-key.d.ts.map +1 -0
  179. package/dist/release-public-key.js +13 -0
  180. package/dist/release-public-key.js.map +1 -0
  181. package/dist/runtime-routes.d.ts +34 -0
  182. package/dist/runtime-routes.d.ts.map +1 -0
  183. package/dist/runtime-routes.js +252 -0
  184. package/dist/runtime-routes.js.map +1 -0
  185. package/dist/schema-ast-v2.d.ts +127 -0
  186. package/dist/schema-ast-v2.d.ts.map +1 -0
  187. package/dist/schema-ast-v2.js +226 -0
  188. package/dist/schema-ast-v2.js.map +1 -0
  189. package/dist/scripts/postinstall.d.ts +5 -6
  190. package/dist/scripts/postinstall.d.ts.map +1 -1
  191. package/dist/scripts/postinstall.js +36 -20
  192. package/dist/scripts/postinstall.js.map +1 -1
  193. package/dist/self-host-compose.d.ts +22 -0
  194. package/dist/self-host-compose.d.ts.map +1 -0
  195. package/dist/self-host-compose.js +347 -0
  196. package/dist/self-host-compose.js.map +1 -0
  197. package/dist/storage-provision.d.ts +24 -0
  198. package/dist/storage-provision.d.ts.map +1 -0
  199. package/dist/storage-provision.js +44 -0
  200. package/dist/storage-provision.js.map +1 -0
  201. package/dist/studio-admin-roles.d.ts +7 -0
  202. package/dist/studio-admin-roles.d.ts.map +1 -0
  203. package/dist/studio-admin-roles.js +14 -0
  204. package/dist/studio-admin-roles.js.map +1 -0
  205. package/dist/studio-dev-server.d.ts +22 -0
  206. package/dist/studio-dev-server.d.ts.map +1 -0
  207. package/dist/studio-dev-server.js +28 -0
  208. package/dist/studio-dev-server.js.map +1 -0
  209. package/dist/systemd.d.ts +26 -0
  210. package/dist/systemd.d.ts.map +1 -0
  211. package/dist/systemd.js +102 -0
  212. package/dist/systemd.js.map +1 -0
  213. package/dist/tsx-runner.d.ts.map +1 -1
  214. package/dist/tsx-runner.js +9 -2
  215. package/dist/tsx-runner.js.map +1 -1
  216. package/dist/type-extractor.d.ts +4 -0
  217. package/dist/type-extractor.d.ts.map +1 -0
  218. package/dist/type-extractor.js +1213 -0
  219. package/dist/type-extractor.js.map +1 -0
  220. package/dist/type-resolver.d.ts +33 -0
  221. package/dist/type-resolver.d.ts.map +1 -0
  222. package/dist/type-resolver.js +338 -0
  223. package/dist/type-resolver.js.map +1 -0
  224. package/package.json +4 -3
  225. package/releases/deno/VERSION +1 -0
  226. package/scripts/mirror-deno-release.sh +76 -0
  227. package/src/TYPE-RESOLUTION.md +294 -0
  228. package/src/app/proxy-dev-app.ts +67 -0
  229. package/src/app-config.ts +128 -0
  230. package/src/augmentation-generator.ts +126 -0
  231. package/src/binary-cache.ts +822 -0
  232. package/src/cli.ts +13 -8
  233. package/src/commands/admin.ts +4 -3
  234. package/src/commands/app.ts +67 -231
  235. package/src/commands/cache.ts +117 -0
  236. package/src/commands/cloud.ts +63 -64
  237. package/src/commands/db.ts +54 -63
  238. package/src/commands/deploy.ts +96 -62
  239. package/src/commands/dev.ts +933 -405
  240. package/src/commands/diff.ts +31 -29
  241. package/src/commands/engine.ts +13 -116
  242. package/src/commands/functions.ts +97 -115
  243. package/src/commands/generate.ts +23 -10
  244. package/src/commands/init.ts +149 -414
  245. package/src/commands/migrate-from-v1.ts +131 -0
  246. package/src/commands/migrate.ts +27 -23
  247. package/src/commands/pg.ts +133 -0
  248. package/src/commands/pull.ts +6 -85
  249. package/src/commands/push.ts +161 -56
  250. package/src/commands/seed.ts +54 -12
  251. package/src/commands/self-host.ts +312 -880
  252. package/src/commands/self-update.ts +45 -0
  253. package/src/commands/status.ts +4 -3
  254. package/src/commands/types.ts +76 -0
  255. package/src/commands/update.ts +109 -0
  256. package/src/components.ts +6 -0
  257. package/src/config.ts +127 -94
  258. package/src/dev-compose.ts +455 -0
  259. package/src/diff-output.ts +12 -0
  260. package/src/docker-postgres.ts +295 -0
  261. package/src/engine-client.ts +236 -0
  262. package/src/ensure-binary.ts +28 -0
  263. package/src/functions-router-gen.ts +224 -0
  264. package/src/index.ts +4 -12
  265. package/src/kong-config.ts +93 -0
  266. package/src/local-gateway.ts +9 -0
  267. package/src/local-storage.ts +14 -0
  268. package/src/pgbouncer-userlist.ts +15 -0
  269. package/src/postgres-ctl.ts +171 -0
  270. package/src/process-manager.ts +168 -0
  271. package/src/project-config.ts +386 -0
  272. package/src/pull-utils.ts +24 -0
  273. package/src/release-pins.ts +31 -0
  274. package/src/release-public-key.ts +12 -0
  275. package/src/runtime-routes.ts +291 -0
  276. package/src/schema-ast-v2.ts +324 -0
  277. package/src/scripts/postinstall.ts +36 -25
  278. package/src/self-host-compose.ts +389 -0
  279. package/src/storage-provision.ts +58 -0
  280. package/src/studio-admin-roles.ts +16 -0
  281. package/src/studio-dev-server.ts +53 -0
  282. package/src/systemd.ts +137 -0
  283. package/src/tsx-runner.ts +11 -1
  284. package/src/type-extractor.ts +1479 -0
  285. package/src/type-resolver.ts +457 -0
  286. package/tests/app-command.test.ts +54 -0
  287. package/tests/augmentation-generator.test.ts +59 -0
  288. package/tests/binary-cache-cloud-overrides.test.ts +123 -0
  289. package/tests/cached-artifact-format.test.ts +84 -0
  290. package/tests/cli-help.test.ts +40 -14
  291. package/tests/config.test.ts +171 -37
  292. package/tests/docker-postgres.test.ts +39 -0
  293. package/tests/engine-distribution.test.ts +3 -3
  294. package/tests/ensure-binary.test.ts +59 -0
  295. package/tests/init.test.ts +28 -86
  296. package/tests/migrate-from-v1.test.ts +29 -0
  297. package/tests/normalize-admin-config.test.ts +48 -0
  298. package/tests/pg-spawn-env.test.ts +18 -0
  299. package/tests/postgres-archive-tag.test.ts +9 -0
  300. package/tests/proxy-dev-app.test.ts +33 -0
  301. package/tests/pull-utils.test.ts +36 -1
  302. package/tests/release-pins.test.ts +28 -0
  303. package/tests/runtime-contract.test.ts +351 -0
  304. package/tests/seed-discover.test.ts +31 -0
  305. package/tests/studio-admin-roles.test.ts +27 -0
  306. package/tests/tsconfig.json +9 -0
  307. package/tests/type-extractor.test.ts +985 -0
  308. package/tests/type-resolver.test.ts +59 -0
  309. package/tsconfig.tsbuildinfo +1 -1
  310. package/vitest.config.ts +12 -0
  311. package/dist/engine/cache.d.ts +0 -37
  312. package/dist/engine/cache.d.ts.map +0 -1
  313. package/dist/engine/cache.js +0 -121
  314. package/dist/engine/cache.js.map +0 -1
  315. package/dist/engine/download.d.ts +0 -19
  316. package/dist/engine/download.d.ts.map +0 -1
  317. package/dist/engine/download.js +0 -108
  318. package/dist/engine/download.js.map +0 -1
  319. package/dist/engine/platform.d.ts +0 -24
  320. package/dist/engine/platform.d.ts.map +0 -1
  321. package/dist/engine/platform.js +0 -50
  322. package/dist/engine/platform.js.map +0 -1
  323. package/dist/engine/resolve.d.ts +0 -37
  324. package/dist/engine/resolve.d.ts.map +0 -1
  325. package/dist/engine/resolve.js +0 -133
  326. package/dist/engine/resolve.js.map +0 -1
  327. package/dist/engine/update-notify.d.ts +0 -11
  328. package/dist/engine/update-notify.d.ts.map +0 -1
  329. package/dist/engine/update-notify.js +0 -43
  330. package/dist/engine/update-notify.js.map +0 -1
  331. package/dist/engine/verify.d.ts +0 -50
  332. package/dist/engine/verify.d.ts.map +0 -1
  333. package/dist/engine/verify.js +0 -161
  334. package/dist/engine/verify.js.map +0 -1
  335. package/dist/engine-version.d.ts +0 -35
  336. package/dist/engine-version.d.ts.map +0 -1
  337. package/dist/engine-version.js +0 -35
  338. package/dist/engine-version.js.map +0 -1
  339. package/dist/engine.d.ts +0 -34
  340. package/dist/engine.d.ts.map +0 -1
  341. package/dist/engine.js +0 -76
  342. package/dist/engine.js.map +0 -1
  343. package/src/engine/cache.ts +0 -135
  344. package/src/engine/download.ts +0 -143
  345. package/src/engine/platform.ts +0 -66
  346. package/src/engine/resolve.ts +0 -197
  347. package/src/engine/update-notify.ts +0 -50
  348. package/src/engine/verify.ts +0 -206
  349. package/src/engine-version.ts +0 -39
  350. package/src/engine.ts +0 -99
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from "vitest"
2
- import { mkdirSync, rmSync, existsSync, readFileSync } from "node:fs"
2
+ import { mkdirSync, rmSync, existsSync, readFileSync, writeFileSync } from "node:fs"
3
3
  import { join } from "node:path"
4
4
  import { tmpdir } from "node:os"
5
5
  import { scaffold } from "../src/commands/init.js"
@@ -20,14 +20,13 @@ describe("scaffold()", () => {
20
20
  scaffold(tmpRoot, "my-app")
21
21
 
22
22
  const expected = [
23
+ "package.json",
23
24
  "supatype.config.ts",
24
25
  "schema/index.ts",
25
26
  ".env",
26
- "docker-compose.yml",
27
- ".supatype/kong.yml",
28
- ".supatype/pgbouncer.ini",
29
- ".supatype/userlist.txt",
30
27
  "seed.ts",
28
+ "seeds/.gitkeep",
29
+ "public/.gitkeep",
31
30
  ".gitignore",
32
31
  ]
33
32
  for (const rel of expected) {
@@ -40,77 +39,38 @@ describe("scaffold()", () => {
40
39
  const content = readFileSync(join(tmpRoot, "supatype.config.ts"), "utf8")
41
40
  expect(content).toContain("blog-app")
42
41
  expect(content).toContain("defineConfig")
42
+ expect(content).toContain('provider: "native"')
43
43
  expect(content).toContain("schema:")
44
- expect(content).toContain("output:")
44
+ expect(content).toContain("versions:")
45
45
  })
46
46
 
47
- it("supatype.config.ts contains commented selfHost section", () => {
48
- scaffold(tmpRoot, "my-app")
49
- const content = readFileSync(join(tmpRoot, "supatype.config.ts"), "utf8")
50
- expect(content).toContain("selfHost")
51
- expect(content).toContain("domain")
52
- })
53
-
54
- it("docker-compose.yml references project name, correct images, and health check", () => {
55
- scaffold(tmpRoot, "shop")
56
- const content = readFileSync(join(tmpRoot, "docker-compose.yml"), "utf8")
57
- expect(content).toContain("shop")
58
- expect(content).toContain("supatype/postgres")
59
- expect(content).toContain("postgrest/postgrest")
60
- expect(content).toContain("kong:")
61
- expect(content).toContain("service_healthy")
62
- })
63
-
64
- it("docker-compose.yml includes GoTrue auth service", () => {
65
- scaffold(tmpRoot, "shop")
66
- const content = readFileSync(join(tmpRoot, "docker-compose.yml"), "utf8")
67
- expect(content).toContain("gotrue:")
68
- expect(content).toContain("supatype/auth")
69
- expect(content).toContain("GOTRUE_JWT_SECRET")
70
- expect(content).toContain("9999")
71
- })
72
-
73
- it("docker-compose.yml includes PgBouncer service connecting services via port 6432", () => {
74
- scaffold(tmpRoot, "shop")
75
- const content = readFileSync(join(tmpRoot, "docker-compose.yml"), "utf8")
76
- expect(content).toContain("pgbouncer:")
77
- expect(content).toContain("pgbouncer/pgbouncer")
78
- expect(content).toContain("pgbouncer:6432")
79
- expect(content).toContain("PGRST_DB_POOL")
80
- })
81
-
82
- it("docker-compose.yml includes studio service (merged admin + studio)", () => {
83
- scaffold(tmpRoot, "shop")
84
- const content = readFileSync(join(tmpRoot, "docker-compose.yml"), "utf8")
85
- expect(content).toContain("studio:")
86
- expect(content).toContain("ghcr.io/supatype/studio")
87
- expect(content).toContain("3002:3002")
88
- // Admin was merged into studio — no separate admin service
89
- expect(content).not.toContain("ghcr.io/supatype/admin")
47
+ it("package.json includes @supatype/cli and @supatype/types", () => {
48
+ scaffold(tmpRoot, "pkg-app")
49
+ const content = readFileSync(join(tmpRoot, "package.json"), "utf8")
50
+ expect(content).toContain("@supatype/cli")
51
+ expect(content).toContain("@supatype/types")
52
+ expect(content).toContain("pkg-app")
90
53
  })
91
54
 
92
- it("docker-compose.yml includes commented app service slot", () => {
93
- scaffold(tmpRoot, "shop")
94
- const content = readFileSync(join(tmpRoot, "docker-compose.yml"), "utf8")
95
- expect(content).toContain("supatype app add")
96
- expect(content).toContain("SUPATYPE_URL")
97
- expect(content).toContain("SUPATYPE_ANON_KEY")
55
+ it("skips package.json when it already exists", () => {
56
+ const pkgPath = join(tmpRoot, "package.json")
57
+ writeFileSync(pkgPath, '{"name":"existing"}', "utf8")
58
+ scaffold(tmpRoot, "my-app")
59
+ expect(readFileSync(pkgPath, "utf8")).toBe('{"name":"existing"}')
98
60
  })
99
61
 
100
- it(".supatype/pgbouncer.ini has correct pool settings", () => {
62
+ it("supatype.config.ts documents self-host workflow", () => {
101
63
  scaffold(tmpRoot, "my-app")
102
- const content = readFileSync(join(tmpRoot, ".supatype/pgbouncer.ini"), "utf8")
103
- expect(content).toContain("pool_mode = transaction")
104
- expect(content).toContain("default_pool_size = 20")
105
- expect(content).toContain("max_db_connections = 60")
106
- expect(content).toContain("listen_port = 6432")
64
+ const content = readFileSync(join(tmpRoot, "supatype.config.ts"), "utf8")
65
+ expect(content).toContain("self-host")
107
66
  })
108
67
 
109
- it(".env contains DATABASE_URL, JWT_SECRET, POSTGRES_PASSWORD, POSTGRES_DB", () => {
68
+ it(".env contains DATABASE_URL, JWT_SECRET, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB", () => {
110
69
  scaffold(tmpRoot, "my-app")
111
70
  const content = readFileSync(join(tmpRoot, ".env"), "utf8")
112
71
  expect(content).toContain("DATABASE_URL=")
113
72
  expect(content).toContain("JWT_SECRET=")
73
+ expect(content).toContain("POSTGRES_USER=")
114
74
  expect(content).toContain("POSTGRES_PASSWORD=")
115
75
  expect(content).toContain("POSTGRES_DB=")
116
76
  })
@@ -123,31 +83,12 @@ describe("scaffold()", () => {
123
83
  expect(content).toContain("SITE_URL=")
124
84
  })
125
85
 
126
- it("schema/index.ts exports a User model with field builders and access rules", () => {
86
+ it("schema/index.ts exports a User model using RFC v2 Model<>", () => {
127
87
  scaffold(tmpRoot, "my-app")
128
88
  const content = readFileSync(join(tmpRoot, "schema/index.ts"), "utf8")
129
- expect(content).toContain("export const User")
130
- expect(content).toContain("model(")
131
- expect(content).toContain("field.")
132
- expect(content).toContain("access.")
133
- expect(content).toContain("options: { timestamps: true }")
134
- })
135
-
136
- it(".supatype/kong.yml declares REST, GraphQL, and auth routes", () => {
137
- scaffold(tmpRoot, "my-app")
138
- const content = readFileSync(join(tmpRoot, ".supatype/kong.yml"), "utf8")
139
- expect(content).toContain("/rest/v1/")
140
- expect(content).toContain("/graphql/v1")
141
- expect(content).toContain("/auth/v1/")
142
- expect(content).toContain("postgrest")
143
- expect(content).toContain("gotrue")
144
- })
145
-
146
- it(".supatype/kong.yml contains commented app fallback route", () => {
147
- scaffold(tmpRoot, "my-app")
148
- const content = readFileSync(join(tmpRoot, ".supatype/kong.yml"), "utf8")
149
- expect(content).toContain("supatype app add")
150
- expect(content).toContain("app-root")
89
+ expect(content).toContain("export type User")
90
+ expect(content).toContain("Model<")
91
+ expect(content).toContain("access:")
151
92
  })
152
93
 
153
94
  it(".gitignore excludes .env, node_modules, and engine binary", () => {
@@ -156,6 +97,7 @@ describe("scaffold()", () => {
156
97
  expect(content).toContain(".env")
157
98
  expect(content).toContain("node_modules/")
158
99
  expect(content).toContain(".supatype/engine/")
100
+ expect(content).toContain("supatype.local.config.ts")
159
101
  })
160
102
 
161
103
  it("seed.ts references the project name", () => {
@@ -164,7 +106,7 @@ describe("scaffold()", () => {
164
106
  expect(content).toContain("acme")
165
107
  })
166
108
 
167
- it("different project names produce different connection strings", () => {
109
+ it("different project names produce different config bodies", () => {
168
110
  scaffold(tmpRoot, "alpha")
169
111
  const alpha = readFileSync(join(tmpRoot, "supatype.config.ts"), "utf8")
170
112
 
@@ -0,0 +1,29 @@
1
+ import ts from "typescript"
2
+ import { describe, expect, it } from "vitest"
3
+ import { codemodSource } from "../src/commands/migrate-from-v1.js"
4
+
5
+ describe("migrate-from-v1 codemod", () => {
6
+ it("converts exported model() declarations into Model<> aliases", () => {
7
+ const source = ts.createSourceFile(
8
+ "schema.ts",
9
+ `
10
+ import { model, field } from "@supatype/schema"
11
+ export const User = model("user", {
12
+ fields: {
13
+ id: field.uuid({ required: true }),
14
+ email: field.email({ required: true, unique: true }),
15
+ name: field.text({ required: true }),
16
+ },
17
+ })
18
+ `,
19
+ ts.ScriptTarget.Latest,
20
+ true,
21
+ ts.ScriptKind.TS,
22
+ )
23
+
24
+ const out = codemodSource(source)
25
+ expect(out).toContain("export type User = Model<")
26
+ expect(out).toContain("id: UUID")
27
+ expect(out).toContain("email: string")
28
+ })
29
+ })
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from "vitest"
2
+ import { normalizeAdminConfig } from "../../studio/src/lib/normalize-admin-config.js"
3
+
4
+ describe("normalizeAdminConfig", () => {
5
+ it("maps global fields and Settings navigation items", () => {
6
+ const config = normalizeAdminConfig({
7
+ localization: { locales: ["en"], defaultLocale: "en" },
8
+ navigation: [
9
+ {
10
+ group: "Content",
11
+ items: [{ label: "Post", model: "posts" }],
12
+ },
13
+ {
14
+ group: "Settings",
15
+ items: [{ label: "Site Settings", global: "_global_site_settings" }],
16
+ },
17
+ ],
18
+ models: [
19
+ {
20
+ name: "Post",
21
+ tableName: "posts",
22
+ fields: [{ name: "title", widget: "text", required: true }],
23
+ },
24
+ ],
25
+ globals: [
26
+ {
27
+ name: "SiteSettings",
28
+ tableName: "_global_site_settings",
29
+ singleton: true,
30
+ fields: [{ name: "site_name", widget: "text", required: true }],
31
+ },
32
+ ],
33
+ })
34
+
35
+ expect(config.globals).toHaveLength(1)
36
+ expect(config.globals[0]?.tableName).toBe("_global_site_settings")
37
+ expect(config.globals[0]?.apiPath).toBe("/rest/v1/_global_site_settings")
38
+ expect(config.globals[0]?.fields).toHaveLength(1)
39
+ expect(config.globals[0]?.fields[0]?.name).toBe("site_name")
40
+
41
+ const settingsNav = config.navigation.find((g) => g.label === "Settings")
42
+ expect(settingsNav?.items[0]).toMatchObject({
43
+ type: "global",
44
+ href: "/models/globals/SiteSettings",
45
+ label: "Site Settings",
46
+ })
47
+ })
48
+ })
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from "vitest"
2
+ import { join } from "node:path"
3
+ import { pgSpawnEnv } from "../src/postgres-ctl.js"
4
+
5
+ const PG_BIN = "/cache/postgres/17.2/pg-17.2/bin"
6
+ const PG_LIB = join("/cache/postgres/17.2/pg-17.2", "lib")
7
+
8
+ describe("pgSpawnEnv", () => {
9
+ it("prepends lib dir to DYLD_LIBRARY_PATH on darwin", () => {
10
+ const env = pgSpawnEnv(PG_BIN, "darwin")
11
+ expect(env.DYLD_LIBRARY_PATH).toContain(PG_LIB)
12
+ })
13
+
14
+ it("prepends lib dir to LD_LIBRARY_PATH on linux", () => {
15
+ const env = pgSpawnEnv(PG_BIN, "linux")
16
+ expect(env.LD_LIBRARY_PATH).toContain(PG_LIB)
17
+ })
18
+ })
@@ -0,0 +1,9 @@
1
+ import { describe, expect, it } from "vitest"
2
+ import { postgresArchiveTag } from "../src/binary-cache.js"
3
+
4
+ describe("postgresArchiveTag", () => {
5
+ it("uses PG major only for CDN archive basenames", () => {
6
+ expect(postgresArchiveTag("17.2")).toBe("17")
7
+ expect(postgresArchiveTag("17")).toBe("17")
8
+ })
9
+ })
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from "vitest"
2
+ import { resolveProxyDevScript } from "../src/app/proxy-dev-app.js"
3
+ import type { SupatypeProjectConfig } from "../src/project-config.js"
4
+
5
+ const base = {
6
+ project: { name: "test" },
7
+ database: { provider: "native" as const },
8
+ server: { mode: "dev" as const },
9
+ versions: { engine: "latest", server: "latest", postgres: "latest", deno: "latest" },
10
+ }
11
+
12
+ describe("resolveProxyDevScript()", () => {
13
+ it("returns null when app.mode is not proxy", () => {
14
+ const config = { ...base, app: { mode: "static" as const } } satisfies SupatypeProjectConfig
15
+ expect(resolveProxyDevScript(config)).toBeNull()
16
+ })
17
+
18
+ it("defaults to start when proxy mode and app.start omitted", () => {
19
+ const config = {
20
+ ...base,
21
+ app: { mode: "proxy" as const, upstream: "http://127.0.0.1:4321" },
22
+ } satisfies SupatypeProjectConfig
23
+ expect(resolveProxyDevScript(config)).toBe("start")
24
+ })
25
+
26
+ it("uses app.start when set", () => {
27
+ const config = {
28
+ ...base,
29
+ app: { mode: "proxy" as const, upstream: "http://127.0.0.1:4321", start: "dev:site" },
30
+ } satisfies SupatypeProjectConfig
31
+ expect(resolveProxyDevScript(config)).toBe("dev:site")
32
+ })
33
+ })
@@ -1,5 +1,10 @@
1
1
  import { describe, it, expect } from "vitest"
2
- import { pgTypeToField, toCamelCase, type ColumnInfo } from "../src/pull-utils.js"
2
+ import {
3
+ introspectColumnToColumnInfo,
4
+ pgTypeToField,
5
+ toCamelCase,
6
+ type ColumnInfo,
7
+ } from "../src/pull-utils.js"
3
8
 
4
9
  function col(overrides: Partial<ColumnInfo> & { pgType: string }): ColumnInfo {
5
10
  return {
@@ -100,6 +105,36 @@ describe("pgTypeToField()", () => {
100
105
  })
101
106
  })
102
107
 
108
+ describe("introspectColumnToColumnInfo()", () => {
109
+ it("maps engine type → pgType and flags", () => {
110
+ const out = introspectColumnToColumnInfo({
111
+ name: "id",
112
+ type: "uuid",
113
+ nullable: false,
114
+ primaryKey: true,
115
+ default: "gen_random_uuid()",
116
+ })
117
+ expect(out).toEqual({
118
+ name: "id",
119
+ pgType: "uuid",
120
+ nullable: false,
121
+ isPrimary: true,
122
+ isUnique: false,
123
+ hasDefault: true,
124
+ })
125
+ })
126
+
127
+ it("treats empty default as no default", () => {
128
+ const out = introspectColumnToColumnInfo({
129
+ name: "x",
130
+ type: "text",
131
+ nullable: true,
132
+ default: "",
133
+ })
134
+ expect(out.hasDefault).toBe(false)
135
+ })
136
+ })
137
+
103
138
  describe("toCamelCase()", () => {
104
139
  it.each([
105
140
  ["user", "User"],
@@ -0,0 +1,28 @@
1
+ import { readFileSync } from "node:fs"
2
+ import { join, resolve } from "node:path"
3
+ import { describe, expect, it } from "vitest"
4
+ import { DENO_RELEASE_PIN } from "../src/release-pins.js"
5
+
6
+ const CLI_ROOT = resolve(import.meta.dirname, "..")
7
+ const REPO_ROOT = resolve(CLI_ROOT, "../..")
8
+
9
+ const EXAMPLE_CONFIGS = [
10
+ "examples/blog/supatype.config.ts",
11
+ "examples/self-host/supatype.config.ts",
12
+ "tests/integration/supatype.config.ts",
13
+ ]
14
+
15
+ describe("release-pins", () => {
16
+ it("DENO_RELEASE_PIN matches releases/deno/VERSION", () => {
17
+ const file = join(CLI_ROOT, "releases", "deno", "VERSION")
18
+ expect(DENO_RELEASE_PIN).toBe(readFileSync(file, "utf8").trim())
19
+ })
20
+
21
+ it("example configs use the same deno pin", () => {
22
+ const needle = `deno: "${DENO_RELEASE_PIN}"`
23
+ for (const rel of EXAMPLE_CONFIGS) {
24
+ const content = readFileSync(join(REPO_ROOT, rel), "utf8")
25
+ expect(content, rel).toContain(needle)
26
+ }
27
+ })
28
+ })