@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,838 +0,0 @@
|
|
|
1
|
-
import { dirname, resolve } from 'node:path';
|
|
2
|
-
import { fileURLToPath } from 'node:url';
|
|
3
|
-
import { describe, expect, it } from 'vitest';
|
|
4
|
-
import type { NormalizedAppConfig } from '../../workspace/types';
|
|
5
|
-
import {
|
|
6
|
-
_sniffEntryFile,
|
|
7
|
-
_sniffEnvParser,
|
|
8
|
-
_sniffRouteFiles,
|
|
9
|
-
sniffAllApps,
|
|
10
|
-
sniffAppEnvironment,
|
|
11
|
-
} from '../sniffer';
|
|
12
|
-
|
|
13
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
-
const __dirname = dirname(__filename);
|
|
15
|
-
const fixturesPath = resolve(__dirname, '__fixtures__/entry-apps');
|
|
16
|
-
const envParserFixturesPath = resolve(__dirname, '__fixtures__/env-parsers');
|
|
17
|
-
const routeAppsFixturesPath = resolve(__dirname, '__fixtures__/route-apps');
|
|
18
|
-
|
|
19
|
-
describe('sniffAppEnvironment', () => {
|
|
20
|
-
const workspacePath = '/test/workspace';
|
|
21
|
-
|
|
22
|
-
const createApp = (
|
|
23
|
-
overrides: Partial<NormalizedAppConfig> = {},
|
|
24
|
-
): NormalizedAppConfig => ({
|
|
25
|
-
type: 'backend',
|
|
26
|
-
path: 'apps/api',
|
|
27
|
-
port: 3000,
|
|
28
|
-
dependencies: [],
|
|
29
|
-
resolvedDeployTarget: 'dokploy',
|
|
30
|
-
...overrides,
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe('frontend apps', () => {
|
|
34
|
-
it('should return empty env vars for frontend apps with no dependencies', async () => {
|
|
35
|
-
const app = createApp({ type: 'web', dependencies: [] });
|
|
36
|
-
|
|
37
|
-
const result = await sniffAppEnvironment(app, 'web', workspacePath);
|
|
38
|
-
|
|
39
|
-
expect(result.appName).toBe('web');
|
|
40
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should return NEXT_PUBLIC_{DEP}_URL for frontend dependencies', async () => {
|
|
44
|
-
const app = createApp({
|
|
45
|
-
type: 'web',
|
|
46
|
-
dependencies: ['api', 'auth'],
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const result = await sniffAppEnvironment(app, 'web', workspacePath);
|
|
50
|
-
|
|
51
|
-
expect(result.appName).toBe('web');
|
|
52
|
-
expect(result.requiredEnvVars).toContain('NEXT_PUBLIC_API_URL');
|
|
53
|
-
expect(result.requiredEnvVars).toContain('NEXT_PUBLIC_AUTH_URL');
|
|
54
|
-
expect(result.requiredEnvVars).toHaveLength(2);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should generate uppercase dep names in NEXT_PUBLIC_{DEP}_URL', async () => {
|
|
58
|
-
const app = createApp({
|
|
59
|
-
type: 'web',
|
|
60
|
-
dependencies: ['payments-service', 'notification_api'],
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const result = await sniffAppEnvironment(app, 'web', workspacePath);
|
|
64
|
-
|
|
65
|
-
expect(result.requiredEnvVars).toContain(
|
|
66
|
-
'NEXT_PUBLIC_PAYMENTS-SERVICE_URL',
|
|
67
|
-
);
|
|
68
|
-
expect(result.requiredEnvVars).toContain(
|
|
69
|
-
'NEXT_PUBLIC_NOTIFICATION_API_URL',
|
|
70
|
-
);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe('config sniffing', () => {
|
|
74
|
-
it('should sniff env vars from config.client path', async () => {
|
|
75
|
-
const app = createApp({
|
|
76
|
-
type: 'web',
|
|
77
|
-
path: fixturesPath,
|
|
78
|
-
dependencies: [],
|
|
79
|
-
config: {
|
|
80
|
-
client: './simple-entry.ts',
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const result = await sniffAppEnvironment(app, 'web', fixturesPath);
|
|
85
|
-
|
|
86
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
87
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
88
|
-
expect(result.requiredEnvVars).toContain('REDIS_URL');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('should sniff env vars from config.server path', async () => {
|
|
92
|
-
const app = createApp({
|
|
93
|
-
type: 'web',
|
|
94
|
-
path: fixturesPath,
|
|
95
|
-
dependencies: [],
|
|
96
|
-
config: {
|
|
97
|
-
server: './nested-config-entry.ts',
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
const result = await sniffAppEnvironment(app, 'web', fixturesPath);
|
|
102
|
-
|
|
103
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
104
|
-
expect(result.requiredEnvVars).toContain('HOST');
|
|
105
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('should combine vars from both config.client and config.server', async () => {
|
|
109
|
-
const app = createApp({
|
|
110
|
-
type: 'web',
|
|
111
|
-
path: fixturesPath,
|
|
112
|
-
dependencies: ['api'],
|
|
113
|
-
config: {
|
|
114
|
-
client: './simple-entry.ts',
|
|
115
|
-
server: './nested-config-entry.ts',
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const result = await sniffAppEnvironment(app, 'web', fixturesPath);
|
|
120
|
-
|
|
121
|
-
// Dependency var
|
|
122
|
-
expect(result.requiredEnvVars).toContain('NEXT_PUBLIC_API_URL');
|
|
123
|
-
// From simple-entry.ts
|
|
124
|
-
expect(result.requiredEnvVars).toContain('REDIS_URL');
|
|
125
|
-
// From nested-config-entry.ts
|
|
126
|
-
expect(result.requiredEnvVars).toContain('HOST');
|
|
127
|
-
expect(result.requiredEnvVars).toContain('BETTER_AUTH_SECRET');
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('should deduplicate vars from both config files', async () => {
|
|
131
|
-
const app = createApp({
|
|
132
|
-
type: 'web',
|
|
133
|
-
path: fixturesPath,
|
|
134
|
-
dependencies: [],
|
|
135
|
-
config: {
|
|
136
|
-
client: './simple-entry.ts',
|
|
137
|
-
server: './nested-config-entry.ts',
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
const result = await sniffAppEnvironment(app, 'web', fixturesPath);
|
|
142
|
-
|
|
143
|
-
// Both files have PORT and DATABASE_URL, should only appear once
|
|
144
|
-
const portCount = result.requiredEnvVars.filter(
|
|
145
|
-
(v) => v === 'PORT',
|
|
146
|
-
).length;
|
|
147
|
-
const dbUrlCount = result.requiredEnvVars.filter(
|
|
148
|
-
(v) => v === 'DATABASE_URL',
|
|
149
|
-
).length;
|
|
150
|
-
|
|
151
|
-
expect(portCount).toBe(1);
|
|
152
|
-
expect(dbUrlCount).toBe(1);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
describe('apps with envParser', () => {
|
|
158
|
-
it('should return empty when envParser module cannot be loaded', async () => {
|
|
159
|
-
const app = createApp({
|
|
160
|
-
envParser: './src/nonexistent/env#parser',
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// This will fail to load the module and return empty
|
|
164
|
-
// Suppress warnings for this test
|
|
165
|
-
const result = await sniffAppEnvironment(app, 'api', workspacePath, {
|
|
166
|
-
logWarnings: false,
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it('should gracefully handle errors without failing the build', async () => {
|
|
173
|
-
const app = createApp({
|
|
174
|
-
envParser: './src/invalid/path#nonexistent',
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// Should not throw, just return empty
|
|
178
|
-
const result = await sniffAppEnvironment(app, 'api', workspacePath, {
|
|
179
|
-
logWarnings: false,
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
expect(result.appName).toBe('api');
|
|
183
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe('apps without env detection', () => {
|
|
188
|
-
it('should return empty when no envParser, entry, or routes', async () => {
|
|
189
|
-
const app = createApp({
|
|
190
|
-
// No envParser, entry, or routes
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
const result = await sniffAppEnvironment(app, 'api', workspacePath);
|
|
194
|
-
|
|
195
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
196
|
-
expect(result.optionalEnvVars).toEqual([]);
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
describe('markOptional option', () => {
|
|
201
|
-
it('returns optionalEnvVars populated from envParser with optional/default vars', async () => {
|
|
202
|
-
const app = createApp({
|
|
203
|
-
path: envParserFixturesPath,
|
|
204
|
-
envParser: './optional-env-parser#envParser',
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
const result = await sniffAppEnvironment(
|
|
208
|
-
app,
|
|
209
|
-
'api',
|
|
210
|
-
envParserFixturesPath,
|
|
211
|
-
{
|
|
212
|
-
logWarnings: false,
|
|
213
|
-
},
|
|
214
|
-
);
|
|
215
|
-
|
|
216
|
-
// All vars present regardless of markOptional
|
|
217
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
218
|
-
expect(result.requiredEnvVars).toContain('API_KEY');
|
|
219
|
-
expect(result.requiredEnvVars).toContain('LOG_LEVEL');
|
|
220
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
221
|
-
expect(result.requiredEnvVars).toContain('TIMEOUT');
|
|
222
|
-
|
|
223
|
-
// Optional vars populated (no ? suffix since markOptional not set)
|
|
224
|
-
expect(result.optionalEnvVars).toContain('LOG_LEVEL');
|
|
225
|
-
expect(result.optionalEnvVars).toContain('PORT');
|
|
226
|
-
expect(result.optionalEnvVars).toContain('TIMEOUT');
|
|
227
|
-
expect(result.optionalEnvVars).not.toContain('DATABASE_URL');
|
|
228
|
-
expect(result.optionalEnvVars).not.toContain('API_KEY');
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it('suffixes optional vars with ? in requiredEnvVars when markOptional is true', async () => {
|
|
232
|
-
const app = createApp({
|
|
233
|
-
path: envParserFixturesPath,
|
|
234
|
-
envParser: './optional-env-parser#envParser',
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
const result = await sniffAppEnvironment(
|
|
238
|
-
app,
|
|
239
|
-
'api',
|
|
240
|
-
envParserFixturesPath,
|
|
241
|
-
{
|
|
242
|
-
logWarnings: false,
|
|
243
|
-
markOptional: true,
|
|
244
|
-
},
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
// Required vars unchanged
|
|
248
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
249
|
-
expect(result.requiredEnvVars).toContain('API_KEY');
|
|
250
|
-
|
|
251
|
-
// Optional vars suffixed with ?
|
|
252
|
-
expect(result.requiredEnvVars).toContain('LOG_LEVEL?');
|
|
253
|
-
expect(result.requiredEnvVars).toContain('PORT?');
|
|
254
|
-
expect(result.requiredEnvVars).toContain('TIMEOUT?');
|
|
255
|
-
|
|
256
|
-
// Plain names not present for optional vars
|
|
257
|
-
expect(result.requiredEnvVars).not.toContain('LOG_LEVEL');
|
|
258
|
-
expect(result.requiredEnvVars).not.toContain('PORT');
|
|
259
|
-
expect(result.requiredEnvVars).not.toContain('TIMEOUT');
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('does not add ? suffix when markOptional is false (default)', async () => {
|
|
263
|
-
const app = createApp({
|
|
264
|
-
path: envParserFixturesPath,
|
|
265
|
-
envParser: './optional-env-parser#envParser',
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
const result = await sniffAppEnvironment(
|
|
269
|
-
app,
|
|
270
|
-
'api',
|
|
271
|
-
envParserFixturesPath,
|
|
272
|
-
{
|
|
273
|
-
logWarnings: false,
|
|
274
|
-
markOptional: false,
|
|
275
|
-
},
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
// No ? suffixes regardless of optionality
|
|
279
|
-
for (const v of result.requiredEnvVars) {
|
|
280
|
-
expect(v).not.toMatch(/\?$/);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it('returns empty optionalEnvVars for apps with no optional vars', async () => {
|
|
285
|
-
const app = createApp({
|
|
286
|
-
path: envParserFixturesPath,
|
|
287
|
-
envParser: './valid-env-parser#envParser',
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
const result = await sniffAppEnvironment(
|
|
291
|
-
app,
|
|
292
|
-
'api',
|
|
293
|
-
envParserFixturesPath,
|
|
294
|
-
{
|
|
295
|
-
logWarnings: false,
|
|
296
|
-
markOptional: true,
|
|
297
|
-
},
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
expect(result.optionalEnvVars).toEqual([]);
|
|
301
|
-
// No ? suffixes when nothing is optional
|
|
302
|
-
for (const v of result.requiredEnvVars) {
|
|
303
|
-
expect(v).not.toMatch(/\?$/);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it('returns empty optionalEnvVars for frontend apps', async () => {
|
|
308
|
-
const app = createApp({
|
|
309
|
-
type: 'web',
|
|
310
|
-
dependencies: ['api'],
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
const result = await sniffAppEnvironment(app, 'web', workspacePath);
|
|
314
|
-
|
|
315
|
-
expect(result.optionalEnvVars).toEqual([]);
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
describe('sniffAllApps', () => {
|
|
321
|
-
const workspacePath = '/test/workspace';
|
|
322
|
-
|
|
323
|
-
it('should sniff all apps in workspace', async () => {
|
|
324
|
-
const apps: Record<string, NormalizedAppConfig> = {
|
|
325
|
-
api: {
|
|
326
|
-
type: 'backend',
|
|
327
|
-
path: 'apps/api',
|
|
328
|
-
port: 3000,
|
|
329
|
-
dependencies: [],
|
|
330
|
-
resolvedDeployTarget: 'dokploy',
|
|
331
|
-
// No entry, routes, or envParser - will return empty
|
|
332
|
-
},
|
|
333
|
-
auth: {
|
|
334
|
-
type: 'backend',
|
|
335
|
-
path: 'apps/auth',
|
|
336
|
-
port: 3002,
|
|
337
|
-
dependencies: [],
|
|
338
|
-
resolvedDeployTarget: 'dokploy',
|
|
339
|
-
// No entry, routes, or envParser - will return empty
|
|
340
|
-
},
|
|
341
|
-
web: {
|
|
342
|
-
type: 'web',
|
|
343
|
-
path: 'apps/web',
|
|
344
|
-
port: 3001,
|
|
345
|
-
dependencies: ['api', 'auth'],
|
|
346
|
-
resolvedDeployTarget: 'dokploy',
|
|
347
|
-
},
|
|
348
|
-
};
|
|
349
|
-
|
|
350
|
-
const results = await sniffAllApps(apps, workspacePath);
|
|
351
|
-
|
|
352
|
-
expect(results.size).toBe(3);
|
|
353
|
-
|
|
354
|
-
expect(results.get('api')).toEqual({
|
|
355
|
-
appName: 'api',
|
|
356
|
-
requiredEnvVars: [],
|
|
357
|
-
optionalEnvVars: [],
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
expect(results.get('auth')).toEqual({
|
|
361
|
-
appName: 'auth',
|
|
362
|
-
requiredEnvVars: [],
|
|
363
|
-
optionalEnvVars: [],
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
expect(results.get('web')).toEqual({
|
|
367
|
-
appName: 'web',
|
|
368
|
-
requiredEnvVars: ['NEXT_PUBLIC_API_URL', 'NEXT_PUBLIC_AUTH_URL'],
|
|
369
|
-
optionalEnvVars: [],
|
|
370
|
-
});
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
it('should handle empty apps record', async () => {
|
|
374
|
-
const apps: Record<string, NormalizedAppConfig> = {};
|
|
375
|
-
|
|
376
|
-
const results = await sniffAllApps(apps, workspacePath);
|
|
377
|
-
|
|
378
|
-
expect(results.size).toBe(0);
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
it('should pass options to individual app sniffing', async () => {
|
|
382
|
-
const apps: Record<string, NormalizedAppConfig> = {
|
|
383
|
-
api: {
|
|
384
|
-
type: 'backend',
|
|
385
|
-
path: 'apps/api',
|
|
386
|
-
port: 3000,
|
|
387
|
-
dependencies: [],
|
|
388
|
-
resolvedDeployTarget: 'dokploy',
|
|
389
|
-
envParser: './src/nonexistent/env#parser', // Will fail but shouldn't log
|
|
390
|
-
},
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
// Should not throw, and suppress warnings
|
|
394
|
-
const results = await sniffAllApps(apps, workspacePath, {
|
|
395
|
-
logWarnings: false,
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
expect(results.size).toBe(1);
|
|
399
|
-
expect(results.get('api')?.requiredEnvVars).toEqual([]);
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
describe('fire-and-forget handling', () => {
|
|
404
|
-
it('captures environment variables even when envParser throws', async () => {
|
|
405
|
-
// The sniffer should capture env vars that were accessed before an error
|
|
406
|
-
// This is the "fire and forget" pattern - errors don't stop env detection
|
|
407
|
-
const app: NormalizedAppConfig = {
|
|
408
|
-
type: 'backend',
|
|
409
|
-
path: 'apps/api',
|
|
410
|
-
port: 3000,
|
|
411
|
-
dependencies: [],
|
|
412
|
-
resolvedDeployTarget: 'dokploy',
|
|
413
|
-
envParser: './src/invalid#missing',
|
|
414
|
-
};
|
|
415
|
-
|
|
416
|
-
const result = await sniffAppEnvironment(app, 'api', '/test/workspace', {
|
|
417
|
-
logWarnings: false,
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
// Should return gracefully without throwing
|
|
421
|
-
expect(result.appName).toBe('api');
|
|
422
|
-
expect(Array.isArray(result.requiredEnvVars)).toBe(true);
|
|
423
|
-
});
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
describe('entry app sniffing via subprocess', () => {
|
|
427
|
-
// These tests verify the subprocess-based sniffing for entry apps.
|
|
428
|
-
// Each test uses fixture files that import @geekmidas/envkit.
|
|
429
|
-
|
|
430
|
-
it('should sniff environment variables from simple entry app', async () => {
|
|
431
|
-
const result = await _sniffEntryFile(
|
|
432
|
-
'./simple-entry.ts',
|
|
433
|
-
fixturesPath,
|
|
434
|
-
fixturesPath,
|
|
435
|
-
);
|
|
436
|
-
|
|
437
|
-
expect(result.envVars).toContain('PORT');
|
|
438
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
439
|
-
expect(result.envVars).toContain('REDIS_URL');
|
|
440
|
-
expect(result.envVars).toHaveLength(3);
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
it('should sniff environment variables from nested config entry app', async () => {
|
|
444
|
-
const result = await _sniffEntryFile(
|
|
445
|
-
'./nested-config-entry.ts',
|
|
446
|
-
fixturesPath,
|
|
447
|
-
fixturesPath,
|
|
448
|
-
);
|
|
449
|
-
|
|
450
|
-
// Should capture all nested env vars
|
|
451
|
-
expect(result.envVars).toContain('PORT');
|
|
452
|
-
expect(result.envVars).toContain('HOST');
|
|
453
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
454
|
-
expect(result.envVars).toContain('DB_POOL_SIZE');
|
|
455
|
-
expect(result.envVars).toContain('BETTER_AUTH_SECRET');
|
|
456
|
-
expect(result.envVars).toContain('BETTER_AUTH_URL');
|
|
457
|
-
expect(result.envVars).toContain('BETTER_AUTH_TRUSTED_ORIGINS');
|
|
458
|
-
expect(result.envVars).toHaveLength(7);
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it('should capture env vars even when entry throws', async () => {
|
|
462
|
-
const result = await _sniffEntryFile(
|
|
463
|
-
'./throwing-entry.ts',
|
|
464
|
-
fixturesPath,
|
|
465
|
-
fixturesPath,
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
// Should still capture env vars accessed before the throw
|
|
469
|
-
expect(result.envVars).toContain('PORT');
|
|
470
|
-
expect(result.envVars).toContain('API_KEY');
|
|
471
|
-
expect(result.envVars).toHaveLength(2);
|
|
472
|
-
|
|
473
|
-
// Should report the error
|
|
474
|
-
expect(result.error).toBeDefined();
|
|
475
|
-
expect(result.error?.message).toContain('Initialization failed');
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
it('should return empty when entry has no env vars', async () => {
|
|
479
|
-
const result = await _sniffEntryFile(
|
|
480
|
-
'./no-env-entry.ts',
|
|
481
|
-
fixturesPath,
|
|
482
|
-
fixturesPath,
|
|
483
|
-
);
|
|
484
|
-
|
|
485
|
-
expect(result.envVars).toEqual([]);
|
|
486
|
-
expect(result.error).toBeUndefined();
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
it('should handle async entry apps with fire-and-forget promises', async () => {
|
|
490
|
-
const result = await _sniffEntryFile(
|
|
491
|
-
'./async-entry.ts',
|
|
492
|
-
fixturesPath,
|
|
493
|
-
fixturesPath,
|
|
494
|
-
);
|
|
495
|
-
|
|
496
|
-
expect(result.envVars).toContain('PORT');
|
|
497
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
498
|
-
expect(result.envVars).toHaveLength(2);
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
it('should return error for non-existent entry file', async () => {
|
|
502
|
-
const result = await _sniffEntryFile(
|
|
503
|
-
'./non-existent.ts',
|
|
504
|
-
fixturesPath,
|
|
505
|
-
fixturesPath,
|
|
506
|
-
);
|
|
507
|
-
|
|
508
|
-
expect(result.envVars).toEqual([]);
|
|
509
|
-
expect(result.error).toBeDefined();
|
|
510
|
-
});
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
describe('sniffAppEnvironment with entry apps', () => {
|
|
514
|
-
// Integration tests for sniffAppEnvironment with entry-based apps
|
|
515
|
-
|
|
516
|
-
it('should use subprocess sniffing for entry apps', async () => {
|
|
517
|
-
const app: NormalizedAppConfig = {
|
|
518
|
-
type: 'backend',
|
|
519
|
-
path: fixturesPath,
|
|
520
|
-
port: 3000,
|
|
521
|
-
dependencies: [],
|
|
522
|
-
resolvedDeployTarget: 'dokploy',
|
|
523
|
-
entry: './simple-entry.ts',
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
const result = await sniffAppEnvironment(app, 'api', fixturesPath);
|
|
527
|
-
|
|
528
|
-
expect(result.appName).toBe('api');
|
|
529
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
530
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
531
|
-
expect(result.requiredEnvVars).toContain('REDIS_URL');
|
|
532
|
-
});
|
|
533
|
-
|
|
534
|
-
it('should handle entry app that throws and still return captured env vars', async () => {
|
|
535
|
-
const app: NormalizedAppConfig = {
|
|
536
|
-
type: 'backend',
|
|
537
|
-
path: fixturesPath,
|
|
538
|
-
port: 3000,
|
|
539
|
-
dependencies: [],
|
|
540
|
-
resolvedDeployTarget: 'dokploy',
|
|
541
|
-
entry: './throwing-entry.ts',
|
|
542
|
-
};
|
|
543
|
-
|
|
544
|
-
const result = await sniffAppEnvironment(app, 'api', fixturesPath, {
|
|
545
|
-
logWarnings: false,
|
|
546
|
-
});
|
|
547
|
-
|
|
548
|
-
expect(result.appName).toBe('api');
|
|
549
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
550
|
-
expect(result.requiredEnvVars).toContain('API_KEY');
|
|
551
|
-
});
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
describe('envParser sniffing via _sniffEnvParser', () => {
|
|
555
|
-
// These tests verify the envParser sniffing functionality.
|
|
556
|
-
// Each test uses fixture files that export envParser functions.
|
|
557
|
-
|
|
558
|
-
it('should sniff environment variables from valid envParser', async () => {
|
|
559
|
-
const result = await _sniffEnvParser(
|
|
560
|
-
'./valid-env-parser.ts#envParser',
|
|
561
|
-
envParserFixturesPath,
|
|
562
|
-
envParserFixturesPath,
|
|
563
|
-
);
|
|
564
|
-
|
|
565
|
-
expect(result.envVars).toContain('PORT');
|
|
566
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
567
|
-
expect(result.envVars).toContain('DB_POOL_SIZE');
|
|
568
|
-
expect(result.envVars).toHaveLength(3);
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
it('should sniff environment variables from default export', async () => {
|
|
572
|
-
// Test with default export (no # specifier)
|
|
573
|
-
const result = await _sniffEnvParser(
|
|
574
|
-
'./valid-env-parser.ts',
|
|
575
|
-
envParserFixturesPath,
|
|
576
|
-
envParserFixturesPath,
|
|
577
|
-
);
|
|
578
|
-
|
|
579
|
-
expect(result.envVars).toContain('PORT');
|
|
580
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
581
|
-
expect(result.envVars).toContain('DB_POOL_SIZE');
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
it('should return empty when export is not a function', async () => {
|
|
585
|
-
const result = await _sniffEnvParser(
|
|
586
|
-
'./non-function-export.ts#envParser',
|
|
587
|
-
envParserFixturesPath,
|
|
588
|
-
envParserFixturesPath,
|
|
589
|
-
);
|
|
590
|
-
|
|
591
|
-
expect(result.envVars).toEqual([]);
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
it('should handle non-function default export', async () => {
|
|
595
|
-
const result = await _sniffEnvParser(
|
|
596
|
-
'./non-function-export.ts', // Uses default export which is not a function
|
|
597
|
-
envParserFixturesPath,
|
|
598
|
-
envParserFixturesPath,
|
|
599
|
-
);
|
|
600
|
-
|
|
601
|
-
expect(result.envVars).toEqual([]);
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
it('should return empty when module path is empty', async () => {
|
|
605
|
-
const result = await _sniffEnvParser(
|
|
606
|
-
'#envParser', // Empty module path
|
|
607
|
-
envParserFixturesPath,
|
|
608
|
-
envParserFixturesPath,
|
|
609
|
-
);
|
|
610
|
-
|
|
611
|
-
expect(result.envVars).toEqual([]);
|
|
612
|
-
expect(result.unhandledRejections).toEqual([]);
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
it('should capture env vars from throwing envParser', async () => {
|
|
616
|
-
const result = await _sniffEnvParser(
|
|
617
|
-
'./throwing-env-parser.ts#envParser',
|
|
618
|
-
envParserFixturesPath,
|
|
619
|
-
envParserFixturesPath,
|
|
620
|
-
);
|
|
621
|
-
|
|
622
|
-
// Should still capture env vars accessed before the throw
|
|
623
|
-
expect(result.envVars).toContain('PORT');
|
|
624
|
-
expect(result.envVars).toContain('API_KEY');
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
it('should return empty when module does not exist', async () => {
|
|
628
|
-
const result = await _sniffEnvParser(
|
|
629
|
-
'./non-existent.ts#envParser',
|
|
630
|
-
envParserFixturesPath,
|
|
631
|
-
envParserFixturesPath,
|
|
632
|
-
);
|
|
633
|
-
|
|
634
|
-
expect(result.envVars).toEqual([]);
|
|
635
|
-
});
|
|
636
|
-
|
|
637
|
-
it('should call parse() on returned config and capture env vars', async () => {
|
|
638
|
-
// This tests the path where envParser returns a config with parse() method
|
|
639
|
-
const result = await _sniffEnvParser(
|
|
640
|
-
'./parseable-env-parser.ts#envParser',
|
|
641
|
-
envParserFixturesPath,
|
|
642
|
-
envParserFixturesPath,
|
|
643
|
-
);
|
|
644
|
-
|
|
645
|
-
// Should capture env vars even though parse() fails due to missing values
|
|
646
|
-
expect(result.envVars).toContain('PORT');
|
|
647
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
648
|
-
expect(result.envVars).toContain('API_KEY');
|
|
649
|
-
expect(result.envVars).toHaveLength(3);
|
|
650
|
-
});
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
describe('sniffAppEnvironment with envParser apps', () => {
|
|
654
|
-
it('should use envParser sniffing for apps with envParser config', async () => {
|
|
655
|
-
const app: NormalizedAppConfig = {
|
|
656
|
-
type: 'backend',
|
|
657
|
-
path: envParserFixturesPath,
|
|
658
|
-
port: 3000,
|
|
659
|
-
dependencies: [],
|
|
660
|
-
resolvedDeployTarget: 'dokploy',
|
|
661
|
-
envParser: './valid-env-parser.ts#envParser',
|
|
662
|
-
};
|
|
663
|
-
|
|
664
|
-
const result = await sniffAppEnvironment(app, 'api', envParserFixturesPath);
|
|
665
|
-
|
|
666
|
-
expect(result.appName).toBe('api');
|
|
667
|
-
expect(result.requiredEnvVars).toContain('PORT');
|
|
668
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
669
|
-
expect(result.requiredEnvVars).toContain('DB_POOL_SIZE');
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
it('should handle envParser that exports non-function gracefully', async () => {
|
|
673
|
-
const app: NormalizedAppConfig = {
|
|
674
|
-
type: 'backend',
|
|
675
|
-
path: envParserFixturesPath,
|
|
676
|
-
port: 3000,
|
|
677
|
-
dependencies: [],
|
|
678
|
-
resolvedDeployTarget: 'dokploy',
|
|
679
|
-
envParser: './non-function-export.ts#envParser',
|
|
680
|
-
};
|
|
681
|
-
|
|
682
|
-
const result = await sniffAppEnvironment(
|
|
683
|
-
app,
|
|
684
|
-
'api',
|
|
685
|
-
envParserFixturesPath,
|
|
686
|
-
{ logWarnings: false },
|
|
687
|
-
);
|
|
688
|
-
|
|
689
|
-
expect(result.appName).toBe('api');
|
|
690
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
691
|
-
});
|
|
692
|
-
});
|
|
693
|
-
|
|
694
|
-
describe('route files sniffing via _sniffRouteFiles', () => {
|
|
695
|
-
// These tests verify the route-based sniffing for apps with routes config.
|
|
696
|
-
// Each test uses fixture files that export endpoints with services.
|
|
697
|
-
|
|
698
|
-
it('should sniff environment variables from endpoint with single service', async () => {
|
|
699
|
-
const result = await _sniffRouteFiles(
|
|
700
|
-
'./endpoints/users.ts',
|
|
701
|
-
routeAppsFixturesPath,
|
|
702
|
-
routeAppsFixturesPath,
|
|
703
|
-
);
|
|
704
|
-
|
|
705
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
706
|
-
// DB_POOL_SIZE is optional, may or may not be captured
|
|
707
|
-
expect(result.error).toBeUndefined();
|
|
708
|
-
});
|
|
709
|
-
|
|
710
|
-
it('should sniff environment variables from endpoint with multiple services', async () => {
|
|
711
|
-
const result = await _sniffRouteFiles(
|
|
712
|
-
'./endpoints/auth.ts',
|
|
713
|
-
routeAppsFixturesPath,
|
|
714
|
-
routeAppsFixturesPath,
|
|
715
|
-
);
|
|
716
|
-
|
|
717
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
718
|
-
expect(result.envVars).toContain('AUTH_SECRET');
|
|
719
|
-
expect(result.envVars).toContain('AUTH_URL');
|
|
720
|
-
expect(result.error).toBeUndefined();
|
|
721
|
-
});
|
|
722
|
-
|
|
723
|
-
it('should return empty for endpoint without services', async () => {
|
|
724
|
-
const result = await _sniffRouteFiles(
|
|
725
|
-
'./endpoints/health.ts',
|
|
726
|
-
routeAppsFixturesPath,
|
|
727
|
-
routeAppsFixturesPath,
|
|
728
|
-
);
|
|
729
|
-
|
|
730
|
-
expect(result.envVars).toEqual([]);
|
|
731
|
-
expect(result.error).toBeUndefined();
|
|
732
|
-
});
|
|
733
|
-
|
|
734
|
-
it('should sniff all endpoints matching glob pattern', async () => {
|
|
735
|
-
const result = await _sniffRouteFiles(
|
|
736
|
-
'./endpoints/**/*.ts',
|
|
737
|
-
routeAppsFixturesPath,
|
|
738
|
-
routeAppsFixturesPath,
|
|
739
|
-
);
|
|
740
|
-
|
|
741
|
-
// Should capture env vars from all endpoints
|
|
742
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
743
|
-
expect(result.envVars).toContain('AUTH_SECRET');
|
|
744
|
-
expect(result.envVars).toContain('AUTH_URL');
|
|
745
|
-
expect(result.error).toBeUndefined();
|
|
746
|
-
});
|
|
747
|
-
|
|
748
|
-
it('should return empty for non-existent pattern', async () => {
|
|
749
|
-
const result = await _sniffRouteFiles(
|
|
750
|
-
'./nonexistent/**/*.ts',
|
|
751
|
-
routeAppsFixturesPath,
|
|
752
|
-
routeAppsFixturesPath,
|
|
753
|
-
);
|
|
754
|
-
|
|
755
|
-
expect(result.envVars).toEqual([]);
|
|
756
|
-
expect(result.error).toBeUndefined();
|
|
757
|
-
});
|
|
758
|
-
|
|
759
|
-
it('should handle array of patterns', async () => {
|
|
760
|
-
const result = await _sniffRouteFiles(
|
|
761
|
-
['./endpoints/users.ts', './endpoints/health.ts'],
|
|
762
|
-
routeAppsFixturesPath,
|
|
763
|
-
routeAppsFixturesPath,
|
|
764
|
-
);
|
|
765
|
-
|
|
766
|
-
expect(result.envVars).toContain('DATABASE_URL');
|
|
767
|
-
expect(result.error).toBeUndefined();
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
it('should deduplicate env vars from multiple endpoints using same service', async () => {
|
|
771
|
-
const result = await _sniffRouteFiles(
|
|
772
|
-
['./endpoints/users.ts', './endpoints/auth.ts'],
|
|
773
|
-
routeAppsFixturesPath,
|
|
774
|
-
routeAppsFixturesPath,
|
|
775
|
-
);
|
|
776
|
-
|
|
777
|
-
// DATABASE_URL is used by both endpoints, should only appear once
|
|
778
|
-
const databaseUrlCount = result.envVars.filter(
|
|
779
|
-
(v) => v === 'DATABASE_URL',
|
|
780
|
-
).length;
|
|
781
|
-
expect(databaseUrlCount).toBe(1);
|
|
782
|
-
});
|
|
783
|
-
|
|
784
|
-
it('should return sorted env vars', async () => {
|
|
785
|
-
const result = await _sniffRouteFiles(
|
|
786
|
-
'./endpoints/**/*.ts',
|
|
787
|
-
routeAppsFixturesPath,
|
|
788
|
-
routeAppsFixturesPath,
|
|
789
|
-
);
|
|
790
|
-
|
|
791
|
-
const sorted = [...result.envVars].sort();
|
|
792
|
-
expect(result.envVars).toEqual(sorted);
|
|
793
|
-
});
|
|
794
|
-
});
|
|
795
|
-
|
|
796
|
-
describe('sniffAppEnvironment with route-based apps', () => {
|
|
797
|
-
// Integration tests for sniffAppEnvironment with route-based apps
|
|
798
|
-
|
|
799
|
-
it('should use route sniffing for apps with routes config', async () => {
|
|
800
|
-
const app: NormalizedAppConfig = {
|
|
801
|
-
type: 'backend',
|
|
802
|
-
path: routeAppsFixturesPath,
|
|
803
|
-
port: 3000,
|
|
804
|
-
dependencies: [],
|
|
805
|
-
resolvedDeployTarget: 'dokploy',
|
|
806
|
-
routes: './endpoints/**/*.ts',
|
|
807
|
-
envParser: './src/config/env#envParser', // Should be ignored when routes exist
|
|
808
|
-
};
|
|
809
|
-
|
|
810
|
-
const result = await sniffAppEnvironment(app, 'api', routeAppsFixturesPath);
|
|
811
|
-
|
|
812
|
-
expect(result.appName).toBe('api');
|
|
813
|
-
expect(result.requiredEnvVars).toContain('DATABASE_URL');
|
|
814
|
-
expect(result.requiredEnvVars).toContain('AUTH_SECRET');
|
|
815
|
-
expect(result.requiredEnvVars).toContain('AUTH_URL');
|
|
816
|
-
});
|
|
817
|
-
|
|
818
|
-
it('should handle route pattern that matches no files', async () => {
|
|
819
|
-
const app: NormalizedAppConfig = {
|
|
820
|
-
type: 'backend',
|
|
821
|
-
path: routeAppsFixturesPath,
|
|
822
|
-
port: 3000,
|
|
823
|
-
dependencies: [],
|
|
824
|
-
resolvedDeployTarget: 'dokploy',
|
|
825
|
-
routes: './nonexistent/**/*.ts',
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
const result = await sniffAppEnvironment(
|
|
829
|
-
app,
|
|
830
|
-
'api',
|
|
831
|
-
routeAppsFixturesPath,
|
|
832
|
-
{ logWarnings: false },
|
|
833
|
-
);
|
|
834
|
-
|
|
835
|
-
expect(result.appName).toBe('api');
|
|
836
|
-
expect(result.requiredEnvVars).toEqual([]);
|
|
837
|
-
});
|
|
838
|
-
});
|