@geekmidas/cli 10.0.0-alpha.95 → 10.0.0-alpha.96

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.
Files changed (123) hide show
  1. package/dist/{GoDaddyProvider-BwW51hPm.mjs → GoDaddyProvider-BsUKjGcg.mjs} +2 -2
  2. package/dist/{GoDaddyProvider-BwW51hPm.mjs.map → GoDaddyProvider-BsUKjGcg.mjs.map} +1 -1
  3. package/dist/{GoDaddyProvider-C_DgIkMv.cjs → GoDaddyProvider-DyHXHDHe.cjs} +2 -2
  4. package/dist/{GoDaddyProvider-C_DgIkMv.cjs.map → GoDaddyProvider-DyHXHDHe.cjs.map} +1 -1
  5. package/dist/{LegacyStateStore-D5DarNA2.mjs → LegacyStateStore-B6SOqRFi.mjs} +3 -3
  6. package/dist/{LegacyStateStore-D5DarNA2.mjs.map → LegacyStateStore-B6SOqRFi.mjs.map} +1 -1
  7. package/dist/{LegacyStateStore-BawjE_5n.cjs → LegacyStateStore-BnMcONE0.cjs} +3 -3
  8. package/dist/{LegacyStateStore-BawjE_5n.cjs.map → LegacyStateStore-BnMcONE0.cjs.map} +1 -1
  9. package/dist/{LocalStateStore-YjIqlgAz.mjs → LocalStateStore-6CrsZzqI.mjs} +2 -2
  10. package/dist/{LocalStateStore-YjIqlgAz.mjs.map → LocalStateStore-6CrsZzqI.mjs.map} +1 -1
  11. package/dist/{LocalStateStore-D8fu5WiF.cjs → LocalStateStore-pd4bbdJJ.cjs} +2 -2
  12. package/dist/{LocalStateStore-D8fu5WiF.cjs.map → LocalStateStore-pd4bbdJJ.cjs.map} +1 -1
  13. package/dist/{S3StateStore-Cm-v2IPI.cjs → S3StateStore-CoGk6ZKU.cjs} +2 -2
  14. package/dist/{S3StateStore-Cm-v2IPI.cjs.map → S3StateStore-CoGk6ZKU.cjs.map} +1 -1
  15. package/dist/{S3StateStore-CjTAVsWh.mjs → S3StateStore-DP_7Q4yb.mjs} +2 -2
  16. package/dist/{S3StateStore-CjTAVsWh.mjs.map → S3StateStore-DP_7Q4yb.mjs.map} +1 -1
  17. package/dist/{SSMStateStore-BhtM6jOh.mjs → SSMStateStore-Bo6_KDYY.mjs} +2 -2
  18. package/dist/{SSMStateStore-BhtM6jOh.mjs.map → SSMStateStore-Bo6_KDYY.mjs.map} +1 -1
  19. package/dist/{SSMStateStore-BS4BiZCN.cjs → SSMStateStore-D9s4_Do3.cjs} +2 -2
  20. package/dist/{SSMStateStore-BS4BiZCN.cjs.map → SSMStateStore-D9s4_Do3.cjs.map} +1 -1
  21. package/dist/{add-ylx8dejw.mjs → add-BQS2QZHp.mjs} +4 -4
  22. package/dist/{add-ylx8dejw.mjs.map → add-BQS2QZHp.mjs.map} +1 -1
  23. package/dist/{add-D-3IKT7W.cjs → add-CjURJ-vI.cjs} +4 -4
  24. package/dist/{add-D-3IKT7W.cjs.map → add-CjURJ-vI.cjs.map} +1 -1
  25. package/dist/{bundler-ywR3C1B_.mjs → bundler-BMM3UsGm.mjs} +5 -5
  26. package/dist/{bundler-ywR3C1B_.mjs.map → bundler-BMM3UsGm.mjs.map} +1 -1
  27. package/dist/{bundler-CI3elfZS.cjs → bundler-DmLJQ7AY.cjs} +5 -5
  28. package/dist/{bundler-CI3elfZS.cjs.map → bundler-DmLJQ7AY.cjs.map} +1 -1
  29. package/dist/{cli-Dewt2T21.cjs → cli-C2c-jOVK.cjs} +2 -2
  30. package/dist/{cli-Dewt2T21.cjs.map → cli-C2c-jOVK.cjs.map} +1 -1
  31. package/dist/{cli-BCSuCfQk.mjs → cli-Ce6NgaQF.mjs} +2 -2
  32. package/dist/{cli-BCSuCfQk.mjs.map → cli-Ce6NgaQF.mjs.map} +1 -1
  33. package/dist/{compose-C4js1JDv.mjs → compose-BJDPFBAN.mjs} +7 -7
  34. package/dist/{compose-C4js1JDv.mjs.map → compose-BJDPFBAN.mjs.map} +1 -1
  35. package/dist/{compose-Dd0XphvF.cjs → compose-ETFKqkTu.cjs} +7 -7
  36. package/dist/{compose-Dd0XphvF.cjs.map → compose-ETFKqkTu.cjs.map} +1 -1
  37. package/dist/config.cjs +1 -1
  38. package/dist/config.mjs +1 -1
  39. package/dist/deploy/public.cjs +7 -7
  40. package/dist/deploy/public.mjs +7 -7
  41. package/dist/{deploy-Bw1FjX_x.cjs → deploy-BdN0ym2i.cjs} +200 -46
  42. package/dist/deploy-BdN0ym2i.cjs.map +1 -0
  43. package/dist/{deploy-B0drCD6s.mjs → deploy-DktQl7ti.mjs} +200 -46
  44. package/dist/deploy-DktQl7ti.mjs.map +1 -0
  45. package/dist/{dns-X3oqEV4C.mjs → dns-BjHECDO7.mjs} +5 -5
  46. package/dist/{dns-X3oqEV4C.mjs.map → dns-BjHECDO7.mjs.map} +1 -1
  47. package/dist/{dns-Bmk7P9c2.cjs → dns-C-X6PLkV.cjs} +3 -3
  48. package/dist/{dns-Bmk7P9c2.cjs.map → dns-C-X6PLkV.cjs.map} +1 -1
  49. package/dist/{dns-idXfyCay.mjs → dns-C2EeR6n2.mjs} +3 -3
  50. package/dist/{dns-idXfyCay.mjs.map → dns-C2EeR6n2.mjs.map} +1 -1
  51. package/dist/{dns-CyMIq6to.cjs → dns-ClI7-d5g.cjs} +5 -5
  52. package/dist/{dns-CyMIq6to.cjs.map → dns-ClI7-d5g.cjs.map} +1 -1
  53. package/dist/{dokploy-DaT0mgLU.cjs → dokploy-CD_Bc4EV.cjs} +2 -2
  54. package/dist/{dokploy-DaT0mgLU.cjs.map → dokploy-CD_Bc4EV.cjs.map} +1 -1
  55. package/dist/{dokploy-CZYxXeMa.mjs → dokploy-CxtkS5hl.mjs} +2 -2
  56. package/dist/{dokploy-CZYxXeMa.mjs.map → dokploy-CxtkS5hl.mjs.map} +1 -1
  57. package/dist/{encryption-D0ucY4O7.mjs → encryption-BgQd4f2S.mjs} +3 -3
  58. package/dist/{encryption-D0ucY4O7.mjs.map → encryption-BgQd4f2S.mjs.map} +1 -1
  59. package/dist/{encryption-Dp0IvLVX.cjs → encryption-CqVfz-m7.cjs} +3 -3
  60. package/dist/{encryption-Dp0IvLVX.cjs.map → encryption-CqVfz-m7.cjs.map} +1 -1
  61. package/dist/{engine-WY6j_kvA.cjs → engine-OVVKtPmW.cjs} +4 -4
  62. package/dist/{engine-WY6j_kvA.cjs.map → engine-OVVKtPmW.cjs.map} +1 -1
  63. package/dist/{engine-BcuhnyQO.mjs → engine-YlXzlTUl.mjs} +4 -4
  64. package/dist/{engine-BcuhnyQO.mjs.map → engine-YlXzlTUl.mjs.map} +1 -1
  65. package/dist/{github-DgmW83OP.cjs → github-CsMloeSL.cjs} +5 -5
  66. package/dist/{github-DgmW83OP.cjs.map → github-CsMloeSL.cjs.map} +1 -1
  67. package/dist/{github-DUGA57du.mjs → github-DuuvqI3Z.mjs} +5 -5
  68. package/dist/{github-DUGA57du.mjs.map → github-DuuvqI3Z.mjs.map} +1 -1
  69. package/dist/index.cjs +48 -48
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.mjs +48 -48
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/{migrate-afgRL3Hg.cjs → migrate-BAmJeVq1.cjs} +3 -3
  74. package/dist/{migrate-afgRL3Hg.cjs.map → migrate-BAmJeVq1.cjs.map} +1 -1
  75. package/dist/{migrate-BBcG1dhS.cjs → migrate-BdkoNdIu.cjs} +3 -3
  76. package/dist/{migrate-BBcG1dhS.cjs.map → migrate-BdkoNdIu.cjs.map} +1 -1
  77. package/dist/{migrate-CZ-v5WV0.mjs → migrate-CB8B6W9y.mjs} +3 -3
  78. package/dist/{migrate-CZ-v5WV0.mjs.map → migrate-CB8B6W9y.mjs.map} +1 -1
  79. package/dist/{migrate-D6PlNv2o.mjs → migrate-CsPFHgTs.mjs} +3 -3
  80. package/dist/{migrate-D6PlNv2o.mjs.map → migrate-CsPFHgTs.mjs.map} +1 -1
  81. package/dist/openapi.cjs +1 -1
  82. package/dist/openapi.mjs +1 -1
  83. package/dist/{resolve-CFb4Navi.cjs → resolve-BDatNOoG.cjs} +3 -3
  84. package/dist/{resolve-CFb4Navi.cjs.map → resolve-BDatNOoG.cjs.map} +1 -1
  85. package/dist/{resolve-DakDhr6Z.mjs → resolve-CUne0qOm.mjs} +3 -3
  86. package/dist/{resolve-DakDhr6Z.mjs.map → resolve-CUne0qOm.mjs.map} +1 -1
  87. package/dist/{rollback-B1TIpjdE.mjs → rollback-CCdEEEcF.mjs} +5 -5
  88. package/dist/{rollback-B1TIpjdE.mjs.map → rollback-CCdEEEcF.mjs.map} +1 -1
  89. package/dist/{rollback-B-1dPP0m.cjs → rollback-CuG3DkTY.cjs} +5 -5
  90. package/dist/{rollback-B-1dPP0m.cjs.map → rollback-CuG3DkTY.cjs.map} +1 -1
  91. package/dist/{secrets-CPM0Qffe.cjs → secrets-C5qROlbp.cjs} +3 -3
  92. package/dist/{secrets-CPM0Qffe.cjs.map → secrets-C5qROlbp.cjs.map} +1 -1
  93. package/dist/{secrets-oI9ClAPR.mjs → secrets-ZikTIxEm.mjs} +3 -3
  94. package/dist/{secrets-oI9ClAPR.mjs.map → secrets-ZikTIxEm.mjs.map} +1 -1
  95. package/dist/{seeds-CnXkgKUv.cjs → seeds-BjXW-Krf.cjs} +4 -4
  96. package/dist/{seeds-CnXkgKUv.cjs.map → seeds-BjXW-Krf.cjs.map} +1 -1
  97. package/dist/{seeds-CoKkrSny.mjs → seeds-CbJSne1A.mjs} +4 -4
  98. package/dist/{seeds-CoKkrSny.mjs.map → seeds-CbJSne1A.mjs.map} +1 -1
  99. package/dist/{sniffer-CFRzIrby.mjs → sniffer-DQGBYY8i.mjs} +7 -7
  100. package/dist/{sniffer-CFRzIrby.mjs.map → sniffer-DQGBYY8i.mjs.map} +1 -1
  101. package/dist/{sniffer-vbiQ2Isn.cjs → sniffer-NPD1dyab.cjs} +7 -7
  102. package/dist/{sniffer-vbiQ2Isn.cjs.map → sniffer-NPD1dyab.cjs.map} +1 -1
  103. package/dist/{stack-B7O975TR.mjs → stack-BFq3K-_z.mjs} +3 -3
  104. package/dist/{stack-B7O975TR.mjs.map → stack-BFq3K-_z.mjs.map} +1 -1
  105. package/dist/{stack-1g57OfOw.cjs → stack-DOVvEd1T.cjs} +3 -3
  106. package/dist/{stack-1g57OfOw.cjs.map → stack-DOVvEd1T.cjs.map} +1 -1
  107. package/dist/{stages-Bt4OggMm.mjs → stages-BEn2ArJZ.mjs} +4 -4
  108. package/dist/{stages-Bt4OggMm.mjs.map → stages-BEn2ArJZ.mjs.map} +1 -1
  109. package/dist/{stages-BujUB4we.cjs → stages-Cw6urZyJ.cjs} +4 -4
  110. package/dist/{stages-BujUB4we.cjs.map → stages-Cw6urZyJ.cjs.map} +1 -1
  111. package/dist/target/public.cjs +1 -1
  112. package/dist/target/public.mjs +1 -1
  113. package/dist/workspace/index.cjs +1 -1
  114. package/dist/workspace/index.mjs +1 -1
  115. package/dist/{workspace-DWK1PTXP.mjs → workspace-CqFUjObk.mjs} +54 -2
  116. package/dist/workspace-CqFUjObk.mjs.map +1 -0
  117. package/dist/{workspace-cSyi5nb1.cjs → workspace-DDkm4y6D.cjs} +71 -1
  118. package/dist/workspace-DDkm4y6D.cjs.map +1 -0
  119. package/package.json +15 -15
  120. package/dist/deploy-B0drCD6s.mjs.map +0 -1
  121. package/dist/deploy-Bw1FjX_x.cjs.map +0 -1
  122. package/dist/workspace-DWK1PTXP.mjs.map +0 -1
  123. package/dist/workspace-cSyi5nb1.cjs.map +0 -1
package/dist/config.cjs CHANGED
@@ -4,7 +4,7 @@ const require_schemas = require("./schemas-BObwxB_t.cjs");
4
4
  const require_discover = require("./discover-DPgu-ScS.cjs");
5
5
  const require_sandbox = require("./sandbox-CHv3OYXg.cjs");
6
6
  const require_derive = require("./derive-DAbo49sm.cjs");
7
- const require_workspace = require("./workspace-cSyi5nb1.cjs");
7
+ const require_workspace = require("./workspace-DDkm4y6D.cjs");
8
8
  let node_path = require("node:path");
9
9
  let node_fs = require("node:fs");
10
10
  //#region src/config.ts
package/dist/config.mjs CHANGED
@@ -3,7 +3,7 @@ import { a as discriminatedUnion, d as record, f as string, h as unknown, n as a
3
3
  import { c as runWorker, d as output, r as discover } from "./discover-qjFapetL.mjs";
4
4
  import { i as activeSandbox } from "./sandbox-CbVB7uOD.mjs";
5
5
  import { n as derivedApps } from "./derive-B4vDpzgP.mjs";
6
- import { a as allConstructGlobs, b as isWorkspaceConfig, d as getAppGkmConfig, l as defineWorkspace, m as processConfig } from "./workspace-DWK1PTXP.mjs";
6
+ import { a as allConstructGlobs, b as isWorkspaceConfig, d as getAppGkmConfig, l as defineWorkspace, m as processConfig } from "./workspace-CqFUjObk.mjs";
7
7
  import { dirname, join, parse, resolve, sep } from "node:path";
8
8
  import { existsSync, realpathSync } from "node:fs";
9
9
  //#region src/config.ts
@@ -4,16 +4,16 @@ const require_run = require("../run-fVZ-rLnc.cjs");
4
4
  const require_credentials = require("../credentials-Zqr3QQYB.cjs");
5
5
  const require_discover = require("../discover-DPgu-ScS.cjs");
6
6
  const require_sandbox = require("../sandbox-CHv3OYXg.cjs");
7
- const require_workspace = require("../workspace-cSyi5nb1.cjs");
7
+ const require_workspace = require("../workspace-DDkm4y6D.cjs");
8
8
  const require_define = require("../define-crmMcXFS.cjs");
9
9
  const require_config = require("../config.cjs");
10
- const require_seeds = require("../seeds-CnXkgKUv.cjs");
11
- const require_resolve = require("../resolve-CFb4Navi.cjs");
10
+ const require_seeds = require("../seeds-BjXW-Krf.cjs");
11
+ const require_resolve = require("../resolve-BDatNOoG.cjs");
12
12
  const require_local = require("../local-DNhnkugT.cjs");
13
- const require_sniffer = require("../sniffer-vbiQ2Isn.cjs");
14
- const require_deploy = require("../deploy-Bw1FjX_x.cjs");
15
- const require_engine = require("../engine-WY6j_kvA.cjs");
16
- const require_rollback = require("../rollback-B-1dPP0m.cjs");
13
+ const require_sniffer = require("../sniffer-NPD1dyab.cjs");
14
+ const require_deploy = require("../deploy-BdN0ym2i.cjs");
15
+ const require_engine = require("../engine-OVVKtPmW.cjs");
16
+ const require_rollback = require("../rollback-CuG3DkTY.cjs");
17
17
  const require_provider = require("../provider-BqpjG9QM.cjs");
18
18
  const require_sst = require("../sst-DGuHDxVU.cjs");
19
19
  let node_path = require("node:path");
@@ -3,16 +3,16 @@ import { n as CommandTimedOut, o as GKM_HOME_ENV, s as gkmHome, t as CommandFail
3
3
  import { n as chainCredentials, r as storedCredentials, t as MissingCredential } from "../credentials-B5N5yKk6.mjs";
4
4
  import { n as ConstructsNotSerializable, o as SandboxWorkerFailed, t as ConstructDiscoveryFailed } from "../discover-qjFapetL.mjs";
5
5
  import { n as SandboxCwdEscape, o as confineCwd, r as SecretNameInvalid, t as SECRETS_DIR_ENV } from "../sandbox-CbVB7uOD.mjs";
6
- import { V as UnknownStageProvider, Z as ProvisionedBucketUnreachable } from "../workspace-DWK1PTXP.mjs";
6
+ import { V as UnknownStageProvider, et as ProvisionedBucketUnreachable } from "../workspace-CqFUjObk.mjs";
7
7
  import { a as UnknownDeployTarget, i as DeployTargetNotYetSupported } from "../define-6poNqm5O.mjs";
8
8
  import { ConfigLoadFailed, ConfigObjectNotSerializable } from "../config.mjs";
9
- import { A as StageProviderDisabled, Kt as detectPackageManager, Ln as deployIdentity, b as DevServicesNeedServerTarget, t as DeploySeedsFailed, v as AllowDevServicesTakesNoValue, x as ExternalServicesNotConfigured, y as DEV_SERVICES } from "../seeds-CoKkrSny.mjs";
10
- import { i as TargetRuntimeMismatch, l as TargetPackageNotFound, n as TargetEntryInvalid, r as TargetPackageInvalid, s as TargetRuntimeUndeclared, t as InvalidTargetOptions } from "../resolve-DakDhr6Z.mjs";
9
+ import { A as StageProviderDisabled, Kt as detectPackageManager, Ln as deployIdentity, b as DevServicesNeedServerTarget, t as DeploySeedsFailed, v as AllowDevServicesTakesNoValue, x as ExternalServicesNotConfigured, y as DEV_SERVICES } from "../seeds-CbJSne1A.mjs";
10
+ import { i as TargetRuntimeMismatch, l as TargetPackageNotFound, n as TargetEntryInvalid, r as TargetPackageInvalid, s as TargetRuntimeUndeclared, t as InvalidTargetOptions } from "../resolve-CUne0qOm.mjs";
11
11
  import { n as SANDBOX_ENV_ALLOWLIST, r as allowlistedEnv, t as LocalSandbox } from "../local-BwC2v2Y8.mjs";
12
- import { a as DeploymentTimedOut, f as StateLocked, h as StateVersionConflict, i as DeploymentFailed, u as LocalStateInCi } from "../sniffer-CFRzIrby.mjs";
13
- import { a as UnknownDeployApps, i as TargetBuildsNothing, n as NoDeployableApps, r as RollbackFailed, t as deploy } from "../deploy-B0drCD6s.mjs";
14
- import { _ as RegistryNotConfigured, g as RegistryAmbiguous, h as HealthCheckTimedOut, m as DeployMigrationsFailed, n as FrontendDeployFailed, r as MissingEnvVars, t as BackendDeployFailed, v as RegistryNotFound, y as ProjectNotOwned } from "../engine-BcuhnyQO.mjs";
15
- import { i as rollbackStage, n as RollbackNeedsApp, r as StageNeverDeployed, t as NothingToRollBack } from "../rollback-B1TIpjdE.mjs";
12
+ import { a as DeploymentTimedOut, f as StateLocked, h as StateVersionConflict, i as DeploymentFailed, u as LocalStateInCi } from "../sniffer-DQGBYY8i.mjs";
13
+ import { a as UnknownDeployApps, i as TargetBuildsNothing, n as NoDeployableApps, r as RollbackFailed, t as deploy } from "../deploy-DktQl7ti.mjs";
14
+ import { _ as RegistryNotConfigured, g as RegistryAmbiguous, h as HealthCheckTimedOut, m as DeployMigrationsFailed, n as FrontendDeployFailed, r as MissingEnvVars, t as BackendDeployFailed, v as RegistryNotFound, y as ProjectNotOwned } from "../engine-YlXzlTUl.mjs";
15
+ import { i as rollbackStage, n as RollbackNeedsApp, r as StageNeverDeployed, t as NothingToRollBack } from "../rollback-CCdEEEcF.mjs";
16
16
  import { t as ProviderRemoved } from "../provider-CEOKk8NS.mjs";
17
17
  import { i as SurfacesUnhealthy, r as SstOutputsUnreadable, t as SstConfigNotFound } from "../sst-CGdjHn2A.mjs";
18
18
  import { join, resolve } from "node:path";
@@ -5,15 +5,15 @@ const require_credentials = require("./credentials-Zqr3QQYB.cjs");
5
5
  const require_discover = require("./discover-DPgu-ScS.cjs");
6
6
  const require_sandbox = require("./sandbox-CHv3OYXg.cjs");
7
7
  const require_derive = require("./derive-DAbo49sm.cjs");
8
- const require_workspace = require("./workspace-cSyi5nb1.cjs");
8
+ const require_workspace = require("./workspace-DDkm4y6D.cjs");
9
9
  const require_define = require("./define-crmMcXFS.cjs");
10
10
  const require_config = require("./config.cjs");
11
- const require_seeds = require("./seeds-CnXkgKUv.cjs");
12
- const require_resolve = require("./resolve-CFb4Navi.cjs");
11
+ const require_seeds = require("./seeds-BjXW-Krf.cjs");
12
+ const require_resolve = require("./resolve-BDatNOoG.cjs");
13
13
  const require_local = require("./local-DNhnkugT.cjs");
14
- const require_sniffer = require("./sniffer-vbiQ2Isn.cjs");
15
- const require_dns = require("./dns-Bmk7P9c2.cjs");
16
- const require_dns$1 = require("./dns-CyMIq6to.cjs");
14
+ const require_sniffer = require("./sniffer-NPD1dyab.cjs");
15
+ const require_dns = require("./dns-C-X6PLkV.cjs");
16
+ const require_dns$1 = require("./dns-ClI7-d5g.cjs");
17
17
  const require_credentialSchemas = require("./credentialSchemas-CAPKFkrG.cjs");
18
18
  let node_path = require("node:path");
19
19
  let _geekmidas_manifest = require("@geekmidas/manifest");
@@ -449,6 +449,74 @@ function errorName(error) {
449
449
  const e = error;
450
450
  return e?.Code ?? e?.name ?? "";
451
451
  }
452
+ /** The answer an SDK call failed with. */
453
+ function s3Answer(error) {
454
+ const e = error;
455
+ const headers = Object.fromEntries(Object.entries(e?.$response?.headers ?? {}).map(([k, v]) => [k.toLowerCase(), v]));
456
+ const status = e?.$metadata?.httpStatusCode ?? e?.$response?.statusCode;
457
+ const region = headers["x-amz-bucket-region"];
458
+ const requestId = e?.$metadata?.requestId ?? headers["x-amz-request-id"];
459
+ const id2 = e?.$metadata?.extendedRequestId ?? headers["x-amz-id-2"];
460
+ return {
461
+ ...status !== void 0 ? { status } : {},
462
+ name: errorName(error) || "Error",
463
+ message: e?.message ?? String(error),
464
+ ...region ? { region } : {},
465
+ ...requestId ? { requestId } : {},
466
+ ...id2 ? { id2 } : {}
467
+ };
468
+ }
469
+ /**
470
+ * `HTTP 403 Unknown: UnknownError [x-amz-bucket-region: eu-west-1,
471
+ * x-amz-request-id: …, x-amz-id-2: …]` — everything S3 said, for a message.
472
+ */
473
+ function describeAnswer(answer) {
474
+ const said = answer.message && answer.message !== answer.name ? `${answer.name}: ${answer.message}` : answer.name;
475
+ const headers = [
476
+ answer.region && `x-amz-bucket-region: ${answer.region}`,
477
+ answer.requestId && `x-amz-request-id: ${answer.requestId}`,
478
+ answer.id2 && `x-amz-id-2: ${answer.id2}`
479
+ ].filter(Boolean);
480
+ return `${answer.status === void 0 ? "no response" : `HTTP ${answer.status}`} ${said}` + (headers.length > 0 ? ` [${headers.join(", ")}]` : "");
481
+ }
482
+ /** `HeadBucket`: the bucket's region when it answers, else what S3 said. */
483
+ async function headBucket(S3, client, bucket) {
484
+ try {
485
+ const out = await client.send(new S3.HeadBucketCommand({ Bucket: bucket }));
486
+ return {
487
+ ok: true,
488
+ ...out.BucketRegion ? { region: out.BucketRegion } : {}
489
+ };
490
+ } catch (error) {
491
+ return {
492
+ ok: false,
493
+ ...s3Answer(error)
494
+ };
495
+ }
496
+ }
497
+ /** `GetBucketLocation`'s answer as a region: none is us-east-1, `EU` eu-west-1. */
498
+ async function bucketLocation(S3, client, bucket) {
499
+ try {
500
+ const location = (await client.send(new S3.GetBucketLocationCommand({ Bucket: bucket }))).LocationConstraint;
501
+ return { region: !location ? "us-east-1" : location === "EU" ? "eu-west-1" : location };
502
+ } catch (error) {
503
+ return { failed: s3Answer(error) };
504
+ }
505
+ }
506
+ /**
507
+ * Where `bucket` is: `HeadBucket`'s `x-amz-bucket-region` — on a 200, a 301
508
+ * or a 400 alike — else `GetBucketLocation`.
509
+ *
510
+ * @throws {BucketRegionUnknown}
511
+ */
512
+ async function bucketRegion(clients, bucket) {
513
+ const { S3, s3 } = clients;
514
+ const head = await headBucket(S3, s3, bucket);
515
+ if (head.region) return head.region;
516
+ const location = await bucketLocation(S3, s3, bucket);
517
+ if ("region" in location) return location.region;
518
+ throw new require_workspace.BucketRegionUnknown(bucket, head.ok ? "HTTP 200 without x-amz-bucket-region" : describeAnswer(head), describeAnswer(location.failed));
519
+ }
452
520
  /** A read whose "there is none" answer is one of `missing`. */
453
521
  async function readOr(read, missing) {
454
522
  try {
@@ -502,7 +570,7 @@ function identityTags(ctx, id) {
502
570
  }
503
571
  ];
504
572
  }
505
- async function ensureBucket(ctx, clients, construct) {
573
+ async function ensureBucket(ctx, stageClients, construct) {
506
574
  const { id } = construct;
507
575
  const nameInput = {
508
576
  scope: ctx.identity.scope,
@@ -511,7 +579,13 @@ async function ensureBucket(ctx, clients, construct) {
511
579
  };
512
580
  const versioning = ctx.config.versioning ?? construct.versioned;
513
581
  const open = [...new Set(construct.servers.flatMap((s) => s.open))].sort();
514
- const { bucket, exists } = await ensureBucketName(ctx, clients, id, bucketName(nameInput));
582
+ const located = await ensureBucketName(ctx, stageClients, id, bucketName(nameInput));
583
+ const { bucket, exists } = located;
584
+ let clients = stageClients;
585
+ if (located.region !== stageClients.region) {
586
+ clients = await makeClients(ctx.credential, located.region);
587
+ ctx.log(` '${bucket}' is in ${located.region}, not ${stageClients.region}: '${id}' is reached and addressed there`);
588
+ }
515
589
  await ensureBucketSettings(ctx, clients, {
516
590
  id,
517
591
  bucket,
@@ -519,10 +593,11 @@ async function ensureBucket(ctx, clients, construct) {
519
593
  versioning,
520
594
  open
521
595
  });
596
+ const user = await ensureUser(ctx, clients, id, iamUserName(nameInput), userPolicy(bucket, { versioning }));
522
597
  await ensureAccessKey(ctx, clients, {
523
598
  id,
524
599
  bucket,
525
- ...await ensureUser(ctx, clients, id, iamUserName(nameInput), userPolicy(bucket, { versioning }))
600
+ ...user
526
601
  });
527
602
  const publicUrl = bucketPublicUrl(bucket, clients.region, clients.endpoint);
528
603
  for (const server of construct.servers) {
@@ -559,26 +634,32 @@ async function ensureBucketName(ctx, clients, id, good) {
559
634
  const { S3, s3, region } = clients;
560
635
  const key = `s3-bucket:${id}`;
561
636
  const record = ctx.state.record(key);
562
- const entry = (name) => ({
637
+ const entry = (name, where) => ({
563
638
  key,
564
639
  type: "s3-bucket",
565
640
  data: {
566
641
  name,
567
- region
642
+ region: where
568
643
  }
569
644
  });
570
- /** Whether this account holds `name`: yes, no, or someone else does. */
645
+ /**
646
+ * Whether this account holds `name`: yes, no, or someone else does. Read
647
+ * by status — a `HEAD` has no body, so its error is named `Unknown` — and,
648
+ * when S3 says the bucket is in another region, asked again there.
649
+ */
571
650
  const probe = async (name) => {
572
- try {
573
- await s3.send(new S3.HeadBucketCommand({ Bucket: name }));
574
- return "ours";
575
- } catch (error) {
576
- const name = errorName(error);
577
- if (name === "NotFound" || name === "NoSuchBucket") return "none";
578
- if (name === "Forbidden" || name === "AccessDenied") return "taken";
579
- throw error;
651
+ let head = await headBucket(S3, s3, name);
652
+ if (!head.ok && head.region && head.region !== region && (head.status === 301 || head.status === 400)) {
653
+ const there = await makeClients(ctx.credential, head.region);
654
+ head = await headBucket(there.S3, there.s3, name);
580
655
  }
656
+ if (head.ok) return "ours";
657
+ if (head.status === 404) return "none";
658
+ if (head.status === 403) return "taken";
659
+ throw new require_workspace.BucketProbeFailed(name, describeAnswer(head));
581
660
  };
661
+ /** Where the bucket is now — read, not assumed: it may be adopted. */
662
+ const located = async (name, made) => ctx.dryRun && made === "created" ? region : bucketRegion(clients, name);
582
663
  const create = async (name) => {
583
664
  if (ctx.dryRun) {
584
665
  const found = await probe(name);
@@ -592,7 +673,7 @@ async function ensureBucketName(ctx, clients, id, good) {
592
673
  }
593
674
  return found;
594
675
  }
595
- await ctx.state.pending(entry(name));
676
+ await ctx.state.pending(entry(name, region));
596
677
  try {
597
678
  await s3.send(new S3.CreateBucketCommand({
598
679
  Bucket: name,
@@ -611,23 +692,22 @@ async function ensureBucketName(ctx, clients, id, good) {
611
692
  }, async () => {});
612
693
  return "created";
613
694
  };
614
- const adopt = async (name) => {
615
- const owner = (await readOr(() => s3.send(new S3.GetBucketTaggingCommand({ Bucket: name })), ["NoSuchTagSet", "NoSuchTagSetError"]))?.TagSet?.find((t) => t.Key === TAG_PROJECT)?.Value;
695
+ const adopt = async (name, where) => {
696
+ const there = where === region ? clients : await makeClients(ctx.credential, where);
697
+ const owner = (await readOr(() => there.s3.send(new there.S3.GetBucketTaggingCommand({ Bucket: name })), ["NoSuchTagSet", "NoSuchTagSetError"]))?.TagSet?.find((t) => t.Key === TAG_PROJECT)?.Value;
616
698
  if (owner && owner !== ctx.identity.key) throw new require_workspace.BucketOwnedByAnotherProject(name, owner, ctx.identity.key);
617
699
  };
618
700
  if (record?.status === "ready" && record.id) {
619
701
  const found = await probe(record.id);
620
- if (found === "ours") return {
621
- bucket: record.id,
622
- exists: true
623
- };
624
702
  if (found === "taken") throw new require_workspace.RecordedBucketUnreachable(id, record.id);
625
- const made = await create(record.id);
703
+ const made = found === "ours" ? "ours" : await create(record.id);
626
704
  if (made === "taken") throw new require_workspace.RecordedBucketUnreachable(id, record.id);
627
- if (!ctx.dryRun) await ctx.state.ready(entry(record.id), record.id);
705
+ const where = await located(record.id, made);
706
+ if (!ctx.dryRun) await ctx.state.ready(entry(record.id, where), record.id);
628
707
  return {
629
708
  bucket: record.id,
630
- exists: made === "ours"
709
+ exists: made === "ours",
710
+ region: where
631
711
  };
632
712
  }
633
713
  const pending = record?.data?.name;
@@ -641,12 +721,14 @@ async function ensureBucketName(ctx, clients, id, good) {
641
721
  tried.push(name);
642
722
  const made = await create(name);
643
723
  if (made === "taken") continue;
644
- if (made === "ours") await adopt(name);
645
- if (!ctx.dryRun) await ctx.state.ready(entry(name), name);
724
+ const where = await located(name, made);
725
+ if (made === "ours") await adopt(name, where);
726
+ if (!ctx.dryRun) await ctx.state.ready(entry(name, where), name);
646
727
  if (name !== good) ctx.log(` '${good}' is taken by another account; '${id}' is '${name}', recorded in the stage's state`);
647
728
  return {
648
729
  bucket: name,
649
- exists: made === "ours"
730
+ exists: made === "ours",
731
+ region: where
650
732
  };
651
733
  }
652
734
  throw new require_workspace.BucketNameUnavailable(id, tried.filter((n) => n !== pending));
@@ -810,8 +892,8 @@ async function ensureAccessKey(ctx, clients, input) {
810
892
  const record = ctx.state.record(entryKey);
811
893
  const given = ctx.secrets[urlKey];
812
894
  let inUrl;
895
+ let parsed;
813
896
  if (given !== void 0) {
814
- let parsed;
815
897
  try {
816
898
  parsed = _geekmidas_storage_s3_url.parse(given);
817
899
  } catch {
@@ -855,7 +937,20 @@ async function ensureAccessKey(ctx, clients, input) {
855
937
  await ctx.state.ready(entry(), inUrl);
856
938
  current = inUrl;
857
939
  }
858
- if (current !== void 0 && listed.includes(current) && inUrl === current && !ctx.rotateKeys) return;
940
+ if (current !== void 0 && listed.includes(current) && inUrl === current && !ctx.rotateKeys) {
941
+ if (parsed && parsed.region !== clients.region) {
942
+ const address = parsed;
943
+ await ctx.change({
944
+ construct: id,
945
+ resource: urlKey,
946
+ change: `name ${clients.region}, the bucket's region (it said ${address.region ?? "none"})`
947
+ }, () => ctx.writeSecrets({ [urlKey]: _geekmidas_storage_s3_url.build({
948
+ ...address,
949
+ region: clients.region
950
+ }) }));
951
+ }
952
+ return;
953
+ }
859
954
  if (ctx.rotateKeys && previous) throw new require_workspace.RotationInProgress(id, previous, ctx.stage);
860
955
  const outgoing = current && listed.includes(current) ? current : void 0;
861
956
  if (listed.length >= 2) throw new require_workspace.AccessKeyLimit(user, listed);
@@ -877,28 +972,58 @@ async function ensureAccessKey(ctx, clients, input) {
877
972
  accessKeyId: key.AccessKeyId,
878
973
  secretAccessKey: key.SecretAccessKey
879
974
  }) });
975
+ const issuedAt = (/* @__PURE__ */ new Date()).toISOString();
880
976
  await ctx.state.ready(entry(outgoing ? {
881
977
  previous: outgoing,
882
- rotatedAt: (/* @__PURE__ */ new Date()).toISOString()
883
- } : {}), key.AccessKeyId);
978
+ rotatedAt: issuedAt,
979
+ issuedAt
980
+ } : { issuedAt }), key.AccessKeyId);
884
981
  });
885
982
  if (outgoing) ctx.log(` ${urlKey} holds the new key. This deploy moves '${ctx.stage}' onto it; the next deploy after it deletes the old key ${outgoing}`);
886
983
  }
984
+ /** How long a key issued this recently counts as new to IAM. */
985
+ const NEW_KEY_WINDOW_MS = 6e5;
986
+ /** The waits between asks while a new key becomes usable: about a minute. */
987
+ let newKeyWaits = [
988
+ 2e3,
989
+ 4e3,
990
+ 8e3,
991
+ 15e3,
992
+ 15e3,
993
+ 15e3
994
+ ];
995
+ /** When the key in the URL was issued, if the stage's state says it was just now. */
996
+ function issuedJustNow(ctx, id, accessKeyId) {
997
+ const record = ctx.resources?.[`iam-access-key:${id}`];
998
+ const issuedAt = record?.data?.issuedAt;
999
+ if (record?.id !== accessKeyId || typeof issuedAt !== "string") return;
1000
+ const age = Date.now() - Date.parse(issuedAt);
1001
+ return age >= 0 && age < NEW_KEY_WINDOW_MS ? issuedAt : void 0;
1002
+ }
887
1003
  /**
888
1004
  * Each provisioned bucket answers `HeadBucket` to the key in the stage's
889
1005
  * secrets — the one the apps will use. A bucket whose URL carries no key is
890
1006
  * not one this provider wrote, and the deploy's own check covers a URL that
891
1007
  * is missing.
1008
+ *
1009
+ * A failure is read by its status, never its name — a `HEAD` has no body,
1010
+ * so SDK v3 calls a 301, 400 or 403 `Unknown` — and the message carries
1011
+ * everything S3 said: status, error, region, request ids.
1012
+ *
1013
+ * @throws {BucketRegionMismatch} the bucket is in another region than its URL says
1014
+ * @throws {ProvisionedBucketUnreachable}
892
1015
  */
893
1016
  async function verifyS3(ctx) {
894
1017
  const S3 = await import("@aws-sdk/client-s3");
895
1018
  for (const { id } of bucketConstructs(ctx.manifest)) {
896
- const url = ctx.secrets[(0, _geekmidas_manifest.provideKey)(id, "url")];
1019
+ const urlKey = (0, _geekmidas_manifest.provideKey)(id, "url");
1020
+ const url = ctx.secrets[urlKey];
897
1021
  if (url === void 0) continue;
898
1022
  const address = _geekmidas_storage_s3_url.parse(url);
899
1023
  if (!address.accessKeyId || !address.secretAccessKey) continue;
1024
+ const asked = address.region ?? ctx.config.region ?? "us-east-1";
900
1025
  const client = new S3.S3Client({
901
- region: address.region ?? ctx.config.region ?? "us-east-1",
1026
+ region: asked,
902
1027
  credentials: {
903
1028
  accessKeyId: address.accessKeyId,
904
1029
  secretAccessKey: address.secretAccessKey
@@ -907,10 +1032,35 @@ async function verifyS3(ctx) {
907
1032
  ...address.forcePathStyle ? { forcePathStyle: true } : {}
908
1033
  });
909
1034
  try {
910
- await client.send(new S3.HeadBucketCommand({ Bucket: address.bucket }));
911
- } catch (error) {
912
- const name = errorName(error);
913
- throw new require_workspace.ProvisionedBucketUnreachable(id, address.bucket, ctx.stage, name === "NotFound" ? "it does not exist" : name === "Forbidden" ? "the key is refused" : name || String(error));
1035
+ let head = await headBucket(S3, client, address.bucket);
1036
+ const issuedAt = issuedJustNow(ctx, id, address.accessKeyId);
1037
+ let waited = 0;
1038
+ if (!head.ok && head.status === 403 && issuedAt) {
1039
+ ctx.log?.(` ${id}: waiting for the new key ${address.accessKeyId} to become active…`);
1040
+ for (const wait of newKeyWaits) {
1041
+ await new Promise((resolve) => setTimeout(resolve, wait));
1042
+ waited += wait;
1043
+ head = await headBucket(S3, client, address.bucket);
1044
+ if (head.ok || head.status !== 403) break;
1045
+ }
1046
+ }
1047
+ if (head.ok) continue;
1048
+ const fail = (reason) => new require_workspace.ProvisionedBucketUnreachable(id, address.bucket, ctx.stage, reason);
1049
+ const said = describeAnswer(head);
1050
+ if (head.status === 301 || head.status === 400 && head.region && head.region !== asked) {
1051
+ let where = head.region;
1052
+ let located = "";
1053
+ if (!where) {
1054
+ const location = await bucketLocation(S3, client, address.bucket);
1055
+ if ("region" in location) where = location.region;
1056
+ else located = `; GetBucketLocation answered ${describeAnswer(location.failed)}`;
1057
+ }
1058
+ if (where && where !== asked) throw new require_workspace.BucketRegionMismatch(id, address.bucket, ctx.stage, urlKey, where, address.region, asked, said);
1059
+ throw fail(`S3 redirected the request (${said}${located})`);
1060
+ }
1061
+ if (head.status === 404) throw fail(`it does not exist (${said})`);
1062
+ if (head.status === 403) throw fail(`the key is refused — AccessDenied, or an invalid or not-yet-active key (${said})` + (issuedAt ? `. The key was issued at ${issuedAt} by this deploy, and IAM keys take seconds to become usable: it was still refused after waiting ${Math.round(waited / 1e3)}s` : ""));
1063
+ throw fail(said);
914
1064
  } finally {
915
1065
  client.destroy();
916
1066
  }
@@ -963,7 +1113,9 @@ async function verifyStageProviders(input) {
963
1113
  manifest: input.manifest,
964
1114
  stage: input.stage,
965
1115
  config: choice.config,
966
- secrets: input.secrets
1116
+ secrets: input.secrets,
1117
+ ...input.resources ? { resources: input.resources } : {},
1118
+ ...input.log ? { log: input.log } : {}
967
1119
  });
968
1120
  verified.push(`${kind}: ${provider.name}`);
969
1121
  }
@@ -1257,7 +1409,9 @@ async function assertStageReady(ctx) {
1257
1409
  workspace,
1258
1410
  manifest,
1259
1411
  stage,
1260
- secrets: supplied
1412
+ secrets: supplied,
1413
+ resources: (await ctx.state.read(stage))?.resources ?? {},
1414
+ log: (line) => ctx.logger.info(line)
1261
1415
  });
1262
1416
  for (const line of verified) ctx.logger.info(`✓ ${line} verified`);
1263
1417
  }
@@ -1900,4 +2054,4 @@ Object.defineProperty(exports, "iamUserName", {
1900
2054
  }
1901
2055
  });
1902
2056
 
1903
- //# sourceMappingURL=deploy-Bw1FjX_x.cjs.map
2057
+ //# sourceMappingURL=deploy-BdN0ym2i.cjs.map