@supatype/cli 0.1.0-alpha.10

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 (416) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test.log +221 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -0
  6. package/bin/supatype.js +5 -0
  7. package/dist/app/framework.d.ts +44 -0
  8. package/dist/app/framework.d.ts.map +1 -0
  9. package/dist/app/framework.js +200 -0
  10. package/dist/app/framework.js.map +1 -0
  11. package/dist/app/proxy-dev-app.d.ts +13 -0
  12. package/dist/app/proxy-dev-app.d.ts.map +1 -0
  13. package/dist/app/proxy-dev-app.js +54 -0
  14. package/dist/app/proxy-dev-app.js.map +1 -0
  15. package/dist/app-config.d.ts +7 -0
  16. package/dist/app-config.d.ts.map +1 -0
  17. package/dist/app-config.js +113 -0
  18. package/dist/app-config.js.map +1 -0
  19. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  20. package/dist/augmentation-generator.d.ts +2 -0
  21. package/dist/augmentation-generator.d.ts.map +1 -0
  22. package/dist/augmentation-generator.js +111 -0
  23. package/dist/augmentation-generator.js.map +1 -0
  24. package/dist/binary-cache.d.ts +98 -0
  25. package/dist/binary-cache.d.ts.map +1 -0
  26. package/dist/binary-cache.js +687 -0
  27. package/dist/binary-cache.js.map +1 -0
  28. package/dist/cli.d.ts +2 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +61 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/commands/admin.d.ts +4 -0
  33. package/dist/commands/admin.d.ts.map +1 -0
  34. package/dist/commands/admin.js +271 -0
  35. package/dist/commands/admin.js.map +1 -0
  36. package/dist/commands/app.d.ts +3 -0
  37. package/dist/commands/app.d.ts.map +1 -0
  38. package/dist/commands/app.js +82 -0
  39. package/dist/commands/app.js.map +1 -0
  40. package/dist/commands/cache.d.ts +6 -0
  41. package/dist/commands/cache.d.ts.map +1 -0
  42. package/dist/commands/cache.js +105 -0
  43. package/dist/commands/cache.js.map +1 -0
  44. package/dist/commands/cloud.d.ts +23 -0
  45. package/dist/commands/cloud.d.ts.map +1 -0
  46. package/dist/commands/cloud.js +254 -0
  47. package/dist/commands/cloud.js.map +1 -0
  48. package/dist/commands/db.d.ts +8 -0
  49. package/dist/commands/db.d.ts.map +1 -0
  50. package/dist/commands/db.js +116 -0
  51. package/dist/commands/db.js.map +1 -0
  52. package/dist/commands/deploy-types.d.ts +14 -0
  53. package/dist/commands/deploy-types.d.ts.map +1 -0
  54. package/dist/commands/deploy-types.js +38 -0
  55. package/dist/commands/deploy-types.js.map +1 -0
  56. package/dist/commands/deploy.d.ts +15 -0
  57. package/dist/commands/deploy.d.ts.map +1 -0
  58. package/dist/commands/deploy.js +322 -0
  59. package/dist/commands/deploy.js.map +1 -0
  60. package/dist/commands/dev.d.ts +14 -0
  61. package/dist/commands/dev.d.ts.map +1 -0
  62. package/dist/commands/dev.js +806 -0
  63. package/dist/commands/dev.js.map +1 -0
  64. package/dist/commands/diff.d.ts +3 -0
  65. package/dist/commands/diff.d.ts.map +1 -0
  66. package/dist/commands/diff.js +54 -0
  67. package/dist/commands/diff.js.map +1 -0
  68. package/dist/commands/engine.d.ts +7 -0
  69. package/dist/commands/engine.d.ts.map +1 -0
  70. package/dist/commands/engine.js +27 -0
  71. package/dist/commands/engine.js.map +1 -0
  72. package/dist/commands/functions.d.ts +3 -0
  73. package/dist/commands/functions.d.ts.map +1 -0
  74. package/dist/commands/functions.js +749 -0
  75. package/dist/commands/functions.js.map +1 -0
  76. package/dist/commands/generate.d.ts +3 -0
  77. package/dist/commands/generate.d.ts.map +1 -0
  78. package/dist/commands/generate.js +38 -0
  79. package/dist/commands/generate.js.map +1 -0
  80. package/dist/commands/init.d.ts +7 -0
  81. package/dist/commands/init.d.ts.map +1 -0
  82. package/dist/commands/init.js +228 -0
  83. package/dist/commands/init.js.map +1 -0
  84. package/dist/commands/keys.d.ts +4 -0
  85. package/dist/commands/keys.d.ts.map +1 -0
  86. package/dist/commands/keys.js +57 -0
  87. package/dist/commands/keys.js.map +1 -0
  88. package/dist/commands/logs.d.ts +6 -0
  89. package/dist/commands/logs.d.ts.map +1 -0
  90. package/dist/commands/logs.js +52 -0
  91. package/dist/commands/logs.js.map +1 -0
  92. package/dist/commands/migrate-from-v1.d.ts +5 -0
  93. package/dist/commands/migrate-from-v1.d.ts.map +1 -0
  94. package/dist/commands/migrate-from-v1.js +125 -0
  95. package/dist/commands/migrate-from-v1.js.map +1 -0
  96. package/dist/commands/migrate.d.ts +3 -0
  97. package/dist/commands/migrate.d.ts.map +1 -0
  98. package/dist/commands/migrate.js +75 -0
  99. package/dist/commands/migrate.js.map +1 -0
  100. package/dist/commands/pg.d.ts +8 -0
  101. package/dist/commands/pg.d.ts.map +1 -0
  102. package/dist/commands/pg.js +102 -0
  103. package/dist/commands/pg.js.map +1 -0
  104. package/dist/commands/plugins.d.ts +3 -0
  105. package/dist/commands/plugins.d.ts.map +1 -0
  106. package/dist/commands/plugins.js +431 -0
  107. package/dist/commands/plugins.js.map +1 -0
  108. package/dist/commands/pull.d.ts +3 -0
  109. package/dist/commands/pull.d.ts.map +1 -0
  110. package/dist/commands/pull.js +12 -0
  111. package/dist/commands/pull.js.map +1 -0
  112. package/dist/commands/push.d.ts +3 -0
  113. package/dist/commands/push.d.ts.map +1 -0
  114. package/dist/commands/push.js +179 -0
  115. package/dist/commands/push.js.map +1 -0
  116. package/dist/commands/seed.d.ts +5 -0
  117. package/dist/commands/seed.d.ts.map +1 -0
  118. package/dist/commands/seed.js +55 -0
  119. package/dist/commands/seed.js.map +1 -0
  120. package/dist/commands/self-host.d.ts +9 -0
  121. package/dist/commands/self-host.d.ts.map +1 -0
  122. package/dist/commands/self-host.js +310 -0
  123. package/dist/commands/self-host.js.map +1 -0
  124. package/dist/commands/self-update.d.ts +9 -0
  125. package/dist/commands/self-update.d.ts.map +1 -0
  126. package/dist/commands/self-update.js +33 -0
  127. package/dist/commands/self-update.js.map +1 -0
  128. package/dist/commands/status.d.ts +6 -0
  129. package/dist/commands/status.d.ts.map +1 -0
  130. package/dist/commands/status.js +70 -0
  131. package/dist/commands/status.js.map +1 -0
  132. package/dist/commands/types.d.ts +3 -0
  133. package/dist/commands/types.d.ts.map +1 -0
  134. package/dist/commands/types.js +62 -0
  135. package/dist/commands/types.js.map +1 -0
  136. package/dist/commands/update.d.ts +7 -0
  137. package/dist/commands/update.d.ts.map +1 -0
  138. package/dist/commands/update.js +118 -0
  139. package/dist/commands/update.js.map +1 -0
  140. package/dist/components.d.ts +5 -0
  141. package/dist/components.d.ts.map +1 -0
  142. package/dist/components.js +3 -0
  143. package/dist/components.js.map +1 -0
  144. package/dist/config.d.ts +65 -0
  145. package/dist/config.d.ts.map +1 -0
  146. package/dist/config.js +134 -0
  147. package/dist/config.js.map +1 -0
  148. package/dist/dev-compose.d.ts +19 -0
  149. package/dist/dev-compose.d.ts.map +1 -0
  150. package/dist/dev-compose.js +468 -0
  151. package/dist/dev-compose.js.map +1 -0
  152. package/dist/dev-log-bus.d.ts +30 -0
  153. package/dist/dev-log-bus.d.ts.map +1 -0
  154. package/dist/dev-log-bus.js +87 -0
  155. package/dist/dev-log-bus.js.map +1 -0
  156. package/dist/dev-log-filter.d.ts +10 -0
  157. package/dist/dev-log-filter.d.ts.map +1 -0
  158. package/dist/dev-log-filter.js +36 -0
  159. package/dist/dev-log-filter.js.map +1 -0
  160. package/dist/dev-logo.d.ts +12 -0
  161. package/dist/dev-logo.d.ts.map +1 -0
  162. package/dist/dev-logo.js +57 -0
  163. package/dist/dev-logo.js.map +1 -0
  164. package/dist/dev-session.d.ts +26 -0
  165. package/dist/dev-session.d.ts.map +1 -0
  166. package/dist/dev-session.js +106 -0
  167. package/dist/dev-session.js.map +1 -0
  168. package/dist/dev-shutdown.d.ts +9 -0
  169. package/dist/dev-shutdown.d.ts.map +1 -0
  170. package/dist/dev-shutdown.js +50 -0
  171. package/dist/dev-shutdown.js.map +1 -0
  172. package/dist/dev-task-colors.d.ts +14 -0
  173. package/dist/dev-task-colors.d.ts.map +1 -0
  174. package/dist/dev-task-colors.js +44 -0
  175. package/dist/dev-task-colors.js.map +1 -0
  176. package/dist/dev-tui.d.ts +24 -0
  177. package/dist/dev-tui.d.ts.map +1 -0
  178. package/dist/dev-tui.js +188 -0
  179. package/dist/dev-tui.js.map +1 -0
  180. package/dist/diff-output.d.ts +4 -0
  181. package/dist/diff-output.d.ts.map +1 -0
  182. package/dist/diff-output.js +12 -0
  183. package/dist/diff-output.js.map +1 -0
  184. package/dist/docker-postgres.d.ts +57 -0
  185. package/dist/docker-postgres.d.ts.map +1 -0
  186. package/dist/docker-postgres.js +208 -0
  187. package/dist/docker-postgres.js.map +1 -0
  188. package/dist/engine-client.d.ts +69 -0
  189. package/dist/engine-client.d.ts.map +1 -0
  190. package/dist/engine-client.js +157 -0
  191. package/dist/engine-client.js.map +1 -0
  192. package/dist/engine-push-output.d.ts +16 -0
  193. package/dist/engine-push-output.d.ts.map +1 -0
  194. package/dist/engine-push-output.js +61 -0
  195. package/dist/engine-push-output.js.map +1 -0
  196. package/dist/ensure-binary.d.ts +7 -0
  197. package/dist/ensure-binary.d.ts.map +1 -0
  198. package/dist/ensure-binary.js +17 -0
  199. package/dist/ensure-binary.js.map +1 -0
  200. package/dist/functions-router-gen.d.ts +14 -0
  201. package/dist/functions-router-gen.d.ts.map +1 -0
  202. package/dist/functions-router-gen.js +199 -0
  203. package/dist/functions-router-gen.js.map +1 -0
  204. package/dist/index.d.ts +11 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +9 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/jwt.d.ts +3 -0
  209. package/dist/jwt.d.ts.map +1 -0
  210. package/dist/jwt.js +13 -0
  211. package/dist/jwt.js.map +1 -0
  212. package/dist/kong-config.d.ts +25 -0
  213. package/dist/kong-config.d.ts.map +1 -0
  214. package/dist/kong-config.js +71 -0
  215. package/dist/kong-config.js.map +1 -0
  216. package/dist/local-gateway.d.ts +7 -0
  217. package/dist/local-gateway.d.ts.map +1 -0
  218. package/dist/local-gateway.js +9 -0
  219. package/dist/local-gateway.js.map +1 -0
  220. package/dist/local-storage.d.ts +8 -0
  221. package/dist/local-storage.d.ts.map +1 -0
  222. package/dist/local-storage.js +14 -0
  223. package/dist/local-storage.js.map +1 -0
  224. package/dist/pgbouncer-userlist.d.ts +5 -0
  225. package/dist/pgbouncer-userlist.d.ts.map +1 -0
  226. package/dist/pgbouncer-userlist.js +14 -0
  227. package/dist/pgbouncer-userlist.js.map +1 -0
  228. package/dist/postgres-ctl.d.ts +44 -0
  229. package/dist/postgres-ctl.d.ts.map +1 -0
  230. package/dist/postgres-ctl.js +137 -0
  231. package/dist/postgres-ctl.js.map +1 -0
  232. package/dist/process-manager.d.ts +49 -0
  233. package/dist/process-manager.d.ts.map +1 -0
  234. package/dist/process-manager.js +177 -0
  235. package/dist/process-manager.js.map +1 -0
  236. package/dist/project-config.d.ts +238 -0
  237. package/dist/project-config.d.ts.map +1 -0
  238. package/dist/project-config.js +159 -0
  239. package/dist/project-config.js.map +1 -0
  240. package/dist/pull-utils.d.ts +31 -0
  241. package/dist/pull-utils.d.ts.map +1 -0
  242. package/dist/pull-utils.js +77 -0
  243. package/dist/pull-utils.js.map +1 -0
  244. package/dist/release-pins.d.ts +7 -0
  245. package/dist/release-pins.d.ts.map +1 -0
  246. package/dist/release-pins.js +27 -0
  247. package/dist/release-pins.js.map +1 -0
  248. package/dist/release-public-key.d.ts +8 -0
  249. package/dist/release-public-key.d.ts.map +1 -0
  250. package/dist/release-public-key.js +13 -0
  251. package/dist/release-public-key.js.map +1 -0
  252. package/dist/restore-system-relation-targets.d.ts +3 -0
  253. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  254. package/dist/restore-system-relation-targets.js +45 -0
  255. package/dist/restore-system-relation-targets.js.map +1 -0
  256. package/dist/runtime-routes.d.ts +34 -0
  257. package/dist/runtime-routes.d.ts.map +1 -0
  258. package/dist/runtime-routes.js +252 -0
  259. package/dist/runtime-routes.js.map +1 -0
  260. package/dist/schema-ast-v2.d.ts +127 -0
  261. package/dist/schema-ast-v2.d.ts.map +1 -0
  262. package/dist/schema-ast-v2.js +226 -0
  263. package/dist/schema-ast-v2.js.map +1 -0
  264. package/dist/scripts/postinstall.d.ts +11 -0
  265. package/dist/scripts/postinstall.d.ts.map +1 -0
  266. package/dist/scripts/postinstall.js +47 -0
  267. package/dist/scripts/postinstall.js.map +1 -0
  268. package/dist/seed.d.ts +8 -0
  269. package/dist/seed.d.ts.map +1 -0
  270. package/dist/seed.js +32 -0
  271. package/dist/seed.js.map +1 -0
  272. package/dist/self-host-compose.d.ts +43 -0
  273. package/dist/self-host-compose.d.ts.map +1 -0
  274. package/dist/self-host-compose.js +400 -0
  275. package/dist/self-host-compose.js.map +1 -0
  276. package/dist/storage-provision.d.ts +24 -0
  277. package/dist/storage-provision.d.ts.map +1 -0
  278. package/dist/storage-provision.js +44 -0
  279. package/dist/storage-provision.js.map +1 -0
  280. package/dist/studio-admin-roles.d.ts +7 -0
  281. package/dist/studio-admin-roles.d.ts.map +1 -0
  282. package/dist/studio-admin-roles.js +14 -0
  283. package/dist/studio-admin-roles.js.map +1 -0
  284. package/dist/studio-dev-server.d.ts +22 -0
  285. package/dist/studio-dev-server.d.ts.map +1 -0
  286. package/dist/studio-dev-server.js +28 -0
  287. package/dist/studio-dev-server.js.map +1 -0
  288. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  289. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  290. package/dist/supatype-eval-1781522769253.mjs +3 -0
  291. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  292. package/dist/systemd.d.ts +26 -0
  293. package/dist/systemd.d.ts.map +1 -0
  294. package/dist/systemd.js +102 -0
  295. package/dist/systemd.js.map +1 -0
  296. package/dist/tsx-runner.d.ts +18 -0
  297. package/dist/tsx-runner.d.ts.map +1 -0
  298. package/dist/tsx-runner.js +69 -0
  299. package/dist/tsx-runner.js.map +1 -0
  300. package/dist/type-extractor.d.ts +4 -0
  301. package/dist/type-extractor.d.ts.map +1 -0
  302. package/dist/type-extractor.js +1213 -0
  303. package/dist/type-extractor.js.map +1 -0
  304. package/dist/type-resolver.d.ts +33 -0
  305. package/dist/type-resolver.d.ts.map +1 -0
  306. package/dist/type-resolver.js +338 -0
  307. package/dist/type-resolver.js.map +1 -0
  308. package/package.json +41 -0
  309. package/releases/deno/VERSION +1 -0
  310. package/scripts/mirror-deno-release.sh +76 -0
  311. package/src/TYPE-RESOLUTION.md +294 -0
  312. package/src/app/framework.ts +249 -0
  313. package/src/app/proxy-dev-app.ts +68 -0
  314. package/src/app-config.ts +128 -0
  315. package/src/augmentation-generator.ts +126 -0
  316. package/src/binary-cache.ts +845 -0
  317. package/src/cli.ts +63 -0
  318. package/src/commands/admin.ts +372 -0
  319. package/src/commands/app.ts +97 -0
  320. package/src/commands/cache.ts +117 -0
  321. package/src/commands/cloud.ts +325 -0
  322. package/src/commands/db.ts +136 -0
  323. package/src/commands/deploy-types.ts +49 -0
  324. package/src/commands/deploy.ts +400 -0
  325. package/src/commands/dev.ts +1009 -0
  326. package/src/commands/diff.ts +63 -0
  327. package/src/commands/engine.ts +30 -0
  328. package/src/commands/functions.ts +901 -0
  329. package/src/commands/generate.ts +44 -0
  330. package/src/commands/init.ts +253 -0
  331. package/src/commands/keys.ts +66 -0
  332. package/src/commands/logs.ts +58 -0
  333. package/src/commands/migrate-from-v1.ts +131 -0
  334. package/src/commands/migrate.ts +87 -0
  335. package/src/commands/pg.ts +133 -0
  336. package/src/commands/plugins.ts +508 -0
  337. package/src/commands/pull.ts +17 -0
  338. package/src/commands/push.ts +226 -0
  339. package/src/commands/seed.ts +68 -0
  340. package/src/commands/self-host.ts +364 -0
  341. package/src/commands/self-update.ts +45 -0
  342. package/src/commands/status.ts +84 -0
  343. package/src/commands/types.ts +76 -0
  344. package/src/commands/update.ts +136 -0
  345. package/src/components.ts +6 -0
  346. package/src/config.ts +223 -0
  347. package/src/dev-compose.ts +583 -0
  348. package/src/dev-log-bus.ts +101 -0
  349. package/src/dev-log-filter.ts +32 -0
  350. package/src/dev-logo.ts +62 -0
  351. package/src/dev-session.ts +130 -0
  352. package/src/dev-shutdown.ts +54 -0
  353. package/src/dev-task-colors.ts +47 -0
  354. package/src/dev-tui.ts +232 -0
  355. package/src/diff-output.ts +12 -0
  356. package/src/docker-postgres.ts +295 -0
  357. package/src/engine-client.ts +236 -0
  358. package/src/engine-push-output.ts +71 -0
  359. package/src/ensure-binary.ts +28 -0
  360. package/src/functions-router-gen.ts +224 -0
  361. package/src/index.ts +11 -0
  362. package/src/jwt.ts +14 -0
  363. package/src/kong-config.ts +93 -0
  364. package/src/local-gateway.ts +9 -0
  365. package/src/local-storage.ts +14 -0
  366. package/src/pgbouncer-userlist.ts +15 -0
  367. package/src/postgres-ctl.ts +171 -0
  368. package/src/process-manager.ts +220 -0
  369. package/src/project-config.ts +388 -0
  370. package/src/pull-utils.ts +81 -0
  371. package/src/release-pins.ts +31 -0
  372. package/src/release-public-key.ts +12 -0
  373. package/src/restore-system-relation-targets.ts +45 -0
  374. package/src/runtime-routes.ts +291 -0
  375. package/src/schema-ast-v2.ts +324 -0
  376. package/src/scripts/postinstall.ts +51 -0
  377. package/src/seed.ts +43 -0
  378. package/src/self-host-compose.ts +452 -0
  379. package/src/storage-provision.ts +58 -0
  380. package/src/studio-admin-roles.ts +16 -0
  381. package/src/studio-dev-server.ts +53 -0
  382. package/src/supatype-eval-1781522769253.mts +1 -0
  383. package/src/systemd.ts +137 -0
  384. package/src/tsx-runner.ts +89 -0
  385. package/src/type-extractor.ts +1479 -0
  386. package/src/type-resolver.ts +457 -0
  387. package/tests/app-command.test.ts +54 -0
  388. package/tests/augmentation-generator.test.ts +59 -0
  389. package/tests/binary-cache-cloud-overrides.test.ts +123 -0
  390. package/tests/cached-artifact-format.test.ts +84 -0
  391. package/tests/cli-help.test.ts +133 -0
  392. package/tests/config.test.ts +252 -0
  393. package/tests/dev-ui.test.ts +139 -0
  394. package/tests/docker-postgres.test.ts +39 -0
  395. package/tests/engine-distribution.test.ts +418 -0
  396. package/tests/engine-push-output.test.ts +67 -0
  397. package/tests/ensure-binary.test.ts +59 -0
  398. package/tests/init.test.ts +127 -0
  399. package/tests/keys.test.ts +160 -0
  400. package/tests/migrate-from-v1.test.ts +29 -0
  401. package/tests/normalize-admin-config.test.ts +48 -0
  402. package/tests/pg-spawn-env.test.ts +18 -0
  403. package/tests/postgres-archive-tag.test.ts +9 -0
  404. package/tests/proxy-dev-app.test.ts +33 -0
  405. package/tests/pull-utils.test.ts +150 -0
  406. package/tests/release-pins.test.ts +28 -0
  407. package/tests/runtime-contract.test.ts +370 -0
  408. package/tests/seed-discover.test.ts +31 -0
  409. package/tests/studio-admin-roles.test.ts +27 -0
  410. package/tests/tsconfig.json +9 -0
  411. package/tests/tsx-runner.test.ts +66 -0
  412. package/tests/type-extractor.test.ts +985 -0
  413. package/tests/type-resolver.test.ts +59 -0
  414. package/tsconfig.json +10 -0
  415. package/tsconfig.tsbuildinfo +1 -0
  416. package/vitest.config.ts +12 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Release pins read from files under packages/cli/releases/.
3
+ * CI (deno-releases workflow) uses the same paths — bump only releases/deno/VERSION.
4
+ */
5
+
6
+ import { readFileSync } from "node:fs"
7
+ import { dirname, join } from "node:path"
8
+ import { fileURLToPath } from "node:url"
9
+
10
+ const CLI_PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..")
11
+
12
+ function readPinFile(...segments: string[]): string {
13
+ const path = join(CLI_PACKAGE_ROOT, "releases", ...segments)
14
+ let raw: string
15
+ try {
16
+ raw = readFileSync(path, "utf8")
17
+ } catch {
18
+ throw new Error(
19
+ `Missing release pin file: ${path}\n` +
20
+ "Expected packages/cli/releases/… — reinstall @supatype/cli or build from the monorepo.",
21
+ )
22
+ }
23
+ const version = raw.trim()
24
+ if (!/^\d+\.\d+\.\d+/.test(version)) {
25
+ throw new Error(`Invalid pin in ${path}: expected semver like 2.2.0, got ${JSON.stringify(raw)}`)
26
+ }
27
+ return version
28
+ }
29
+
30
+ /** Pinned Deno runtime for edge functions (also published to CDN under /deno/v{version}/). */
31
+ export const DENO_RELEASE_PIN = readPinFile("deno", "VERSION")
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Minisign public key for CDN release verification.
3
+ * Populated at publish via scripts/embed-release-pubkey.mjs (MINISIGN_PUBLIC_KEY secret),
4
+ * or overridden at runtime with SUPATYPE_RELEASE_PUBLIC_KEY.
5
+ */
6
+ export const EMBEDDED_RELEASE_PUBLIC_KEY = "untrusted comment: minisign public key DE133E99689AE71D\nRWQd55pomT4T3t+5FLZZ6+h0DoHrtiuU9RBUHHm9BcFHeGRvW7BXxBCr"
7
+
8
+ export function releasePublicKey(): string {
9
+ const fromEnv = process.env["SUPATYPE_RELEASE_PUBLIC_KEY"]?.trim()
10
+ if (fromEnv) return fromEnv
11
+ return EMBEDDED_RELEASE_PUBLIC_KEY.trim()
12
+ }
@@ -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
+ }
@@ -0,0 +1,291 @@
1
+ export interface RuntimeRoute {
2
+ name: string
3
+ serviceName: string
4
+ serviceUrl: string
5
+ paths: string[]
6
+ stripPath?: boolean
7
+ protocols?: string[]
8
+ engineProtected?: boolean
9
+ /** Route /graphql/v1 to PostgREST /rpc/graphql with graphql_public Content-Profile. */
10
+ graphqlPostgrest?: boolean
11
+ }
12
+
13
+ export interface RuntimeRouteOptions {
14
+ appUpstream?: string
15
+ staticAppServiceUrl?: string
16
+ /** Compose self-host: supatype-server container (functions proxy). */
17
+ functionsServiceUrl?: string
18
+ /**
19
+ * Self-host Compose: Kong forwards API traffic to supatype-server (unified gateway),
20
+ * which proxies to internal services — same model as `supatype dev`.
21
+ */
22
+ unifiedGateway?: boolean
23
+ /** Studio UI upstream (default: in-compose `studio:3002`). */
24
+ studioServiceUrl?: string
25
+ /**
26
+ * Strip `/studio/` before proxying to the Studio upstream.
27
+ * False for host Vite dev (`host.docker.internal`) where `base` is `/studio/`.
28
+ */
29
+ studioStripPath?: boolean
30
+ }
31
+
32
+ const DEFAULT_STUDIO_SERVICE_URL = "http://studio:3002"
33
+
34
+ function studioServiceUrl(opts: RuntimeRouteOptions): string {
35
+ const url = opts.studioServiceUrl?.trim()
36
+ return url && url.length > 0 ? url : DEFAULT_STUDIO_SERVICE_URL
37
+ }
38
+
39
+ function studioStripPath(opts: RuntimeRouteOptions): boolean {
40
+ return opts.studioStripPath !== false
41
+ }
42
+
43
+ const SERVER_GATEWAY = "http://server:9999"
44
+
45
+ /**
46
+ * Kong routes when self-host uses supatype-server as the single API gateway.
47
+ */
48
+ function runtimeRouteSpecUnified(opts: RuntimeRouteOptions): RuntimeRoute[] {
49
+ const studioUrl = studioServiceUrl(opts)
50
+ const stripStudio = studioStripPath(opts)
51
+ return [
52
+ {
53
+ name: "rest-v1",
54
+ serviceName: "supatype-server-rest",
55
+ serviceUrl: SERVER_GATEWAY,
56
+ paths: ["/rest/v1/"],
57
+ stripPath: false,
58
+ },
59
+ {
60
+ name: "auth-v1",
61
+ serviceName: "supatype-server-auth",
62
+ serviceUrl: SERVER_GATEWAY,
63
+ paths: ["/auth/v1/"],
64
+ stripPath: false,
65
+ },
66
+ {
67
+ name: "admin-v1",
68
+ serviceName: "supatype-server-admin",
69
+ serviceUrl: SERVER_GATEWAY,
70
+ paths: ["/admin/v1/"],
71
+ stripPath: false,
72
+ },
73
+ {
74
+ name: "storage-v1",
75
+ serviceName: "supatype-server-storage",
76
+ serviceUrl: SERVER_GATEWAY,
77
+ paths: ["/storage/v1/"],
78
+ stripPath: false,
79
+ },
80
+ {
81
+ name: "realtime-v1",
82
+ serviceName: "supatype-server-realtime",
83
+ serviceUrl: SERVER_GATEWAY,
84
+ paths: ["/realtime/v1/"],
85
+ stripPath: false,
86
+ protocols: ["http", "https"],
87
+ },
88
+ {
89
+ name: "functions-v1",
90
+ serviceName: "supatype-server-functions",
91
+ serviceUrl: SERVER_GATEWAY,
92
+ paths: ["/functions/v1/"],
93
+ stripPath: false,
94
+ },
95
+ {
96
+ name: "graphql-v1",
97
+ serviceName: "postgrest-graphql",
98
+ serviceUrl: "http://postgrest:3000/rpc/graphql",
99
+ paths: ["/graphql/v1"],
100
+ stripPath: true,
101
+ graphqlPostgrest: true,
102
+ },
103
+ {
104
+ name: "studio-config-route",
105
+ serviceName: "supatype-server-studio-config",
106
+ serviceUrl: SERVER_GATEWAY,
107
+ paths: ["/studio-config"],
108
+ stripPath: false,
109
+ },
110
+ {
111
+ name: "sql-route",
112
+ serviceName: "supatype-server-sql",
113
+ serviceUrl: SERVER_GATEWAY,
114
+ paths: ["/sql"],
115
+ stripPath: false,
116
+ },
117
+ {
118
+ name: "studio-auth",
119
+ serviceName: "supatype-server-studio-auth",
120
+ serviceUrl: SERVER_GATEWAY,
121
+ paths: ["/studio/auth/"],
122
+ stripPath: false,
123
+ },
124
+ {
125
+ name: "studio-proxy",
126
+ serviceName: "supatype-server-studio-proxy",
127
+ serviceUrl: SERVER_GATEWAY,
128
+ paths: ["/studio/proxy/"],
129
+ stripPath: false,
130
+ },
131
+ {
132
+ name: "studio-exact",
133
+ serviceName: "studio-exact",
134
+ serviceUrl: studioUrl,
135
+ paths: ["~/studio$"],
136
+ stripPath: stripStudio,
137
+ },
138
+ {
139
+ name: "studio",
140
+ serviceName: "studio",
141
+ serviceUrl: studioUrl,
142
+ paths: ["/studio/"],
143
+ stripPath: stripStudio,
144
+ },
145
+ {
146
+ name: "app-root",
147
+ serviceName: "supatype-server-app",
148
+ serviceUrl: SERVER_GATEWAY,
149
+ paths: ["/"],
150
+ stripPath: false,
151
+ },
152
+ ]
153
+ }
154
+
155
+ /**
156
+ * Legacy split-stack routes (PostgREST/storage/realtime directly from Kong).
157
+ * Kept for tests or explicit opt-out only — self-host uses unifiedGateway.
158
+ */
159
+ function runtimeRouteSpecSplit(opts: RuntimeRouteOptions): RuntimeRoute[] {
160
+ const studioUrl = studioServiceUrl(opts)
161
+ const stripStudio = studioStripPath(opts)
162
+ const routes: RuntimeRoute[] = [
163
+ {
164
+ name: "rest-v1",
165
+ serviceName: "rest-v1",
166
+ serviceUrl: "http://postgrest:3000",
167
+ paths: ["/rest/v1/"],
168
+ stripPath: true,
169
+ },
170
+ {
171
+ name: "auth-v1",
172
+ serviceName: "auth-v1",
173
+ serviceUrl: "http://server:9999",
174
+ paths: ["/auth/v1/"],
175
+ stripPath: true,
176
+ },
177
+ {
178
+ name: "admin-v1",
179
+ serviceName: "admin-v1",
180
+ serviceUrl: "http://server:9999",
181
+ paths: ["/admin/v1/"],
182
+ stripPath: false,
183
+ },
184
+ {
185
+ name: "storage-v1",
186
+ serviceName: "storage-v1",
187
+ serviceUrl: "http://storage:5000",
188
+ paths: ["/storage/v1/"],
189
+ stripPath: true,
190
+ },
191
+ {
192
+ name: "realtime-v1",
193
+ serviceName: "realtime-v1",
194
+ serviceUrl: "http://realtime:4000",
195
+ paths: ["/realtime/v1/"],
196
+ stripPath: true,
197
+ protocols: ["http", "https"],
198
+ },
199
+ {
200
+ name: "functions-v1",
201
+ serviceName: "functions-v1",
202
+ serviceUrl: opts.functionsServiceUrl?.trim() || "http://server:9999",
203
+ paths: ["/functions/v1/"],
204
+ stripPath: false,
205
+ },
206
+ {
207
+ name: "graphql-v1",
208
+ serviceName: "postgrest-graphql",
209
+ serviceUrl: "http://postgrest:3000/rpc/graphql",
210
+ paths: ["/graphql/v1"],
211
+ stripPath: true,
212
+ graphqlPostgrest: true,
213
+ },
214
+ {
215
+ name: "studio-auth",
216
+ serviceName: "auth-v1",
217
+ serviceUrl: "http://server:9999",
218
+ paths: ["/studio/auth/"],
219
+ stripPath: false,
220
+ },
221
+ {
222
+ name: "studio-proxy",
223
+ serviceName: "auth-v1",
224
+ serviceUrl: "http://server:9999",
225
+ paths: ["/studio/proxy/"],
226
+ stripPath: false,
227
+ },
228
+ {
229
+ name: "studio-exact",
230
+ serviceName: "studio-exact",
231
+ serviceUrl: studioUrl,
232
+ paths: ["~/studio$"],
233
+ stripPath: stripStudio,
234
+ },
235
+ {
236
+ name: "studio",
237
+ serviceName: "studio",
238
+ serviceUrl: studioUrl,
239
+ paths: ["/studio/"],
240
+ stripPath: stripStudio,
241
+ },
242
+ {
243
+ name: "studio-config-route",
244
+ serviceName: "engine-studio-config",
245
+ serviceUrl: "http://engine:7500",
246
+ paths: ["/studio-config"],
247
+ engineProtected: true,
248
+ },
249
+ {
250
+ name: "sql-route",
251
+ serviceName: "engine-sql",
252
+ serviceUrl: "http://engine:7500",
253
+ paths: ["/sql"],
254
+ engineProtected: true,
255
+ },
256
+ ]
257
+
258
+ const staticServiceUrl = opts.staticAppServiceUrl?.trim()
259
+ if (staticServiceUrl && staticServiceUrl.length > 0) {
260
+ routes.push({
261
+ name: "app-root",
262
+ serviceName: "app-root",
263
+ serviceUrl: staticServiceUrl,
264
+ paths: ["/"],
265
+ stripPath: false,
266
+ })
267
+ return routes
268
+ }
269
+
270
+ if (opts.appUpstream && opts.appUpstream.trim().length > 0) {
271
+ routes.push({
272
+ name: "app-root",
273
+ serviceName: "app-root",
274
+ serviceUrl: opts.appUpstream.trim(),
275
+ paths: ["/"],
276
+ stripPath: false,
277
+ })
278
+ }
279
+
280
+ return routes
281
+ }
282
+
283
+ /**
284
+ * Shared route contract used by local/self-host renderers.
285
+ */
286
+ export function runtimeRouteSpec(opts: RuntimeRouteOptions = {}): RuntimeRoute[] {
287
+ if (opts.unifiedGateway) {
288
+ return runtimeRouteSpecUnified(opts)
289
+ }
290
+ return runtimeRouteSpecSplit(opts)
291
+ }
@@ -0,0 +1,324 @@
1
+ /**
2
+ * AST v2 wire format — canonical types and emitters.
3
+ * Parsers build {@link ParsedField}; only `emitField` / `emitModel` / `emitSchema` produce JSON.
4
+ */
5
+
6
+ export const AST_VERSION = 2 as const
7
+
8
+ export type DefaultAst =
9
+ | { kind: "value"; value: string | number | boolean | null }
10
+ | { kind: "now" }
11
+ | { kind: "genRandomUuid" }
12
+ | { kind: "expression"; expr: string }
13
+
14
+ export interface DbFieldAnnotations {
15
+ pgType?: string
16
+ unique?: boolean
17
+ index?: boolean
18
+ foreignKey?: string
19
+ serverGenerated?: boolean
20
+ elementType?: string
21
+ }
22
+
23
+ export interface PlatformFieldAnnotations {
24
+ editor?: string
25
+ readOnly?: boolean
26
+ }
27
+
28
+ export interface FieldAnnotations {
29
+ db?: DbFieldAnnotations
30
+ platform?: PlatformFieldAnnotations
31
+ }
32
+
33
+ /** Kernel facts only — never db/platform keys at this layer. */
34
+ export interface KernelFieldFacts {
35
+ required?: boolean
36
+ primaryKey?: boolean
37
+ default?: DefaultAst
38
+ localized?: boolean
39
+ cardinality?: string
40
+ target?: string
41
+ values?: string[]
42
+ from?: string
43
+ sources?: string[]
44
+ template?: string
45
+ bucket?: string
46
+ accessMode?: string
47
+ geoType?: string
48
+ srid?: number
49
+ dimensions?: number
50
+ blocks?: BlockDefinitionAst[]
51
+ check?: string
52
+ precision?: number
53
+ scale?: number
54
+ references?: string
55
+ through?: string
56
+ onDelete?: string
57
+ onUpdate?: string
58
+ uniqueFk?: boolean
59
+ plugin?: string
60
+ fieldType?: string
61
+ tsType?: string
62
+ index?: boolean
63
+ }
64
+
65
+ /** Internal parse result — not serialized. */
66
+ export interface ParsedField {
67
+ kind: string
68
+ kernel: KernelFieldFacts
69
+ db: DbFieldAnnotations
70
+ platform: PlatformFieldAnnotations
71
+ }
72
+
73
+ export type FieldAstV2 = {
74
+ kind: string
75
+ annotations?: FieldAnnotations
76
+ } & Record<string, unknown>
77
+
78
+ export interface BlockDefinitionAst {
79
+ name: string
80
+ label?: string
81
+ icon?: string
82
+ fields: Record<string, FieldAstV2>
83
+ }
84
+
85
+ export interface ModelAstV2 {
86
+ name: string
87
+ fields: Record<string, FieldAstV2>
88
+ options: Record<string, unknown>
89
+ annotations: {
90
+ db: { tableName: string; indexes: unknown[] }
91
+ platform: { access: Record<string, unknown> }
92
+ }
93
+ }
94
+
95
+ export interface ExtractedStorageBucketAst {
96
+ id: string
97
+ public: boolean
98
+ accessMode?: "public" | "private" | "custom"
99
+ allowedMimeTypes?: string[]
100
+ fileSizeLimit?: number
101
+ access?: Record<string, unknown>
102
+ s3BucketPolicy?: string
103
+ }
104
+
105
+ export interface ExtractedSchemaAstV2 {
106
+ astVersion: typeof AST_VERSION
107
+ models: ModelAstV2[]
108
+ storageBuckets?: ExtractedStorageBucketAst[]
109
+ locales?: string[]
110
+ defaultLocale?: string
111
+ }
112
+
113
+ const DEFAULT_DB_BY_KIND: Record<string, Partial<DbFieldAnnotations>> = {
114
+ text: { pgType: "TEXT" },
115
+ richText: { pgType: "JSONB" },
116
+ integer: { pgType: "INTEGER" },
117
+ smallInt: { pgType: "SMALLINT" },
118
+ bigInt: { pgType: "BIGINT" },
119
+ float: { pgType: "DOUBLE PRECISION" },
120
+ boolean: { pgType: "BOOLEAN" },
121
+ datetime: { pgType: "TIMESTAMPTZ" },
122
+ date: { pgType: "DATE" },
123
+ timestamp: { pgType: "TIMESTAMP WITH TIME ZONE" },
124
+ uuid: { pgType: "UUID" },
125
+ email: { pgType: "TEXT" },
126
+ url: { pgType: "TEXT" },
127
+ slug: { pgType: "TEXT" },
128
+ enum: { pgType: "TEXT" },
129
+ json: { pgType: "JSONB" },
130
+ decimal: { pgType: "TEXT" },
131
+ bytes: { pgType: "BYTEA" },
132
+ serial: { pgType: "SERIAL" },
133
+ bigSerial: { pgType: "BIGSERIAL" },
134
+ money: { pgType: "TEXT" },
135
+ ip: { pgType: "TEXT" },
136
+ cidr: { pgType: "TEXT" },
137
+ macaddr: { pgType: "TEXT" },
138
+ xml: { pgType: "TEXT" },
139
+ tsQuery: { pgType: "TEXT" },
140
+ tsVector: { pgType: "TEXT" },
141
+ color: { pgType: "TEXT" },
142
+ array: { pgType: "ARRAY" },
143
+ image: { pgType: "JSONB" },
144
+ file: { pgType: "JSONB" },
145
+ geo: { pgType: "GEOGRAPHY" },
146
+ vector: { pgType: "VECTOR" },
147
+ blocks: { pgType: "JSONB" },
148
+ }
149
+
150
+ const DEFAULT_PLATFORM_BY_KIND: Record<string, Partial<PlatformFieldAnnotations>> = {
151
+ richText: { editor: "rich" },
152
+ }
153
+
154
+ const COMPOSITE_KINDS = new Set(["timestamps", "publishable", "softDelete"])
155
+
156
+ function hasKeys(obj: Record<string, unknown>): boolean {
157
+ return Object.keys(obj).length > 0
158
+ }
159
+
160
+ function stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {
161
+ const out: Record<string, unknown> = {}
162
+ for (const [k, v] of Object.entries(obj)) {
163
+ if (v !== undefined) out[k] = v
164
+ }
165
+ return out as Partial<T>
166
+ }
167
+
168
+ /** Start a parsed field with kind defaults for db/platform namespaces. */
169
+ export function defaultPgTypeForKind(kind: string): string {
170
+ return DEFAULT_DB_BY_KIND[kind]?.pgType ?? "TEXT"
171
+ }
172
+
173
+ /** Flat wire shape for fields nested inside `blocks` definitions (engine FieldAst serde). */
174
+ export function emitBlockNestedField(field: FieldAstV2): FieldAstV2 {
175
+ const annotations = (field.annotations ?? {}) as FieldAnnotations
176
+ const db = annotations.db ?? {}
177
+ const platform = annotations.platform ?? {}
178
+
179
+ const wire: FieldAstV2 = {
180
+ kind: field.kind,
181
+ pgType: db.pgType ?? defaultPgTypeForKind(String(field.kind)),
182
+ required: field.required ?? false,
183
+ unique: db.unique ?? false,
184
+ localized: field.localized ?? false,
185
+ }
186
+
187
+ if (platform.readOnly) wire.readOnly = true
188
+ if (field.primaryKey) wire.primaryKey = true
189
+ if (field.default !== undefined) wire.default = field.default
190
+ if (field.from !== undefined) wire.from = field.from
191
+ if (field.values !== undefined) wire.values = field.values
192
+ if (field.bucket !== undefined) wire.bucket = field.bucket
193
+ if (field.accessMode !== undefined) wire.accessMode = field.accessMode
194
+ if (field.geoType !== undefined) wire.geoType = field.geoType
195
+ if (field.srid !== undefined) wire.srid = field.srid
196
+ if (field.dimensions !== undefined) wire.dimensions = field.dimensions
197
+ if (field.check !== undefined) wire.check = field.check
198
+ if (field.precision !== undefined) wire.precision = field.precision
199
+ if (field.scale !== undefined) wire.scale = field.scale
200
+ if (field.sources !== undefined) wire.sources = field.sources
201
+ if (field.template !== undefined) wire.template = field.template
202
+ if (field.plugin !== undefined) wire.plugin = field.plugin
203
+ if (field.fieldType !== undefined) wire.fieldType = field.fieldType
204
+ if (field.tsType !== undefined) wire.tsType = field.tsType
205
+
206
+ return wire
207
+ }
208
+
209
+ export function scalar(
210
+ kind: string,
211
+ extra?: {
212
+ kernel?: Partial<KernelFieldFacts>
213
+ db?: Partial<DbFieldAnnotations>
214
+ platform?: Partial<PlatformFieldAnnotations>
215
+ },
216
+ ): ParsedField {
217
+ return {
218
+ kind,
219
+ kernel: { ...(extra?.kernel ?? {}) },
220
+ db: { ...DEFAULT_DB_BY_KIND[kind], ...stripUndefined(extra?.db ?? {}) },
221
+ platform: { ...DEFAULT_PLATFORM_BY_KIND[kind], ...stripUndefined(extra?.platform ?? {}) },
222
+ }
223
+ }
224
+
225
+ export function emitField(parsed: ParsedField): FieldAstV2 {
226
+ if (COMPOSITE_KINDS.has(parsed.kind)) {
227
+ return { kind: parsed.kind }
228
+ }
229
+
230
+ const db = stripUndefined({
231
+ ...DEFAULT_DB_BY_KIND[parsed.kind],
232
+ ...parsed.db,
233
+ }) as DbFieldAnnotations
234
+
235
+ const platform = stripUndefined({
236
+ ...DEFAULT_PLATFORM_BY_KIND[parsed.kind],
237
+ ...parsed.platform,
238
+ }) as PlatformFieldAnnotations
239
+
240
+ const wire: FieldAstV2 = { kind: parsed.kind }
241
+
242
+ const kernel = parsed.kernel
243
+ if (kernel.required !== undefined) wire.required = kernel.required
244
+ if (kernel.primaryKey) wire.primaryKey = true
245
+ if (kernel.default !== undefined) wire.default = kernel.default
246
+ if (kernel.localized) wire.localized = true
247
+ if (kernel.cardinality !== undefined) wire.cardinality = kernel.cardinality
248
+ if (kernel.target !== undefined) wire.target = kernel.target
249
+ if (kernel.values !== undefined) wire.values = kernel.values
250
+ if (kernel.from !== undefined) wire.from = kernel.from
251
+ if (kernel.sources !== undefined && kernel.sources.length > 0) wire.sources = kernel.sources
252
+ if (kernel.template !== undefined) wire.template = kernel.template
253
+ if (kernel.bucket !== undefined) wire.bucket = kernel.bucket
254
+ if (kernel.accessMode !== undefined) wire.accessMode = kernel.accessMode
255
+ if (kernel.geoType !== undefined) wire.geoType = kernel.geoType
256
+ if (kernel.srid !== undefined) wire.srid = kernel.srid
257
+ if (kernel.dimensions !== undefined) wire.dimensions = kernel.dimensions
258
+ if (kernel.blocks !== undefined) {
259
+ wire.blocks = kernel.blocks.map((blockDef) => ({
260
+ ...blockDef,
261
+ fields: Object.fromEntries(
262
+ Object.entries(blockDef.fields).map(([name, nested]) => [
263
+ name,
264
+ emitBlockNestedField(nested),
265
+ ]),
266
+ ),
267
+ }))
268
+ }
269
+ if (kernel.check !== undefined) wire.check = kernel.check
270
+ if (kernel.precision !== undefined) wire.precision = kernel.precision
271
+ if (kernel.scale !== undefined) wire.scale = kernel.scale
272
+ if (kernel.references !== undefined) wire.references = kernel.references
273
+ if (kernel.through !== undefined) wire.through = kernel.through
274
+ if (kernel.onDelete !== undefined) wire.onDelete = kernel.onDelete
275
+ if (kernel.onUpdate !== undefined) wire.onUpdate = kernel.onUpdate
276
+ if (kernel.uniqueFk) wire.uniqueFk = true
277
+ if (kernel.plugin !== undefined) wire.plugin = kernel.plugin
278
+ if (kernel.fieldType !== undefined) wire.fieldType = kernel.fieldType
279
+ if (kernel.tsType !== undefined) wire.tsType = kernel.tsType
280
+ if (parsed.kind === "blocks" && kernel.index !== undefined) wire.index = kernel.index
281
+
282
+ const annotations: FieldAnnotations = {}
283
+ if (hasKeys(db as Record<string, unknown>)) annotations.db = db
284
+ if (hasKeys(platform as Record<string, unknown>)) annotations.platform = platform
285
+ if (hasKeys(annotations as Record<string, unknown>)) wire.annotations = annotations
286
+
287
+ return wire
288
+ }
289
+
290
+ export function emitModel(
291
+ name: string,
292
+ fields: Record<string, FieldAstV2>,
293
+ options: Record<string, unknown>,
294
+ tableName: string,
295
+ access: Record<string, unknown>,
296
+ ): ModelAstV2 {
297
+ return {
298
+ name,
299
+ fields,
300
+ options,
301
+ annotations: {
302
+ db: { tableName, indexes: [] },
303
+ platform: { access },
304
+ },
305
+ }
306
+ }
307
+
308
+ export function emitSchema(
309
+ models: ModelAstV2[],
310
+ extras?: {
311
+ storageBuckets?: ExtractedSchemaAstV2["storageBuckets"]
312
+ locales?: string[]
313
+ defaultLocale?: string
314
+ },
315
+ ): ExtractedSchemaAstV2 {
316
+ return {
317
+ astVersion: AST_VERSION,
318
+ models,
319
+ ...(extras?.storageBuckets !== undefined &&
320
+ extras.storageBuckets.length > 0 && { storageBuckets: extras.storageBuckets }),
321
+ ...(extras?.locales !== undefined && extras.locales.length > 0 && { locales: extras.locales }),
322
+ ...(extras?.defaultLocale !== undefined && { defaultLocale: extras.defaultLocale }),
323
+ }
324
+ }