@geekmidas/cli 9.0.2 → 10.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -120
- 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 +2329 -1584
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2306 -1561
- 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/docker/index.ts
DELETED
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import { copyFileSync, existsSync, readFileSync, unlinkSync } from 'node:fs';
|
|
3
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { basename, join } from 'node:path';
|
|
5
|
-
import { loadConfig, loadWorkspaceConfig } from '../config';
|
|
6
|
-
import { getPublicUrlArgNames } from '../deploy/domain.js';
|
|
7
|
-
import type { NormalizedWorkspace } from '../workspace/types.js';
|
|
8
|
-
import {
|
|
9
|
-
generateDockerCompose,
|
|
10
|
-
generateMinimalDockerCompose,
|
|
11
|
-
generateWorkspaceCompose,
|
|
12
|
-
} from './compose';
|
|
13
|
-
import {
|
|
14
|
-
detectPackageManager,
|
|
15
|
-
findLockfilePath,
|
|
16
|
-
generateBackendDockerfile,
|
|
17
|
-
generateDockerEntrypoint,
|
|
18
|
-
generateDockerignore,
|
|
19
|
-
generateEntryDockerfile,
|
|
20
|
-
generateMultiStageDockerfile,
|
|
21
|
-
generateNextjsDockerfile,
|
|
22
|
-
generateNodeWebDockerfile,
|
|
23
|
-
generateSlimDockerfile,
|
|
24
|
-
generateViteStaticDockerfile,
|
|
25
|
-
hasTurboConfig,
|
|
26
|
-
isMonorepo,
|
|
27
|
-
resolveDockerConfig,
|
|
28
|
-
} from './templates';
|
|
29
|
-
|
|
30
|
-
export {
|
|
31
|
-
detectPackageManager,
|
|
32
|
-
findLockfilePath,
|
|
33
|
-
hasTurboConfig,
|
|
34
|
-
isMonorepo,
|
|
35
|
-
} from './templates';
|
|
36
|
-
|
|
37
|
-
const logger = console;
|
|
38
|
-
|
|
39
|
-
export interface DockerOptions {
|
|
40
|
-
/** Build Docker image after generating files */
|
|
41
|
-
build?: boolean;
|
|
42
|
-
/** Push image to registry after building */
|
|
43
|
-
push?: boolean;
|
|
44
|
-
/** Image tag (default: 'latest') */
|
|
45
|
-
tag?: string;
|
|
46
|
-
/** Container registry URL */
|
|
47
|
-
registry?: string;
|
|
48
|
-
/** Use slim Dockerfile (requires pre-built bundle from `gkm build --production`) */
|
|
49
|
-
slim?: boolean;
|
|
50
|
-
/** Enable turbo prune for monorepo optimization */
|
|
51
|
-
turbo?: boolean;
|
|
52
|
-
/** Package name for turbo prune (defaults to package.json name) */
|
|
53
|
-
turboPackage?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface DockerGeneratedFiles {
|
|
57
|
-
dockerfile: string;
|
|
58
|
-
dockerCompose: string;
|
|
59
|
-
dockerignore: string;
|
|
60
|
-
entrypoint: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Docker command implementation
|
|
65
|
-
* Generates Dockerfile, docker-compose.yml, and related files
|
|
66
|
-
*
|
|
67
|
-
* Default: Multi-stage Dockerfile that builds from source inside Docker
|
|
68
|
-
* --slim: Slim Dockerfile that copies pre-built bundle (requires prior build)
|
|
69
|
-
*/
|
|
70
|
-
export async function dockerCommand(
|
|
71
|
-
options: DockerOptions,
|
|
72
|
-
): Promise<DockerGeneratedFiles | WorkspaceDockerResult> {
|
|
73
|
-
// Load config with workspace detection
|
|
74
|
-
const loadedConfig = await loadWorkspaceConfig();
|
|
75
|
-
|
|
76
|
-
// Route to workspace docker mode for multi-app workspaces
|
|
77
|
-
if (loadedConfig.type === 'workspace') {
|
|
78
|
-
logger.log('📦 Detected workspace configuration');
|
|
79
|
-
return workspaceDockerCommand(loadedConfig.workspace, options);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Single-app mode - use existing logic
|
|
83
|
-
const config = await loadConfig();
|
|
84
|
-
const dockerConfig = resolveDockerConfig(config);
|
|
85
|
-
|
|
86
|
-
// Get health check path from production config
|
|
87
|
-
const serverConfig =
|
|
88
|
-
typeof config.providers?.server === 'object'
|
|
89
|
-
? config.providers.server
|
|
90
|
-
: undefined;
|
|
91
|
-
const healthCheckPath = serverConfig?.production?.healthCheck ?? '/health';
|
|
92
|
-
|
|
93
|
-
// Determine Dockerfile type
|
|
94
|
-
// Default: Multi-stage (builds inside Docker for reproducibility)
|
|
95
|
-
// --slim: Requires pre-built bundle
|
|
96
|
-
const useSlim = options.slim === true;
|
|
97
|
-
|
|
98
|
-
if (useSlim) {
|
|
99
|
-
// Verify pre-built bundle exists for slim mode
|
|
100
|
-
const distDir = join(process.cwd(), '.gkm', 'server', 'dist');
|
|
101
|
-
const hasBuild = existsSync(join(distDir, 'server.mjs'));
|
|
102
|
-
|
|
103
|
-
if (!hasBuild) {
|
|
104
|
-
throw new Error(
|
|
105
|
-
'Slim Dockerfile requires a pre-built bundle. Run `gkm build --provider server --production` first, or omit --slim to use multi-stage build.',
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Generate Docker files
|
|
111
|
-
const dockerDir = join(process.cwd(), '.gkm', 'docker');
|
|
112
|
-
await mkdir(dockerDir, { recursive: true });
|
|
113
|
-
|
|
114
|
-
// Detect package manager from lockfiles
|
|
115
|
-
const packageManager = detectPackageManager();
|
|
116
|
-
const inMonorepo = isMonorepo();
|
|
117
|
-
const hasTurbo = hasTurboConfig();
|
|
118
|
-
|
|
119
|
-
// Auto-enable turbo for monorepos with turbo.json
|
|
120
|
-
let useTurbo = options.turbo ?? false;
|
|
121
|
-
if (inMonorepo && !useSlim) {
|
|
122
|
-
if (hasTurbo) {
|
|
123
|
-
useTurbo = true;
|
|
124
|
-
logger.log(' Detected monorepo with turbo.json - using turbo prune');
|
|
125
|
-
} else {
|
|
126
|
-
throw new Error(
|
|
127
|
-
'Monorepo detected but turbo.json not found.\n\n' +
|
|
128
|
-
'Docker builds in monorepos require Turborepo for proper dependency isolation.\n\n' +
|
|
129
|
-
'To fix this:\n' +
|
|
130
|
-
' 1. Install turbo: pnpm add -Dw turbo\n' +
|
|
131
|
-
' 2. Create turbo.json in your monorepo root\n' +
|
|
132
|
-
' 3. Run this command again\n\n' +
|
|
133
|
-
'See: https://turbo.build/repo/docs/guides/tools/docker',
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Get the actual package name from package.json for turbo prune
|
|
139
|
-
let turboPackage = options.turboPackage ?? dockerConfig.imageName;
|
|
140
|
-
if (useTurbo && !options.turboPackage) {
|
|
141
|
-
try {
|
|
142
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
143
|
-
const pkg = require(`${process.cwd()}/package.json`);
|
|
144
|
-
if (pkg.name) {
|
|
145
|
-
turboPackage = pkg.name;
|
|
146
|
-
logger.log(` Turbo package: ${turboPackage}`);
|
|
147
|
-
}
|
|
148
|
-
} catch {
|
|
149
|
-
// Fall back to imageName
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const templateOptions = {
|
|
154
|
-
imageName: dockerConfig.imageName,
|
|
155
|
-
baseImage: dockerConfig.baseImage,
|
|
156
|
-
port: dockerConfig.port,
|
|
157
|
-
healthCheckPath,
|
|
158
|
-
prebuilt: useSlim,
|
|
159
|
-
turbo: useTurbo,
|
|
160
|
-
turboPackage,
|
|
161
|
-
packageManager,
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
// Generate Dockerfile
|
|
165
|
-
const dockerfile = useSlim
|
|
166
|
-
? generateSlimDockerfile(templateOptions)
|
|
167
|
-
: generateMultiStageDockerfile(templateOptions);
|
|
168
|
-
|
|
169
|
-
const dockerMode = useSlim ? 'slim' : useTurbo ? 'turbo' : 'multi-stage';
|
|
170
|
-
|
|
171
|
-
const dockerfilePath = join(dockerDir, 'Dockerfile');
|
|
172
|
-
await writeFile(dockerfilePath, dockerfile);
|
|
173
|
-
logger.log(
|
|
174
|
-
`Generated: .gkm/docker/Dockerfile (${dockerMode}, ${packageManager})`,
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
// Generate docker-compose.yml
|
|
178
|
-
const composeOptions = {
|
|
179
|
-
imageName: dockerConfig.imageName,
|
|
180
|
-
registry: options.registry ?? dockerConfig.registry,
|
|
181
|
-
port: dockerConfig.port,
|
|
182
|
-
healthCheckPath,
|
|
183
|
-
services: dockerConfig.compose?.services ?? {},
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
// Check if there are any services configured
|
|
187
|
-
const hasServices = Array.isArray(composeOptions.services)
|
|
188
|
-
? composeOptions.services.length > 0
|
|
189
|
-
: Object.keys(composeOptions.services).length > 0;
|
|
190
|
-
|
|
191
|
-
const dockerCompose = hasServices
|
|
192
|
-
? generateDockerCompose(composeOptions)
|
|
193
|
-
: generateMinimalDockerCompose(composeOptions);
|
|
194
|
-
|
|
195
|
-
const composePath = join(dockerDir, 'docker-compose.yml');
|
|
196
|
-
await writeFile(composePath, dockerCompose);
|
|
197
|
-
logger.log('Generated: .gkm/docker/docker-compose.yml');
|
|
198
|
-
|
|
199
|
-
// Generate .dockerignore in project root (Docker looks for it there)
|
|
200
|
-
const dockerignore = generateDockerignore();
|
|
201
|
-
const dockerignorePath = join(process.cwd(), '.dockerignore');
|
|
202
|
-
await writeFile(dockerignorePath, dockerignore);
|
|
203
|
-
logger.log('Generated: .dockerignore (project root)');
|
|
204
|
-
|
|
205
|
-
// Generate docker-entrypoint.sh
|
|
206
|
-
const entrypoint = generateDockerEntrypoint();
|
|
207
|
-
const entrypointPath = join(dockerDir, 'docker-entrypoint.sh');
|
|
208
|
-
await writeFile(entrypointPath, entrypoint);
|
|
209
|
-
logger.log('Generated: .gkm/docker/docker-entrypoint.sh');
|
|
210
|
-
|
|
211
|
-
const result: DockerGeneratedFiles = {
|
|
212
|
-
dockerfile: dockerfilePath,
|
|
213
|
-
dockerCompose: composePath,
|
|
214
|
-
dockerignore: dockerignorePath,
|
|
215
|
-
entrypoint: entrypointPath,
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
// Build Docker image if requested
|
|
219
|
-
if (options.build) {
|
|
220
|
-
await buildDockerImage(dockerConfig.imageName, options);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Push Docker image if requested
|
|
224
|
-
if (options.push) {
|
|
225
|
-
await pushDockerImage(dockerConfig.imageName, options);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return result;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Ensure lockfile exists in the build context
|
|
233
|
-
* For monorepos, copies from workspace root if needed
|
|
234
|
-
* Returns cleanup function if file was copied
|
|
235
|
-
*/
|
|
236
|
-
function ensureLockfile(cwd: string): (() => void) | null {
|
|
237
|
-
const lockfilePath = findLockfilePath(cwd);
|
|
238
|
-
|
|
239
|
-
if (!lockfilePath) {
|
|
240
|
-
logger.warn(
|
|
241
|
-
'\n⚠️ No lockfile found. Docker build may fail or use stale dependencies.',
|
|
242
|
-
);
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
const lockfileName = basename(lockfilePath);
|
|
247
|
-
const localLockfile = join(cwd, lockfileName);
|
|
248
|
-
|
|
249
|
-
// If lockfile exists locally (same directory), nothing to do
|
|
250
|
-
if (lockfilePath === localLockfile) {
|
|
251
|
-
return null;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
logger.log(` Copying ${lockfileName} from monorepo root...`);
|
|
255
|
-
copyFileSync(lockfilePath, localLockfile);
|
|
256
|
-
|
|
257
|
-
// Return cleanup function
|
|
258
|
-
return () => {
|
|
259
|
-
try {
|
|
260
|
-
unlinkSync(localLockfile);
|
|
261
|
-
} catch {
|
|
262
|
-
// Ignore cleanup errors
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Build Docker image
|
|
269
|
-
* Uses BuildKit for cache mount support
|
|
270
|
-
*/
|
|
271
|
-
async function buildDockerImage(
|
|
272
|
-
imageName: string,
|
|
273
|
-
options: DockerOptions,
|
|
274
|
-
): Promise<void> {
|
|
275
|
-
const tag = options.tag ?? 'latest';
|
|
276
|
-
const registry = options.registry;
|
|
277
|
-
|
|
278
|
-
const fullImageName = registry
|
|
279
|
-
? `${registry}/${imageName}:${tag}`
|
|
280
|
-
: `${imageName}:${tag}`;
|
|
281
|
-
|
|
282
|
-
logger.log(`\n🐳 Building Docker image: ${fullImageName}`);
|
|
283
|
-
|
|
284
|
-
const cwd = process.cwd();
|
|
285
|
-
|
|
286
|
-
// Ensure lockfile exists (copy from monorepo root if needed)
|
|
287
|
-
const cleanup = ensureLockfile(cwd);
|
|
288
|
-
|
|
289
|
-
try {
|
|
290
|
-
// Use BuildKit for cache mount support (required for --mount=type=cache)
|
|
291
|
-
execSync(
|
|
292
|
-
`DOCKER_BUILDKIT=1 docker build -f .gkm/docker/Dockerfile -t ${fullImageName} .`,
|
|
293
|
-
{
|
|
294
|
-
cwd,
|
|
295
|
-
stdio: 'inherit',
|
|
296
|
-
env: { ...process.env, DOCKER_BUILDKIT: '1' },
|
|
297
|
-
},
|
|
298
|
-
);
|
|
299
|
-
logger.log(`✅ Docker image built: ${fullImageName}`);
|
|
300
|
-
} catch (error) {
|
|
301
|
-
throw new Error(
|
|
302
|
-
`Failed to build Docker image: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
303
|
-
);
|
|
304
|
-
} finally {
|
|
305
|
-
// Clean up copied lockfile
|
|
306
|
-
cleanup?.();
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* Push Docker image to registry
|
|
312
|
-
*/
|
|
313
|
-
async function pushDockerImage(
|
|
314
|
-
imageName: string,
|
|
315
|
-
options: DockerOptions,
|
|
316
|
-
): Promise<void> {
|
|
317
|
-
const tag = options.tag ?? 'latest';
|
|
318
|
-
const registry = options.registry;
|
|
319
|
-
|
|
320
|
-
if (!registry) {
|
|
321
|
-
throw new Error(
|
|
322
|
-
'Registry is required to push Docker image. Use --registry or configure docker.registry in gkm.config.ts',
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const fullImageName = `${registry}/${imageName}:${tag}`;
|
|
327
|
-
|
|
328
|
-
logger.log(`\n🚀 Pushing Docker image: ${fullImageName}`);
|
|
329
|
-
|
|
330
|
-
try {
|
|
331
|
-
execSync(`docker push ${fullImageName}`, {
|
|
332
|
-
cwd: process.cwd(),
|
|
333
|
-
stdio: 'inherit',
|
|
334
|
-
});
|
|
335
|
-
logger.log(`✅ Docker image pushed: ${fullImageName}`);
|
|
336
|
-
} catch (error) {
|
|
337
|
-
throw new Error(
|
|
338
|
-
`Failed to push Docker image: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Result of generating Docker files for a single app in a workspace.
|
|
345
|
-
*/
|
|
346
|
-
export interface AppDockerResult {
|
|
347
|
-
appName: string;
|
|
348
|
-
type: 'backend' | 'web' | 'mobile';
|
|
349
|
-
dockerfile: string;
|
|
350
|
-
imageName: string;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Result of workspace docker command.
|
|
355
|
-
*/
|
|
356
|
-
export interface WorkspaceDockerResult {
|
|
357
|
-
apps: AppDockerResult[];
|
|
358
|
-
dockerCompose: string;
|
|
359
|
-
dockerignore: string;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Get the package name from package.json in an app directory.
|
|
364
|
-
*/
|
|
365
|
-
function getAppPackageName(appPath: string): string | undefined {
|
|
366
|
-
try {
|
|
367
|
-
const pkgPath = join(appPath, 'package.json');
|
|
368
|
-
if (!existsSync(pkgPath)) {
|
|
369
|
-
return undefined;
|
|
370
|
-
}
|
|
371
|
-
const content = readFileSync(pkgPath, 'utf-8');
|
|
372
|
-
const pkg = JSON.parse(content);
|
|
373
|
-
return pkg.name;
|
|
374
|
-
} catch {
|
|
375
|
-
return undefined;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Generate Dockerfiles for all apps in a workspace.
|
|
381
|
-
* @internal Exported for testing
|
|
382
|
-
*/
|
|
383
|
-
export async function workspaceDockerCommand(
|
|
384
|
-
workspace: NormalizedWorkspace,
|
|
385
|
-
options: DockerOptions,
|
|
386
|
-
): Promise<WorkspaceDockerResult> {
|
|
387
|
-
const results: AppDockerResult[] = [];
|
|
388
|
-
const apps = Object.entries(workspace.apps);
|
|
389
|
-
|
|
390
|
-
logger.log(`\n🐳 Generating Dockerfiles for workspace: ${workspace.name}`);
|
|
391
|
-
|
|
392
|
-
// Create docker output directory
|
|
393
|
-
const dockerDir = join(workspace.root, '.gkm', 'docker');
|
|
394
|
-
await mkdir(dockerDir, { recursive: true });
|
|
395
|
-
|
|
396
|
-
// Detect package manager
|
|
397
|
-
const packageManager = detectPackageManager(workspace.root);
|
|
398
|
-
logger.log(` Package manager: ${packageManager}`);
|
|
399
|
-
|
|
400
|
-
// Generate Dockerfile for each app
|
|
401
|
-
for (const [appName, app] of apps) {
|
|
402
|
-
// Mobile apps deploy via their own toolchain (e.g. EAS Build for Expo)
|
|
403
|
-
// — no Docker image is produced.
|
|
404
|
-
if (app.type === 'mobile') {
|
|
405
|
-
logger.log(
|
|
406
|
-
`\n 📱 Skipping Docker for ${appName} (mobile app — deploy via framework toolchain)`,
|
|
407
|
-
);
|
|
408
|
-
continue;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const appPath = app.path;
|
|
412
|
-
const fullAppPath = join(workspace.root, appPath);
|
|
413
|
-
|
|
414
|
-
// Get package name for turbo prune (use package.json name or app name)
|
|
415
|
-
const turboPackage = getAppPackageName(fullAppPath) ?? appName;
|
|
416
|
-
|
|
417
|
-
// Determine image name
|
|
418
|
-
const imageName = appName;
|
|
419
|
-
|
|
420
|
-
const hasEntry = !!app.entry;
|
|
421
|
-
const buildType = hasEntry ? 'entry' : app.type;
|
|
422
|
-
logger.log(`\n 📄 Generating Dockerfile for ${appName} (${buildType})`);
|
|
423
|
-
|
|
424
|
-
let dockerfile: string;
|
|
425
|
-
|
|
426
|
-
if (app.type === 'web') {
|
|
427
|
-
const publicUrlArgs = getPublicUrlArgNames(app);
|
|
428
|
-
const webOpts = {
|
|
429
|
-
imageName,
|
|
430
|
-
baseImage: 'node:22-alpine',
|
|
431
|
-
port: app.port,
|
|
432
|
-
appPath,
|
|
433
|
-
turboPackage,
|
|
434
|
-
packageManager,
|
|
435
|
-
publicUrlArgs,
|
|
436
|
-
};
|
|
437
|
-
|
|
438
|
-
switch (app.framework) {
|
|
439
|
-
case 'vite':
|
|
440
|
-
dockerfile = generateViteStaticDockerfile(webOpts);
|
|
441
|
-
break;
|
|
442
|
-
case 'tanstack-start':
|
|
443
|
-
case 'remix':
|
|
444
|
-
dockerfile = generateNodeWebDockerfile(webOpts);
|
|
445
|
-
break;
|
|
446
|
-
default:
|
|
447
|
-
// nextjs (and any unspecified web framework — schema requires
|
|
448
|
-
// a valid framework, so this is just a default).
|
|
449
|
-
dockerfile = generateNextjsDockerfile(webOpts);
|
|
450
|
-
}
|
|
451
|
-
} else if (app.entry) {
|
|
452
|
-
// Backend with custom entry point - use tsdown bundling
|
|
453
|
-
dockerfile = generateEntryDockerfile({
|
|
454
|
-
imageName,
|
|
455
|
-
baseImage: 'node:22-alpine',
|
|
456
|
-
port: app.port,
|
|
457
|
-
appPath,
|
|
458
|
-
entry: app.entry,
|
|
459
|
-
turboPackage,
|
|
460
|
-
packageManager,
|
|
461
|
-
healthCheckPath: '/health',
|
|
462
|
-
});
|
|
463
|
-
} else {
|
|
464
|
-
// Backend with gkm routes - use gkm build
|
|
465
|
-
dockerfile = generateBackendDockerfile({
|
|
466
|
-
imageName,
|
|
467
|
-
baseImage: 'node:22-alpine',
|
|
468
|
-
port: app.port,
|
|
469
|
-
appPath,
|
|
470
|
-
turboPackage,
|
|
471
|
-
packageManager,
|
|
472
|
-
healthCheckPath: '/health',
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// Write Dockerfile with app-specific name
|
|
477
|
-
const dockerfilePath = join(dockerDir, `Dockerfile.${appName}`);
|
|
478
|
-
await writeFile(dockerfilePath, dockerfile);
|
|
479
|
-
logger.log(` Generated: .gkm/docker/Dockerfile.${appName}`);
|
|
480
|
-
|
|
481
|
-
results.push({
|
|
482
|
-
appName,
|
|
483
|
-
type: app.type,
|
|
484
|
-
dockerfile: dockerfilePath,
|
|
485
|
-
imageName,
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// Generate shared .dockerignore
|
|
490
|
-
const dockerignore = generateDockerignore();
|
|
491
|
-
const dockerignorePath = join(workspace.root, '.dockerignore');
|
|
492
|
-
await writeFile(dockerignorePath, dockerignore);
|
|
493
|
-
logger.log(`\n Generated: .dockerignore (workspace root)`);
|
|
494
|
-
|
|
495
|
-
// Generate docker-compose.yml for workspace
|
|
496
|
-
const dockerCompose = generateWorkspaceCompose(workspace, {
|
|
497
|
-
registry: options.registry,
|
|
498
|
-
});
|
|
499
|
-
const composePath = join(dockerDir, 'docker-compose.yml');
|
|
500
|
-
await writeFile(composePath, dockerCompose);
|
|
501
|
-
logger.log(` Generated: .gkm/docker/docker-compose.yml`);
|
|
502
|
-
|
|
503
|
-
// Summary
|
|
504
|
-
logger.log(
|
|
505
|
-
`\n✅ Generated ${results.length} Dockerfile(s) + docker-compose.yml`,
|
|
506
|
-
);
|
|
507
|
-
logger.log('\n📋 Build commands:');
|
|
508
|
-
for (const result of results) {
|
|
509
|
-
const icon =
|
|
510
|
-
result.type === 'backend' ? '⚙️' : result.type === 'mobile' ? '📱' : '🌐';
|
|
511
|
-
logger.log(
|
|
512
|
-
` ${icon} docker build -f .gkm/docker/Dockerfile.${result.appName} -t ${result.imageName} .`,
|
|
513
|
-
);
|
|
514
|
-
}
|
|
515
|
-
logger.log('\n📋 Run all services:');
|
|
516
|
-
logger.log(' docker compose -f .gkm/docker/docker-compose.yml up --build');
|
|
517
|
-
|
|
518
|
-
return {
|
|
519
|
-
apps: results,
|
|
520
|
-
dockerCompose: composePath,
|
|
521
|
-
dockerignore: dockerignorePath,
|
|
522
|
-
};
|
|
523
|
-
}
|