@go-to-k/cdkd 0.296.13 → 0.296.14

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 (29) hide show
  1. package/dist/{asg-provider-DeeIdM5B.js → asg-provider-eXsnCQh2.js} +4 -4
  2. package/dist/{asg-provider-DeeIdM5B.js.map → asg-provider-eXsnCQh2.js.map} +1 -1
  3. package/dist/{logger-DAaB7GFO.js → aws-failure-text-BaWeCWRz.js} +45 -2
  4. package/dist/aws-failure-text-BaWeCWRz.js.map +1 -0
  5. package/dist/cli.js +2 -2
  6. package/dist/{deploy-engine-FDsHckZR.js → deploy-engine-Z_zHC0jz.js} +488 -464
  7. package/dist/deploy-engine-Z_zHC0jz.js.map +1 -0
  8. package/dist/{iam-policy-targets-elNafvpb.js → iam-policy-targets-BoZuWtxK.js} +43 -49
  9. package/dist/iam-policy-targets-BoZuWtxK.js.map +1 -0
  10. package/dist/{iam-role-provider-BuWI_oJp.js → iam-role-provider-BTYPRrDe.js} +4 -4
  11. package/dist/{iam-role-provider-BuWI_oJp.js.map → iam-role-provider-BTYPRrDe.js.map} +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +4 -4
  14. package/dist/{neptune-provider-Bdc1YYxL.js → neptune-provider-ZYVwKq6K.js} +4 -4
  15. package/dist/{neptune-provider-Bdc1YYxL.js.map → neptune-provider-ZYVwKq6K.js.map} +1 -1
  16. package/dist/{program-1S4fU3m4.js → program-CKV6Kn8Q.js} +149 -111
  17. package/dist/program-CKV6Kn8Q.js.map +1 -0
  18. package/dist/{provider-classes-hW6X0dKh.js → provider-classes-Dz2gVtOZ.js} +131 -70
  19. package/dist/provider-classes-Dz2gVtOZ.js.map +1 -0
  20. package/dist/{rds-provider-Q1U7N7ee.js → rds-provider-6YeZRRfW.js} +4 -4
  21. package/dist/{rds-provider-Q1U7N7ee.js.map → rds-provider-6YeZRRfW.js.map} +1 -1
  22. package/dist/{version-B9EuX7Oh.js → version-1NhJbqzi.js} +2 -2
  23. package/dist/{version-B9EuX7Oh.js.map → version-1NhJbqzi.js.map} +1 -1
  24. package/package.json +1 -1
  25. package/dist/deploy-engine-FDsHckZR.js.map +0 -1
  26. package/dist/iam-policy-targets-elNafvpb.js.map +0 -1
  27. package/dist/logger-DAaB7GFO.js.map +0 -1
  28. package/dist/program-1S4fU3m4.js.map +0 -1
  29. package/dist/provider-classes-hW6X0dKh.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js";
2
- import { A as displayIdent, C as withoutGeneratedFallbackName, D as UNRENDERABLE, E as STACK_REF_MAX_CODE_POINTS, F as plainIdentOr, I as safeMsg, M as displayStackName, N as isPasteableIdent, R as truncateCodePoints, S as withStackName, T as SECRET_REF_MAX_CODE_POINTS, _ as generateResourceNameWithFallback, b as looksLikeCdkdGeneratedName, c as installLogLineMaskerSource, g as generateResourceName, h as explicitNamePropertyFor, j as displaySafe, k as displayAwsMessage, l as getLiveRenderer, n as getLogger, p as applyDefaultNameForFallback, r as isStdoutReservedForPayload, s as currentLogLineMasker, v as getCurrentSkipPrefix, x as withSkipPrefix, y as getCurrentStackName } from "./logger-DAaB7GFO.js";
3
- import { $n as retryClassificationText, A as refusalTypeShown, An as pasteableCommand, At as UNREPRODUCIBLE_LOCK_CLAUSE, B as protectionFlipKey, Bn as hasReplayMayCollide, Bt as injectiveKey, C as assertRegionMatch, Ct as createdBeforeFailure, D as isQuotableImportValue, Dn as commandHole, Dt as isAuxiliaryMarkOf, En as UNSHOWABLE_VALUE, Et as isAuxiliaryFailure, F as compensateProtectionFlip, Fn as shellQuote, Ft as formatLockOperation, G as DELETION_PROTECTION_DOC_POINTER, Gt as withPasteableAwsProfile, H as runDeleteAttempt, Hn as isNameCooldownError, I as deleteWithProtectionCompensation, In as withheldTargetClause, It as formatLockOwner, Jn as isAmbiguousCcHandlerErrorCode, Jt as clientDefaultsFor, Kn as markReplayMayCollide, Kt as ambientClientDefaults, L as isTerminalDeleteFailure, Lt as sanitizeRecoveryValue, M as resolveExplicitPhysicalId, Mn as plainOrDescribed, Nn as quotedOrDescribed, O as normalizeAwsTagsToCfn, Ot as markAuxiliaryFailure, P as ProtectionFlipRegistry, Pn as shellBoundedDisplay, Pt as formatLockExpiry, Qn as isTransientServerError, Qt as CdkdError, Rt as CUSTOM_RESOURCE_RESPONSE_PREFIX, S as RESOURCE_NOT_FOUND, Tn as SHELL_ACTIVE_WHY, Tt as hasCreatedBeforeFailure, Un as isRecreateRetryableError, Ut as producerRecordKey, Vn as isNameCollisionErrorFrom, Wn as isReplayedNameCollisionFrom, X as protectedReplacementAdvice, Xn as isIamPropagationError, Xt as AccountIdUnavailableError, Y as pasteableAwsCommand, Yn as isAmbiguousOutcomeError, Yt as credentialFingerprint, Zn as isRetryableTransientError, Zt as AssetError, _n as StateError, _t as maskDeep, ar as isThrottlingError, at as canonicalizeRoute53QueryName, bt as RETRY_AUXILIARY_OWNER, cn as MacroExpansionError, cr as wrapMaskedAwsError, d as prepareRemovalForUpdate, dt as resourceTypeShown, en as CrossAccountSecretRefusalError, er as describeAwsFailure, f as removalWarning, fn as ProvisioningError, ft as segmentAfterAnchor, gt as isSecretDerivedValue, ht as createMaskedRetryLogger, i as holdsSecretDerivedEntry, in as IntrinsicResolutionRefusalError, ir as isMarkedNonRetryable, it as monotonicNowMs, jn as physicalIdShownBesideCommand, jt as buildForceUnlockCommand, k as quotedRemedyLogicalId, kn as isInertUnquoted, kt as markCreatedBeforeFailure, l as withUnchangedSecretPrincipalLists, ln as MalformedProducerRecordRefusalError, lt as logicalIdShown, m as withoutInjectedRemovals, mn as ResourceUpdateNotSupportedError, mt as createMaskedLogSinks, nr as safeStringify$1, nt as startInterruptWatch, or as markNonRetryable, pn as ResourceTimeoutError, pt as stateOrphanRecordRemedy, qn as formatRetryClassificationSignals, qt as ambientCredentialConfig, rn as DynamicReferenceRegionAmbiguousError, rt as ElapsedBudgetRegistry, sn as LockError, sr as markRedactedCause, st as compositeIdSeparatorRefusal, tn as DependencyError, tt as isInterruptedWaitError, vn as SynthesisError, vt as maskerOrIdentity, wn as SHELL_ACTIVE, wt as createdResourceIdentityBeforeFailure, x as withoutServerErrorRetries, xn as normalizeAwsError, xt as carryCreatedBeforeFailure, yt as withDerivedNameMasks, z as observeThenDisableProtection, zn as isUpdateUnsupportedError, zt as DEFAULT_STATE_PREFIX } from "./iam-policy-targets-elNafvpb.js";
2
+ import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-BaWeCWRz.js";
3
+ import { $ as protectedReplacementAdvice, $n as isIamPropagationError, $t as AccountIdUnavailableError, A as isQuotableImportValue, An as commandHole, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bt as sanitizeRecoveryValue, Ct as RETRY_AUXILIARY_OWNER, Dn as SHELL_ACTIVE, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as plainOrDescribed, G as runDeleteAttempt, Gn as isNameCooldownError, H as observeThenDisableProtection, Hn as isUpdateUnsupportedError, Ht as DEFAULT_STATE_PREFIX, In as quotedOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jt as withPasteableAwsProfile, Kn as isRecreateRetryableError, Kt as producerRecordKey, L as ProtectionFlipRegistry, Ln as shellBoundedDisplay, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mn as isInertUnquoted, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as pasteableCommand, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE_WHY, Ot as hasCreatedBeforeFailure, Pn as physicalIdShownBesideCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousOutcomeError, Qt as credentialFingerprint, R as compensateProtectionFlip, Rn as shellQuote, Rt as formatLockOperation, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, U as protectionFlipKey, Un as hasReplayMayCollide, Ut as injectiveKey, Vt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Wn as isNameCollisionErrorFrom, Xn as formatRetryClassificationSignals, Xt as ambientCredentialConfig, Yn as markReplayMayCollide, Yt as ambientClientDefaults, Zn as isAmbiguousCcHandlerErrorCode, Zt as clientDefaultsFor, _n as ResourceUpdateNotSupportedError, _t as createMaskedLogSinks, ar as isThrottlingError, at as startInterruptWatch, bn as StateError, bt as maskDeep, cr as wrapMaskedAwsError, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as MacroExpansionError, en as AssetError, er as isRetryableTransientError, f as removalWarning, fn as MalformedProducerRecordRefusalError, ft as logicalIdShown, gn as ResourceTimeoutError, gt as stateOrphanRecordRemedy, hn as ProvisioningError, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as DependencyError, ir as isMarkedNonRetryable, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jt as markAuxiliaryFailure, kn as UNSHOWABLE_VALUE, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, m as withoutInjectedRemovals, mt as resourceTypeShown, nr as retryClassificationText, on as DynamicReferenceRegionAmbiguousError, or as markNonRetryable, ot as ElapsedBudgetRegistry, qn as isReplayedNameCollisionFrom, rn as CrossAccountSecretRefusalError, sn as IntrinsicResolutionRefusalError, sr as markRedactedCause, st as monotonicNowMs, tn as CdkdError, tr as isTransientServerError, un as LockError, ut as compositeIdSeparatorRefusal, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wn as normalizeAwsError, wt as carryCreatedBeforeFailure, xn as SynthesisError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as withheldTargetClause, zt as formatLockOwner } from "./iam-policy-targets-BoZuWtxK.js";
4
4
  import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-D0q0z4dG.js";
5
- import { t as getCdkdVersion } from "./version-B9EuX7Oh.js";
5
+ import { t as getCdkdVersion } from "./version-1NhJbqzi.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -1279,7 +1279,7 @@ var ContextProviderRegistry = class {
1279
1279
  results[entry.key] = value;
1280
1280
  this.logger.debug(`Resolved context: ${shownKey}`);
1281
1281
  } catch (error) {
1282
- const message = displayAwsMessage(error instanceof Error ? error.message : String(error));
1282
+ const message = displayAwsMessage(describeAwsFailure(error).detail);
1283
1283
  this.logger.error(`Context provider '${shownProvider}' failed: ${message}`);
1284
1284
  results[entry.key] = {
1285
1285
  [PROVIDER_ERROR_KEY]: message,
@@ -1493,7 +1493,7 @@ function resolveExpectedBucketOwner(client) {
1493
1493
  secretAccessKey: credentials.secretAccessKey
1494
1494
  });
1495
1495
  } catch (error) {
1496
- getLogger().debug(`ExpectedBucketOwner resolution skipped (header omitted): ${String(error)}`);
1496
+ getLogger().debug(`ExpectedBucketOwner resolution skipped (header omitted): ${safeStringify$1(error)}`);
1497
1497
  clientCache.delete(client);
1498
1498
  return;
1499
1499
  }
@@ -1510,7 +1510,7 @@ async function recordResolvedAccountId(client, accountId) {
1510
1510
  if (credentialsCache.has(accessKeyId)) return;
1511
1511
  credentialsCache.set(accessKeyId, Promise.resolve(accountId));
1512
1512
  } catch (error) {
1513
- getLogger().debug(`ExpectedBucketOwner seed skipped: ${String(error)}`);
1513
+ getLogger().debug(`ExpectedBucketOwner seed skipped: ${safeStringify$1(error)}`);
1514
1514
  }
1515
1515
  }
1516
1516
  async function expectedOwnerParam(client) {
@@ -1674,7 +1674,7 @@ function recordFailure(failed, key, reason) {
1674
1674
  if (existing) existing.push(reason);
1675
1675
  else failed.set(key, [reason]);
1676
1676
  }
1677
- const describe$1 = (error) => error instanceof Error ? error.message : String(error);
1677
+ const describe$1 = (error) => describeAwsFailure(error).detail;
1678
1678
  const PREFIX_HANDLE_SUFFIX = "* (every key under this prefix)";
1679
1679
  async function purgeNoncurrentVersionsUnderPrefix(s3Client, bucket, prefix, options = {}) {
1680
1680
  const logger = options.logger ?? getLogger().child("s3-version-purge");
@@ -2159,7 +2159,7 @@ function parseTemplateBody(body) {
2159
2159
  return parsed;
2160
2160
  }
2161
2161
  function formatErr(err) {
2162
- return displayAwsMessage(err instanceof Error ? err.message : String(err));
2162
+ return displayAwsMessage(describeAwsFailure(err).detail);
2163
2163
  }
2164
2164
 
2165
2165
  //#endregion
@@ -4113,7 +4113,7 @@ var AssetModeResolver = class {
4113
4113
  marker
4114
4114
  };
4115
4115
  } catch (error) {
4116
- const message = error instanceof Error ? error.message : String(error);
4116
+ const message = describeAwsFailure(error).detail;
4117
4117
  this.logger.warn(`Failed to auto-create cdkd asset storage for region ${quotedIfPlain(region, "that is not a plain identifier")}: ${message} Falling back to the CDK bootstrap destinations for this run — opt the region in with S3/ECR create permissions.\nBootstrap with: ${pasteableCommand("cdkd bootstrap", [{
4118
4118
  flag: "--region",
4119
4119
  value: region,
@@ -4445,7 +4445,7 @@ var WorkGraph = class {
4445
4445
  nodeId: node.id,
4446
4446
  error
4447
4447
  });
4448
- this.logger.error(`Failed: ${node.id}: ${error instanceof Error ? error.message : String(error)}`);
4448
+ this.logger.error(`Failed: ${node.id}: ${describeAwsFailure(error).detail}`);
4449
4449
  }).finally(() => {
4450
4450
  active[node.type]--;
4451
4451
  dispatch();
@@ -4459,7 +4459,7 @@ var WorkGraph = class {
4459
4459
  }
4460
4460
  if (errors.length > 0) {
4461
4461
  const skippedCount = [...this.nodes.values()].filter((n) => n.state === "skipped").length;
4462
- const msg = errors.map((e) => ` - ${e.nodeId}: ${e.error instanceof Error ? e.error.message : String(e.error)}`).join("\n");
4462
+ const msg = errors.map((e) => ` - ${e.nodeId}: ${describeAwsFailure(e.error).detail}`).join("\n");
4463
4463
  reject(/* @__PURE__ */ new Error(`${errors.length} node(s) failed${skippedCount > 0 ? `, ${skippedCount} skipped` : ""}:\n${msg}`));
4464
4464
  return;
4465
4465
  }
@@ -10910,6 +10910,14 @@ const CASE_INSENSITIVE_NAME_TYPES = /* @__PURE__ */ new Set([
10910
10910
  "AWS::RDS::DBSubnetGroup"
10911
10911
  ]);
10912
10912
  const ASCII_CASE_INSENSITIVE_NAME_TYPES = /* @__PURE__ */ new Set(["AWS::Glue::Table"]);
10913
+ function physicalIdKey(resourceType, physicalId) {
10914
+ if (CASE_INSENSITIVE_NAME_TYPES.has(resourceType)) return physicalId.toLowerCase();
10915
+ if (ASCII_CASE_INSENSITIVE_NAME_TYPES.has(resourceType)) return physicalId.replace(/[A-Z]/g, (c) => c.toLowerCase());
10916
+ return physicalId;
10917
+ }
10918
+ function samePhysicalId(resourceType, a, b) {
10919
+ return physicalIdKey(resourceType, a) === physicalIdKey(resourceType, b);
10920
+ }
10913
10921
  const NO_PHYSICAL_ID_NAME_PROOF = /* @__PURE__ */ new Set(["AWS::Glue::Table"]);
10914
10922
  const GENERATED_NAME_VERBATIM = /* @__PURE__ */ new Set([
10915
10923
  "AWS::CloudWatch::Alarm",
@@ -12162,6 +12170,10 @@ const CHILD_STORED_IN_PARENT = {
12162
12170
  properties: ["GroupName"],
12163
12171
  parentTypes: [IAM_GROUP]
12164
12172
  },
12173
+ "AWS::ApplicationAutoScaling::ScalingPolicy": {
12174
+ properties: ["ScalingTargetId"],
12175
+ parentTypes: ["AWS::ApplicationAutoScaling::ScalableTarget"]
12176
+ },
12165
12177
  "AWS::IAM::Policy": {
12166
12178
  properties: [
12167
12179
  "Roles",
@@ -22700,7 +22712,7 @@ var CloudControlProvider = class {
22700
22712
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
22701
22713
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
22702
22714
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
22703
- const { ASGProvider } = await import("./asg-provider-DeeIdM5B.js");
22715
+ const { ASGProvider } = await import("./asg-provider-eXsnCQh2.js");
22704
22716
  const delegateRegion = ambientRegion();
22705
22717
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
22706
22718
  if (asgProvider === void 0) {
@@ -22806,7 +22818,7 @@ var CloudControlProvider = class {
22806
22818
  const family = SDK_DELETE_FAMILIES.get(resourceType);
22807
22819
  const cached = this.sdkDeleteDelegates.get(family);
22808
22820
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
22809
- const provider = family === "rds" ? new (await (import("./rds-provider-Q1U7N7ee.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-Bdc1YYxL.js"))).NeptuneProvider({ region: ccRegion });
22821
+ const provider = family === "rds" ? new (await (import("./rds-provider-6YeZRRfW.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-ZYVwKq6K.js"))).NeptuneProvider({ region: ccRegion });
22810
22822
  this.sdkDeleteDelegates.set(family, {
22811
22823
  region: ccRegion,
22812
22824
  provider
@@ -27897,7 +27909,7 @@ var DeploymentEventsStore = class {
27897
27909
  }
27898
27910
  enqueueWrite(op) {
27899
27911
  const next = this.writeChain.then(op).catch((err) => {
27900
- this.warnOnce(`Failed to persist deployment events for run ${this.runId}: ${err instanceof Error ? err.message : String(err)}`);
27912
+ this.warnOnce(`Failed to persist deployment events for run ${this.runId}: ${describeAwsFailure(err).detail}`);
27901
27913
  });
27902
27914
  this.writeChain = next;
27903
27915
  return next;
@@ -27918,7 +27930,7 @@ var DeploymentEventsStore = class {
27918
27930
  if (Array.isArray(parsed.runs)) return parsed.runs;
27919
27931
  }
27920
27932
  } catch (err) {
27921
- this.logger.debug(`Deployment-events index unreadable, rewriting: ${err instanceof Error ? err.message : String(err)}`);
27933
+ this.logger.debug(`Deployment-events index unreadable, rewriting: ${describeAwsFailure(err).detail}`);
27922
27934
  }
27923
27935
  return [];
27924
27936
  }
@@ -29305,7 +29317,7 @@ function classifyFailedOp(op, stateResources, siblings = []) {
29305
29317
  if (op.physicalIdRecoveredFromError === false) return "skip-failed-superseded";
29306
29318
  if (op.physicalIdRecoveredFromError === true) {
29307
29319
  if (current) {
29308
- if (current.physicalId === op.physicalId) return "skip-failed-noop";
29320
+ if (current.physicalId === op.physicalId || current.resourceType === op.resourceType && typeof current.physicalId === "string" && samePhysicalId(op.resourceType, current.physicalId, op.physicalId)) return "skip-failed-noop";
29309
29321
  if (!isReplacedRecord(op, current) && !isProvenDistinctRecord(op, current)) return "skip-failed-mismatch";
29310
29322
  }
29311
29323
  if (stateHoldsPhysicalId(stateResources, op.resourceType, op.physicalId)) return "skip-failed-noop";
@@ -29356,14 +29368,14 @@ function replacedResourceDeleted(op, siblings) {
29356
29368
  return siblings.some((s) => s !== op && isReplacementOrphan(s) && s.logicalId === op.logicalId && s.replacedPhysicalId === op.physicalId && s.replacedResourceDeleted === true);
29357
29369
  }
29358
29370
  function stateHoldsPhysicalId(stateResources, resourceType, physicalId) {
29359
- return Object.values(stateResources).some((r) => r?.resourceType === resourceType && r.physicalId === physicalId);
29371
+ return Object.values(stateResources).some((r) => r?.resourceType === resourceType && typeof r.physicalId === "string" && samePhysicalId(resourceType, r.physicalId, physicalId));
29360
29372
  }
29361
29373
  function demoteSupersededOrphans(segments, orphans = []) {
29362
29374
  let demoted = 0;
29363
29375
  segments.forEach((segment, s) => {
29364
29376
  for (const op of segment.failedOperations ?? []) {
29365
29377
  if (op.changeType !== "CREATE" || op.physicalIdRecoveredFromError !== true) continue;
29366
- if (segments.slice(s + 1).some((t) => (t.operations ?? []).some((o) => mayOwn(o, op, true)) || (t.failedOperations ?? []).some((o) => mayOwn(o, op, false))) || segments.slice(s).some((t) => t.supersededLogicalIds?.includes(op.logicalId) === true) || orphans.some((o) => o?.logicalId === op.logicalId || o?.state?.resourceType === op.resourceType && o.state?.physicalId === op.physicalId)) {
29378
+ if (segments.slice(s + 1).some((t) => (t.operations ?? []).some((o) => mayOwn(o, op, true)) || (t.failedOperations ?? []).some((o) => mayOwn(o, op, false))) || segments.slice(s).some((t) => t.supersededLogicalIds?.includes(op.logicalId) === true) || orphans.some((o) => o?.logicalId === op.logicalId || o?.state?.resourceType === op.resourceType && holdsSameId(op.resourceType, o.state?.physicalId, op.physicalId))) {
29367
29379
  op.physicalIdRecoveredFromError = false;
29368
29380
  demoted++;
29369
29381
  }
@@ -29374,8 +29386,12 @@ function demoteSupersededOrphans(segments, orphans = []) {
29374
29386
  function mayOwn(o, orphan, completed) {
29375
29387
  if (o?.resourceType !== orphan.resourceType) return false;
29376
29388
  if (completed && o.changeType === "CREATE") return true;
29377
- if (o.physicalId === orphan.physicalId) return true;
29378
- return o.previousState?.physicalId === orphan.physicalId;
29389
+ if (holdsSameId(orphan.resourceType, o.physicalId, orphan.physicalId)) return true;
29390
+ return holdsSameId(orphan.resourceType, o.previousState?.physicalId, orphan.physicalId);
29391
+ }
29392
+ function holdsSameId(resourceType, held, orphanId) {
29393
+ if (typeof held !== "string" || typeof orphanId !== "string") return held === orphanId;
29394
+ return samePhysicalId(resourceType, held, orphanId);
29379
29395
  }
29380
29396
  function isJournaledOrphan(op) {
29381
29397
  return op.changeType === "CREATE" && typeof op.physicalIdRecoveredFromError === "boolean";
@@ -30044,7 +30060,7 @@ async function deleteMarkedRecreate(error, s) {
30044
30060
  if (madeId === void 0) return false;
30045
30061
  const shown = `${shownLogicalId(s.op.logicalId)} (${refusalResourceType(s.oldType)})`;
30046
30062
  const id = s.mask(madeId);
30047
- if (Object.values(s.stateResources).some((r) => r?.resourceType === s.oldType && r.physicalId === madeId)) return false;
30063
+ if (Object.values(s.stateResources).some((r) => r?.resourceType === s.oldType && typeof r.physicalId === "string" && samePhysicalId(s.oldType, r.physicalId, madeId))) return false;
30048
30064
  if (s.deletionPolicy === "Retain" || s.deletionPolicy === "Snapshot") {
30049
30065
  s.logger.warn(safeMsg` Rollback: the failed re-create of ${shown} made ${id} before failing; ` + safeMsg`it is left in AWS (DeletionPolicy: ${s.deletionPolicy}) and no record holds it — delete it yourself if it is not needed`);
30050
30066
  return false;
@@ -33318,6 +33334,439 @@ async function replayFailedOperations(...args) {
33318
33334
  return await withProducerRegions(() => replayProducerRegionEvidence(args[3]), () => withStackRecords(replayStackRecordsView(args[1]), () => replayFailedOperationsUnbound(...args)));
33319
33335
  }
33320
33336
 
33337
+ //#endregion
33338
+ //#region src/deployment/rollback-executor/journaled-orphans.ts
33339
+ const NONE = {
33340
+ segments: [],
33341
+ count: 0
33342
+ };
33343
+ async function loadJournaledOrphans(stateBackend, stackName, region, rollbackOrphans, logger, options = {}) {
33344
+ let segments;
33345
+ try {
33346
+ const journal = await stateBackend.loadRollbackJournal(stackName, region);
33347
+ if (!journal) return NONE;
33348
+ segments = journal.segments;
33349
+ } catch (err) {
33350
+ const detail = err instanceof Error ? err.message : String(err);
33351
+ logger.warn(safeMsg`Could not read the stack's rollback journal (${displaySafe(detail)}); ` + safeMsg`no resource it records for a failed CREATE is deleted, and ${options.unreadableOutcome ?? "a destroy that proceeds removes the journal with the state"}.`);
33352
+ return {
33353
+ ...NONE,
33354
+ unreadable: true
33355
+ };
33356
+ }
33357
+ const physicalIdOnly = (ops) => ops.filter((op) => op.changeType !== "CREATE");
33358
+ const evidence = segments.map((segment) => options.deployRunId !== void 0 && segment.reason === "nested-pending-parent" && segment.runId === options.deployRunId ? {
33359
+ ...segment,
33360
+ operations: physicalIdOnly(segment.operations)
33361
+ } : segment);
33362
+ const newer = options.newerOperations ?? [];
33363
+ if (newer.length > 0) evidence.push({ operations: physicalIdOnly(newer) });
33364
+ demoteSupersededOrphans(evidence, Array.isArray(rollbackOrphans) ? rollbackOrphans : []);
33365
+ const deployLogicalIds = new Set(newer.map((op) => op.logicalId));
33366
+ for (const segment of segments) if (options.deployRunId !== void 0 && segment.reason === "nested-pending-parent" && segment.runId === options.deployRunId) for (const op of segment.operations) deployLogicalIds.add(op.logicalId);
33367
+ const out = [];
33368
+ let count = 0;
33369
+ for (let s = segments.length - 1; s >= 0; s--) {
33370
+ const segment = segments[s];
33371
+ if (segment.reason === "nested-pending-parent") continue;
33372
+ const replay = splitImportedOps(segment.failedOperations ?? [], segment).replay;
33373
+ const ops = replay.filter(isJournaledOrphan);
33374
+ if (ops.length === 0) continue;
33375
+ const companions = replay.filter((op) => op.changeType === "UPDATE" && replacementNeverSwapped(op, ops));
33376
+ out.push({
33377
+ segment,
33378
+ ops,
33379
+ ...companions.length > 0 && { companions }
33380
+ });
33381
+ count += ops.length;
33382
+ }
33383
+ return {
33384
+ segments: out,
33385
+ count,
33386
+ deployLogicalIds
33387
+ };
33388
+ }
33389
+ function journaledOrphanLines(orphans, logger) {
33390
+ return orphans.segments.flatMap(({ ops }) => ops.map((op) => ` - ${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}) ${displacedPhysicalIdShown(op, logger) ?? "a physical id"}`));
33391
+ }
33392
+ function dropFailedCommands(stackName, region, logicalIds) {
33393
+ const ids = [...new Set(logicalIds)];
33394
+ if (ids.length === 0) return void 0;
33395
+ const built = ids.map((id) => pasteableCommand("cdkd rollback", [
33396
+ {
33397
+ value: stackName,
33398
+ hole: "stack",
33399
+ opts: { plainIdent: true }
33400
+ },
33401
+ {
33402
+ flag: "--stack-region",
33403
+ value: region,
33404
+ hole: "region",
33405
+ opts: { plainIdent: true }
33406
+ },
33407
+ {
33408
+ flag: "--drop-failed",
33409
+ value: id,
33410
+ hole: "logical-id",
33411
+ opts: { plainIdent: true }
33412
+ }
33413
+ ]));
33414
+ const idWithheld = built.some((b) => b.withheld.some((w) => w.hole === "logical-id"));
33415
+ return {
33416
+ intro: `If cdkd can never delete ${ids.length === 1 ? "it" : "one of them"} (a cause you cannot fix), check the resource by hand, then drop just its rollback-journal entry; every other entry is kept.` + withheldTargetClause(built[0], "stack", "cdkd rollback", "This stack's name") + withheldTargetClause(built[0], "region", "cdkd rollback", "This stack's region") + (idWithheld ? " A logical id that is not a plain identifier is not named in the command below; read it from the stack's rollback-journal.json (next to its state.json)." : ""),
33417
+ commands: built.map((b) => b.command)
33418
+ };
33419
+ }
33420
+ function dropFailedHint(stackName, region, logicalIds) {
33421
+ const hint = dropFailedCommands(stackName, region, logicalIds);
33422
+ if (hint === void 0) return "";
33423
+ return `\n${hint.intro}` + hint.commands.map((c) => `\nDrop with: ${c}`).join("");
33424
+ }
33425
+ function warnDropFailed(logger, stackName, region, logicalIds) {
33426
+ const hint = dropFailedCommands(stackName, region, logicalIds);
33427
+ if (hint === void 0) return;
33428
+ logger.warn(safeMsg`${hint.intro}`);
33429
+ for (const command of hint.commands) logger.warn(safeMsg`Drop with: ${command}`);
33430
+ }
33431
+ async function deleteJournaledOrphans(orphans, stateResources, stackName, ctx, options = {}) {
33432
+ const total = {
33433
+ failures: 0,
33434
+ warnings: 0,
33435
+ interrupted: false,
33436
+ handled: [],
33437
+ leftInPlace: 0,
33438
+ failedLogicalIds: []
33439
+ };
33440
+ const inlinePolicyWriters = new RollbackInlinePolicyWriters();
33441
+ const failedIds = total.failedLogicalIds;
33442
+ const record = ctx.recordEvent;
33443
+ const printing = journaledOrphanPrintingBag(orphans.segments.flatMap(({ ops, companions }) => [...companions ?? [], ...ops]), stateResources);
33444
+ const maskedCtx = record === void 0 ? ctx : {
33445
+ ...ctx,
33446
+ recordEvent: (event) => record(maskEventTextWithBoundBags(event))
33447
+ };
33448
+ for (const { segment, ops: orphanOps, companions } of orphans.segments) {
33449
+ if (options.isInterrupted?.()) {
33450
+ total.interrupted = true;
33451
+ break;
33452
+ }
33453
+ const ops = [...companions ?? [], ...orphanOps];
33454
+ const replay = () => withPrintingSecrets(printing, () => withStackName(stackName, () => replayFailedOperations(ops, stateResources, stackName, maskedCtx, {
33455
+ emitEnvelope: false,
33456
+ inlinePolicyWriters,
33457
+ forDestroy: true,
33458
+ ...options.isInterrupted && { isInterrupted: options.isInterrupted }
33459
+ })));
33460
+ const result = segment.skipPrefix === void 0 ? await replay() : await withSkipPrefix(segment.skipPrefix, replay);
33461
+ total.failures += result.failures;
33462
+ total.warnings += result.warnings;
33463
+ total.leftInPlace += result.leftInPlace;
33464
+ const pending = new Set(result.remainingFailedOps);
33465
+ for (const op of ops) if (!pending.has(op)) total.handled.push({
33466
+ segment,
33467
+ op
33468
+ });
33469
+ if (result.interrupted) {
33470
+ total.interrupted = true;
33471
+ break;
33472
+ }
33473
+ for (const op of orphanOps) if (pending.has(op)) failedIds.push(op.logicalId);
33474
+ }
33475
+ if (options.pointAtDrop !== false && failedIds.length > 0) {
33476
+ ctx.logger.warn(safeMsg`${failedIds.length} resource(s) a failed deploy of stack ${displayIdent(stackName)} created ` + "could not be deleted (see above); the rollback journal, their only record, keeps them for a re-run.");
33477
+ warnDropFailed(ctx.logger, stackName, ctx.region, failedIds);
33478
+ }
33479
+ return total;
33480
+ }
33481
+ async function settleJournaledOrphansOnSuccess(args) {
33482
+ const { stateBackend, stackName, region, stateResources, newerOperations, ctx, logger } = args;
33483
+ const stack = displayIdent(stackName);
33484
+ const newerIds = newerOperations.map((op) => op.logicalId);
33485
+ let orphans;
33486
+ try {
33487
+ orphans = await loadJournaledOrphans(stateBackend, stackName, region, args.rollbackOrphans, logger, {
33488
+ newerOperations,
33489
+ ...args.deployRunId !== void 0 && { deployRunId: args.deployRunId },
33490
+ unreadableOutcome: "the successful deploy removes the journal"
33491
+ });
33492
+ } catch (err) {
33493
+ logger.warn(safeMsg`Could not act on the rollback journal of stack ${stack}: ${errorDetail(err)}. It is kept.`);
33494
+ await markSuperseded(stateBackend, stackName, region, newerIds);
33495
+ return {
33496
+ unaddressed: 1,
33497
+ keepJournal: true
33498
+ };
33499
+ }
33500
+ if (orphans.count === 0) return {
33501
+ unaddressed: 0,
33502
+ keepJournal: false
33503
+ };
33504
+ const all = orphans.segments.flatMap(({ segment, ops }) => ops.map((op) => ({
33505
+ segment,
33506
+ op
33507
+ })));
33508
+ let kept = all;
33509
+ let failedDeletes = [];
33510
+ let leftInPlace = 0;
33511
+ if (stateResources === void 0) logger.warn(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created, but the stack's state cannot be read, so whether a record now owns them is unknown: none is deleted.`);
33512
+ else {
33513
+ logger.info(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created that no state record holds; acting on them per their DeletionPolicy before the journal is removed:`);
33514
+ for (const line of journaledOrphanLines(orphans, logger)) logger.info(line);
33515
+ try {
33516
+ const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted, ctx);
33517
+ const acting = {
33518
+ segments: orphans.segments.map(({ segment, ops }) => ({
33519
+ segment,
33520
+ ops: ops.filter((op) => !unreadable.has(op) && !tracked.has(op))
33521
+ })).filter(({ ops }) => ops.length > 0),
33522
+ count: orphans.count - unreadable.size - tracked.size
33523
+ };
33524
+ const writtenThisRun = [...orphans.deployLogicalIds ?? []].filter((id) => Object.prototype.hasOwnProperty.call(stateResources, id)).map((id) => stateResources[id]).filter((r) => r !== void 0 && r !== null && typeof r === "object");
33525
+ const outcome = await deleteJournaledOrphans(acting, { ...stateResources }, stackName, {
33526
+ ...ctx,
33527
+ writtenThisRun
33528
+ }, {
33529
+ pointAtDrop: false,
33530
+ ...args.isInterrupted && { isInterrupted: args.isInterrupted }
33531
+ });
33532
+ leftInPlace = outcome.leftInPlace;
33533
+ failedDeletes = outcome.failedLogicalIds;
33534
+ kept = all.filter(({ segment, op }) => unreadable.has(op) || !tracked.has(op) && !isHandledOrphan(outcome.handled, segment, op));
33535
+ } catch (err) {
33536
+ logger.warn(safeMsg`Acting on the journaled resources of stack ${stack} failed: ${errorDetail(err)}`);
33537
+ }
33538
+ }
33539
+ const keptOps = new Set(kept.map(({ op }) => op));
33540
+ const skipped = all.filter(({ op }) => !keptOps.has(op) && op.physicalIdRecoveredFromError === false).length;
33541
+ const clearedOrphans = all.filter(({ op }) => !keptOps.has(op));
33542
+ const cleared = [...clearedOrphans, ...orphans.segments.flatMap(({ segment, companions }) => (companions ?? []).filter((c) => replacementNeverSwapped(c, clearedOrphans.filter((o) => o.segment === segment).map((o) => o.op))).map((op) => ({
33543
+ segment,
33544
+ op
33545
+ })))];
33546
+ const stripCleared = cleared.length === 0 ? void 0 : async () => {
33547
+ try {
33548
+ await stateBackend.dropRollbackJournalFailedOperations(stackName, region, (op, segment) => isHandledOrphan(cleared, segment, op));
33549
+ } catch (err) {
33550
+ logger.warn(safeMsg`Failed to remove the settled entries from the rollback journal of stack ${stack}: ` + safeMsg`${errorDetail(err)}. A cdkd rollback or cdkd destroy could act on them again; run a ` + "successful cdkd deploy of the stack first, which settles them again.");
33551
+ }
33552
+ };
33553
+ if (kept.length === 0) return {
33554
+ unaddressed: skipped + leftInPlace,
33555
+ keepJournal: false,
33556
+ ...stripCleared && { stripCleared }
33557
+ };
33558
+ const keptIds = new Set(kept.map(({ op }) => op.logicalId));
33559
+ const supersededIds = newerIds.filter((id) => !keptIds.has(id));
33560
+ const demoted = kept.filter(({ op }) => op.physicalIdRecoveredFromError === false);
33561
+ const reduce = () => stateBackend.reduceRollbackJournalToFailedOperations(stackName, region, (op, segment) => isHandledOrphan(kept, segment, op), supersededIds, (op, segment) => isHandledOrphan(demoted, segment, op));
33562
+ let reduced = false;
33563
+ for (let attempt = 0; attempt < 2 && !reduced; attempt++) try {
33564
+ await reduce();
33565
+ reduced = true;
33566
+ } catch (err) {
33567
+ if (attempt === 1) logger.warn(safeMsg`Failed to reduce the rollback journal of stack ${stack} to its undeleted resources: ` + safeMsg`${errorDetail(err)}. The whole journal is kept.`);
33568
+ }
33569
+ if (!reduced) {
33570
+ await markSuperseded(stateBackend, stackName, region, supersededIds);
33571
+ await stripCleared?.();
33572
+ }
33573
+ logger.warn(safeMsg`${kept.length} resource(s) a failed deploy of stack ${stack} created were not deleted ` + (reduced ? "(see above). The rollback journal, their only record, is kept with just them; the next " : "(see above). The rollback journal, their only record, is kept; the next ") + "successful deploy retries.");
33574
+ warnDropFailed(logger, stackName, region, failedDeletes);
33575
+ return {
33576
+ unaddressed: kept.length + skipped + leftInPlace,
33577
+ keepJournal: true
33578
+ };
33579
+ }
33580
+ async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted, identityCtx) {
33581
+ const unreadable = /* @__PURE__ */ new Set();
33582
+ const tracked = /* @__PURE__ */ new Set();
33583
+ let interrupted = false;
33584
+ for (const { ops } of orphans.segments) for (const op of ops) {
33585
+ if (op.physicalIdRecoveredFromError !== true || !op.physicalId) continue;
33586
+ if (interrupted || isInterrupted?.()) {
33587
+ interrupted = true;
33588
+ unreadable.add(op);
33589
+ continue;
33590
+ }
33591
+ const opId = op.physicalId;
33592
+ if (Object.values(stateResources).some((r) => r?.resourceType === op.resourceType && typeof r.physicalId === "string" && samePhysicalId(op.resourceType, r.physicalId, opId))) {
33593
+ tracked.add(op);
33594
+ continue;
33595
+ }
33596
+ const hasRecord = Object.prototype.hasOwnProperty.call(stateResources, op.logicalId);
33597
+ const record = hasRecord ? stateResources[op.logicalId] : void 0;
33598
+ const recordUnderId = hasRecord && !isReplacedRecord(op, record);
33599
+ if (recordUnderId || deployLogicalIds.has(op.logicalId)) {
33600
+ const verdict = recordUnderId ? await recordIdentity(op, record, identityCtx, logger) : "unknown";
33601
+ if (verdict === "same") {
33602
+ tracked.add(op);
33603
+ continue;
33604
+ }
33605
+ if (verdict !== "different") {
33606
+ op.physicalIdRecoveredFromError = false;
33607
+ continue;
33608
+ }
33609
+ markProvenDistinctFromRecord(op, record);
33610
+ }
33611
+ const holding = await foreignHolder(op.resourceType, op.physicalId);
33612
+ if (holding === void 0) {
33613
+ const created = await createdResourceStillThere(op, identityCtx);
33614
+ if (created === "gone") {
33615
+ logger.info(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is already gone: nothing to delete.`);
33616
+ tracked.add(op);
33617
+ } else if (created === "mismatch") {
33618
+ logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: the resource now under its physical id is another ` + "one (its identity differs from the one that deploy recorded, so its name was reused).");
33619
+ op.physicalIdRecoveredFromError = false;
33620
+ } else if (created === "unproven") {
33621
+ logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: nothing proves the resource now under its physical ` + "id is the one that deploy created (it may have been deleted and its name reused).");
33622
+ op.physicalIdRecoveredFromError = false;
33623
+ }
33624
+ continue;
33625
+ }
33626
+ if (holding.kind === "held") {
33627
+ logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: ${holding.by} holds a resource of that type under ` + "the same physical id.");
33628
+ op.physicalIdRecoveredFromError = false;
33629
+ continue;
33630
+ }
33631
+ logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: ${holding.what}, so whether another stack holds it is unknown.`);
33632
+ unreadable.add(op);
33633
+ }
33634
+ return {
33635
+ unreadable,
33636
+ tracked
33637
+ };
33638
+ }
33639
+ async function recordIdentity(op, record, ctx, logger) {
33640
+ if (typeof record !== "object" || record === null || record.resourceType !== op.resourceType || typeof record.physicalId !== "string" || record.physicalId === "" || !op.physicalId) return "unknown";
33641
+ try {
33642
+ const { provider } = ctx.providerRegistry.getProviderFor({
33643
+ resourceType: op.resourceType,
33644
+ provisionedBy: op.provisionedBy
33645
+ });
33646
+ if (typeof provider.isSameResource !== "function") return "unknown";
33647
+ return await provider.isSameResource(op.physicalId, {
33648
+ physicalId: record.physicalId,
33649
+ ...record.provisionedBy !== void 0 && { provisionedBy: record.provisionedBy }
33650
+ }, op.resourceType, { expectedRegion: ctx.region });
33651
+ } catch (err) {
33652
+ logger.debug(safeMsg`Could not compare ${logicalIdShown(op.logicalId)}'s journaled resource with its state record (${displaySafe(err instanceof Error ? err.name : typeof err)}).`);
33653
+ return "unknown";
33654
+ }
33655
+ }
33656
+ async function createdResourceStillThere(op, ctx) {
33657
+ if (op.deletionPolicy === "Retain") return "proven";
33658
+ if (!orphanDeleteNeedsIdentity(op.resourceType)) return "proven";
33659
+ const physicalId = op.physicalId;
33660
+ if (!physicalId) return "unproven";
33661
+ const live = await readResourceIdentity(ctx.providerRegistry, {
33662
+ resourceType: op.resourceType,
33663
+ physicalId,
33664
+ provisionedBy: op.provisionedBy
33665
+ }, ctx.region);
33666
+ if (live === RESOURCE_NOT_FOUND) return "gone";
33667
+ const journaled = op.createdResourceIdentity;
33668
+ if (typeof journaled !== "string" || journaled === "" || typeof live !== "string") return "unproven";
33669
+ return live === journaled ? "proven" : "mismatch";
33670
+ }
33671
+ function makeForeignHolderScan(stateBackend) {
33672
+ let scan;
33673
+ const key = (type, id) => JSON.stringify([type, physicalIdKey(type, id)]);
33674
+ const run = async () => {
33675
+ const holders = /* @__PURE__ */ new Map();
33676
+ let refs;
33677
+ try {
33678
+ refs = await stateBackend.listStacks();
33679
+ } catch {
33680
+ return {
33681
+ holders,
33682
+ unreadable: "the state bucket listing (it could not be read)"
33683
+ };
33684
+ }
33685
+ let unreadable;
33686
+ await Promise.all(refs.map(async (ref) => {
33687
+ const named = (why) => safeMsg`the state record of stack ${displayIdent(ref.stackName)} (${why})`;
33688
+ if (ref.region === void 0) {
33689
+ unreadable ??= named("its region cannot be read");
33690
+ return;
33691
+ }
33692
+ const region = ref.region;
33693
+ let state;
33694
+ try {
33695
+ state = (await stateBackend.getState(ref.stackName, region))?.state;
33696
+ } catch {
33697
+ unreadable ??= named("it could not be read");
33698
+ return;
33699
+ }
33700
+ if (state === void 0) return;
33701
+ const resources = state.resources;
33702
+ if (resources !== void 0 && (typeof resources !== "object" || resources === null || Array.isArray(resources))) {
33703
+ unreadable ??= named("its resources cannot be read");
33704
+ return;
33705
+ }
33706
+ if (!hasReadableOrphans(state) || unreadableOrphanRecords(state).length > 0) {
33707
+ unreadable ??= named("its rollback-orphan records cannot be read");
33708
+ return;
33709
+ }
33710
+ const held = [...Object.values(resources ?? {}), ...(state.orphans ?? []).map((record) => record.state)];
33711
+ for (const record of held) {
33712
+ const r = record;
33713
+ if (typeof r?.resourceType !== "string" || typeof r.physicalId !== "string") continue;
33714
+ const k = key(r.resourceType, r.physicalId);
33715
+ const list = holders.get(k) ?? [];
33716
+ list.push({
33717
+ stackName: ref.stackName,
33718
+ region
33719
+ });
33720
+ holders.set(k, list);
33721
+ }
33722
+ }));
33723
+ return {
33724
+ holders,
33725
+ ...unreadable !== void 0 && { unreadable }
33726
+ };
33727
+ };
33728
+ return (self) => async (resourceType, physicalId) => {
33729
+ scan ??= run();
33730
+ const { holders, unreadable } = await scan;
33731
+ const other = (holders.get(key(resourceType, physicalId)) ?? []).find((h) => !(h.stackName === self.stackName && h.region === self.region));
33732
+ if (other) return {
33733
+ kind: "held",
33734
+ by: safeMsg`the state record of stack ${displayIdent(other.stackName)} (${displaySafe(other.region)})`
33735
+ };
33736
+ return unreadable === void 0 ? void 0 : {
33737
+ kind: "unreadable",
33738
+ what: unreadable
33739
+ };
33740
+ };
33741
+ }
33742
+ async function markSuperseded(stateBackend, stackName, region, ids) {
33743
+ try {
33744
+ await stateBackend.markRollbackJournalSuperseded(stackName, region, ids);
33745
+ } catch {}
33746
+ }
33747
+ function errorDetail(err) {
33748
+ return displaySafe(err instanceof Error ? err.message : String(err));
33749
+ }
33750
+ function isHandledOrphan(handled, segment, op) {
33751
+ return handled.some((h) => h.segment.timestamp === segment.timestamp && h.segment.runId === segment.runId && h.op.logicalId === op.logicalId && h.op.changeType === op.changeType && h.op.resourceType === op.resourceType && h.op.physicalId === op.physicalId);
33752
+ }
33753
+ function orphanKey(segment, op) {
33754
+ return JSON.stringify([
33755
+ segment.timestamp,
33756
+ segment.runId ?? null,
33757
+ op.logicalId,
33758
+ op.changeType,
33759
+ op.resourceType,
33760
+ op.physicalId ?? null
33761
+ ]);
33762
+ }
33763
+ function sameJournaledOrphans(a, b) {
33764
+ const keys = (o) => o.segments.flatMap(({ segment, ops }) => ops.map((op) => orphanKey(segment, op))).sort();
33765
+ const ka = keys(a);
33766
+ const kb = keys(b);
33767
+ return ka.length === kb.length && ka.every((k, i) => k === kb[i]);
33768
+ }
33769
+
33321
33770
  //#endregion
33322
33771
  //#region src/provisioning/nested-stack-context.ts
33323
33772
  const storage$1 = new AsyncLocalStorage();
@@ -33417,7 +33866,7 @@ function getNestedRevertRun() {
33417
33866
  return revertRunStorage.getStore();
33418
33867
  }
33419
33868
  function errorText(error) {
33420
- return displaySafe(error instanceof Error ? error.message : String(error));
33869
+ return displaySafe(describeAwsFailure(error).detail);
33421
33870
  }
33422
33871
  function isPlainRecord(value) {
33423
33872
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -33590,6 +34039,13 @@ async function revertNestedChildFromJournal(args) {
33590
34039
  ...ctx.options?.eventRecorder && { recordEvent: (event) => ctx.options.eventRecorder.record(maskEventTextWithBoundBags(event)) },
33591
34040
  finalSnapshotClients: ctx.options?.finalSnapshotClients,
33592
34041
  skipFinalSnapshot: ctx.options?.skipFinalSnapshot === true || ctx.destroyOptions?.skipFinalSnapshot === true,
34042
+ ...ctx.destroyOptions?.removeProtection === true && {
34043
+ removeProtection: true,
34044
+ foreignHolder: makeForeignHolderScan(ctx.stateBackend)({
34045
+ stackName: childStackName,
34046
+ region
34047
+ })
34048
+ },
33593
34049
  importedProducerRegions: producerRegions.regions,
33594
34050
  producerRegionsIncomplete: !producerRegions.complete,
33595
34051
  nestedChildRevert: true
@@ -33674,7 +34130,7 @@ async function planOrphanAdoption(params) {
33674
34130
  provider = params.getProvider(state.resourceType, state.provisionedBy);
33675
34131
  } catch (error) {
33676
34132
  outcome.remaining.push(record);
33677
- outcome.notices.push(`${shownId} (${shownType}) is still in AWS as ${shownPhysicalId} from an earlier rollback, but this build cannot route that type (${displayAwsMessage(error instanceof Error ? error.message : String(error))}) — cdkd is not adopting it.`);
34133
+ outcome.notices.push(`${shownId} (${shownType}) is still in AWS as ${shownPhysicalId} from an earlier rollback, but this build cannot route that type (${displayAwsMessage(describeAwsFailure(error).detail)}) — cdkd is not adopting it.`);
33678
34134
  continue;
33679
34135
  }
33680
34136
  if (!provider.import) {
@@ -33693,7 +34149,7 @@ async function planOrphanAdoption(params) {
33693
34149
  knownPhysicalId: state.physicalId
33694
34150
  });
33695
34151
  } catch (error) {
33696
- outcome.notices.push(`${shownId} (${shownType}) is recorded as left in AWS as ${shownPhysicalId}, but cdkd could not confirm it exists (${displayAwsMessage(error instanceof Error ? error.message : String(error))}) — keeping the record and not adopting it this run.`);
34152
+ outcome.notices.push(`${shownId} (${shownType}) is recorded as left in AWS as ${shownPhysicalId}, but cdkd could not confirm it exists (${displayAwsMessage(describeAwsFailure(error).detail)}) — keeping the record and not adopting it this run.`);
33697
34153
  outcome.remaining.push(record);
33698
34154
  continue;
33699
34155
  }
@@ -33746,7 +34202,7 @@ function makeSiblingClaimReader(params) {
33746
34202
  try {
33747
34203
  refs = await stateBackend.listStacks();
33748
34204
  } catch (error) {
33749
- logger.debug(`orphan adoption: could not list sibling stacks — ${displayAwsMessage(error instanceof Error ? error.message : String(error))}`);
34205
+ logger.debug(`orphan adoption: could not list sibling stacks — ${displayAwsMessage(describeAwsFailure(error).detail)}`);
33750
34206
  return claimed;
33751
34207
  }
33752
34208
  for (const ref of refs) {
@@ -33772,445 +34228,13 @@ function makeSiblingClaimReader(params) {
33772
34228
  logger.debug(safeMsg`orphan adoption: ${displayStackName(ref.stackName)} holds ${unreadable.length} ` + safeMsg`resource record(s) with no readable physical id — ${named}` + safeMsg`${rest > 0 ? ` and ${rest} more` : ""} — skipped; the claim set is a lower ` + `bound without them`);
33773
34229
  }
33774
34230
  } catch (error) {
33775
- logger.debug(`orphan adoption: skipping unreadable state for ${displayStackName(ref.stackName)} — ${displayAwsMessage(error instanceof Error ? error.message : String(error))}`);
34231
+ logger.debug(`orphan adoption: skipping unreadable state for ${displayStackName(ref.stackName)} — ${displayAwsMessage(describeAwsFailure(error).detail)}`);
33776
34232
  }
33777
34233
  }
33778
34234
  return claimed;
33779
34235
  };
33780
34236
  }
33781
34237
 
33782
- //#endregion
33783
- //#region src/deployment/rollback-executor/journaled-orphans.ts
33784
- const NONE = {
33785
- segments: [],
33786
- count: 0
33787
- };
33788
- async function loadJournaledOrphans(stateBackend, stackName, region, rollbackOrphans, logger, options = {}) {
33789
- let segments;
33790
- try {
33791
- const journal = await stateBackend.loadRollbackJournal(stackName, region);
33792
- if (!journal) return NONE;
33793
- segments = journal.segments;
33794
- } catch (err) {
33795
- const detail = err instanceof Error ? err.message : String(err);
33796
- logger.warn(safeMsg`Could not read the stack's rollback journal (${displaySafe(detail)}); ` + safeMsg`no resource it records for a failed CREATE is deleted, and ${options.unreadableOutcome ?? "a destroy that proceeds removes the journal with the state"}.`);
33797
- return {
33798
- ...NONE,
33799
- unreadable: true
33800
- };
33801
- }
33802
- const physicalIdOnly = (ops) => ops.filter((op) => op.changeType !== "CREATE");
33803
- const evidence = segments.map((segment) => options.deployRunId !== void 0 && segment.reason === "nested-pending-parent" && segment.runId === options.deployRunId ? {
33804
- ...segment,
33805
- operations: physicalIdOnly(segment.operations)
33806
- } : segment);
33807
- const newer = options.newerOperations ?? [];
33808
- if (newer.length > 0) evidence.push({ operations: physicalIdOnly(newer) });
33809
- demoteSupersededOrphans(evidence, Array.isArray(rollbackOrphans) ? rollbackOrphans : []);
33810
- const deployLogicalIds = new Set(newer.map((op) => op.logicalId));
33811
- for (const segment of segments) if (options.deployRunId !== void 0 && segment.reason === "nested-pending-parent" && segment.runId === options.deployRunId) for (const op of segment.operations) deployLogicalIds.add(op.logicalId);
33812
- const out = [];
33813
- let count = 0;
33814
- for (let s = segments.length - 1; s >= 0; s--) {
33815
- const segment = segments[s];
33816
- if (segment.reason === "nested-pending-parent") continue;
33817
- const replay = splitImportedOps(segment.failedOperations ?? [], segment).replay;
33818
- const ops = replay.filter(isJournaledOrphan);
33819
- if (ops.length === 0) continue;
33820
- const companions = replay.filter((op) => op.changeType === "UPDATE" && replacementNeverSwapped(op, ops));
33821
- out.push({
33822
- segment,
33823
- ops,
33824
- ...companions.length > 0 && { companions }
33825
- });
33826
- count += ops.length;
33827
- }
33828
- return {
33829
- segments: out,
33830
- count,
33831
- deployLogicalIds
33832
- };
33833
- }
33834
- function journaledOrphanLines(orphans, logger) {
33835
- return orphans.segments.flatMap(({ ops }) => ops.map((op) => ` - ${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}) ${displacedPhysicalIdShown(op, logger) ?? "a physical id"}`));
33836
- }
33837
- function dropFailedCommands(stackName, region, logicalIds) {
33838
- const ids = [...new Set(logicalIds)];
33839
- if (ids.length === 0) return void 0;
33840
- const built = ids.map((id) => pasteableCommand("cdkd rollback", [
33841
- {
33842
- value: stackName,
33843
- hole: "stack",
33844
- opts: { plainIdent: true }
33845
- },
33846
- {
33847
- flag: "--stack-region",
33848
- value: region,
33849
- hole: "region",
33850
- opts: { plainIdent: true }
33851
- },
33852
- {
33853
- flag: "--drop-failed",
33854
- value: id,
33855
- hole: "logical-id",
33856
- opts: { plainIdent: true }
33857
- }
33858
- ]));
33859
- const idWithheld = built.some((b) => b.withheld.some((w) => w.hole === "logical-id"));
33860
- return {
33861
- intro: `If cdkd can never delete ${ids.length === 1 ? "it" : "one of them"} (a cause you cannot fix), check the resource by hand, then drop just its rollback-journal entry; every other entry is kept.` + withheldTargetClause(built[0], "stack", "cdkd rollback", "This stack's name") + withheldTargetClause(built[0], "region", "cdkd rollback", "This stack's region") + (idWithheld ? " A logical id that is not a plain identifier is not named in the command below; read it from the stack's rollback-journal.json (next to its state.json)." : ""),
33862
- commands: built.map((b) => b.command)
33863
- };
33864
- }
33865
- function dropFailedHint(stackName, region, logicalIds) {
33866
- const hint = dropFailedCommands(stackName, region, logicalIds);
33867
- if (hint === void 0) return "";
33868
- return `\n${hint.intro}` + hint.commands.map((c) => `\nDrop with: ${c}`).join("");
33869
- }
33870
- function warnDropFailed(logger, stackName, region, logicalIds) {
33871
- const hint = dropFailedCommands(stackName, region, logicalIds);
33872
- if (hint === void 0) return;
33873
- logger.warn(safeMsg`${hint.intro}`);
33874
- for (const command of hint.commands) logger.warn(safeMsg`Drop with: ${command}`);
33875
- }
33876
- async function deleteJournaledOrphans(orphans, stateResources, stackName, ctx, options = {}) {
33877
- const total = {
33878
- failures: 0,
33879
- warnings: 0,
33880
- interrupted: false,
33881
- handled: [],
33882
- leftInPlace: 0,
33883
- failedLogicalIds: []
33884
- };
33885
- const inlinePolicyWriters = new RollbackInlinePolicyWriters();
33886
- const failedIds = total.failedLogicalIds;
33887
- const record = ctx.recordEvent;
33888
- const printing = journaledOrphanPrintingBag(orphans.segments.flatMap(({ ops, companions }) => [...companions ?? [], ...ops]), stateResources);
33889
- const maskedCtx = record === void 0 ? ctx : {
33890
- ...ctx,
33891
- recordEvent: (event) => record(maskEventTextWithBoundBags(event))
33892
- };
33893
- for (const { segment, ops: orphanOps, companions } of orphans.segments) {
33894
- if (options.isInterrupted?.()) {
33895
- total.interrupted = true;
33896
- break;
33897
- }
33898
- const ops = [...companions ?? [], ...orphanOps];
33899
- const replay = () => withPrintingSecrets(printing, () => withStackName(stackName, () => replayFailedOperations(ops, stateResources, stackName, maskedCtx, {
33900
- emitEnvelope: false,
33901
- inlinePolicyWriters,
33902
- forDestroy: true,
33903
- ...options.isInterrupted && { isInterrupted: options.isInterrupted }
33904
- })));
33905
- const result = segment.skipPrefix === void 0 ? await replay() : await withSkipPrefix(segment.skipPrefix, replay);
33906
- total.failures += result.failures;
33907
- total.warnings += result.warnings;
33908
- total.leftInPlace += result.leftInPlace;
33909
- const pending = new Set(result.remainingFailedOps);
33910
- for (const op of ops) if (!pending.has(op)) total.handled.push({
33911
- segment,
33912
- op
33913
- });
33914
- if (result.interrupted) {
33915
- total.interrupted = true;
33916
- break;
33917
- }
33918
- for (const op of orphanOps) if (pending.has(op)) failedIds.push(op.logicalId);
33919
- }
33920
- if (options.pointAtDrop !== false && failedIds.length > 0) {
33921
- ctx.logger.warn(safeMsg`${failedIds.length} resource(s) a failed deploy of stack ${displayIdent(stackName)} created ` + "could not be deleted (see above); the rollback journal, their only record, keeps them for a re-run.");
33922
- warnDropFailed(ctx.logger, stackName, ctx.region, failedIds);
33923
- }
33924
- return total;
33925
- }
33926
- async function settleJournaledOrphansOnSuccess(args) {
33927
- const { stateBackend, stackName, region, stateResources, newerOperations, ctx, logger } = args;
33928
- const stack = displayIdent(stackName);
33929
- const newerIds = newerOperations.map((op) => op.logicalId);
33930
- let orphans;
33931
- try {
33932
- orphans = await loadJournaledOrphans(stateBackend, stackName, region, args.rollbackOrphans, logger, {
33933
- newerOperations,
33934
- ...args.deployRunId !== void 0 && { deployRunId: args.deployRunId },
33935
- unreadableOutcome: "the successful deploy removes the journal"
33936
- });
33937
- } catch (err) {
33938
- logger.warn(safeMsg`Could not act on the rollback journal of stack ${stack}: ${errorDetail(err)}. It is kept.`);
33939
- await markSuperseded(stateBackend, stackName, region, newerIds);
33940
- return {
33941
- unaddressed: 1,
33942
- keepJournal: true
33943
- };
33944
- }
33945
- if (orphans.count === 0) return {
33946
- unaddressed: 0,
33947
- keepJournal: false
33948
- };
33949
- const all = orphans.segments.flatMap(({ segment, ops }) => ops.map((op) => ({
33950
- segment,
33951
- op
33952
- })));
33953
- let kept = all;
33954
- let failedDeletes = [];
33955
- let leftInPlace = 0;
33956
- if (stateResources === void 0) logger.warn(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created, but the stack's state cannot be read, so whether a record now owns them is unknown: none is deleted.`);
33957
- else {
33958
- logger.info(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created that no state record holds; acting on them per their DeletionPolicy before the journal is removed:`);
33959
- for (const line of journaledOrphanLines(orphans, logger)) logger.info(line);
33960
- try {
33961
- const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted, ctx);
33962
- const acting = {
33963
- segments: orphans.segments.map(({ segment, ops }) => ({
33964
- segment,
33965
- ops: ops.filter((op) => !unreadable.has(op) && !tracked.has(op))
33966
- })).filter(({ ops }) => ops.length > 0),
33967
- count: orphans.count - unreadable.size - tracked.size
33968
- };
33969
- const writtenThisRun = [...orphans.deployLogicalIds ?? []].filter((id) => Object.prototype.hasOwnProperty.call(stateResources, id)).map((id) => stateResources[id]).filter((r) => r !== void 0 && r !== null && typeof r === "object");
33970
- const outcome = await deleteJournaledOrphans(acting, { ...stateResources }, stackName, {
33971
- ...ctx,
33972
- writtenThisRun
33973
- }, {
33974
- pointAtDrop: false,
33975
- ...args.isInterrupted && { isInterrupted: args.isInterrupted }
33976
- });
33977
- leftInPlace = outcome.leftInPlace;
33978
- failedDeletes = outcome.failedLogicalIds;
33979
- kept = all.filter(({ segment, op }) => unreadable.has(op) || !tracked.has(op) && !isHandledOrphan(outcome.handled, segment, op));
33980
- } catch (err) {
33981
- logger.warn(safeMsg`Acting on the journaled resources of stack ${stack} failed: ${errorDetail(err)}`);
33982
- }
33983
- }
33984
- const keptOps = new Set(kept.map(({ op }) => op));
33985
- const skipped = all.filter(({ op }) => !keptOps.has(op) && op.physicalIdRecoveredFromError === false).length;
33986
- const clearedOrphans = all.filter(({ op }) => !keptOps.has(op));
33987
- const cleared = [...clearedOrphans, ...orphans.segments.flatMap(({ segment, companions }) => (companions ?? []).filter((c) => replacementNeverSwapped(c, clearedOrphans.filter((o) => o.segment === segment).map((o) => o.op))).map((op) => ({
33988
- segment,
33989
- op
33990
- })))];
33991
- const stripCleared = cleared.length === 0 ? void 0 : async () => {
33992
- try {
33993
- await stateBackend.dropRollbackJournalFailedOperations(stackName, region, (op, segment) => isHandledOrphan(cleared, segment, op));
33994
- } catch (err) {
33995
- logger.warn(safeMsg`Failed to remove the settled entries from the rollback journal of stack ${stack}: ` + safeMsg`${errorDetail(err)}. A cdkd rollback or cdkd destroy could act on them again; run a ` + "successful cdkd deploy of the stack first, which settles them again.");
33996
- }
33997
- };
33998
- if (kept.length === 0) return {
33999
- unaddressed: skipped + leftInPlace,
34000
- keepJournal: false,
34001
- ...stripCleared && { stripCleared }
34002
- };
34003
- const keptIds = new Set(kept.map(({ op }) => op.logicalId));
34004
- const supersededIds = newerIds.filter((id) => !keptIds.has(id));
34005
- const demoted = kept.filter(({ op }) => op.physicalIdRecoveredFromError === false);
34006
- const reduce = () => stateBackend.reduceRollbackJournalToFailedOperations(stackName, region, (op, segment) => isHandledOrphan(kept, segment, op), supersededIds, (op, segment) => isHandledOrphan(demoted, segment, op));
34007
- let reduced = false;
34008
- for (let attempt = 0; attempt < 2 && !reduced; attempt++) try {
34009
- await reduce();
34010
- reduced = true;
34011
- } catch (err) {
34012
- if (attempt === 1) logger.warn(safeMsg`Failed to reduce the rollback journal of stack ${stack} to its undeleted resources: ` + safeMsg`${errorDetail(err)}. The whole journal is kept.`);
34013
- }
34014
- if (!reduced) {
34015
- await markSuperseded(stateBackend, stackName, region, supersededIds);
34016
- await stripCleared?.();
34017
- }
34018
- logger.warn(safeMsg`${kept.length} resource(s) a failed deploy of stack ${stack} created were not deleted ` + (reduced ? "(see above). The rollback journal, their only record, is kept with just them; the next " : "(see above). The rollback journal, their only record, is kept; the next ") + "successful deploy retries.");
34019
- warnDropFailed(logger, stackName, region, failedDeletes);
34020
- return {
34021
- unaddressed: kept.length + skipped + leftInPlace,
34022
- keepJournal: true
34023
- };
34024
- }
34025
- async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted, identityCtx) {
34026
- const unreadable = /* @__PURE__ */ new Set();
34027
- const tracked = /* @__PURE__ */ new Set();
34028
- let interrupted = false;
34029
- for (const { ops } of orphans.segments) for (const op of ops) {
34030
- if (op.physicalIdRecoveredFromError !== true || !op.physicalId) continue;
34031
- if (interrupted || isInterrupted?.()) {
34032
- interrupted = true;
34033
- unreadable.add(op);
34034
- continue;
34035
- }
34036
- if (Object.values(stateResources).some((r) => r?.resourceType === op.resourceType && r.physicalId === op.physicalId)) {
34037
- tracked.add(op);
34038
- continue;
34039
- }
34040
- const hasRecord = Object.prototype.hasOwnProperty.call(stateResources, op.logicalId);
34041
- const record = hasRecord ? stateResources[op.logicalId] : void 0;
34042
- const recordUnderId = hasRecord && !isReplacedRecord(op, record);
34043
- if (recordUnderId || deployLogicalIds.has(op.logicalId)) {
34044
- const verdict = recordUnderId ? await recordIdentity(op, record, identityCtx, logger) : "unknown";
34045
- if (verdict === "same") {
34046
- tracked.add(op);
34047
- continue;
34048
- }
34049
- if (verdict !== "different") {
34050
- op.physicalIdRecoveredFromError = false;
34051
- continue;
34052
- }
34053
- markProvenDistinctFromRecord(op, record);
34054
- }
34055
- const holding = await foreignHolder(op.resourceType, op.physicalId);
34056
- if (holding === void 0) {
34057
- const created = await createdResourceStillThere(op, identityCtx);
34058
- if (created === "gone") {
34059
- logger.info(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is already gone: nothing to delete.`);
34060
- tracked.add(op);
34061
- } else if (created === "mismatch") {
34062
- logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: the resource now under its physical id is another ` + "one (its identity differs from the one that deploy recorded, so its name was reused).");
34063
- op.physicalIdRecoveredFromError = false;
34064
- } else if (created === "unproven") {
34065
- logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: nothing proves the resource now under its physical ` + "id is the one that deploy created (it may have been deleted and its name reused).");
34066
- op.physicalIdRecoveredFromError = false;
34067
- }
34068
- continue;
34069
- }
34070
- if (holding.kind === "held") {
34071
- logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: ${holding.by} holds a resource of that type under ` + "the same physical id.");
34072
- op.physicalIdRecoveredFromError = false;
34073
- continue;
34074
- }
34075
- logger.warn(safeMsg`${logicalIdShown(op.logicalId)} (${resourceTypeShown(op.resourceType)}), which a failed deploy ` + safeMsg`of stack ${stack} created, is not deleted: ${holding.what}, so whether another stack holds it is unknown.`);
34076
- unreadable.add(op);
34077
- }
34078
- return {
34079
- unreadable,
34080
- tracked
34081
- };
34082
- }
34083
- async function recordIdentity(op, record, ctx, logger) {
34084
- if (typeof record !== "object" || record === null || record.resourceType !== op.resourceType || typeof record.physicalId !== "string" || record.physicalId === "" || !op.physicalId) return "unknown";
34085
- try {
34086
- const { provider } = ctx.providerRegistry.getProviderFor({
34087
- resourceType: op.resourceType,
34088
- provisionedBy: op.provisionedBy
34089
- });
34090
- if (typeof provider.isSameResource !== "function") return "unknown";
34091
- return await provider.isSameResource(op.physicalId, {
34092
- physicalId: record.physicalId,
34093
- ...record.provisionedBy !== void 0 && { provisionedBy: record.provisionedBy }
34094
- }, op.resourceType, { expectedRegion: ctx.region });
34095
- } catch (err) {
34096
- logger.debug(safeMsg`Could not compare ${logicalIdShown(op.logicalId)}'s journaled resource with its state record (${displaySafe(err instanceof Error ? err.name : typeof err)}).`);
34097
- return "unknown";
34098
- }
34099
- }
34100
- async function createdResourceStillThere(op, ctx) {
34101
- if (op.deletionPolicy === "Retain") return "proven";
34102
- if (!orphanDeleteNeedsIdentity(op.resourceType)) return "proven";
34103
- const physicalId = op.physicalId;
34104
- if (!physicalId) return "unproven";
34105
- const live = await readResourceIdentity(ctx.providerRegistry, {
34106
- resourceType: op.resourceType,
34107
- physicalId,
34108
- provisionedBy: op.provisionedBy
34109
- }, ctx.region);
34110
- if (live === RESOURCE_NOT_FOUND) return "gone";
34111
- const journaled = op.createdResourceIdentity;
34112
- if (typeof journaled !== "string" || journaled === "" || typeof live !== "string") return "unproven";
34113
- return live === journaled ? "proven" : "mismatch";
34114
- }
34115
- function makeForeignHolderScan(stateBackend) {
34116
- let scan;
34117
- const key = (type, id) => JSON.stringify([type, id]);
34118
- const run = async () => {
34119
- const holders = /* @__PURE__ */ new Map();
34120
- let refs;
34121
- try {
34122
- refs = await stateBackend.listStacks();
34123
- } catch {
34124
- return {
34125
- holders,
34126
- unreadable: "the state bucket listing (it could not be read)"
34127
- };
34128
- }
34129
- let unreadable;
34130
- await Promise.all(refs.map(async (ref) => {
34131
- const named = (why) => safeMsg`the state record of stack ${displayIdent(ref.stackName)} (${why})`;
34132
- if (ref.region === void 0) {
34133
- unreadable ??= named("its region cannot be read");
34134
- return;
34135
- }
34136
- const region = ref.region;
34137
- let state;
34138
- try {
34139
- state = (await stateBackend.getState(ref.stackName, region))?.state;
34140
- } catch {
34141
- unreadable ??= named("it could not be read");
34142
- return;
34143
- }
34144
- if (state === void 0) return;
34145
- const resources = state.resources;
34146
- if (resources !== void 0 && (typeof resources !== "object" || resources === null || Array.isArray(resources))) {
34147
- unreadable ??= named("its resources cannot be read");
34148
- return;
34149
- }
34150
- if (!hasReadableOrphans(state) || unreadableOrphanRecords(state).length > 0) {
34151
- unreadable ??= named("its rollback-orphan records cannot be read");
34152
- return;
34153
- }
34154
- const held = [...Object.values(resources ?? {}), ...(state.orphans ?? []).map((record) => record.state)];
34155
- for (const record of held) {
34156
- const r = record;
34157
- if (typeof r?.resourceType !== "string" || typeof r.physicalId !== "string") continue;
34158
- const k = key(r.resourceType, r.physicalId);
34159
- const list = holders.get(k) ?? [];
34160
- list.push({
34161
- stackName: ref.stackName,
34162
- region
34163
- });
34164
- holders.set(k, list);
34165
- }
34166
- }));
34167
- return {
34168
- holders,
34169
- ...unreadable !== void 0 && { unreadable }
34170
- };
34171
- };
34172
- return (self) => async (resourceType, physicalId) => {
34173
- scan ??= run();
34174
- const { holders, unreadable } = await scan;
34175
- const other = (holders.get(key(resourceType, physicalId)) ?? []).find((h) => !(h.stackName === self.stackName && h.region === self.region));
34176
- if (other) return {
34177
- kind: "held",
34178
- by: safeMsg`the state record of stack ${displayIdent(other.stackName)} (${displaySafe(other.region)})`
34179
- };
34180
- return unreadable === void 0 ? void 0 : {
34181
- kind: "unreadable",
34182
- what: unreadable
34183
- };
34184
- };
34185
- }
34186
- async function markSuperseded(stateBackend, stackName, region, ids) {
34187
- try {
34188
- await stateBackend.markRollbackJournalSuperseded(stackName, region, ids);
34189
- } catch {}
34190
- }
34191
- function errorDetail(err) {
34192
- return displaySafe(err instanceof Error ? err.message : String(err));
34193
- }
34194
- function isHandledOrphan(handled, segment, op) {
34195
- return handled.some((h) => h.segment.timestamp === segment.timestamp && h.segment.runId === segment.runId && h.op.logicalId === op.logicalId && h.op.changeType === op.changeType && h.op.resourceType === op.resourceType && h.op.physicalId === op.physicalId);
34196
- }
34197
- function orphanKey(segment, op) {
34198
- return JSON.stringify([
34199
- segment.timestamp,
34200
- segment.runId ?? null,
34201
- op.logicalId,
34202
- op.changeType,
34203
- op.resourceType,
34204
- op.physicalId ?? null
34205
- ]);
34206
- }
34207
- function sameJournaledOrphans(a, b) {
34208
- const keys = (o) => o.segments.flatMap(({ segment, ops }) => ops.map((op) => orphanKey(segment, op))).sort();
34209
- const ka = keys(a);
34210
- const kb = keys(b);
34211
- return ka.length === kb.length && ka.every((k, i) => k === kb[i]);
34212
- }
34213
-
34214
34238
  //#endregion
34215
34239
  //#region src/deployment/deploy-engine/rollback.ts
34216
34240
  function redactOperationsForJournal(operations) {
@@ -35755,8 +35779,8 @@ function buildResolverContext(base, stackName) {
35755
35779
  ...base.redactedAttributeReads && { redactedAttributeReads: base.redactedAttributeReads }
35756
35780
  };
35757
35781
  }
35758
- function printNestedStackReadsOnly(context, resourceType) {
35759
- if (resourceType === "AWS::CloudFormation::Stack") context.printingSecrets = /* @__PURE__ */ new Map();
35782
+ function printNestedStackReadsOnly(context, resourceType, rowPrintingRegistry) {
35783
+ if (resourceType === "AWS::CloudFormation::Stack") context.printingSecrets = rowPrintingRegistry;
35760
35784
  }
35761
35785
  function getAttTargetOf(node) {
35762
35786
  if (node === null || typeof node !== "object" || Array.isArray(node)) return void 0;
@@ -35824,7 +35848,7 @@ async function provisionCreate(logicalId, change, stateResources, stackName, tem
35824
35848
  if (context.recordedSecretValues) this.perResourceSecrets.set(logicalId, context.recordedSecretValues);
35825
35849
  const noEchoOverrides = await this.noEchoAttributeOverridesFor(desiredProps, stateResources, stackName);
35826
35850
  if (noEchoOverrides !== void 0) context.noEchoAttributeOverrides = noEchoOverrides;
35827
- printNestedStackReadsOnly(context, resourceType);
35851
+ printNestedStackReadsOnly(context, resourceType, this.secretNameBagFor(logicalId));
35828
35852
  const resolvedProps = await this.resolver.resolve(desiredProps, context);
35829
35853
  this.noteSecretNamedRecord(logicalId, {
35830
35854
  resourceType,
@@ -36036,7 +36060,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
36036
36060
  this.perResourceSecrets.set(logicalId, updateSecrets);
36037
36061
  const noEchoOverrides = await this.noEchoAttributeOverridesFor(desiredProps, stateResources, stackName);
36038
36062
  if (noEchoOverrides !== void 0) context.noEchoAttributeOverrides = noEchoOverrides;
36039
- printNestedStackReadsOnly(context, resourceType);
36063
+ printNestedStackReadsOnly(context, resourceType, this.secretNameBagFor(logicalId));
36040
36064
  const resolvedProps = await this.resolver.resolve(desiredProps, context);
36041
36065
  this.noteSecretNamedRecord(logicalId, {
36042
36066
  resourceType,
@@ -39559,5 +39583,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
39559
39583
  DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
39560
39584
 
39561
39585
  //#endregion
39562
- export { recordDisplacedSkips as $, noEchoLeavesOf as $a, refuseMalformedResourcesForDeploy as $i, withPrintingSecrets as $n, importableOutputs as $o, passedParameterClassesOf as $r, resolveStateBucketWithDefault as $s, secretNamePrintingBag as $t, gray as A, coerceCfnBoolean as Aa, resolveBucketRegion as Ac, malformedScrubResourceEntriesRefusalMessage as Ai, findDestructiveChanges as An, recordMaskOnlyValue as Ao, envCredentialsAreAssumedRole as Ar, formatDockerLoginError as As, removeProtectionTypeList as At, isHandledOrphan as B, prefetchCreateOnlyPropertyPaths as Ba, refuseMalformedOutputs as Bi, planTagDiff as Bn, isSingleDynamicReferenceToken as Bo, getAccountInfo as Br, escapeRegExp$3 as Bs, findNestedStackTypeChanges as Bt, recordedProtectionNote as C, isStatefulRecreateTargetSync as Ca, ownValue as Cc, malformedOrphansWarning as Ci, collectPublishedOutputNames as Cn, pathCrossesDottedKey as Co, assertSendableRoleArn as Cr, buildDockerImage as Cs, INDEX_SETTLE_POLL_INTERVAL_MS as Ct, createReadOnlyAttributeHealerFactory as D, isWarmThroughputDecrease as Da, renderAssemblyPathEscape as Dc, malformedResourceEntriesWarning as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, identityKeyFor as Do, AWS_CREDENTIAL_ENV_KEYS as Dr, describeDockerFailure as Ds, S3_AUTO_DELETE_OBJECTS_TAG as Dt, formatResourceLine as E, coerceWarmThroughput as Ea, displayAssemblyPath as Ec, malformedRenderedContainersWarning as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, recoverMaskedOutput as Eo, sendableAssumeRoleCommand as Er, describeDockerExecFailure as Es, ECR_AUTO_DELETE_IMAGES_TAG as Et, namesAnyDeclaredParameter as F, readConfigString as Fa, refuseMalformedOrphanRecords as Fi, reserveStackCreateToken as Fn, STATE_SOURCED_BASELINE_RULES as Fo, s3BucketRegionalDomainName as Fr, redactDockerArgvValues as Fs, isReplacementOrphan as Ft, makeSiblingClaimReader as G, lambdaFunctionNameForMask as Ga, refuseMalformedResourceEntriesForDestroy as Gi, definedAttributes as Gn, splitImportedOps as Go, keepsSecretReferenceToken as Gr, synthesisStatusMessage as Gs, redactedDeleteAddressFields as Gt, loadJournaledOrphans as H, describeTypeWithThrottleRetry as Ha, refuseMalformedResourceAttributesForOrphan as Hi, refuseMalformedDesiredTags as Hn, isLockInfoExpired as Ho, carriesDynamicReference as Hr, AssetManifestLoader as Hs, inheritProducerRegions as Ht, reachableDivergentParameters as I, replayWarn as Ia, refuseMalformedOrphanRecordsForDestroy as Ii, withCreateTokenLedger as In, STATE_SOURCED_CROSS_GENERATION_RULES as Io, s3BucketWebsiteUrl as Ir, redactedDockerCause as Is, planFailedOps as It, displacedOpClause as J, TemplateParser as Ja, refuseMalformedResourceEntriesForOrphan as Ji, ProviderRegistry as Jn, exportNamesCarriedFrom as Jo, isStalePlaceholderArnAttribute as Jr, loadCdkJson as Js, updatePartialReason as Jt, planOrphanAdoption as K, sameLambdaFunctionAddress as Ka, refuseMalformedResourceEntriesForImport as Ki, stringifyIfAssigned as Kn, acceptedCreateOnlyDropsOf as Ko, AWS_NO_VALUE as Kr, getDefaultStateBucketName as Ks, redactedDeleteAddressSkip as Kt, resourcesNamingDeclaredParameter as L, requireConfigArray as La, refuseMalformedOrphans as Li, acquireIdempotencyToken as Ln, STATE_SOURCED_READBACK_RULES as Lo, coerceParameterTypedValue as Lr, runDockerForeground as Ls, planRollback as Lt, red as M, configBooleanRefusal as Ma, previewableOrphanRecords as Mi, RollbackInlinePolicyWriters as Mn, recordNoEchoAttributeValues as Mo, s3BucketArn as Mr, isDockerClientEnvKey as Ms, recordAfterRollbackUpdate as Mt, yellow as N, configIntegerRefusal as Na, refuseDivergentRecordRegionForDestroy as Ni, earliestDefined as Nn, recordProvenPublicExpression as No, s3BucketDomainName as Nr, isMalformedEnvKey as Ns, demoteSupersededOrphans as Nt, bold as O, toCfnInteger as Oa, resolveAssemblyPath as Oc, malformedResourcePropertiesWarning as Oi, maskingRetryLogger as On, carriesSecretMask as Oo, applyCallerIdentityCredentials as Or, dockerSpawnEnvWithSensitive as Os, hasCdkAutoDeleteTag as Ot, computeParameterTaint as P, configStringRefusal as Pa, refuseMalformedNestedChildOutputs as Pi, ledgerForStack as Pn, wholeStringLeavesOf as Po, s3BucketDualStackDomainName as Pr, partitionSensitiveEnv as Ps, isJournaledOrphan as Pt, nestedChildStackName as Q, maskedLeafCoordinatesOf as Qa, refuseMalformedResourcePropertiesForOrphan as Qi, getCurrentResourceSecrets as Qn, importableOutputKeys as Qo, parameterInputsFor as Qr, resolveSkipPrefix as Qs, orphanRecordsPrintingBag as Qt, deleteJournaledOrphans as R, requireConfigObject as Ra, refuseMalformedOrphansForDestroy as Ri, DBPROXY_TAGS_WHAT as Rn, TEMPLATE_SOURCED_RULES as Ro, isUnboundTemplateParameter as Rr, runDockerStreaming as Rs, replacementNeverSwapped as Rt, recordedProtectionEvidence as S, isStatefulRecreateTargetForReplace as Sa, nullPrototypeRecord as Sc, malformedOrphansRefusalMessage as Si, collectDeclaredOutputNames as Sn, isUncertifiedBaselineMaskPosition as So, assertFlagRoleArn as Sr, buildDenyExternalAccessPolicy as Ss, DELETE_INDEX_WAIT_PROCEED_NOTE as St, markRefusedBeforeApplying as T, WARM_THROUGHPUT_MEMBERS as Ta, describeFileReadFailure as Tc, malformedOutputsWarning as Ti, bindingSkippedOutputs as Tn, recordNestedStackParameterExpressions as To, isIamRoleArn as Tr, describeDockerCapturedOutput as Ts, waitForIndexesSettled as Tt, makeForeignHolderScan as U, withRetry as Ua, refuseMalformedResourceEntries as Ui, tagMapAsList as Un, S3StateBackend as Uo, carriesFetchableDynamicReference as Ur, getDockerImageBySourceHash as Us, REDACTED_DELETE_ADDRESS_SKIP_REASON as Ut, journaledOrphanLines as V, templateResourceTypes as Va, refuseMalformedOutputsForDestroy as Vi, readTagList as Vn, LockManager as Vo, isImpossibleEmptyStoredAttribute as Vr, stripControlChars as Vs, getCurrentProducerRegions as Vt, sameJournaledOrphans as W, canonicalLambdaFunctionName as Wa, refuseMalformedResourceEntriesForDeploy as Wi, tagPlanWarning as Wn, rebuildClientForBucketRegion as Wo, isNamelessDynamicReferenceError as Wr, Synthesizer as Ws, isRedactedRecordedValue as Wt, dropSettledNestedJournals as X, maskReadbackAtCoordinates as Xa, refuseMalformedResourcePropertiesForDrift as Xi, wouldReturnToSdkProvider as Xn, hasReasonlessBaselineRefusal as Xo, parseWebACLArn as Xr, resolveAutoAssetStorage as Xs, journaledOrphanPrintingBag as Xt, displacedPhysicalIdShown as Y, isMarkedCoordinate as Ya, refuseMalformedResourcePropertiesForDestroy as Yi, ccBrokenReason as Yn, hasReadableExportSet as Yo, refStateLookupFromResource as Yr, resolveApp as Ys, completedReplayEntries as Yt, getNestedRevertRun as Z, maskWholeValue as Za, refuseMalformedResourcePropertiesForExport as Zi, isCustomResourceType as Zn, hasUnverifiableParameterRefusal as Zo, withSharedDrainBudget as Zr, resolveCaptureObservedState as Zs, maskEventTextWithBoundBags as Zt, makeCanonicalizePropertiesFn as _, NO_CC_HANDLERS_REASON as _a, StageLoadError as _c, malformedLocalResourceEntriesWarning as _i, secretBearingStateKeyWarning as _n, markSameGenerationBag as _o, IntrinsicFunctionResolver as _r, isCrossRegionRedirect as _s, beginDeleteWait as _t, findNestedTemplateTreeDefect as a, repairMalformedOutputsForReadOnly as aa, CFN_TEMPLATE_BODY_LIMIT as ac, accountArgs as ai, createPreDeleteFinalSnapshot as an, createUnionSecretMasker as ao, deleteSkipReason as ar, isSensitiveAttributeName as as, replayFailedOperations as at, noEchoParameterNamesOf as b, shownType as ba, hasOwnKey as bc, malformedOrphanRecordsWarning as bi, isWholeDynamicReferenceValue as bn, DYNAMIC_REFERENCE_TOKEN_SCAN as bo, regionLessSecretName as br, validateAssetBucketName as bs, resolveDynamoDbDeleteBudgetClock as bt, renderNestedTemplateTreeDefect as c, repairMalformedResourcesForReadOnly as ca, findLargeInlineResources as cc, hasReadableOrphans as ci, refusesFinalSnapshot as cn, logOnlyValueCount as co, markWaitAbandoned as cr, buildAssetRedirectMap as cs, destroyStackRecordsView as ct, conditionInputsFrom as d, unreadableResourceEntries as da, decodeListingKey as dc, isReadableOrphanRecord as di, DeploymentEventsStore as dn, recordLogOnlyValue as do, isTerminationProtectionPropagationError as dr, rewriteTemplateAssetReferences as ds, PROTECTION_PROPERTY_BY_TYPE as dt, refuseMalformedResourcesForDestroy as ea, resolveStateBucketWithDefaultAndSource as ec, JSON_LISTING_HOLE_VALUE as ei, stateSecretNameNeedles as en, noEchoOutputsComparison as eo, CloudControlProvider as er, isReadableBag as es, revertNestedChildFromJournal as et, parentSuppliedValues as f, withheldAccountClause as fa, expectedOwnerParam as fc, isReadableResourceEntry as fi, extractDeploymentEventError as fn, shareLogOnlyValues as fo, observeThenDisableInstanceApiTermination as fr, AssetModeResolver as fs, isProtectionValueActive as ft, mergeNoChangeOutputs as g, withoutSilentDropProperties as ga, AssemblyReader as gc, malformedLocalOutputsWarning as gi, secretBearing as gn, maskSecretsInText as go, INTRINSIC_KEYS as gr, getBootstrapMarkerKey as gs, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as gt, keptWholeReasonText as h, unwrittenCreateOnlyReplacement as ha, derivePartitionAndUrlSuffix as hc, malformedExportSourceWarning as hi, exportAliasCollisionScrubWarning as hn, maskSecretsInError as ho, DiffCalculator as hr, ensureAssetStorage as hs, DynamoDBGlobalTableProvider as ht, childTemplateLoader as i, repairMalformedOrphansForReadOnly as ia, ssmResolvedValueType as ic, UNREADABLE_RESOURCES_MAP_ROW as ii, ccRoutedFinalSnapshotError as in, carryLogOnlyValues as io, deleteIndeterminateGuards as ir, AssetPublisher as is, withNestedStackContext as it, green as j, coerceCfnInteger as ja, malformedStateRefusalMessage as ji, formatDestructiveChange as jn, recordMaskOnlyValuesIn as jo, isSettledInstanceState as jr, getDockerCmd as js, orphanDeleteNeedsIdentity as jt, cyan as k, toFiniteNumber as ka, clearBucketRegionCache as kc, malformedResourcesWarning as ki, constructPathOf as kn, provenPublicValue as ko, callerEnvCredentials as kr, finchSecretArgvRefusal as ks, isTruthyCfnBoolean as kt, templateIdentity as l, unpreviewableOrphanRecords as la, uploadCfnTemplate as lc, hasReadableOutputs as li, unsupportedFinalSnapshotError as ln, printingCorpusOf as lo, disableInstanceApiTermination as lr, createAssetRedirectResolver as ls, getStackRecords as lt, isSecretBearingReferenceString as m, findSilentDropProperties as ma, canonicalizeRegion as mc, malformedExportNamesWarning as mi, displayTextOrWithheld as mn, errorCauseChain as mo, reEnableInstanceApiTermination as mr, assertAssetBucketRegion as ms, readProtection as mt, IMPLICIT_DELETE_DEPENDENCIES as n, refuseMalformedState as na, stateBucketExistenceConfirmed as nc, STATE_RESOURCES_MALFORMED as ni, PRE_DELETE_SNAPSHOT_TYPES as nn, readsNoEchoSource as no, unchangedBehindSecretReference as nr, orphansCarriedFrom as ns, withNestedRevertRun as nt, isAbsoluteAssetPath as o, repairMalformedResourceEntriesForReadOnly as oa, CFN_TEMPLATE_URL_LIMIT as oc, deployRefusesOrphanRowsReason as oi, effectiveDeletionPolicy as on, hasMaskableValues as oo, withIndeterminateGuard as or, stringifyValue as os, replayRollback as ot, readRecordedConditionVerdicts as p, findActionableSilentDrops as pa, PARTITION_TABLE as pc, malformedDriftResourcePropertiesWarning as pi, WITHHELD_NAME_DISPLAY as pn, createSecretMasker as po, reDisableInstanceApiTermination as pr, BOOTSTRAP_MARKER_PREFIX as ps, perType as pt, NESTED_PENDING_PARENT_REASON as q, DagBuilder as qa, refuseMalformedResourceEntriesForImportSave as qi, CC_BROKEN_REASON as qn, describeRegionValueKind as qo, cfnRefValueFromPhysicalId as qr, getLegacyStateBucketName as qs, updatePartialMessage as qt, computeImplicitDeleteEdges as r, repairMalformedOrphanRecordsForReadOnly as ra, warnDeprecatedNoPrefixCliFlag as rc, UNREADABLE_ORPHANS_CONTAINER_ROW as ri, buildFinalSnapshotIdentifier as rn, liveMatchesUnresolvedTokenFrame as ro, UNSPECIFIED_SKIP_REASON as rr, shouldRetainResource as rs, getCurrentNestedStackContext as rt, listNestedTemplateRows as s, repairMalformedResourcePropertiesForReadOnly as sa, MIGRATE_TMP_PREFIX as sc, displayLogicalId as si, isFinalSnapshotError as sn, literalSplitDelimitersOf as so, isWaitAbandonedError as sr, WorkGraph as ss, awaitInFlightSibling as st, DeployEngine as t, refuseMalformedResourcesForExport as ta, resolveUseCdkBootstrapAssets as tc, STATE_REGION_DIVERGED as ti, ATOMIC_FINAL_SNAPSHOT_TYPES as tn, passedNoEchoParametersOf as to, slowCcOperationTimeoutMs as tr, orphansAfterRollback as ts, revertedNestedRowIds as tt, conditionFingerprint as u, unreadableOrphanRecords as ua, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as uc, hasReadableResources as ui, DeploymentEventsReader as un, recordLogOnlyParameterValue as uo, ec2InstanceProtectionSite as ur, loadPublishableAssetManifest as us, withStackRecords as ut, noEchoAttributeNamesOf as v, hasNoCloudControlHandlers as va, processStackMessages as vc, malformedLocalResourcesWarning as vi, secretSafeKeyDisplay as vn, redactSecretsForState as vo, classifyReplaySecretRegion as vr, parseBootstrapMarker as vs, compensateRemovedDeletionProtection as vt, getPriorAttempts as w, renderStatefulReason as wa, absoluteAssemblyPathEscape as wc, malformedOutputsRefusalMessage as wi, isExportAliasCollision as wn, inheritNestedStackParameterAssociations as wo, explicitRoleArnOrThrow as wr, resolveDockerContextDirectory as ws, deleteTableWithIndexBusyRetry as wt, withResourceDeadline as x, MULTI_REGION_RECREATE_BLOCKED_TYPES as xa, hasPlainPrototype$1 as xc, malformedOrphanRowsKeptWarning as xi, noEchoParameterValueSeed as xn, dynamicReferenceTokens as xo, applyRoleArnIfSet as xr, validateContainerRepoName as xs, resolveDynamoDbDeleteBudgetMs as xt, noEchoComparisonForTemplate as y, findReplacedReadersOfRecreateTargets as ya, defineOwnKey as yc, malformedOrphanRecordsRefusalMessage as yi, exportNameSecretExposure as yn, scrubResourceRecord as yo, producerRegionsFromState as yr, readBootstrapMarkerBody as ys, deleteBudgetKey as yt, dropFailedHint as z, requireConfigString as za, refuseMalformedOrphansForOrphan as zi, DBPROXY_TAG_OPTIONS as zn, WHOLE_DYNAMIC_REFERENCE_PATTERN as zo, parameterTypeMayLoseSecretIdentity as zr, warnFinchArgvExposure as zs, resolveReplacementOldType as zt };
39563
- //# sourceMappingURL=deploy-engine-FDsHckZR.js.map
39586
+ export { dropFailedHint as $, maskedLeafCoordinatesOf as $a, refuseMalformedResourcePropertiesForOrphan as $i, getCurrentResourceSecrets as $n, importableOutputKeys as $o, parameterInputsFor as $r, resolveSkipPrefix as $s, secretNamePrintingBag as $t, gray as A, toFiniteNumber as Aa, clearBucketRegionCache as Ac, malformedResourcesWarning as Ai, findDestructiveChanges as An, provenPublicValue as Ao, callerEnvCredentials as Ar, finchSecretArgvRefusal as As, removeProtectionTypeList as At, NESTED_PENDING_PARENT_REASON as B, requireConfigString as Ba, refuseMalformedOrphansForOrphan as Bi, planTagDiff as Bn, WHOLE_DYNAMIC_REFERENCE_PATTERN as Bo, parameterTypeMayLoseSecretIdentity as Br, warnFinchArgvExposure as Bs, findNestedStackTypeChanges as Bt, recordedProtectionNote as C, isStatefulRecreateTargetForReplace as Ca, nullPrototypeRecord as Cc, malformedOrphansRefusalMessage as Ci, collectPublishedOutputNames as Cn, isUncertifiedBaselineMaskPosition as Co, assertFlagRoleArn as Cr, buildDenyExternalAccessPolicy as Cs, INDEX_SETTLE_POLL_INTERVAL_MS as Ct, createReadOnlyAttributeHealerFactory as D, coerceWarmThroughput as Da, displayAssemblyPath as Dc, malformedRenderedContainersWarning as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, recoverMaskedOutput as Do, sendableAssumeRoleCommand as Dr, describeDockerExecFailure as Ds, S3_AUTO_DELETE_OBJECTS_TAG as Dt, formatResourceLine as E, WARM_THROUGHPUT_MEMBERS as Ea, describeFileReadFailure as Ec, malformedOutputsWarning as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, recordNestedStackParameterExpressions as Eo, isIamRoleArn as Er, describeDockerCapturedOutput as Es, ECR_AUTO_DELETE_IMAGES_TAG as Et, namesAnyDeclaredParameter as F, configStringRefusal as Fa, refuseMalformedNestedChildOutputs as Fi, reserveStackCreateToken as Fn, wholeStringLeavesOf as Fo, s3BucketDualStackDomainName as Fr, partitionSensitiveEnv as Fs, isReplacementOrphan as Ft, nestedChildStackName as G, canonicalLambdaFunctionName as Ga, refuseMalformedResourceEntriesForDeploy as Gi, definedAttributes as Gn, rebuildClientForBucketRegion as Go, isNamelessDynamicReferenceError as Gr, Synthesizer as Gs, redactedDeleteAddressFields as Gt, displacedPhysicalIdShown as H, templateResourceTypes as Ha, refuseMalformedOutputsForDestroy as Hi, refuseMalformedDesiredTags as Hn, LockManager as Ho, isImpossibleEmptyStoredAttribute as Hr, stripControlChars as Hs, inheritProducerRegions as Ht, reachableDivergentParameters as I, readConfigString as Ia, refuseMalformedOrphanRecords as Ii, withCreateTokenLedger as In, STATE_SOURCED_BASELINE_RULES as Io, s3BucketRegionalDomainName as Ir, redactDockerArgvValues as Is, planFailedOps as It, revertedNestedRowIds as J, DagBuilder as Ja, refuseMalformedResourceEntriesForImportSave as Ji, ProviderRegistry as Jn, describeRegionValueKind as Jo, cfnRefValueFromPhysicalId as Jr, getLegacyStateBucketName as Js, updatePartialReason as Jt, recordDisplacedSkips as K, lambdaFunctionNameForMask as Ka, refuseMalformedResourceEntriesForDestroy as Ki, stringifyIfAssigned as Kn, splitImportedOps as Ko, keepsSecretReferenceToken as Kr, synthesisStatusMessage as Ks, redactedDeleteAddressSkip as Kt, resourcesNamingDeclaredParameter as L, replayWarn as La, refuseMalformedOrphanRecordsForDestroy as Li, acquireIdempotencyToken as Ln, STATE_SOURCED_CROSS_GENERATION_RULES as Lo, s3BucketWebsiteUrl as Lr, redactedDockerCause as Ls, planRollback as Lt, red as M, coerceCfnInteger as Ma, malformedStateRefusalMessage as Mi, RollbackInlinePolicyWriters as Mn, recordMaskOnlyValuesIn as Mo, isSettledInstanceState as Mr, getDockerCmd as Ms, recordAfterRollbackUpdate as Mt, yellow as N, configBooleanRefusal as Na, previewableOrphanRecords as Ni, earliestDefined as Nn, recordNoEchoAttributeValues as No, s3BucketArn as Nr, isDockerClientEnvKey as Ns, demoteSupersededOrphans as Nt, bold as O, isWarmThroughputDecrease as Oa, renderAssemblyPathEscape as Oc, malformedResourceEntriesWarning as Oi, maskingRetryLogger as On, identityKeyFor as Oo, AWS_CREDENTIAL_ENV_KEYS as Or, describeDockerFailure as Os, hasCdkAutoDeleteTag as Ot, computeParameterTaint as P, configIntegerRefusal as Pa, refuseDivergentRecordRegionForDestroy as Pi, ledgerForStack as Pn, recordProvenPublicExpression as Po, s3BucketDomainName as Pr, isMalformedEnvKey as Ps, isJournaledOrphan as Pt, deleteJournaledOrphans as Q, maskWholeValue as Qa, refuseMalformedResourcePropertiesForExport as Qi, isCustomResourceType as Qn, hasUnverifiableParameterRefusal as Qo, withSharedDrainBudget as Qr, resolveCaptureObservedState as Qs, orphanRecordsPrintingBag as Qt, makeSiblingClaimReader as R, requireConfigArray as Ra, refuseMalformedOrphans as Ri, DBPROXY_TAGS_WHAT as Rn, STATE_SOURCED_READBACK_RULES as Ro, coerceParameterTypedValue as Rr, runDockerForeground as Rs, replacementNeverSwapped as Rt, recordedProtectionEvidence as S, MULTI_REGION_RECREATE_BLOCKED_TYPES as Sa, hasPlainPrototype$1 as Sc, malformedOrphanRowsKeptWarning as Si, collectDeclaredOutputNames as Sn, dynamicReferenceTokens as So, applyRoleArnIfSet as Sr, validateContainerRepoName as Ss, DELETE_INDEX_WAIT_PROCEED_NOTE as St, markRefusedBeforeApplying as T, renderStatefulReason as Ta, absoluteAssemblyPathEscape as Tc, malformedOutputsRefusalMessage as Ti, bindingSkippedOutputs as Tn, inheritNestedStackParameterAssociations as To, explicitRoleArnOrThrow as Tr, resolveDockerContextDirectory as Ts, waitForIndexesSettled as Tt, dropSettledNestedJournals as U, describeTypeWithThrottleRetry as Ua, refuseMalformedResourceAttributesForOrphan as Ui, tagMapAsList as Un, isLockInfoExpired as Uo, carriesDynamicReference as Ur, AssetManifestLoader as Us, REDACTED_DELETE_ADDRESS_SKIP_REASON as Ut, displacedOpClause as V, prefetchCreateOnlyPropertyPaths as Va, refuseMalformedOutputs as Vi, readTagList as Vn, isSingleDynamicReferenceToken as Vo, getAccountInfo as Vr, escapeRegExp$3 as Vs, getCurrentProducerRegions as Vt, getNestedRevertRun as W, withRetry as Wa, refuseMalformedResourceEntries as Wi, tagPlanWarning as Wn, S3StateBackend as Wo, carriesFetchableDynamicReference as Wr, getDockerImageBySourceHash as Ws, isRedactedRecordedValue as Wt, getCurrentNestedStackContext as X, isMarkedCoordinate as Xa, refuseMalformedResourcePropertiesForDestroy as Xi, isCustomResource as Xn, hasReadableExportSet as Xo, refStateLookupFromResource as Xr, resolveApp as Xs, journaledOrphanPrintingBag as Xt, withNestedRevertRun as Y, TemplateParser as Ya, refuseMalformedResourceEntriesForOrphan as Yi, ccBrokenReason as Yn, exportNamesCarriedFrom as Yo, isStalePlaceholderArnAttribute as Yr, loadCdkJson as Ys, completedReplayEntries as Yt, withNestedStackContext as Z, maskReadbackAtCoordinates as Za, refuseMalformedResourcePropertiesForDrift as Zi, wouldReturnToSdkProvider as Zn, hasReasonlessBaselineRefusal as Zo, parseWebACLArn as Zr, resolveAutoAssetStorage as Zs, maskEventTextWithBoundBags as Zt, makeCanonicalizePropertiesFn as _, withoutSilentDropProperties as _a, AssemblyReader as _c, malformedLocalOutputsWarning as _i, secretBearingStateKeyWarning as _n, maskSecretsInText as _o, INTRINSIC_KEYS as _r, getBootstrapMarkerKey as _s, beginDeleteWait as _t, findNestedTemplateTreeDefect as a, repairMalformedOrphansForReadOnly as aa, ssmResolvedValueType as ac, UNREADABLE_RESOURCES_MAP_ROW as ai, createPreDeleteFinalSnapshot as an, carryLogOnlyValues as ao, deleteIndeterminateGuards as ar, AssetPublisher as as, replayFailedOperations as at, noEchoParameterNamesOf as b, findReplacedReadersOfRecreateTargets as ba, defineOwnKey as bc, malformedOrphanRecordsRefusalMessage as bi, isWholeDynamicReferenceValue as bn, scrubResourceRecord as bo, producerRegionsFromState as br, readBootstrapMarkerBody as bs, resolveDynamoDbDeleteBudgetClock as bt, renderNestedTemplateTreeDefect as c, repairMalformedResourcePropertiesForReadOnly as ca, MIGRATE_TMP_PREFIX as cc, displayLogicalId as ci, refusesFinalSnapshot as cn, literalSplitDelimitersOf as co, isWaitAbandonedError as cr, WorkGraph as cs, destroyStackRecordsView as ct, conditionInputsFrom as d, unreadableOrphanRecords as da, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as dc, hasReadableResources as di, DeploymentEventsStore as dn, recordLogOnlyParameterValue as do, ec2InstanceProtectionSite as dr, loadPublishableAssetManifest as ds, PROTECTION_PROPERTY_BY_TYPE as dt, refuseMalformedResourcesForDeploy as ea, resolveStateBucketWithDefault as ec, passedParameterClassesOf as ei, stateSecretNameNeedles as en, noEchoLeavesOf as eo, withPrintingSecrets as er, importableOutputs as es, isHandledOrphan as et, parentSuppliedValues as f, unreadableResourceEntries as fa, decodeListingKey as fc, isReadableOrphanRecord as fi, extractDeploymentEventError as fn, recordLogOnlyValue as fo, isTerminationProtectionPropagationError as fr, rewriteTemplateAssetReferences as fs, isProtectionValueActive as ft, mergeNoChangeOutputs as g, unwrittenCreateOnlyReplacement as ga, derivePartitionAndUrlSuffix as gc, malformedExportSourceWarning as gi, secretBearing as gn, maskSecretsInError as go, DiffCalculator as gr, ensureAssetStorage as gs, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as gt, keptWholeReasonText as h, findSilentDropProperties as ha, canonicalizeRegion as hc, malformedExportNamesWarning as hi, exportAliasCollisionScrubWarning as hn, errorCauseChain as ho, reEnableInstanceApiTermination as hr, assertAssetBucketRegion as hs, DynamoDBGlobalTableProvider as ht, childTemplateLoader as i, repairMalformedOrphanRecordsForReadOnly as ia, warnDeprecatedNoPrefixCliFlag as ic, UNREADABLE_ORPHANS_CONTAINER_ROW as ii, ccRoutedFinalSnapshotError as in, liveMatchesUnresolvedTokenFrame as io, UNSPECIFIED_SKIP_REASON as ir, shouldRetainResource as is, sameJournaledOrphans as it, green as j, coerceCfnBoolean as ja, resolveBucketRegion as jc, malformedScrubResourceEntriesRefusalMessage as ji, formatDestructiveChange as jn, recordMaskOnlyValue as jo, envCredentialsAreAssumedRole as jr, formatDockerLoginError as js, orphanDeleteNeedsIdentity as jt, cyan as k, toCfnInteger as ka, resolveAssemblyPath as kc, malformedResourcePropertiesWarning as ki, constructPathOf as kn, carriesSecretMask as ko, applyCallerIdentityCredentials as kr, dockerSpawnEnvWithSensitive as ks, isTruthyCfnBoolean as kt, templateIdentity as l, repairMalformedResourcesForReadOnly as la, findLargeInlineResources as lc, hasReadableOrphans as li, unsupportedFinalSnapshotError as ln, logOnlyValueCount as lo, markWaitAbandoned as lr, buildAssetRedirectMap as ls, getStackRecords as lt, isSecretBearingReferenceString as m, findActionableSilentDrops as ma, PARTITION_TABLE as mc, malformedDriftResourcePropertiesWarning as mi, displayTextOrWithheld as mn, createSecretMasker as mo, reDisableInstanceApiTermination as mr, BOOTSTRAP_MARKER_PREFIX as ms, readProtection as mt, IMPLICIT_DELETE_DEPENDENCIES as n, refuseMalformedResourcesForExport as na, resolveUseCdkBootstrapAssets as nc, STATE_REGION_DIVERGED as ni, PRE_DELETE_SNAPSHOT_TYPES as nn, passedNoEchoParametersOf as no, slowCcOperationTimeoutMs as nr, orphansAfterRollback as ns, loadJournaledOrphans as nt, isAbsoluteAssetPath as o, repairMalformedOutputsForReadOnly as oa, CFN_TEMPLATE_BODY_LIMIT as oc, accountArgs as oi, effectiveDeletionPolicy as on, createUnionSecretMasker as oo, deleteSkipReason as or, isSensitiveAttributeName as os, replayRollback as ot, readRecordedConditionVerdicts as p, withheldAccountClause as pa, expectedOwnerParam as pc, isReadableResourceEntry as pi, WITHHELD_NAME_DISPLAY as pn, shareLogOnlyValues as po, observeThenDisableInstanceApiTermination as pr, AssetModeResolver as ps, perType as pt, revertNestedChildFromJournal as q, sameLambdaFunctionAddress as qa, refuseMalformedResourceEntriesForImport as qi, CC_BROKEN_REASON as qn, acceptedCreateOnlyDropsOf as qo, AWS_NO_VALUE as qr, getDefaultStateBucketName as qs, updatePartialMessage as qt, computeImplicitDeleteEdges as r, refuseMalformedState as ra, stateBucketExistenceConfirmed as rc, STATE_RESOURCES_MALFORMED as ri, buildFinalSnapshotIdentifier as rn, readsNoEchoSource as ro, unchangedBehindSecretReference as rr, orphansCarriedFrom as rs, makeForeignHolderScan as rt, listNestedTemplateRows as s, repairMalformedResourceEntriesForReadOnly as sa, CFN_TEMPLATE_URL_LIMIT as sc, deployRefusesOrphanRowsReason as si, isFinalSnapshotError as sn, hasMaskableValues as so, withIndeterminateGuard as sr, stringifyValue as ss, awaitInFlightSibling as st, DeployEngine as t, refuseMalformedResourcesForDestroy as ta, resolveStateBucketWithDefaultAndSource as tc, JSON_LISTING_HOLE_VALUE as ti, ATOMIC_FINAL_SNAPSHOT_TYPES as tn, noEchoOutputsComparison as to, CloudControlProvider as tr, isReadableBag as ts, journaledOrphanLines as tt, conditionFingerprint as u, unpreviewableOrphanRecords as ua, uploadCfnTemplate as uc, hasReadableOutputs as ui, DeploymentEventsReader as un, printingCorpusOf as uo, disableInstanceApiTermination as ur, createAssetRedirectResolver as us, withStackRecords as ut, noEchoAttributeNamesOf as v, NO_CC_HANDLERS_REASON as va, StageLoadError as vc, malformedLocalResourceEntriesWarning as vi, secretSafeKeyDisplay as vn, markSameGenerationBag as vo, IntrinsicFunctionResolver as vr, isCrossRegionRedirect as vs, compensateRemovedDeletionProtection as vt, getPriorAttempts as w, isStatefulRecreateTargetSync as wa, ownValue as wc, malformedOrphansWarning as wi, isExportAliasCollision as wn, pathCrossesDottedKey as wo, assertSendableRoleArn as wr, buildDockerImage as ws, deleteTableWithIndexBusyRetry as wt, withResourceDeadline as x, shownType as xa, hasOwnKey as xc, malformedOrphanRecordsWarning as xi, noEchoParameterValueSeed as xn, DYNAMIC_REFERENCE_TOKEN_SCAN as xo, regionLessSecretName as xr, validateAssetBucketName as xs, resolveDynamoDbDeleteBudgetMs as xt, noEchoComparisonForTemplate as y, hasNoCloudControlHandlers as ya, processStackMessages as yc, malformedLocalResourcesWarning as yi, exportNameSecretExposure as yn, redactSecretsForState as yo, classifyReplaySecretRegion as yr, parseBootstrapMarker as ys, deleteBudgetKey as yt, planOrphanAdoption as z, requireConfigObject as za, refuseMalformedOrphansForDestroy as zi, DBPROXY_TAG_OPTIONS as zn, TEMPLATE_SOURCED_RULES as zo, isUnboundTemplateParameter as zr, runDockerStreaming as zs, resolveReplacementOldType as zt };
39587
+ //# sourceMappingURL=deploy-engine-Z_zHC0jz.js.map