@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
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { mkdir, readFile, rm } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { e } from '@geekmidas/constructs/endpoints';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import type { BuildContext } from '../build/types';
|
|
6
|
-
import { EndpointGenerator } from '../generators/EndpointGenerator';
|
|
7
|
-
import type { GeneratedConstruct } from '../generators/Generator';
|
|
8
|
-
|
|
9
|
-
// Create a minimal mock endpoint for testing
|
|
10
|
-
const mockEndpoint = e.get('/test').handle(async () => ({ ok: true }));
|
|
11
|
-
|
|
12
|
-
describe('EndpointGenerator hooks generation', () => {
|
|
13
|
-
const testOutputDir = join(process.cwd(), '.test-output');
|
|
14
|
-
let generator: EndpointGenerator;
|
|
15
|
-
|
|
16
|
-
// Mock endpoint construct for testing
|
|
17
|
-
const mockConstruct: GeneratedConstruct<typeof mockEndpoint> = {
|
|
18
|
-
key: 'testEndpoint',
|
|
19
|
-
construct: mockEndpoint,
|
|
20
|
-
path: {
|
|
21
|
-
relative: '/project/src/endpoints/test.ts',
|
|
22
|
-
absolute: '/project/src/endpoints/test.ts',
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
beforeEach(async () => {
|
|
27
|
-
generator = new EndpointGenerator();
|
|
28
|
-
await mkdir(testOutputDir, { recursive: true });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await rm(testOutputDir, { recursive: true, force: true });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const baseContext: BuildContext = {
|
|
36
|
-
envParserPath: '/project/src/config/env.ts',
|
|
37
|
-
envParserImportPattern: '{ envParser }',
|
|
38
|
-
loggerPath: '/project/src/config/logger.ts',
|
|
39
|
-
loggerImportPattern: 'logger',
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
describe('generateAppFile', () => {
|
|
43
|
-
it('should not include hooks when hooks config is undefined', async () => {
|
|
44
|
-
await generator.build(baseContext, [mockConstruct], testOutputDir, {
|
|
45
|
-
provider: 'server',
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
49
|
-
|
|
50
|
-
expect(appContent).not.toContain('serverHooks');
|
|
51
|
-
expect(appContent).not.toContain('beforeSetup');
|
|
52
|
-
expect(appContent).not.toContain('afterSetup');
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should include hooks imports when hooks config is provided', async () => {
|
|
56
|
-
const contextWithHooks: BuildContext = {
|
|
57
|
-
...baseContext,
|
|
58
|
-
hooks: {
|
|
59
|
-
serverHooksPath: '/project/src/config/hooks.ts',
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
64
|
-
provider: 'server',
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
68
|
-
|
|
69
|
-
expect(appContent).toContain('import * as serverHooks from');
|
|
70
|
-
expect(appContent).toContain('hooks.ts');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should include beforeSetup hook call', async () => {
|
|
74
|
-
const contextWithHooks: BuildContext = {
|
|
75
|
-
...baseContext,
|
|
76
|
-
hooks: {
|
|
77
|
-
serverHooksPath: '/project/src/config/hooks.ts',
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
82
|
-
provider: 'server',
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
86
|
-
|
|
87
|
-
expect(appContent).toContain(
|
|
88
|
-
"if (typeof serverHooks.beforeSetup === 'function')",
|
|
89
|
-
);
|
|
90
|
-
expect(appContent).toContain(
|
|
91
|
-
'await serverHooks.beforeSetup(honoApp, { envParser, logger })',
|
|
92
|
-
);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('should include afterSetup hook call', async () => {
|
|
96
|
-
const contextWithHooks: BuildContext = {
|
|
97
|
-
...baseContext,
|
|
98
|
-
hooks: {
|
|
99
|
-
serverHooksPath: '/project/src/config/hooks.ts',
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
104
|
-
provider: 'server',
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
108
|
-
|
|
109
|
-
expect(appContent).toContain(
|
|
110
|
-
"if (typeof serverHooks.afterSetup === 'function')",
|
|
111
|
-
);
|
|
112
|
-
expect(appContent).toContain(
|
|
113
|
-
'await serverHooks.afterSetup(honoApp, { envParser, logger })',
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should place telescope before beforeSetup, and beforeSetup before endpoints', async () => {
|
|
118
|
-
const contextWithHooks: BuildContext = {
|
|
119
|
-
...baseContext,
|
|
120
|
-
hooks: {
|
|
121
|
-
serverHooksPath: '/project/src/config/hooks.ts',
|
|
122
|
-
},
|
|
123
|
-
telescope: {
|
|
124
|
-
enabled: true,
|
|
125
|
-
path: '/__telescope',
|
|
126
|
-
maxEntries: 100,
|
|
127
|
-
recordBody: true,
|
|
128
|
-
ignore: [],
|
|
129
|
-
websocket: false,
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
134
|
-
provider: 'server',
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
138
|
-
|
|
139
|
-
// Use specific patterns to find the actual calls (not imports/comments)
|
|
140
|
-
const telescopeIndex = appContent.indexOf('createMiddleware(telescope)');
|
|
141
|
-
const beforeSetupCallIndex = appContent.indexOf(
|
|
142
|
-
'serverHooks.beforeSetup(honoApp',
|
|
143
|
-
);
|
|
144
|
-
const setupEndpointsIndex = appContent.indexOf(
|
|
145
|
-
'await setupEndpoints(honoApp',
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
expect(telescopeIndex).toBeGreaterThan(0);
|
|
149
|
-
expect(beforeSetupCallIndex).toBeGreaterThan(0);
|
|
150
|
-
expect(setupEndpointsIndex).toBeGreaterThan(0);
|
|
151
|
-
// Telescope middleware first (to capture all requests)
|
|
152
|
-
expect(telescopeIndex).toBeLessThan(beforeSetupCallIndex);
|
|
153
|
-
// Then beforeSetup hook
|
|
154
|
-
expect(beforeSetupCallIndex).toBeLessThan(setupEndpointsIndex);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('should place afterSetup after setupEndpoints', async () => {
|
|
158
|
-
const contextWithHooks: BuildContext = {
|
|
159
|
-
...baseContext,
|
|
160
|
-
hooks: {
|
|
161
|
-
serverHooksPath: '/project/src/config/hooks.ts',
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
166
|
-
provider: 'server',
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
170
|
-
|
|
171
|
-
// Use specific patterns to find the actual calls (not imports/comments)
|
|
172
|
-
const setupEndpointsIndex = appContent.indexOf(
|
|
173
|
-
'await setupEndpoints(honoApp',
|
|
174
|
-
);
|
|
175
|
-
const afterSetupCallIndex = appContent.indexOf(
|
|
176
|
-
'serverHooks.afterSetup(honoApp',
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
expect(setupEndpointsIndex).toBeGreaterThan(0);
|
|
180
|
-
expect(afterSetupCallIndex).toBeGreaterThan(0);
|
|
181
|
-
expect(afterSetupCallIndex).toBeGreaterThan(setupEndpointsIndex);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('should generate correct relative import path for hooks', async () => {
|
|
185
|
-
const contextWithHooks: BuildContext = {
|
|
186
|
-
...baseContext,
|
|
187
|
-
hooks: {
|
|
188
|
-
serverHooksPath: join(testOutputDir, '../../src/config/hooks.ts'),
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
|
|
193
|
-
provider: 'server',
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
|
|
197
|
-
|
|
198
|
-
// Should have a relative import path
|
|
199
|
-
expect(appContent).toMatch(
|
|
200
|
-
/import \* as serverHooks from '\.\.\/.*hooks\.ts'/,
|
|
201
|
-
);
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
});
|
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import { realpathSync } from 'node:fs';
|
|
2
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { getAppNameFromCwd, loadAppConfig, loadConfig } from '../config';
|
|
6
|
-
import { cleanupDir, createTempDir } from './test-helpers';
|
|
7
|
-
|
|
8
|
-
describe('loadConfig', () => {
|
|
9
|
-
let tempDir: string;
|
|
10
|
-
let originalCwd: string;
|
|
11
|
-
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
tempDir = await createTempDir();
|
|
14
|
-
originalCwd = process.cwd();
|
|
15
|
-
process.chdir(tempDir);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
afterEach(async () => {
|
|
19
|
-
process.chdir(originalCwd);
|
|
20
|
-
await cleanupDir(tempDir);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should load configuration from gkm.config.ts', async () => {
|
|
24
|
-
const configContent = `
|
|
25
|
-
export default {
|
|
26
|
-
routes: './src/endpoints/**/*.ts',
|
|
27
|
-
functions: './src/functions/**/*.ts',
|
|
28
|
-
crons: './src/crons/**/*.ts',
|
|
29
|
-
envParser: './src/config/env',
|
|
30
|
-
logger: './src/config/logger',
|
|
31
|
-
};
|
|
32
|
-
`;
|
|
33
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), configContent);
|
|
34
|
-
|
|
35
|
-
const config = await loadConfig();
|
|
36
|
-
|
|
37
|
-
expect(config).toEqual({
|
|
38
|
-
routes: './src/endpoints/**/*.ts',
|
|
39
|
-
functions: './src/functions/**/*.ts',
|
|
40
|
-
crons: './src/crons/**/*.ts',
|
|
41
|
-
envParser: './src/config/env',
|
|
42
|
-
logger: './src/config/logger',
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should load configuration from gkm.config.js', async () => {
|
|
47
|
-
const configContent = `
|
|
48
|
-
module.exports = {
|
|
49
|
-
routes: './api/**/*.js',
|
|
50
|
-
envParser: './config/environment',
|
|
51
|
-
logger: './config/logging',
|
|
52
|
-
};
|
|
53
|
-
`;
|
|
54
|
-
await writeFile(join(tempDir, 'gkm.config.js'), configContent);
|
|
55
|
-
|
|
56
|
-
const config = await loadConfig();
|
|
57
|
-
|
|
58
|
-
expect(config.routes).toBe('./api/**/*.js');
|
|
59
|
-
expect(config.envParser).toBe('./config/environment');
|
|
60
|
-
expect(config.logger).toBe('./config/logging');
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should handle configuration with only envParser override', async () => {
|
|
64
|
-
const configContent = `
|
|
65
|
-
export default {
|
|
66
|
-
envParser: './my-env#myEnvParser',
|
|
67
|
-
logger: './my-logger#myLogger',
|
|
68
|
-
};
|
|
69
|
-
`;
|
|
70
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), configContent);
|
|
71
|
-
|
|
72
|
-
const config = await loadConfig();
|
|
73
|
-
|
|
74
|
-
expect(config.envParser).toBe('./my-env#myEnvParser');
|
|
75
|
-
expect(config.logger).toBe('./my-logger#myLogger');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('should handle malformed config file gracefully', async () => {
|
|
79
|
-
const invalidConfigContent = `
|
|
80
|
-
export default {
|
|
81
|
-
routes: './endpoints/**/*.ts'
|
|
82
|
-
// Missing comma - syntax error
|
|
83
|
-
functions: './functions/**/*.ts'
|
|
84
|
-
};
|
|
85
|
-
`;
|
|
86
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), invalidConfigContent);
|
|
87
|
-
|
|
88
|
-
// Should fall back to defaults when config file has syntax errors
|
|
89
|
-
await expect(loadConfig()).rejects.toThrow();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('should prefer .ts config over .js config', async () => {
|
|
93
|
-
const jsConfigContent = `
|
|
94
|
-
module.exports = {
|
|
95
|
-
routes: './js-routes/**/*.js',
|
|
96
|
-
};
|
|
97
|
-
`;
|
|
98
|
-
const tsConfigContent = `
|
|
99
|
-
export default {
|
|
100
|
-
routes: './ts-routes/**/*.ts',
|
|
101
|
-
};
|
|
102
|
-
`;
|
|
103
|
-
|
|
104
|
-
await writeFile(join(tempDir, 'gkm.config.js'), jsConfigContent);
|
|
105
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), tsConfigContent);
|
|
106
|
-
|
|
107
|
-
const config = await loadConfig();
|
|
108
|
-
|
|
109
|
-
expect(config.routes).toBe('./ts-routes/**/*.ts');
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe('getAppNameFromCwd', () => {
|
|
114
|
-
let tempDir: string;
|
|
115
|
-
|
|
116
|
-
beforeEach(async () => {
|
|
117
|
-
tempDir = await createTempDir();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
afterEach(async () => {
|
|
121
|
-
await cleanupDir(tempDir);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('should return app name from package.json', async () => {
|
|
125
|
-
const packageJson = { name: 'my-app', version: '1.0.0' };
|
|
126
|
-
await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson));
|
|
127
|
-
|
|
128
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
129
|
-
|
|
130
|
-
expect(appName).toBe('my-app');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it('should extract name from scoped package', async () => {
|
|
134
|
-
const packageJson = { name: '@myorg/api', version: '1.0.0' };
|
|
135
|
-
await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson));
|
|
136
|
-
|
|
137
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
138
|
-
|
|
139
|
-
expect(appName).toBe('api');
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('should handle scoped package with nested scope', async () => {
|
|
143
|
-
const packageJson = { name: '@my-company/auth-service', version: '1.0.0' };
|
|
144
|
-
await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson));
|
|
145
|
-
|
|
146
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
147
|
-
|
|
148
|
-
expect(appName).toBe('auth-service');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('should return null if package.json does not exist', async () => {
|
|
152
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
153
|
-
|
|
154
|
-
expect(appName).toBeNull();
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('should return null if package.json has no name field', async () => {
|
|
158
|
-
const packageJson = { version: '1.0.0' };
|
|
159
|
-
await writeFile(join(tempDir, 'package.json'), JSON.stringify(packageJson));
|
|
160
|
-
|
|
161
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
162
|
-
|
|
163
|
-
expect(appName).toBeNull();
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('should return null if package.json is invalid JSON', async () => {
|
|
167
|
-
await writeFile(join(tempDir, 'package.json'), 'not valid json');
|
|
168
|
-
|
|
169
|
-
const appName = getAppNameFromCwd(tempDir);
|
|
170
|
-
|
|
171
|
-
expect(appName).toBeNull();
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe('loadAppConfig', () => {
|
|
176
|
-
let tempDir: string;
|
|
177
|
-
let originalCwd: string;
|
|
178
|
-
|
|
179
|
-
beforeEach(async () => {
|
|
180
|
-
tempDir = await createTempDir();
|
|
181
|
-
originalCwd = process.cwd();
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
afterEach(async () => {
|
|
185
|
-
process.chdir(originalCwd);
|
|
186
|
-
// Clean up GKM_CONFIG_PATH env var
|
|
187
|
-
delete process.env.GKM_CONFIG_PATH;
|
|
188
|
-
await cleanupDir(tempDir);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('should load app config from workspace when in app directory', async () => {
|
|
192
|
-
// Create workspace structure
|
|
193
|
-
const workspaceRoot = tempDir;
|
|
194
|
-
const appDir = join(workspaceRoot, 'apps', 'api');
|
|
195
|
-
await mkdir(appDir, { recursive: true });
|
|
196
|
-
|
|
197
|
-
// Create workspace config (plain JS object with __isWorkspace marker)
|
|
198
|
-
const workspaceConfig = `
|
|
199
|
-
export default {
|
|
200
|
-
__isWorkspace: true,
|
|
201
|
-
name: 'test-workspace',
|
|
202
|
-
apps: {
|
|
203
|
-
api: {
|
|
204
|
-
type: 'backend',
|
|
205
|
-
path: 'apps/api',
|
|
206
|
-
port: 3000,
|
|
207
|
-
routes: './src/endpoints/**/*.ts',
|
|
208
|
-
envParser: './src/config/env',
|
|
209
|
-
logger: './src/config/logger',
|
|
210
|
-
},
|
|
211
|
-
},
|
|
212
|
-
};
|
|
213
|
-
`;
|
|
214
|
-
await writeFile(join(workspaceRoot, 'gkm.config.ts'), workspaceConfig);
|
|
215
|
-
|
|
216
|
-
// Create app package.json
|
|
217
|
-
const packageJson = { name: '@test-workspace/api', version: '1.0.0' };
|
|
218
|
-
await writeFile(join(appDir, 'package.json'), JSON.stringify(packageJson));
|
|
219
|
-
|
|
220
|
-
// Change to app directory
|
|
221
|
-
process.chdir(appDir);
|
|
222
|
-
|
|
223
|
-
const result = await loadAppConfig();
|
|
224
|
-
|
|
225
|
-
expect(result.appName).toBe('api');
|
|
226
|
-
expect(result.gkmConfig.routes).toBe('./src/endpoints/**/*.ts');
|
|
227
|
-
// Use realpathSync to handle macOS /var -> /private/var symlink
|
|
228
|
-
expect(realpathSync(result.appRoot)).toBe(realpathSync(appDir));
|
|
229
|
-
expect(realpathSync(result.workspaceRoot)).toBe(
|
|
230
|
-
realpathSync(workspaceRoot),
|
|
231
|
-
);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('should throw error if app not found in workspace', async () => {
|
|
235
|
-
// Create workspace structure
|
|
236
|
-
const workspaceRoot = tempDir;
|
|
237
|
-
const appDir = join(workspaceRoot, 'apps', 'unknown');
|
|
238
|
-
await mkdir(appDir, { recursive: true });
|
|
239
|
-
|
|
240
|
-
// Create workspace config without 'unknown' app
|
|
241
|
-
const workspaceConfig = `
|
|
242
|
-
export default {
|
|
243
|
-
__isWorkspace: true,
|
|
244
|
-
name: 'test-workspace',
|
|
245
|
-
apps: {
|
|
246
|
-
api: {
|
|
247
|
-
type: 'backend',
|
|
248
|
-
path: 'apps/api',
|
|
249
|
-
port: 3000,
|
|
250
|
-
routes: './src/endpoints/**/*.ts',
|
|
251
|
-
envParser: './src/config/env',
|
|
252
|
-
logger: './src/config/logger',
|
|
253
|
-
},
|
|
254
|
-
},
|
|
255
|
-
};
|
|
256
|
-
`;
|
|
257
|
-
await writeFile(join(workspaceRoot, 'gkm.config.ts'), workspaceConfig);
|
|
258
|
-
|
|
259
|
-
// Create app package.json with different name
|
|
260
|
-
const packageJson = { name: '@test-workspace/unknown', version: '1.0.0' };
|
|
261
|
-
await writeFile(join(appDir, 'package.json'), JSON.stringify(packageJson));
|
|
262
|
-
|
|
263
|
-
// Change to app directory
|
|
264
|
-
process.chdir(appDir);
|
|
265
|
-
|
|
266
|
-
await expect(loadAppConfig()).rejects.toThrow(
|
|
267
|
-
'App "unknown" not found in workspace config',
|
|
268
|
-
);
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it('should throw error if no package.json exists', async () => {
|
|
272
|
-
// Create workspace structure without package.json in app
|
|
273
|
-
const workspaceRoot = tempDir;
|
|
274
|
-
const appDir = join(workspaceRoot, 'apps', 'api');
|
|
275
|
-
await mkdir(appDir, { recursive: true });
|
|
276
|
-
|
|
277
|
-
const workspaceConfig = `
|
|
278
|
-
export default {
|
|
279
|
-
routes: './src/endpoints/**/*.ts',
|
|
280
|
-
envParser: './src/config/env',
|
|
281
|
-
logger: './src/config/logger',
|
|
282
|
-
};
|
|
283
|
-
`;
|
|
284
|
-
await writeFile(join(workspaceRoot, 'gkm.config.ts'), workspaceConfig);
|
|
285
|
-
|
|
286
|
-
// Change to app directory (no package.json)
|
|
287
|
-
process.chdir(appDir);
|
|
288
|
-
|
|
289
|
-
await expect(loadAppConfig()).rejects.toThrow(
|
|
290
|
-
'Could not determine app name',
|
|
291
|
-
);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it('should use GKM_CONFIG_PATH env var when set', async () => {
|
|
295
|
-
// Create workspace at a different location
|
|
296
|
-
const workspaceRoot = await createTempDir('workspace-');
|
|
297
|
-
const configPath = join(workspaceRoot, 'gkm.config.ts');
|
|
298
|
-
|
|
299
|
-
// Create workspace config
|
|
300
|
-
const workspaceConfig = `
|
|
301
|
-
export default {
|
|
302
|
-
__isWorkspace: true,
|
|
303
|
-
name: 'env-test',
|
|
304
|
-
apps: {
|
|
305
|
-
api: {
|
|
306
|
-
type: 'backend',
|
|
307
|
-
path: 'apps/api',
|
|
308
|
-
port: 3000,
|
|
309
|
-
routes: './src/endpoints/**/*.ts',
|
|
310
|
-
envParser: './src/config/env',
|
|
311
|
-
logger: './src/config/logger',
|
|
312
|
-
},
|
|
313
|
-
},
|
|
314
|
-
};
|
|
315
|
-
`;
|
|
316
|
-
await writeFile(configPath, workspaceConfig);
|
|
317
|
-
|
|
318
|
-
// Create app directory in temp dir (separate from workspace)
|
|
319
|
-
const appDir = join(tempDir, 'apps', 'api');
|
|
320
|
-
await mkdir(appDir, { recursive: true });
|
|
321
|
-
|
|
322
|
-
// Create app package.json
|
|
323
|
-
const packageJson = { name: '@env-test/api', version: '1.0.0' };
|
|
324
|
-
await writeFile(join(appDir, 'package.json'), JSON.stringify(packageJson));
|
|
325
|
-
|
|
326
|
-
// Set GKM_CONFIG_PATH
|
|
327
|
-
process.env.GKM_CONFIG_PATH = configPath;
|
|
328
|
-
|
|
329
|
-
// Change to app directory
|
|
330
|
-
process.chdir(appDir);
|
|
331
|
-
|
|
332
|
-
const result = await loadAppConfig();
|
|
333
|
-
|
|
334
|
-
expect(result.appName).toBe('api');
|
|
335
|
-
// Use realpathSync to handle macOS /var -> /private/var symlink
|
|
336
|
-
expect(realpathSync(result.workspaceRoot)).toBe(
|
|
337
|
-
realpathSync(workspaceRoot),
|
|
338
|
-
);
|
|
339
|
-
|
|
340
|
-
// Cleanup the extra temp dir
|
|
341
|
-
await cleanupDir(workspaceRoot);
|
|
342
|
-
});
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
describe('config discovery', () => {
|
|
346
|
-
let tempDir: string;
|
|
347
|
-
let originalCwd: string;
|
|
348
|
-
|
|
349
|
-
beforeEach(async () => {
|
|
350
|
-
tempDir = await createTempDir();
|
|
351
|
-
originalCwd = process.cwd();
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
afterEach(async () => {
|
|
355
|
-
process.chdir(originalCwd);
|
|
356
|
-
delete process.env.GKM_CONFIG_PATH;
|
|
357
|
-
await cleanupDir(tempDir);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
it('should find config by walking up directories', async () => {
|
|
361
|
-
// Create nested directory structure
|
|
362
|
-
const nestedDir = join(tempDir, 'apps', 'api', 'src', 'endpoints');
|
|
363
|
-
await mkdir(nestedDir, { recursive: true });
|
|
364
|
-
|
|
365
|
-
// Create config at root
|
|
366
|
-
const configContent = `
|
|
367
|
-
export default {
|
|
368
|
-
routes: './src/endpoints/**/*.ts',
|
|
369
|
-
envParser: './src/config/env',
|
|
370
|
-
logger: './src/config/logger',
|
|
371
|
-
};
|
|
372
|
-
`;
|
|
373
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), configContent);
|
|
374
|
-
|
|
375
|
-
// Change to deeply nested directory
|
|
376
|
-
process.chdir(nestedDir);
|
|
377
|
-
|
|
378
|
-
const config = await loadConfig();
|
|
379
|
-
|
|
380
|
-
expect(config.routes).toBe('./src/endpoints/**/*.ts');
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
it('should prefer GKM_CONFIG_PATH over walking up directories', async () => {
|
|
384
|
-
// Create two configs at different levels
|
|
385
|
-
const nestedDir = join(tempDir, 'apps', 'api');
|
|
386
|
-
await mkdir(nestedDir, { recursive: true });
|
|
387
|
-
|
|
388
|
-
// Config at root
|
|
389
|
-
const rootConfig = `
|
|
390
|
-
export default {
|
|
391
|
-
routes: './root-routes/**/*.ts',
|
|
392
|
-
envParser: './src/config/env',
|
|
393
|
-
logger: './src/config/logger',
|
|
394
|
-
};
|
|
395
|
-
`;
|
|
396
|
-
await writeFile(join(tempDir, 'gkm.config.ts'), rootConfig);
|
|
397
|
-
|
|
398
|
-
// Config in a different location pointed to by env var
|
|
399
|
-
const envConfigDir = await createTempDir('env-config-');
|
|
400
|
-
const envConfig = `
|
|
401
|
-
export default {
|
|
402
|
-
routes: './env-routes/**/*.ts',
|
|
403
|
-
envParser: './src/config/env',
|
|
404
|
-
logger: './src/config/logger',
|
|
405
|
-
};
|
|
406
|
-
`;
|
|
407
|
-
await writeFile(join(envConfigDir, 'gkm.config.ts'), envConfig);
|
|
408
|
-
|
|
409
|
-
// Set GKM_CONFIG_PATH to the env config
|
|
410
|
-
process.env.GKM_CONFIG_PATH = join(envConfigDir, 'gkm.config.ts');
|
|
411
|
-
|
|
412
|
-
// Change to nested directory
|
|
413
|
-
process.chdir(nestedDir);
|
|
414
|
-
|
|
415
|
-
const config = await loadConfig();
|
|
416
|
-
|
|
417
|
-
expect(config.routes).toBe('./env-routes/**/*.ts');
|
|
418
|
-
|
|
419
|
-
// Cleanup
|
|
420
|
-
await cleanupDir(envConfigDir);
|
|
421
|
-
});
|
|
422
|
-
});
|