@geekmidas/cli 9.0.2 → 10.0.0-alpha.1
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.
- package/README.md +66 -122
- package/dist/{CachedStateProvider-BdX7klRc.cjs → CachedStateProvider-BLo7zv7S.cjs} +1 -1
- package/dist/CachedStateProvider-BxoAm-B2.mjs +3 -0
- package/dist/{CachedStateProvider-klLWZXWF.cjs → CachedStateProvider-CqPdW7CB.cjs} +1 -1
- package/dist/{CachedStateProvider-klLWZXWF.cjs.map → CachedStateProvider-CqPdW7CB.cjs.map} +1 -1
- package/dist/{CachedStateProvider-CzyFct42.mjs → CachedStateProvider-DTniehMP.mjs} +1 -1
- package/dist/{CachedStateProvider-CzyFct42.mjs.map → CachedStateProvider-DTniehMP.mjs.map} +1 -1
- package/dist/{HostingerProvider-B2ZYz7Yc.mjs → HostingerProvider-Cft7lEYr.mjs} +4 -3
- package/dist/HostingerProvider-Cft7lEYr.mjs.map +1 -0
- package/dist/{HostingerProvider-CrHfsgz9.cjs → HostingerProvider-h3EbEp-Z.cjs} +4 -3
- package/dist/HostingerProvider-h3EbEp-Z.cjs.map +1 -0
- package/dist/{LocalStateProvider-CP49rjzt.mjs → LocalStateProvider-Bn6tS-oL.mjs} +1 -1
- package/dist/{LocalStateProvider-CP49rjzt.mjs.map → LocalStateProvider-Bn6tS-oL.mjs.map} +1 -1
- package/dist/{LocalStateProvider-CalzNfNA.cjs → LocalStateProvider-Db9SEjyH.cjs} +1 -1
- package/dist/{LocalStateProvider-CalzNfNA.cjs.map → LocalStateProvider-Db9SEjyH.cjs.map} +1 -1
- package/dist/{Route53Provider-tlgBzrRQ.mjs → Route53Provider-RdpUDJQk.mjs} +1 -1
- package/dist/{Route53Provider-tlgBzrRQ.mjs.map → Route53Provider-RdpUDJQk.mjs.map} +1 -1
- package/dist/{Route53Provider-DwgXiLxt.cjs → Route53Provider-di2fMM5N.cjs} +1 -1
- package/dist/{Route53Provider-DwgXiLxt.cjs.map → Route53Provider-di2fMM5N.cjs.map} +1 -1
- package/dist/{SSMStateProvider-BlrTiV5m.mjs → SSMStateProvider-BRt2py-A.mjs} +1 -1
- package/dist/{SSMStateProvider-BlrTiV5m.mjs.map → SSMStateProvider-BRt2py-A.mjs.map} +1 -1
- package/dist/{SSMStateProvider-Bt6r8CTL.cjs → SSMStateProvider-DyX8s9HI.cjs} +1 -1
- package/dist/{SSMStateProvider-Bt6r8CTL.cjs.map → SSMStateProvider-DyX8s9HI.cjs.map} +1 -1
- package/dist/{backup-provisioner-Xunq-p_8.mjs → backup-provisioner-Bgj5Vi_L.mjs} +2 -2
- package/dist/{backup-provisioner-Xunq-p_8.mjs.map → backup-provisioner-Bgj5Vi_L.mjs.map} +1 -1
- package/dist/{backup-provisioner-B3HBN-2k.cjs → backup-provisioner-BrsHwYG0.cjs} +2 -2
- package/dist/{backup-provisioner-B3HBN-2k.cjs.map → backup-provisioner-BrsHwYG0.cjs.map} +1 -1
- package/dist/{bundler-Dufq3uvI.cjs → bundler-BY1OmV1e.cjs} +44 -14
- package/dist/bundler-BY1OmV1e.cjs.map +1 -0
- package/dist/{bundler-DkA4qzUD.mjs → bundler-Be8Zg4Wd.mjs} +45 -15
- package/dist/bundler-Be8Zg4Wd.mjs.map +1 -0
- package/dist/config-D8o6I_7Z.mjs +469 -0
- package/dist/config-D8o6I_7Z.mjs.map +1 -0
- package/dist/config-DbPE1KXF.cjs +535 -0
- package/dist/config-DbPE1KXF.cjs.map +1 -0
- package/dist/config.cjs +3 -2
- package/dist/config.d.cts +2 -2
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +2 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +3 -2
- package/dist/{credentials-s1kLcIzK.mjs → credentials-B5zRHdAl.mjs} +21 -6
- package/dist/credentials-B5zRHdAl.mjs.map +1 -0
- package/dist/{credentials-C8DWtnMY.cjs → credentials-BapzjyV5.cjs} +26 -5
- package/dist/credentials-BapzjyV5.cjs.map +1 -0
- package/dist/credentials-Dh0Q6HzY.mjs +2548 -0
- package/dist/credentials-Dh0Q6HzY.mjs.map +1 -0
- package/dist/credentials-K961ThG3.cjs +2680 -0
- package/dist/credentials-K961ThG3.cjs.map +1 -0
- package/dist/deploy/sniffer-routes-worker.cjs +6 -2
- package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
- package/dist/deploy/sniffer-routes-worker.mjs +6 -2
- package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
- package/dist/discover-CAlFgYec.mjs +229 -0
- package/dist/discover-CAlFgYec.mjs.map +1 -0
- package/dist/discover-DTmFeloL.cjs +271 -0
- package/dist/discover-DTmFeloL.cjs.map +1 -0
- package/dist/dokploy-api-BS2xnJLZ.mjs +3 -0
- package/dist/{dokploy-api-CqOIKHme.cjs → dokploy-api-BsVH0y_s.cjs} +141 -32
- package/dist/dokploy-api-BsVH0y_s.cjs.map +1 -0
- package/dist/dokploy-api-BuxDRo3l.cjs +3 -0
- package/dist/{dokploy-api-sfZFlWuE.mjs → dokploy-api-aTFPz7_4.mjs} +141 -32
- package/dist/dokploy-api-aTFPz7_4.mjs.map +1 -0
- package/dist/emit-CbcRolsa.cjs +236 -0
- package/dist/emit-CbcRolsa.cjs.map +1 -0
- package/dist/emit-CiZS_5Ub.mjs +206 -0
- package/dist/emit-CiZS_5Ub.mjs.map +1 -0
- package/dist/{encryption-MfXAiFTm.cjs → encryption-C6jaU0hE.cjs} +1 -1
- package/dist/{encryption-MfXAiFTm.cjs.map → encryption-C6jaU0hE.cjs.map} +1 -1
- package/dist/{encryption-BVS7Vmzs.cjs → encryption-CHzzeR8a.cjs} +1 -1
- package/dist/encryption-CQUncu7v.mjs +3 -0
- package/dist/{encryption-CO5Q4Bhf.mjs → encryption-D-abyhZx.mjs} +1 -1
- package/dist/{encryption-CO5Q4Bhf.mjs.map → encryption-D-abyhZx.mjs.map} +1 -1
- package/dist/fullstack-secrets-C-GGohke.cjs +111 -0
- package/dist/fullstack-secrets-C-GGohke.cjs.map +1 -0
- package/dist/fullstack-secrets-D1o9-G5l.mjs +87 -0
- package/dist/fullstack-secrets-D1o9-G5l.mjs.map +1 -0
- package/dist/{fullstack-secrets-BYzi6Hwl.cjs → generator-CNzBw7g5.cjs} +1 -114
- package/dist/generator-CNzBw7g5.cjs.map +1 -0
- package/dist/{fullstack-secrets-l8s3II_H.mjs → generator-VE2JrFlY.mjs} +2 -85
- package/dist/generator-VE2JrFlY.mjs.map +1 -0
- package/dist/index-BThUzEIp.d.mts +175 -0
- package/dist/index-BThUzEIp.d.mts.map +1 -0
- package/dist/index-CHB4tSzX.d.cts +175 -0
- package/dist/index-CHB4tSzX.d.cts.map +1 -0
- package/dist/index.cjs +2530 -1810
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2506 -1786
- package/dist/index.mjs.map +1 -1
- package/dist/{openapi-Cfwi0fqF.mjs → openapi-CgpMWMmM.mjs} +174 -95
- package/dist/openapi-CgpMWMmM.mjs.map +1 -0
- package/dist/{openapi-BzNOC7_i.cjs → openapi-CljONd_M.cjs} +175 -108
- package/dist/openapi-CljONd_M.cjs.map +1 -0
- package/dist/{openapi-react-query-C4iIvpPf.mjs → openapi-react-query-Byltvm_7.mjs} +2 -2
- package/dist/openapi-react-query-Byltvm_7.mjs.map +1 -0
- package/dist/{openapi-react-query-CYWik72n.cjs → openapi-react-query-CmJ1xDbn.cjs} +2 -2
- package/dist/openapi-react-query-CmJ1xDbn.cjs.map +1 -0
- package/dist/openapi-react-query.cjs +1 -1
- package/dist/openapi-react-query.mjs +1 -1
- package/dist/openapi.cjs +4 -3
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/openapi.mjs +4 -3
- package/dist/reconcile/public.cjs +9 -0
- package/dist/reconcile/public.d.cts +125 -0
- package/dist/reconcile/public.d.cts.map +1 -0
- package/dist/reconcile/public.d.mts +125 -0
- package/dist/reconcile/public.d.mts.map +1 -0
- package/dist/reconcile/public.mjs +4 -0
- package/dist/{reconcile-B2FoJE0a.mjs → reconcile-CFs8C_1a.mjs} +5 -4
- package/dist/reconcile-CFs8C_1a.mjs.map +1 -0
- package/dist/{reconcile-BzqKJ2Rt.cjs → reconcile-D0pimNiy.cjs} +5 -4
- package/dist/reconcile-D0pimNiy.cjs.map +1 -0
- package/dist/setup-CJiQM2pX.cjs +473 -0
- package/dist/setup-CJiQM2pX.cjs.map +1 -0
- package/dist/setup-DMtU3p41.cjs +11 -0
- package/dist/setup-DOsYueeQ.mjs +443 -0
- package/dist/setup-DOsYueeQ.mjs.map +1 -0
- package/dist/setup-DSutDAlt.mjs +11 -0
- package/dist/{storage-B1wvztiJ.cjs → storage-BJmzYxt8.cjs} +1 -1
- package/dist/{storage-B1wvztiJ.cjs.map → storage-BJmzYxt8.cjs.map} +1 -1
- package/dist/{storage-DOEtT2Hr.cjs → storage-BM9hGpgv.cjs} +1 -1
- package/dist/{storage-dbb9RyBl.mjs → storage-Bi24WfoW.mjs} +1 -1
- package/dist/{storage-dbb9RyBl.mjs.map → storage-Bi24WfoW.mjs.map} +1 -1
- package/dist/{storage-Cs4WBsc4.mjs → storage-CYlGwWTj.mjs} +1 -1
- package/dist/{sync-CSooqRQ8.mjs → sync-CmEuNZsB.mjs} +2 -2
- package/dist/{sync-CSooqRQ8.mjs.map → sync-CmEuNZsB.mjs.map} +1 -1
- package/dist/sync-D306yOWu.cjs +4 -0
- package/dist/{sync-o_CtEbvR.cjs → sync-SizaChmC.cjs} +2 -2
- package/dist/{sync-o_CtEbvR.cjs.map → sync-SizaChmC.cjs.map} +1 -1
- package/dist/{sync-B5UHXwRM.mjs → sync-hOqAWHR6.mjs} +1 -1
- package/dist/{index-Bw548Bta.d.mts → types-C-arnQ1r.d.mts} +590 -143
- package/dist/types-C-arnQ1r.d.mts.map +1 -0
- package/dist/{index-DTpkeFb8.d.cts → types-abJQuk7m.d.cts} +590 -143
- package/dist/types-abJQuk7m.d.cts.map +1 -0
- package/dist/workspace/index.cjs +5 -1
- package/dist/workspace/index.d.cts +3 -3
- package/dist/workspace/index.d.mts +3 -3
- package/dist/workspace/index.mjs +2 -2
- package/dist/{workspace-D-37Ylqo.mjs → workspace-7FqprxuJ.mjs} +117 -30
- package/dist/workspace-7FqprxuJ.mjs.map +1 -0
- package/dist/workspace-8acupeaI.cjs +9 -0
- package/dist/{workspace-CQTT7HJQ.cjs → workspace-XvqO9jIv.cjs} +139 -28
- package/dist/workspace-XvqO9jIv.cjs.map +1 -0
- package/dist/workspace-yP5AHnrn.mjs +8 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -650
- package/FUNCTION_CRON_SUPPORT.md +0 -266
- package/dist/CachedStateProvider-GcGziXh1.mjs +0 -3
- package/dist/HostingerProvider-B2ZYz7Yc.mjs.map +0 -1
- package/dist/HostingerProvider-CrHfsgz9.cjs.map +0 -1
- package/dist/bundler-DkA4qzUD.mjs.map +0 -1
- package/dist/bundler-Dufq3uvI.cjs.map +0 -1
- package/dist/config-Bbu1JKvf.mjs +0 -211
- package/dist/config-Bbu1JKvf.mjs.map +0 -1
- package/dist/config-DujV8DbR.cjs +0 -253
- package/dist/config-DujV8DbR.cjs.map +0 -1
- package/dist/credentials-C8DWtnMY.cjs.map +0 -1
- package/dist/credentials-s1kLcIzK.mjs.map +0 -1
- package/dist/dokploy-api-BPYkG-ZZ.cjs +0 -3
- package/dist/dokploy-api-BiSzWM4v.mjs +0 -3
- package/dist/dokploy-api-CqOIKHme.cjs.map +0 -1
- package/dist/dokploy-api-sfZFlWuE.mjs.map +0 -1
- package/dist/encryption-Bd_m4q3g.mjs +0 -3
- package/dist/fullstack-secrets-BYzi6Hwl.cjs.map +0 -1
- package/dist/fullstack-secrets-l8s3II_H.mjs.map +0 -1
- package/dist/index-Bw548Bta.d.mts.map +0 -1
- package/dist/index-DTpkeFb8.d.cts.map +0 -1
- package/dist/openapi-BzNOC7_i.cjs.map +0 -1
- package/dist/openapi-Cfwi0fqF.mjs.map +0 -1
- package/dist/openapi-react-query-C4iIvpPf.mjs.map +0 -1
- package/dist/openapi-react-query-CYWik72n.cjs.map +0 -1
- package/dist/reconcile-B2FoJE0a.mjs.map +0 -1
- package/dist/reconcile-BzqKJ2Rt.cjs.map +0 -1
- package/dist/setup-DDXUXzzl.mjs +0 -765
- package/dist/setup-DDXUXzzl.mjs.map +0 -1
- package/dist/setup-DLwhfyt-.cjs +0 -8
- package/dist/setup-Dh-B7YTX.mjs +0 -8
- package/dist/setup-WZ-xqAQO.cjs +0 -849
- package/dist/setup-WZ-xqAQO.cjs.map +0 -1
- package/dist/sync-BLA94rgC.cjs +0 -4
- package/dist/types-B3GQUg3k.d.mts +0 -280
- package/dist/types-B3GQUg3k.d.mts.map +0 -1
- package/dist/types-BWQDiooe.d.cts +0 -280
- package/dist/types-BWQDiooe.d.cts.map +0 -1
- package/dist/workspace-CQTT7HJQ.cjs.map +0 -1
- package/dist/workspace-D-37Ylqo.mjs.map +0 -1
- package/docs/OPENAPI_TYPESCRIPT_DESIGN.md +0 -408
- package/docs/dev-server-resilience-design.md +0 -189
- package/docs/manifest-refactor-design.md +0 -287
- package/examples/cron-example.ts +0 -45
- package/examples/env.ts +0 -33
- package/examples/function-example.ts +0 -40
- package/examples/gkm.config.json +0 -22
- package/examples/gkm.config.ts +0 -14
- package/examples/gkm.minimal.config.json +0 -7
- package/examples/gkm.production.config.json +0 -27
- package/examples/logger.ts +0 -10
- package/scripts/sync-versions.ts +0 -108
- package/src/__tests__/EndpointGenerator.hooks.spec.ts +0 -204
- package/src/__tests__/config.spec.ts +0 -422
- package/src/__tests__/loadEnvFiles.spec.ts +0 -131
- package/src/__tests__/normalizeHooksConfig.spec.ts +0 -63
- package/src/__tests__/openapi-react-query.spec.ts +0 -506
- package/src/__tests__/openapi.spec.ts +0 -625
- package/src/__tests__/test-helpers.ts +0 -181
- package/src/auth/__tests__/credentials.spec.ts +0 -331
- package/src/auth/__tests__/index.spec.ts +0 -237
- package/src/auth/credentials.ts +0 -286
- package/src/auth/index.ts +0 -233
- package/src/build/__tests__/bundler.spec.ts +0 -446
- package/src/build/__tests__/endpoint-analyzer.spec.ts +0 -623
- package/src/build/__tests__/handler-templates.spec.ts +0 -1287
- package/src/build/__tests__/index-new.spec.ts +0 -550
- package/src/build/__tests__/manifests.spec.ts +0 -583
- package/src/build/__tests__/partitions.spec.ts +0 -110
- package/src/build/__tests__/workspace-build.spec.ts +0 -215
- package/src/build/bundler.ts +0 -256
- package/src/build/endpoint-analyzer.ts +0 -236
- package/src/build/handler-templates.ts +0 -1253
- package/src/build/index.ts +0 -616
- package/src/build/manifests.ts +0 -285
- package/src/build/partitions.ts +0 -58
- package/src/build/providerResolver.ts +0 -184
- package/src/build/types.ts +0 -104
- package/src/config.ts +0 -330
- package/src/credentials/__tests__/fullDockerPorts.spec.ts +0 -144
- package/src/credentials/__tests__/helpers.ts +0 -112
- package/src/credentials/__tests__/prepareEntryCredentials.spec.ts +0 -125
- package/src/credentials/__tests__/readonlyDockerPorts.spec.ts +0 -190
- package/src/credentials/__tests__/workspaceCredentials.spec.ts +0 -209
- package/src/credentials/index.ts +0 -843
- package/src/debug.ts +0 -68
- package/src/deploy/CachedStateProvider.ts +0 -86
- package/src/deploy/LocalStateProvider.ts +0 -57
- package/src/deploy/SSMStateProvider.ts +0 -117
- package/src/deploy/StateProvider.ts +0 -175
- package/src/deploy/__tests__/CachedStateProvider.spec.ts +0 -235
- package/src/deploy/__tests__/HostingerProvider.spec.ts +0 -347
- package/src/deploy/__tests__/LocalStateProvider.spec.ts +0 -130
- package/src/deploy/__tests__/Route53Provider.spec.ts +0 -425
- package/src/deploy/__tests__/SSMStateProvider.spec.ts +0 -201
- package/src/deploy/__tests__/__fixtures__/entry-apps/async-entry.ts +0 -24
- package/src/deploy/__tests__/__fixtures__/entry-apps/nested-config-entry.ts +0 -24
- package/src/deploy/__tests__/__fixtures__/entry-apps/no-env-entry.ts +0 -12
- package/src/deploy/__tests__/__fixtures__/entry-apps/simple-entry.ts +0 -14
- package/src/deploy/__tests__/__fixtures__/entry-apps/throwing-entry.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/env-parsers/non-function-export.ts +0 -10
- package/src/deploy/__tests__/__fixtures__/env-parsers/optional-env-parser.ts +0 -21
- package/src/deploy/__tests__/__fixtures__/env-parsers/parseable-env-parser.ts +0 -18
- package/src/deploy/__tests__/__fixtures__/env-parsers/throwing-env-parser.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/env-parsers/valid-env-parser.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/auth.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/health.ts +0 -13
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/users.ts +0 -15
- package/src/deploy/__tests__/__fixtures__/route-apps/services.ts +0 -55
- package/src/deploy/__tests__/backup-provisioner.spec.ts +0 -428
- package/src/deploy/__tests__/createDnsProvider.spec.ts +0 -195
- package/src/deploy/__tests__/createStateProvider.spec.ts +0 -126
- package/src/deploy/__tests__/dns-orchestration.spec.ts +0 -192
- package/src/deploy/__tests__/dns-verification.spec.ts +0 -229
- package/src/deploy/__tests__/docker.spec.ts +0 -149
- package/src/deploy/__tests__/dokploy-api.spec.ts +0 -697
- package/src/deploy/__tests__/dokploy.spec.ts +0 -435
- package/src/deploy/__tests__/domain.spec.ts +0 -235
- package/src/deploy/__tests__/env-resolver.spec.ts +0 -903
- package/src/deploy/__tests__/index.spec.ts +0 -1091
- package/src/deploy/__tests__/init.spec.ts +0 -793
- package/src/deploy/__tests__/secrets.spec.ts +0 -303
- package/src/deploy/__tests__/sniffer.spec.ts +0 -838
- package/src/deploy/__tests__/state-e2e.spec.ts +0 -387
- package/src/deploy/__tests__/state.spec.ts +0 -876
- package/src/deploy/__tests__/undeploy.spec.ts +0 -758
- package/src/deploy/backup-provisioner.ts +0 -316
- package/src/deploy/dns/DnsProvider.ts +0 -201
- package/src/deploy/dns/HostingerProvider.ts +0 -174
- package/src/deploy/dns/Route53Provider.ts +0 -340
- package/src/deploy/dns/hostinger-api.ts +0 -261
- package/src/deploy/dns/index.ts +0 -627
- package/src/deploy/docker.ts +0 -260
- package/src/deploy/dokploy-api.ts +0 -1101
- package/src/deploy/dokploy.ts +0 -177
- package/src/deploy/domain.ts +0 -134
- package/src/deploy/env-resolver.ts +0 -305
- package/src/deploy/index.ts +0 -2094
- package/src/deploy/init.ts +0 -427
- package/src/deploy/secrets.ts +0 -187
- package/src/deploy/sniffer-envkit-patch.ts +0 -61
- package/src/deploy/sniffer-hooks.ts +0 -57
- package/src/deploy/sniffer-loader.ts +0 -28
- package/src/deploy/sniffer-routes-worker.ts +0 -104
- package/src/deploy/sniffer-worker.ts +0 -75
- package/src/deploy/sniffer.ts +0 -578
- package/src/deploy/state-commands.ts +0 -274
- package/src/deploy/state.ts +0 -482
- package/src/deploy/types.ts +0 -102
- package/src/deploy/undeploy.ts +0 -407
- package/src/dev/__tests__/entry-integration.spec.ts +0 -347
- package/src/dev/__tests__/entry.spec.ts +0 -144
- package/src/dev/__tests__/index.spec.ts +0 -2084
- package/src/dev/index.ts +0 -1649
- package/src/docker/__tests__/compose.spec.ts +0 -1142
- package/src/docker/__tests__/templates.spec.ts +0 -694
- package/src/docker/compose.ts +0 -808
- package/src/docker/index.ts +0 -523
- package/src/docker/templates.ts +0 -1067
- package/src/exec/index.ts +0 -118
- package/src/generators/CronGenerator.ts +0 -105
- package/src/generators/EndpointGenerator.ts +0 -954
- package/src/generators/FunctionGenerator.ts +0 -117
- package/src/generators/Generator.ts +0 -147
- package/src/generators/OpenApiTsGenerator.ts +0 -821
- package/src/generators/QueueGenerator.ts +0 -245
- package/src/generators/SubscriberGenerator.ts +0 -282
- package/src/generators/TopicGenerator.ts +0 -45
- package/src/generators/__tests__/CronGenerator.spec.ts +0 -445
- package/src/generators/__tests__/EndpointGenerator.spec.ts +0 -544
- package/src/generators/__tests__/FunctionGenerator.spec.ts +0 -256
- package/src/generators/__tests__/Generator.bustCache.spec.ts +0 -72
- package/src/generators/__tests__/OpenApiTsGenerator.registry.spec.ts +0 -98
- package/src/generators/__tests__/OpenApiTsGenerator.responseType.spec.ts +0 -56
- package/src/generators/__tests__/QueueGenerator.spec.ts +0 -141
- package/src/generators/__tests__/SubscriberGenerator.spec.ts +0 -410
- package/src/generators/index.ts +0 -11
- package/src/index.ts +0 -972
- package/src/init/__tests__/generators.spec.ts +0 -1070
- package/src/init/__tests__/init.spec.ts +0 -577
- package/src/init/__tests__/utils.spec.ts +0 -104
- package/src/init/generators/auth.ts +0 -225
- package/src/init/generators/config.ts +0 -316
- package/src/init/generators/docker.ts +0 -388
- package/src/init/generators/env.ts +0 -62
- package/src/init/generators/index.ts +0 -6
- package/src/init/generators/mobile-expo.ts +0 -576
- package/src/init/generators/models.ts +0 -153
- package/src/init/generators/monorepo.ts +0 -475
- package/src/init/generators/package.ts +0 -95
- package/src/init/generators/source.ts +0 -15
- package/src/init/generators/test.ts +0 -178
- package/src/init/generators/ui.ts +0 -1473
- package/src/init/generators/web-tanstack.ts +0 -348
- package/src/init/generators/web.ts +0 -363
- package/src/init/index.ts +0 -542
- package/src/init/templates/api.ts +0 -404
- package/src/init/templates/index.ts +0 -342
- package/src/init/templates/minimal.ts +0 -207
- package/src/init/templates/serverless.ts +0 -148
- package/src/init/templates/worker.ts +0 -216
- package/src/init/utils.ts +0 -197
- package/src/init/versions.ts +0 -52
- package/src/openapi-react-query.ts +0 -288
- package/src/openapi.ts +0 -259
- package/src/secrets/__tests__/encryption.spec.ts +0 -226
- package/src/secrets/__tests__/generator.spec.ts +0 -575
- package/src/secrets/__tests__/index.spec.ts +0 -91
- package/src/secrets/__tests__/reconcile.spec.ts +0 -123
- package/src/secrets/__tests__/storage.spec.ts +0 -645
- package/src/secrets/encryption.ts +0 -91
- package/src/secrets/generator.ts +0 -329
- package/src/secrets/index.ts +0 -417
- package/src/secrets/keystore.ts +0 -144
- package/src/secrets/reconcile.ts +0 -53
- package/src/secrets/storage.ts +0 -337
- package/src/secrets/sync.ts +0 -136
- package/src/secrets/types.ts +0 -70
- package/src/setup/__tests__/auto-setup.spec.ts +0 -147
- package/src/setup/__tests__/reconcile-secrets.spec.ts +0 -439
- package/src/setup/fullstack-secrets.ts +0 -140
- package/src/setup/index.ts +0 -411
- package/src/test/__tests__/__fixtures__/workspace.ts +0 -104
- package/src/test/__tests__/api.spec.ts +0 -199
- package/src/test/__tests__/auth.spec.ts +0 -162
- package/src/test/__tests__/index.spec.ts +0 -502
- package/src/test/__tests__/web.spec.ts +0 -210
- package/src/test/index.ts +0 -198
- package/src/types.ts +0 -363
- package/src/upgrade/__tests__/index.spec.ts +0 -354
- package/src/upgrade/index.ts +0 -253
- package/src/workspace/__tests__/client-generator.spec.ts +0 -326
- package/src/workspace/__tests__/index.spec.ts +0 -766
- package/src/workspace/__tests__/publicEnv.spec.ts +0 -64
- package/src/workspace/__tests__/schema.spec.ts +0 -737
- package/src/workspace/__tests__/type-inference.spec.ts +0 -251
- package/src/workspace/client-generator.ts +0 -109
- package/src/workspace/index.ts +0 -433
- package/src/workspace/publicEnv.ts +0 -57
- package/src/workspace/schema.ts +0 -861
- package/src/workspace/types.ts +0 -943
- package/tsconfig.json +0 -9
- package/tsdown.config.ts +0 -22
package/src/deploy/dokploy.ts
DELETED
|
@@ -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
|
-
}
|
package/src/deploy/domain.ts
DELETED
|
@@ -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
|
-
}
|