@geekmidas/cli 10.0.0-alpha.122 → 10.0.0-alpha.124
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/dist/{EndpointGenerator-BDa6pPgE.cjs → EndpointGenerator-B2MUa4M2.cjs} +2 -2
- package/dist/{EndpointGenerator-BDa6pPgE.cjs.map → EndpointGenerator-B2MUa4M2.cjs.map} +1 -1
- package/dist/{EndpointGenerator-CP_z_E3e.mjs → EndpointGenerator-Z_BUTocT.mjs} +2 -2
- package/dist/{EndpointGenerator-CP_z_E3e.mjs.map → EndpointGenerator-Z_BUTocT.mjs.map} +1 -1
- package/dist/{GoDaddyProvider-BJ9j9mR7.cjs → GoDaddyProvider-0z5RAN1k.cjs} +3 -3
- package/dist/{GoDaddyProvider-BJ9j9mR7.cjs.map → GoDaddyProvider-0z5RAN1k.cjs.map} +1 -1
- package/dist/{GoDaddyProvider-wIKYdm7V.mjs → GoDaddyProvider-55x4o-4z.mjs} +3 -3
- package/dist/{GoDaddyProvider-wIKYdm7V.mjs.map → GoDaddyProvider-55x4o-4z.mjs.map} +1 -1
- package/dist/{HostingerProvider-BNpS9aRJ.mjs → HostingerProvider-Cjh_2Ml6.mjs} +2 -2
- package/dist/{HostingerProvider-BNpS9aRJ.mjs.map → HostingerProvider-Cjh_2Ml6.mjs.map} +1 -1
- package/dist/{HostingerProvider-DR1iws1P.cjs → HostingerProvider-OdQmKXE3.cjs} +2 -2
- package/dist/{HostingerProvider-DR1iws1P.cjs.map → HostingerProvider-OdQmKXE3.cjs.map} +1 -1
- package/dist/{LegacyStateStore-CkXUJP7i.mjs → LegacyStateStore-C-vumKSN.mjs} +3 -3
- package/dist/{LegacyStateStore-CkXUJP7i.mjs.map → LegacyStateStore-C-vumKSN.mjs.map} +1 -1
- package/dist/{LegacyStateStore-D1S87I_B.cjs → LegacyStateStore-DRpB-yC5.cjs} +3 -3
- package/dist/{LegacyStateStore-D1S87I_B.cjs.map → LegacyStateStore-DRpB-yC5.cjs.map} +1 -1
- package/dist/{LocalStateStore-DmXfpvu4.cjs → LocalStateStore-C3ummuDT.cjs} +2 -2
- package/dist/{LocalStateStore-DmXfpvu4.cjs.map → LocalStateStore-C3ummuDT.cjs.map} +1 -1
- package/dist/{LocalStateStore-BWoWeSq0.mjs → LocalStateStore-CtOjpV1w.mjs} +2 -2
- package/dist/{LocalStateStore-BWoWeSq0.mjs.map → LocalStateStore-CtOjpV1w.mjs.map} +1 -1
- package/dist/{OpenApiTsGenerator-CsrukCE-.mjs → OpenApiTsGenerator-MtnMQL_g.mjs} +2 -2
- package/dist/{OpenApiTsGenerator-CsrukCE-.mjs.map → OpenApiTsGenerator-MtnMQL_g.mjs.map} +1 -1
- package/dist/{OpenApiTsGenerator-FNhY7Ssz.cjs → OpenApiTsGenerator-t3_E98Fi.cjs} +2 -2
- package/dist/{OpenApiTsGenerator-FNhY7Ssz.cjs.map → OpenApiTsGenerator-t3_E98Fi.cjs.map} +1 -1
- package/dist/{S3StateStore-D19JSGE9.mjs → S3StateStore-BC4Jm3Tw.mjs} +2 -2
- package/dist/{S3StateStore-D19JSGE9.mjs.map → S3StateStore-BC4Jm3Tw.mjs.map} +1 -1
- package/dist/{S3StateStore-BEdsjjP4.cjs → S3StateStore-BeArp0aF.cjs} +2 -2
- package/dist/{S3StateStore-BEdsjjP4.cjs.map → S3StateStore-BeArp0aF.cjs.map} +1 -1
- package/dist/{SSMStateStore-7xKw0Zz9.mjs → SSMStateStore-Crl76aYZ.mjs} +2 -2
- package/dist/{SSMStateStore-7xKw0Zz9.mjs.map → SSMStateStore-Crl76aYZ.mjs.map} +1 -1
- package/dist/{SSMStateStore--2bcxoiH.cjs → SSMStateStore-DcstR6cW.cjs} +2 -2
- package/dist/{SSMStateStore--2bcxoiH.cjs.map → SSMStateStore-DcstR6cW.cjs.map} +1 -1
- package/dist/{SubscriberGenerator-C8CPxrCK.cjs → SubscriberGenerator-C3QTae-R.cjs} +237 -54
- package/dist/SubscriberGenerator-C3QTae-R.cjs.map +1 -0
- package/dist/{SubscriberGenerator-y3pncae_.mjs → SubscriberGenerator-COAVPgM-.mjs} +227 -56
- package/dist/SubscriberGenerator-COAVPgM-.mjs.map +1 -0
- package/dist/{add-DlFUKdjX.cjs → add-BFjb6mMq.cjs} +7 -7
- package/dist/{add-DlFUKdjX.cjs.map → add-BFjb6mMq.cjs.map} +1 -1
- package/dist/{add-Bu6FkaTn.mjs → add-CIjmgzkb.mjs} +6 -6
- package/dist/{add-Bu6FkaTn.mjs.map → add-CIjmgzkb.mjs.map} +1 -1
- package/dist/{bundler-Bg0lPDoi.cjs → bundler-CiUoIsku.cjs} +5 -5
- package/dist/{bundler-Bg0lPDoi.cjs.map → bundler-CiUoIsku.cjs.map} +1 -1
- package/dist/{bundler-CgE5XTyr.mjs → bundler-D6KFNpQk.mjs} +5 -5
- package/dist/{bundler-CgE5XTyr.mjs.map → bundler-D6KFNpQk.mjs.map} +1 -1
- package/dist/{cli-z5S3bHyK.mjs → cli-DNtSTtMc.mjs} +4 -4
- package/dist/{cli-z5S3bHyK.mjs.map → cli-DNtSTtMc.mjs.map} +1 -1
- package/dist/{cli-Cvjlnpon.cjs → cli-r4eUr98C.cjs} +4 -4
- package/dist/{cli-Cvjlnpon.cjs.map → cli-r4eUr98C.cjs.map} +1 -1
- package/dist/{compose-bKLAtHLj.cjs → compose-BfXXWJSp.cjs} +362 -59
- package/dist/compose-BfXXWJSp.cjs.map +1 -0
- package/dist/{compose-CgBPA44v.mjs → compose-DJvvmF3X.mjs} +336 -33
- package/dist/compose-DJvvmF3X.mjs.map +1 -0
- package/dist/{config-D48erO2j.d.mts → config-IgK6YaGp.d.cts} +3 -4
- package/dist/config-IgK6YaGp.d.cts.map +1 -0
- package/dist/{config-DHDtsQrB.d.cts → config-kE-p5hxq.d.mts} +3 -4
- package/dist/config-kE-p5hxq.d.mts.map +1 -0
- package/dist/config.cjs +2 -2
- package/dist/config.d.cts +3 -3
- package/dist/config.d.mts +3 -3
- package/dist/config.mjs +2 -2
- package/dist/{credentialSchemas-B67WJOOm.cjs → credentialSchemas-AhIBuQxQ.cjs} +2 -2
- package/dist/{credentialSchemas-B67WJOOm.cjs.map → credentialSchemas-AhIBuQxQ.cjs.map} +1 -1
- package/dist/{credentialSchemas-DDOLRCLF.mjs → credentialSchemas-DLKbxYBy.mjs} +2 -2
- package/dist/{credentialSchemas-DDOLRCLF.mjs.map → credentialSchemas-DLKbxYBy.mjs.map} +1 -1
- package/dist/{credentials-Zqr3QQYB.cjs → credentials-D7XJypNd.cjs} +173 -3
- package/dist/credentials-D7XJypNd.cjs.map +1 -0
- package/dist/{credentials-B5N5yKk6.mjs → credentials-DpfnUvIR.mjs} +132 -4
- package/dist/credentials-DpfnUvIR.mjs.map +1 -0
- package/dist/deploy/public.cjs +16 -17
- package/dist/deploy/public.cjs.map +1 -1
- package/dist/deploy/public.d.cts +3 -5
- package/dist/deploy/public.d.cts.map +1 -1
- package/dist/deploy/public.d.mts +3 -5
- package/dist/deploy/public.d.mts.map +1 -1
- package/dist/deploy/public.mjs +11 -12
- package/dist/deploy/public.mjs.map +1 -1
- package/dist/{deploy-CI85F6dr.cjs → deploy-BbI1UMh3.cjs} +477 -156
- package/dist/deploy-BbI1UMh3.cjs.map +1 -0
- package/dist/{deploy-Ddy8UBoE.mjs → deploy-CiRYwFmr.mjs} +456 -117
- package/dist/deploy-CiRYwFmr.mjs.map +1 -0
- package/dist/{discover-C5roJuc9.mjs → discover-BvJOVsYG.mjs} +66 -14
- package/dist/discover-BvJOVsYG.mjs.map +1 -0
- package/dist/{discover-DozUKs8f.cjs → discover-ojkcbxHw.cjs} +88 -12
- package/dist/discover-ojkcbxHw.cjs.map +1 -0
- package/dist/{dokploy-CiozgdKO.cjs → dokploy-C0aQrCgs.cjs} +2 -2
- package/dist/{dokploy-CiozgdKO.cjs.map → dokploy-C0aQrCgs.cjs.map} +1 -1
- package/dist/{dokploy-Boj1NSHV.mjs → dokploy-MM7c3IE0.mjs} +2 -2
- package/dist/{dokploy-Boj1NSHV.mjs.map → dokploy-MM7c3IE0.mjs.map} +1 -1
- package/dist/{drivers-DbjiYpW6.cjs → drivers-CQ32PB5w.cjs} +2 -2
- package/dist/{drivers-DbjiYpW6.cjs.map → drivers-CQ32PB5w.cjs.map} +1 -1
- package/dist/{drivers-BjGDYfnC.mjs → drivers-Chb5Akov.mjs} +2 -2
- package/dist/{drivers-BjGDYfnC.mjs.map → drivers-Chb5Akov.mjs.map} +1 -1
- package/dist/{eas-DCg41jKK.mjs → eas-1Ee6kql0.mjs} +2 -2
- package/dist/{eas-DCg41jKK.mjs.map → eas-1Ee6kql0.mjs.map} +1 -1
- package/dist/{eas-BmBjIFf_.cjs → eas-CJoys9yh.cjs} +2 -2
- package/dist/{eas-BmBjIFf_.cjs.map → eas-CJoys9yh.cjs.map} +1 -1
- package/dist/{emit-C1e8qD08.mjs → emit-CNpuV_6Q.mjs} +17 -1
- package/dist/emit-CNpuV_6Q.mjs.map +1 -0
- package/dist/{emit-Dmc1nvdS.cjs → emit-qvHxMV9b.cjs} +17 -1
- package/dist/emit-qvHxMV9b.cjs.map +1 -0
- package/dist/{encryption-QOQbGXgV.mjs → encryption-B8Bk1Mvu.mjs} +3 -3
- package/dist/{encryption-QOQbGXgV.mjs.map → encryption-B8Bk1Mvu.mjs.map} +1 -1
- package/dist/{encryption-CwLWV2ig.cjs → encryption-Bo9VlRnl.cjs} +3 -3
- package/dist/{encryption-CwLWV2ig.cjs.map → encryption-Bo9VlRnl.cjs.map} +1 -1
- package/dist/{engine-HVqo3mQu.mjs → engine-BuinpJfS.mjs} +7 -8
- package/dist/{engine-HVqo3mQu.mjs.map → engine-BuinpJfS.mjs.map} +1 -1
- package/dist/{engine-D7YNY3v7.cjs → engine-esxTxcIx.cjs} +10 -11
- package/dist/{engine-D7YNY3v7.cjs.map → engine-esxTxcIx.cjs.map} +1 -1
- package/dist/{github-CO8W9SDs.cjs → github-BEA4K3_X.cjs} +80 -47
- package/dist/github-BEA4K3_X.cjs.map +1 -0
- package/dist/{github-CQt3xc3o.mjs → github-BUlKJfOV.mjs} +78 -45
- package/dist/github-BUlKJfOV.mjs.map +1 -0
- package/dist/{googlePlay-Cfu17aEp.mjs → googlePlay-CK05QiTq.mjs} +4 -4
- package/dist/{googlePlay-Cfu17aEp.mjs.map → googlePlay-CK05QiTq.mjs.map} +1 -1
- package/dist/{googlePlay-DSuF6jbF.cjs → googlePlay-CiqAS2ma.cjs} +5 -5
- package/dist/{googlePlay-DSuF6jbF.cjs.map → googlePlay-CiqAS2ma.cjs.map} +1 -1
- package/dist/{index-8OfpOtSI.d.cts → index-4CO0HD27.d.cts} +2 -2
- package/dist/{index-8OfpOtSI.d.cts.map → index-4CO0HD27.d.cts.map} +1 -1
- package/dist/{index-Dpji6Bxq.d.mts → index-DhUf0B0m.d.mts} +2 -2
- package/dist/{index-Dpji6Bxq.d.mts.map → index-DhUf0B0m.d.mts.map} +1 -1
- package/dist/index.cjs +81 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +64 -65
- package/dist/index.mjs.map +1 -1
- package/dist/{local-BwC2v2Y8.mjs → local-B7Zv1NoA.mjs} +2 -2
- package/dist/{local-BwC2v2Y8.mjs.map → local-B7Zv1NoA.mjs.map} +1 -1
- package/dist/{local-DNhnkugT.cjs → local-OPC9BCZt.cjs} +3 -3
- package/dist/{local-DNhnkugT.cjs.map → local-OPC9BCZt.cjs.map} +1 -1
- package/dist/{migrate-CGkir5LM.mjs → migrate-BzCHT9qs.mjs} +3 -3
- package/dist/{migrate-CGkir5LM.mjs.map → migrate-BzCHT9qs.mjs.map} +1 -1
- package/dist/{migrate-CXsMaHbb.cjs → migrate-C-hmbjpG.cjs} +3 -3
- package/dist/{migrate-CXsMaHbb.cjs.map → migrate-C-hmbjpG.cjs.map} +1 -1
- package/dist/{migrate-Bkz8BGaZ.mjs → migrate-CnbvrVag.mjs} +4 -4
- package/dist/{migrate-Bkz8BGaZ.mjs.map → migrate-CnbvrVag.mjs.map} +1 -1
- package/dist/{migrate-dbAI2XF8.cjs → migrate-DeQJBexh.cjs} +4 -4
- package/dist/{migrate-dbAI2XF8.cjs.map → migrate-DeQJBexh.cjs.map} +1 -1
- package/dist/openapi.cjs +3 -3
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/openapi.mjs +3 -3
- package/dist/{publish-eUcWvSdP.mjs → publish-BISBrrqR.mjs} +2 -2
- package/dist/{publish-eUcWvSdP.mjs.map → publish-BISBrrqR.mjs.map} +1 -1
- package/dist/{publish-Bbd-2PI2.cjs → publish-DtSIB-hZ.cjs} +2 -2
- package/dist/{publish-Bbd-2PI2.cjs.map → publish-DtSIB-hZ.cjs.map} +1 -1
- package/dist/{ready-BOfogqzr.mjs → ready-DqsyadOs.mjs} +6 -6
- package/dist/{ready-BOfogqzr.mjs.map → ready-DqsyadOs.mjs.map} +1 -1
- package/dist/{ready-BFFP838V.cjs → ready-IVGu-q18.cjs} +6 -6
- package/dist/{ready-BFFP838V.cjs.map → ready-IVGu-q18.cjs.map} +1 -1
- package/dist/reconcile/public.cjs +2 -2
- package/dist/reconcile/public.d.cts +1 -2
- package/dist/reconcile/public.d.cts.map +1 -1
- package/dist/reconcile/public.d.mts +1 -2
- package/dist/reconcile/public.d.mts.map +1 -1
- package/dist/reconcile/public.mjs +2 -2
- package/dist/{resolve-DSilYpzm.mjs → resolve-BT7fkPN5.mjs} +4 -4
- package/dist/{resolve-DSilYpzm.mjs.map → resolve-BT7fkPN5.mjs.map} +1 -1
- package/dist/{resolve-CyprRcQo.cjs → resolve-C7GKQcE4.cjs} +4 -4
- package/dist/{resolve-CyprRcQo.cjs.map → resolve-C7GKQcE4.cjs.map} +1 -1
- package/dist/{rollback-DfwsnwGO.cjs → rollback-BEiB-Pje.cjs} +7 -7
- package/dist/{rollback-DfwsnwGO.cjs.map → rollback-BEiB-Pje.cjs.map} +1 -1
- package/dist/{rollback-C4ri3h7i.mjs → rollback-DbP0KuDw.mjs} +7 -7
- package/dist/{rollback-C4ri3h7i.mjs.map → rollback-DbP0KuDw.mjs.map} +1 -1
- package/dist/{runtime-ACdfK59n.d.cts → runtime-BFJQNqwd.d.mts} +2 -2
- package/dist/{runtime-ACdfK59n.d.cts.map → runtime-BFJQNqwd.d.mts.map} +1 -1
- package/dist/{runtime-YyQuekxi.d.mts → runtime-BJO-FFef.d.cts} +2 -2
- package/dist/{runtime-YyQuekxi.d.mts.map → runtime-BJO-FFef.d.cts.map} +1 -1
- package/dist/{s3-DQXZdmCM.mjs → s3-B4FTQQkV.mjs} +2 -2
- package/dist/{s3-DQXZdmCM.mjs.map → s3-B4FTQQkV.mjs.map} +1 -1
- package/dist/{s3-CrPoA89T.cjs → s3-DwKLXwUT.cjs} +2 -2
- package/dist/{s3-CrPoA89T.cjs.map → s3-DwKLXwUT.cjs.map} +1 -1
- package/dist/sandbox/credentials-worker.cjs +2 -2
- package/dist/sandbox/credentials-worker.mjs +2 -2
- package/dist/sandbox/discover-worker.cjs +1 -1
- package/dist/sandbox/discover-worker.mjs +1 -1
- package/dist/sandbox/migrate-worker.cjs +1 -1
- package/dist/sandbox/migrate-worker.mjs +1 -1
- package/dist/{seeds-CFG-f24B.cjs → seeds-DOfxmDRO.cjs} +362 -34
- package/dist/seeds-DOfxmDRO.cjs.map +1 -0
- package/dist/{seeds-oY0qDqui.mjs → seeds-rG-Evfz9.mjs} +341 -31
- package/dist/seeds-rG-Evfz9.mjs.map +1 -0
- package/dist/{serverSetup-CQZt0OT6.cjs → serverSetup-CWWVcU6Y.cjs} +6 -6
- package/dist/{serverSetup-CQZt0OT6.cjs.map → serverSetup-CWWVcU6Y.cjs.map} +1 -1
- package/dist/{serverSetup-D8nngcNL.mjs → serverSetup-xGw1fxuZ.mjs} +6 -6
- package/dist/{serverSetup-D8nngcNL.mjs.map → serverSetup-xGw1fxuZ.mjs.map} +1 -1
- package/dist/{sniffer-BAmtXzou.cjs → sniffer-C7O9Pna_.cjs} +9 -9
- package/dist/{sniffer-BAmtXzou.cjs.map → sniffer-C7O9Pna_.cjs.map} +1 -1
- package/dist/{sniffer-Cgx608Tl.mjs → sniffer-DVPgfyHr.mjs} +9 -9
- package/dist/{sniffer-Cgx608Tl.mjs.map → sniffer-DVPgfyHr.mjs.map} +1 -1
- package/dist/{dns-CfEZHt7r.cjs → snsSubscriptions-CSkteK2J.cjs} +520 -3
- package/dist/snsSubscriptions-CSkteK2J.cjs.map +1 -0
- package/dist/{dns-BgxvvcQa.mjs → snsSubscriptions-CvBIGGp0.mjs} +431 -6
- package/dist/snsSubscriptions-CvBIGGp0.mjs.map +1 -0
- package/dist/{sst-C1pxbFEd.mjs → sst-CTqZZl1_.mjs} +3 -4
- package/dist/{sst-C1pxbFEd.mjs.map → sst-CTqZZl1_.mjs.map} +1 -1
- package/dist/{sst-B-Uz4cvm.cjs → sst-lEkBwzGc.cjs} +4 -5
- package/dist/{sst-B-Uz4cvm.cjs.map → sst-lEkBwzGc.cjs.map} +1 -1
- package/dist/{stage-BKDdQm65.mjs → stage-2EKpzPQ1.mjs} +6 -6
- package/dist/{stage-BKDdQm65.mjs.map → stage-2EKpzPQ1.mjs.map} +1 -1
- package/dist/{stage-CJysBXWB.cjs → stage-fRfFtLwj.cjs} +7 -7
- package/dist/{stage-CJysBXWB.cjs.map → stage-fRfFtLwj.cjs.map} +1 -1
- package/dist/{stages-D4SnG5yl.cjs → stages-B7mCWI_R.cjs} +2 -2
- package/dist/{stages-D4SnG5yl.cjs.map → stages-B7mCWI_R.cjs.map} +1 -1
- package/dist/{stages-Cb9rqRbN.mjs → stages-DSltTW2d.mjs} +2 -2
- package/dist/{stages-Cb9rqRbN.mjs.map → stages-DSltTW2d.mjs.map} +1 -1
- package/dist/target/public.cjs +1 -1
- package/dist/target/public.d.cts +2 -2
- package/dist/target/public.d.mts +2 -2
- package/dist/target/public.mjs +1 -1
- package/dist/{terminal-CW_dWeTe.mjs → terminal-BAVrDhhN.mjs} +3 -3
- package/dist/{terminal-CW_dWeTe.mjs.map → terminal-BAVrDhhN.mjs.map} +1 -1
- package/dist/{terminal-DJlqcW_U.cjs → terminal-D1aeTkgv.cjs} +3 -3
- package/dist/{terminal-DJlqcW_U.cjs.map → terminal-D1aeTkgv.cjs.map} +1 -1
- package/dist/{types-HqVPddRK.d.mts → types-CFU2uvrz.d.cts} +263 -4
- package/dist/types-CFU2uvrz.d.cts.map +1 -0
- package/dist/{types-B6UXlEkf.d.cts → types-D3BeGucy.d.mts} +262 -5
- package/dist/types-D3BeGucy.d.mts.map +1 -0
- package/dist/vitest.cjs +1 -1
- package/dist/vitest.mjs +1 -1
- package/dist/workspace/index.cjs +1 -1
- package/dist/workspace/index.d.cts +2 -2
- package/dist/workspace/index.d.mts +2 -2
- package/dist/workspace/index.mjs +1 -1
- package/dist/{workspace-BwqQnool.cjs → workspace-C82GLPnf.cjs} +8 -2
- package/dist/workspace-C82GLPnf.cjs.map +1 -0
- package/dist/{workspace-D1QbNd55.mjs → workspace-DUnnVjqC.mjs} +8 -2
- package/dist/workspace-DUnnVjqC.mjs.map +1 -0
- package/package.json +17 -16
- package/dist/SubscriberGenerator-C8CPxrCK.cjs.map +0 -1
- package/dist/SubscriberGenerator-y3pncae_.mjs.map +0 -1
- package/dist/compose-CgBPA44v.mjs.map +0 -1
- package/dist/compose-bKLAtHLj.cjs.map +0 -1
- package/dist/config-D48erO2j.d.mts.map +0 -1
- package/dist/config-DHDtsQrB.d.cts.map +0 -1
- package/dist/credentials-B5N5yKk6.mjs.map +0 -1
- package/dist/credentials-Zqr3QQYB.cjs.map +0 -1
- package/dist/deploy-CI85F6dr.cjs.map +0 -1
- package/dist/deploy-Ddy8UBoE.mjs.map +0 -1
- package/dist/discover-C5roJuc9.mjs.map +0 -1
- package/dist/discover-CSW_BMWa.d.cts +0 -125
- package/dist/discover-CSW_BMWa.d.cts.map +0 -1
- package/dist/discover-DozUKs8f.cjs.map +0 -1
- package/dist/discover-xtT7fgWg.d.mts +0 -125
- package/dist/discover-xtT7fgWg.d.mts.map +0 -1
- package/dist/dns-BgxvvcQa.mjs.map +0 -1
- package/dist/dns-CfEZHt7r.cjs.map +0 -1
- package/dist/emit-C1e8qD08.mjs.map +0 -1
- package/dist/emit-Dmc1nvdS.cjs.map +0 -1
- package/dist/github-CO8W9SDs.cjs.map +0 -1
- package/dist/github-CQt3xc3o.mjs.map +0 -1
- package/dist/run-BJLIerMM.mjs +0 -133
- package/dist/run-BJLIerMM.mjs.map +0 -1
- package/dist/run-fVZ-rLnc.cjs +0 -174
- package/dist/run-fVZ-rLnc.cjs.map +0 -1
- package/dist/sandbox-C4g1eG31.d.mts +0 -104
- package/dist/sandbox-C4g1eG31.d.mts.map +0 -1
- package/dist/sandbox-CdKgQ3XU.d.cts +0 -104
- package/dist/sandbox-CdKgQ3XU.d.cts.map +0 -1
- package/dist/seeds-CFG-f24B.cjs.map +0 -1
- package/dist/seeds-oY0qDqui.mjs.map +0 -1
- package/dist/types-B6UXlEkf.d.cts.map +0 -1
- package/dist/types-HqVPddRK.d.mts.map +0 -1
- package/dist/workspace-BwqQnool.cjs.map +0 -1
- package/dist/workspace-D1QbNd55.mjs.map +0 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-BhDjJH2R.mjs";
|
|
2
2
|
import { t as GkmError } from "./errors-D8Gwp5kU.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import { B as LOGS_PORT, I as otlpTelemetryEnv, L as resolveStageTelemetry, at as certificateFor, ft as SERVER_IPV4_KEY, ht as isReservedStageKey, it as ComposeTlsFileMissing, ot as proxyFor, z as telemetryEnv } from "./workspace-
|
|
5
|
-
import { a as
|
|
3
|
+
import { c as runOutput, s as run } from "./credentials-DpfnUvIR.mjs";
|
|
4
|
+
import { B as LOGS_PORT, I as otlpTelemetryEnv, L as resolveStageTelemetry, at as certificateFor, ft as SERVER_IPV4_KEY, ht as isReservedStageKey, it as ComposeTlsFileMissing, ot as proxyFor, z as telemetryEnv } from "./workspace-DUnnVjqC.mjs";
|
|
5
|
+
import { A as stackBackups, C as siteNames, I as stageBackups, O as backupsRoleStatements, S as siteAuth, T as BACKUPS_SERVICE, a as subscriptionKey, c as HostNotPointingAtServer, d as requiredServerAddress, f as serverAddressHint, g as systemLookup, i as recordedPushSubscriptions, k as backupsService, m as stageDns, n as SUBSCRIPTION_TYPE, o as subscriptionResource, p as stackHosts, r as confirmPendingSubscriptions, s as topicConnection, t as PushSubscriptionsUnconfirmed, u as isLocalHost, w as withSitePasswords, x as passwordSites } from "./snsSubscriptions-CvBIGGp0.mjs";
|
|
6
6
|
import { t as defineTarget } from "./define-6poNqm5O.mjs";
|
|
7
|
-
import { $n as
|
|
7
|
+
import { $n as LOGS_SERVICE, $t as publicBuildValues, An as envFor, B as workerDockerfile, Bn as usesTelemetry, Bt as initStageSecrets, Cn as withGeneratedSecrets, Ct as composeFor, Dn as runsRedis, En as redisService, Gn as DEFAULT_IMAGES, Gt as composeBuildPaths, Hn as watchedBuckets, In as isTelemetryKey, Jn as portKeys, Jt as WORKER_PORT, Kt as imageLayout, L as appDockerfile, Ln as scopeTelemetryEnv, N as stageProviderNotes, Nn as planFor, On as stackRedis, S as recordRelease, Tn as STACK_CACHE, Un as EMULATOR_ACCESS_KEY_ID, Vn as minioWebhookEnv, Wn as hostFor, Xt as findBuildRoot, Zn as primaryPortKey, a as dnsResources, an as applyPolicies, ar as isMainFrontendApp, at as suppliedOnly, bt as bucketClient, c as currentActor, cn as bucketPolicies, ct as networkEnv, d as DeployJournal, er as logsAccess, et as devServicesUsed, ft as constructGlobs, gn as postgresSuperuser, in as applyNotifications, ir as NoDomainForStage, it as stageServiceDeclarations, jn as localRolePassword, kn as withRedisPassword, lt as workerEnvKeys, mn as loadLocalCredentials, n as reportDatabaseRuns, nn as applyBuckets, nr as stackLogs, o as forgetDnsResource, on as applyPostgres, or as resolveHost, ot as appEnvKeys, pn as LOCAL_RABBITMQ_USER, q as validateImageRef, qt as TURBO_VERSION, r as reportPlannedSeeds, rn as applyLifecycles, rr as withLogsPassword, s as recordDnsChanges, sn as bucketLifecycles, t as DeploySeedsFailed, tn as workerUnits, tr as logsService, tt as externalServices, un as postgresStatements, v as createComposeState, vt as LEGACY_LOCAL_LOGIN, wn as REDIS_SERVICE, xt as pgClient, yt as ensurePostgresLogin, z as ensureDockerignore, zn as telemetryOf } from "./seeds-rG-Evfz9.mjs";
|
|
8
8
|
import { t as appKey } from "./derive-B4vDpzgP.mjs";
|
|
9
|
-
import {
|
|
9
|
+
import { a as SNS_SUBSCRIPTIONS_KEY, l as DEFAULT_EVENTS, o as objectsRoute, s as subscriberRoute } from "./SubscriberGenerator-COAVPgM-.mjs";
|
|
10
10
|
import { a as imageRef } from "./identity-CBXr4wNi.mjs";
|
|
11
|
-
import { i as discover } from "./discover-
|
|
12
|
-
import { i as installedFrom } from "./drivers-
|
|
11
|
+
import { i as discover } from "./discover-BvJOVsYG.mjs";
|
|
12
|
+
import { i as installedFrom } from "./drivers-Chb5Akov.mjs";
|
|
13
13
|
import { f as plannedSeeds, o as SeedFailed, p as seedDatabases, u as migrateDatabases } from "./databases-BPOgTn1u.mjs";
|
|
14
14
|
import { dirname, join } from "node:path";
|
|
15
15
|
import { existsSync } from "node:fs";
|
|
@@ -684,7 +684,7 @@ function edgeCaddyfile(routes, options) {
|
|
|
684
684
|
` : tls.kind === "files" ? `
|
|
685
685
|
tls ${tls.certFile} ${tls.keyFile}
|
|
686
686
|
` : "";
|
|
687
|
-
const blocks = routes.map(({ host, upstreams, prefix, allow, paths, streaming }) => `https://${host} {${certificate}
|
|
687
|
+
const blocks = routes.map(({ host, upstreams, prefix, allow, auth, paths, streaming }) => `https://${host} {${certificate}
|
|
688
688
|
# gkm's own header, which only a service of this stack may send: the auth
|
|
689
689
|
# server rate-limits by the client address it carries.
|
|
690
690
|
request_header -${CLIENT_IP_HEADER}
|
|
@@ -693,6 +693,11 @@ ${allow ? `
|
|
|
693
693
|
# could set. Everything else is refused before it reaches the upstream.
|
|
694
694
|
@denied not remote_ip ${allow.join(" ")}
|
|
695
695
|
respond @denied 403
|
|
696
|
+
` : ""}${auth ? `
|
|
697
|
+
# The stage's login, asked for before anything reaches the upstream.
|
|
698
|
+
basic_auth {
|
|
699
|
+
${auth.user} ${auth.hash}
|
|
700
|
+
}
|
|
696
701
|
` : ""}${paths ? `
|
|
697
702
|
# Only these paths answer. Everything else on this host is refused before
|
|
698
703
|
# it reaches the upstream.
|
|
@@ -720,7 +725,8 @@ const HEADER = `# Generated by gkm compose from the construct manifest — do no
|
|
|
720
725
|
# One host per API and site, each in front of its own container, one per
|
|
721
726
|
# file server in front of the stack's MinIO, one per worker SNS pushes to,
|
|
722
727
|
# answering only those routes, and — when its logs are served publicly — one
|
|
723
|
-
# for OpenObserve, to the addresses it allows.
|
|
728
|
+
# for OpenObserve, to the addresses it allows. A site the stage puts behind a
|
|
729
|
+
# password asks for its login first.
|
|
724
730
|
`;
|
|
725
731
|
//#endregion
|
|
726
732
|
//#region src/compose/images.ts
|
|
@@ -1015,6 +1021,10 @@ function traefikDynamic(routes, options) {
|
|
|
1015
1021
|
middlewares[name(route, "allow")] = { ipAllowList: { sourceRange: [...route.allow] } };
|
|
1016
1022
|
chain.push(name(route, "allow"));
|
|
1017
1023
|
}
|
|
1024
|
+
if (route.auth) {
|
|
1025
|
+
middlewares[name(route, "auth")] = { basicAuth: { users: [`${route.auth.user}:${route.auth.hash}`] } };
|
|
1026
|
+
chain.push(name(route, "auth"));
|
|
1027
|
+
}
|
|
1018
1028
|
if (route.prefix) {
|
|
1019
1029
|
middlewares[name(route, "prefix")] = { addPrefix: { prefix: route.prefix } };
|
|
1020
1030
|
chain.push(name(route, "prefix"));
|
|
@@ -1433,9 +1443,20 @@ function composeStack(input) {
|
|
|
1433
1443
|
...credential.containers.minio,
|
|
1434
1444
|
buckets,
|
|
1435
1445
|
policies: bucketPolicies(plan).filter((p) => buckets.includes(p.bucket)),
|
|
1446
|
+
objects: services.minio.map((id) => ({
|
|
1447
|
+
id,
|
|
1448
|
+
name: byId.get(id)?.name
|
|
1449
|
+
})).filter((b) => Boolean(b.name)).sort((a, b) => a.name.localeCompare(b.name)),
|
|
1450
|
+
webhooks: [],
|
|
1436
1451
|
lifecycles: bucketLifecycles(plan).filter((l) => buckets.includes(l.bucket))
|
|
1437
1452
|
};
|
|
1438
1453
|
})() : void 0;
|
|
1454
|
+
const bucketEventKeys = /* @__PURE__ */ new Map();
|
|
1455
|
+
for (const resource of plan.resources) {
|
|
1456
|
+
if (resource.kind !== "objects") continue;
|
|
1457
|
+
bucketEventKeys.set(provideKey(resource.id, "eventsConnectionString"), resource.id);
|
|
1458
|
+
bucketEventKeys.set(provideKey(resource.id, "eventsToken"), resource.id);
|
|
1459
|
+
}
|
|
1439
1460
|
const fileServers = /* @__PURE__ */ new Map();
|
|
1440
1461
|
if (storage) for (const resource of plan.resources) {
|
|
1441
1462
|
if (resource.kind !== "file-server" || !resource.of) continue;
|
|
@@ -1480,7 +1501,8 @@ function composeStack(input) {
|
|
|
1480
1501
|
project: workspace.name,
|
|
1481
1502
|
credentials: credential.containers,
|
|
1482
1503
|
seed: credential.seed,
|
|
1483
|
-
...!local && domain ? { mailFrom: `noreply@${domain}` } : {}
|
|
1504
|
+
...!local && domain ? { mailFrom: `noreply@${domain}` } : {},
|
|
1505
|
+
relayedBuckets: [...watchedBuckets(manifest, input.subscribers ?? {}).keys()].filter((bucket) => services.minio.includes(bucket))
|
|
1484
1506
|
};
|
|
1485
1507
|
const outside = networkEnv(plan, {
|
|
1486
1508
|
...derivation,
|
|
@@ -1498,6 +1520,11 @@ function composeStack(input) {
|
|
|
1498
1520
|
*/
|
|
1499
1521
|
const valueFor = (app, key, owner) => {
|
|
1500
1522
|
if (isReservedStageKey(key)) return void 0;
|
|
1523
|
+
const watching = bucketEventKeys.get(key);
|
|
1524
|
+
if (watching) {
|
|
1525
|
+
if (custom[key] !== void 0) return custom[key];
|
|
1526
|
+
return services.minio.includes(watching) ? outside[key] : void 0;
|
|
1527
|
+
}
|
|
1501
1528
|
if (!local && owner?.kind === "email" && key.endsWith("_INBOX_URL")) return;
|
|
1502
1529
|
if (owner && SERVICE_KINDS[owner.kind]) {
|
|
1503
1530
|
if (custom[key] !== void 0) return custom[key];
|
|
@@ -1599,13 +1626,28 @@ function composeStack(input) {
|
|
|
1599
1626
|
serviceName: worker.name,
|
|
1600
1627
|
...telemetryValues ? { telemetry: telemetryValues } : {}
|
|
1601
1628
|
}),
|
|
1602
|
-
...push ? { [
|
|
1629
|
+
...push && !input.recordingSubscriptions ? { [SNS_SUBSCRIPTIONS_KEY]: recordedSubscriptions(worker, push, input.pushSubscriptions?.[worker.id]) } : {},
|
|
1603
1630
|
NODE_ENV: "production",
|
|
1604
1631
|
PORT: String(worker.port),
|
|
1605
1632
|
STAGE: stage
|
|
1606
1633
|
};
|
|
1607
1634
|
for (const [key, value] of Object.entries(worker.env)) if (/[\r\n]/.test(value)) throw new EnvValueMultiline(worker.name, key);
|
|
1608
1635
|
}
|
|
1636
|
+
if (storage && !input.buildOnly) {
|
|
1637
|
+
const watched = watchedBuckets(manifest, input.subscribers ?? {});
|
|
1638
|
+
for (const [bucket, workerId] of watched) {
|
|
1639
|
+
if (!services.minio.includes(bucket)) continue;
|
|
1640
|
+
const worker = workers.find((w) => w.id === workerId);
|
|
1641
|
+
const relay = worker?.env?.[provideKey(bucket, "eventsConnectionString")];
|
|
1642
|
+
const token = worker?.env?.[provideKey(bucket, "eventsToken")];
|
|
1643
|
+
if (!worker || !relay || relay.startsWith("sns:") || !token) continue;
|
|
1644
|
+
storage.webhooks.push({
|
|
1645
|
+
bucket,
|
|
1646
|
+
endpoint: `http://${hostOf(worker.name)}:${worker.port}${objectsRoute(bucket)}`,
|
|
1647
|
+
token
|
|
1648
|
+
});
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1609
1651
|
const deployedTls = certificate ? {
|
|
1610
1652
|
kind: "files",
|
|
1611
1653
|
...proxy === "caddy" ? {
|
|
@@ -1647,6 +1689,11 @@ function composeStack(input) {
|
|
|
1647
1689
|
proxy,
|
|
1648
1690
|
edge: new Map([...edgeServices].map((service) => [service, hostOf(service)]))
|
|
1649
1691
|
});
|
|
1692
|
+
if (!local) {
|
|
1693
|
+
const sites = apps.filter((app) => app.kind === "site");
|
|
1694
|
+
const chosen = passwordSites(workspace, stage, sites.map((app) => app.name));
|
|
1695
|
+
for (const app of sites) if (chosen.includes(app.name)) app.auth = siteAuth(stage, app.name, custom);
|
|
1696
|
+
}
|
|
1650
1697
|
const routes = [
|
|
1651
1698
|
...apps.map((app) => ({
|
|
1652
1699
|
name: app.name,
|
|
@@ -1656,6 +1703,10 @@ function composeStack(input) {
|
|
|
1656
1703
|
port: app.port
|
|
1657
1704
|
}],
|
|
1658
1705
|
streaming: true,
|
|
1706
|
+
...app.auth ? { auth: {
|
|
1707
|
+
user: app.auth.user,
|
|
1708
|
+
hash: app.auth.hash
|
|
1709
|
+
} } : {},
|
|
1659
1710
|
health: app.kind === "site" ? "/" : "/health"
|
|
1660
1711
|
})),
|
|
1661
1712
|
...[...fileServers.values()].map(({ route }) => route),
|
|
@@ -1776,29 +1827,61 @@ function stackApps(workspace, manifest, plan, options) {
|
|
|
1776
1827
|
}
|
|
1777
1828
|
return apps.sort((a, b) => a.name.localeCompare(b.name));
|
|
1778
1829
|
}
|
|
1779
|
-
/** What the worker reads the public base of its push routes from. */
|
|
1780
|
-
const SUBSCRIBER_PUSH_URL_KEY = "GKM_SUBSCRIBER_PUSH_URL";
|
|
1781
1830
|
/**
|
|
1782
1831
|
* Where SNS pushes to a worker on a deployed stage, or nothing when it pushes
|
|
1783
1832
|
* to none of its subscribers.
|
|
1784
1833
|
*
|
|
1785
|
-
* A subscriber is pushed to when
|
|
1786
|
-
*
|
|
1834
|
+
* A subscriber is pushed to when the connection string its deliveries come
|
|
1835
|
+
* from — its topic's, or its bucket's events — as this stage resolved it for
|
|
1836
|
+
* the worker, is an SNS one — the same test the worker's own
|
|
1787
1837
|
* startup makes, so the edge exposes a route exactly when the worker mounts
|
|
1788
1838
|
* it. Each such route, and nothing else the worker serves, answers on
|
|
1789
1839
|
* `<worker>.<domain>`.
|
|
1790
1840
|
*/
|
|
1791
1841
|
function workerPush(worker, subscribers, env, options) {
|
|
1792
|
-
const
|
|
1793
|
-
if (
|
|
1842
|
+
const pushed = subscribers.filter(({ connectionKey }) => env[connectionKey]?.startsWith("sns:")).filter((subscriber, index, all) => all.findIndex((s) => s.name === subscriber.name) === index).sort((a, b) => a.name.localeCompare(b.name));
|
|
1843
|
+
if (pushed.length === 0) return void 0;
|
|
1794
1844
|
if (!options.domain) throw new NoDomainForStage(options.stage);
|
|
1795
1845
|
const host = `${worker.name}.${options.domain}`;
|
|
1846
|
+
const url = `https://${host}`;
|
|
1796
1847
|
return {
|
|
1797
1848
|
host,
|
|
1798
|
-
url
|
|
1799
|
-
paths:
|
|
1849
|
+
url,
|
|
1850
|
+
paths: pushed.map(({ name }) => subscriberRoute(name)),
|
|
1851
|
+
subscribers: pushed.map(({ name, connectionKey, events }) => ({
|
|
1852
|
+
name,
|
|
1853
|
+
connectionKey,
|
|
1854
|
+
endpoint: `${url}${subscriberRoute(name)}`,
|
|
1855
|
+
...events ? { events } : {}
|
|
1856
|
+
}))
|
|
1800
1857
|
};
|
|
1801
1858
|
}
|
|
1859
|
+
/** A pushed subscriber the deploy recorded no SNS subscription for. */
|
|
1860
|
+
var PushSubscriptionMissing = class extends GkmError {
|
|
1861
|
+
worker;
|
|
1862
|
+
subscriber;
|
|
1863
|
+
constructor(worker, subscriber) {
|
|
1864
|
+
super(`SNS pushes to '${subscriber}' on the worker '${worker}', and the deploy recorded no subscription for it, so the worker would mount no route and SNS would deliver nowhere. Deploy the stage, which subscribes each pushed subscriber and records its ARN.`);
|
|
1865
|
+
this.worker = worker;
|
|
1866
|
+
this.subscriber = subscriber;
|
|
1867
|
+
this.name = "PushSubscriptionMissing";
|
|
1868
|
+
}
|
|
1869
|
+
};
|
|
1870
|
+
/**
|
|
1871
|
+
* The worker's `GKM_SNS_SUBSCRIPTIONS`: each pushed subscriber's recorded
|
|
1872
|
+
* subscription ARN, and nothing for a subscriber it does not run.
|
|
1873
|
+
*
|
|
1874
|
+
* @throws {PushSubscriptionMissing} when one has none
|
|
1875
|
+
*/
|
|
1876
|
+
function recordedSubscriptions(worker, push, recorded = {}) {
|
|
1877
|
+
const arns = {};
|
|
1878
|
+
for (const { name } of push.subscribers) {
|
|
1879
|
+
const arn = recorded[name];
|
|
1880
|
+
if (!arn) throw new PushSubscriptionMissing(worker.name, name);
|
|
1881
|
+
arns[name] = arn;
|
|
1882
|
+
}
|
|
1883
|
+
return JSON.stringify(arns);
|
|
1884
|
+
}
|
|
1802
1885
|
/** Two constructs the edge would answer on one host. */
|
|
1803
1886
|
var EdgeHostTaken = class extends GkmError {
|
|
1804
1887
|
host;
|
|
@@ -1878,7 +1961,8 @@ function stackFile(options) {
|
|
|
1878
1961
|
minio.environment = {
|
|
1879
1962
|
...minio.environment,
|
|
1880
1963
|
MINIO_ROOT_USER: options.storage.user,
|
|
1881
|
-
MINIO_ROOT_PASSWORD: options.storage.password
|
|
1964
|
+
MINIO_ROOT_PASSWORD: options.storage.password,
|
|
1965
|
+
...minioWebhookEnv(options.storage.webhooks)
|
|
1882
1966
|
};
|
|
1883
1967
|
minio.ports = ["127.0.0.1::9000"];
|
|
1884
1968
|
}
|
|
@@ -2166,12 +2250,14 @@ function deployedStackSecrets(workspace, stage, stored, manifest) {
|
|
|
2166
2250
|
secrets: withLogs.secrets,
|
|
2167
2251
|
generated: []
|
|
2168
2252
|
};
|
|
2253
|
+
const withSites = withSitePasswords(withRedis.secrets, passwordSites(workspace, stage, siteNames(manifest)));
|
|
2169
2254
|
return {
|
|
2170
|
-
secrets:
|
|
2255
|
+
secrets: withSites.secrets,
|
|
2171
2256
|
generated: [
|
|
2172
2257
|
...withSeed.generated,
|
|
2173
2258
|
...withLogs.generated,
|
|
2174
|
-
...withRedis.generated
|
|
2259
|
+
...withRedis.generated,
|
|
2260
|
+
...withSites.generated
|
|
2175
2261
|
]
|
|
2176
2262
|
};
|
|
2177
2263
|
}
|
|
@@ -2199,7 +2285,7 @@ var HealthRequestTimedOut = class extends GkmError {
|
|
|
2199
2285
|
}
|
|
2200
2286
|
};
|
|
2201
2287
|
/** The real probe: one HTTPS GET, the certificate verified. */
|
|
2202
|
-
const httpsProbe = ({ url, ca, connectTo, connectPort, timeoutMs, signal }) => {
|
|
2288
|
+
const httpsProbe = ({ url, ca, connectTo, connectPort, authorization, timeoutMs, signal }) => {
|
|
2203
2289
|
const target = new URL(url);
|
|
2204
2290
|
return new Promise((resolve, reject) => {
|
|
2205
2291
|
const req = request({
|
|
@@ -2208,7 +2294,10 @@ const httpsProbe = ({ url, ca, connectTo, connectPort, timeoutMs, signal }) => {
|
|
|
2208
2294
|
servername: target.hostname,
|
|
2209
2295
|
path: `${target.pathname}${target.search}`,
|
|
2210
2296
|
method: "GET",
|
|
2211
|
-
headers: {
|
|
2297
|
+
headers: {
|
|
2298
|
+
host: target.host,
|
|
2299
|
+
...authorization ? { authorization } : {}
|
|
2300
|
+
},
|
|
2212
2301
|
...ca ? { ca } : {},
|
|
2213
2302
|
...signal ? { signal } : {},
|
|
2214
2303
|
timeout: timeoutMs
|
|
@@ -2241,6 +2330,119 @@ var ComposeAppsUnhealthy = class extends GkmError {
|
|
|
2241
2330
|
}
|
|
2242
2331
|
};
|
|
2243
2332
|
//#endregion
|
|
2333
|
+
//#region src/target/compose/topicSubscriptions.ts
|
|
2334
|
+
/**
|
|
2335
|
+
* Every topic subscriber the stack pushes to: a subscriber whose connection
|
|
2336
|
+
* key is a topic's publisher string — a bucket's events key is not — and
|
|
2337
|
+
* whose value on this stage is an SNS one.
|
|
2338
|
+
*/
|
|
2339
|
+
function topicPushes(stack, manifest) {
|
|
2340
|
+
const topicKeys = new Set(Object.values(manifest).filter((declaration) => declaration.kind === "topic").map((topic) => provideKey(topic.id, "publisherConnectionString")));
|
|
2341
|
+
const pushes = [];
|
|
2342
|
+
for (const worker of stack.workers) for (const subscriber of worker.push?.subscribers ?? []) {
|
|
2343
|
+
if (!topicKeys.has(subscriber.connectionKey)) continue;
|
|
2344
|
+
const connectionString = worker.env?.[subscriber.connectionKey];
|
|
2345
|
+
if (!connectionString?.startsWith("sns:")) continue;
|
|
2346
|
+
pushes.push({
|
|
2347
|
+
worker: worker.id,
|
|
2348
|
+
name: subscriber.name,
|
|
2349
|
+
endpoint: subscriber.endpoint,
|
|
2350
|
+
connectionKey: subscriber.connectionKey,
|
|
2351
|
+
connectionString,
|
|
2352
|
+
...subscriber.events ? { events: subscriber.events } : {}
|
|
2353
|
+
});
|
|
2354
|
+
}
|
|
2355
|
+
return pushes;
|
|
2356
|
+
}
|
|
2357
|
+
/** The subscriptions recorded for hand-set topics: those with a key. */
|
|
2358
|
+
function recordedTopicSubscriptions(resources) {
|
|
2359
|
+
return Object.values(resources ?? {}).filter((record) => record.type === "sns-subscription" && typeof record.data?.connectionKey === "string");
|
|
2360
|
+
}
|
|
2361
|
+
/**
|
|
2362
|
+
* Converge each hand-set topic's subscriptions on the subscribers pushed to:
|
|
2363
|
+
* subscribe, bring filters up to date, unsubscribe a route on the worker's
|
|
2364
|
+
* host no subscriber wants any more — and record each ARN, forgetting what
|
|
2365
|
+
* was removed.
|
|
2366
|
+
*
|
|
2367
|
+
* @returns each worker's subscriptions, by export — what it is handed
|
|
2368
|
+
*/
|
|
2369
|
+
async function ensureTopicSubscriptions(input) {
|
|
2370
|
+
const { snsUrl, reconcileHttpSubscriptions } = await import("@geekmidas/events/sns");
|
|
2371
|
+
const groups = /* @__PURE__ */ new Map();
|
|
2372
|
+
const group = (topicArn, host, connectionKey) => {
|
|
2373
|
+
const id = `${topicArn}|${host}`;
|
|
2374
|
+
const found = groups.get(id);
|
|
2375
|
+
if (found) return found;
|
|
2376
|
+
const created = {
|
|
2377
|
+
topicArn,
|
|
2378
|
+
host,
|
|
2379
|
+
connectionKey,
|
|
2380
|
+
pushes: [],
|
|
2381
|
+
recorded: []
|
|
2382
|
+
};
|
|
2383
|
+
groups.set(id, created);
|
|
2384
|
+
return created;
|
|
2385
|
+
};
|
|
2386
|
+
for (const push of input.pushes) {
|
|
2387
|
+
const { topicArn } = snsUrl.parse(push.connectionString);
|
|
2388
|
+
const into = group(topicArn, new URL(push.endpoint).host, push.connectionKey);
|
|
2389
|
+
into.connectionString = push.connectionString;
|
|
2390
|
+
into.pushes.push(push);
|
|
2391
|
+
}
|
|
2392
|
+
for (const record of recordedTopicSubscriptions(input.recorded)) group(String(record.data?.topicArn), new URL(String(record.data?.endpoint)).host, String(record.data?.connectionKey)).recorded.push(record);
|
|
2393
|
+
const wanted = new Set(input.pushes.map(({ worker, name }) => subscriptionKey(worker, name)));
|
|
2394
|
+
const arns = {};
|
|
2395
|
+
for (const { topicArn, host, connectionKey, ...members } of groups.values()) {
|
|
2396
|
+
const stale = members.recorded.filter((r) => !wanted.has(r.key));
|
|
2397
|
+
const named = members.connectionString ?? input.secrets[connectionKey];
|
|
2398
|
+
if (!named?.startsWith("sns:")) {
|
|
2399
|
+
for (const record of stale) {
|
|
2400
|
+
input.log(` – forgot ${record.data?.endpoint}: '${connectionKey}' no longer names an SNS topic to unsubscribe it from`);
|
|
2401
|
+
await input.forget(record.key);
|
|
2402
|
+
}
|
|
2403
|
+
continue;
|
|
2404
|
+
}
|
|
2405
|
+
const address = new URL(named);
|
|
2406
|
+
address.searchParams.set("topicArn", topicArn);
|
|
2407
|
+
const connection = await topicConnection({
|
|
2408
|
+
connectionKey,
|
|
2409
|
+
connectionString: address.toString(),
|
|
2410
|
+
stage: input.stage,
|
|
2411
|
+
env: input.env
|
|
2412
|
+
});
|
|
2413
|
+
const result = await reconcileHttpSubscriptions(connection, {
|
|
2414
|
+
endpoints: members.pushes.map((push) => ({
|
|
2415
|
+
name: push.name,
|
|
2416
|
+
endpoint: push.endpoint,
|
|
2417
|
+
...push.events ? { events: push.events } : {}
|
|
2418
|
+
})),
|
|
2419
|
+
ownedHost: host
|
|
2420
|
+
});
|
|
2421
|
+
await connection.close();
|
|
2422
|
+
for (const push of members.pushes) {
|
|
2423
|
+
const arn = result.subscriptions[push.name];
|
|
2424
|
+
const key = subscriptionKey(push.worker, push.name);
|
|
2425
|
+
if (input.recorded?.[key]?.id !== arn) input.log(` ✓ '${push.name}' subscribed to ${topicArn.split(":").pop()} at ${push.endpoint}`);
|
|
2426
|
+
await input.record(subscriptionResource({
|
|
2427
|
+
worker: push.worker,
|
|
2428
|
+
name: push.name,
|
|
2429
|
+
topicArn,
|
|
2430
|
+
endpoint: push.endpoint,
|
|
2431
|
+
connectionKey: push.connectionKey,
|
|
2432
|
+
pending: result.pending.includes(push.name),
|
|
2433
|
+
...push.events ? { events: push.events } : {}
|
|
2434
|
+
}, arn));
|
|
2435
|
+
arns[push.worker] = {
|
|
2436
|
+
...arns[push.worker],
|
|
2437
|
+
[push.name]: arn
|
|
2438
|
+
};
|
|
2439
|
+
}
|
|
2440
|
+
for (const arn of result.removed) input.log(` – unsubscribed ${arn}: no subscriber wants it any more`);
|
|
2441
|
+
for (const record of stale) await input.forget(record.key);
|
|
2442
|
+
}
|
|
2443
|
+
return arns;
|
|
2444
|
+
}
|
|
2445
|
+
//#endregion
|
|
2244
2446
|
//#region src/target/compose/phases.ts
|
|
2245
2447
|
/**
|
|
2246
2448
|
* The compose target's phases: a stage as one Docker Compose stack behind
|
|
@@ -2391,8 +2593,9 @@ async function validateCompose(ctx, deps, options = {}) {
|
|
|
2391
2593
|
subscribers
|
|
2392
2594
|
});
|
|
2393
2595
|
const { secrets, generated } = await stageSecrets(ctx, manifest);
|
|
2596
|
+
const recorded = push ? void 0 : await ctx.state.read(stage);
|
|
2394
2597
|
const layout = mode === "build" ? imageLayout(workspace) : void 0;
|
|
2395
|
-
const
|
|
2598
|
+
const input = {
|
|
2396
2599
|
workspace,
|
|
2397
2600
|
manifest,
|
|
2398
2601
|
runnables,
|
|
@@ -2411,9 +2614,24 @@ async function validateCompose(ctx, deps, options = {}) {
|
|
|
2411
2614
|
ports: edgePorts(deps.env),
|
|
2412
2615
|
...layout ? { layout } : {},
|
|
2413
2616
|
...push ? { buildOnly: true } : {}
|
|
2617
|
+
};
|
|
2618
|
+
const recordedArns = recordedPushSubscriptions(recorded?.resources);
|
|
2619
|
+
const planned = push ? void 0 : composeStack({
|
|
2620
|
+
...input,
|
|
2621
|
+
recordingSubscriptions: true
|
|
2622
|
+
});
|
|
2623
|
+
const pushes = planned ? topicPushes(planned, manifest) : [];
|
|
2624
|
+
const topics = planned && (pushes.length > 0 || recordedTopicSubscriptions(recorded?.resources).length > 0) ? {
|
|
2625
|
+
pushes,
|
|
2626
|
+
recorded: recorded?.resources
|
|
2627
|
+
} : void 0;
|
|
2628
|
+
const composed = topics && planned ? planned : composeStack({
|
|
2629
|
+
...input,
|
|
2630
|
+
pushSubscriptions: recordedArns
|
|
2414
2631
|
});
|
|
2415
2632
|
if (mode === "build") assertRedisClient(workspace, composed, manifest, runnables);
|
|
2416
|
-
const
|
|
2633
|
+
const pinned = (unpinned) => options.pin ? withPinnedImages(unpinned, options.pin.file, options.pin.digests) : unpinned;
|
|
2634
|
+
const stack = pinned(composed);
|
|
2417
2635
|
if (mode === "pull" && !ctx.dryRun) await assertImagesExist(deps.docker, tag, [...stack.apps, ...stack.workers]);
|
|
2418
2636
|
if (stack.redis && !stack.local) ctx.secrets.mask(stack.redis.password);
|
|
2419
2637
|
if (stack.logs && (!stack.local || stack.logs.passwordFromSecrets)) {
|
|
@@ -2431,7 +2649,6 @@ async function validateCompose(ctx, deps, options = {}) {
|
|
|
2431
2649
|
const override = stackOverrideFile(root, stage);
|
|
2432
2650
|
const overrides = existsSync(override) ? [override] : [];
|
|
2433
2651
|
if (overrides.length > 0) ctx.logger.info(`🧩 Merging docker-compose.${stage}.yml over the generated stack`);
|
|
2434
|
-
const recorded = push ? void 0 : await ctx.state.read(stage);
|
|
2435
2652
|
const previous = Object.fromEntries(Object.entries(recorded?.state.releases ?? {}).map(([name, releases]) => {
|
|
2436
2653
|
const { ref, tag, digest } = releases.current;
|
|
2437
2654
|
return [name, {
|
|
@@ -2444,6 +2661,20 @@ async function validateCompose(ctx, deps, options = {}) {
|
|
|
2444
2661
|
mode,
|
|
2445
2662
|
push,
|
|
2446
2663
|
stack,
|
|
2664
|
+
...topics ? { topicSubscriptions: {
|
|
2665
|
+
...topics,
|
|
2666
|
+
restack: (arns) => {
|
|
2667
|
+
const merged = { ...recordedArns };
|
|
2668
|
+
for (const [worker, own] of Object.entries(arns)) merged[worker] = {
|
|
2669
|
+
...merged[worker],
|
|
2670
|
+
...own
|
|
2671
|
+
};
|
|
2672
|
+
return pinned(composeStack({
|
|
2673
|
+
...input,
|
|
2674
|
+
pushSubscriptions: merged
|
|
2675
|
+
}));
|
|
2676
|
+
}
|
|
2677
|
+
} } : {},
|
|
2447
2678
|
...server ? { server } : {},
|
|
2448
2679
|
dir,
|
|
2449
2680
|
ref: {
|
|
@@ -2678,6 +2909,16 @@ async function planCompose(ctx, run) {
|
|
|
2678
2909
|
action: run.previous[worker.name] ? "reuse" : "create"
|
|
2679
2910
|
});
|
|
2680
2911
|
}
|
|
2912
|
+
for (const push of run.topicSubscriptions?.pushes ?? []) {
|
|
2913
|
+
const key = subscriptionKey(push.worker, push.name);
|
|
2914
|
+
const id = run.topicSubscriptions?.recorded?.[key]?.id;
|
|
2915
|
+
planned({
|
|
2916
|
+
key,
|
|
2917
|
+
resourceType: SUBSCRIPTION_TYPE,
|
|
2918
|
+
action: id ? "reuse" : "create",
|
|
2919
|
+
...id ? { id } : {}
|
|
2920
|
+
});
|
|
2921
|
+
}
|
|
2681
2922
|
if (!run.push) planned({
|
|
2682
2923
|
key: run.stack.proxy === "caddy" ? "service:caddy" : `service:${EDGE_PROJECT}/${EDGE_SERVICE}`,
|
|
2683
2924
|
resourceType: "service",
|
|
@@ -2690,7 +2931,7 @@ async function planCompose(ctx, run) {
|
|
|
2690
2931
|
* migrations applied.
|
|
2691
2932
|
*/
|
|
2692
2933
|
async function provisionCompose(ctx, run, deps) {
|
|
2693
|
-
const {
|
|
2934
|
+
const { ref } = run;
|
|
2694
2935
|
if (run.push) return;
|
|
2695
2936
|
if (run.generated.length > 0 && run.secrets) {
|
|
2696
2937
|
await ctx.secrets.write(run.secrets);
|
|
@@ -2698,11 +2939,13 @@ async function provisionCompose(ctx, run, deps) {
|
|
|
2698
2939
|
}
|
|
2699
2940
|
const ports = edgePorts(deps.env);
|
|
2700
2941
|
await assertEdgePorts(deps.docker, {
|
|
2701
|
-
project: stack.project,
|
|
2702
|
-
proxy: stack.proxy,
|
|
2942
|
+
project: run.stack.project,
|
|
2943
|
+
proxy: run.stack.proxy,
|
|
2703
2944
|
ports,
|
|
2704
2945
|
engine: ref
|
|
2705
2946
|
});
|
|
2947
|
+
if (run.topicSubscriptions) await subscribeTopics(ctx, run, deps);
|
|
2948
|
+
const { stack } = run;
|
|
2706
2949
|
run.files = await writeStack(ctx.cwd, run.dir, stack);
|
|
2707
2950
|
printPlan(ctx, run);
|
|
2708
2951
|
if (stack.proxy === "traefik") {
|
|
@@ -2741,6 +2984,36 @@ async function provisionCompose(ctx, run, deps) {
|
|
|
2741
2984
|
if (stack.storage && stack.infra.includes("minio")) await prepareBuckets(ctx, run, deps);
|
|
2742
2985
|
}
|
|
2743
2986
|
/**
|
|
2987
|
+
* Subscribe each topic subscriber SNS pushes to — for a topic the stage set
|
|
2988
|
+
* to SNS by hand — record the ARNs, and compose the stack again with them,
|
|
2989
|
+
* before a file is written.
|
|
2990
|
+
*/
|
|
2991
|
+
async function subscribeTopics(ctx, run, deps) {
|
|
2992
|
+
const { pushes, recorded, restack } = run.topicSubscriptions;
|
|
2993
|
+
if (pushes.length > 0) ctx.logger.info("\n📮 SNS subscriptions for the stage's own topics");
|
|
2994
|
+
run.stack = restack(await ensureTopicSubscriptions({
|
|
2995
|
+
pushes,
|
|
2996
|
+
recorded,
|
|
2997
|
+
secrets: run.secrets?.custom ?? {},
|
|
2998
|
+
stage: ctx.stage,
|
|
2999
|
+
env: deps.env,
|
|
3000
|
+
record: async (resource) => {
|
|
3001
|
+
await ctx.state.putResource(ctx.stage, resource);
|
|
3002
|
+
applied(ctx, run, {
|
|
3003
|
+
key: resource.key,
|
|
3004
|
+
resourceType: SUBSCRIPTION_TYPE,
|
|
3005
|
+
action: "ensure",
|
|
3006
|
+
id: resource.id,
|
|
3007
|
+
via: recorded?.[resource.key]?.id === resource.id ? "recorded" : "created"
|
|
3008
|
+
});
|
|
3009
|
+
},
|
|
3010
|
+
forget: async (key) => {
|
|
3011
|
+
await ctx.state.deleteResource(ctx.stage, key);
|
|
3012
|
+
},
|
|
3013
|
+
log: (line) => ctx.logger.info(line)
|
|
3014
|
+
}));
|
|
3015
|
+
}
|
|
3016
|
+
/**
|
|
2744
3017
|
* Create each bucket the stack's MinIO serves, and the open paths of each
|
|
2745
3018
|
* one a file server fronts — from this machine, on MinIO's loopback port,
|
|
2746
3019
|
* the way `gkm dev` creates them.
|
|
@@ -2755,7 +3028,8 @@ async function prepareBuckets(ctx, run, deps) {
|
|
|
2755
3028
|
done = [
|
|
2756
3029
|
...await applyBuckets(client, storage.buckets),
|
|
2757
3030
|
...await applyPolicies(client, storage.policies),
|
|
2758
|
-
...await applyLifecycles(client, storage.lifecycles)
|
|
3031
|
+
...await applyLifecycles(client, storage.lifecycles),
|
|
3032
|
+
...await applyNotifications(client, storage.objects, new Set(storage.webhooks.map((hook) => hook.bucket)))
|
|
2759
3033
|
];
|
|
2760
3034
|
} finally {
|
|
2761
3035
|
await tunnel.close();
|
|
@@ -2937,7 +3211,7 @@ async function releaseCompose(ctx, run, deps) {
|
|
|
2937
3211
|
via: run.previous[worker.name] ? "recorded" : "created"
|
|
2938
3212
|
});
|
|
2939
3213
|
ctx.logger.info(`\n✅ ${stack.project} is running:`);
|
|
2940
|
-
for (const app of stack.apps) ctx.logger.info(` ${app.name.padEnd(12)} ${app.url}`);
|
|
3214
|
+
for (const app of stack.apps) ctx.logger.info(` ${app.name.padEnd(12)} ${app.url}${app.auth ? ` 🔒 user: ${app.auth.user}, password: gkm secrets:show --stage ${ctx.stage} --reveal → ${app.auth.key}` : ""}`);
|
|
2941
3215
|
for (const worker of stack.workers) ctx.logger.info(` ${worker.name.padEnd(12)} worker ${worker.id}`);
|
|
2942
3216
|
if (stack.local) ctx.logger.info(`\n🔐 Certificates are from Caddy's local CA: NODE_EXTRA_CA_CERTS=${join(stackDir(ctx.stage), "caddy-root.crt")}`);
|
|
2943
3217
|
}
|
|
@@ -2987,9 +3261,33 @@ async function verifyCompose(ctx, run, deps) {
|
|
|
2987
3261
|
}));
|
|
2988
3262
|
if (down.length > 0) throw new ComposeAppsUnhealthy(stack.project, down, stack.proxy);
|
|
2989
3263
|
await pruneStageDns(ctx, run);
|
|
3264
|
+
await confirmSubscriptions(ctx, run, deps);
|
|
2990
3265
|
if (stack.logs) reportLogs(ctx, stack.logs, stack.local, run.server);
|
|
2991
3266
|
}
|
|
2992
3267
|
/**
|
|
3268
|
+
* The SNS subscriptions the stage's providers made before the workers were
|
|
3269
|
+
* up: each still pending is subscribed again, so SNS resends its
|
|
3270
|
+
* confirmation to a worker now there to answer it, and waited on. One still
|
|
3271
|
+
* pending after that is said, not failed on — every app is healthy, and
|
|
3272
|
+
* rolling them back would not confirm it.
|
|
3273
|
+
*/
|
|
3274
|
+
async function confirmSubscriptions(ctx, run, deps) {
|
|
3275
|
+
const stored = await ctx.state.read(ctx.stage);
|
|
3276
|
+
const left = await (deps.confirmSubscriptions ?? confirmPendingSubscriptions)({
|
|
3277
|
+
workspace: ctx.workspace,
|
|
3278
|
+
stage: ctx.stage,
|
|
3279
|
+
secrets: run.secrets?.custom ?? {},
|
|
3280
|
+
resources: stored?.resources,
|
|
3281
|
+
env: deps.env,
|
|
3282
|
+
log: (line) => ctx.logger.info(line),
|
|
3283
|
+
record: async (record) => {
|
|
3284
|
+
const { updatedAt: _, updatedBy: __, ...input } = record;
|
|
3285
|
+
await ctx.state.putResource(ctx.stage, input);
|
|
3286
|
+
}
|
|
3287
|
+
});
|
|
3288
|
+
if (left.length > 0) ctx.logger.warn(`⚠ ${new PushSubscriptionsUnconfirmed(left).message}`);
|
|
3289
|
+
}
|
|
3290
|
+
/**
|
|
2993
3291
|
* A container's own health check, as Docker reports it: a worker's, which
|
|
2994
3292
|
* has no route through the edge, and OpenObserve's — by default it has no
|
|
2995
3293
|
* host there, and served publicly it answers only the addresses it allows,
|
|
@@ -3029,6 +3327,10 @@ async function checkContainer(ctx, run, deps, service) {
|
|
|
3029
3327
|
healthy: false
|
|
3030
3328
|
};
|
|
3031
3329
|
}
|
|
3330
|
+
/** A login, as the `Authorization` header that carries it. */
|
|
3331
|
+
function basicAuthorization(auth) {
|
|
3332
|
+
return `Basic ${Buffer.from(`${auth.user}:${auth.password}`).toString("base64")}`;
|
|
3333
|
+
}
|
|
3032
3334
|
/** How to open the logs, printed — and as an event, for a headless caller. */
|
|
3033
3335
|
function reportLogs(ctx, logs, local, server) {
|
|
3034
3336
|
const lines = logsAccess(logs, {
|
|
@@ -3066,6 +3368,7 @@ async function checkApp(ctx, app, deps, options) {
|
|
|
3066
3368
|
status = await deps.probe({
|
|
3067
3369
|
url,
|
|
3068
3370
|
...options.ca ? { ca: options.ca } : {},
|
|
3371
|
+
...app.auth ? { authorization: basicAuthorization(app.auth) } : {},
|
|
3069
3372
|
...options.edge,
|
|
3070
3373
|
timeoutMs: 1e4,
|
|
3071
3374
|
signal: ctx.signal
|
|
@@ -3304,4 +3607,4 @@ function composeTarget(options = {}) {
|
|
|
3304
3607
|
//#endregion
|
|
3305
3608
|
export { dockerCompose as C, sshTarget as S, parseDigests as _, edgePorts as a, dockerHost as b, edgeRef as c, composeStack as d, derivedCredentials as f, edgeAlias as g, EDGE_PROJECT as h, ComposePushNeedsBuild as i, removeEdgeRoutes as l, stackPlan as m, compose_exports as n, stackOverrideFile as o, stackDir as p, ComposePinNeedsPull as r, deployedStackSecrets as s, composeTarget as t, composeProject as u, pinnedRef as v, projectNetwork as w, sshAccess as x, composeServer as y };
|
|
3306
3609
|
|
|
3307
|
-
//# sourceMappingURL=compose-
|
|
3610
|
+
//# sourceMappingURL=compose-DJvvmF3X.mjs.map
|