@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,256 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import type { Function } from '@geekmidas/constructs/functions';
|
|
4
|
-
import { f } from '@geekmidas/constructs/functions';
|
|
5
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
-
import { z } from 'zod';
|
|
7
|
-
import {
|
|
8
|
-
cleanupDir,
|
|
9
|
-
createMockBuildContext,
|
|
10
|
-
createTempDir,
|
|
11
|
-
} from '../../__tests__/test-helpers';
|
|
12
|
-
import { FunctionGenerator } from '../FunctionGenerator';
|
|
13
|
-
import type { GeneratedConstruct } from '../Generator';
|
|
14
|
-
|
|
15
|
-
describe('FunctionGenerator', () => {
|
|
16
|
-
let tempDir: string;
|
|
17
|
-
let outputDir: string;
|
|
18
|
-
let generator: FunctionGenerator;
|
|
19
|
-
let context: ReturnType<typeof createMockBuildContext>;
|
|
20
|
-
|
|
21
|
-
beforeEach(async () => {
|
|
22
|
-
tempDir = await createTempDir();
|
|
23
|
-
outputDir = join(tempDir, 'output');
|
|
24
|
-
generator = new FunctionGenerator();
|
|
25
|
-
context = createMockBuildContext();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
afterEach(async () => {
|
|
29
|
-
await cleanupDir(tempDir);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('isConstruct', () => {
|
|
33
|
-
it('should identify valid functions', () => {
|
|
34
|
-
const testFunction = f
|
|
35
|
-
.input(z.object({ name: z.string() }))
|
|
36
|
-
.output(z.object({ greeting: z.string() }))
|
|
37
|
-
.timeout(30)
|
|
38
|
-
.handle(async ({ input }) => ({
|
|
39
|
-
greeting: `Hello, ${input.name}!`,
|
|
40
|
-
}));
|
|
41
|
-
|
|
42
|
-
expect(generator.isConstruct(testFunction)).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should reject invalid constructs', () => {
|
|
46
|
-
expect(generator.isConstruct({})).toBe(false);
|
|
47
|
-
expect(generator.isConstruct('string')).toBe(false);
|
|
48
|
-
expect(generator.isConstruct(null)).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe('build', () => {
|
|
53
|
-
const createTestFunctionConstruct = (
|
|
54
|
-
key: string,
|
|
55
|
-
timeout: number = 30,
|
|
56
|
-
): GeneratedConstruct<Function<any, any, any, any>> => {
|
|
57
|
-
const func = f
|
|
58
|
-
.timeout(timeout)
|
|
59
|
-
.handle(async () => ({ greeting: 'Hello!' }));
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
key,
|
|
63
|
-
name: key.toLowerCase(),
|
|
64
|
-
construct: func,
|
|
65
|
-
path: {
|
|
66
|
-
absolute: join(tempDir, `${key}.ts`),
|
|
67
|
-
relative: `${key}.ts`,
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
describe('aws-lambda provider', () => {
|
|
73
|
-
it('should generate function handlers', async () => {
|
|
74
|
-
const constructs = [
|
|
75
|
-
createTestFunctionConstruct('processData', 60),
|
|
76
|
-
createTestFunctionConstruct('sendEmail', 30),
|
|
77
|
-
];
|
|
78
|
-
|
|
79
|
-
const functionInfos = await generator.build(
|
|
80
|
-
context,
|
|
81
|
-
constructs,
|
|
82
|
-
outputDir,
|
|
83
|
-
{ provider: 'aws-lambda' },
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
expect(functionInfos).toHaveLength(2);
|
|
87
|
-
expect(functionInfos[0]).toMatchObject({
|
|
88
|
-
name: 'processData',
|
|
89
|
-
handler: expect.stringContaining('functions/processData.handler'),
|
|
90
|
-
timeout: 60,
|
|
91
|
-
});
|
|
92
|
-
expect(functionInfos[1]).toMatchObject({
|
|
93
|
-
name: 'sendEmail',
|
|
94
|
-
handler: expect.stringContaining('functions/sendEmail.handler'),
|
|
95
|
-
timeout: 30,
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// Check that handler files were created
|
|
99
|
-
const processDataHandlerPath = join(
|
|
100
|
-
outputDir,
|
|
101
|
-
'functions',
|
|
102
|
-
'processData.ts',
|
|
103
|
-
);
|
|
104
|
-
const processDataContent = await readFile(
|
|
105
|
-
processDataHandlerPath,
|
|
106
|
-
'utf-8',
|
|
107
|
-
);
|
|
108
|
-
expect(processDataContent).toContain('AWSLambdaFunction');
|
|
109
|
-
expect(processDataContent).toContain('import { processData }');
|
|
110
|
-
expect(processDataContent).toContain('import envParser');
|
|
111
|
-
expect(processDataContent).toContain('import logger');
|
|
112
|
-
|
|
113
|
-
const sendEmailHandlerPath = join(
|
|
114
|
-
outputDir,
|
|
115
|
-
'functions',
|
|
116
|
-
'sendEmail.ts',
|
|
117
|
-
);
|
|
118
|
-
const sendEmailContent = await readFile(sendEmailHandlerPath, 'utf-8');
|
|
119
|
-
expect(sendEmailContent).toContain('AWSLambdaFunction');
|
|
120
|
-
expect(sendEmailContent).toContain('import { sendEmail }');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('should generate correct relative import paths', async () => {
|
|
124
|
-
const construct: GeneratedConstruct<Function<any, any, any, any>> = {
|
|
125
|
-
key: 'deepFunction',
|
|
126
|
-
name: 'deep-function',
|
|
127
|
-
construct: createTestFunctionConstruct('deepFunction', 45).construct,
|
|
128
|
-
path: {
|
|
129
|
-
absolute: join(tempDir, 'src/functions/deep/processor.ts'),
|
|
130
|
-
relative: 'src/functions/deep/processor.ts',
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
await generator.build(context, [construct], outputDir, {
|
|
135
|
-
provider: 'aws-lambda',
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
const handlerPath = join(outputDir, 'functions', 'deepFunction.ts');
|
|
139
|
-
const handlerContent = await readFile(handlerPath, 'utf-8');
|
|
140
|
-
|
|
141
|
-
// Check relative imports are correct - the path will be relative from outputDir
|
|
142
|
-
expect(handlerContent).toMatch(
|
|
143
|
-
/from ['"].*src\/functions\/deep\/processor\.js['"]/,
|
|
144
|
-
);
|
|
145
|
-
expect(handlerContent).toMatch(/from ['"].*\/env['"]/);
|
|
146
|
-
expect(handlerContent).toMatch(/from ['"].*\/logger['"]/);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('should log generation progress', async () => {
|
|
150
|
-
const logSpy = vi.spyOn(console, 'log');
|
|
151
|
-
|
|
152
|
-
const constructs = [createTestFunctionConstruct('testFunction', 30)];
|
|
153
|
-
|
|
154
|
-
await generator.build(context, constructs, outputDir, {
|
|
155
|
-
provider: 'aws-lambda',
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
159
|
-
'Generated function handler: testFunction',
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
logSpy.mockRestore();
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
describe('non aws-lambda provider', () => {
|
|
167
|
-
it('should return empty array for server provider', async () => {
|
|
168
|
-
const constructs = [createTestFunctionConstruct('testFunction', 30)];
|
|
169
|
-
|
|
170
|
-
const functionInfos = await generator.build(
|
|
171
|
-
context,
|
|
172
|
-
constructs,
|
|
173
|
-
outputDir,
|
|
174
|
-
{ provider: 'server' },
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
expect(functionInfos).toEqual([]);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should return empty array for aws-apigatewayv1 provider', async () => {
|
|
181
|
-
const constructs = [createTestFunctionConstruct('testFunction', 30)];
|
|
182
|
-
|
|
183
|
-
const functionInfos = await generator.build(
|
|
184
|
-
context,
|
|
185
|
-
constructs,
|
|
186
|
-
outputDir,
|
|
187
|
-
{ provider: 'aws-apigatewayv1' },
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
expect(functionInfos).toEqual([]);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('should return empty array for empty constructs', async () => {
|
|
195
|
-
const functionInfos = await generator.build(context, [], outputDir, {
|
|
196
|
-
provider: 'aws-lambda',
|
|
197
|
-
});
|
|
198
|
-
expect(functionInfos).toEqual([]);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('should use default provider when none specified', async () => {
|
|
202
|
-
const constructs = [createTestFunctionConstruct('defaultFunction', 30)];
|
|
203
|
-
|
|
204
|
-
const functionInfos = await generator.build(
|
|
205
|
-
context,
|
|
206
|
-
constructs,
|
|
207
|
-
outputDir,
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
expect(functionInfos).toHaveLength(1);
|
|
211
|
-
expect(functionInfos[0].name).toBe('defaultFunction');
|
|
212
|
-
|
|
213
|
-
// Check that handler was created (default is aws-lambda)
|
|
214
|
-
const handlerPath = join(outputDir, 'functions', 'defaultFunction.ts');
|
|
215
|
-
const handlerContent = await readFile(handlerPath, 'utf-8');
|
|
216
|
-
expect(handlerContent).toContain('AWSLambdaFunction');
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('should handle functions with different timeout values', async () => {
|
|
220
|
-
const constructs = [
|
|
221
|
-
createTestFunctionConstruct('quickFunction', 15),
|
|
222
|
-
createTestFunctionConstruct('slowFunction', 300),
|
|
223
|
-
];
|
|
224
|
-
|
|
225
|
-
const functionInfos = await generator.build(
|
|
226
|
-
context,
|
|
227
|
-
constructs,
|
|
228
|
-
outputDir,
|
|
229
|
-
{ provider: 'aws-lambda' },
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
expect(functionInfos[0].timeout).toBe(15);
|
|
233
|
-
expect(functionInfos[1].timeout).toBe(300);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('should handle functions with custom environment parser patterns', async () => {
|
|
237
|
-
const customContext = {
|
|
238
|
-
...context,
|
|
239
|
-
envParserImportPattern: '{ customParser as envParser }',
|
|
240
|
-
loggerImportPattern: '{ customLogger as logger }',
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
const constructs = [createTestFunctionConstruct('customFunction', 30)];
|
|
244
|
-
|
|
245
|
-
await generator.build(customContext, constructs, outputDir, {
|
|
246
|
-
provider: 'aws-lambda',
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
const handlerPath = join(outputDir, 'functions', 'customFunction.ts');
|
|
250
|
-
const handlerContent = await readFile(handlerPath, 'utf-8');
|
|
251
|
-
|
|
252
|
-
expect(handlerContent).toContain('import { customParser as envParser }');
|
|
253
|
-
expect(handlerContent).toContain('import { customLogger as logger }');
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
});
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { writeFile } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { itWithDir } from '@geekmidas/testkit/os';
|
|
4
|
-
import { describe, expect, it } from 'vitest';
|
|
5
|
-
import { z } from 'zod/v4';
|
|
6
|
-
import { EndpointGenerator } from '../EndpointGenerator';
|
|
7
|
-
import { clearZodGlobalRegistry } from '../Generator';
|
|
8
|
-
|
|
9
|
-
describe('clearZodGlobalRegistry', () => {
|
|
10
|
-
it('removes an id from the global registry so the same id can be re-registered', () => {
|
|
11
|
-
// Register once — succeeds
|
|
12
|
-
z.object({ x: z.string() }).meta({ id: 'BustCacheSchema_A' });
|
|
13
|
-
|
|
14
|
-
// Re-registering without clearing throws
|
|
15
|
-
expect(() =>
|
|
16
|
-
z.object({ y: z.string() }).meta({ id: 'BustCacheSchema_A' }),
|
|
17
|
-
).toThrow(/already exists in the registry/);
|
|
18
|
-
|
|
19
|
-
// After clearing, the id can be registered again
|
|
20
|
-
clearZodGlobalRegistry();
|
|
21
|
-
expect(() =>
|
|
22
|
-
z.object({ z: z.string() }).meta({ id: 'BustCacheSchema_A' }),
|
|
23
|
-
).not.toThrow();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('is a no-op when the registry has not been initialised', () => {
|
|
27
|
-
// Temporarily remove the global registry
|
|
28
|
-
const g = globalThis as { __zod_globalRegistry?: unknown };
|
|
29
|
-
const saved = g.__zod_globalRegistry;
|
|
30
|
-
delete g.__zod_globalRegistry;
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
// Should not throw even though the registry does not exist
|
|
34
|
-
expect(() => clearZodGlobalRegistry()).not.toThrow();
|
|
35
|
-
} finally {
|
|
36
|
-
g.__zod_globalRegistry = saved;
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('Generator.load — bustCache integration smoke test', () => {
|
|
42
|
-
itWithDir(
|
|
43
|
-
'loads an endpoint with .meta({ id }) across multiple cache-busted reloads without throwing',
|
|
44
|
-
async ({ dir }) => {
|
|
45
|
-
// Mirrors the real scenario: endpoint output schema registers an
|
|
46
|
-
// id. Reloading on file change must not throw a duplicate-id error.
|
|
47
|
-
const endpointFile = join(dir, 'getRentalAgreement.ts');
|
|
48
|
-
await writeFile(
|
|
49
|
-
endpointFile,
|
|
50
|
-
`
|
|
51
|
-
import { e } from '@geekmidas/constructs/endpoints';
|
|
52
|
-
import { z } from 'zod/v4';
|
|
53
|
-
|
|
54
|
-
export const getRentalAgreement = e
|
|
55
|
-
.get('/rental-agreement')
|
|
56
|
-
.output(z.object({ content: z.string() }).meta({ id: 'RentalAgreementOutput' }))
|
|
57
|
-
.handle(async () => ({ content: 'pdf-content' }));
|
|
58
|
-
`,
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
const generator = new EndpointGenerator();
|
|
62
|
-
const patterns = join(dir, '**/*.ts');
|
|
63
|
-
|
|
64
|
-
// Simulates multiple `gkm dev` reloads
|
|
65
|
-
for (let i = 0; i < 3; i++) {
|
|
66
|
-
const loaded = await generator.load(patterns, process.cwd(), true);
|
|
67
|
-
expect(loaded).toHaveLength(1);
|
|
68
|
-
expect(loaded[0].key).toBe('getRentalAgreement');
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
);
|
|
72
|
-
});
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { e } from '@geekmidas/constructs/endpoints';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
3
|
-
import { z } from 'zod/v4';
|
|
4
|
-
import { OpenApiTsGenerator } from '../OpenApiTsGenerator';
|
|
5
|
-
|
|
6
|
-
describe('OpenApiTsGenerator — zod global registry', () => {
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
z.globalRegistry.clear();
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
afterEach(() => {
|
|
12
|
-
z.globalRegistry.clear();
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('emits a named interface for a registered schema even when no endpoint references it directly', async () => {
|
|
16
|
-
const UserSchema = z
|
|
17
|
-
.object({
|
|
18
|
-
id: z.string(),
|
|
19
|
-
email: z.string(),
|
|
20
|
-
name: z.string(),
|
|
21
|
-
})
|
|
22
|
-
.meta({ id: 'User' });
|
|
23
|
-
|
|
24
|
-
const UserResponseSchema = UserSchema.pick({
|
|
25
|
-
id: true,
|
|
26
|
-
name: true,
|
|
27
|
-
email: true,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const endpoint = e
|
|
31
|
-
.get('/users/:id')
|
|
32
|
-
.output(UserResponseSchema)
|
|
33
|
-
.handle(async () => ({ id: '1', name: 'a', email: 'a@b.c' }));
|
|
34
|
-
|
|
35
|
-
const generator = new OpenApiTsGenerator();
|
|
36
|
-
const content = await generator.generate([endpoint as any]);
|
|
37
|
-
|
|
38
|
-
expect(content).toMatch(/export interface User\b/);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('does not duplicate when the same id is also produced by an endpoint', async () => {
|
|
42
|
-
const UserSchema = z
|
|
43
|
-
.object({
|
|
44
|
-
id: z.string(),
|
|
45
|
-
email: z.string(),
|
|
46
|
-
name: z.string(),
|
|
47
|
-
})
|
|
48
|
-
.meta({ id: 'User' });
|
|
49
|
-
|
|
50
|
-
const endpoint = e
|
|
51
|
-
.get('/users/:id')
|
|
52
|
-
.output(UserSchema)
|
|
53
|
-
.handle(async () => ({ id: '1', name: 'a', email: 'a@b.c' }));
|
|
54
|
-
|
|
55
|
-
const generator = new OpenApiTsGenerator();
|
|
56
|
-
const content = await generator.generate([endpoint as any]);
|
|
57
|
-
|
|
58
|
-
const occurrences = content.match(/export interface User\b/g) ?? [];
|
|
59
|
-
expect(occurrences.length).toBe(1);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('emits multiple registered schemas', async () => {
|
|
63
|
-
z.object({ id: z.string() }).meta({ id: 'Foo' });
|
|
64
|
-
z.object({ id: z.string() }).meta({ id: 'Bar' });
|
|
65
|
-
|
|
66
|
-
const endpoint = e
|
|
67
|
-
.get('/ping')
|
|
68
|
-
.output(z.object({ ok: z.boolean() }))
|
|
69
|
-
.handle(async () => ({ ok: true }));
|
|
70
|
-
|
|
71
|
-
const generator = new OpenApiTsGenerator();
|
|
72
|
-
const content = await generator.generate([endpoint as any]);
|
|
73
|
-
|
|
74
|
-
expect(content).toMatch(/export interface Foo\b/);
|
|
75
|
-
expect(content).toMatch(/export interface Bar\b/);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('references one registered schema from another via the parent type', async () => {
|
|
79
|
-
const UserSchema = z
|
|
80
|
-
.object({ id: z.string(), email: z.string() })
|
|
81
|
-
.meta({ id: 'User' });
|
|
82
|
-
|
|
83
|
-
z.object({ user: UserSchema, role: z.string() }).meta({ id: 'UserRole' });
|
|
84
|
-
|
|
85
|
-
const endpoint = e
|
|
86
|
-
.get('/ping')
|
|
87
|
-
.output(z.object({ ok: z.boolean() }))
|
|
88
|
-
.handle(async () => ({ ok: true }));
|
|
89
|
-
|
|
90
|
-
const generator = new OpenApiTsGenerator();
|
|
91
|
-
const content = await generator.generate([endpoint as any]);
|
|
92
|
-
|
|
93
|
-
expect(content).toMatch(/export interface User\b/);
|
|
94
|
-
expect(content).toMatch(/export interface UserRole\b/);
|
|
95
|
-
// `user` inside UserRole should reference the named User type, not inline.
|
|
96
|
-
expect(content).toMatch(/user:\s*User\b/);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { e } from '@geekmidas/constructs/endpoints';
|
|
2
|
-
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { OpenApiTsGenerator } from '../OpenApiTsGenerator';
|
|
5
|
-
|
|
6
|
-
describe('OpenApiTsGenerator — responseType', () => {
|
|
7
|
-
it("emits 'application/json' in paths when responseType is default", async () => {
|
|
8
|
-
const endpoint = e
|
|
9
|
-
.get('/users')
|
|
10
|
-
.output(z.object({ id: z.string() }))
|
|
11
|
-
.handle(async () => ({ id: '1' }));
|
|
12
|
-
|
|
13
|
-
const generator = new OpenApiTsGenerator();
|
|
14
|
-
const content = await generator.generate([endpoint as any]);
|
|
15
|
-
|
|
16
|
-
// Default JSON content-type in the paths interface
|
|
17
|
-
expect(content).toContain("'application/json':");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("emits 'text/html' when the endpoint declares responseType('text/html')", async () => {
|
|
21
|
-
const endpoint = e
|
|
22
|
-
.get('/checkout-page')
|
|
23
|
-
.output(z.string())
|
|
24
|
-
.responseType('text/html')
|
|
25
|
-
.handle(async () => '<html></html>');
|
|
26
|
-
|
|
27
|
-
const generator = new OpenApiTsGenerator();
|
|
28
|
-
const content = await generator.generate([endpoint as any]);
|
|
29
|
-
|
|
30
|
-
// Paths interface should reference text/html, not application/json,
|
|
31
|
-
// for this endpoint's 200 response
|
|
32
|
-
expect(content).toContain("'text/html':");
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('keeps JSON content-type for other endpoints when one uses a custom responseType', async () => {
|
|
36
|
-
const htmlEndpoint = e
|
|
37
|
-
.get('/page')
|
|
38
|
-
.output(z.string())
|
|
39
|
-
.responseType('text/html')
|
|
40
|
-
.handle(async () => '<html></html>');
|
|
41
|
-
|
|
42
|
-
const jsonEndpoint = e
|
|
43
|
-
.get('/users')
|
|
44
|
-
.output(z.object({ id: z.string() }))
|
|
45
|
-
.handle(async () => ({ id: '1' }));
|
|
46
|
-
|
|
47
|
-
const generator = new OpenApiTsGenerator();
|
|
48
|
-
const content = await generator.generate([
|
|
49
|
-
htmlEndpoint as any,
|
|
50
|
-
jsonEndpoint as any,
|
|
51
|
-
]);
|
|
52
|
-
|
|
53
|
-
expect(content).toContain("'text/html':");
|
|
54
|
-
expect(content).toContain("'application/json':");
|
|
55
|
-
});
|
|
56
|
-
});
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { type Queue, QueueBuilder } from '@geekmidas/constructs/queue';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { z } from 'zod';
|
|
6
|
-
import {
|
|
7
|
-
cleanupDir,
|
|
8
|
-
createMockBuildContext,
|
|
9
|
-
createTempDir,
|
|
10
|
-
} from '../../__tests__/test-helpers';
|
|
11
|
-
import type { GeneratedConstruct } from '../Generator';
|
|
12
|
-
import { QueueGenerator } from '../QueueGenerator';
|
|
13
|
-
|
|
14
|
-
const schema = z.object({ orderId: z.string() });
|
|
15
|
-
|
|
16
|
-
describe('QueueGenerator', () => {
|
|
17
|
-
let tempDir: string;
|
|
18
|
-
let outputDir: string;
|
|
19
|
-
let generator: QueueGenerator;
|
|
20
|
-
let context: ReturnType<typeof createMockBuildContext>;
|
|
21
|
-
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
tempDir = await createTempDir();
|
|
24
|
-
outputDir = join(tempDir, 'output');
|
|
25
|
-
generator = new QueueGenerator();
|
|
26
|
-
context = createMockBuildContext();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
afterEach(async () => {
|
|
30
|
-
await cleanupDir(tempDir);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const createQueueConstruct = (
|
|
34
|
-
key: string,
|
|
35
|
-
name: string,
|
|
36
|
-
): GeneratedConstruct<Queue<any, any, any, any>> => {
|
|
37
|
-
const queue = new QueueBuilder()
|
|
38
|
-
.queue(name)
|
|
39
|
-
.batchSize(5)
|
|
40
|
-
.message(schema)
|
|
41
|
-
.handle(async () => {});
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
key,
|
|
45
|
-
name: key.toLowerCase(),
|
|
46
|
-
construct: queue,
|
|
47
|
-
path: {
|
|
48
|
-
absolute: join(tempDir, `${key}.ts`),
|
|
49
|
-
relative: `${key}.ts`,
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
describe('isConstruct', () => {
|
|
55
|
-
it('identifies queues and rejects everything else', () => {
|
|
56
|
-
const queue = new QueueBuilder()
|
|
57
|
-
.queue('orders')
|
|
58
|
-
.message(schema)
|
|
59
|
-
.handle(async () => {});
|
|
60
|
-
|
|
61
|
-
expect(generator.isConstruct(queue)).toBe(true);
|
|
62
|
-
expect(generator.isConstruct({})).toBe(false);
|
|
63
|
-
expect(generator.isConstruct(null)).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('aws-lambda provider', () => {
|
|
68
|
-
it('generates one AWSLambdaQueue handler per queue', async () => {
|
|
69
|
-
const constructs = [
|
|
70
|
-
createQueueConstruct('ordersQueue', 'orders'),
|
|
71
|
-
createQueueConstruct('emailsQueue', 'emails'),
|
|
72
|
-
];
|
|
73
|
-
|
|
74
|
-
const infos = await generator.build(context, constructs, outputDir, {
|
|
75
|
-
provider: 'aws-lambda',
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
expect(infos).toHaveLength(2);
|
|
79
|
-
expect(infos[0]).toMatchObject({
|
|
80
|
-
name: 'orders',
|
|
81
|
-
handler: expect.stringContaining('queues/ordersQueue.handler'),
|
|
82
|
-
batchSize: 5,
|
|
83
|
-
});
|
|
84
|
-
// Env requirement from the (sniffed) producer flows nowhere here, but the
|
|
85
|
-
// consumer queue's own services would; assert the field exists.
|
|
86
|
-
expect(infos[0].environment).toBeDefined();
|
|
87
|
-
|
|
88
|
-
const handler = await readFile(
|
|
89
|
-
join(outputDir, 'queues', 'ordersQueue.ts'),
|
|
90
|
-
'utf-8',
|
|
91
|
-
);
|
|
92
|
-
expect(handler).toContain(
|
|
93
|
-
"import { AWSLambdaQueue } from '@geekmidas/constructs/aws'",
|
|
94
|
-
);
|
|
95
|
-
expect(handler).toContain('import { ordersQueue }');
|
|
96
|
-
expect(handler).toContain('new AWSLambdaQueue(envParser, ordersQueue)');
|
|
97
|
-
expect(handler).toContain('export const handler = adapter.handler');
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('returns an empty array for no queues', async () => {
|
|
101
|
-
const infos = await generator.build(context, [], outputDir, {
|
|
102
|
-
provider: 'aws-lambda',
|
|
103
|
-
});
|
|
104
|
-
expect(infos).toEqual([]);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
describe('server provider', () => {
|
|
109
|
-
it('generates queues.ts with the setupQueues poller even when empty', async () => {
|
|
110
|
-
const infos = await generator.build(context, [], outputDir, {
|
|
111
|
-
provider: 'server',
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
expect(infos).toEqual([]);
|
|
115
|
-
|
|
116
|
-
const content = await readFile(join(outputDir, 'queues.ts'), 'utf-8');
|
|
117
|
-
expect(content).toContain('export async function setupQueues');
|
|
118
|
-
expect(content).toContain('const queues = [');
|
|
119
|
-
expect(content).toContain('EVENT_SUBSCRIBER_CONNECTION_STRING');
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('subscribes each queue by its name and validates the payload', async () => {
|
|
123
|
-
const constructs = [
|
|
124
|
-
createQueueConstruct('ordersQueue', 'orders'),
|
|
125
|
-
createQueueConstruct('emailsQueue', 'emails'),
|
|
126
|
-
];
|
|
127
|
-
|
|
128
|
-
await generator.build(context, constructs, outputDir, {
|
|
129
|
-
provider: 'server',
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
const content = await readFile(join(outputDir, 'queues.ts'), 'utf-8');
|
|
133
|
-
expect(content).toContain('import { ordersQueue }');
|
|
134
|
-
expect(content).toContain('import { emailsQueue }');
|
|
135
|
-
// A queue subscribes to a single "type" — its own name.
|
|
136
|
-
expect(content).toContain('eventSubscriber.subscribe([queue.name]');
|
|
137
|
-
expect(content).toContain("queue.messageSchema['~standard'].validate");
|
|
138
|
-
expect(content).toContain('messages: [validation.value]');
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
});
|