@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/init.ts
DELETED
|
@@ -1,427 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import {
|
|
5
|
-
getDokployCredentials,
|
|
6
|
-
getDokployRegistryId,
|
|
7
|
-
getDokployToken,
|
|
8
|
-
storeDokployRegistryId,
|
|
9
|
-
} from '../auth';
|
|
10
|
-
import { DokployApi } from './dokploy-api';
|
|
11
|
-
import type { DokployDeployConfig } from './types';
|
|
12
|
-
|
|
13
|
-
const logger = console;
|
|
14
|
-
|
|
15
|
-
export interface DeployInitOptions {
|
|
16
|
-
/** Dokploy endpoint URL (optional if logged in) */
|
|
17
|
-
endpoint?: string;
|
|
18
|
-
/** Project name (creates new or uses existing) */
|
|
19
|
-
projectName: string;
|
|
20
|
-
/** Application name */
|
|
21
|
-
appName: string;
|
|
22
|
-
/** Use existing project ID instead of creating/finding */
|
|
23
|
-
projectId?: string;
|
|
24
|
-
/** Registry ID in Dokploy (optional, uses stored if available) */
|
|
25
|
-
registryId?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface RegistrySetupOptions {
|
|
29
|
-
/** Dokploy endpoint URL (optional if logged in) */
|
|
30
|
-
endpoint?: string;
|
|
31
|
-
/** Registry name (for display in Dokploy) */
|
|
32
|
-
registryName: string;
|
|
33
|
-
/** Registry URL (e.g., ghcr.io, docker.io) */
|
|
34
|
-
registryUrl: string;
|
|
35
|
-
/** Registry username */
|
|
36
|
-
username: string;
|
|
37
|
-
/** Registry password or token */
|
|
38
|
-
password: string;
|
|
39
|
-
/** Image prefix (optional, e.g., org-name) */
|
|
40
|
-
imagePrefix?: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Get the Dokploy API token from stored credentials or environment
|
|
45
|
-
*/
|
|
46
|
-
async function getApiToken(): Promise<string> {
|
|
47
|
-
const token = await getDokployToken();
|
|
48
|
-
if (!token) {
|
|
49
|
-
throw new Error(
|
|
50
|
-
'Dokploy credentials not found.\n' +
|
|
51
|
-
'Run "gkm login --service dokploy" to authenticate, or set DOKPLOY_API_TOKEN.',
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
return token;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Get Dokploy endpoint from options or stored credentials
|
|
59
|
-
*/
|
|
60
|
-
async function getEndpoint(providedEndpoint?: string): Promise<string> {
|
|
61
|
-
if (providedEndpoint) {
|
|
62
|
-
return providedEndpoint;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const stored = await getDokployCredentials();
|
|
66
|
-
if (stored) {
|
|
67
|
-
return stored.endpoint;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
throw new Error(
|
|
71
|
-
'Dokploy endpoint not specified.\n' +
|
|
72
|
-
'Either run "gkm login --service dokploy" first, or provide --endpoint.',
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Create a Dokploy API client
|
|
78
|
-
*/
|
|
79
|
-
async function createApi(endpoint: string): Promise<DokployApi> {
|
|
80
|
-
const token = await getApiToken();
|
|
81
|
-
return new DokployApi({ baseUrl: endpoint, token });
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Update gkm.config.ts with Dokploy configuration
|
|
86
|
-
*/
|
|
87
|
-
export async function updateConfig(
|
|
88
|
-
config: DokployDeployConfig,
|
|
89
|
-
cwd: string = process.cwd(),
|
|
90
|
-
): Promise<void> {
|
|
91
|
-
const configPath = join(cwd, 'gkm.config.ts');
|
|
92
|
-
|
|
93
|
-
if (!existsSync(configPath)) {
|
|
94
|
-
logger.warn(
|
|
95
|
-
'\n gkm.config.ts not found. Add this configuration manually:\n',
|
|
96
|
-
);
|
|
97
|
-
logger.log(` providers: {`);
|
|
98
|
-
logger.log(` dokploy: {`);
|
|
99
|
-
logger.log(` endpoint: '${config.endpoint}',`);
|
|
100
|
-
logger.log(` projectId: '${config.projectId}',`);
|
|
101
|
-
logger.log(` applicationId: '${config.applicationId}',`);
|
|
102
|
-
logger.log(` },`);
|
|
103
|
-
logger.log(` },`);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const content = await readFile(configPath, 'utf-8');
|
|
108
|
-
|
|
109
|
-
// Check if providers.dokploy already exists
|
|
110
|
-
if (content.includes('dokploy:') && content.includes('applicationId:')) {
|
|
111
|
-
logger.log('\n Dokploy config already exists in gkm.config.ts');
|
|
112
|
-
logger.log(' Updating with new values...');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Build the dokploy config string
|
|
116
|
-
const registryLine = config.registryId
|
|
117
|
-
? `\n\t\t\tregistryId: '${config.registryId}',`
|
|
118
|
-
: '';
|
|
119
|
-
const dokployConfigStr = `dokploy: {
|
|
120
|
-
endpoint: '${config.endpoint}',
|
|
121
|
-
projectId: '${config.projectId}',
|
|
122
|
-
applicationId: '${config.applicationId}',${registryLine}
|
|
123
|
-
}`;
|
|
124
|
-
|
|
125
|
-
// Try to add or update the dokploy config
|
|
126
|
-
let newContent: string;
|
|
127
|
-
|
|
128
|
-
if (content.includes('providers:')) {
|
|
129
|
-
// Add dokploy to existing providers
|
|
130
|
-
if (content.includes('dokploy:')) {
|
|
131
|
-
// Update existing dokploy config (handle multi-line with registryId)
|
|
132
|
-
newContent = content.replace(/dokploy:\s*\{[^}]*\}/s, dokployConfigStr);
|
|
133
|
-
} else {
|
|
134
|
-
// Add dokploy to providers
|
|
135
|
-
newContent = content.replace(
|
|
136
|
-
/providers:\s*\{/,
|
|
137
|
-
`providers: {\n\t\t${dokployConfigStr},`,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
} else {
|
|
141
|
-
// Add providers section before the closing of defineConfig
|
|
142
|
-
newContent = content.replace(
|
|
143
|
-
/}\s*\)\s*;?\s*$/,
|
|
144
|
-
`
|
|
145
|
-
providers: {
|
|
146
|
-
${dokployConfigStr},
|
|
147
|
-
},
|
|
148
|
-
});`,
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
await writeFile(configPath, newContent);
|
|
153
|
-
logger.log('\n ✓ Updated gkm.config.ts with Dokploy configuration');
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Initialize Dokploy deployment configuration
|
|
158
|
-
*/
|
|
159
|
-
export async function deployInitCommand(
|
|
160
|
-
options: DeployInitOptions,
|
|
161
|
-
): Promise<DokployDeployConfig> {
|
|
162
|
-
const {
|
|
163
|
-
projectName,
|
|
164
|
-
appName,
|
|
165
|
-
projectId: existingProjectId,
|
|
166
|
-
registryId,
|
|
167
|
-
} = options;
|
|
168
|
-
|
|
169
|
-
const endpoint = await getEndpoint(options.endpoint);
|
|
170
|
-
const api = await createApi(endpoint);
|
|
171
|
-
|
|
172
|
-
logger.log(`\n🚀 Initializing Dokploy deployment...`);
|
|
173
|
-
logger.log(` Endpoint: ${endpoint}`);
|
|
174
|
-
|
|
175
|
-
// Step 1: Find or create project
|
|
176
|
-
let projectId: string;
|
|
177
|
-
|
|
178
|
-
if (existingProjectId) {
|
|
179
|
-
projectId = existingProjectId;
|
|
180
|
-
logger.log(`\n📁 Using existing project: ${projectId}`);
|
|
181
|
-
} else {
|
|
182
|
-
logger.log(`\n📁 Looking for project: ${projectName}`);
|
|
183
|
-
|
|
184
|
-
const projects = await api.listProjects();
|
|
185
|
-
const existingProject = projects.find(
|
|
186
|
-
(p) => p.name.toLowerCase() === projectName.toLowerCase(),
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
if (existingProject) {
|
|
190
|
-
projectId = existingProject.projectId;
|
|
191
|
-
logger.log(` Found existing project: ${projectId}`);
|
|
192
|
-
} else {
|
|
193
|
-
logger.log(` Creating new project...`);
|
|
194
|
-
const result = await api.createProject(projectName);
|
|
195
|
-
projectId = result.project.projectId;
|
|
196
|
-
logger.log(` ✓ Created project: ${projectId}`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Step 2: Get project to find environment
|
|
201
|
-
const project = await api.getProject(projectId);
|
|
202
|
-
let environmentId: string;
|
|
203
|
-
|
|
204
|
-
const firstEnv = project.environments?.[0];
|
|
205
|
-
if (firstEnv) {
|
|
206
|
-
environmentId = firstEnv.environmentId;
|
|
207
|
-
} else {
|
|
208
|
-
// Create a default environment
|
|
209
|
-
logger.log(` Creating production environment...`);
|
|
210
|
-
const env = await api.createEnvironment(projectId, 'production');
|
|
211
|
-
environmentId = env.environmentId;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Step 3: Create application
|
|
215
|
-
logger.log(`\n📦 Creating application: ${appName}`);
|
|
216
|
-
const application = await api.createApplication(
|
|
217
|
-
appName,
|
|
218
|
-
projectId,
|
|
219
|
-
environmentId,
|
|
220
|
-
);
|
|
221
|
-
logger.log(` ✓ Created application: ${application.applicationId}`);
|
|
222
|
-
|
|
223
|
-
// Step 4: Configure registry if provided
|
|
224
|
-
if (registryId) {
|
|
225
|
-
logger.log(`\n🔧 Configuring registry: ${registryId}`);
|
|
226
|
-
await api.updateApplication(application.applicationId, { registryId });
|
|
227
|
-
logger.log(` ✓ Registry configured`);
|
|
228
|
-
} else {
|
|
229
|
-
// List available registries
|
|
230
|
-
try {
|
|
231
|
-
const registries = await api.listRegistries();
|
|
232
|
-
if (registries.length > 0) {
|
|
233
|
-
logger.log(`\n📋 Available registries:`);
|
|
234
|
-
for (const reg of registries) {
|
|
235
|
-
logger.log(
|
|
236
|
-
` - ${reg.registryName}: ${reg.registryUrl} (${reg.registryId})`,
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
logger.log(`\n To use a registry, run with --registry-id <id>`);
|
|
240
|
-
}
|
|
241
|
-
} catch {
|
|
242
|
-
// Ignore registry listing errors
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Step 5: Build config
|
|
247
|
-
const config: DokployDeployConfig = {
|
|
248
|
-
endpoint,
|
|
249
|
-
projectId,
|
|
250
|
-
applicationId: application.applicationId,
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
// Step 6: Update gkm.config.ts
|
|
254
|
-
await updateConfig(config);
|
|
255
|
-
|
|
256
|
-
logger.log(`\n✅ Dokploy deployment initialized!`);
|
|
257
|
-
logger.log(`\n📋 Configuration:`);
|
|
258
|
-
logger.log(` Project ID: ${projectId}`);
|
|
259
|
-
logger.log(` Application ID: ${application.applicationId}`);
|
|
260
|
-
logger.log(`\n🔗 View in Dokploy: ${endpoint}/project/${projectId}`);
|
|
261
|
-
logger.log(`\n📝 Next steps:`);
|
|
262
|
-
logger.log(` 1. Initialize secrets: gkm secrets:init --stage production`);
|
|
263
|
-
logger.log(` 2. Deploy: gkm deploy --provider dokploy --stage production`);
|
|
264
|
-
|
|
265
|
-
return config;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* List available Dokploy resources
|
|
270
|
-
*/
|
|
271
|
-
export async function deployListCommand(options: {
|
|
272
|
-
endpoint?: string;
|
|
273
|
-
resource: 'projects' | 'registries';
|
|
274
|
-
}): Promise<void> {
|
|
275
|
-
const endpoint = await getEndpoint(options.endpoint);
|
|
276
|
-
const api = await createApi(endpoint);
|
|
277
|
-
|
|
278
|
-
const { resource } = options;
|
|
279
|
-
|
|
280
|
-
if (resource === 'projects') {
|
|
281
|
-
logger.log(`\n📁 Projects in ${endpoint}:`);
|
|
282
|
-
const projects = await api.listProjects();
|
|
283
|
-
|
|
284
|
-
if (projects.length === 0) {
|
|
285
|
-
logger.log(' No projects found');
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
for (const project of projects) {
|
|
290
|
-
logger.log(`\n ${project.name} (${project.projectId})`);
|
|
291
|
-
if (project.description) {
|
|
292
|
-
logger.log(` ${project.description}`);
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
} else if (resource === 'registries') {
|
|
296
|
-
logger.log(`\n🐳 Registries in ${endpoint}:`);
|
|
297
|
-
const registries = await api.listRegistries();
|
|
298
|
-
|
|
299
|
-
if (registries.length === 0) {
|
|
300
|
-
logger.log(' No registries configured');
|
|
301
|
-
logger.log(' Run "gkm registry:setup" to configure a registry');
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const storedRegistryId = await getDokployRegistryId();
|
|
306
|
-
|
|
307
|
-
for (const registry of registries) {
|
|
308
|
-
const isDefault = registry.registryId === storedRegistryId;
|
|
309
|
-
const marker = isDefault ? ' (default)' : '';
|
|
310
|
-
logger.log(
|
|
311
|
-
`\n ${registry.registryName}${marker} (${registry.registryId})`,
|
|
312
|
-
);
|
|
313
|
-
logger.log(` URL: ${registry.registryUrl}`);
|
|
314
|
-
logger.log(` Username: ${registry.username}`);
|
|
315
|
-
if (registry.imagePrefix) {
|
|
316
|
-
logger.log(` Prefix: ${registry.imagePrefix}`);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Setup a Docker registry in Dokploy
|
|
324
|
-
*/
|
|
325
|
-
export async function registrySetupCommand(
|
|
326
|
-
options: RegistrySetupOptions,
|
|
327
|
-
): Promise<string> {
|
|
328
|
-
const { registryName, registryUrl, username, password, imagePrefix } =
|
|
329
|
-
options;
|
|
330
|
-
|
|
331
|
-
const endpoint = await getEndpoint(options.endpoint);
|
|
332
|
-
const api = await createApi(endpoint);
|
|
333
|
-
|
|
334
|
-
logger.log(`\n🐳 Setting up Docker registry in Dokploy...`);
|
|
335
|
-
logger.log(` Endpoint: ${endpoint}`);
|
|
336
|
-
|
|
337
|
-
// Check if registry with same URL already exists
|
|
338
|
-
const existingRegistries = await api.listRegistries();
|
|
339
|
-
const existing = existingRegistries.find(
|
|
340
|
-
(r) =>
|
|
341
|
-
r.registryUrl === registryUrl ||
|
|
342
|
-
r.registryName.toLowerCase() === registryName.toLowerCase(),
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
let registryId: string;
|
|
346
|
-
|
|
347
|
-
if (existing) {
|
|
348
|
-
logger.log(`\n📋 Found existing registry: ${existing.registryName}`);
|
|
349
|
-
logger.log(` Updating credentials...`);
|
|
350
|
-
|
|
351
|
-
await api.updateRegistry(existing.registryId, {
|
|
352
|
-
registryName,
|
|
353
|
-
username,
|
|
354
|
-
password,
|
|
355
|
-
imagePrefix,
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
registryId = existing.registryId;
|
|
359
|
-
logger.log(` ✓ Registry updated: ${registryId}`);
|
|
360
|
-
} else {
|
|
361
|
-
logger.log(`\n📦 Creating registry: ${registryName}`);
|
|
362
|
-
|
|
363
|
-
const registry = await api.createRegistry(
|
|
364
|
-
registryName,
|
|
365
|
-
registryUrl,
|
|
366
|
-
username,
|
|
367
|
-
password,
|
|
368
|
-
{ imagePrefix },
|
|
369
|
-
);
|
|
370
|
-
|
|
371
|
-
registryId = registry.registryId;
|
|
372
|
-
logger.log(` ✓ Registry created: ${registryId}`);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Store registry ID in credentials
|
|
376
|
-
await storeDokployRegistryId(registryId);
|
|
377
|
-
logger.log(`\n💾 Saved registry ID to ~/.gkm/credentials.json`);
|
|
378
|
-
|
|
379
|
-
logger.log(`\n✅ Registry setup complete!`);
|
|
380
|
-
logger.log(`\n📋 Registry Details:`);
|
|
381
|
-
logger.log(` ID: ${registryId}`);
|
|
382
|
-
logger.log(` Name: ${registryName}`);
|
|
383
|
-
logger.log(` URL: ${registryUrl}`);
|
|
384
|
-
logger.log(` Username: ${username}`);
|
|
385
|
-
if (imagePrefix) {
|
|
386
|
-
logger.log(` Prefix: ${imagePrefix}`);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
logger.log(
|
|
390
|
-
`\n📝 The registry ID is now stored and will be used automatically`,
|
|
391
|
-
);
|
|
392
|
-
logger.log(` when deploying with "gkm deploy --provider dokploy"`);
|
|
393
|
-
|
|
394
|
-
return registryId;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Use an existing registry (set as default)
|
|
399
|
-
*/
|
|
400
|
-
export async function registryUseCommand(options: {
|
|
401
|
-
endpoint?: string;
|
|
402
|
-
registryId: string;
|
|
403
|
-
}): Promise<void> {
|
|
404
|
-
const { registryId } = options;
|
|
405
|
-
|
|
406
|
-
const endpoint = await getEndpoint(options.endpoint);
|
|
407
|
-
const api = await createApi(endpoint);
|
|
408
|
-
|
|
409
|
-
logger.log(`\n🔧 Setting default registry...`);
|
|
410
|
-
|
|
411
|
-
// Verify the registry exists
|
|
412
|
-
try {
|
|
413
|
-
const registry = await api.getRegistry(registryId);
|
|
414
|
-
logger.log(` Found registry: ${registry.registryName}`);
|
|
415
|
-
} catch {
|
|
416
|
-
throw new Error(
|
|
417
|
-
`Registry not found: ${registryId}\n` +
|
|
418
|
-
'Run "gkm deploy:list registries" to see available registries.',
|
|
419
|
-
);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// Store registry ID in credentials
|
|
423
|
-
await storeDokployRegistryId(registryId);
|
|
424
|
-
|
|
425
|
-
logger.log(`\n✅ Default registry set: ${registryId}`);
|
|
426
|
-
logger.log(` This registry will be used for future deployments.`);
|
|
427
|
-
}
|
package/src/deploy/secrets.ts
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { encryptSecrets } from '../secrets/encryption.js';
|
|
2
|
-
import { toEmbeddableSecrets } from '../secrets/storage.js';
|
|
3
|
-
import type {
|
|
4
|
-
EmbeddableSecrets,
|
|
5
|
-
EncryptedPayload,
|
|
6
|
-
StageSecrets,
|
|
7
|
-
} from '../secrets/types.js';
|
|
8
|
-
import type { SniffedEnvironment } from './sniffer.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Result of filtering secrets for an app.
|
|
12
|
-
*/
|
|
13
|
-
export interface FilteredAppSecrets {
|
|
14
|
-
appName: string;
|
|
15
|
-
/** Secrets filtered to only include what the app needs */
|
|
16
|
-
secrets: EmbeddableSecrets;
|
|
17
|
-
/** List of required env vars that were found in secrets */
|
|
18
|
-
found: string[];
|
|
19
|
-
/** List of required env vars that were NOT found in secrets */
|
|
20
|
-
missing: string[];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Filter secrets to only include the env vars that an app requires.
|
|
25
|
-
*
|
|
26
|
-
* @param stageSecrets - All secrets for the stage
|
|
27
|
-
* @param sniffedEnv - The sniffed environment requirements for the app
|
|
28
|
-
* @returns Filtered secrets with found/missing tracking
|
|
29
|
-
*/
|
|
30
|
-
export function filterSecretsForApp(
|
|
31
|
-
stageSecrets: StageSecrets,
|
|
32
|
-
sniffedEnv: SniffedEnvironment,
|
|
33
|
-
): FilteredAppSecrets {
|
|
34
|
-
// Convert stage secrets to flat embeddable format
|
|
35
|
-
const allSecrets = toEmbeddableSecrets(stageSecrets);
|
|
36
|
-
const filtered: EmbeddableSecrets = {};
|
|
37
|
-
const found: string[] = [];
|
|
38
|
-
const missing: string[] = [];
|
|
39
|
-
|
|
40
|
-
// Filter to only required env vars
|
|
41
|
-
for (const key of sniffedEnv.requiredEnvVars) {
|
|
42
|
-
if (key in allSecrets) {
|
|
43
|
-
filtered[key] = allSecrets[key]!;
|
|
44
|
-
found.push(key);
|
|
45
|
-
} else {
|
|
46
|
-
missing.push(key);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
appName: sniffedEnv.appName,
|
|
52
|
-
secrets: filtered,
|
|
53
|
-
found: found.sort(),
|
|
54
|
-
missing: missing.sort(),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Result of encrypting secrets for an app.
|
|
60
|
-
*/
|
|
61
|
-
export interface EncryptedAppSecrets {
|
|
62
|
-
appName: string;
|
|
63
|
-
/** Encrypted payload with credentials and IV */
|
|
64
|
-
payload: EncryptedPayload;
|
|
65
|
-
/** Master key for runtime decryption (hex encoded) */
|
|
66
|
-
masterKey: string;
|
|
67
|
-
/** Number of secrets encrypted */
|
|
68
|
-
secretCount: number;
|
|
69
|
-
/** List of required env vars that were NOT found in secrets */
|
|
70
|
-
missingSecrets: string[];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Encrypt filtered secrets for an app.
|
|
75
|
-
* Generates an ephemeral master key that should be injected into Dokploy.
|
|
76
|
-
*
|
|
77
|
-
* @param filteredSecrets - The filtered secrets for the app
|
|
78
|
-
* @returns Encrypted payload with master key
|
|
79
|
-
*/
|
|
80
|
-
export function encryptSecretsForApp(
|
|
81
|
-
filteredSecrets: FilteredAppSecrets,
|
|
82
|
-
): EncryptedAppSecrets {
|
|
83
|
-
const payload = encryptSecrets(filteredSecrets.secrets);
|
|
84
|
-
|
|
85
|
-
return {
|
|
86
|
-
appName: filteredSecrets.appName,
|
|
87
|
-
payload,
|
|
88
|
-
masterKey: payload.masterKey,
|
|
89
|
-
secretCount: Object.keys(filteredSecrets.secrets).length,
|
|
90
|
-
missingSecrets: filteredSecrets.missing,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Filter and encrypt secrets for an app in one step.
|
|
96
|
-
*
|
|
97
|
-
* @param stageSecrets - All secrets for the stage
|
|
98
|
-
* @param sniffedEnv - The sniffed environment requirements for the app
|
|
99
|
-
* @returns Encrypted secrets with master key
|
|
100
|
-
*/
|
|
101
|
-
export function prepareSecretsForApp(
|
|
102
|
-
stageSecrets: StageSecrets,
|
|
103
|
-
sniffedEnv: SniffedEnvironment,
|
|
104
|
-
): EncryptedAppSecrets {
|
|
105
|
-
const filtered = filterSecretsForApp(stageSecrets, sniffedEnv);
|
|
106
|
-
return encryptSecretsForApp(filtered);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Prepare secrets for multiple apps.
|
|
111
|
-
*
|
|
112
|
-
* @param stageSecrets - All secrets for the stage
|
|
113
|
-
* @param sniffedApps - Map of app name to sniffed environment
|
|
114
|
-
* @returns Map of app name to encrypted secrets
|
|
115
|
-
*/
|
|
116
|
-
export function prepareSecretsForAllApps(
|
|
117
|
-
stageSecrets: StageSecrets,
|
|
118
|
-
sniffedApps: Map<string, SniffedEnvironment>,
|
|
119
|
-
): Map<string, EncryptedAppSecrets> {
|
|
120
|
-
const results = new Map<string, EncryptedAppSecrets>();
|
|
121
|
-
|
|
122
|
-
for (const [appName, sniffedEnv] of sniffedApps) {
|
|
123
|
-
// Only prepare secrets for apps that have required env vars
|
|
124
|
-
if (sniffedEnv.requiredEnvVars.length > 0) {
|
|
125
|
-
const encrypted = prepareSecretsForApp(stageSecrets, sniffedEnv);
|
|
126
|
-
results.set(appName, encrypted);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return results;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Report on secrets preparation status for all apps.
|
|
135
|
-
*/
|
|
136
|
-
export interface SecretsReport {
|
|
137
|
-
/** Total number of apps processed */
|
|
138
|
-
totalApps: number;
|
|
139
|
-
/** Apps with encrypted secrets */
|
|
140
|
-
appsWithSecrets: string[];
|
|
141
|
-
/** Apps without secrets (frontends or no env requirements) */
|
|
142
|
-
appsWithoutSecrets: string[];
|
|
143
|
-
/** Apps with missing secrets (warnings) */
|
|
144
|
-
appsWithMissingSecrets: Array<{
|
|
145
|
-
appName: string;
|
|
146
|
-
missing: string[];
|
|
147
|
-
}>;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Generate a report on secrets preparation.
|
|
152
|
-
*/
|
|
153
|
-
export function generateSecretsReport(
|
|
154
|
-
encryptedApps: Map<string, EncryptedAppSecrets>,
|
|
155
|
-
sniffedApps: Map<string, SniffedEnvironment>,
|
|
156
|
-
): SecretsReport {
|
|
157
|
-
const appsWithSecrets: string[] = [];
|
|
158
|
-
const appsWithoutSecrets: string[] = [];
|
|
159
|
-
const appsWithMissingSecrets: Array<{ appName: string; missing: string[] }> =
|
|
160
|
-
[];
|
|
161
|
-
|
|
162
|
-
for (const [appName, sniffedEnv] of sniffedApps) {
|
|
163
|
-
if (sniffedEnv.requiredEnvVars.length === 0) {
|
|
164
|
-
appsWithoutSecrets.push(appName);
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const encrypted = encryptedApps.get(appName);
|
|
169
|
-
if (encrypted) {
|
|
170
|
-
appsWithSecrets.push(appName);
|
|
171
|
-
|
|
172
|
-
if (encrypted.missingSecrets.length > 0) {
|
|
173
|
-
appsWithMissingSecrets.push({
|
|
174
|
-
appName,
|
|
175
|
-
missing: encrypted.missingSecrets,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return {
|
|
182
|
-
totalApps: sniffedApps.size,
|
|
183
|
-
appsWithSecrets: appsWithSecrets.sort(),
|
|
184
|
-
appsWithoutSecrets: appsWithoutSecrets.sort(),
|
|
185
|
-
appsWithMissingSecrets,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Patched @geekmidas/envkit module for entry app sniffing.
|
|
3
|
-
*
|
|
4
|
-
* This module re-exports the SnifferEnvironmentParser as EnvironmentParser,
|
|
5
|
-
* allowing entry apps to be imported while capturing their env var usage.
|
|
6
|
-
*
|
|
7
|
-
* The actual sniffer instance is stored in globalThis.__envSniffer
|
|
8
|
-
* so the worker script can retrieve the captured variables.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { SnifferEnvironmentParser } from '@geekmidas/envkit/sniffer';
|
|
12
|
-
|
|
13
|
-
// Extend globalThis type for the sniffer instance
|
|
14
|
-
declare global {
|
|
15
|
-
// eslint-disable-next-line no-var
|
|
16
|
-
var __envSniffer: SnifferEnvironmentParser | undefined;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Create a shared sniffer instance that will be used by all imports
|
|
20
|
-
// This is stored globally so the worker script can access it
|
|
21
|
-
if (!globalThis.__envSniffer) {
|
|
22
|
-
globalThis.__envSniffer = new SnifferEnvironmentParser();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Type for the config parser returned by create()
|
|
26
|
-
interface ConfigParser<T> {
|
|
27
|
-
parse(): T;
|
|
28
|
-
safeParse(): { success: true; data: T } | { success: false; error: Error };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Type for the env fetcher function
|
|
32
|
-
type EnvFetcher = (name: string) => {
|
|
33
|
-
string(): { parse(): string; safeParse(): unknown };
|
|
34
|
-
number(): { parse(): number; safeParse(): unknown };
|
|
35
|
-
boolean(): { parse(): boolean; safeParse(): unknown };
|
|
36
|
-
optional(): EnvFetcher;
|
|
37
|
-
default(value: unknown): EnvFetcher;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Patched EnvironmentParser that uses the global sniffer instance.
|
|
42
|
-
*
|
|
43
|
-
* This class wraps the global sniffer to maintain API compatibility
|
|
44
|
-
* with the real EnvironmentParser. The constructor accepts an env
|
|
45
|
-
* parameter for API compatibility but ignores it since we're sniffing.
|
|
46
|
-
*/
|
|
47
|
-
class PatchedEnvironmentParser {
|
|
48
|
-
create<TReturn extends Record<string, unknown>>(
|
|
49
|
-
builder: (get: EnvFetcher) => TReturn,
|
|
50
|
-
): ConfigParser<TReturn> {
|
|
51
|
-
return globalThis.__envSniffer!.create(
|
|
52
|
-
builder as any,
|
|
53
|
-
) as unknown as ConfigParser<TReturn>;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Export the patched parser as EnvironmentParser
|
|
58
|
-
export { PatchedEnvironmentParser as EnvironmentParser };
|
|
59
|
-
|
|
60
|
-
// Re-export other envkit exports that entry apps might use
|
|
61
|
-
export { SnifferEnvironmentParser } from '@geekmidas/envkit/sniffer';
|