@geekmidas/cli 10.0.0-alpha.10 → 10.0.0-alpha.100
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 +315 -414
- package/bin/adjacent-tsconfig.mjs +46 -8
- package/bin/gkm.mjs +11 -3
- package/bin/owning-tsconfig-jsx-register.mjs +18 -0
- package/bin/owning-tsconfig-jsx.mjs +108 -0
- package/dist/EndpointGenerator-Br97xgs_.mjs +1031 -0
- package/dist/EndpointGenerator-Br97xgs_.mjs.map +1 -0
- package/dist/EndpointGenerator-By5_tYE9.cjs +1090 -0
- package/dist/EndpointGenerator-By5_tYE9.cjs.map +1 -0
- package/dist/GoDaddyProvider-CVnzcWX5.mjs +388 -0
- package/dist/GoDaddyProvider-CVnzcWX5.mjs.map +1 -0
- package/dist/GoDaddyProvider-DS4Wgu0c.cjs +388 -0
- package/dist/GoDaddyProvider-DS4Wgu0c.cjs.map +1 -0
- package/dist/{HostingerProvider-Cft7lEYr.mjs → HostingerProvider-BNpS9aRJ.mjs} +29 -25
- package/dist/HostingerProvider-BNpS9aRJ.mjs.map +1 -0
- package/dist/{HostingerProvider-h3EbEp-Z.cjs → HostingerProvider-DR1iws1P.cjs} +29 -25
- package/dist/HostingerProvider-DR1iws1P.cjs.map +1 -0
- package/dist/LegacyStateStore-C2Xlqy4v.mjs +124 -0
- package/dist/LegacyStateStore-C2Xlqy4v.mjs.map +1 -0
- package/dist/LegacyStateStore-CoHPQMLO.cjs +124 -0
- package/dist/LegacyStateStore-CoHPQMLO.cjs.map +1 -0
- package/dist/LocalStateStore-BGDzf2f8.cjs +178 -0
- package/dist/LocalStateStore-BGDzf2f8.cjs.map +1 -0
- package/dist/LocalStateStore-By59pUve.mjs +167 -0
- package/dist/LocalStateStore-By59pUve.mjs.map +1 -0
- package/dist/OpenApiTsGenerator-BgSX_Z-e.cjs +541 -0
- package/dist/OpenApiTsGenerator-BgSX_Z-e.cjs.map +1 -0
- package/dist/OpenApiTsGenerator-C8aTX--y.mjs +536 -0
- package/dist/OpenApiTsGenerator-C8aTX--y.mjs.map +1 -0
- package/dist/{Route53Provider-di2fMM5N.cjs → Route53Provider-Bllus2NR.cjs} +21 -22
- package/dist/Route53Provider-Bllus2NR.cjs.map +1 -0
- package/dist/{Route53Provider-RdpUDJQk.mjs → Route53Provider-QXxjkZO1.mjs} +13 -13
- package/dist/Route53Provider-QXxjkZO1.mjs.map +1 -0
- package/dist/S3StateStore-CU485pYn.mjs +223 -0
- package/dist/S3StateStore-CU485pYn.mjs.map +1 -0
- package/dist/S3StateStore-Re4LfDTl.cjs +222 -0
- package/dist/S3StateStore-Re4LfDTl.cjs.map +1 -0
- package/dist/SSMStateStore-BquRBbUG.mjs +205 -0
- package/dist/SSMStateStore-BquRBbUG.mjs.map +1 -0
- package/dist/SSMStateStore-CLX4Dm5d.cjs +204 -0
- package/dist/SSMStateStore-CLX4Dm5d.cjs.map +1 -0
- package/dist/SubscriberGenerator-1-IsjIwF.mjs +449 -0
- package/dist/SubscriberGenerator-1-IsjIwF.mjs.map +1 -0
- package/dist/SubscriberGenerator-BlIOdbi-.cjs +490 -0
- package/dist/SubscriberGenerator-BlIOdbi-.cjs.map +1 -0
- package/dist/add-Blv6Q_YA.mjs +718 -0
- package/dist/add-Blv6Q_YA.mjs.map +1 -0
- package/dist/add-C6RhiCBX.cjs +720 -0
- package/dist/add-C6RhiCBX.cjs.map +1 -0
- package/dist/appPorts-C9z9Pzn9.mjs +223 -0
- package/dist/appPorts-C9z9Pzn9.mjs.map +1 -0
- package/dist/appPorts-Cu79hJF6.cjs +264 -0
- package/dist/appPorts-Cu79hJF6.cjs.map +1 -0
- package/dist/aws-8QQ8n-t6.mjs +89 -0
- package/dist/aws-8QQ8n-t6.mjs.map +1 -0
- package/dist/aws-DY9NqQIT.cjs +100 -0
- package/dist/aws-DY9NqQIT.cjs.map +1 -0
- package/dist/awsStore-Bx5nCFnS.mjs +121 -0
- package/dist/awsStore-Bx5nCFnS.mjs.map +1 -0
- package/dist/awsStore-u3ehhMoY.cjs +138 -0
- package/dist/awsStore-u3ehhMoY.cjs.map +1 -0
- package/dist/{backup-provisioner-Bgj5Vi_L.mjs → backup-provisioner-C8DnCmxK.mjs} +11 -8
- package/dist/backup-provisioner-C8DnCmxK.mjs.map +1 -0
- package/dist/{backup-provisioner-BrsHwYG0.cjs → backup-provisioner-oDEsPj02.cjs} +22 -20
- package/dist/backup-provisioner-oDEsPj02.cjs.map +1 -0
- package/dist/backups/runner.cjs +519 -0
- package/dist/backups/runner.cjs.map +1 -0
- package/dist/backups/runner.d.cts +102 -0
- package/dist/backups/runner.d.cts.map +1 -0
- package/dist/backups/runner.d.mts +102 -0
- package/dist/backups/runner.d.mts.map +1 -0
- package/dist/backups/runner.mjs +506 -0
- package/dist/backups/runner.mjs.map +1 -0
- package/dist/{bundler-Be8Zg4Wd.mjs → bundler-Cquc0e8N.mjs} +36 -32
- package/dist/bundler-Cquc0e8N.mjs.map +1 -0
- package/dist/{bundler-BY1OmV1e.cjs → bundler-DAeBIOlG.cjs} +38 -35
- package/dist/bundler-DAeBIOlG.cjs.map +1 -0
- package/dist/cli-DbeqYBTs.cjs +71 -0
- package/dist/cli-DbeqYBTs.cjs.map +1 -0
- package/dist/cli-tWfeiYmO.mjs +71 -0
- package/dist/cli-tWfeiYmO.mjs.map +1 -0
- package/dist/compose-BftbEv0b.mjs +3154 -0
- package/dist/compose-BftbEv0b.mjs.map +1 -0
- package/dist/compose-C_mfrSVH.cjs +3267 -0
- package/dist/compose-C_mfrSVH.cjs.map +1 -0
- package/dist/config-D48erO2j.d.mts +269 -0
- package/dist/config-D48erO2j.d.mts.map +1 -0
- package/dist/config-DHDtsQrB.d.cts +269 -0
- package/dist/config-DHDtsQrB.d.cts.map +1 -0
- package/dist/config.cjs +421 -11
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.cts +4 -120
- package/dist/config.d.mts +4 -120
- package/dist/config.mjs +405 -4
- package/dist/config.mjs.map +1 -0
- package/dist/credentialSchemas-DDda4Mmm.cjs +272 -0
- package/dist/credentialSchemas-DDda4Mmm.cjs.map +1 -0
- package/dist/credentialSchemas-DvitraL-.mjs +237 -0
- package/dist/credentialSchemas-DvitraL-.mjs.map +1 -0
- package/dist/credentials-B5N5yKk6.mjs +267 -0
- package/dist/credentials-B5N5yKk6.mjs.map +1 -0
- package/dist/credentials-Zqr3QQYB.cjs +350 -0
- package/dist/credentials-Zqr3QQYB.cjs.map +1 -0
- package/dist/databases-BeGP5eDh.mjs +495 -0
- package/dist/databases-BeGP5eDh.mjs.map +1 -0
- package/dist/databases-DGALFDG3.cjs +598 -0
- package/dist/databases-DGALFDG3.cjs.map +1 -0
- package/dist/define-6poNqm5O.mjs +106 -0
- package/dist/define-6poNqm5O.mjs.map +1 -0
- package/dist/define-crmMcXFS.cjs +153 -0
- package/dist/define-crmMcXFS.cjs.map +1 -0
- package/dist/deploy/public.cjs +212 -0
- package/dist/deploy/public.cjs.map +1 -0
- package/dist/deploy/public.d.cts +653 -0
- package/dist/deploy/public.d.cts.map +1 -0
- package/dist/deploy/public.d.mts +653 -0
- package/dist/deploy/public.d.mts.map +1 -0
- package/dist/deploy/public.mjs +145 -0
- package/dist/deploy/public.mjs.map +1 -0
- package/dist/deploy/sniffer-envkit-patch.cjs +18 -10
- package/dist/deploy/sniffer-envkit-patch.cjs.map +1 -1
- package/dist/deploy/sniffer-envkit-patch.d.cts +0 -2
- package/dist/deploy/sniffer-envkit-patch.d.cts.map +1 -1
- package/dist/deploy/sniffer-envkit-patch.d.mts +0 -2
- package/dist/deploy/sniffer-envkit-patch.d.mts.map +1 -1
- package/dist/deploy/sniffer-envkit-patch.mjs +10 -2
- package/dist/deploy/sniffer-envkit-patch.mjs.map +1 -1
- package/dist/deploy/sniffer-envparser-worker.cjs +54 -0
- package/dist/deploy/sniffer-envparser-worker.cjs.map +1 -0
- package/dist/deploy/sniffer-envparser-worker.d.cts +1 -0
- package/dist/deploy/sniffer-envparser-worker.d.mts +1 -0
- package/dist/deploy/sniffer-envparser-worker.mjs +55 -0
- package/dist/deploy/sniffer-envparser-worker.mjs.map +1 -0
- package/dist/deploy/sniffer-hooks.cjs +13 -7
- package/dist/deploy/sniffer-hooks.cjs.map +1 -1
- package/dist/deploy/sniffer-hooks.d.cts +1 -2
- package/dist/deploy/sniffer-hooks.d.cts.map +1 -1
- package/dist/deploy/sniffer-hooks.d.mts +1 -2
- package/dist/deploy/sniffer-hooks.d.mts.map +1 -1
- package/dist/deploy/sniffer-hooks.mjs +10 -3
- package/dist/deploy/sniffer-hooks.mjs.map +1 -1
- package/dist/deploy/sniffer-loader.cjs +16 -7
- package/dist/deploy/sniffer-loader.cjs.map +1 -1
- package/dist/deploy/sniffer-loader.d.cts +1 -1
- package/dist/deploy/sniffer-loader.d.mts +1 -1
- package/dist/deploy/sniffer-loader.mjs +14 -3
- package/dist/deploy/sniffer-loader.mjs.map +1 -1
- package/dist/deploy/sniffer-routes-worker.cjs +11 -11
- package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
- package/dist/deploy/sniffer-routes-worker.d.cts +1 -1
- package/dist/deploy/sniffer-routes-worker.d.mts +1 -1
- package/dist/deploy/sniffer-routes-worker.mjs +4 -4
- package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
- package/dist/deploy/sniffer-worker.cjs +15 -6
- package/dist/deploy/sniffer-worker.cjs.map +1 -1
- package/dist/deploy/sniffer-worker.d.cts +1 -3
- package/dist/deploy/sniffer-worker.d.cts.map +1 -1
- package/dist/deploy/sniffer-worker.d.mts +1 -3
- package/dist/deploy/sniffer-worker.d.mts.map +1 -1
- package/dist/deploy/sniffer-worker.mjs +15 -4
- package/dist/deploy/sniffer-worker.mjs.map +1 -1
- package/dist/deploy-BSilGXuR.mjs +2317 -0
- package/dist/deploy-BSilGXuR.mjs.map +1 -0
- package/dist/deploy-CktQpmpU.cjs +2390 -0
- package/dist/deploy-CktQpmpU.cjs.map +1 -0
- package/dist/derive-B4vDpzgP.mjs +150 -0
- package/dist/derive-B4vDpzgP.mjs.map +1 -0
- package/dist/derive-DAbo49sm.cjs +161 -0
- package/dist/derive-DAbo49sm.cjs.map +1 -0
- package/dist/discover-BfhVW_kT.cjs +600 -0
- package/dist/discover-BfhVW_kT.cjs.map +1 -0
- package/dist/discover-CvTtV5ZD.d.cts +108 -0
- package/dist/discover-CvTtV5ZD.d.cts.map +1 -0
- package/dist/discover-W2kab9Lc.d.mts +108 -0
- package/dist/discover-W2kab9Lc.d.mts.map +1 -0
- package/dist/discover-kziEht4W.mjs +527 -0
- package/dist/discover-kziEht4W.mjs.map +1 -0
- package/dist/dns-CQZQL3gj.mjs +926 -0
- package/dist/dns-CQZQL3gj.mjs.map +1 -0
- package/dist/dns-KPxvcCdL.cjs +1057 -0
- package/dist/dns-KPxvcCdL.cjs.map +1 -0
- package/dist/dokploy-B7eMa6Pa.cjs +38 -0
- package/dist/dokploy-B7eMa6Pa.cjs.map +1 -0
- package/dist/dokploy-Dguhz3Uo.mjs +38 -0
- package/dist/dokploy-Dguhz3Uo.mjs.map +1 -0
- package/dist/drivers-BLU1fNs_.cjs +200 -0
- package/dist/drivers-BLU1fNs_.cjs.map +1 -0
- package/dist/drivers-C08LL4E8.mjs +177 -0
- package/dist/drivers-C08LL4E8.mjs.map +1 -0
- package/dist/{emit-CiZS_5Ub.mjs → emit-C1e8qD08.mjs} +13 -26
- package/dist/emit-C1e8qD08.mjs.map +1 -0
- package/dist/{emit-CbcRolsa.cjs → emit-Dmc1nvdS.cjs} +31 -57
- package/dist/emit-Dmc1nvdS.cjs.map +1 -0
- package/dist/encryption-CixpDF6e.mjs +89 -0
- package/dist/encryption-CixpDF6e.mjs.map +1 -0
- package/dist/encryption-DrhCX7G6.cjs +90 -0
- package/dist/encryption-DrhCX7G6.cjs.map +1 -0
- package/dist/engine-32gL2ju3.mjs +3082 -0
- package/dist/engine-32gL2ju3.mjs.map +1 -0
- package/dist/engine-CQgycl7o.cjs +3195 -0
- package/dist/engine-CQgycl7o.cjs.map +1 -0
- package/dist/errors-D8Gwp5kU.mjs +23 -0
- package/dist/errors-D8Gwp5kU.mjs.map +1 -0
- package/dist/errors-DMC4Umsb.cjs +34 -0
- package/dist/errors-DMC4Umsb.cjs.map +1 -0
- package/dist/github-DYQ5wvod.mjs +829 -0
- package/dist/github-DYQ5wvod.mjs.map +1 -0
- package/dist/github-DkSCUoWS.cjs +829 -0
- package/dist/github-DkSCUoWS.cjs.map +1 -0
- package/dist/identity-CBXr4wNi.mjs +129 -0
- package/dist/identity-CBXr4wNi.mjs.map +1 -0
- package/dist/identity-CbLfgQNT.cjs +182 -0
- package/dist/identity-CbLfgQNT.cjs.map +1 -0
- package/dist/{index-C6e-ULLx.d.mts → index-8OfpOtSI.d.cts} +39 -24
- package/dist/index-8OfpOtSI.d.cts.map +1 -0
- package/dist/{index-CR5urhWX.d.cts → index-Dpji6Bxq.d.mts} +39 -24
- package/dist/index-Dpji6Bxq.d.mts.map +1 -0
- package/dist/index.cjs +10022 -12718
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +10648 -13356
- package/dist/index.mjs.map +1 -1
- package/dist/local-BwC2v2Y8.mjs +224 -0
- package/dist/local-BwC2v2Y8.mjs.map +1 -0
- package/dist/local-DNhnkugT.cjs +241 -0
- package/dist/local-DNhnkugT.cjs.map +1 -0
- package/dist/migrate-BoJxKbfR.mjs +181 -0
- package/dist/migrate-BoJxKbfR.mjs.map +1 -0
- package/dist/migrate-CJTyeBul.cjs +271 -0
- package/dist/migrate-CJTyeBul.cjs.map +1 -0
- package/dist/migrate-CxmkvMbw.mjs +266 -0
- package/dist/migrate-CxmkvMbw.mjs.map +1 -0
- package/dist/migrate-ISBZNDKU.cjs +181 -0
- package/dist/migrate-ISBZNDKU.cjs.map +1 -0
- package/dist/openapi.cjs +214 -10
- package/dist/openapi.cjs.map +1 -0
- package/dist/openapi.d.cts +38 -17
- package/dist/openapi.d.cts.map +1 -1
- package/dist/openapi.d.mts +38 -17
- package/dist/openapi.d.mts.map +1 -1
- package/dist/openapi.mjs +208 -5
- package/dist/openapi.mjs.map +1 -0
- package/dist/projectBucket-BBbQ1lHF.cjs +263 -0
- package/dist/projectBucket-BBbQ1lHF.cjs.map +1 -0
- package/dist/projectBucket-C_DN4WzF.mjs +222 -0
- package/dist/projectBucket-C_DN4WzF.mjs.map +1 -0
- package/dist/provider-BqpjG9QM.cjs +57 -0
- package/dist/provider-BqpjG9QM.cjs.map +1 -0
- package/dist/provider-CEOKk8NS.mjs +46 -0
- package/dist/provider-CEOKk8NS.mjs.map +1 -0
- package/dist/ready-BtxiI7Qb.cjs +403 -0
- package/dist/ready-BtxiI7Qb.cjs.map +1 -0
- package/dist/ready-CzHNHhI6.mjs +374 -0
- package/dist/ready-CzHNHhI6.mjs.map +1 -0
- package/dist/reconcile/public.cjs +3 -5
- package/dist/reconcile/public.d.cts +11 -87
- package/dist/reconcile/public.d.cts.map +1 -1
- package/dist/reconcile/public.d.mts +11 -87
- package/dist/reconcile/public.d.mts.map +1 -1
- package/dist/reconcile/public.mjs +3 -4
- package/dist/{reconcile-CFs8C_1a.mjs → reconcile--I7V4Klj.mjs} +4 -7
- package/dist/reconcile--I7V4Klj.mjs.map +1 -0
- package/dist/{reconcile-D0pimNiy.cjs → reconcile-CuCQBa5-.cjs} +5 -8
- package/dist/reconcile-CuCQBa5-.cjs.map +1 -0
- package/dist/resolve-Bei6BMbw.mjs +263 -0
- package/dist/resolve-Bei6BMbw.mjs.map +1 -0
- package/dist/resolve-qm7FrBj_.cjs +316 -0
- package/dist/resolve-qm7FrBj_.cjs.map +1 -0
- package/dist/rollback-BJ3H4kQ8.mjs +136 -0
- package/dist/rollback-BJ3H4kQ8.mjs.map +1 -0
- package/dist/rollback-Bt4xRXtq.cjs +165 -0
- package/dist/rollback-Bt4xRXtq.cjs.map +1 -0
- package/dist/rolldown-runtime-BhDjJH2R.mjs +15 -0
- package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-C0BPl7ul.cjs} +23 -10
- package/dist/run-BJLIerMM.mjs +133 -0
- package/dist/run-BJLIerMM.mjs.map +1 -0
- package/dist/run-fVZ-rLnc.cjs +174 -0
- package/dist/run-fVZ-rLnc.cjs.map +1 -0
- package/dist/runtime-ACdfK59n.d.cts +82 -0
- package/dist/runtime-ACdfK59n.d.cts.map +1 -0
- package/dist/runtime-YyQuekxi.d.mts +82 -0
- package/dist/runtime-YyQuekxi.d.mts.map +1 -0
- package/dist/s3-CrPoA89T.cjs +215 -0
- package/dist/s3-CrPoA89T.cjs.map +1 -0
- package/dist/s3-DQXZdmCM.mjs +215 -0
- package/dist/s3-DQXZdmCM.mjs.map +1 -0
- package/dist/sandbox/config-worker.cjs +43 -0
- package/dist/sandbox/config-worker.cjs.map +1 -0
- package/dist/sandbox/config-worker.d.cts +1 -0
- package/dist/sandbox/config-worker.d.mts +1 -0
- package/dist/sandbox/config-worker.mjs +44 -0
- package/dist/sandbox/config-worker.mjs.map +1 -0
- package/dist/sandbox/credentials-worker.cjs +54 -0
- package/dist/sandbox/credentials-worker.cjs.map +1 -0
- package/dist/sandbox/credentials-worker.d.cts +1 -0
- package/dist/sandbox/credentials-worker.d.mts +1 -0
- package/dist/sandbox/credentials-worker.mjs +55 -0
- package/dist/sandbox/credentials-worker.mjs.map +1 -0
- package/dist/sandbox/discover-worker.cjs +47 -0
- package/dist/sandbox/discover-worker.cjs.map +1 -0
- package/dist/sandbox/discover-worker.d.cts +1 -0
- package/dist/sandbox/discover-worker.d.mts +1 -0
- package/dist/sandbox/discover-worker.mjs +48 -0
- package/dist/sandbox/discover-worker.mjs.map +1 -0
- package/dist/sandbox/migrate-worker.cjs +75 -0
- package/dist/sandbox/migrate-worker.cjs.map +1 -0
- package/dist/sandbox/migrate-worker.d.cts +1 -0
- package/dist/sandbox/migrate-worker.d.mts +1 -0
- package/dist/sandbox/migrate-worker.mjs +76 -0
- package/dist/sandbox/migrate-worker.mjs.map +1 -0
- package/dist/sandbox-C4g1eG31.d.mts +104 -0
- package/dist/sandbox-C4g1eG31.d.mts.map +1 -0
- package/dist/sandbox-CHv3OYXg.cjs +165 -0
- package/dist/sandbox-CHv3OYXg.cjs.map +1 -0
- package/dist/sandbox-CbVB7uOD.mjs +118 -0
- package/dist/sandbox-CbVB7uOD.mjs.map +1 -0
- package/dist/sandbox-CdKgQ3XU.d.cts +104 -0
- package/dist/sandbox-CdKgQ3XU.d.cts.map +1 -0
- package/dist/{workspace-C6VJQVtG.cjs → schemas-BCwKKA42.mjs} +958 -1842
- package/dist/schemas-BCwKKA42.mjs.map +1 -0
- package/dist/{workspace-zoqRbihZ.mjs → schemas-BQ_v0lEX.cjs} +1048 -1658
- package/dist/schemas-BQ_v0lEX.cjs.map +1 -0
- package/dist/secretsManager-CQORubp9.mjs +97 -0
- package/dist/secretsManager-CQORubp9.mjs.map +1 -0
- package/dist/secretsManager-RAGcEDX1.cjs +108 -0
- package/dist/secretsManager-RAGcEDX1.cjs.map +1 -0
- package/dist/seeds-CHIPcMrY.cjs +9115 -0
- package/dist/seeds-CHIPcMrY.cjs.map +1 -0
- package/dist/seeds-E4nUeXTl.mjs +8148 -0
- package/dist/seeds-E4nUeXTl.mjs.map +1 -0
- package/dist/sniffer-bUiSXLMj.mjs +1825 -0
- package/dist/sniffer-bUiSXLMj.mjs.map +1 -0
- package/dist/sniffer-n3TkX6JD.cjs +1998 -0
- package/dist/sniffer-n3TkX6JD.cjs.map +1 -0
- package/dist/sst-B-Uz4cvm.cjs +464 -0
- package/dist/sst-B-Uz4cvm.cjs.map +1 -0
- package/dist/sst-C1pxbFEd.mjs +441 -0
- package/dist/sst-C1pxbFEd.mjs.map +1 -0
- package/dist/stages-DJrOYLZ-.mjs +176 -0
- package/dist/stages-DJrOYLZ-.mjs.map +1 -0
- package/dist/stages-_3RVNG83.cjs +176 -0
- package/dist/stages-_3RVNG83.cjs.map +1 -0
- package/dist/target/public.cjs +15 -0
- package/dist/target/public.d.cts +28 -0
- package/dist/target/public.d.cts.map +1 -0
- package/dist/target/public.d.mts +28 -0
- package/dist/target/public.d.mts.map +1 -0
- package/dist/target/public.mjs +4 -0
- package/dist/terminal-Bs_lNQhL.mjs +85 -0
- package/dist/terminal-Bs_lNQhL.mjs.map +1 -0
- package/dist/terminal-CsQz4oT0.cjs +85 -0
- package/dist/terminal-CsQz4oT0.cjs.map +1 -0
- package/dist/types-B6UXlEkf.d.cts +7650 -0
- package/dist/types-B6UXlEkf.d.cts.map +1 -0
- package/dist/types-HqVPddRK.d.mts +7649 -0
- package/dist/types-HqVPddRK.d.mts.map +1 -0
- package/dist/utils-D2Nk1Nv2.cjs +205 -0
- package/dist/utils-D2Nk1Nv2.cjs.map +1 -0
- package/dist/utils-D_fxUqvU.mjs +156 -0
- package/dist/utils-D_fxUqvU.mjs.map +1 -0
- package/dist/vitest.cjs +65 -0
- package/dist/vitest.cjs.map +1 -0
- package/dist/vitest.d.cts +29 -0
- package/dist/vitest.d.cts.map +1 -0
- package/dist/vitest.d.mts +29 -0
- package/dist/vitest.d.mts.map +1 -0
- package/dist/vitest.mjs +65 -0
- package/dist/vitest.mjs.map +1 -0
- package/dist/workerRuntime-BXfhbe13.cjs +108 -0
- package/dist/workerRuntime-BXfhbe13.cjs.map +1 -0
- package/dist/workerRuntime-CsOyBRx2.mjs +79 -0
- package/dist/workerRuntime-CsOyBRx2.mjs.map +1 -0
- package/dist/workspace/index.cjs +8 -4
- package/dist/workspace/index.d.cts +3 -3
- package/dist/workspace/index.d.mts +3 -3
- package/dist/workspace/index.mjs +2 -3
- package/dist/workspace-BwqQnool.cjs +2806 -0
- package/dist/workspace-BwqQnool.cjs.map +1 -0
- package/dist/workspace-D1QbNd55.mjs +2394 -0
- package/dist/workspace-D1QbNd55.mjs.map +1 -0
- package/package.json +54 -22
- package/dist/CachedStateProvider-BLo7zv7S.cjs +0 -3
- package/dist/CachedStateProvider-BxoAm-B2.mjs +0 -3
- package/dist/CachedStateProvider-CqPdW7CB.cjs +0 -60
- package/dist/CachedStateProvider-CqPdW7CB.cjs.map +0 -1
- package/dist/CachedStateProvider-DTniehMP.mjs +0 -54
- package/dist/CachedStateProvider-DTniehMP.mjs.map +0 -1
- package/dist/HostingerProvider-Cft7lEYr.mjs.map +0 -1
- package/dist/HostingerProvider-h3EbEp-Z.cjs.map +0 -1
- package/dist/LocalStateProvider-Bn6tS-oL.mjs +0 -42
- package/dist/LocalStateProvider-Bn6tS-oL.mjs.map +0 -1
- package/dist/LocalStateProvider-Db9SEjyH.cjs +0 -43
- package/dist/LocalStateProvider-Db9SEjyH.cjs.map +0 -1
- package/dist/Route53Provider-RdpUDJQk.mjs.map +0 -1
- package/dist/Route53Provider-di2fMM5N.cjs.map +0 -1
- package/dist/SSMStateProvider-BRt2py-A.mjs +0 -66
- package/dist/SSMStateProvider-BRt2py-A.mjs.map +0 -1
- package/dist/SSMStateProvider-DyX8s9HI.cjs +0 -66
- package/dist/SSMStateProvider-DyX8s9HI.cjs.map +0 -1
- package/dist/backup-provisioner-Bgj5Vi_L.mjs.map +0 -1
- package/dist/backup-provisioner-BrsHwYG0.cjs.map +0 -1
- package/dist/bundler-BY1OmV1e.cjs.map +0 -1
- package/dist/bundler-Be8Zg4Wd.mjs.map +0 -1
- package/dist/chunk-Duj1WY3L.mjs +0 -7
- package/dist/config-BZ1F0WuA.cjs +0 -462
- package/dist/config-BZ1F0WuA.cjs.map +0 -1
- package/dist/config-DVVph9yz.mjs +0 -402
- package/dist/config-DVVph9yz.mjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/credentials-B5zRHdAl.mjs +0 -141
- package/dist/credentials-B5zRHdAl.mjs.map +0 -1
- package/dist/credentials-BapzjyV5.cjs +0 -195
- package/dist/credentials-BapzjyV5.cjs.map +0 -1
- package/dist/credentials-Xamqe_NJ.cjs +0 -2681
- package/dist/credentials-Xamqe_NJ.cjs.map +0 -1
- package/dist/credentials-dP8vRVRv.mjs +0 -2549
- package/dist/credentials-dP8vRVRv.mjs.map +0 -1
- package/dist/discover-CAlFgYec.mjs +0 -229
- package/dist/discover-CAlFgYec.mjs.map +0 -1
- package/dist/discover-DTmFeloL.cjs +0 -271
- package/dist/discover-DTmFeloL.cjs.map +0 -1
- package/dist/dokploy-api-BS2xnJLZ.mjs +0 -3
- package/dist/dokploy-api-BsVH0y_s.cjs +0 -718
- package/dist/dokploy-api-BsVH0y_s.cjs.map +0 -1
- package/dist/dokploy-api-BuxDRo3l.cjs +0 -3
- package/dist/dokploy-api-aTFPz7_4.mjs +0 -706
- package/dist/dokploy-api-aTFPz7_4.mjs.map +0 -1
- package/dist/emit-CbcRolsa.cjs.map +0 -1
- package/dist/emit-CiZS_5Ub.mjs.map +0 -1
- package/dist/encryption-C6jaU0hE.cjs +0 -54
- package/dist/encryption-C6jaU0hE.cjs.map +0 -1
- package/dist/encryption-CHzzeR8a.cjs +0 -4
- package/dist/encryption-CQUncu7v.mjs +0 -3
- package/dist/encryption-D-abyhZx.mjs +0 -42
- package/dist/encryption-D-abyhZx.mjs.map +0 -1
- package/dist/fullstack-secrets-C-GGohke.cjs +0 -111
- package/dist/fullstack-secrets-C-GGohke.cjs.map +0 -1
- package/dist/fullstack-secrets-D1o9-G5l.mjs +0 -87
- package/dist/fullstack-secrets-D1o9-G5l.mjs.map +0 -1
- package/dist/generator-CNzBw7g5.cjs +0 -289
- package/dist/generator-CNzBw7g5.cjs.map +0 -1
- package/dist/generator-VE2JrFlY.mjs +0 -253
- package/dist/generator-VE2JrFlY.mjs.map +0 -1
- package/dist/index-C6e-ULLx.d.mts.map +0 -1
- package/dist/index-CR5urhWX.d.cts.map +0 -1
- package/dist/openapi-SjsgARie.cjs +0 -2075
- package/dist/openapi-SjsgARie.cjs.map +0 -1
- package/dist/openapi-Xx0A7Wg0.mjs +0 -2021
- package/dist/openapi-Xx0A7Wg0.mjs.map +0 -1
- package/dist/openapi-react-query-Byltvm_7.mjs +0 -167
- package/dist/openapi-react-query-Byltvm_7.mjs.map +0 -1
- package/dist/openapi-react-query-CmJ1xDbn.cjs +0 -173
- package/dist/openapi-react-query-CmJ1xDbn.cjs.map +0 -1
- package/dist/openapi-react-query.cjs +0 -4
- package/dist/openapi-react-query.d.cts +0 -11
- package/dist/openapi-react-query.d.cts.map +0 -1
- package/dist/openapi-react-query.d.mts +0 -11
- package/dist/openapi-react-query.d.mts.map +0 -1
- package/dist/openapi-react-query.mjs +0 -4
- package/dist/reconcile-CFs8C_1a.mjs.map +0 -1
- package/dist/reconcile-D0pimNiy.cjs.map +0 -1
- package/dist/setup-BA8ciTPU.mjs +0 -11
- package/dist/setup-BsZvZP6f.cjs +0 -11
- package/dist/setup-C8KOx8_8.mjs +0 -443
- package/dist/setup-C8KOx8_8.mjs.map +0 -1
- package/dist/setup-hC6hI86f.cjs +0 -473
- package/dist/setup-hC6hI86f.cjs.map +0 -1
- package/dist/storage-BJmzYxt8.cjs +0 -363
- package/dist/storage-BJmzYxt8.cjs.map +0 -1
- package/dist/storage-BM9hGpgv.cjs +0 -7
- package/dist/storage-Bi24WfoW.mjs +0 -297
- package/dist/storage-Bi24WfoW.mjs.map +0 -1
- package/dist/storage-CYlGwWTj.mjs +0 -3
- package/dist/sync-CmEuNZsB.mjs +0 -76
- package/dist/sync-CmEuNZsB.mjs.map +0 -1
- package/dist/sync-D306yOWu.cjs +0 -4
- package/dist/sync-SizaChmC.cjs +0 -93
- package/dist/sync-SizaChmC.cjs.map +0 -1
- package/dist/sync-hOqAWHR6.mjs +0 -3
- package/dist/types-6pkp2RRj.d.mts +0 -2220
- package/dist/types-6pkp2RRj.d.mts.map +0 -1
- package/dist/types-Y3fKQSAK.d.cts +0 -2220
- package/dist/types-Y3fKQSAK.d.cts.map +0 -1
- package/dist/workspace-BzrG_2SI.mjs +0 -8
- package/dist/workspace-C6VJQVtG.cjs.map +0 -1
- package/dist/workspace-XXtNhqJl.cjs +0 -9
- package/dist/workspace-zoqRbihZ.mjs.map +0 -1
|
@@ -0,0 +1,718 @@
|
|
|
1
|
+
import { t as GkmError } from "./errors-D8Gwp5kU.mjs";
|
|
2
|
+
import { N as assertDeployedStage, U as stageProvider, ft as SERVER_IPV4_KEY, pt as SERVER_IPV6_KEY } from "./workspace-D1QbNd55.mjs";
|
|
3
|
+
import { S as deploysWithCompose } from "./dns-CQZQL3gj.mjs";
|
|
4
|
+
import { _ as url, o as email } from "./schemas-BCwKKA42.mjs";
|
|
5
|
+
import { It as secretsStoreFor, M as stageProviderNotes, at as appEnvKeys, dt as constructGlobs, j as provisionCommand, nt as requiredStageKeys, rt as stageServiceDeclarations, zt as initStageSecrets } from "./seeds-E4nUeXTl.mjs";
|
|
6
|
+
import { t as appKey } from "./derive-B4vDpzgP.mjs";
|
|
7
|
+
import { r as discover } from "./discover-kziEht4W.mjs";
|
|
8
|
+
import { loadWorkspaceSettings } from "./config.mjs";
|
|
9
|
+
import { i as issueLine, o as loadCredentialSchemas } from "./credentialSchemas-DvitraL-.mjs";
|
|
10
|
+
import { isIPv4, isIPv6 } from "node:net";
|
|
11
|
+
import { provideKey } from "@geekmidas/manifest";
|
|
12
|
+
import prompts from "prompts";
|
|
13
|
+
import { build, parse } from "@geekmidas/storage/s3-url";
|
|
14
|
+
//#region src/secrets/stageKeys.ts
|
|
15
|
+
/**
|
|
16
|
+
* The keys a workspace's stage must be given — across every app, each once,
|
|
17
|
+
* with who reads it and whether the stage holds it.
|
|
18
|
+
*
|
|
19
|
+
* The keys themselves are `requiredStageKeys`'s, and the mail and storage
|
|
20
|
+
* constructs `stageServiceDeclarations`' — the lists a deploy's readiness
|
|
21
|
+
* check refuses a stage by. What this adds is the workspace: which third
|
|
22
|
+
* parties' credentials its apps read (`appEnvKeys`) and which of the keys
|
|
23
|
+
* the stage has set.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Every key the stage must be given: each mail and storage construct's —
|
|
27
|
+
* the deploy's own list, `stageServiceDeclarations` — and each third party's
|
|
28
|
+
* credentials an app reads.
|
|
29
|
+
*/
|
|
30
|
+
function workspaceStageKeys(input) {
|
|
31
|
+
const { manifest } = input;
|
|
32
|
+
const reads = /* @__PURE__ */ new Map();
|
|
33
|
+
for (const [id, declaration] of Object.entries(manifest)) {
|
|
34
|
+
const { kind } = declaration;
|
|
35
|
+
if (kind !== "rest-api" && kind !== "site" && kind !== "mobile-app") continue;
|
|
36
|
+
const name = appKey(id);
|
|
37
|
+
const keys = appEnvKeys(manifest, name, input.runnables);
|
|
38
|
+
if (keys) reads.set(name, keys);
|
|
39
|
+
}
|
|
40
|
+
const readers = (id) => {
|
|
41
|
+
const key = provideKey(id, "credentials");
|
|
42
|
+
return [...reads].filter(([, env]) => env.has(key)).map(([app]) => app).sort();
|
|
43
|
+
};
|
|
44
|
+
const credentials = [];
|
|
45
|
+
for (const [id, declaration] of Object.entries(manifest)) {
|
|
46
|
+
const { kind } = declaration;
|
|
47
|
+
if (kind !== "external-api" && kind !== "credential") continue;
|
|
48
|
+
const apps = readers(id);
|
|
49
|
+
if (apps.length > 0) credentials.push({
|
|
50
|
+
id,
|
|
51
|
+
kind,
|
|
52
|
+
apps
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const services = stageServiceDeclarations({
|
|
56
|
+
manifest,
|
|
57
|
+
...input.runnables ? { runnables: input.runnables } : {}
|
|
58
|
+
});
|
|
59
|
+
return requiredStageKeys({
|
|
60
|
+
local: input.local,
|
|
61
|
+
services,
|
|
62
|
+
credentials,
|
|
63
|
+
...input.domain ? { domain: input.domain } : {},
|
|
64
|
+
...input.providers ? { providers: input.providers } : {},
|
|
65
|
+
...input.server ? { server: true } : {}
|
|
66
|
+
}).map((key) => ({
|
|
67
|
+
...key,
|
|
68
|
+
set: input.supplied[key.key] !== void 0
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/secrets/add.ts
|
|
73
|
+
/**
|
|
74
|
+
* `gkm secrets:add --stage <stage>` — the secrets a stage must be given,
|
|
75
|
+
* built key by key.
|
|
76
|
+
*
|
|
77
|
+
* It offers exactly the keys a deploy would refuse the stage without
|
|
78
|
+
* (`requiredStageKeys`), across every app in the workspace, each once: the
|
|
79
|
+
* stage's buckets, mail and file servers where it is deployed, and every
|
|
80
|
+
* third party's credentials. A key is built by what it is — a bucket from its
|
|
81
|
+
* provider, mail from its SMTP server, credentials field by field from their
|
|
82
|
+
* construct's schema — checked, and saved through the stage's own store, the
|
|
83
|
+
* one `gkm secrets:set` writes. No value is ever printed.
|
|
84
|
+
*
|
|
85
|
+
* The keys are walked one at a time — unset ones first — and each is a
|
|
86
|
+
* checkpoint: set it now, skip it, or stop here. A key is saved the moment it
|
|
87
|
+
* is built, so stopping, Ctrl-C or a failure keeps every key before it, and
|
|
88
|
+
* running the command again picks up what is still missing. A key a provider
|
|
89
|
+
* on the stage creates (a bucket under `deploy.objects.<stage>`, written by
|
|
90
|
+
* the deploy) is not a checkpoint: it is listed, with what creates it.
|
|
91
|
+
*
|
|
92
|
+
* `--json` asks nothing: it prints the keys, for a script or an agent to set
|
|
93
|
+
* with `gkm secrets:set`.
|
|
94
|
+
*/
|
|
95
|
+
/** `gkm secrets:add` with nobody at a terminal to answer it. */
|
|
96
|
+
var SecretsAddNeedsTerminal = class extends GkmError {
|
|
97
|
+
stage;
|
|
98
|
+
constructor(stage) {
|
|
99
|
+
super(`gkm secrets:add asks for each key, and there is no terminal to ask at. List what the stage needs with gkm secrets:add --stage ${stage} --missing --json, and set each with gkm secrets:set <KEY> <value> --stage ${stage}.`);
|
|
100
|
+
this.stage = stage;
|
|
101
|
+
this.name = "SecretsAddNeedsTerminal";
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* The person stopped the builder at a prompt (Ctrl-C). Every key saved
|
|
106
|
+
* before it is kept; the run ends with what was saved and what is missing.
|
|
107
|
+
*/
|
|
108
|
+
var SecretsAddCancelled = class extends Error {
|
|
109
|
+
stage;
|
|
110
|
+
constructor(stage) {
|
|
111
|
+
super(`Stopped. Every key saved to the stage '${stage}' before it is kept.`);
|
|
112
|
+
this.stage = stage;
|
|
113
|
+
this.name = "SecretsAddCancelled";
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const defaultIo = () => ({
|
|
117
|
+
log: (line) => console.log(line),
|
|
118
|
+
write: (chunk) => {
|
|
119
|
+
process.stdout.write(chunk);
|
|
120
|
+
},
|
|
121
|
+
interactive: process.stdin.isTTY === true && process.stdout.isTTY === true
|
|
122
|
+
});
|
|
123
|
+
/** `gkm secrets:add`. */
|
|
124
|
+
async function secretsAddCommand(options, io = defaultIo()) {
|
|
125
|
+
const { stage } = options;
|
|
126
|
+
const workspace = await loadWorkspaceSettings(options.cwd ?? process.cwd());
|
|
127
|
+
const local = stage === workspace.stages.local;
|
|
128
|
+
if (!local) assertDeployedStage(workspace.stages, stage);
|
|
129
|
+
const patterns = constructGlobs(workspace);
|
|
130
|
+
const runnables = {};
|
|
131
|
+
const manifest = await discover({
|
|
132
|
+
patterns,
|
|
133
|
+
cwd: workspace.root,
|
|
134
|
+
runnables
|
|
135
|
+
});
|
|
136
|
+
const store = await secretsStoreFor(workspace, stage, { ...options.home ? { home: options.home } : {} });
|
|
137
|
+
const stored = await store.read(stage);
|
|
138
|
+
const domain = workspace.domains?.[stage];
|
|
139
|
+
const all = workspaceStageKeys({
|
|
140
|
+
manifest,
|
|
141
|
+
runnables,
|
|
142
|
+
local,
|
|
143
|
+
supplied: stored?.custom ?? {},
|
|
144
|
+
...domain ? { domain } : {},
|
|
145
|
+
providers: stageProviderNotes(workspace, stage),
|
|
146
|
+
...!local && domain && deploysWithCompose(workspace) ? { server: true } : {}
|
|
147
|
+
});
|
|
148
|
+
const scope = [...all.filter((k) => !k.set), ...all.filter((k) => k.set)];
|
|
149
|
+
const keys = options.missing ? scope.filter((k) => !k.set) : scope;
|
|
150
|
+
const objects = stageProvider(workspace, "objects", stage);
|
|
151
|
+
const provisioned = (k) => objects.mode === "provider" && k.hint !== void 0 && (k.kind === "bucket" || k.kind === "file-server");
|
|
152
|
+
if (options.json) {
|
|
153
|
+
const listed = keys.map((k) => ({
|
|
154
|
+
key: k.key,
|
|
155
|
+
kind: k.kind,
|
|
156
|
+
construct: k.id,
|
|
157
|
+
apps: [...k.apps ?? []],
|
|
158
|
+
set: k.set,
|
|
159
|
+
...provisioned(k) ? { provisioned: true } : {}
|
|
160
|
+
}));
|
|
161
|
+
io.write(`${JSON.stringify(listed, null, 2)}\n`);
|
|
162
|
+
return {
|
|
163
|
+
keys,
|
|
164
|
+
saved: [],
|
|
165
|
+
skipped: [],
|
|
166
|
+
missing: []
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (!io.interactive) throw new SecretsAddNeedsTerminal(stage);
|
|
170
|
+
const offered = keys.filter((k) => !provisioned(k));
|
|
171
|
+
const created = keys.filter(provisioned);
|
|
172
|
+
if (created.length > 0 && objects.mode === "provider") {
|
|
173
|
+
io.log("Not offered — a provider on the stage creates them:");
|
|
174
|
+
for (const k of created) io.log(` ${k.key} — created by ${provisionCommand(stage)} (deploy.objects.${stage} is ${objects.name})`);
|
|
175
|
+
}
|
|
176
|
+
if (offered.length === 0) {
|
|
177
|
+
io.log(all.every(provisioned) ? `Nothing to add: no construct on '${stage}' needs a key only the stage can supply.` : `Nothing to add: the stage '${stage}' has every key it needs.`);
|
|
178
|
+
return {
|
|
179
|
+
keys: offered,
|
|
180
|
+
saved: [],
|
|
181
|
+
skipped: [],
|
|
182
|
+
missing: []
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const ask = asker(stage);
|
|
186
|
+
let current = stored ?? initStageSecrets(stage);
|
|
187
|
+
const saved = [];
|
|
188
|
+
const skipped = [];
|
|
189
|
+
const has = (key) => current.custom?.[key] !== void 0;
|
|
190
|
+
let schemas;
|
|
191
|
+
const save = async (values) => {
|
|
192
|
+
current = {
|
|
193
|
+
...current,
|
|
194
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
195
|
+
custom: {
|
|
196
|
+
...current.custom,
|
|
197
|
+
...values
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
await store.write(stage, current);
|
|
201
|
+
saved.push(...Object.keys(values));
|
|
202
|
+
io.log(` ✓ Saved ${Object.keys(values).join(", ")}.`);
|
|
203
|
+
};
|
|
204
|
+
const walk = async () => {
|
|
205
|
+
for (const [index, entry] of offered.entries()) {
|
|
206
|
+
io.log(`\n[${index + 1}/${offered.length}] ${entry.key} — ${entry.what}`);
|
|
207
|
+
if (entry.hint) io.log(` ${entry.hint}`);
|
|
208
|
+
const step = await ask({
|
|
209
|
+
type: "select",
|
|
210
|
+
message: `${entry.key} ${KIND_LABEL[entry.kind]} '${entry.id}'${entry.apps?.length ? ` · ${entry.apps.join(", ")}` : ""}${entry.set ? " · set" : ""}`,
|
|
211
|
+
choices: [
|
|
212
|
+
{
|
|
213
|
+
title: "Set it now",
|
|
214
|
+
value: "set"
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
title: "Skip",
|
|
218
|
+
value: "skip"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
title: "Stop here",
|
|
222
|
+
value: "stop"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
initial: 0
|
|
226
|
+
});
|
|
227
|
+
if (step === "stop") return;
|
|
228
|
+
if (step !== "set") {
|
|
229
|
+
skipped.push(entry.key);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (entry.set) {
|
|
233
|
+
if (!await ask({
|
|
234
|
+
type: "confirm",
|
|
235
|
+
message: `${entry.key} is set. Replace it?`,
|
|
236
|
+
initial: false
|
|
237
|
+
})) {
|
|
238
|
+
skipped.push(entry.key);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
switch (entry.kind) {
|
|
243
|
+
case "bucket":
|
|
244
|
+
await save(await buildBucket(ask, io, entry, has));
|
|
245
|
+
break;
|
|
246
|
+
case "email":
|
|
247
|
+
await save({ [entry.key]: entry.key.endsWith("_FROM") ? await askFrom(ask, io) : await buildSmtpUrl(ask, io) });
|
|
248
|
+
break;
|
|
249
|
+
case "file-server":
|
|
250
|
+
await save({ [entry.key]: await askHttpUrl(ask, io, "Its public URL") });
|
|
251
|
+
break;
|
|
252
|
+
case "server":
|
|
253
|
+
await save(await buildServer(ask, io, has));
|
|
254
|
+
break;
|
|
255
|
+
case "external-api":
|
|
256
|
+
case "credential":
|
|
257
|
+
schemas ??= await loadCredentialSchemas({
|
|
258
|
+
root: workspace.root,
|
|
259
|
+
patterns
|
|
260
|
+
});
|
|
261
|
+
await save({ [entry.key]: await buildCredentials(ask, io, entry, schemas) });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
try {
|
|
266
|
+
await walk();
|
|
267
|
+
} catch (error) {
|
|
268
|
+
if (!(error instanceof SecretsAddCancelled)) throw error;
|
|
269
|
+
io.log(`\n${error.message}`);
|
|
270
|
+
}
|
|
271
|
+
const missing = all.filter((k) => !provisioned(k) && !has(k.key)).map((k) => k.key);
|
|
272
|
+
io.log("");
|
|
273
|
+
io.log(saved.length > 0 ? `✓ Saved to the stage '${stage}' (${store.name} store): ${saved.join(", ")}` : "Nothing was saved.");
|
|
274
|
+
if (skipped.length > 0) io.log(` Skipped: ${skipped.join(", ")}`);
|
|
275
|
+
if (missing.length > 0) {
|
|
276
|
+
io.log(` Still missing: ${missing.join(", ")}`);
|
|
277
|
+
io.log(` Run gkm secrets:add --stage ${stage} --missing again to pick up where this left off.`);
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
keys: offered,
|
|
281
|
+
saved,
|
|
282
|
+
skipped,
|
|
283
|
+
missing
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const KIND_LABEL = {
|
|
287
|
+
bucket: "bucket",
|
|
288
|
+
email: "email",
|
|
289
|
+
"file-server": "file server",
|
|
290
|
+
"external-api": "external API",
|
|
291
|
+
credential: "credential",
|
|
292
|
+
server: "server address"
|
|
293
|
+
};
|
|
294
|
+
/** The server's IPv4 address, and — if it has one — its IPv6 address. */
|
|
295
|
+
async function buildServer(ask, io, has) {
|
|
296
|
+
const ipv4 = text(await askUntil(ask, io, {
|
|
297
|
+
type: "text",
|
|
298
|
+
message: "The server's public IPv4 address"
|
|
299
|
+
}, (value) => isIPv4(text(value)) ? void 0 : "An IPv4 address is required, e.g. 203.0.113.10."));
|
|
300
|
+
const values = { [SERVER_IPV4_KEY]: ipv4 };
|
|
301
|
+
if (has("GKM_SERVER_IPV6")) return values;
|
|
302
|
+
const ipv6 = text(await askUntil(ask, io, {
|
|
303
|
+
type: "text",
|
|
304
|
+
message: "Its public IPv6 address (empty for none — no AAAA records)"
|
|
305
|
+
}, (value) => !text(value) || isIPv6(text(value)) ? void 0 : "An IPv6 address, e.g. 2001:db8::10, or nothing."));
|
|
306
|
+
if (ipv6) values[SERVER_IPV6_KEY] = ipv6;
|
|
307
|
+
return values;
|
|
308
|
+
}
|
|
309
|
+
function asker(stage) {
|
|
310
|
+
return async (question) => {
|
|
311
|
+
return (await prompts({
|
|
312
|
+
...question,
|
|
313
|
+
name: "value"
|
|
314
|
+
}, { onCancel: () => {
|
|
315
|
+
throw new SecretsAddCancelled(stage);
|
|
316
|
+
} })).value;
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/** Ask until `accept` takes the answer; `accept` returns why it did not. */
|
|
320
|
+
async function askUntil(ask, io, question, accept) {
|
|
321
|
+
for (;;) {
|
|
322
|
+
const value = await ask(question);
|
|
323
|
+
const problem = accept(value);
|
|
324
|
+
if (!problem) return value;
|
|
325
|
+
io.log(` ✗ ${problem}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const required = (what) => (value) => value?.trim() ? void 0 : `${what} is required.`;
|
|
329
|
+
const text = (value) => String(value ?? "").trim();
|
|
330
|
+
/** An `http(s)://` URL. */
|
|
331
|
+
const HttpUrl = url({ protocol: /^https?$/ });
|
|
332
|
+
async function askHttpUrl(ask, io, message) {
|
|
333
|
+
return text(await askUntil(ask, io, {
|
|
334
|
+
type: "text",
|
|
335
|
+
message
|
|
336
|
+
}, (value) => HttpUrl.safeParse(text(value)).success ? void 0 : "An http:// or https:// URL is required."));
|
|
337
|
+
}
|
|
338
|
+
async function askFrom(ask, io) {
|
|
339
|
+
return text(await askUntil(ask, io, {
|
|
340
|
+
type: "text",
|
|
341
|
+
message: "The address it sends from"
|
|
342
|
+
}, (value) => email().safeParse(text(value)).success ? void 0 : "An email address is required, e.g. noreply@example.com."));
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* An SMTP server as the URL `@geekmidas/emailkit` reads: `smtp://` for
|
|
346
|
+
* STARTTLS, `smtps://` for TLS from the first byte, with the user and
|
|
347
|
+
* password percent-encoded.
|
|
348
|
+
*
|
|
349
|
+
* A known service fills in its own host, port and user; each from its docs:
|
|
350
|
+
* - Resend: smtp.resend.com, 465 implicit TLS, user `resend`, password the
|
|
351
|
+
* API key — https://resend.com/docs/send-with-smtp
|
|
352
|
+
* - Amazon SES: email-smtp.<region>.amazonaws.com, 587 STARTTLS, SMTP
|
|
353
|
+
* credentials — https://docs.aws.amazon.com/ses/latest/dg/smtp-connect.html,
|
|
354
|
+
* https://docs.aws.amazon.com/general/latest/gr/ses.html
|
|
355
|
+
* - Postmark: smtp.postmarkapp.com, 587 STARTTLS, the server API token as
|
|
356
|
+
* user and password —
|
|
357
|
+
* https://postmarkapp.com/developer/user-guide/send-email-with-smtp
|
|
358
|
+
* - Mailgun: smtp.mailgun.org (EU: smtp.eu.mailgun.org), 587 STARTTLS, the
|
|
359
|
+
* domain's SMTP credentials —
|
|
360
|
+
* https://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/send-smtp,
|
|
361
|
+
* https://documentation.mailgun.com/docs/mailgun/api-reference/api-overview
|
|
362
|
+
*/
|
|
363
|
+
async function buildSmtpUrl(ask, io) {
|
|
364
|
+
const service = await ask({
|
|
365
|
+
type: "select",
|
|
366
|
+
message: "Which mail service?",
|
|
367
|
+
choices: [
|
|
368
|
+
{
|
|
369
|
+
title: "Resend",
|
|
370
|
+
value: "resend"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
title: "Amazon SES",
|
|
374
|
+
value: "ses"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
title: "Postmark",
|
|
378
|
+
value: "postmark"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
title: "Mailgun",
|
|
382
|
+
value: "mailgun"
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
title: "Other SMTP server",
|
|
386
|
+
value: "other"
|
|
387
|
+
}
|
|
388
|
+
],
|
|
389
|
+
initial: 0
|
|
390
|
+
});
|
|
391
|
+
const secret = async (message, what) => text(await askUntil(ask, io, {
|
|
392
|
+
type: "password",
|
|
393
|
+
message
|
|
394
|
+
}, required(what)));
|
|
395
|
+
const login = async (message, what) => text(await askUntil(ask, io, {
|
|
396
|
+
type: "text",
|
|
397
|
+
message
|
|
398
|
+
}, required(what)));
|
|
399
|
+
switch (service) {
|
|
400
|
+
case "resend": return smtpUrl({
|
|
401
|
+
tls: "tls",
|
|
402
|
+
host: "smtp.resend.com",
|
|
403
|
+
port: 465,
|
|
404
|
+
user: "resend",
|
|
405
|
+
password: await secret("API key (re_…)", "The API key")
|
|
406
|
+
});
|
|
407
|
+
case "ses": return smtpUrl({
|
|
408
|
+
tls: "starttls",
|
|
409
|
+
host: `email-smtp.${await login("Region", "The region")}.amazonaws.com`,
|
|
410
|
+
port: 587,
|
|
411
|
+
user: await login("SMTP user name", "The SMTP user name"),
|
|
412
|
+
password: await secret("SMTP password", "The SMTP password")
|
|
413
|
+
});
|
|
414
|
+
case "postmark": {
|
|
415
|
+
const token = await secret("Server API token", "The server API token");
|
|
416
|
+
return smtpUrl({
|
|
417
|
+
tls: "starttls",
|
|
418
|
+
host: "smtp.postmarkapp.com",
|
|
419
|
+
port: 587,
|
|
420
|
+
user: token,
|
|
421
|
+
password: token
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
case "mailgun": return smtpUrl({
|
|
425
|
+
tls: "starttls",
|
|
426
|
+
host: await ask({
|
|
427
|
+
type: "select",
|
|
428
|
+
message: "Region",
|
|
429
|
+
choices: [{
|
|
430
|
+
title: "US (smtp.mailgun.org)",
|
|
431
|
+
value: "us"
|
|
432
|
+
}, {
|
|
433
|
+
title: "EU (smtp.eu.mailgun.org)",
|
|
434
|
+
value: "eu"
|
|
435
|
+
}],
|
|
436
|
+
initial: 0
|
|
437
|
+
}) === "eu" ? "smtp.eu.mailgun.org" : "smtp.mailgun.org",
|
|
438
|
+
port: 587,
|
|
439
|
+
user: await login("SMTP login (e.g. postmaster@mg.example.com)", "The SMTP login"),
|
|
440
|
+
password: await secret("SMTP password", "The SMTP password")
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
const host = text(await askUntil(ask, io, {
|
|
444
|
+
type: "text",
|
|
445
|
+
message: "SMTP host"
|
|
446
|
+
}, required("The host")));
|
|
447
|
+
const port = await askUntil(ask, io, {
|
|
448
|
+
type: "text",
|
|
449
|
+
message: "Port",
|
|
450
|
+
initial: "587"
|
|
451
|
+
}, (value) => {
|
|
452
|
+
const n = Number(value);
|
|
453
|
+
return Number.isInteger(n) && n > 0 && n < 65536 ? void 0 : "A port number is required.";
|
|
454
|
+
});
|
|
455
|
+
const user = text(await ask({
|
|
456
|
+
type: "text",
|
|
457
|
+
message: "User (empty for none)"
|
|
458
|
+
}));
|
|
459
|
+
const password = user ? await ask({
|
|
460
|
+
type: "password",
|
|
461
|
+
message: "Password"
|
|
462
|
+
}) : "";
|
|
463
|
+
return smtpUrl({
|
|
464
|
+
tls: await ask({
|
|
465
|
+
type: "select",
|
|
466
|
+
message: "TLS",
|
|
467
|
+
choices: [{
|
|
468
|
+
title: "STARTTLS (smtp://, usually port 587)",
|
|
469
|
+
value: "starttls"
|
|
470
|
+
}, {
|
|
471
|
+
title: "TLS on connect (smtps://, usually port 465)",
|
|
472
|
+
value: "tls"
|
|
473
|
+
}],
|
|
474
|
+
initial: 0
|
|
475
|
+
}),
|
|
476
|
+
host,
|
|
477
|
+
port: Number(port),
|
|
478
|
+
user,
|
|
479
|
+
password
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
function smtpUrl(server) {
|
|
483
|
+
const url = new URL(`${server.tls === "tls" ? "smtps" : "smtp"}://${server.host}`);
|
|
484
|
+
url.port = String(server.port);
|
|
485
|
+
if (server.user) {
|
|
486
|
+
url.username = encodeURIComponent(server.user);
|
|
487
|
+
url.password = encodeURIComponent(server.password ?? "");
|
|
488
|
+
}
|
|
489
|
+
return url.toString().replace(/\/$/, "");
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* A bucket's URL, from its provider — and, optionally, a key for it alone in
|
|
493
|
+
* the URL, or the stage's shared pair. Credentials are never required: without
|
|
494
|
+
* them the SDK's own chain signs, a role included.
|
|
495
|
+
*/
|
|
496
|
+
async function buildBucket(ask, io, entry, has) {
|
|
497
|
+
const provider = await ask({
|
|
498
|
+
type: "select",
|
|
499
|
+
message: "Where is the bucket?",
|
|
500
|
+
choices: [
|
|
501
|
+
{
|
|
502
|
+
title: "AWS S3",
|
|
503
|
+
value: "s3"
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
title: "Cloudflare R2",
|
|
507
|
+
value: "r2"
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
title: "MinIO, or another S3-compatible store",
|
|
511
|
+
value: "compatible"
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
title: "Paste an s3:// URL",
|
|
515
|
+
value: "url"
|
|
516
|
+
}
|
|
517
|
+
],
|
|
518
|
+
initial: 0
|
|
519
|
+
});
|
|
520
|
+
const bucketName = async () => text(await askUntil(ask, io, {
|
|
521
|
+
type: "text",
|
|
522
|
+
message: "Bucket name"
|
|
523
|
+
}, required("The bucket name")));
|
|
524
|
+
let address;
|
|
525
|
+
switch (provider) {
|
|
526
|
+
case "s3":
|
|
527
|
+
address = {
|
|
528
|
+
bucket: await bucketName(),
|
|
529
|
+
region: text(await askUntil(ask, io, {
|
|
530
|
+
type: "text",
|
|
531
|
+
message: "Region",
|
|
532
|
+
initial: "eu-west-1"
|
|
533
|
+
}, required("The region")))
|
|
534
|
+
};
|
|
535
|
+
break;
|
|
536
|
+
case "r2": {
|
|
537
|
+
const account = text(await askUntil(ask, io, {
|
|
538
|
+
type: "text",
|
|
539
|
+
message: "Cloudflare account id, or the R2 endpoint URL"
|
|
540
|
+
}, required("The account id or endpoint")));
|
|
541
|
+
address = {
|
|
542
|
+
bucket: await bucketName(),
|
|
543
|
+
region: "auto",
|
|
544
|
+
endpoint: /^https?:\/\//.test(account) ? account : `https://${account}.r2.cloudflarestorage.com`
|
|
545
|
+
};
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
case "compatible": {
|
|
549
|
+
const endpoint = await askHttpUrl(ask, io, "Endpoint URL");
|
|
550
|
+
const bucket = await bucketName();
|
|
551
|
+
const region = text(await ask({
|
|
552
|
+
type: "text",
|
|
553
|
+
message: "Region",
|
|
554
|
+
initial: "us-east-1"
|
|
555
|
+
}));
|
|
556
|
+
const forcePathStyle = await ask({
|
|
557
|
+
type: "confirm",
|
|
558
|
+
message: "Path-style addressing? (MinIO needs it)",
|
|
559
|
+
initial: true
|
|
560
|
+
});
|
|
561
|
+
address = {
|
|
562
|
+
bucket,
|
|
563
|
+
...region ? { region } : {},
|
|
564
|
+
endpoint,
|
|
565
|
+
...forcePathStyle ? { forcePathStyle } : {}
|
|
566
|
+
};
|
|
567
|
+
break;
|
|
568
|
+
}
|
|
569
|
+
case "url": {
|
|
570
|
+
const pasted = await askUntil(ask, io, {
|
|
571
|
+
type: "password",
|
|
572
|
+
message: "The s3:// URL"
|
|
573
|
+
}, (value) => {
|
|
574
|
+
try {
|
|
575
|
+
parse(text(value));
|
|
576
|
+
return;
|
|
577
|
+
} catch (error) {
|
|
578
|
+
return `Not an s3:// URL the storage client can read (${error.name}).`;
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
address = parse(text(pasted));
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
if (!address.accessKeyId) {
|
|
586
|
+
if (await ask({
|
|
587
|
+
type: "confirm",
|
|
588
|
+
message: `A key for '${entry.id}' alone, in its URL? (optional)`,
|
|
589
|
+
initial: false
|
|
590
|
+
})) {
|
|
591
|
+
const accessKeyId = text(await askUntil(ask, io, {
|
|
592
|
+
type: "text",
|
|
593
|
+
message: "Access key id"
|
|
594
|
+
}, required("The access key id")));
|
|
595
|
+
const secretAccessKey = await askUntil(ask, io, {
|
|
596
|
+
type: "password",
|
|
597
|
+
message: "Secret access key"
|
|
598
|
+
}, required("The secret access key"));
|
|
599
|
+
address = {
|
|
600
|
+
...address,
|
|
601
|
+
accessKeyId,
|
|
602
|
+
secretAccessKey
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
const values = { [entry.key]: build(address) };
|
|
607
|
+
if (!address.accessKeyId && !has("AWS_ACCESS_KEY_ID")) {
|
|
608
|
+
if (await ask({
|
|
609
|
+
type: "confirm",
|
|
610
|
+
message: "Set the stage's shared AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY? (optional: without them a role signs)",
|
|
611
|
+
initial: false
|
|
612
|
+
})) {
|
|
613
|
+
values.AWS_ACCESS_KEY_ID = text(await askUntil(ask, io, {
|
|
614
|
+
type: "text",
|
|
615
|
+
message: "AWS_ACCESS_KEY_ID"
|
|
616
|
+
}, required("The access key id")));
|
|
617
|
+
values.AWS_SECRET_ACCESS_KEY = await askUntil(ask, io, {
|
|
618
|
+
type: "password",
|
|
619
|
+
message: "AWS_SECRET_ACCESS_KEY"
|
|
620
|
+
}, required("The secret access key"));
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return values;
|
|
624
|
+
}
|
|
625
|
+
/** A field whose name says it is a secret, asked for without echo. */
|
|
626
|
+
const SECRET_FIELD = /secret|key|token|password/i;
|
|
627
|
+
/** The properties of an object schema, or nothing for any other shape. */
|
|
628
|
+
function objectProperties(info) {
|
|
629
|
+
const schema = info?.jsonSchema;
|
|
630
|
+
if (!schema || schema.type !== "object") return void 0;
|
|
631
|
+
const properties = schema.properties;
|
|
632
|
+
if (!properties || typeof properties !== "object") return void 0;
|
|
633
|
+
return {
|
|
634
|
+
properties,
|
|
635
|
+
required: Array.isArray(schema.required) ? schema.required : []
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
function typesOf(property) {
|
|
639
|
+
if (Array.isArray(property.type)) return property.type;
|
|
640
|
+
return property.type ? [property.type] : [];
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Credentials, field by field where the construct's schema is an object it
|
|
644
|
+
* can describe, and as JSON otherwise — checked against the schema itself
|
|
645
|
+
* before anything is kept, and asked again, with each issue's path, until
|
|
646
|
+
* the schema takes it.
|
|
647
|
+
*/
|
|
648
|
+
async function buildCredentials(ask, io, entry, schemas) {
|
|
649
|
+
const info = schemas.schemas.find((s) => s.key === entry.key);
|
|
650
|
+
const shape = objectProperties(info);
|
|
651
|
+
if (!info) io.log(` '${entry.id}' exposes no schema to check against; the value is stored as given.`);
|
|
652
|
+
for (;;) {
|
|
653
|
+
const raw = shape ? JSON.stringify(await askFields(ask, io, shape)) : text(await ask({
|
|
654
|
+
type: "password",
|
|
655
|
+
message: "The value, as JSON (or one opaque string)"
|
|
656
|
+
}));
|
|
657
|
+
const check = await schemas.check(entry.key, raw);
|
|
658
|
+
if (check.ok) return raw;
|
|
659
|
+
io.log(` ✗ The schema of '${entry.id}' refuses it:`);
|
|
660
|
+
for (const issue of check.issues) io.log(` ${issueLine(entry.key, issue)}`);
|
|
661
|
+
io.log(" Again:");
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
async function askFields(ask, io, shape) {
|
|
665
|
+
const value = {};
|
|
666
|
+
for (const [name, property] of Object.entries(shape.properties)) {
|
|
667
|
+
const optional = !shape.required.includes(name);
|
|
668
|
+
const label = `${name}${optional ? " (optional)" : ""}${property.description ? ` — ${property.description}` : ""}`;
|
|
669
|
+
const types = typesOf(property);
|
|
670
|
+
if (property.enum?.length) {
|
|
671
|
+
const choices = property.enum.map((option) => ({
|
|
672
|
+
title: String(option),
|
|
673
|
+
value: option
|
|
674
|
+
}));
|
|
675
|
+
const picked = await ask({
|
|
676
|
+
type: "select",
|
|
677
|
+
message: label,
|
|
678
|
+
choices: optional ? [{
|
|
679
|
+
title: "(none)",
|
|
680
|
+
value: void 0
|
|
681
|
+
}, ...choices] : choices
|
|
682
|
+
});
|
|
683
|
+
if (picked !== void 0) value[name] = picked;
|
|
684
|
+
continue;
|
|
685
|
+
}
|
|
686
|
+
if (types.includes("boolean")) {
|
|
687
|
+
value[name] = await ask({
|
|
688
|
+
type: "confirm",
|
|
689
|
+
message: label,
|
|
690
|
+
initial: false
|
|
691
|
+
});
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
694
|
+
const numeric = types.includes("number") || types.includes("integer");
|
|
695
|
+
const plain = types.length === 0 || types.includes("string");
|
|
696
|
+
const answer = await askUntil(ask, io, {
|
|
697
|
+
type: SECRET_FIELD.test(name) ? "password" : "text",
|
|
698
|
+
message: label
|
|
699
|
+
}, (given) => {
|
|
700
|
+
const typed = text(given);
|
|
701
|
+
if (!typed) return optional ? void 0 : `${name} is required.`;
|
|
702
|
+
if (numeric && !plain && Number.isNaN(Number(typed))) return `${name} is a number.`;
|
|
703
|
+
if (!numeric && !plain) try {
|
|
704
|
+
JSON.parse(typed);
|
|
705
|
+
} catch {
|
|
706
|
+
return `${name} is JSON (${types.join(" or ")}).`;
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
const typed = text(answer);
|
|
710
|
+
if (!typed) continue;
|
|
711
|
+
value[name] = plain ? typed : numeric ? Number(typed) : JSON.parse(typed);
|
|
712
|
+
}
|
|
713
|
+
return value;
|
|
714
|
+
}
|
|
715
|
+
//#endregion
|
|
716
|
+
export { secretsAddCommand };
|
|
717
|
+
|
|
718
|
+
//# sourceMappingURL=add-Blv6Q_YA.mjs.map
|