@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
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env -S npx tsx
|
|
2
|
-
|
|
3
|
-
import { exec } from 'node:child_process';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
5
|
-
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
6
|
-
import { dirname, join } from 'node:path';
|
|
7
|
-
import { promisify } from 'node:util';
|
|
8
|
-
|
|
9
|
-
const execAsync = promisify(exec);
|
|
10
|
-
|
|
11
|
-
interface ReactQueryOptions {
|
|
12
|
-
input?: string;
|
|
13
|
-
output?: string;
|
|
14
|
-
name?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface OpenAPISpec {
|
|
18
|
-
openapi: string;
|
|
19
|
-
info?: {
|
|
20
|
-
title?: string;
|
|
21
|
-
version?: string;
|
|
22
|
-
};
|
|
23
|
-
paths: Record<string, Record<string, any>>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function generateReactQueryCommand(
|
|
27
|
-
options: ReactQueryOptions = {},
|
|
28
|
-
): Promise<void> {
|
|
29
|
-
const logger = console;
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
// Read OpenAPI spec
|
|
33
|
-
const inputPath = options.input || join(process.cwd(), 'openapi.json');
|
|
34
|
-
|
|
35
|
-
if (!existsSync(inputPath)) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
`OpenAPI spec not found at ${inputPath}. Run 'npx @geekmidas/cli openapi' first.`,
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const specContent = await readFile(inputPath, 'utf-8');
|
|
42
|
-
const spec: OpenAPISpec = JSON.parse(specContent);
|
|
43
|
-
|
|
44
|
-
// Generate TypeScript types from OpenAPI spec
|
|
45
|
-
const outputDir = dirname(
|
|
46
|
-
options.output || join(process.cwd(), 'src', 'api', 'hooks.ts'),
|
|
47
|
-
);
|
|
48
|
-
const typesPath = join(outputDir, 'openapi-types.d.ts');
|
|
49
|
-
|
|
50
|
-
logger.log('Generating TypeScript types from OpenAPI spec...');
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
// Use npx to run openapi-typescript
|
|
54
|
-
await execAsync(
|
|
55
|
-
`npx openapi-typescript "${inputPath}" -o "${typesPath}"`,
|
|
56
|
-
{ cwd: process.cwd() },
|
|
57
|
-
);
|
|
58
|
-
logger.log(`TypeScript types generated: ${typesPath}`);
|
|
59
|
-
} catch (_error) {
|
|
60
|
-
logger.warn(
|
|
61
|
-
'Could not generate types with openapi-typescript. Install it for better type inference.',
|
|
62
|
-
);
|
|
63
|
-
logger.warn('Run: npm install -D openapi-typescript');
|
|
64
|
-
|
|
65
|
-
// Generate basic types file
|
|
66
|
-
await mkdir(dirname(typesPath), { recursive: true });
|
|
67
|
-
await writeFile(
|
|
68
|
-
typesPath,
|
|
69
|
-
`// Auto-generated placeholder types
|
|
70
|
-
export interface paths {
|
|
71
|
-
[path: string]: {
|
|
72
|
-
[method: string]: {
|
|
73
|
-
operationId?: string;
|
|
74
|
-
parameters?: any;
|
|
75
|
-
requestBody?: any;
|
|
76
|
-
responses?: any;
|
|
77
|
-
};
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
`,
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Extract operation info
|
|
85
|
-
const operations = extractOperations(spec);
|
|
86
|
-
|
|
87
|
-
// Generate TypeScript code
|
|
88
|
-
const code = generateReactQueryCode(
|
|
89
|
-
spec,
|
|
90
|
-
operations,
|
|
91
|
-
options.name || 'API',
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
// Write output
|
|
95
|
-
const outputPath =
|
|
96
|
-
options.output || join(process.cwd(), 'src', 'api', 'hooks.ts');
|
|
97
|
-
await mkdir(dirname(outputPath), { recursive: true });
|
|
98
|
-
await writeFile(outputPath, code);
|
|
99
|
-
|
|
100
|
-
logger.log(`React Query hooks generated: ${outputPath}`);
|
|
101
|
-
logger.log(`Generated ${operations.length} hooks`);
|
|
102
|
-
} catch (error) {
|
|
103
|
-
throw new Error(
|
|
104
|
-
`React Query generation failed: ${(error as Error).message}`,
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
interface OperationInfo {
|
|
110
|
-
operationId: string;
|
|
111
|
-
path: string;
|
|
112
|
-
method: string;
|
|
113
|
-
endpoint: string; // Full endpoint like 'GET /users/{id}'
|
|
114
|
-
parameters?: Array<{ name: string; in: string; required?: boolean }>;
|
|
115
|
-
requestBody?: boolean;
|
|
116
|
-
responseType?: string;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function extractOperations(spec: OpenAPISpec): OperationInfo[] {
|
|
120
|
-
const operations: OperationInfo[] = [];
|
|
121
|
-
|
|
122
|
-
Object.entries(spec.paths).forEach(([path, methods]) => {
|
|
123
|
-
Object.entries(methods).forEach(([method, operation]) => {
|
|
124
|
-
if (operation.operationId) {
|
|
125
|
-
operations.push({
|
|
126
|
-
operationId: operation.operationId,
|
|
127
|
-
path,
|
|
128
|
-
method: method.toUpperCase(),
|
|
129
|
-
endpoint: `${method.toUpperCase()} ${path}`,
|
|
130
|
-
parameters: operation.parameters,
|
|
131
|
-
requestBody: !!operation.requestBody,
|
|
132
|
-
responseType: extractResponseType(operation),
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
return operations;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function extractResponseType(operation: any): string {
|
|
142
|
-
const responses = operation.responses;
|
|
143
|
-
if (!responses) return 'unknown';
|
|
144
|
-
|
|
145
|
-
const successResponse = responses['200'] || responses['201'];
|
|
146
|
-
if (!successResponse?.content?.['application/json']?.schema) {
|
|
147
|
-
return 'unknown';
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Basic type inference from schema
|
|
151
|
-
const schema = successResponse.content['application/json'].schema;
|
|
152
|
-
return schemaToTypeString(schema);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function schemaToTypeString(schema: any): string {
|
|
156
|
-
if (!schema) return 'unknown';
|
|
157
|
-
|
|
158
|
-
switch (schema.type) {
|
|
159
|
-
case 'string':
|
|
160
|
-
return 'string';
|
|
161
|
-
case 'number':
|
|
162
|
-
case 'integer':
|
|
163
|
-
return 'number';
|
|
164
|
-
case 'boolean':
|
|
165
|
-
return 'boolean';
|
|
166
|
-
case 'array':
|
|
167
|
-
return `Array<${schemaToTypeString(schema.items)}>`;
|
|
168
|
-
case 'object':
|
|
169
|
-
if (schema.properties) {
|
|
170
|
-
const props = Object.entries(schema.properties)
|
|
171
|
-
.map(
|
|
172
|
-
([key, value]: [string, any]) =>
|
|
173
|
-
`${key}: ${schemaToTypeString(value)}`,
|
|
174
|
-
)
|
|
175
|
-
.join('; ');
|
|
176
|
-
return `{ ${props} }`;
|
|
177
|
-
}
|
|
178
|
-
return 'Record<string, unknown>';
|
|
179
|
-
default:
|
|
180
|
-
return 'unknown';
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function generateReactQueryCode(
|
|
185
|
-
_spec: OpenAPISpec,
|
|
186
|
-
operations: OperationInfo[],
|
|
187
|
-
apiName: string,
|
|
188
|
-
): string {
|
|
189
|
-
const imports = `import { createTypedQueryClient } from '@geekmidas/client';
|
|
190
|
-
import type { paths } from './openapi-types';
|
|
191
|
-
|
|
192
|
-
// Create typed query client
|
|
193
|
-
export const ${apiName.toLowerCase()} = createTypedQueryClient<paths>({
|
|
194
|
-
baseURL: process.env.NEXT_PUBLIC_API_URL || '/api',
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// Export individual hooks for better DX
|
|
198
|
-
`;
|
|
199
|
-
|
|
200
|
-
const queryHooks = operations
|
|
201
|
-
.filter((op) => op.method === 'GET')
|
|
202
|
-
.map((op) => generateQueryHook(op, apiName))
|
|
203
|
-
.join('\n\n');
|
|
204
|
-
|
|
205
|
-
const mutationHooks = operations
|
|
206
|
-
.filter((op) => op.method !== 'GET')
|
|
207
|
-
.map((op) => generateMutationHook(op, apiName))
|
|
208
|
-
.join('\n\n');
|
|
209
|
-
|
|
210
|
-
const typeExports = generateTypeExports(operations);
|
|
211
|
-
|
|
212
|
-
return `${imports}
|
|
213
|
-
// Query Hooks
|
|
214
|
-
${queryHooks}
|
|
215
|
-
|
|
216
|
-
// Mutation Hooks
|
|
217
|
-
${mutationHooks}
|
|
218
|
-
|
|
219
|
-
// Type exports for convenience
|
|
220
|
-
${typeExports}
|
|
221
|
-
|
|
222
|
-
// Re-export the api for advanced usage
|
|
223
|
-
export { ${apiName.toLowerCase()} };
|
|
224
|
-
`;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function generateQueryHook(op: OperationInfo, apiName: string): string {
|
|
228
|
-
const hookName = `use${capitalize(op.operationId)}`;
|
|
229
|
-
const endpoint = op.endpoint;
|
|
230
|
-
const hasParams = op.parameters?.some((p) => p.in === 'path');
|
|
231
|
-
const hasQuery = op.parameters?.some((p) => p.in === 'query');
|
|
232
|
-
|
|
233
|
-
// Generate properly typed hook
|
|
234
|
-
let params = '';
|
|
235
|
-
let args = '';
|
|
236
|
-
|
|
237
|
-
if (hasParams || hasQuery) {
|
|
238
|
-
const paramParts: string[] = [];
|
|
239
|
-
if (hasParams) {
|
|
240
|
-
const pathParams =
|
|
241
|
-
op.parameters?.filter((p) => p.in === 'path').map((p) => p.name) || [];
|
|
242
|
-
paramParts.push(
|
|
243
|
-
`params: { ${pathParams.map((p) => `${p}: string`).join('; ')} }`,
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
if (hasQuery) {
|
|
247
|
-
paramParts.push(`query?: Record<string, any>`);
|
|
248
|
-
}
|
|
249
|
-
params = `config: { ${paramParts.join('; ')} }, `;
|
|
250
|
-
args = ', config';
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return `export const ${hookName} = (
|
|
254
|
-
${params}options?: Parameters<typeof ${apiName.toLowerCase()}.useQuery>[2]
|
|
255
|
-
) => {
|
|
256
|
-
return ${apiName.toLowerCase()}.useQuery('${endpoint}' as any${args}, options);
|
|
257
|
-
};`;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function generateMutationHook(op: OperationInfo, apiName: string): string {
|
|
261
|
-
const hookName = `use${capitalize(op.operationId)}`;
|
|
262
|
-
const endpoint = op.endpoint;
|
|
263
|
-
|
|
264
|
-
return `export const ${hookName} = (
|
|
265
|
-
options?: Parameters<typeof ${apiName.toLowerCase()}.useMutation>[1]
|
|
266
|
-
) => {
|
|
267
|
-
return ${apiName.toLowerCase()}.useMutation('${endpoint}' as any, options);
|
|
268
|
-
};`;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function generateTypeExports(operations: OperationInfo[]): string {
|
|
272
|
-
const exports = operations.map((op) => {
|
|
273
|
-
const typeName = capitalize(op.operationId);
|
|
274
|
-
const isQuery = op.method === 'GET';
|
|
275
|
-
|
|
276
|
-
if (isQuery) {
|
|
277
|
-
return `export type ${typeName}Response = Awaited<ReturnType<ReturnType<typeof use${typeName}>['data']>>;`;
|
|
278
|
-
} else {
|
|
279
|
-
return `export type ${typeName}Response = Awaited<ReturnType<ReturnType<typeof use${typeName}>['mutateAsync']>>;`;
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
return exports.join('\n');
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
function capitalize(str: string): string {
|
|
287
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
288
|
-
}
|
package/src/openapi.ts
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env -S npx tsx
|
|
2
|
-
|
|
3
|
-
import { spawn } from 'node:child_process';
|
|
4
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
5
|
-
import { dirname, join } from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import { loadWorkspaceConfig } from './config.js';
|
|
8
|
-
import { EndpointGenerator } from './generators/EndpointGenerator.js';
|
|
9
|
-
import { OpenApiTsGenerator } from './generators/OpenApiTsGenerator.js';
|
|
10
|
-
import type { GkmConfig, OpenApiConfig } from './types.js';
|
|
11
|
-
import { normalizeRoutes } from './workspace/client-generator.js';
|
|
12
|
-
import type { NormalizedAppConfig } from './workspace/types.js';
|
|
13
|
-
|
|
14
|
-
interface OpenAPIOptions {
|
|
15
|
-
cwd?: string;
|
|
16
|
-
/**
|
|
17
|
-
* Workspace mode: generate for a single named backend app. When set,
|
|
18
|
-
* generation runs in-process against the current CWD. When unset,
|
|
19
|
-
* workspace mode spawns one subprocess per backend app so each gets a
|
|
20
|
-
* fresh tsx that loads the app's own tsconfig (path aliases included).
|
|
21
|
-
*/
|
|
22
|
-
app?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Default output path for generated OpenAPI client (used for single-app configs)
|
|
27
|
-
*/
|
|
28
|
-
export const OPENAPI_OUTPUT_PATH = './.gkm/openapi.ts';
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Resolve OpenAPI config from GkmConfig
|
|
32
|
-
*/
|
|
33
|
-
export function resolveOpenApiConfig(
|
|
34
|
-
config: GkmConfig,
|
|
35
|
-
): OpenApiConfig & { enabled: boolean } {
|
|
36
|
-
if (config.openapi === false) {
|
|
37
|
-
return { enabled: false };
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (config.openapi === true || config.openapi === undefined) {
|
|
41
|
-
// Enable by default when not explicitly set (undefined) or explicitly true
|
|
42
|
-
return {
|
|
43
|
-
enabled: true,
|
|
44
|
-
title: 'API Documentation',
|
|
45
|
-
version: '1.0.0',
|
|
46
|
-
description: 'Auto-generated API documentation from endpoints',
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return {
|
|
51
|
-
enabled: config.openapi.enabled !== false,
|
|
52
|
-
title: config.openapi.title || 'API Documentation',
|
|
53
|
-
version: config.openapi.version || '1.0.0',
|
|
54
|
-
description:
|
|
55
|
-
config.openapi.description ||
|
|
56
|
-
'Auto-generated API documentation from endpoints',
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Generate OpenAPI spec from endpoints
|
|
62
|
-
* @returns Object with output path and endpoint count, or null if disabled
|
|
63
|
-
*/
|
|
64
|
-
export async function generateOpenApi(
|
|
65
|
-
config: GkmConfig,
|
|
66
|
-
options: { silent?: boolean; bustCache?: boolean } = {},
|
|
67
|
-
): Promise<{ outputPath: string; endpointCount: number } | null> {
|
|
68
|
-
const logger = options.silent ? { log: () => {} } : console;
|
|
69
|
-
const openApiConfig = resolveOpenApiConfig(config);
|
|
70
|
-
|
|
71
|
-
if (!openApiConfig.enabled) {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const endpointGenerator = new EndpointGenerator();
|
|
76
|
-
const loadedEndpoints = await endpointGenerator.load(
|
|
77
|
-
config.routes,
|
|
78
|
-
undefined,
|
|
79
|
-
options.bustCache,
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
if (loadedEndpoints.length === 0) {
|
|
83
|
-
logger.log('No valid endpoints found for OpenAPI generation');
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const endpoints = loadedEndpoints.map(({ construct }) => construct);
|
|
88
|
-
const outputPath = join(process.cwd(), OPENAPI_OUTPUT_PATH);
|
|
89
|
-
|
|
90
|
-
await mkdir(dirname(outputPath), { recursive: true });
|
|
91
|
-
|
|
92
|
-
const tsGenerator = new OpenApiTsGenerator();
|
|
93
|
-
const tsContent = await tsGenerator.generate(endpoints, {
|
|
94
|
-
title: openApiConfig.title!,
|
|
95
|
-
version: openApiConfig.version!,
|
|
96
|
-
description: openApiConfig.description!,
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
await writeFile(outputPath, tsContent);
|
|
100
|
-
logger.log(`📄 OpenAPI client generated: ${OPENAPI_OUTPUT_PATH}`);
|
|
101
|
-
|
|
102
|
-
return { outputPath, endpointCount: loadedEndpoints.length };
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export async function openapiCommand(
|
|
106
|
-
options: OpenAPIOptions = {},
|
|
107
|
-
): Promise<void> {
|
|
108
|
-
const logger = console;
|
|
109
|
-
|
|
110
|
-
try {
|
|
111
|
-
const loadedConfig = await loadWorkspaceConfig(options.cwd);
|
|
112
|
-
|
|
113
|
-
if (loadedConfig.type === 'single') {
|
|
114
|
-
// Single-app config - use existing behavior
|
|
115
|
-
const config = loadedConfig.raw as GkmConfig;
|
|
116
|
-
|
|
117
|
-
// Enable openapi if not configured
|
|
118
|
-
if (!config.openapi) {
|
|
119
|
-
config.openapi = { enabled: true };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const result = await generateOpenApi(config);
|
|
123
|
-
|
|
124
|
-
if (result) {
|
|
125
|
-
logger.log(`Found ${result.endpointCount} endpoints`);
|
|
126
|
-
}
|
|
127
|
-
} else {
|
|
128
|
-
// Workspace config - generate for each backend app
|
|
129
|
-
const { workspace } = loadedConfig;
|
|
130
|
-
// Always derive the workspace root from the loaded config rather than
|
|
131
|
-
// CWD. Subprocesses run with CWD set to an app directory, and falling
|
|
132
|
-
// back to CWD there causes `join(workspaceRoot, app.path)` to point at
|
|
133
|
-
// a non-existent nested path (e.g. `apps/api/apps/api`).
|
|
134
|
-
const workspaceRoot = workspace.root;
|
|
135
|
-
|
|
136
|
-
// Find backend apps with openapi enabled
|
|
137
|
-
const backendApps = Object.entries(workspace.apps).filter(
|
|
138
|
-
([_, app]) =>
|
|
139
|
-
app.type === 'backend' &&
|
|
140
|
-
(app.openapi === true ||
|
|
141
|
-
(typeof app.openapi === 'object' && app.openapi.enabled !== false)),
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
if (backendApps.length === 0) {
|
|
145
|
-
logger.log('No backend apps with OpenAPI enabled found');
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Single-app mode: generate in-process. The caller is expected to
|
|
150
|
-
// have CWD set to the app's directory (e.g., when invoked as a
|
|
151
|
-
// subprocess), so tsx picks up the app's tsconfig path aliases.
|
|
152
|
-
if (options.app) {
|
|
153
|
-
const entry = backendApps.find(([name]) => name === options.app);
|
|
154
|
-
if (!entry) {
|
|
155
|
-
throw new Error(
|
|
156
|
-
`App "${options.app}" not found or has OpenAPI disabled`,
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
const [appName, app] = entry;
|
|
160
|
-
const result = await generateOpenApiForApp(workspaceRoot, appName, app);
|
|
161
|
-
if (result) {
|
|
162
|
-
logger.log(
|
|
163
|
-
`📄 [${appName}] Generated OpenAPI (${result.endpointCount} endpoints)`,
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Multi-app mode: spawn a subprocess per backend app. Each
|
|
170
|
-
// subprocess starts with CWD at the app's directory so that
|
|
171
|
-
// tsx's tsconfig discovery picks up the app's `paths` aliases
|
|
172
|
-
// (e.g., `~/*`) instead of the workspace root's tsconfig.
|
|
173
|
-
for (const [appName, app] of backendApps) {
|
|
174
|
-
if (app.type !== 'backend' || !app.routes) continue;
|
|
175
|
-
const appPath = join(workspaceRoot, app.path);
|
|
176
|
-
await runOpenApiInSubprocess(appPath, appName);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
} catch (error) {
|
|
180
|
-
throw new Error(`OpenAPI generation failed: ${(error as Error).message}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Generate OpenAPI for a single named app within a workspace.
|
|
186
|
-
* Runs in-process. The caller is responsible for ensuring `process.cwd()`
|
|
187
|
-
* is the app's directory so tsx loads the app's tsconfig path aliases.
|
|
188
|
-
*/
|
|
189
|
-
async function generateOpenApiForApp(
|
|
190
|
-
workspaceRoot: string,
|
|
191
|
-
_appName: string,
|
|
192
|
-
app: NormalizedAppConfig,
|
|
193
|
-
): Promise<{ outputPath: string; endpointCount: number } | null> {
|
|
194
|
-
if (app.type !== 'backend' || !app.routes) {
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const appPath = join(workspaceRoot, app.path);
|
|
199
|
-
const routes = normalizeRoutes(app.routes);
|
|
200
|
-
const routesGlob = routes.map((r) => join(appPath, r));
|
|
201
|
-
|
|
202
|
-
const gkmConfig: GkmConfig = {
|
|
203
|
-
routes: routesGlob,
|
|
204
|
-
envParser: app.envParser || '',
|
|
205
|
-
logger: app.logger || '',
|
|
206
|
-
openapi: app.openapi,
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
return generateOpenApi(gkmConfig, { silent: true });
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Resolve the gkm bin path. Tests can override via `GKM_BIN_PATH` env var
|
|
214
|
-
* to avoid depending on the built dist.
|
|
215
|
-
*/
|
|
216
|
-
function resolveGkmBinPath(): string {
|
|
217
|
-
if (process.env.GKM_BIN_PATH) {
|
|
218
|
-
return process.env.GKM_BIN_PATH;
|
|
219
|
-
}
|
|
220
|
-
return fileURLToPath(new URL('../bin/gkm.mjs', import.meta.url));
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Spawn a subprocess that runs `gkm openapi --app <name>` with `cwd` set to
|
|
225
|
-
* the app's directory. Inherits `NODE_OPTIONS` (which already contains
|
|
226
|
-
* `--import tsx`), so the child gets a fresh tsx instance whose tsconfig
|
|
227
|
-
* discovery picks up the app's tsconfig path aliases.
|
|
228
|
-
*/
|
|
229
|
-
async function runOpenApiInSubprocess(
|
|
230
|
-
appCwd: string,
|
|
231
|
-
appName: string,
|
|
232
|
-
): Promise<void> {
|
|
233
|
-
const binPath = resolveGkmBinPath();
|
|
234
|
-
|
|
235
|
-
await new Promise<void>((resolve, reject) => {
|
|
236
|
-
const child = spawn(
|
|
237
|
-
process.execPath,
|
|
238
|
-
[binPath, 'openapi', '--app', appName],
|
|
239
|
-
{
|
|
240
|
-
cwd: appCwd,
|
|
241
|
-
stdio: 'inherit',
|
|
242
|
-
env: process.env,
|
|
243
|
-
},
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
child.on('error', reject);
|
|
247
|
-
child.on('close', (code) => {
|
|
248
|
-
if (code === 0) {
|
|
249
|
-
resolve();
|
|
250
|
-
} else {
|
|
251
|
-
reject(
|
|
252
|
-
new Error(
|
|
253
|
-
`OpenAPI generation for app "${appName}" exited with code ${code}`,
|
|
254
|
-
),
|
|
255
|
-
);
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
}
|