@supatype/cli 0.1.0-alpha.8 → 0.1.0

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 (388) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/.turbo/turbo-test.log +274 -69
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -1
  6. package/dist/app/framework.js +1 -3
  7. package/dist/app/framework.js.map +1 -1
  8. package/dist/app/proxy-dev-app.d.ts +14 -0
  9. package/dist/app/proxy-dev-app.d.ts.map +1 -1
  10. package/dist/app/proxy-dev-app.js +110 -6
  11. package/dist/app/proxy-dev-app.js.map +1 -1
  12. package/dist/app-config.d.ts +10 -0
  13. package/dist/app-config.d.ts.map +1 -1
  14. package/dist/app-config.js +72 -0
  15. package/dist/app-config.js.map +1 -1
  16. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  17. package/dist/binary-cache.d.ts +19 -7
  18. package/dist/binary-cache.d.ts.map +1 -1
  19. package/dist/binary-cache.js +92 -46
  20. package/dist/binary-cache.js.map +1 -1
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +17 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/add.d.ts +3 -0
  26. package/dist/commands/add.d.ts.map +1 -0
  27. package/dist/commands/add.js +86 -0
  28. package/dist/commands/add.js.map +1 -0
  29. package/dist/commands/admin.d.ts.map +1 -1
  30. package/dist/commands/admin.js +39 -53
  31. package/dist/commands/admin.js.map +1 -1
  32. package/dist/commands/adopt.d.ts +3 -0
  33. package/dist/commands/adopt.d.ts.map +1 -0
  34. package/dist/commands/adopt.js +55 -0
  35. package/dist/commands/adopt.js.map +1 -0
  36. package/dist/commands/app.d.ts.map +1 -1
  37. package/dist/commands/app.js +20 -17
  38. package/dist/commands/app.js.map +1 -1
  39. package/dist/commands/cache.d.ts.map +1 -1
  40. package/dist/commands/cache.js +11 -10
  41. package/dist/commands/cache.js.map +1 -1
  42. package/dist/commands/cloud.d.ts +4 -9
  43. package/dist/commands/cloud.d.ts.map +1 -1
  44. package/dist/commands/cloud.js +75 -125
  45. package/dist/commands/cloud.js.map +1 -1
  46. package/dist/commands/db.d.ts.map +1 -1
  47. package/dist/commands/db.js +37 -58
  48. package/dist/commands/db.js.map +1 -1
  49. package/dist/commands/deploy.d.ts.map +1 -1
  50. package/dist/commands/deploy.js +140 -96
  51. package/dist/commands/deploy.js.map +1 -1
  52. package/dist/commands/dev.d.ts.map +1 -1
  53. package/dist/commands/dev.js +72 -39
  54. package/dist/commands/dev.js.map +1 -1
  55. package/dist/commands/diff.d.ts.map +1 -1
  56. package/dist/commands/diff.js +39 -39
  57. package/dist/commands/diff.js.map +1 -1
  58. package/dist/commands/doctor.d.ts +3 -0
  59. package/dist/commands/doctor.d.ts.map +1 -0
  60. package/dist/commands/doctor.js +78 -0
  61. package/dist/commands/doctor.js.map +1 -0
  62. package/dist/commands/engine.d.ts.map +1 -1
  63. package/dist/commands/engine.js +5 -4
  64. package/dist/commands/engine.js.map +1 -1
  65. package/dist/commands/functions.d.ts.map +1 -1
  66. package/dist/commands/functions.js +172 -119
  67. package/dist/commands/functions.js.map +1 -1
  68. package/dist/commands/generate.d.ts.map +1 -1
  69. package/dist/commands/generate.js +5 -4
  70. package/dist/commands/generate.js.map +1 -1
  71. package/dist/commands/init.d.ts +30 -1
  72. package/dist/commands/init.d.ts.map +1 -1
  73. package/dist/commands/init.js +814 -107
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/commands/introspect.d.ts +3 -0
  76. package/dist/commands/introspect.d.ts.map +1 -0
  77. package/dist/commands/introspect.js +35 -0
  78. package/dist/commands/introspect.js.map +1 -0
  79. package/dist/commands/keys.d.ts +15 -1
  80. package/dist/commands/keys.d.ts.map +1 -1
  81. package/dist/commands/keys.js +46 -10
  82. package/dist/commands/keys.js.map +1 -1
  83. package/dist/commands/link-helpers.d.ts +15 -0
  84. package/dist/commands/link-helpers.d.ts.map +1 -0
  85. package/dist/commands/link-helpers.js +225 -0
  86. package/dist/commands/link-helpers.js.map +1 -0
  87. package/dist/commands/logs.d.ts.map +1 -1
  88. package/dist/commands/logs.js +5 -4
  89. package/dist/commands/logs.js.map +1 -1
  90. package/dist/commands/migrate-from-v1.d.ts.map +1 -1
  91. package/dist/commands/migrate-from-v1.js +3 -2
  92. package/dist/commands/migrate-from-v1.js.map +1 -1
  93. package/dist/commands/migrate.d.ts.map +1 -1
  94. package/dist/commands/migrate.js +119 -26
  95. package/dist/commands/migrate.js.map +1 -1
  96. package/dist/commands/pg.d.ts.map +1 -1
  97. package/dist/commands/pg.js +11 -12
  98. package/dist/commands/pg.js.map +1 -1
  99. package/dist/commands/plugins.d.ts.map +1 -1
  100. package/dist/commands/plugins.js +55 -46
  101. package/dist/commands/plugins.js.map +1 -1
  102. package/dist/commands/pull.d.ts.map +1 -1
  103. package/dist/commands/pull.js +33 -5
  104. package/dist/commands/pull.js.map +1 -1
  105. package/dist/commands/push.d.ts.map +1 -1
  106. package/dist/commands/push.js +110 -137
  107. package/dist/commands/push.js.map +1 -1
  108. package/dist/commands/seed.d.ts.map +1 -1
  109. package/dist/commands/seed.js +4 -3
  110. package/dist/commands/seed.js.map +1 -1
  111. package/dist/commands/self-host.d.ts +2 -2
  112. package/dist/commands/self-host.d.ts.map +1 -1
  113. package/dist/commands/self-host.js +65 -50
  114. package/dist/commands/self-host.js.map +1 -1
  115. package/dist/commands/self-update.d.ts.map +1 -1
  116. package/dist/commands/self-update.js +3 -2
  117. package/dist/commands/self-update.js.map +1 -1
  118. package/dist/commands/status.d.ts +1 -1
  119. package/dist/commands/status.d.ts.map +1 -1
  120. package/dist/commands/status.js +95 -29
  121. package/dist/commands/status.js.map +1 -1
  122. package/dist/commands/types.d.ts.map +1 -1
  123. package/dist/commands/types.js +3 -2
  124. package/dist/commands/types.js.map +1 -1
  125. package/dist/commands/update.d.ts.map +1 -1
  126. package/dist/commands/update.js +54 -21
  127. package/dist/commands/update.js.map +1 -1
  128. package/dist/config.d.ts +2 -1
  129. package/dist/config.d.ts.map +1 -1
  130. package/dist/config.js.map +1 -1
  131. package/dist/dev-compose.d.ts +26 -0
  132. package/dist/dev-compose.d.ts.map +1 -1
  133. package/dist/dev-compose.js +328 -34
  134. package/dist/dev-compose.js.map +1 -1
  135. package/dist/dev-log-bus.d.ts +30 -0
  136. package/dist/dev-log-bus.d.ts.map +1 -0
  137. package/dist/dev-log-bus.js +87 -0
  138. package/dist/dev-log-bus.js.map +1 -0
  139. package/dist/dev-log-filter.d.ts +10 -0
  140. package/dist/dev-log-filter.d.ts.map +1 -0
  141. package/dist/dev-log-filter.js +36 -0
  142. package/dist/dev-log-filter.js.map +1 -0
  143. package/dist/dev-logo.d.ts +12 -0
  144. package/dist/dev-logo.d.ts.map +1 -0
  145. package/dist/dev-logo.js +56 -0
  146. package/dist/dev-logo.js.map +1 -0
  147. package/dist/dev-session.d.ts +26 -0
  148. package/dist/dev-session.d.ts.map +1 -0
  149. package/dist/dev-session.js +106 -0
  150. package/dist/dev-session.js.map +1 -0
  151. package/dist/dev-shutdown.d.ts +9 -0
  152. package/dist/dev-shutdown.d.ts.map +1 -0
  153. package/dist/dev-shutdown.js +50 -0
  154. package/dist/dev-shutdown.js.map +1 -0
  155. package/dist/dev-task-colors.d.ts +13 -0
  156. package/dist/dev-task-colors.d.ts.map +1 -0
  157. package/dist/dev-task-colors.js +43 -0
  158. package/dist/dev-task-colors.js.map +1 -0
  159. package/dist/dev-tui.d.ts +24 -0
  160. package/dist/dev-tui.d.ts.map +1 -0
  161. package/dist/dev-tui.js +188 -0
  162. package/dist/dev-tui.js.map +1 -0
  163. package/dist/diff-output.d.ts +5 -1
  164. package/dist/diff-output.d.ts.map +1 -1
  165. package/dist/diff-output.js +69 -0
  166. package/dist/diff-output.js.map +1 -1
  167. package/dist/docker-runtime.d.ts +30 -0
  168. package/dist/docker-runtime.d.ts.map +1 -0
  169. package/dist/docker-runtime.js +118 -0
  170. package/dist/docker-runtime.js.map +1 -0
  171. package/dist/engine-client.d.ts +10 -1
  172. package/dist/engine-client.d.ts.map +1 -1
  173. package/dist/engine-client.js +76 -17
  174. package/dist/engine-client.js.map +1 -1
  175. package/dist/engine-push-output.d.ts +17 -0
  176. package/dist/engine-push-output.d.ts.map +1 -0
  177. package/dist/engine-push-output.js +64 -0
  178. package/dist/engine-push-output.js.map +1 -0
  179. package/dist/ensure-binary.js +2 -2
  180. package/dist/ensure-binary.js.map +1 -1
  181. package/dist/gitignore.d.ts +8 -0
  182. package/dist/gitignore.d.ts.map +1 -0
  183. package/dist/gitignore.js +41 -0
  184. package/dist/gitignore.js.map +1 -0
  185. package/dist/kong-config.d.ts +9 -0
  186. package/dist/kong-config.d.ts.map +1 -1
  187. package/dist/kong-config.js +18 -1
  188. package/dist/kong-config.js.map +1 -1
  189. package/dist/link.d.ts +66 -0
  190. package/dist/link.d.ts.map +1 -0
  191. package/dist/link.js +160 -0
  192. package/dist/link.js.map +1 -0
  193. package/dist/process-manager.d.ts +8 -0
  194. package/dist/process-manager.d.ts.map +1 -1
  195. package/dist/process-manager.js +53 -9
  196. package/dist/process-manager.js.map +1 -1
  197. package/dist/project-config.d.ts +30 -3
  198. package/dist/project-config.d.ts.map +1 -1
  199. package/dist/project-config.js +37 -4
  200. package/dist/project-config.js.map +1 -1
  201. package/dist/prompts.d.ts +3 -0
  202. package/dist/prompts.d.ts.map +1 -0
  203. package/dist/prompts.js +3 -0
  204. package/dist/prompts.js.map +1 -0
  205. package/dist/pull-utils.d.ts +50 -14
  206. package/dist/pull-utils.d.ts.map +1 -1
  207. package/dist/pull-utils.js +152 -12
  208. package/dist/pull-utils.js.map +1 -1
  209. package/dist/resolve-target.d.ts +86 -0
  210. package/dist/resolve-target.d.ts.map +1 -0
  211. package/dist/resolve-target.js +291 -0
  212. package/dist/resolve-target.js.map +1 -0
  213. package/dist/restore-system-relation-targets.d.ts +3 -0
  214. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  215. package/dist/restore-system-relation-targets.js +45 -0
  216. package/dist/restore-system-relation-targets.js.map +1 -0
  217. package/dist/runtime-routes.d.ts.map +1 -1
  218. package/dist/runtime-routes.js +7 -0
  219. package/dist/runtime-routes.js.map +1 -1
  220. package/dist/schema-ast-v2.d.ts +1 -1
  221. package/dist/schema-ast-v2.d.ts.map +1 -1
  222. package/dist/schema-ast-v2.js +2 -2
  223. package/dist/schema-ast-v2.js.map +1 -1
  224. package/dist/schema-sources.d.ts +40 -0
  225. package/dist/schema-sources.d.ts.map +1 -0
  226. package/dist/schema-sources.js +183 -0
  227. package/dist/schema-sources.js.map +1 -0
  228. package/dist/scripts/postinstall.js +5 -1
  229. package/dist/scripts/postinstall.js.map +1 -1
  230. package/dist/seed.d.ts +8 -0
  231. package/dist/seed.d.ts.map +1 -0
  232. package/dist/seed.js +32 -0
  233. package/dist/seed.js.map +1 -0
  234. package/dist/self-host-compose.d.ts +37 -1
  235. package/dist/self-host-compose.d.ts.map +1 -1
  236. package/dist/self-host-compose.js +233 -43
  237. package/dist/self-host-compose.js.map +1 -1
  238. package/dist/storage-provision.d.ts +4 -0
  239. package/dist/storage-provision.d.ts.map +1 -1
  240. package/dist/storage-provision.js +24 -2
  241. package/dist/storage-provision.js.map +1 -1
  242. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  243. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  244. package/dist/supatype-eval-1781522769253.mjs +3 -0
  245. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  246. package/dist/systemd.js +2 -2
  247. package/dist/systemd.js.map +1 -1
  248. package/dist/target-client.d.ts +10 -0
  249. package/dist/target-client.d.ts.map +1 -0
  250. package/dist/target-client.js +22 -0
  251. package/dist/target-client.js.map +1 -0
  252. package/dist/type-extractor.d.ts +11 -0
  253. package/dist/type-extractor.d.ts.map +1 -1
  254. package/dist/type-extractor.js +95 -8
  255. package/dist/type-extractor.js.map +1 -1
  256. package/dist/ui/brand.d.ts +9 -0
  257. package/dist/ui/brand.d.ts.map +1 -0
  258. package/dist/ui/brand.js +11 -0
  259. package/dist/ui/brand.js.map +1 -0
  260. package/dist/ui/confirm.d.ts +12 -0
  261. package/dist/ui/confirm.d.ts.map +1 -0
  262. package/dist/ui/confirm.js +28 -0
  263. package/dist/ui/confirm.js.map +1 -0
  264. package/dist/ui/fatal.d.ts +10 -0
  265. package/dist/ui/fatal.d.ts.map +1 -0
  266. package/dist/ui/fatal.js +34 -0
  267. package/dist/ui/fatal.js.map +1 -0
  268. package/dist/ui/index.d.ts +9 -0
  269. package/dist/ui/index.d.ts.map +1 -0
  270. package/dist/ui/index.js +9 -0
  271. package/dist/ui/index.js.map +1 -0
  272. package/dist/ui/interactive.d.ts +3 -0
  273. package/dist/ui/interactive.d.ts.map +1 -0
  274. package/dist/ui/interactive.js +5 -0
  275. package/dist/ui/interactive.js.map +1 -0
  276. package/dist/ui/messages.d.ts +10 -0
  277. package/dist/ui/messages.d.ts.map +1 -0
  278. package/dist/ui/messages.js +35 -0
  279. package/dist/ui/messages.js.map +1 -0
  280. package/dist/ui/next-steps.d.ts +3 -0
  281. package/dist/ui/next-steps.d.ts.map +1 -0
  282. package/dist/ui/next-steps.js +10 -0
  283. package/dist/ui/next-steps.js.map +1 -0
  284. package/dist/ui/progress.d.ts +5 -0
  285. package/dist/ui/progress.d.ts.map +1 -0
  286. package/dist/ui/progress.js +24 -0
  287. package/dist/ui/progress.js.map +1 -0
  288. package/dist/ui/prompts.d.ts +14 -0
  289. package/dist/ui/prompts.d.ts.map +1 -0
  290. package/dist/ui/prompts.js +34 -0
  291. package/dist/ui/prompts.js.map +1 -0
  292. package/package.json +9 -4
  293. package/src/app/framework.ts +1 -3
  294. package/src/app/proxy-dev-app.ts +114 -6
  295. package/src/app-config.ts +80 -0
  296. package/src/binary-cache.ts +102 -52
  297. package/src/cli.ts +16 -2
  298. package/src/commands/add.ts +97 -0
  299. package/src/commands/admin.ts +39 -73
  300. package/src/commands/adopt.ts +82 -0
  301. package/src/commands/app.ts +20 -17
  302. package/src/commands/cache.ts +11 -10
  303. package/src/commands/cloud.ts +91 -142
  304. package/src/commands/db.ts +40 -63
  305. package/src/commands/deploy.ts +186 -126
  306. package/src/commands/dev.ts +95 -55
  307. package/src/commands/diff.ts +52 -43
  308. package/src/commands/doctor.ts +103 -0
  309. package/src/commands/engine.ts +5 -4
  310. package/src/commands/functions.ts +187 -123
  311. package/src/commands/generate.ts +5 -4
  312. package/src/commands/init.ts +996 -105
  313. package/src/commands/introspect.ts +48 -0
  314. package/src/commands/keys.ts +56 -14
  315. package/src/commands/link-helpers.ts +273 -0
  316. package/src/commands/logs.ts +5 -4
  317. package/src/commands/migrate-from-v1.ts +3 -2
  318. package/src/commands/migrate.ts +167 -27
  319. package/src/commands/pg.ts +13 -18
  320. package/src/commands/plugins.ts +55 -46
  321. package/src/commands/pull.ts +38 -9
  322. package/src/commands/push.ts +147 -174
  323. package/src/commands/seed.ts +5 -4
  324. package/src/commands/self-host.ts +85 -54
  325. package/src/commands/self-update.ts +3 -2
  326. package/src/commands/status.ts +102 -33
  327. package/src/commands/types.ts +3 -2
  328. package/src/commands/update.ts +59 -23
  329. package/src/config.ts +2 -1
  330. package/src/dev-compose.ts +426 -34
  331. package/src/dev-log-bus.ts +101 -0
  332. package/src/dev-log-filter.ts +32 -0
  333. package/src/dev-logo.ts +61 -0
  334. package/src/dev-session.ts +130 -0
  335. package/src/dev-shutdown.ts +54 -0
  336. package/src/dev-task-colors.ts +47 -0
  337. package/src/dev-tui.ts +232 -0
  338. package/src/diff-output.ts +79 -1
  339. package/src/docker-runtime.ts +151 -0
  340. package/src/engine-client.ts +81 -17
  341. package/src/engine-push-output.ts +75 -0
  342. package/src/ensure-binary.ts +2 -2
  343. package/src/gitignore.ts +48 -0
  344. package/src/kong-config.ts +24 -1
  345. package/src/link.ts +243 -0
  346. package/src/process-manager.ts +66 -10
  347. package/src/project-config.ts +62 -7
  348. package/src/prompts.ts +2 -0
  349. package/src/pull-utils.ts +217 -23
  350. package/src/resolve-target.ts +419 -0
  351. package/src/restore-system-relation-targets.ts +45 -0
  352. package/src/runtime-routes.ts +7 -0
  353. package/src/schema-ast-v2.ts +2 -1
  354. package/src/schema-sources.ts +248 -0
  355. package/src/scripts/postinstall.ts +7 -1
  356. package/src/seed.ts +43 -0
  357. package/src/self-host-compose.ts +261 -46
  358. package/src/storage-provision.ts +33 -1
  359. package/src/supatype-eval-1781522769253.mts +1 -0
  360. package/src/systemd.ts +2 -2
  361. package/src/target-client.ts +40 -0
  362. package/src/type-extractor.ts +124 -11
  363. package/src/ui/README.md +17 -0
  364. package/src/ui/brand.ts +12 -0
  365. package/src/ui/confirm.ts +38 -0
  366. package/src/ui/fatal.ts +43 -0
  367. package/src/ui/index.ts +8 -0
  368. package/src/ui/interactive.ts +4 -0
  369. package/src/ui/messages.ts +43 -0
  370. package/src/ui/next-steps.ts +10 -0
  371. package/src/ui/progress.ts +28 -0
  372. package/src/ui/prompts.ts +40 -0
  373. package/tests/cli-help.test.ts +27 -2
  374. package/tests/config.test.ts +29 -2
  375. package/tests/dev-ui.test.ts +139 -0
  376. package/tests/docker-runtime.test.ts +236 -0
  377. package/tests/engine-push-output.test.ts +67 -0
  378. package/tests/init.test.ts +197 -18
  379. package/tests/link.test.ts +148 -0
  380. package/tests/minisign.test.ts +102 -0
  381. package/tests/proxy-dev-app.test.ts +45 -1
  382. package/tests/pull-utils.test.ts +5 -4
  383. package/tests/runtime-contract.test.ts +186 -2
  384. package/tests/schema-sources.test.ts +119 -0
  385. package/tests/storage-provision.test.ts +100 -0
  386. package/tests/ui-confirm.test.ts +41 -0
  387. package/tests/ui-messages.test.ts +66 -0
  388. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,45 @@
1
+ /** Restore system relation targets (e.g. supatype:user) in engine-generated admin config. */
2
+
3
+ function fieldNameToForeignKey(fieldName: string): string {
4
+ return fieldName
5
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
6
+ .replace(/([a-z\d])([A-Z])/g, "$1_$2")
7
+ .toLowerCase() + "_id"
8
+ }
9
+
10
+ export function restoreSystemRelationTargets(admin: unknown, ast: unknown): void {
11
+ if (typeof admin !== "object" || admin === null || typeof ast !== "object" || ast === null) return
12
+ const astObj = ast as { models?: Array<{ name: string; fields?: Record<string, { kind: string; target?: string }> }> }
13
+ if (!astObj.models) return
14
+ const cfg = admin as {
15
+ models?: Array<{
16
+ tableName: string
17
+ fields: Array<{ name: string; widget: string; options?: Record<string, unknown> }>
18
+ }>
19
+ }
20
+ if (!Array.isArray(cfg.models)) return
21
+
22
+ const systemTargets = new Map<string, Map<string, string>>()
23
+ for (const model of astObj.models) {
24
+ if (!model.fields) continue
25
+ for (const [fieldName, field] of Object.entries(model.fields)) {
26
+ if (field.kind === "relation" && field.target?.includes(":")) {
27
+ const key = model.name.toLowerCase()
28
+ if (!systemTargets.has(key)) systemTargets.set(key, new Map())
29
+ systemTargets.get(key)!.set(fieldNameToForeignKey(fieldName), field.target)
30
+ }
31
+ }
32
+ }
33
+
34
+ for (const model of cfg.models) {
35
+ const modelTargets = systemTargets.get(model.tableName)
36
+ if (!modelTargets) continue
37
+ for (const field of model.fields) {
38
+ if (field.widget !== "relation" || !field.options) continue
39
+ const explicitFk = (field.options["foreignKey"] as string) ?? ""
40
+ const fk = explicitFk || fieldNameToForeignKey(field.name)
41
+ const systemTarget = modelTargets.get(fk)
42
+ if (systemTarget) field.options["target"] = systemTarget
43
+ }
44
+ }
45
+ }
@@ -92,6 +92,13 @@ function runtimeRouteSpecUnified(opts: RuntimeRouteOptions): RuntimeRoute[] {
92
92
  paths: ["/functions/v1/"],
93
93
  stripPath: false,
94
94
  },
95
+ {
96
+ name: "platform-v1",
97
+ serviceName: "supatype-server-platform",
98
+ serviceUrl: SERVER_GATEWAY,
99
+ paths: ["/platform/v1/"],
100
+ stripPath: false,
101
+ },
95
102
  {
96
103
  name: "graphql-v1",
97
104
  serviceName: "postgrest-graphql",
@@ -293,13 +293,14 @@ export function emitModel(
293
293
  options: Record<string, unknown>,
294
294
  tableName: string,
295
295
  access: Record<string, unknown>,
296
+ indexes: unknown[] = [],
296
297
  ): ModelAstV2 {
297
298
  return {
298
299
  name,
299
300
  fields,
300
301
  options,
301
302
  annotations: {
302
- db: { tableName, indexes: [] },
303
+ db: { tableName, indexes },
303
304
  platform: { access },
304
305
  },
305
306
  }
@@ -0,0 +1,248 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readFileSync,
5
+ readdirSync,
6
+ writeFileSync,
7
+ cpSync,
8
+ } from "node:fs"
9
+ import { join, resolve, relative } from "node:path"
10
+ import { gzipSync, gunzipSync } from "node:zlib"
11
+ import { collectSchemaSourcePaths, type SchemaSourceGraph } from "./type-extractor.js"
12
+ import { loadConfig } from "./config.js"
13
+ import { projectRootFromConfig, schemaPathFromProject } from "./project-config.js"
14
+
15
+ const MAX_COMPRESSED_BYTES = 2 * 1024 * 1024
16
+ const WARN_COMPRESSED_BYTES = 512 * 1024
17
+
18
+ export interface SchemaSourcesManifest {
19
+ version: number
20
+ format: "tar+gzip"
21
+ entryPoint: string
22
+ fileCount: number
23
+ uncompressedBytes: number
24
+ compressedBytes: number
25
+ files: Array<{ path: string; sha256: string; bytes: number }>
26
+ pushedBy?: string
27
+ }
28
+
29
+ export interface SchemaSourcesPayload {
30
+ manifest: SchemaSourcesManifest
31
+ dataBase64: string
32
+ gz: Buffer
33
+ }
34
+
35
+ function padTarField(value: string, len: number): string {
36
+ return value.slice(0, len).padEnd(len, "\0")
37
+ }
38
+
39
+ function tarChecksum(header: Buffer): number {
40
+ let sum = 0
41
+ for (let i = 0; i < 512; i++) {
42
+ sum += i >= 148 && i < 156 ? 32 : header[i]!
43
+ }
44
+ return sum
45
+ }
46
+
47
+ function writeTarEntry(name: string, content: Buffer): Buffer {
48
+ const header = Buffer.alloc(512, 0)
49
+ const size = content.length
50
+ header.write(padTarField(name, 100), 0, 100, "ascii")
51
+ header.write("0000644\0", 100, 8, "ascii")
52
+ header.write("0000000\0", 108, 8, "ascii")
53
+ header.write("0000000\0", 116, 8, "ascii")
54
+ header.write(padTarField(size.toString(8), 11), 124, 12, "ascii")
55
+ header.write("00000000000\0", 136, 12, "ascii")
56
+ header.write(" ", 148, 8, "ascii")
57
+ header.write("ustar\0", 257, 6, "ascii")
58
+ header.write("00", 263, 2, "ascii")
59
+ const chk = tarChecksum(header)
60
+ header.write(chk.toString(8).padStart(6, "0") + "\0 ", 148, 8, "ascii")
61
+
62
+ const pad = (512 - (size % 512)) % 512
63
+ return Buffer.concat([header, content, Buffer.alloc(pad)])
64
+ }
65
+
66
+ export function packSchemaSources(graph: SchemaSourceGraph): Buffer {
67
+ const chunks: Buffer[] = []
68
+ for (const file of graph.files) {
69
+ const content = readFileSync(file.absolutePath)
70
+ chunks.push(writeTarEntry(file.relativePath.replace(/\\/g, "/"), content))
71
+ }
72
+ chunks.push(Buffer.alloc(1024, 0))
73
+ return Buffer.concat(chunks)
74
+ }
75
+
76
+ export function unpackSchemaSources(tar: Buffer, projectRoot: string): Map<string, Buffer> {
77
+ const root = resolve(projectRoot)
78
+ const out = new Map<string, Buffer>()
79
+ let offset = 0
80
+ while (offset + 512 <= tar.length) {
81
+ const header = tar.subarray(offset, offset + 512)
82
+ offset += 512
83
+ if (header.every((b) => b === 0)) break
84
+ const name = header.subarray(0, 100).toString("utf8").replace(/\0.*$/, "").trim()
85
+ if (!name) break
86
+ const sizeOct = header.subarray(124, 136).toString("utf8").replace(/\0.*$/, "").trim()
87
+ const size = parseInt(sizeOct, 8) || 0
88
+ const content = tar.subarray(offset, offset + size)
89
+ offset += size + ((512 - (size % 512)) % 512)
90
+ const rel = name.replace(/\\/g, "/")
91
+ if (rel.startsWith("..") || rel.includes("/../")) {
92
+ throw new Error(`Invalid tar path: ${name}`)
93
+ }
94
+ const dest = resolve(root, rel)
95
+ if (!dest.startsWith(root)) {
96
+ throw new Error(`Tar path escapes project root: ${name}`)
97
+ }
98
+ out.set(rel, Buffer.from(content))
99
+ }
100
+ return out
101
+ }
102
+
103
+ export function buildSchemaSourcesPayload(
104
+ cwd: string,
105
+ pushedBy?: string,
106
+ ): SchemaSourcesPayload | null {
107
+ const config = loadConfig(cwd)
108
+ const root = projectRootFromConfig(config, cwd)
109
+ const entry = schemaPathFromProject(config, cwd)
110
+ const graph = collectSchemaSourcePaths(entry, root)
111
+ if (graph.files.length === 0) return null
112
+
113
+ const tarBuf = packSchemaSources(graph)
114
+ const gz = gzipSync(tarBuf, { level: 9 })
115
+
116
+ if (gz.length > MAX_COMPRESSED_BYTES) {
117
+ throw new Error(
118
+ `Schema snapshot too large (${(gz.length / 1024).toFixed(0)} KB compressed, max 2 MB). Split schema modules.`,
119
+ )
120
+ }
121
+ if (gz.length > WARN_COMPRESSED_BYTES) {
122
+ console.warn(`Warning: large schema snapshot (${(gz.length / 1024).toFixed(0)} KB compressed).`)
123
+ }
124
+
125
+ const manifest: SchemaSourcesManifest = {
126
+ version: 1,
127
+ format: "tar+gzip",
128
+ entryPoint: graph.entryPoint,
129
+ fileCount: graph.files.length,
130
+ uncompressedBytes: graph.files.reduce((s, f) => s + f.bytes, 0),
131
+ compressedBytes: gz.length,
132
+ files: graph.files.map((f) => ({ path: f.relativePath, sha256: f.sha256, bytes: f.bytes })),
133
+ ...(pushedBy ? { pushedBy } : {}),
134
+ }
135
+
136
+ return {
137
+ manifest,
138
+ dataBase64: gz.toString("base64"),
139
+ gz,
140
+ }
141
+ }
142
+
143
+ export function cacheSchemaSourcesLocally(cwd: string, migrationName: string, gz: Buffer): void {
144
+ const dir = join(cwd, ".supatype", "schema-snapshots")
145
+ mkdirSync(dir, { recursive: true })
146
+ writeFileSync(join(dir, `${migrationName}.tar.gz`), gz)
147
+ }
148
+
149
+ export function restoreSchemaSourcesFromGz(
150
+ gz: Buffer,
151
+ manifest: SchemaSourcesManifest,
152
+ projectRoot: string,
153
+ opts?: { backupDir?: string },
154
+ ): string[] {
155
+ const tar = gunzipSync(gz)
156
+ const files = unpackSchemaSources(tar, projectRoot)
157
+ const root = resolve(projectRoot)
158
+ const restored: string[] = []
159
+
160
+ if (opts?.backupDir) {
161
+ mkdirSync(opts.backupDir, { recursive: true })
162
+ for (const path of manifest.files) {
163
+ const abs = join(root, path.path)
164
+ if (existsSync(abs)) {
165
+ const dest = join(opts.backupDir, path.path)
166
+ mkdirSync(join(dest, ".."), { recursive: true })
167
+ cpSync(abs, dest)
168
+ }
169
+ }
170
+ }
171
+
172
+ for (const [rel, content] of files) {
173
+ const abs = join(root, rel)
174
+ mkdirSync(join(abs, ".."), { recursive: true })
175
+ writeFileSync(abs, content)
176
+ restored.push(rel)
177
+ }
178
+
179
+ return restored
180
+ }
181
+
182
+ export function findOrphanSchemaFiles(
183
+ projectRoot: string,
184
+ entryPoint: string,
185
+ manifestPaths: Set<string>,
186
+ ): string[] {
187
+ const entry = resolve(projectRoot, entryPoint)
188
+ const graph = collectSchemaSourcePaths(entry, projectRoot)
189
+ const orphans: string[] = []
190
+ const schemaDir = join(projectRoot, graph.entryPoint.split("/").slice(0, -1).join("/") || ".")
191
+ if (!existsSync(schemaDir)) return orphans
192
+
193
+ const walk = (dir: string): void => {
194
+ for (const ent of readdirSync(dir, { withFileTypes: true })) {
195
+ const abs = join(dir, ent.name)
196
+ if (ent.isDirectory()) {
197
+ walk(abs)
198
+ continue
199
+ }
200
+ if (!/\.(ts|tsx)$/.test(ent.name)) continue
201
+ const rel = relative(projectRoot, abs).replace(/\\/g, "/")
202
+ if (!manifestPaths.has(rel) && !graph.files.some((f) => f.relativePath === rel)) {
203
+ orphans.push(rel)
204
+ }
205
+ }
206
+ }
207
+ walk(schemaDir)
208
+ return orphans
209
+ }
210
+
211
+ export function resolvePushedBy(): string {
212
+ return (
213
+ process.env["SUPATYPE_PUSHED_BY"] ??
214
+ process.env["USER"] ??
215
+ process.env["USERNAME"] ??
216
+ "local"
217
+ )
218
+ }
219
+
220
+ export interface SchemaSourcePushArtifacts {
221
+ gzPath: string
222
+ manifestPath: string
223
+ /** Paths inside the Docker /project bind mount. */
224
+ dockerGzPath: string
225
+ dockerManifestPath: string
226
+ payload: SchemaSourcesPayload
227
+ }
228
+
229
+ /** Write schema source blob + manifest under `.supatype/` for engine push (CLI + dev watch). */
230
+ export function writeSchemaSourcePushArtifacts(cwd: string): SchemaSourcePushArtifacts | null {
231
+ const payload = buildSchemaSourcesPayload(cwd, resolvePushedBy())
232
+ if (!payload) return null
233
+
234
+ const dir = join(cwd, ".supatype")
235
+ mkdirSync(dir, { recursive: true })
236
+ const gzPath = join(dir, "schema-sources-push.gz")
237
+ const manifestPath = join(dir, "schema-sources-manifest.json")
238
+ writeFileSync(gzPath, payload.gz)
239
+ writeFileSync(manifestPath, JSON.stringify(payload.manifest))
240
+
241
+ return {
242
+ gzPath,
243
+ manifestPath,
244
+ dockerGzPath: "/project/.supatype/schema-sources-push.gz",
245
+ dockerManifestPath: "/project/.supatype/schema-sources-manifest.json",
246
+ payload,
247
+ }
248
+ }
@@ -38,7 +38,13 @@ async function main() {
38
38
  }
39
39
 
40
40
  if (anyFailed) {
41
- console.error("[supatype] Some downloads failed. Run 'supatype update' to retry.")
41
+ // npm hides postinstall output unless --foreground-scripts, so don't rely on
42
+ // this being seen: the CLI re-attempts the download (with retry) on first use.
43
+ console.error(
44
+ "[supatype] Some component binaries failed to download. " +
45
+ "They will be re-downloaded automatically on first use; " +
46
+ "run 'supatype update' to retry now.",
47
+ )
42
48
  } else {
43
49
  console.log("[supatype] All component binaries downloaded successfully.")
44
50
  }
package/src/seed.ts ADDED
@@ -0,0 +1,43 @@
1
+ import pg from "pg"
2
+
3
+ export interface SeedSql {
4
+ (strings: TemplateStringsArray, ...values: unknown[]): Promise<pg.QueryResult>
5
+ end(): Promise<void>
6
+ }
7
+
8
+ /** Lightweight tagged-template SQL helper for project `seed.ts` scripts. */
9
+ export function sql(connectionString: string): SeedSql {
10
+ const client = new pg.Client({ connectionString })
11
+ let connected = false
12
+
13
+ const ensureConnected = async (): Promise<void> => {
14
+ if (!connected) {
15
+ await client.connect()
16
+ connected = true
17
+ }
18
+ }
19
+
20
+ const tag = async (
21
+ strings: TemplateStringsArray,
22
+ ...values: unknown[]
23
+ ): Promise<pg.QueryResult> => {
24
+ await ensureConnected()
25
+ let text = ""
26
+ for (let i = 0; i < strings.length; i++) {
27
+ text += strings[i]
28
+ if (i < values.length) {
29
+ text += `$${i + 1}`
30
+ }
31
+ }
32
+ return client.query(text, values)
33
+ }
34
+
35
+ return Object.assign(tag, {
36
+ end: async (): Promise<void> => {
37
+ if (connected) {
38
+ await client.end()
39
+ connected = false
40
+ }
41
+ },
42
+ })
43
+ }