@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/dns/index.ts
DELETED
|
@@ -1,627 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DNS orchestration for deployments
|
|
3
|
-
*
|
|
4
|
-
* Handles automatic DNS record creation for deployed applications.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { lookup } from 'node:dns/promises';
|
|
8
|
-
import type {
|
|
9
|
-
DnsConfig,
|
|
10
|
-
DnsProvider as DnsProviderConfig,
|
|
11
|
-
} from '../../workspace/types';
|
|
12
|
-
import {
|
|
13
|
-
type DokployStageState,
|
|
14
|
-
isDnsVerified,
|
|
15
|
-
setDnsRecord,
|
|
16
|
-
setDnsVerification,
|
|
17
|
-
} from '../state';
|
|
18
|
-
import {
|
|
19
|
-
createDnsProvider,
|
|
20
|
-
type DnsProvider,
|
|
21
|
-
type DnsConfig as SchemaDnsConfig,
|
|
22
|
-
type UpsertDnsRecord,
|
|
23
|
-
} from './DnsProvider';
|
|
24
|
-
|
|
25
|
-
const logger = console;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Check if DNS config is legacy format (single domain with `domain` property)
|
|
29
|
-
*/
|
|
30
|
-
export function isLegacyDnsConfig(
|
|
31
|
-
config: DnsConfig,
|
|
32
|
-
): config is SchemaDnsConfig & { domain: string } {
|
|
33
|
-
return (
|
|
34
|
-
typeof config === 'object' &&
|
|
35
|
-
config !== null &&
|
|
36
|
-
'provider' in config &&
|
|
37
|
-
'domain' in config
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Normalize DNS config to new multi-domain format
|
|
43
|
-
*/
|
|
44
|
-
export function normalizeDnsConfig(
|
|
45
|
-
config: DnsConfig,
|
|
46
|
-
): Record<string, DnsProviderConfig> {
|
|
47
|
-
if (isLegacyDnsConfig(config)) {
|
|
48
|
-
// Convert legacy format to new format
|
|
49
|
-
const { domain, ...providerConfig } = config;
|
|
50
|
-
return { [domain]: providerConfig as DnsProviderConfig };
|
|
51
|
-
}
|
|
52
|
-
return config as Record<string, DnsProviderConfig>;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Find the root domain for a hostname from available DNS configs
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* findRootDomain('api.geekmidas.com', { 'geekmidas.com': {...}, 'geekmidas.dev': {...} })
|
|
60
|
-
* // Returns 'geekmidas.com'
|
|
61
|
-
*/
|
|
62
|
-
export function findRootDomain(
|
|
63
|
-
hostname: string,
|
|
64
|
-
dnsConfig: Record<string, DnsProviderConfig>,
|
|
65
|
-
): string | null {
|
|
66
|
-
// Sort domains by length descending to match most specific first
|
|
67
|
-
const domains = Object.keys(dnsConfig).sort((a, b) => b.length - a.length);
|
|
68
|
-
|
|
69
|
-
for (const domain of domains) {
|
|
70
|
-
if (hostname === domain || hostname.endsWith(`.${domain}`)) {
|
|
71
|
-
return domain;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Group hostnames by their root domain
|
|
80
|
-
*/
|
|
81
|
-
export function groupHostnamesByDomain(
|
|
82
|
-
appHostnames: Map<string, string>,
|
|
83
|
-
dnsConfig: Record<string, DnsProviderConfig>,
|
|
84
|
-
): Map<string, Map<string, string>> {
|
|
85
|
-
const grouped = new Map<string, Map<string, string>>();
|
|
86
|
-
|
|
87
|
-
for (const [appName, hostname] of appHostnames) {
|
|
88
|
-
const rootDomain = findRootDomain(hostname, dnsConfig);
|
|
89
|
-
if (!rootDomain) {
|
|
90
|
-
logger.log(` ⚠ No DNS config found for hostname: ${hostname}`);
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (!grouped.has(rootDomain)) {
|
|
95
|
-
grouped.set(rootDomain, new Map());
|
|
96
|
-
}
|
|
97
|
-
grouped.get(rootDomain)!.set(appName, hostname);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return grouped;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Required DNS record for an app
|
|
105
|
-
*/
|
|
106
|
-
export interface RequiredDnsRecord {
|
|
107
|
-
/** Full hostname (e.g., 'api.joemoer.traflabs.io') */
|
|
108
|
-
hostname: string;
|
|
109
|
-
/** Subdomain part for the DNS provider (e.g., 'api.joemoer') */
|
|
110
|
-
subdomain: string;
|
|
111
|
-
/** Record type */
|
|
112
|
-
type: 'A' | 'CNAME';
|
|
113
|
-
/** Target value (IP or hostname) */
|
|
114
|
-
value: string;
|
|
115
|
-
/** App name */
|
|
116
|
-
appName: string;
|
|
117
|
-
/** Whether the record was created */
|
|
118
|
-
created?: boolean;
|
|
119
|
-
/** Whether the record already existed */
|
|
120
|
-
existed?: boolean;
|
|
121
|
-
/** Error if creation failed */
|
|
122
|
-
error?: string;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Result of DNS record creation
|
|
127
|
-
*/
|
|
128
|
-
export interface DnsCreationResult {
|
|
129
|
-
records: RequiredDnsRecord[];
|
|
130
|
-
success: boolean;
|
|
131
|
-
serverIp: string;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Resolve IP address from a hostname
|
|
136
|
-
*/
|
|
137
|
-
export async function resolveHostnameToIp(hostname: string): Promise<string> {
|
|
138
|
-
try {
|
|
139
|
-
const addresses = await lookup(hostname, { family: 4 });
|
|
140
|
-
return addresses.address;
|
|
141
|
-
} catch (error) {
|
|
142
|
-
throw new Error(
|
|
143
|
-
`Failed to resolve IP for ${hostname}: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Extract subdomain from full hostname relative to root domain
|
|
150
|
-
*
|
|
151
|
-
* @example
|
|
152
|
-
* extractSubdomain('api.joemoer.traflabs.io', 'traflabs.io') => 'api.joemoer'
|
|
153
|
-
* extractSubdomain('joemoer.traflabs.io', 'traflabs.io') => 'joemoer'
|
|
154
|
-
*/
|
|
155
|
-
export function extractSubdomain(hostname: string, rootDomain: string): string {
|
|
156
|
-
if (!hostname.endsWith(rootDomain)) {
|
|
157
|
-
throw new Error(
|
|
158
|
-
`Hostname ${hostname} is not under root domain ${rootDomain}`,
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const subdomain = hostname.slice(0, -(rootDomain.length + 1)); // +1 for the dot
|
|
163
|
-
return subdomain || '@'; // '@' represents the root domain itself
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Generate required DNS records for a deployment
|
|
168
|
-
*/
|
|
169
|
-
export function generateRequiredRecords(
|
|
170
|
-
appHostnames: Map<string, string>, // appName -> hostname
|
|
171
|
-
rootDomain: string,
|
|
172
|
-
serverIp: string,
|
|
173
|
-
): RequiredDnsRecord[] {
|
|
174
|
-
const records: RequiredDnsRecord[] = [];
|
|
175
|
-
|
|
176
|
-
for (const [appName, hostname] of appHostnames) {
|
|
177
|
-
const subdomain = extractSubdomain(hostname, rootDomain);
|
|
178
|
-
records.push({
|
|
179
|
-
hostname,
|
|
180
|
-
subdomain,
|
|
181
|
-
type: 'A',
|
|
182
|
-
value: serverIp,
|
|
183
|
-
appName,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return records;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Print DNS records table
|
|
192
|
-
*/
|
|
193
|
-
export function printDnsRecordsTable(
|
|
194
|
-
records: RequiredDnsRecord[],
|
|
195
|
-
rootDomain: string,
|
|
196
|
-
): void {
|
|
197
|
-
logger.log(`\n 📋 DNS Records for ${rootDomain}:`);
|
|
198
|
-
logger.log(
|
|
199
|
-
' ┌─────────────────────────────────────┬──────┬─────────────────┬────────┐',
|
|
200
|
-
);
|
|
201
|
-
logger.log(
|
|
202
|
-
' │ Subdomain │ Type │ Value │ Status │',
|
|
203
|
-
);
|
|
204
|
-
logger.log(
|
|
205
|
-
' ├─────────────────────────────────────┼──────┼─────────────────┼────────┤',
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
for (const record of records) {
|
|
209
|
-
const subdomain = record.subdomain.padEnd(35);
|
|
210
|
-
const type = record.type.padEnd(4);
|
|
211
|
-
const value = record.value.padEnd(15);
|
|
212
|
-
let status: string;
|
|
213
|
-
|
|
214
|
-
if (record.error) {
|
|
215
|
-
status = '✗';
|
|
216
|
-
} else if (record.created) {
|
|
217
|
-
status = '✓ new';
|
|
218
|
-
} else if (record.existed) {
|
|
219
|
-
status = '✓';
|
|
220
|
-
} else {
|
|
221
|
-
status = '?';
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
logger.log(
|
|
225
|
-
` │ ${subdomain} │ ${type} │ ${value} │ ${status.padEnd(6)} │`,
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
logger.log(
|
|
230
|
-
' └─────────────────────────────────────┴──────┴─────────────────┴────────┘',
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Print DNS records in a simple format for manual setup
|
|
236
|
-
*/
|
|
237
|
-
export function printDnsRecordsSimple(
|
|
238
|
-
records: RequiredDnsRecord[],
|
|
239
|
-
rootDomain: string,
|
|
240
|
-
): void {
|
|
241
|
-
logger.log('\n 📋 Required DNS Records:');
|
|
242
|
-
logger.log(` Add these A records to your DNS provider (${rootDomain}):\n`);
|
|
243
|
-
|
|
244
|
-
for (const record of records) {
|
|
245
|
-
logger.log(` ${record.subdomain} → ${record.value} (A record)`);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
logger.log('');
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Create DNS records for a single domain using its configured provider
|
|
253
|
-
*/
|
|
254
|
-
export async function createDnsRecordsForDomain(
|
|
255
|
-
records: RequiredDnsRecord[],
|
|
256
|
-
rootDomain: string,
|
|
257
|
-
providerConfig: DnsProviderConfig,
|
|
258
|
-
): Promise<RequiredDnsRecord[]> {
|
|
259
|
-
// Get TTL from config, default to 300. Manual mode doesn't have ttl property.
|
|
260
|
-
const ttl =
|
|
261
|
-
'ttl' in providerConfig && providerConfig.ttl ? providerConfig.ttl : 300;
|
|
262
|
-
|
|
263
|
-
// Get DNS provider from factory
|
|
264
|
-
let provider: DnsProvider | null;
|
|
265
|
-
try {
|
|
266
|
-
// Cast to schema-derived DnsConfig for provider factory
|
|
267
|
-
provider = await createDnsProvider({
|
|
268
|
-
config: providerConfig as SchemaDnsConfig,
|
|
269
|
-
});
|
|
270
|
-
} catch (error) {
|
|
271
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
272
|
-
logger.log(
|
|
273
|
-
` ⚠ Failed to create DNS provider for ${rootDomain}: ${message}`,
|
|
274
|
-
);
|
|
275
|
-
return records.map((r) => ({ ...r, error: message }));
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Manual mode - no provider, just mark records as needing manual creation
|
|
279
|
-
if (!provider) {
|
|
280
|
-
return records.map((r) => ({ ...r, created: false, existed: false }));
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const results: RequiredDnsRecord[] = [];
|
|
284
|
-
|
|
285
|
-
// Convert RequiredDnsRecord to UpsertDnsRecord format
|
|
286
|
-
const upsertRecords: UpsertDnsRecord[] = records.map((r) => ({
|
|
287
|
-
name: r.subdomain,
|
|
288
|
-
type: r.type,
|
|
289
|
-
ttl,
|
|
290
|
-
value: r.value,
|
|
291
|
-
}));
|
|
292
|
-
|
|
293
|
-
try {
|
|
294
|
-
// Use provider to upsert records
|
|
295
|
-
const upsertResults = await provider.upsertRecords(
|
|
296
|
-
rootDomain,
|
|
297
|
-
upsertRecords,
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
// Map results back to RequiredDnsRecord format
|
|
301
|
-
for (const [i, record] of records.entries()) {
|
|
302
|
-
const result = upsertResults[i];
|
|
303
|
-
|
|
304
|
-
// Handle case where upsertResults has fewer items (shouldn't happen but be safe)
|
|
305
|
-
if (!result) {
|
|
306
|
-
results.push({
|
|
307
|
-
hostname: record.hostname,
|
|
308
|
-
subdomain: record.subdomain,
|
|
309
|
-
type: record.type,
|
|
310
|
-
value: record.value,
|
|
311
|
-
appName: record.appName,
|
|
312
|
-
error: 'No result returned from provider',
|
|
313
|
-
});
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (result.unchanged) {
|
|
318
|
-
results.push({
|
|
319
|
-
hostname: record.hostname,
|
|
320
|
-
subdomain: record.subdomain,
|
|
321
|
-
type: record.type,
|
|
322
|
-
value: record.value,
|
|
323
|
-
appName: record.appName,
|
|
324
|
-
existed: true,
|
|
325
|
-
created: false,
|
|
326
|
-
});
|
|
327
|
-
} else {
|
|
328
|
-
results.push({
|
|
329
|
-
hostname: record.hostname,
|
|
330
|
-
subdomain: record.subdomain,
|
|
331
|
-
type: record.type,
|
|
332
|
-
value: record.value,
|
|
333
|
-
appName: record.appName,
|
|
334
|
-
created: result.created,
|
|
335
|
-
existed: !result.created,
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
} catch (error) {
|
|
340
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
341
|
-
logger.log(
|
|
342
|
-
` ⚠ Failed to create DNS records for ${rootDomain}: ${message}`,
|
|
343
|
-
);
|
|
344
|
-
return records.map((r) => ({
|
|
345
|
-
hostname: r.hostname,
|
|
346
|
-
subdomain: r.subdomain,
|
|
347
|
-
type: r.type,
|
|
348
|
-
value: r.value,
|
|
349
|
-
appName: r.appName,
|
|
350
|
-
error: message,
|
|
351
|
-
}));
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
return results;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Create DNS records using the configured provider
|
|
359
|
-
* @deprecated Use createDnsRecordsForDomain for multi-domain support
|
|
360
|
-
*/
|
|
361
|
-
export async function createDnsRecords(
|
|
362
|
-
records: RequiredDnsRecord[],
|
|
363
|
-
dnsConfig: DnsConfig,
|
|
364
|
-
): Promise<RequiredDnsRecord[]> {
|
|
365
|
-
// Handle legacy config format
|
|
366
|
-
if (!isLegacyDnsConfig(dnsConfig)) {
|
|
367
|
-
throw new Error(
|
|
368
|
-
'createDnsRecords requires legacy DnsConfig with domain property. Use createDnsRecordsForDomain instead.',
|
|
369
|
-
);
|
|
370
|
-
}
|
|
371
|
-
const { domain: rootDomain, ...providerConfig } = dnsConfig;
|
|
372
|
-
return createDnsRecordsForDomain(
|
|
373
|
-
records,
|
|
374
|
-
rootDomain,
|
|
375
|
-
providerConfig as DnsProviderConfig,
|
|
376
|
-
);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Main DNS orchestration function for deployments
|
|
381
|
-
*
|
|
382
|
-
* Supports both legacy single-domain format and new multi-domain format:
|
|
383
|
-
* - Legacy: { provider: 'hostinger', domain: 'example.com' }
|
|
384
|
-
* - Multi: { 'example.com': { provider: 'hostinger' }, 'example.dev': { provider: 'route53' } }
|
|
385
|
-
*
|
|
386
|
-
* @param appHostnames - Map of app names to hostnames
|
|
387
|
-
* @param dnsConfig - DNS configuration (legacy or multi-domain)
|
|
388
|
-
* @param dokployEndpoint - Dokploy server endpoint to resolve IP from
|
|
389
|
-
* @param state - Optional state to save created records for later deletion
|
|
390
|
-
*/
|
|
391
|
-
export async function orchestrateDns(
|
|
392
|
-
appHostnames: Map<string, string>, // appName -> hostname
|
|
393
|
-
dnsConfig: DnsConfig | undefined,
|
|
394
|
-
dokployEndpoint: string,
|
|
395
|
-
state?: DokployStageState,
|
|
396
|
-
): Promise<DnsCreationResult | null> {
|
|
397
|
-
if (!dnsConfig) {
|
|
398
|
-
return null;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Normalize config to multi-domain format
|
|
402
|
-
const normalizedConfig = normalizeDnsConfig(dnsConfig);
|
|
403
|
-
|
|
404
|
-
// Resolve Dokploy server IP from endpoint
|
|
405
|
-
logger.log('\n🌐 Setting up DNS records...');
|
|
406
|
-
let serverIp: string;
|
|
407
|
-
|
|
408
|
-
try {
|
|
409
|
-
const endpointUrl = new URL(dokployEndpoint);
|
|
410
|
-
serverIp = await resolveHostnameToIp(endpointUrl.hostname);
|
|
411
|
-
logger.log(` Server IP: ${serverIp} (from ${endpointUrl.hostname})`);
|
|
412
|
-
} catch (error) {
|
|
413
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
414
|
-
logger.log(` ⚠ Failed to resolve server IP: ${message}`);
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Group hostnames by their root domain
|
|
419
|
-
const groupedHostnames = groupHostnamesByDomain(
|
|
420
|
-
appHostnames,
|
|
421
|
-
normalizedConfig,
|
|
422
|
-
);
|
|
423
|
-
|
|
424
|
-
if (groupedHostnames.size === 0) {
|
|
425
|
-
logger.log(
|
|
426
|
-
' No DNS records needed (no hostnames match configured domains)',
|
|
427
|
-
);
|
|
428
|
-
return { records: [], success: true, serverIp };
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
const allRecords: RequiredDnsRecord[] = [];
|
|
432
|
-
let hasFailures = false;
|
|
433
|
-
|
|
434
|
-
// Process each domain group with its specific provider
|
|
435
|
-
for (const [rootDomain, domainHostnames] of groupedHostnames) {
|
|
436
|
-
const providerConfig = normalizedConfig[rootDomain];
|
|
437
|
-
if (!providerConfig) {
|
|
438
|
-
logger.log(` ⚠ No provider config for ${rootDomain}`);
|
|
439
|
-
continue;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const providerName =
|
|
443
|
-
typeof providerConfig.provider === 'string'
|
|
444
|
-
? providerConfig.provider
|
|
445
|
-
: 'custom';
|
|
446
|
-
|
|
447
|
-
// Generate required records for this domain
|
|
448
|
-
const requiredRecords = generateRequiredRecords(
|
|
449
|
-
domainHostnames,
|
|
450
|
-
rootDomain,
|
|
451
|
-
serverIp,
|
|
452
|
-
);
|
|
453
|
-
|
|
454
|
-
if (requiredRecords.length === 0) {
|
|
455
|
-
continue;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// Create records for this domain
|
|
459
|
-
logger.log(
|
|
460
|
-
` Creating DNS records for ${rootDomain} (${providerName})...`,
|
|
461
|
-
);
|
|
462
|
-
const domainRecords = await createDnsRecordsForDomain(
|
|
463
|
-
requiredRecords,
|
|
464
|
-
rootDomain,
|
|
465
|
-
providerConfig,
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
allRecords.push(...domainRecords);
|
|
469
|
-
|
|
470
|
-
const created = domainRecords.filter((r) => r.created).length;
|
|
471
|
-
const existed = domainRecords.filter((r) => r.existed).length;
|
|
472
|
-
const failed = domainRecords.filter((r) => r.error).length;
|
|
473
|
-
|
|
474
|
-
if (created > 0) {
|
|
475
|
-
logger.log(` ✓ Created ${created} DNS record(s) for ${rootDomain}`);
|
|
476
|
-
}
|
|
477
|
-
if (existed > 0) {
|
|
478
|
-
logger.log(` ✓ ${existed} record(s) already exist for ${rootDomain}`);
|
|
479
|
-
}
|
|
480
|
-
if (failed > 0) {
|
|
481
|
-
logger.log(` ⚠ ${failed} record(s) failed for ${rootDomain}`);
|
|
482
|
-
hasFailures = true;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
// Save created/existing records to state for later deletion during undeploy
|
|
486
|
-
if (state) {
|
|
487
|
-
for (const record of domainRecords) {
|
|
488
|
-
if (record.created || record.existed) {
|
|
489
|
-
setDnsRecord(state, {
|
|
490
|
-
domain: rootDomain,
|
|
491
|
-
name: record.subdomain,
|
|
492
|
-
type: record.type,
|
|
493
|
-
value: record.value,
|
|
494
|
-
ttl:
|
|
495
|
-
'ttl' in providerConfig && providerConfig.ttl
|
|
496
|
-
? providerConfig.ttl
|
|
497
|
-
: 300,
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// Print summary table for this domain
|
|
504
|
-
printDnsRecordsTable(domainRecords, rootDomain);
|
|
505
|
-
|
|
506
|
-
// If manual mode or some failed, print simple instructions
|
|
507
|
-
if (providerConfig.provider === 'manual' || failed > 0) {
|
|
508
|
-
printDnsRecordsSimple(
|
|
509
|
-
domainRecords.filter((r) => !r.created && !r.existed),
|
|
510
|
-
rootDomain,
|
|
511
|
-
);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
return {
|
|
516
|
-
records: allRecords,
|
|
517
|
-
success: !hasFailures,
|
|
518
|
-
serverIp,
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/**
|
|
523
|
-
* Result of DNS verification for a single hostname
|
|
524
|
-
*/
|
|
525
|
-
export interface DnsVerificationResult {
|
|
526
|
-
hostname: string;
|
|
527
|
-
appName: string;
|
|
528
|
-
verified: boolean;
|
|
529
|
-
resolvedIp?: string;
|
|
530
|
-
expectedIp: string;
|
|
531
|
-
error?: string;
|
|
532
|
-
skipped?: boolean; // True if already verified in state
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* Verify DNS records resolve correctly after deployment.
|
|
537
|
-
*
|
|
538
|
-
* This function:
|
|
539
|
-
* 1. Checks state for previously verified hostnames (skips if already verified with same IP)
|
|
540
|
-
* 2. Attempts to resolve each hostname to an IP
|
|
541
|
-
* 3. Compares resolved IP with expected server IP
|
|
542
|
-
* 4. Updates state with verification results
|
|
543
|
-
*
|
|
544
|
-
* @param appHostnames - Map of app names to hostnames
|
|
545
|
-
* @param serverIp - Expected IP address the hostnames should resolve to
|
|
546
|
-
* @param state - Deploy state for caching verification results
|
|
547
|
-
* @returns Array of verification results
|
|
548
|
-
*/
|
|
549
|
-
export async function verifyDnsRecords(
|
|
550
|
-
appHostnames: Map<string, string>,
|
|
551
|
-
serverIp: string,
|
|
552
|
-
state: DokployStageState,
|
|
553
|
-
): Promise<DnsVerificationResult[]> {
|
|
554
|
-
const results: DnsVerificationResult[] = [];
|
|
555
|
-
|
|
556
|
-
logger.log('\n🔍 Verifying DNS records...');
|
|
557
|
-
|
|
558
|
-
for (const [appName, hostname] of appHostnames) {
|
|
559
|
-
// Check if already verified with same IP
|
|
560
|
-
if (isDnsVerified(state, hostname, serverIp)) {
|
|
561
|
-
logger.log(` ✓ ${hostname} (previously verified)`);
|
|
562
|
-
results.push({
|
|
563
|
-
hostname,
|
|
564
|
-
appName,
|
|
565
|
-
verified: true,
|
|
566
|
-
expectedIp: serverIp,
|
|
567
|
-
skipped: true,
|
|
568
|
-
});
|
|
569
|
-
continue;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
// Attempt to resolve hostname
|
|
573
|
-
try {
|
|
574
|
-
const resolvedIp = await resolveHostnameToIp(hostname);
|
|
575
|
-
|
|
576
|
-
if (resolvedIp === serverIp) {
|
|
577
|
-
// DNS verified successfully
|
|
578
|
-
setDnsVerification(state, hostname, serverIp);
|
|
579
|
-
logger.log(` ✓ ${hostname} → ${resolvedIp}`);
|
|
580
|
-
results.push({
|
|
581
|
-
hostname,
|
|
582
|
-
appName,
|
|
583
|
-
verified: true,
|
|
584
|
-
resolvedIp,
|
|
585
|
-
expectedIp: serverIp,
|
|
586
|
-
});
|
|
587
|
-
} else {
|
|
588
|
-
// DNS resolves but to wrong IP
|
|
589
|
-
logger.log(
|
|
590
|
-
` ⚠ ${hostname} resolves to ${resolvedIp}, expected ${serverIp}`,
|
|
591
|
-
);
|
|
592
|
-
results.push({
|
|
593
|
-
hostname,
|
|
594
|
-
appName,
|
|
595
|
-
verified: false,
|
|
596
|
-
resolvedIp,
|
|
597
|
-
expectedIp: serverIp,
|
|
598
|
-
});
|
|
599
|
-
}
|
|
600
|
-
} catch (error) {
|
|
601
|
-
// DNS resolution failed
|
|
602
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
603
|
-
logger.log(` ⚠ ${hostname} DNS not propagated (${message})`);
|
|
604
|
-
results.push({
|
|
605
|
-
hostname,
|
|
606
|
-
appName,
|
|
607
|
-
verified: false,
|
|
608
|
-
expectedIp: serverIp,
|
|
609
|
-
error: message,
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
// Summary
|
|
615
|
-
const verified = results.filter((r) => r.verified).length;
|
|
616
|
-
const skipped = results.filter((r) => r.skipped).length;
|
|
617
|
-
const pending = results.filter((r) => !r.verified).length;
|
|
618
|
-
|
|
619
|
-
if (pending > 0) {
|
|
620
|
-
logger.log(`\n ${verified} verified, ${pending} pending propagation`);
|
|
621
|
-
logger.log(' DNS changes may take 5-30 minutes to propagate');
|
|
622
|
-
} else if (skipped > 0) {
|
|
623
|
-
logger.log(` ${verified} verified (${skipped} from cache)`);
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
return results;
|
|
627
|
-
}
|