@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,348 +0,0 @@
|
|
|
1
|
-
import type { GeneratedFile, TemplateOptions } from '../templates/index.js';
|
|
2
|
-
import { GEEKMIDAS_VERSIONS } from '../versions.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generate TanStack Start web app files for the fullstack template.
|
|
6
|
-
*
|
|
7
|
-
* Mirrors the Next.js scaffold (apps/web) but on Vite + TanStack Start +
|
|
8
|
-
* TanStack Router with the `VITE_` env-var convention.
|
|
9
|
-
*/
|
|
10
|
-
export function generateTanStackWebFiles(
|
|
11
|
-
options: TemplateOptions,
|
|
12
|
-
): GeneratedFile[] {
|
|
13
|
-
if (!options.monorepo || options.template !== 'fullstack') {
|
|
14
|
-
return [];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const packageName = `@${options.name}/web`;
|
|
18
|
-
const apiPackage = `@${options.name}/api`;
|
|
19
|
-
const modelsPackage = `@${options.name}/models`;
|
|
20
|
-
const uiPackage = `@${options.name}/ui`;
|
|
21
|
-
|
|
22
|
-
const packageJson = {
|
|
23
|
-
name: packageName,
|
|
24
|
-
version: '0.0.1',
|
|
25
|
-
private: true,
|
|
26
|
-
type: 'module',
|
|
27
|
-
scripts: {
|
|
28
|
-
dev: 'gkm exec -- vite dev',
|
|
29
|
-
build: 'gkm exec -- vite build',
|
|
30
|
-
start: 'node .output/server/index.mjs',
|
|
31
|
-
typecheck: 'tsc --noEmit',
|
|
32
|
-
},
|
|
33
|
-
dependencies: {
|
|
34
|
-
[apiPackage]: 'workspace:*',
|
|
35
|
-
[modelsPackage]: 'workspace:*',
|
|
36
|
-
[uiPackage]: 'workspace:*',
|
|
37
|
-
'@geekmidas/client': GEEKMIDAS_VERSIONS['@geekmidas/client'],
|
|
38
|
-
'@geekmidas/envkit': GEEKMIDAS_VERSIONS['@geekmidas/envkit'],
|
|
39
|
-
'@tanstack/react-query': '~5.80.0',
|
|
40
|
-
'@tanstack/react-router': '^1.87.0',
|
|
41
|
-
'@tanstack/react-start': '^1.87.0',
|
|
42
|
-
'better-auth': '~1.2.0',
|
|
43
|
-
react: '~19.2.0',
|
|
44
|
-
'react-dom': '~19.2.0',
|
|
45
|
-
},
|
|
46
|
-
devDependencies: {
|
|
47
|
-
'@geekmidas/cli': GEEKMIDAS_VERSIONS['@geekmidas/cli'],
|
|
48
|
-
'@tailwindcss/vite': '^4.0.0',
|
|
49
|
-
'@tanstack/router-plugin': '^1.87.0',
|
|
50
|
-
'@types/node': '~22.0.0',
|
|
51
|
-
'@types/react': '~19.0.0',
|
|
52
|
-
'@types/react-dom': '~19.0.0',
|
|
53
|
-
'@vitejs/plugin-react': '^4.3.4',
|
|
54
|
-
tailwindcss: '^4.0.0',
|
|
55
|
-
tsx: '~4.20.0',
|
|
56
|
-
typescript: '~5.8.2',
|
|
57
|
-
vite: '^7.0.0',
|
|
58
|
-
'vite-tsconfig-paths': '~5.1.0',
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const viteConfig = `import { Credentials } from '@geekmidas/envkit/credentials';
|
|
63
|
-
import tailwindcss from '@tailwindcss/vite';
|
|
64
|
-
import { tanstackStart } from '@tanstack/react-start/plugin/vite';
|
|
65
|
-
import viteReact from '@vitejs/plugin-react';
|
|
66
|
-
import { defineConfig } from 'vite';
|
|
67
|
-
import tsconfigPaths from 'vite-tsconfig-paths';
|
|
68
|
-
|
|
69
|
-
export default defineConfig({
|
|
70
|
-
server: {
|
|
71
|
-
port: Number(Credentials.PORT ?? 3001),
|
|
72
|
-
},
|
|
73
|
-
// VITE_* vars are inlined automatically; no manual loadEnv needed.
|
|
74
|
-
envPrefix: 'VITE_',
|
|
75
|
-
plugins: [
|
|
76
|
-
tsconfigPaths({ root: import.meta.dirname }),
|
|
77
|
-
tailwindcss(),
|
|
78
|
-
tanstackStart(),
|
|
79
|
-
viteReact(),
|
|
80
|
-
],
|
|
81
|
-
});
|
|
82
|
-
`;
|
|
83
|
-
|
|
84
|
-
const tsConfig = {
|
|
85
|
-
extends: '../../tsconfig.json',
|
|
86
|
-
compilerOptions: {
|
|
87
|
-
lib: ['dom', 'dom.iterable', 'ES2022'],
|
|
88
|
-
allowJs: true,
|
|
89
|
-
skipLibCheck: true,
|
|
90
|
-
strict: true,
|
|
91
|
-
noEmit: true,
|
|
92
|
-
allowImportingTsExtensions: true,
|
|
93
|
-
esModuleInterop: true,
|
|
94
|
-
module: 'ESNext',
|
|
95
|
-
moduleResolution: 'bundler',
|
|
96
|
-
resolveJsonModule: true,
|
|
97
|
-
isolatedModules: true,
|
|
98
|
-
jsx: 'preserve',
|
|
99
|
-
incremental: true,
|
|
100
|
-
baseUrl: '.',
|
|
101
|
-
types: ['vite/client'],
|
|
102
|
-
paths: {
|
|
103
|
-
'~/*': ['./src/*', '../../packages/ui/src/*'],
|
|
104
|
-
[modelsPackage]: ['../../packages/models/src'],
|
|
105
|
-
[`${modelsPackage}/*`]: ['../../packages/models/src/*'],
|
|
106
|
-
[uiPackage]: ['../../packages/ui/src'],
|
|
107
|
-
[`${uiPackage}/*`]: ['../../packages/ui/src/*'],
|
|
108
|
-
[`${apiPackage}/client`]: ['../../apps/api/.gkm/openapi.ts'],
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
include: ['**/*.ts', '**/*.tsx', 'src/routeTree.gen.ts'],
|
|
112
|
-
exclude: ['node_modules', '.output', '.vinxi', 'dist'],
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const queryClientTs = `import { QueryClient } from '@tanstack/react-query';
|
|
116
|
-
|
|
117
|
-
function makeQueryClient() {
|
|
118
|
-
return new QueryClient({
|
|
119
|
-
defaultOptions: {
|
|
120
|
-
queries: {
|
|
121
|
-
staleTime: 60 * 1000,
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
let browserQueryClient: QueryClient | undefined = undefined;
|
|
128
|
-
|
|
129
|
-
export function getQueryClient() {
|
|
130
|
-
if (typeof window === 'undefined') {
|
|
131
|
-
return makeQueryClient();
|
|
132
|
-
}
|
|
133
|
-
if (!browserQueryClient) browserQueryClient = makeQueryClient();
|
|
134
|
-
return browserQueryClient;
|
|
135
|
-
}
|
|
136
|
-
`;
|
|
137
|
-
|
|
138
|
-
const clientConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
|
|
139
|
-
|
|
140
|
-
// Client config - VITE_* vars are inlined at build time.
|
|
141
|
-
const envParser = new EnvironmentParser({
|
|
142
|
-
VITE_API_URL: import.meta.env.VITE_API_URL,
|
|
143
|
-
VITE_AUTH_URL: import.meta.env.VITE_AUTH_URL,
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
export const clientConfig = envParser
|
|
147
|
-
.create((get) => ({
|
|
148
|
-
apiUrl: get('VITE_API_URL').string(),
|
|
149
|
-
authUrl: get('VITE_AUTH_URL').string(),
|
|
150
|
-
}))
|
|
151
|
-
.parse();
|
|
152
|
-
`;
|
|
153
|
-
|
|
154
|
-
const serverConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
|
|
155
|
-
|
|
156
|
-
// Server config - all env vars (server-side only, not exposed to browser).
|
|
157
|
-
// Access these only in TanStack Start server functions / server routes.
|
|
158
|
-
const envParser = new EnvironmentParser({ ...process.env });
|
|
159
|
-
|
|
160
|
-
export const serverConfig = envParser
|
|
161
|
-
.create((_get) => ({
|
|
162
|
-
// Add server-only secrets here
|
|
163
|
-
// Example: stripeSecretKey: _get('STRIPE_SECRET_KEY').string(),
|
|
164
|
-
}))
|
|
165
|
-
.parse();
|
|
166
|
-
`;
|
|
167
|
-
|
|
168
|
-
const authClientTs = `import { magicLinkClient } from 'better-auth/client/plugins';
|
|
169
|
-
import { createAuthClient } from 'better-auth/react';
|
|
170
|
-
import { clientConfig } from '~/config/client.ts';
|
|
171
|
-
|
|
172
|
-
export const authClient = createAuthClient({
|
|
173
|
-
baseURL: clientConfig.authUrl,
|
|
174
|
-
plugins: [magicLinkClient()],
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
export const { signIn, signUp, signOut, useSession, magicLink } = authClient;
|
|
178
|
-
`;
|
|
179
|
-
|
|
180
|
-
const apiIndexTs = `import { createApi } from '${apiPackage}/client';
|
|
181
|
-
import { clientConfig } from '~/config/client.ts';
|
|
182
|
-
import { getQueryClient } from '~/lib/query-client.ts';
|
|
183
|
-
|
|
184
|
-
export function createAppApi(options?: { headers?: Record<string, string> }) {
|
|
185
|
-
return createApi({
|
|
186
|
-
baseURL: clientConfig.apiUrl,
|
|
187
|
-
queryClient: getQueryClient(),
|
|
188
|
-
headers: options?.headers,
|
|
189
|
-
onRequest: (config) => ({ ...config, credentials: 'include' }),
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export const api = createAppApi();
|
|
194
|
-
`;
|
|
195
|
-
|
|
196
|
-
const routerTs = `import { createRouter } from '@tanstack/react-router';
|
|
197
|
-
import { routeTree } from './routeTree.gen.ts';
|
|
198
|
-
|
|
199
|
-
export function getRouter() {
|
|
200
|
-
return createRouter({
|
|
201
|
-
routeTree,
|
|
202
|
-
scrollRestoration: true,
|
|
203
|
-
defaultPreload: 'intent',
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
declare module '@tanstack/react-router' {
|
|
208
|
-
interface Register {
|
|
209
|
-
router: ReturnType<typeof getRouter>;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
`;
|
|
213
|
-
|
|
214
|
-
// Placeholder routeTree.gen — TanStack's plugin regenerates this on dev.
|
|
215
|
-
const routeTreeGen = `// This file is auto-generated by @tanstack/router-plugin.
|
|
216
|
-
// It will be overwritten on the next \`vite dev\` run.
|
|
217
|
-
import { rootRouteWithContext } from '@tanstack/react-router';
|
|
218
|
-
|
|
219
|
-
export const routeTree = rootRouteWithContext()({
|
|
220
|
-
// Routes are populated by the plugin from src/routes/**.tsx
|
|
221
|
-
} as never);
|
|
222
|
-
`;
|
|
223
|
-
|
|
224
|
-
const rootRouteTsx = `/// <reference types="vite/client" />
|
|
225
|
-
import '~/styles/globals.css';
|
|
226
|
-
|
|
227
|
-
import { QueryClientProvider } from '@tanstack/react-query';
|
|
228
|
-
import {
|
|
229
|
-
HeadContent,
|
|
230
|
-
Outlet,
|
|
231
|
-
Scripts,
|
|
232
|
-
createRootRoute,
|
|
233
|
-
} from '@tanstack/react-router';
|
|
234
|
-
import type { ReactNode } from 'react';
|
|
235
|
-
import { getQueryClient } from '~/lib/query-client.ts';
|
|
236
|
-
|
|
237
|
-
export const Route = createRootRoute({
|
|
238
|
-
head: () => ({
|
|
239
|
-
meta: [
|
|
240
|
-
{ charSet: 'utf-8' },
|
|
241
|
-
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
|
|
242
|
-
{ title: '${options.name}' },
|
|
243
|
-
],
|
|
244
|
-
}),
|
|
245
|
-
component: RootComponent,
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
function RootComponent() {
|
|
249
|
-
const queryClient = getQueryClient();
|
|
250
|
-
return (
|
|
251
|
-
<RootDocument>
|
|
252
|
-
<QueryClientProvider client={queryClient}>
|
|
253
|
-
<Outlet />
|
|
254
|
-
</QueryClientProvider>
|
|
255
|
-
</RootDocument>
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
function RootDocument({ children }: { children: ReactNode }) {
|
|
260
|
-
return (
|
|
261
|
-
<html lang="en">
|
|
262
|
-
<head>
|
|
263
|
-
<HeadContent />
|
|
264
|
-
</head>
|
|
265
|
-
<body>
|
|
266
|
-
{children}
|
|
267
|
-
<Scripts />
|
|
268
|
-
</body>
|
|
269
|
-
</html>
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
`;
|
|
273
|
-
|
|
274
|
-
const indexRouteTsx = `import { createFileRoute } from '@tanstack/react-router';
|
|
275
|
-
import { api } from '~/api/index.ts';
|
|
276
|
-
|
|
277
|
-
export const Route = createFileRoute('/')({
|
|
278
|
-
component: HomeComponent,
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
function HomeComponent() {
|
|
282
|
-
const { data: health } = api.useQuery('GET /health', {});
|
|
283
|
-
|
|
284
|
-
return (
|
|
285
|
-
<main className="min-h-screen bg-background p-8">
|
|
286
|
-
<div className="mx-auto max-w-4xl space-y-8">
|
|
287
|
-
<div className="space-y-2">
|
|
288
|
-
<h1 className="text-4xl font-bold tracking-tight">
|
|
289
|
-
Welcome to ${options.name}
|
|
290
|
-
</h1>
|
|
291
|
-
<p className="text-muted-foreground">
|
|
292
|
-
Your TanStack Start app is ready.
|
|
293
|
-
</p>
|
|
294
|
-
</div>
|
|
295
|
-
|
|
296
|
-
<section className="rounded-lg border p-6">
|
|
297
|
-
<h2 className="text-xl font-semibold">API Status</h2>
|
|
298
|
-
{health ? (
|
|
299
|
-
<pre className="mt-4 rounded bg-muted p-4 text-sm">
|
|
300
|
-
{JSON.stringify(health, null, 2)}
|
|
301
|
-
</pre>
|
|
302
|
-
) : (
|
|
303
|
-
<p className="mt-2 text-muted-foreground">Connecting…</p>
|
|
304
|
-
)}
|
|
305
|
-
</section>
|
|
306
|
-
</div>
|
|
307
|
-
</main>
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
`;
|
|
311
|
-
|
|
312
|
-
const globalsCss = `@import '${uiPackage}/styles';
|
|
313
|
-
|
|
314
|
-
@source "../..";
|
|
315
|
-
@source "../../../../packages/ui/src";
|
|
316
|
-
`;
|
|
317
|
-
|
|
318
|
-
const gitignore = `.output/
|
|
319
|
-
.vinxi/
|
|
320
|
-
node_modules/
|
|
321
|
-
.env.local
|
|
322
|
-
*.log
|
|
323
|
-
src/routeTree.gen.ts
|
|
324
|
-
`;
|
|
325
|
-
|
|
326
|
-
return [
|
|
327
|
-
{
|
|
328
|
-
path: 'apps/web/package.json',
|
|
329
|
-
content: `${JSON.stringify(packageJson, null, 2)}\n`,
|
|
330
|
-
},
|
|
331
|
-
{ path: 'apps/web/vite.config.ts', content: viteConfig },
|
|
332
|
-
{
|
|
333
|
-
path: 'apps/web/tsconfig.json',
|
|
334
|
-
content: `${JSON.stringify(tsConfig, null, 2)}\n`,
|
|
335
|
-
},
|
|
336
|
-
{ path: 'apps/web/src/lib/query-client.ts', content: queryClientTs },
|
|
337
|
-
{ path: 'apps/web/src/lib/auth-client.ts', content: authClientTs },
|
|
338
|
-
{ path: 'apps/web/src/config/client.ts', content: clientConfigTs },
|
|
339
|
-
{ path: 'apps/web/src/config/server.ts', content: serverConfigTs },
|
|
340
|
-
{ path: 'apps/web/src/api/index.ts', content: apiIndexTs },
|
|
341
|
-
{ path: 'apps/web/src/router.tsx', content: routerTs },
|
|
342
|
-
{ path: 'apps/web/src/routeTree.gen.ts', content: routeTreeGen },
|
|
343
|
-
{ path: 'apps/web/src/routes/__root.tsx', content: rootRouteTsx },
|
|
344
|
-
{ path: 'apps/web/src/routes/index.tsx', content: indexRouteTsx },
|
|
345
|
-
{ path: 'apps/web/src/styles/globals.css', content: globalsCss },
|
|
346
|
-
{ path: 'apps/web/.gitignore', content: gitignore },
|
|
347
|
-
];
|
|
348
|
-
}
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
import type { GeneratedFile, TemplateOptions } from '../templates/index.js';
|
|
2
|
-
import { GEEKMIDAS_VERSIONS } from '../versions.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generate Next.js web app files for fullstack template
|
|
6
|
-
*/
|
|
7
|
-
export function generateWebAppFiles(options: TemplateOptions): GeneratedFile[] {
|
|
8
|
-
if (!options.monorepo || options.template !== 'fullstack') {
|
|
9
|
-
return [];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const packageName = `@${options.name}/web`;
|
|
13
|
-
const apiPackage = `@${options.name}/api`;
|
|
14
|
-
const modelsPackage = `@${options.name}/models`;
|
|
15
|
-
const uiPackage = `@${options.name}/ui`;
|
|
16
|
-
|
|
17
|
-
// package.json for web app
|
|
18
|
-
const packageJson = {
|
|
19
|
-
name: packageName,
|
|
20
|
-
version: '0.0.1',
|
|
21
|
-
private: true,
|
|
22
|
-
type: 'module',
|
|
23
|
-
scripts: {
|
|
24
|
-
dev: 'gkm exec -- next dev --turbopack',
|
|
25
|
-
build: 'gkm exec -- next build',
|
|
26
|
-
start: 'next start',
|
|
27
|
-
typecheck: 'tsc --noEmit',
|
|
28
|
-
},
|
|
29
|
-
dependencies: {
|
|
30
|
-
[apiPackage]: 'workspace:*',
|
|
31
|
-
[modelsPackage]: 'workspace:*',
|
|
32
|
-
[uiPackage]: 'workspace:*',
|
|
33
|
-
'@geekmidas/client': GEEKMIDAS_VERSIONS['@geekmidas/client'],
|
|
34
|
-
'@geekmidas/envkit': GEEKMIDAS_VERSIONS['@geekmidas/envkit'],
|
|
35
|
-
'@tanstack/react-query': '~5.80.0',
|
|
36
|
-
'better-auth': '~1.2.0',
|
|
37
|
-
next: '~16.1.0',
|
|
38
|
-
react: '~19.2.0',
|
|
39
|
-
'react-dom': '~19.2.0',
|
|
40
|
-
},
|
|
41
|
-
devDependencies: {
|
|
42
|
-
'@geekmidas/cli': GEEKMIDAS_VERSIONS['@geekmidas/cli'],
|
|
43
|
-
'@tailwindcss/postcss': '^4.0.0',
|
|
44
|
-
'@types/node': '~22.0.0',
|
|
45
|
-
'@types/react': '~19.0.0',
|
|
46
|
-
'@types/react-dom': '~19.0.0',
|
|
47
|
-
tailwindcss: '^4.0.0',
|
|
48
|
-
tsx: '~4.20.0',
|
|
49
|
-
typescript: '~5.8.2',
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// next.config.ts
|
|
54
|
-
const nextConfig = `import type { NextConfig } from 'next';
|
|
55
|
-
|
|
56
|
-
const nextConfig: NextConfig = {
|
|
57
|
-
output: 'standalone',
|
|
58
|
-
reactStrictMode: true,
|
|
59
|
-
transpilePackages: ['${apiPackage}', '${modelsPackage}', '${uiPackage}'],
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export default nextConfig;
|
|
63
|
-
`;
|
|
64
|
-
|
|
65
|
-
// postcss.config.mjs for Tailwind v4
|
|
66
|
-
const postcssConfig = `export default {
|
|
67
|
-
plugins: {
|
|
68
|
-
'@tailwindcss/postcss': {},
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
`;
|
|
72
|
-
|
|
73
|
-
// tsconfig.json for Next.js
|
|
74
|
-
// Note: Next.js handles compilation, so noEmit: true
|
|
75
|
-
const tsConfig = {
|
|
76
|
-
extends: '../../tsconfig.json',
|
|
77
|
-
compilerOptions: {
|
|
78
|
-
lib: ['dom', 'dom.iterable', 'ES2022'],
|
|
79
|
-
allowJs: true,
|
|
80
|
-
skipLibCheck: true,
|
|
81
|
-
strict: true,
|
|
82
|
-
noEmit: true,
|
|
83
|
-
allowImportingTsExtensions: true,
|
|
84
|
-
esModuleInterop: true,
|
|
85
|
-
module: 'ESNext',
|
|
86
|
-
moduleResolution: 'bundler',
|
|
87
|
-
resolveJsonModule: true,
|
|
88
|
-
isolatedModules: true,
|
|
89
|
-
jsx: 'preserve',
|
|
90
|
-
incremental: true,
|
|
91
|
-
plugins: [
|
|
92
|
-
{
|
|
93
|
-
name: 'next',
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
baseUrl: '.',
|
|
97
|
-
paths: {
|
|
98
|
-
'~/*': ['./src/*', '../../packages/ui/src/*'],
|
|
99
|
-
[`${apiPackage}/client`]: ['../../apps/api/.gkm/openapi.ts'],
|
|
100
|
-
[`${modelsPackage}`]: ['../../packages/models/src'],
|
|
101
|
-
[`${modelsPackage}/*`]: ['../../packages/models/src/*'],
|
|
102
|
-
[`${uiPackage}`]: ['../../packages/ui/src'],
|
|
103
|
-
[`${uiPackage}/*`]: ['../../packages/ui/src/*'],
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],
|
|
107
|
-
exclude: ['node_modules'],
|
|
108
|
-
references: [
|
|
109
|
-
{ path: '../../apps/api' },
|
|
110
|
-
{ path: '../../packages/ui' },
|
|
111
|
-
{ path: '../../packages/models' },
|
|
112
|
-
],
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// Query client singleton for browser, fresh instance for server
|
|
116
|
-
const queryClientTs = `import { QueryClient } from '@tanstack/react-query';
|
|
117
|
-
|
|
118
|
-
function makeQueryClient() {
|
|
119
|
-
return new QueryClient({
|
|
120
|
-
defaultOptions: {
|
|
121
|
-
queries: {
|
|
122
|
-
staleTime: 60 * 1000,
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
let browserQueryClient: QueryClient | undefined = undefined;
|
|
129
|
-
|
|
130
|
-
export function getQueryClient() {
|
|
131
|
-
if (typeof window === 'undefined') {
|
|
132
|
-
// Server: always make a new query client
|
|
133
|
-
return makeQueryClient();
|
|
134
|
-
}
|
|
135
|
-
// Browser: reuse existing query client
|
|
136
|
-
if (!browserQueryClient) browserQueryClient = makeQueryClient();
|
|
137
|
-
return browserQueryClient;
|
|
138
|
-
}
|
|
139
|
-
`;
|
|
140
|
-
|
|
141
|
-
// Client config - NEXT_PUBLIC_* vars (available in browser)
|
|
142
|
-
const clientConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
|
|
143
|
-
|
|
144
|
-
// Client config - only NEXT_PUBLIC_* vars (available in browser)
|
|
145
|
-
// These values are inlined at build time by Next.js
|
|
146
|
-
const envParser = new EnvironmentParser({
|
|
147
|
-
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
|
|
148
|
-
NEXT_PUBLIC_AUTH_URL: process.env.NEXT_PUBLIC_AUTH_URL,
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
export const clientConfig = envParser
|
|
152
|
-
.create((get) => ({
|
|
153
|
-
apiUrl: get('NEXT_PUBLIC_API_URL').string(),
|
|
154
|
-
authUrl: get('NEXT_PUBLIC_AUTH_URL').string(),
|
|
155
|
-
}))
|
|
156
|
-
.parse();
|
|
157
|
-
`;
|
|
158
|
-
|
|
159
|
-
// Server config - server-only vars (not available in browser)
|
|
160
|
-
const serverConfigTs = `import { EnvironmentParser } from '@geekmidas/envkit';
|
|
161
|
-
|
|
162
|
-
// Server config - all env vars (server-side only, not exposed to browser)
|
|
163
|
-
// Access these only in Server Components, Route Handlers, or Server Actions
|
|
164
|
-
const envParser = new EnvironmentParser({ ...process.env });
|
|
165
|
-
|
|
166
|
-
export const serverConfig = envParser
|
|
167
|
-
.create((get) => ({
|
|
168
|
-
// Add server-only secrets here
|
|
169
|
-
// Example: stripeSecretKey: get('STRIPE_SECRET_KEY').string(),
|
|
170
|
-
}))
|
|
171
|
-
.parse();
|
|
172
|
-
`;
|
|
173
|
-
|
|
174
|
-
// Auth client for better-auth
|
|
175
|
-
const authClientTs = `import { createAuthClient } from 'better-auth/react';
|
|
176
|
-
import { magicLinkClient } from 'better-auth/client/plugins';
|
|
177
|
-
import { clientConfig } from '~/config/client.ts';
|
|
178
|
-
|
|
179
|
-
export const authClient = createAuthClient({
|
|
180
|
-
baseURL: clientConfig.authUrl,
|
|
181
|
-
plugins: [magicLinkClient()],
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
export const { signIn, signUp, signOut, useSession, magicLink } = authClient;
|
|
185
|
-
`;
|
|
186
|
-
|
|
187
|
-
// Providers using shared QueryClient
|
|
188
|
-
const providersTsx = `'use client';
|
|
189
|
-
|
|
190
|
-
import { QueryClientProvider } from '@tanstack/react-query';
|
|
191
|
-
import { getQueryClient } from '~/lib/query-client.ts';
|
|
192
|
-
|
|
193
|
-
export function Providers({ children }: { children: React.ReactNode }) {
|
|
194
|
-
const queryClient = getQueryClient();
|
|
195
|
-
|
|
196
|
-
return (
|
|
197
|
-
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
`;
|
|
201
|
-
|
|
202
|
-
// API client setup - imports directly from the API package export
|
|
203
|
-
const apiIndexTs = `import { createApi } from '${apiPackage}/client';
|
|
204
|
-
import { getQueryClient } from '~/lib/query-client.ts';
|
|
205
|
-
import { clientConfig } from '~/config/client.ts';
|
|
206
|
-
|
|
207
|
-
export const api = createApi({
|
|
208
|
-
baseURL: clientConfig.apiUrl,
|
|
209
|
-
queryClient: getQueryClient(),
|
|
210
|
-
});
|
|
211
|
-
`;
|
|
212
|
-
|
|
213
|
-
// globals.css that imports UI package styles
|
|
214
|
-
const globalsCss = `@import '${uiPackage}/styles';
|
|
215
|
-
`;
|
|
216
|
-
|
|
217
|
-
// App layout
|
|
218
|
-
const layoutTsx = `import type { Metadata } from 'next';
|
|
219
|
-
import { Providers } from './providers.tsx';
|
|
220
|
-
import './globals.css';
|
|
221
|
-
|
|
222
|
-
export const metadata: Metadata = {
|
|
223
|
-
title: '${options.name}',
|
|
224
|
-
description: 'Created with gkm init',
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
export default function RootLayout({
|
|
228
|
-
children,
|
|
229
|
-
}: {
|
|
230
|
-
children: React.ReactNode;
|
|
231
|
-
}) {
|
|
232
|
-
return (
|
|
233
|
-
<html lang="en">
|
|
234
|
-
<body>
|
|
235
|
-
<Providers>{children}</Providers>
|
|
236
|
-
</body>
|
|
237
|
-
</html>
|
|
238
|
-
);
|
|
239
|
-
}
|
|
240
|
-
`;
|
|
241
|
-
|
|
242
|
-
// Home page with API example using UI components
|
|
243
|
-
const pageTsx = `import { api } from '~/api/index.ts';
|
|
244
|
-
import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from '${uiPackage}/components';
|
|
245
|
-
|
|
246
|
-
export default async function Home() {
|
|
247
|
-
// Type-safe API call using the generated client
|
|
248
|
-
const health = await api('GET /health').catch(() => null);
|
|
249
|
-
|
|
250
|
-
return (
|
|
251
|
-
<main className="min-h-screen bg-background p-8">
|
|
252
|
-
<div className="mx-auto max-w-4xl space-y-8">
|
|
253
|
-
<div className="space-y-2">
|
|
254
|
-
<h1 className="text-4xl font-bold tracking-tight">Welcome to ${options.name}</h1>
|
|
255
|
-
<p className="text-muted-foreground">Your fullstack application is ready.</p>
|
|
256
|
-
</div>
|
|
257
|
-
|
|
258
|
-
<Card>
|
|
259
|
-
<CardHeader>
|
|
260
|
-
<CardTitle>API Status</CardTitle>
|
|
261
|
-
<CardDescription>Connection to your backend API</CardDescription>
|
|
262
|
-
</CardHeader>
|
|
263
|
-
<CardContent>
|
|
264
|
-
{health ? (
|
|
265
|
-
<pre className="rounded-lg bg-muted p-4 text-sm">
|
|
266
|
-
{JSON.stringify(health, null, 2)}
|
|
267
|
-
</pre>
|
|
268
|
-
) : (
|
|
269
|
-
<p className="text-destructive">Unable to connect to API</p>
|
|
270
|
-
)}
|
|
271
|
-
</CardContent>
|
|
272
|
-
</Card>
|
|
273
|
-
|
|
274
|
-
<Card>
|
|
275
|
-
<CardHeader>
|
|
276
|
-
<CardTitle>Next Steps</CardTitle>
|
|
277
|
-
<CardDescription>Get started with your project</CardDescription>
|
|
278
|
-
</CardHeader>
|
|
279
|
-
<CardContent className="space-y-4">
|
|
280
|
-
<ul className="list-inside list-disc space-y-2 text-muted-foreground">
|
|
281
|
-
<li>Run <code className="rounded bg-muted px-1">gkm openapi</code> to generate typed API client</li>
|
|
282
|
-
<li>Edit <code className="rounded bg-muted px-1">apps/web/src/app/page.tsx</code> to customize this page</li>
|
|
283
|
-
<li>Add API routes in <code className="rounded bg-muted px-1">apps/api/src/endpoints/</code></li>
|
|
284
|
-
<li>Add UI components with <code className="rounded bg-muted px-1">npx shadcn@latest add</code> in packages/ui</li>
|
|
285
|
-
</ul>
|
|
286
|
-
<div className="flex gap-4">
|
|
287
|
-
<Button>Get Started</Button>
|
|
288
|
-
<Button variant="outline">Documentation</Button>
|
|
289
|
-
</div>
|
|
290
|
-
</CardContent>
|
|
291
|
-
</Card>
|
|
292
|
-
</div>
|
|
293
|
-
</main>
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
`;
|
|
297
|
-
|
|
298
|
-
// .gitignore for Next.js
|
|
299
|
-
const gitignore = `.next/
|
|
300
|
-
node_modules/
|
|
301
|
-
.env.local
|
|
302
|
-
*.log
|
|
303
|
-
`;
|
|
304
|
-
|
|
305
|
-
return [
|
|
306
|
-
{
|
|
307
|
-
path: 'apps/web/package.json',
|
|
308
|
-
content: `${JSON.stringify(packageJson, null, 2)}\n`,
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
path: 'apps/web/next.config.ts',
|
|
312
|
-
content: nextConfig,
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
path: 'apps/web/postcss.config.mjs',
|
|
316
|
-
content: postcssConfig,
|
|
317
|
-
},
|
|
318
|
-
{
|
|
319
|
-
path: 'apps/web/tsconfig.json',
|
|
320
|
-
content: `${JSON.stringify(tsConfig, null, 2)}\n`,
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
path: 'apps/web/src/app/globals.css',
|
|
324
|
-
content: globalsCss,
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
path: 'apps/web/src/app/layout.tsx',
|
|
328
|
-
content: layoutTsx,
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
path: 'apps/web/src/app/providers.tsx',
|
|
332
|
-
content: providersTsx,
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
path: 'apps/web/src/app/page.tsx',
|
|
336
|
-
content: pageTsx,
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
path: 'apps/web/src/config/client.ts',
|
|
340
|
-
content: clientConfigTs,
|
|
341
|
-
},
|
|
342
|
-
{
|
|
343
|
-
path: 'apps/web/src/config/server.ts',
|
|
344
|
-
content: serverConfigTs,
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
path: 'apps/web/src/lib/query-client.ts',
|
|
348
|
-
content: queryClientTs,
|
|
349
|
-
},
|
|
350
|
-
{
|
|
351
|
-
path: 'apps/web/src/lib/auth-client.ts',
|
|
352
|
-
content: authClientTs,
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
path: 'apps/web/src/api/index.ts',
|
|
356
|
-
content: apiIndexTs,
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
path: 'apps/web/.gitignore',
|
|
360
|
-
content: gitignore,
|
|
361
|
-
},
|
|
362
|
-
];
|
|
363
|
-
}
|