@geekmidas/cli 9.0.2 → 10.0.0-alpha.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 (390) hide show
  1. package/README.md +71 -120
  2. package/dist/{CachedStateProvider-BdX7klRc.cjs → CachedStateProvider-BLo7zv7S.cjs} +1 -1
  3. package/dist/CachedStateProvider-BxoAm-B2.mjs +3 -0
  4. package/dist/{CachedStateProvider-klLWZXWF.cjs → CachedStateProvider-CqPdW7CB.cjs} +1 -1
  5. package/dist/{CachedStateProvider-klLWZXWF.cjs.map → CachedStateProvider-CqPdW7CB.cjs.map} +1 -1
  6. package/dist/{CachedStateProvider-CzyFct42.mjs → CachedStateProvider-DTniehMP.mjs} +1 -1
  7. package/dist/{CachedStateProvider-CzyFct42.mjs.map → CachedStateProvider-DTniehMP.mjs.map} +1 -1
  8. package/dist/{HostingerProvider-B2ZYz7Yc.mjs → HostingerProvider-Cft7lEYr.mjs} +4 -3
  9. package/dist/HostingerProvider-Cft7lEYr.mjs.map +1 -0
  10. package/dist/{HostingerProvider-CrHfsgz9.cjs → HostingerProvider-h3EbEp-Z.cjs} +4 -3
  11. package/dist/HostingerProvider-h3EbEp-Z.cjs.map +1 -0
  12. package/dist/{LocalStateProvider-CP49rjzt.mjs → LocalStateProvider-Bn6tS-oL.mjs} +1 -1
  13. package/dist/{LocalStateProvider-CP49rjzt.mjs.map → LocalStateProvider-Bn6tS-oL.mjs.map} +1 -1
  14. package/dist/{LocalStateProvider-CalzNfNA.cjs → LocalStateProvider-Db9SEjyH.cjs} +1 -1
  15. package/dist/{LocalStateProvider-CalzNfNA.cjs.map → LocalStateProvider-Db9SEjyH.cjs.map} +1 -1
  16. package/dist/{Route53Provider-tlgBzrRQ.mjs → Route53Provider-RdpUDJQk.mjs} +1 -1
  17. package/dist/{Route53Provider-tlgBzrRQ.mjs.map → Route53Provider-RdpUDJQk.mjs.map} +1 -1
  18. package/dist/{Route53Provider-DwgXiLxt.cjs → Route53Provider-di2fMM5N.cjs} +1 -1
  19. package/dist/{Route53Provider-DwgXiLxt.cjs.map → Route53Provider-di2fMM5N.cjs.map} +1 -1
  20. package/dist/{SSMStateProvider-BlrTiV5m.mjs → SSMStateProvider-BRt2py-A.mjs} +1 -1
  21. package/dist/{SSMStateProvider-BlrTiV5m.mjs.map → SSMStateProvider-BRt2py-A.mjs.map} +1 -1
  22. package/dist/{SSMStateProvider-Bt6r8CTL.cjs → SSMStateProvider-DyX8s9HI.cjs} +1 -1
  23. package/dist/{SSMStateProvider-Bt6r8CTL.cjs.map → SSMStateProvider-DyX8s9HI.cjs.map} +1 -1
  24. package/dist/{backup-provisioner-Xunq-p_8.mjs → backup-provisioner-Bgj5Vi_L.mjs} +2 -2
  25. package/dist/{backup-provisioner-Xunq-p_8.mjs.map → backup-provisioner-Bgj5Vi_L.mjs.map} +1 -1
  26. package/dist/{backup-provisioner-B3HBN-2k.cjs → backup-provisioner-BrsHwYG0.cjs} +2 -2
  27. package/dist/{backup-provisioner-B3HBN-2k.cjs.map → backup-provisioner-BrsHwYG0.cjs.map} +1 -1
  28. package/dist/{bundler-Dufq3uvI.cjs → bundler-BY1OmV1e.cjs} +44 -14
  29. package/dist/bundler-BY1OmV1e.cjs.map +1 -0
  30. package/dist/{bundler-DkA4qzUD.mjs → bundler-Be8Zg4Wd.mjs} +45 -15
  31. package/dist/bundler-Be8Zg4Wd.mjs.map +1 -0
  32. package/dist/config-D8o6I_7Z.mjs +469 -0
  33. package/dist/config-D8o6I_7Z.mjs.map +1 -0
  34. package/dist/config-DbPE1KXF.cjs +535 -0
  35. package/dist/config-DbPE1KXF.cjs.map +1 -0
  36. package/dist/config.cjs +3 -2
  37. package/dist/config.d.cts +2 -2
  38. package/dist/config.d.cts.map +1 -1
  39. package/dist/config.d.mts +2 -2
  40. package/dist/config.d.mts.map +1 -1
  41. package/dist/config.mjs +3 -2
  42. package/dist/{credentials-s1kLcIzK.mjs → credentials-B5zRHdAl.mjs} +21 -6
  43. package/dist/credentials-B5zRHdAl.mjs.map +1 -0
  44. package/dist/{credentials-C8DWtnMY.cjs → credentials-BapzjyV5.cjs} +26 -5
  45. package/dist/credentials-BapzjyV5.cjs.map +1 -0
  46. package/dist/credentials-Dh0Q6HzY.mjs +2548 -0
  47. package/dist/credentials-Dh0Q6HzY.mjs.map +1 -0
  48. package/dist/credentials-K961ThG3.cjs +2680 -0
  49. package/dist/credentials-K961ThG3.cjs.map +1 -0
  50. package/dist/deploy/sniffer-routes-worker.cjs +6 -2
  51. package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
  52. package/dist/deploy/sniffer-routes-worker.mjs +6 -2
  53. package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
  54. package/dist/discover-CAlFgYec.mjs +229 -0
  55. package/dist/discover-CAlFgYec.mjs.map +1 -0
  56. package/dist/discover-DTmFeloL.cjs +271 -0
  57. package/dist/discover-DTmFeloL.cjs.map +1 -0
  58. package/dist/dokploy-api-BS2xnJLZ.mjs +3 -0
  59. package/dist/{dokploy-api-CqOIKHme.cjs → dokploy-api-BsVH0y_s.cjs} +141 -32
  60. package/dist/dokploy-api-BsVH0y_s.cjs.map +1 -0
  61. package/dist/dokploy-api-BuxDRo3l.cjs +3 -0
  62. package/dist/{dokploy-api-sfZFlWuE.mjs → dokploy-api-aTFPz7_4.mjs} +141 -32
  63. package/dist/dokploy-api-aTFPz7_4.mjs.map +1 -0
  64. package/dist/emit-CbcRolsa.cjs +236 -0
  65. package/dist/emit-CbcRolsa.cjs.map +1 -0
  66. package/dist/emit-CiZS_5Ub.mjs +206 -0
  67. package/dist/emit-CiZS_5Ub.mjs.map +1 -0
  68. package/dist/{encryption-MfXAiFTm.cjs → encryption-C6jaU0hE.cjs} +1 -1
  69. package/dist/{encryption-MfXAiFTm.cjs.map → encryption-C6jaU0hE.cjs.map} +1 -1
  70. package/dist/{encryption-BVS7Vmzs.cjs → encryption-CHzzeR8a.cjs} +1 -1
  71. package/dist/encryption-CQUncu7v.mjs +3 -0
  72. package/dist/{encryption-CO5Q4Bhf.mjs → encryption-D-abyhZx.mjs} +1 -1
  73. package/dist/{encryption-CO5Q4Bhf.mjs.map → encryption-D-abyhZx.mjs.map} +1 -1
  74. package/dist/fullstack-secrets-C-GGohke.cjs +111 -0
  75. package/dist/fullstack-secrets-C-GGohke.cjs.map +1 -0
  76. package/dist/fullstack-secrets-D1o9-G5l.mjs +87 -0
  77. package/dist/fullstack-secrets-D1o9-G5l.mjs.map +1 -0
  78. package/dist/{fullstack-secrets-BYzi6Hwl.cjs → generator-CNzBw7g5.cjs} +1 -114
  79. package/dist/generator-CNzBw7g5.cjs.map +1 -0
  80. package/dist/{fullstack-secrets-l8s3II_H.mjs → generator-VE2JrFlY.mjs} +2 -85
  81. package/dist/generator-VE2JrFlY.mjs.map +1 -0
  82. package/dist/index-BThUzEIp.d.mts +175 -0
  83. package/dist/index-BThUzEIp.d.mts.map +1 -0
  84. package/dist/index-CHB4tSzX.d.cts +175 -0
  85. package/dist/index-CHB4tSzX.d.cts.map +1 -0
  86. package/dist/index.cjs +2329 -1584
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.mjs +2306 -1561
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/{openapi-Cfwi0fqF.mjs → openapi-CgpMWMmM.mjs} +174 -95
  91. package/dist/openapi-CgpMWMmM.mjs.map +1 -0
  92. package/dist/{openapi-BzNOC7_i.cjs → openapi-CljONd_M.cjs} +175 -108
  93. package/dist/openapi-CljONd_M.cjs.map +1 -0
  94. package/dist/{openapi-react-query-C4iIvpPf.mjs → openapi-react-query-Byltvm_7.mjs} +2 -2
  95. package/dist/openapi-react-query-Byltvm_7.mjs.map +1 -0
  96. package/dist/{openapi-react-query-CYWik72n.cjs → openapi-react-query-CmJ1xDbn.cjs} +2 -2
  97. package/dist/openapi-react-query-CmJ1xDbn.cjs.map +1 -0
  98. package/dist/openapi-react-query.cjs +1 -1
  99. package/dist/openapi-react-query.mjs +1 -1
  100. package/dist/openapi.cjs +4 -3
  101. package/dist/openapi.d.cts +1 -1
  102. package/dist/openapi.d.mts +1 -1
  103. package/dist/openapi.mjs +4 -3
  104. package/dist/reconcile/public.cjs +9 -0
  105. package/dist/reconcile/public.d.cts +125 -0
  106. package/dist/reconcile/public.d.cts.map +1 -0
  107. package/dist/reconcile/public.d.mts +125 -0
  108. package/dist/reconcile/public.d.mts.map +1 -0
  109. package/dist/reconcile/public.mjs +4 -0
  110. package/dist/{reconcile-B2FoJE0a.mjs → reconcile-CFs8C_1a.mjs} +5 -4
  111. package/dist/reconcile-CFs8C_1a.mjs.map +1 -0
  112. package/dist/{reconcile-BzqKJ2Rt.cjs → reconcile-D0pimNiy.cjs} +5 -4
  113. package/dist/reconcile-D0pimNiy.cjs.map +1 -0
  114. package/dist/setup-CJiQM2pX.cjs +473 -0
  115. package/dist/setup-CJiQM2pX.cjs.map +1 -0
  116. package/dist/setup-DMtU3p41.cjs +11 -0
  117. package/dist/setup-DOsYueeQ.mjs +443 -0
  118. package/dist/setup-DOsYueeQ.mjs.map +1 -0
  119. package/dist/setup-DSutDAlt.mjs +11 -0
  120. package/dist/{storage-B1wvztiJ.cjs → storage-BJmzYxt8.cjs} +1 -1
  121. package/dist/{storage-B1wvztiJ.cjs.map → storage-BJmzYxt8.cjs.map} +1 -1
  122. package/dist/{storage-DOEtT2Hr.cjs → storage-BM9hGpgv.cjs} +1 -1
  123. package/dist/{storage-dbb9RyBl.mjs → storage-Bi24WfoW.mjs} +1 -1
  124. package/dist/{storage-dbb9RyBl.mjs.map → storage-Bi24WfoW.mjs.map} +1 -1
  125. package/dist/{storage-Cs4WBsc4.mjs → storage-CYlGwWTj.mjs} +1 -1
  126. package/dist/{sync-CSooqRQ8.mjs → sync-CmEuNZsB.mjs} +2 -2
  127. package/dist/{sync-CSooqRQ8.mjs.map → sync-CmEuNZsB.mjs.map} +1 -1
  128. package/dist/sync-D306yOWu.cjs +4 -0
  129. package/dist/{sync-o_CtEbvR.cjs → sync-SizaChmC.cjs} +2 -2
  130. package/dist/{sync-o_CtEbvR.cjs.map → sync-SizaChmC.cjs.map} +1 -1
  131. package/dist/{sync-B5UHXwRM.mjs → sync-hOqAWHR6.mjs} +1 -1
  132. package/dist/{index-Bw548Bta.d.mts → types-C-arnQ1r.d.mts} +590 -143
  133. package/dist/types-C-arnQ1r.d.mts.map +1 -0
  134. package/dist/{index-DTpkeFb8.d.cts → types-abJQuk7m.d.cts} +590 -143
  135. package/dist/types-abJQuk7m.d.cts.map +1 -0
  136. package/dist/workspace/index.cjs +5 -1
  137. package/dist/workspace/index.d.cts +3 -3
  138. package/dist/workspace/index.d.mts +3 -3
  139. package/dist/workspace/index.mjs +2 -2
  140. package/dist/{workspace-D-37Ylqo.mjs → workspace-7FqprxuJ.mjs} +117 -30
  141. package/dist/workspace-7FqprxuJ.mjs.map +1 -0
  142. package/dist/workspace-8acupeaI.cjs +9 -0
  143. package/dist/{workspace-CQTT7HJQ.cjs → workspace-XvqO9jIv.cjs} +139 -28
  144. package/dist/workspace-XvqO9jIv.cjs.map +1 -0
  145. package/dist/workspace-yP5AHnrn.mjs +8 -0
  146. package/package.json +26 -9
  147. package/CHANGELOG.md +0 -650
  148. package/FUNCTION_CRON_SUPPORT.md +0 -266
  149. package/dist/CachedStateProvider-GcGziXh1.mjs +0 -3
  150. package/dist/HostingerProvider-B2ZYz7Yc.mjs.map +0 -1
  151. package/dist/HostingerProvider-CrHfsgz9.cjs.map +0 -1
  152. package/dist/bundler-DkA4qzUD.mjs.map +0 -1
  153. package/dist/bundler-Dufq3uvI.cjs.map +0 -1
  154. package/dist/config-Bbu1JKvf.mjs +0 -211
  155. package/dist/config-Bbu1JKvf.mjs.map +0 -1
  156. package/dist/config-DujV8DbR.cjs +0 -253
  157. package/dist/config-DujV8DbR.cjs.map +0 -1
  158. package/dist/credentials-C8DWtnMY.cjs.map +0 -1
  159. package/dist/credentials-s1kLcIzK.mjs.map +0 -1
  160. package/dist/dokploy-api-BPYkG-ZZ.cjs +0 -3
  161. package/dist/dokploy-api-BiSzWM4v.mjs +0 -3
  162. package/dist/dokploy-api-CqOIKHme.cjs.map +0 -1
  163. package/dist/dokploy-api-sfZFlWuE.mjs.map +0 -1
  164. package/dist/encryption-Bd_m4q3g.mjs +0 -3
  165. package/dist/fullstack-secrets-BYzi6Hwl.cjs.map +0 -1
  166. package/dist/fullstack-secrets-l8s3II_H.mjs.map +0 -1
  167. package/dist/index-Bw548Bta.d.mts.map +0 -1
  168. package/dist/index-DTpkeFb8.d.cts.map +0 -1
  169. package/dist/openapi-BzNOC7_i.cjs.map +0 -1
  170. package/dist/openapi-Cfwi0fqF.mjs.map +0 -1
  171. package/dist/openapi-react-query-C4iIvpPf.mjs.map +0 -1
  172. package/dist/openapi-react-query-CYWik72n.cjs.map +0 -1
  173. package/dist/reconcile-B2FoJE0a.mjs.map +0 -1
  174. package/dist/reconcile-BzqKJ2Rt.cjs.map +0 -1
  175. package/dist/setup-DDXUXzzl.mjs +0 -765
  176. package/dist/setup-DDXUXzzl.mjs.map +0 -1
  177. package/dist/setup-DLwhfyt-.cjs +0 -8
  178. package/dist/setup-Dh-B7YTX.mjs +0 -8
  179. package/dist/setup-WZ-xqAQO.cjs +0 -849
  180. package/dist/setup-WZ-xqAQO.cjs.map +0 -1
  181. package/dist/sync-BLA94rgC.cjs +0 -4
  182. package/dist/types-B3GQUg3k.d.mts +0 -280
  183. package/dist/types-B3GQUg3k.d.mts.map +0 -1
  184. package/dist/types-BWQDiooe.d.cts +0 -280
  185. package/dist/types-BWQDiooe.d.cts.map +0 -1
  186. package/dist/workspace-CQTT7HJQ.cjs.map +0 -1
  187. package/dist/workspace-D-37Ylqo.mjs.map +0 -1
  188. package/docs/OPENAPI_TYPESCRIPT_DESIGN.md +0 -408
  189. package/docs/dev-server-resilience-design.md +0 -189
  190. package/docs/manifest-refactor-design.md +0 -287
  191. package/examples/cron-example.ts +0 -45
  192. package/examples/env.ts +0 -33
  193. package/examples/function-example.ts +0 -40
  194. package/examples/gkm.config.json +0 -22
  195. package/examples/gkm.config.ts +0 -14
  196. package/examples/gkm.minimal.config.json +0 -7
  197. package/examples/gkm.production.config.json +0 -27
  198. package/examples/logger.ts +0 -10
  199. package/scripts/sync-versions.ts +0 -108
  200. package/src/__tests__/EndpointGenerator.hooks.spec.ts +0 -204
  201. package/src/__tests__/config.spec.ts +0 -422
  202. package/src/__tests__/loadEnvFiles.spec.ts +0 -131
  203. package/src/__tests__/normalizeHooksConfig.spec.ts +0 -63
  204. package/src/__tests__/openapi-react-query.spec.ts +0 -506
  205. package/src/__tests__/openapi.spec.ts +0 -625
  206. package/src/__tests__/test-helpers.ts +0 -181
  207. package/src/auth/__tests__/credentials.spec.ts +0 -331
  208. package/src/auth/__tests__/index.spec.ts +0 -237
  209. package/src/auth/credentials.ts +0 -286
  210. package/src/auth/index.ts +0 -233
  211. package/src/build/__tests__/bundler.spec.ts +0 -446
  212. package/src/build/__tests__/endpoint-analyzer.spec.ts +0 -623
  213. package/src/build/__tests__/handler-templates.spec.ts +0 -1287
  214. package/src/build/__tests__/index-new.spec.ts +0 -550
  215. package/src/build/__tests__/manifests.spec.ts +0 -583
  216. package/src/build/__tests__/partitions.spec.ts +0 -110
  217. package/src/build/__tests__/workspace-build.spec.ts +0 -215
  218. package/src/build/bundler.ts +0 -256
  219. package/src/build/endpoint-analyzer.ts +0 -236
  220. package/src/build/handler-templates.ts +0 -1253
  221. package/src/build/index.ts +0 -616
  222. package/src/build/manifests.ts +0 -285
  223. package/src/build/partitions.ts +0 -58
  224. package/src/build/providerResolver.ts +0 -184
  225. package/src/build/types.ts +0 -104
  226. package/src/config.ts +0 -330
  227. package/src/credentials/__tests__/fullDockerPorts.spec.ts +0 -144
  228. package/src/credentials/__tests__/helpers.ts +0 -112
  229. package/src/credentials/__tests__/prepareEntryCredentials.spec.ts +0 -125
  230. package/src/credentials/__tests__/readonlyDockerPorts.spec.ts +0 -190
  231. package/src/credentials/__tests__/workspaceCredentials.spec.ts +0 -209
  232. package/src/credentials/index.ts +0 -843
  233. package/src/debug.ts +0 -68
  234. package/src/deploy/CachedStateProvider.ts +0 -86
  235. package/src/deploy/LocalStateProvider.ts +0 -57
  236. package/src/deploy/SSMStateProvider.ts +0 -117
  237. package/src/deploy/StateProvider.ts +0 -175
  238. package/src/deploy/__tests__/CachedStateProvider.spec.ts +0 -235
  239. package/src/deploy/__tests__/HostingerProvider.spec.ts +0 -347
  240. package/src/deploy/__tests__/LocalStateProvider.spec.ts +0 -130
  241. package/src/deploy/__tests__/Route53Provider.spec.ts +0 -425
  242. package/src/deploy/__tests__/SSMStateProvider.spec.ts +0 -201
  243. package/src/deploy/__tests__/__fixtures__/entry-apps/async-entry.ts +0 -24
  244. package/src/deploy/__tests__/__fixtures__/entry-apps/nested-config-entry.ts +0 -24
  245. package/src/deploy/__tests__/__fixtures__/entry-apps/no-env-entry.ts +0 -12
  246. package/src/deploy/__tests__/__fixtures__/entry-apps/simple-entry.ts +0 -14
  247. package/src/deploy/__tests__/__fixtures__/entry-apps/throwing-entry.ts +0 -16
  248. package/src/deploy/__tests__/__fixtures__/env-parsers/non-function-export.ts +0 -10
  249. package/src/deploy/__tests__/__fixtures__/env-parsers/optional-env-parser.ts +0 -21
  250. package/src/deploy/__tests__/__fixtures__/env-parsers/parseable-env-parser.ts +0 -18
  251. package/src/deploy/__tests__/__fixtures__/env-parsers/throwing-env-parser.ts +0 -16
  252. package/src/deploy/__tests__/__fixtures__/env-parsers/valid-env-parser.ts +0 -16
  253. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/auth.ts +0 -16
  254. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/health.ts +0 -13
  255. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/users.ts +0 -15
  256. package/src/deploy/__tests__/__fixtures__/route-apps/services.ts +0 -55
  257. package/src/deploy/__tests__/backup-provisioner.spec.ts +0 -428
  258. package/src/deploy/__tests__/createDnsProvider.spec.ts +0 -195
  259. package/src/deploy/__tests__/createStateProvider.spec.ts +0 -126
  260. package/src/deploy/__tests__/dns-orchestration.spec.ts +0 -192
  261. package/src/deploy/__tests__/dns-verification.spec.ts +0 -229
  262. package/src/deploy/__tests__/docker.spec.ts +0 -149
  263. package/src/deploy/__tests__/dokploy-api.spec.ts +0 -697
  264. package/src/deploy/__tests__/dokploy.spec.ts +0 -435
  265. package/src/deploy/__tests__/domain.spec.ts +0 -235
  266. package/src/deploy/__tests__/env-resolver.spec.ts +0 -903
  267. package/src/deploy/__tests__/index.spec.ts +0 -1091
  268. package/src/deploy/__tests__/init.spec.ts +0 -793
  269. package/src/deploy/__tests__/secrets.spec.ts +0 -303
  270. package/src/deploy/__tests__/sniffer.spec.ts +0 -838
  271. package/src/deploy/__tests__/state-e2e.spec.ts +0 -387
  272. package/src/deploy/__tests__/state.spec.ts +0 -876
  273. package/src/deploy/__tests__/undeploy.spec.ts +0 -758
  274. package/src/deploy/backup-provisioner.ts +0 -316
  275. package/src/deploy/dns/DnsProvider.ts +0 -201
  276. package/src/deploy/dns/HostingerProvider.ts +0 -174
  277. package/src/deploy/dns/Route53Provider.ts +0 -340
  278. package/src/deploy/dns/hostinger-api.ts +0 -261
  279. package/src/deploy/dns/index.ts +0 -627
  280. package/src/deploy/docker.ts +0 -260
  281. package/src/deploy/dokploy-api.ts +0 -1101
  282. package/src/deploy/dokploy.ts +0 -177
  283. package/src/deploy/domain.ts +0 -134
  284. package/src/deploy/env-resolver.ts +0 -305
  285. package/src/deploy/index.ts +0 -2094
  286. package/src/deploy/init.ts +0 -427
  287. package/src/deploy/secrets.ts +0 -187
  288. package/src/deploy/sniffer-envkit-patch.ts +0 -61
  289. package/src/deploy/sniffer-hooks.ts +0 -57
  290. package/src/deploy/sniffer-loader.ts +0 -28
  291. package/src/deploy/sniffer-routes-worker.ts +0 -104
  292. package/src/deploy/sniffer-worker.ts +0 -75
  293. package/src/deploy/sniffer.ts +0 -578
  294. package/src/deploy/state-commands.ts +0 -274
  295. package/src/deploy/state.ts +0 -482
  296. package/src/deploy/types.ts +0 -102
  297. package/src/deploy/undeploy.ts +0 -407
  298. package/src/dev/__tests__/entry-integration.spec.ts +0 -347
  299. package/src/dev/__tests__/entry.spec.ts +0 -144
  300. package/src/dev/__tests__/index.spec.ts +0 -2084
  301. package/src/dev/index.ts +0 -1649
  302. package/src/docker/__tests__/compose.spec.ts +0 -1142
  303. package/src/docker/__tests__/templates.spec.ts +0 -694
  304. package/src/docker/compose.ts +0 -808
  305. package/src/docker/index.ts +0 -523
  306. package/src/docker/templates.ts +0 -1067
  307. package/src/exec/index.ts +0 -118
  308. package/src/generators/CronGenerator.ts +0 -105
  309. package/src/generators/EndpointGenerator.ts +0 -954
  310. package/src/generators/FunctionGenerator.ts +0 -117
  311. package/src/generators/Generator.ts +0 -147
  312. package/src/generators/OpenApiTsGenerator.ts +0 -821
  313. package/src/generators/QueueGenerator.ts +0 -245
  314. package/src/generators/SubscriberGenerator.ts +0 -282
  315. package/src/generators/TopicGenerator.ts +0 -45
  316. package/src/generators/__tests__/CronGenerator.spec.ts +0 -445
  317. package/src/generators/__tests__/EndpointGenerator.spec.ts +0 -544
  318. package/src/generators/__tests__/FunctionGenerator.spec.ts +0 -256
  319. package/src/generators/__tests__/Generator.bustCache.spec.ts +0 -72
  320. package/src/generators/__tests__/OpenApiTsGenerator.registry.spec.ts +0 -98
  321. package/src/generators/__tests__/OpenApiTsGenerator.responseType.spec.ts +0 -56
  322. package/src/generators/__tests__/QueueGenerator.spec.ts +0 -141
  323. package/src/generators/__tests__/SubscriberGenerator.spec.ts +0 -410
  324. package/src/generators/index.ts +0 -11
  325. package/src/index.ts +0 -972
  326. package/src/init/__tests__/generators.spec.ts +0 -1070
  327. package/src/init/__tests__/init.spec.ts +0 -577
  328. package/src/init/__tests__/utils.spec.ts +0 -104
  329. package/src/init/generators/auth.ts +0 -225
  330. package/src/init/generators/config.ts +0 -316
  331. package/src/init/generators/docker.ts +0 -388
  332. package/src/init/generators/env.ts +0 -62
  333. package/src/init/generators/index.ts +0 -6
  334. package/src/init/generators/mobile-expo.ts +0 -576
  335. package/src/init/generators/models.ts +0 -153
  336. package/src/init/generators/monorepo.ts +0 -475
  337. package/src/init/generators/package.ts +0 -95
  338. package/src/init/generators/source.ts +0 -15
  339. package/src/init/generators/test.ts +0 -178
  340. package/src/init/generators/ui.ts +0 -1473
  341. package/src/init/generators/web-tanstack.ts +0 -348
  342. package/src/init/generators/web.ts +0 -363
  343. package/src/init/index.ts +0 -542
  344. package/src/init/templates/api.ts +0 -404
  345. package/src/init/templates/index.ts +0 -342
  346. package/src/init/templates/minimal.ts +0 -207
  347. package/src/init/templates/serverless.ts +0 -148
  348. package/src/init/templates/worker.ts +0 -216
  349. package/src/init/utils.ts +0 -197
  350. package/src/init/versions.ts +0 -52
  351. package/src/openapi-react-query.ts +0 -288
  352. package/src/openapi.ts +0 -259
  353. package/src/secrets/__tests__/encryption.spec.ts +0 -226
  354. package/src/secrets/__tests__/generator.spec.ts +0 -575
  355. package/src/secrets/__tests__/index.spec.ts +0 -91
  356. package/src/secrets/__tests__/reconcile.spec.ts +0 -123
  357. package/src/secrets/__tests__/storage.spec.ts +0 -645
  358. package/src/secrets/encryption.ts +0 -91
  359. package/src/secrets/generator.ts +0 -329
  360. package/src/secrets/index.ts +0 -417
  361. package/src/secrets/keystore.ts +0 -144
  362. package/src/secrets/reconcile.ts +0 -53
  363. package/src/secrets/storage.ts +0 -337
  364. package/src/secrets/sync.ts +0 -136
  365. package/src/secrets/types.ts +0 -70
  366. package/src/setup/__tests__/auto-setup.spec.ts +0 -147
  367. package/src/setup/__tests__/reconcile-secrets.spec.ts +0 -439
  368. package/src/setup/fullstack-secrets.ts +0 -140
  369. package/src/setup/index.ts +0 -411
  370. package/src/test/__tests__/__fixtures__/workspace.ts +0 -104
  371. package/src/test/__tests__/api.spec.ts +0 -199
  372. package/src/test/__tests__/auth.spec.ts +0 -162
  373. package/src/test/__tests__/index.spec.ts +0 -502
  374. package/src/test/__tests__/web.spec.ts +0 -210
  375. package/src/test/index.ts +0 -198
  376. package/src/types.ts +0 -363
  377. package/src/upgrade/__tests__/index.spec.ts +0 -354
  378. package/src/upgrade/index.ts +0 -253
  379. package/src/workspace/__tests__/client-generator.spec.ts +0 -326
  380. package/src/workspace/__tests__/index.spec.ts +0 -766
  381. package/src/workspace/__tests__/publicEnv.spec.ts +0 -64
  382. package/src/workspace/__tests__/schema.spec.ts +0 -737
  383. package/src/workspace/__tests__/type-inference.spec.ts +0 -251
  384. package/src/workspace/client-generator.ts +0 -109
  385. package/src/workspace/index.ts +0 -433
  386. package/src/workspace/publicEnv.ts +0 -57
  387. package/src/workspace/schema.ts +0 -861
  388. package/src/workspace/types.ts +0 -943
  389. package/tsconfig.json +0 -9
  390. package/tsdown.config.ts +0 -22
@@ -1,177 +0,0 @@
1
- import { getDokployRegistryId, getDokployToken } from '../auth';
2
- import { DokployApi } from './dokploy-api';
3
- import type { DeployResult, DokployDeployConfig } from './types';
4
-
5
- const logger = console;
6
-
7
- export interface DokployDeployOptions {
8
- /** Deployment stage */
9
- stage: string;
10
- /** Image tag */
11
- tag: string;
12
- /** Image reference */
13
- imageRef: string;
14
- /** Master key from build */
15
- masterKey?: string;
16
- /** Dokploy config from gkm.config */
17
- config: DokployDeployConfig;
18
- }
19
-
20
- /**
21
- * Get the Dokploy API token from stored credentials or environment
22
- */
23
- async function getApiToken(): Promise<string> {
24
- const token = await getDokployToken();
25
- if (!token) {
26
- throw new Error(
27
- 'Dokploy credentials not found.\n' +
28
- 'Run "gkm login --service dokploy" to authenticate, or set DOKPLOY_API_TOKEN.',
29
- );
30
- }
31
- return token;
32
- }
33
-
34
- /**
35
- * Create a Dokploy API client
36
- */
37
- async function createApi(endpoint: string): Promise<DokployApi> {
38
- const token = await getApiToken();
39
- return new DokployApi({ baseUrl: endpoint, token });
40
- }
41
-
42
- /**
43
- * Deploy to Dokploy
44
- */
45
- export async function deployDokploy(
46
- options: DokployDeployOptions,
47
- ): Promise<DeployResult> {
48
- const { stage, imageRef, masterKey, config } = options;
49
-
50
- logger.log(`\n🎯 Deploying to Dokploy...`);
51
- logger.log(` Endpoint: ${config.endpoint}`);
52
- logger.log(` Application: ${config.applicationId}`);
53
-
54
- const api = await createApi(config.endpoint);
55
-
56
- // Configure Docker provider with the image
57
- logger.log(` Configuring Docker image: ${imageRef}`);
58
-
59
- // Determine registry credentials
60
- const registryOptions: {
61
- registryId?: string;
62
- username?: string;
63
- password?: string;
64
- registryUrl?: string;
65
- } = {};
66
-
67
- if (config.registryId) {
68
- // Use registry ID from config
69
- registryOptions.registryId = config.registryId;
70
- logger.log(` Using Dokploy registry: ${config.registryId}`);
71
- } else {
72
- // Try stored registry ID from credentials
73
- const storedRegistryId = await getDokployRegistryId();
74
- if (storedRegistryId) {
75
- registryOptions.registryId = storedRegistryId;
76
- logger.log(` Using stored Dokploy registry: ${storedRegistryId}`);
77
- } else if (config.registryCredentials) {
78
- // Use explicit credentials from config
79
- registryOptions.username = config.registryCredentials.username;
80
- registryOptions.password = config.registryCredentials.password;
81
- registryOptions.registryUrl = config.registryCredentials.registryUrl;
82
- logger.log(
83
- ` Using registry credentials for: ${config.registryCredentials.registryUrl}`,
84
- );
85
- } else {
86
- // Try environment variables
87
- const username = process.env.DOCKER_REGISTRY_USERNAME;
88
- const password = process.env.DOCKER_REGISTRY_PASSWORD;
89
- const registryUrl = process.env.DOCKER_REGISTRY_URL || config.registry;
90
-
91
- if (username && password && registryUrl) {
92
- registryOptions.username = username;
93
- registryOptions.password = password;
94
- registryOptions.registryUrl = registryUrl;
95
- logger.log(` Using registry credentials from environment`);
96
- }
97
- }
98
- }
99
-
100
- await api.saveDockerProvider(config.applicationId, imageRef, registryOptions);
101
- logger.log(' ✓ Docker provider configured');
102
-
103
- // Prepare environment variables
104
- const envVars: Record<string, string> = {};
105
-
106
- if (masterKey) {
107
- envVars.GKM_MASTER_KEY = masterKey;
108
- }
109
-
110
- // Update environment if we have variables to set
111
- if (Object.keys(envVars).length > 0) {
112
- logger.log(' Updating environment variables...');
113
-
114
- // Convert env vars to the format Dokploy expects (KEY=VALUE per line)
115
- const envString = Object.entries(envVars)
116
- .map(([key, value]) => `${key}=${value}`)
117
- .join('\n');
118
-
119
- await api.saveApplicationEnv(config.applicationId, envString);
120
- logger.log(' ✓ Environment variables updated');
121
- }
122
-
123
- // Trigger deployment
124
- logger.log(' Triggering deployment...');
125
- await api.deployApplication(config.applicationId);
126
- logger.log(' ✓ Deployment triggered');
127
-
128
- logger.log('\n✅ Dokploy deployment initiated!');
129
- logger.log(`\n📋 Deployment details:`);
130
- logger.log(` Image: ${imageRef}`);
131
- logger.log(` Stage: ${stage}`);
132
- logger.log(` Application ID: ${config.applicationId}`);
133
-
134
- if (masterKey) {
135
- logger.log(`\n🔐 GKM_MASTER_KEY has been set in Dokploy environment`);
136
- }
137
-
138
- // Construct the probable deployment URL
139
- const deploymentUrl = `${config.endpoint}/project/${config.projectId}`;
140
- logger.log(`\n🔗 View deployment: ${deploymentUrl}`);
141
-
142
- return {
143
- imageRef,
144
- masterKey,
145
- url: deploymentUrl,
146
- };
147
- }
148
-
149
- /**
150
- * Validate Dokploy configuration
151
- */
152
- export function validateDokployConfig(
153
- config: Partial<DokployDeployConfig> | undefined,
154
- ): config is DokployDeployConfig {
155
- if (!config) {
156
- return false;
157
- }
158
-
159
- const required = ['endpoint', 'projectId', 'applicationId'] as const;
160
- const missing = required.filter((key) => !config[key]);
161
-
162
- if (missing.length > 0) {
163
- throw new Error(
164
- `Missing Dokploy configuration: ${missing.join(', ')}\n` +
165
- 'Configure in gkm.config.ts:\n' +
166
- ' providers: {\n' +
167
- ' dokploy: {\n' +
168
- " endpoint: 'https://dokploy.example.com',\n" +
169
- " projectId: 'proj_xxx',\n" +
170
- " applicationId: 'app_xxx',\n" +
171
- ' },\n' +
172
- ' }',
173
- );
174
- }
175
-
176
- return true;
177
- }
@@ -1,134 +0,0 @@
1
- import { getPublicEnvPrefix } from '../workspace/index.js';
2
- import type {
3
- DokployWorkspaceConfig,
4
- NormalizedAppConfig,
5
- } from '../workspace/types.js';
6
-
7
- /**
8
- * Resolve the hostname for an app based on stage configuration.
9
- *
10
- * Domain resolution priority:
11
- * 1. Explicit app.domain override (string or stage-specific)
12
- * 2. Default pattern based on app type:
13
- * - Main frontend app gets base domain (e.g., 'myapp.com')
14
- * - Other apps get prefixed domain (e.g., 'api.myapp.com')
15
- *
16
- * @param appName - The name of the app
17
- * @param app - The normalized app configuration
18
- * @param stage - The deployment stage (e.g., 'production', 'development')
19
- * @param dokployConfig - Dokploy workspace configuration with domain mappings
20
- * @param isMainFrontend - Whether this is the main frontend app
21
- * @returns The resolved hostname for the app
22
- * @throws Error if no domain configuration is found for the stage
23
- */
24
- export function resolveHost(
25
- appName: string,
26
- app: NormalizedAppConfig,
27
- stage: string,
28
- dokployConfig: DokployWorkspaceConfig | undefined,
29
- isMainFrontend: boolean,
30
- ): string {
31
- // 1. Check for explicit app domain override
32
- if (app.domain) {
33
- if (typeof app.domain === 'string') {
34
- return app.domain;
35
- }
36
- if (app.domain[stage]) {
37
- return app.domain[stage]!;
38
- }
39
- }
40
-
41
- // 2. Get base domain for this stage
42
- const baseDomain = dokployConfig?.domains?.[stage];
43
- if (!baseDomain) {
44
- throw new Error(
45
- `No domain configured for stage "${stage}". ` +
46
- `Add deploy.dokploy.domains.${stage} to gkm.config.ts`,
47
- );
48
- }
49
-
50
- // 3. Main frontend app gets base domain, others get prefix
51
- if (isMainFrontend) {
52
- return baseDomain;
53
- }
54
-
55
- return `${appName}.${baseDomain}`;
56
- }
57
-
58
- /**
59
- * Determine if an app is the "main" frontend (gets base domain).
60
- *
61
- * An app is considered the main frontend if:
62
- * 1. It's named 'web' and is a frontend type
63
- * 2. It's the first frontend app in the apps list
64
- *
65
- * @param appName - The name of the app to check
66
- * @param app - The app configuration
67
- * @param allApps - All apps in the workspace
68
- * @returns True if this is the main frontend app
69
- */
70
- export function isMainFrontendApp(
71
- appName: string,
72
- app: NormalizedAppConfig,
73
- allApps: Record<string, NormalizedAppConfig>,
74
- ): boolean {
75
- if (app.type !== 'web') {
76
- return false;
77
- }
78
-
79
- // App named 'web' is always main
80
- if (appName === 'web') {
81
- return true;
82
- }
83
-
84
- // Otherwise, check if this is the first frontend
85
- for (const [name, a] of Object.entries(allApps)) {
86
- if (a.type === 'web') {
87
- return name === appName;
88
- }
89
- }
90
-
91
- return false;
92
- }
93
-
94
- /**
95
- * Generate public URL build args for a web/mobile app based on its dependencies.
96
- *
97
- * The prefix is chosen by the app's framework (NEXT_PUBLIC_, VITE_,
98
- * EXPO_PUBLIC_, or none for Remix). Apps without a public prefix get no
99
- * build args — they should fetch URLs at runtime instead.
100
- *
101
- * @param app - The web/mobile app configuration
102
- * @param deployedUrls - Map of app name to deployed public URL
103
- * @returns Array of build args like 'NEXT_PUBLIC_API_URL=https://api.example.com'
104
- */
105
- export function generatePublicUrlBuildArgs(
106
- app: NormalizedAppConfig,
107
- deployedUrls: Record<string, string>,
108
- ): string[] {
109
- const prefix = getPublicEnvPrefix(app);
110
- if (!prefix) return [];
111
-
112
- const buildArgs: string[] = [];
113
- for (const dep of app.dependencies) {
114
- const publicUrl = deployedUrls[dep];
115
- if (publicUrl) {
116
- buildArgs.push(`${prefix}${dep.toUpperCase()}_URL=${publicUrl}`);
117
- }
118
- }
119
-
120
- return buildArgs;
121
- }
122
-
123
- /**
124
- * Get public URL arg names from app dependencies.
125
- *
126
- * @param app - The web/mobile app configuration
127
- * @returns Array of arg names like 'NEXT_PUBLIC_API_URL', or [] for frameworks
128
- * without a public prefix (e.g. Remix).
129
- */
130
- export function getPublicUrlArgNames(app: NormalizedAppConfig): string[] {
131
- const prefix = getPublicEnvPrefix(app);
132
- if (!prefix) return [];
133
- return app.dependencies.map((dep) => `${prefix}${dep.toUpperCase()}_URL`);
134
- }
@@ -1,305 +0,0 @@
1
- /**
2
- * Environment Variable Resolution for Dokploy Deployments
3
- *
4
- * Resolves sniffed environment variables to actual values during deployment.
5
- * Auto-supports common variables like DATABASE_URL, REDIS_URL, BETTER_AUTH_*,
6
- * and falls back to user-provided secrets.
7
- */
8
-
9
- import { randomBytes } from 'node:crypto';
10
- import type { StageSecrets } from '../secrets/types';
11
- import { stripPublicPrefix } from '../workspace/publicEnv';
12
- import type { NormalizedAppConfig } from '../workspace/types';
13
- import {
14
- type AppDbCredentials,
15
- type DokployStageState,
16
- getGeneratedSecret,
17
- setGeneratedSecret,
18
- } from './state';
19
-
20
- /**
21
- * Context needed for environment variable resolution
22
- */
23
- export interface EnvResolverContext {
24
- /** The app being deployed */
25
- app: NormalizedAppConfig;
26
- /** The app name */
27
- appName: string;
28
- /** Deployment stage (production, staging, development) */
29
- stage: string;
30
- /** Deploy state (for persisting generated secrets) */
31
- state: DokployStageState;
32
- /** Per-app database credentials (if postgres is enabled) */
33
- appCredentials?: AppDbCredentials;
34
- /** Postgres connection info (internal hostname) */
35
- postgres?: {
36
- host: string;
37
- port: number;
38
- database: string;
39
- };
40
- /** Redis connection info (internal hostname) */
41
- redis?: {
42
- host: string;
43
- port: number;
44
- password?: string;
45
- };
46
- /** Public hostname for this app */
47
- appHostname: string;
48
- /** All frontend app URLs (for BETTER_AUTH_TRUSTED_ORIGINS) */
49
- frontendUrls: string[];
50
- /** User-provided secrets from secrets store */
51
- userSecrets?: StageSecrets;
52
- /** Master key for runtime decryption (optional) */
53
- masterKey?: string;
54
- /** URLs of deployed dependency apps (e.g., { auth: 'https://auth.example.com' }) */
55
- dependencyUrls?: Record<string, string>;
56
- }
57
-
58
- /**
59
- * Result of environment variable resolution
60
- */
61
- export interface EnvResolutionResult {
62
- /** Successfully resolved environment variables */
63
- resolved: Record<string, string>;
64
- /** Environment variable names that could not be resolved */
65
- missing: string[];
66
- }
67
-
68
- /**
69
- * Auto-supported environment variable names
70
- */
71
- export const AUTO_SUPPORTED_VARS = [
72
- 'PORT',
73
- 'NODE_ENV',
74
- 'STAGE',
75
- 'DATABASE_URL',
76
- 'REDIS_URL',
77
- 'BETTER_AUTH_URL',
78
- 'BETTER_AUTH_SECRET',
79
- 'BETTER_AUTH_TRUSTED_ORIGINS',
80
- 'GKM_MASTER_KEY',
81
- ] as const;
82
-
83
- export type AutoSupportedVar = (typeof AUTO_SUPPORTED_VARS)[number];
84
-
85
- /**
86
- * Check if a variable name is auto-supported
87
- */
88
- export function isAutoSupportedVar(
89
- varName: string,
90
- ): varName is AutoSupportedVar {
91
- return AUTO_SUPPORTED_VARS.includes(varName as AutoSupportedVar);
92
- }
93
-
94
- /**
95
- * Generate a secure random secret (64 hex characters = 32 bytes)
96
- */
97
- export function generateSecret(): string {
98
- return randomBytes(32).toString('hex');
99
- }
100
-
101
- /**
102
- * Get or generate a secret for an app.
103
- * If the secret already exists in state, returns it.
104
- * Otherwise generates a new one and stores it.
105
- */
106
- export function getOrGenerateSecret(
107
- state: DokployStageState,
108
- appName: string,
109
- secretName: string,
110
- ): string {
111
- // Check if already generated
112
- const existing = getGeneratedSecret(state, appName, secretName);
113
- if (existing) {
114
- return existing;
115
- }
116
-
117
- // Generate new secret
118
- const generated = generateSecret();
119
-
120
- // Store in state for persistence
121
- setGeneratedSecret(state, appName, secretName, generated);
122
-
123
- return generated;
124
- }
125
-
126
- /**
127
- * Build a DATABASE_URL for an app with per-app credentials
128
- */
129
- export function buildDatabaseUrl(
130
- credentials: AppDbCredentials,
131
- postgres: { host: string; port: number; database: string },
132
- ): string {
133
- const { dbUser, dbPassword } = credentials;
134
- const { host, port, database } = postgres;
135
- return `postgresql://${encodeURIComponent(dbUser)}:${encodeURIComponent(dbPassword)}@${host}:${port}/${database}`;
136
- }
137
-
138
- /**
139
- * Build a REDIS_URL
140
- */
141
- export function buildRedisUrl(redis: {
142
- host: string;
143
- port: number;
144
- password?: string;
145
- }): string {
146
- const { host, port, password } = redis;
147
- if (password) {
148
- return `redis://:${encodeURIComponent(password)}@${host}:${port}`;
149
- }
150
- return `redis://${host}:${port}`;
151
- }
152
-
153
- /**
154
- * Resolve a single environment variable
155
- */
156
- export function resolveEnvVar(
157
- varName: string,
158
- context: EnvResolverContext,
159
- ): string | undefined {
160
- // Auto-supported variables
161
- switch (varName) {
162
- case 'PORT':
163
- return String(context.app.port);
164
-
165
- case 'NODE_ENV':
166
- // Always 'production' for deployed apps (gkm dev handles development mode)
167
- return 'production';
168
-
169
- case 'STAGE':
170
- return context.stage;
171
-
172
- case 'DATABASE_URL':
173
- if (context.appCredentials && context.postgres) {
174
- return buildDatabaseUrl(context.appCredentials, context.postgres);
175
- }
176
- // Fall through to check user secrets
177
- break;
178
-
179
- case 'REDIS_URL':
180
- if (context.redis) {
181
- return buildRedisUrl(context.redis);
182
- }
183
- // Fall through to check user secrets
184
- break;
185
-
186
- case 'BETTER_AUTH_URL':
187
- return `https://${context.appHostname}`;
188
-
189
- case 'BETTER_AUTH_SECRET':
190
- return getOrGenerateSecret(
191
- context.state,
192
- context.appName,
193
- 'BETTER_AUTH_SECRET',
194
- );
195
-
196
- case 'BETTER_AUTH_TRUSTED_ORIGINS':
197
- if (context.frontendUrls.length > 0) {
198
- return context.frontendUrls.join(',');
199
- }
200
- // Fall through to check user secrets
201
- break;
202
-
203
- case 'GKM_MASTER_KEY':
204
- if (context.masterKey) {
205
- return context.masterKey;
206
- }
207
- // Fall through to check user secrets
208
- break;
209
- }
210
-
211
- // Check dependency URLs (e.g., AUTH_URL -> dependencyUrls.auth)
212
- // Also supports any known public prefix (NEXT_PUBLIC_, VITE_, ...) so
213
- // VITE_AUTH_URL and NEXT_PUBLIC_AUTH_URL both resolve to dependencyUrls.auth.
214
- if (context.dependencyUrls && varName.endsWith('_URL')) {
215
- const stripped = stripPublicPrefix(varName) ?? varName;
216
- const depName = stripped.slice(0, -4).toLowerCase();
217
-
218
- if (context.dependencyUrls[depName]) {
219
- return context.dependencyUrls[depName];
220
- }
221
- }
222
-
223
- // Check user-provided secrets
224
- if (context.userSecrets) {
225
- // Check custom secrets first
226
- if (context.userSecrets.custom[varName]) {
227
- return context.userSecrets.custom[varName];
228
- }
229
-
230
- // Check URLs (DATABASE_URL, REDIS_URL, RABBITMQ_URL)
231
- if (varName in context.userSecrets.urls) {
232
- return context.userSecrets.urls[
233
- varName as keyof typeof context.userSecrets.urls
234
- ];
235
- }
236
-
237
- // Check service-specific vars
238
- if (
239
- varName === 'POSTGRES_PASSWORD' &&
240
- context.userSecrets.services.postgres
241
- ) {
242
- return context.userSecrets.services.postgres.password;
243
- }
244
- if (varName === 'REDIS_PASSWORD' && context.userSecrets.services.redis) {
245
- return context.userSecrets.services.redis.password;
246
- }
247
- }
248
-
249
- return undefined;
250
- }
251
-
252
- /**
253
- * Resolve all environment variables for an app
254
- */
255
- export function resolveEnvVars(
256
- requiredVars: string[],
257
- context: EnvResolverContext,
258
- ): EnvResolutionResult {
259
- const resolved: Record<string, string> = {};
260
- const missing: string[] = [];
261
-
262
- for (const varName of requiredVars) {
263
- const value = resolveEnvVar(varName, context);
264
- if (value !== undefined) {
265
- resolved[varName] = value;
266
- } else {
267
- missing.push(varName);
268
- }
269
- }
270
-
271
- return { resolved, missing };
272
- }
273
-
274
- /**
275
- * Format missing variables error message
276
- */
277
- export function formatMissingVarsError(
278
- appName: string,
279
- missing: string[],
280
- stage: string,
281
- ): string {
282
- const varList = missing.map((v) => ` - ${v}`).join('\n');
283
- return (
284
- `Deployment failed: ${appName} is missing required environment variables:\n` +
285
- `${varList}\n\n` +
286
- `Add them with:\n` +
287
- ` gkm secrets:set <VAR_NAME> <value> --stage ${stage}\n\n` +
288
- `Or add them to the app's requiredEnv in gkm.config.ts to have them auto-resolved.`
289
- );
290
- }
291
-
292
- /**
293
- * Validate that all required environment variables can be resolved
294
- */
295
- export function validateEnvVars(
296
- requiredVars: string[],
297
- context: EnvResolverContext,
298
- ): { valid: boolean; missing: string[]; resolved: Record<string, string> } {
299
- const { resolved, missing } = resolveEnvVars(requiredVars, context);
300
- return {
301
- valid: missing.length === 0,
302
- missing,
303
- resolved,
304
- };
305
- }