@go-to-k/cdkd 0.310.0 → 0.312.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +2 -2
  2. package/dist/{asg-provider-I1bFHVsO.js → asg-provider-CVLTQtQr.js} +5 -3
  3. package/dist/asg-provider-CVLTQtQr.js.map +1 -0
  4. package/dist/cli.js +2 -2
  5. package/dist/{iam-policy-targets-D94wh05t.js → created-resource-sink-BT2Dfnpt.js} +51 -2
  6. package/dist/created-resource-sink-BT2Dfnpt.js.map +1 -0
  7. package/dist/{db-instance-modify-retry-BUG7NMWS.js → db-instance-modify-retry-D7wXWxVo.js} +2 -2
  8. package/dist/{db-instance-modify-retry-BUG7NMWS.js.map → db-instance-modify-retry-D7wXWxVo.js.map} +1 -1
  9. package/dist/{deploy-engine-DZO2SOQJ.js → deploy-engine-CVNzK__j.js} +914 -185
  10. package/dist/deploy-engine-CVNzK__j.js.map +1 -0
  11. package/dist/{iam-role-provider-BWw7I-SZ.js → iam-role-provider-DM7bN9m1.js} +5 -3
  12. package/dist/iam-role-provider-DM7bN9m1.js.map +1 -0
  13. package/dist/index.d.ts +9 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -3
  16. package/dist/{neptune-provider-8kjFmR1l.js → neptune-provider-qdoLunCh.js} +55 -6
  17. package/dist/neptune-provider-qdoLunCh.js.map +1 -0
  18. package/dist/{program-CS420Kx9.js → program-Nk_95KKk.js} +37 -19
  19. package/dist/program-Nk_95KKk.js.map +1 -0
  20. package/dist/{provider-classes-KsrvwO_r.js → provider-classes-Dz0pYmlJ.js} +2099 -217
  21. package/dist/provider-classes-Dz0pYmlJ.js.map +1 -0
  22. package/dist/{rds-provider-BqwTQeS-.js → rds-provider-CXSZq1c8.js} +28 -14
  23. package/dist/rds-provider-CXSZq1c8.js.map +1 -0
  24. package/dist/{version-QOtLxcEo.js → version-BqCEt5Wu.js} +2 -2
  25. package/dist/{version-QOtLxcEo.js.map → version-BqCEt5Wu.js.map} +1 -1
  26. package/package.json +2 -2
  27. package/dist/asg-provider-I1bFHVsO.js.map +0 -1
  28. package/dist/deploy-engine-DZO2SOQJ.js.map +0 -1
  29. package/dist/iam-policy-targets-D94wh05t.js.map +0 -1
  30. package/dist/iam-role-provider-BWw7I-SZ.js.map +0 -1
  31. package/dist/neptune-provider-8kjFmR1l.js.map +0 -1
  32. package/dist/program-CS420Kx9.js.map +0 -1
  33. package/dist/provider-classes-KsrvwO_r.js.map +0 -1
  34. package/dist/rds-provider-BqwTQeS-.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { c as __exportAll, r as getAwsClients } from "./aws-clients-Bu9EMILF.js";
2
2
  import { A as isNameGeneration, B as SECRET_REF_MAX_CODE_POINTS, D as getCurrentStackInstanceId, E as getCurrentSkipPrefix, F as withSkipPrefix, G as displayAwsMessage, H as UNRENDERABLE, I as withStackScope, J as displayStackName, K as displayIdent, L as withStackScopeBeforeStateRead, N as stackInstanceNameSuffix, O as getCurrentStackName, P as withNameGeneration, Q as safeMsg, R as withoutGeneratedFallbackName, S as fallbackNamePropertyFor, T as generatedNameFor, U as asIsMessage, V as STACK_REF_MAX_CODE_POINTS, Y as isPasteableIdent, Z as plainIdentOr, a as safeStringify$1, c as isStdoutReservedForPayload, et as terminalSafe, f as currentLogLineMasker, j as looksLikeCdkdGeneratedName, m as getLiveRenderer, n as describeAwsFailure, p as installLogLineMaskerSource, q as displaySafe, s as getLogger, t as VERBOSE_POINTER, tt as truncateCodePoints, v as applyDefaultNameForFallback, w as generateResourceNameWithFallback, x as explicitNamePropertyFor, y as currentNameGeneration, z as SAFE_MSG_ALTERED_CHAR } from "./aws-failure-text-NSBdKPYK.js";
3
- import { $n as isUpdateUnsupportedError, An as StateError, At as carryCreatedBeforeFailure, B as compensateProtectionFlip, Bn as UNSHOWABLE_VALUE, Bt as replayMadeAnotherResource, Cr as markNonRetryable, Ct as createMaskedLogSinks, D as markNotGone, Dn as ResourceUpdateNotSupportedError, Dt as maskerOrIdentity, E as isMarkedNotGone, En as ResourceTimeoutError, Et as maskDeep, F as refusalTypeShown, Fn as normalizeAwsError, Ft as isAuxiliaryFailure, Gn as physicalIdShownBesideCommand, Gt as formatLockExpiry, H as deleteWithProtectionCompensation, Ht as buildForceUnlockCommand, It as isAuxiliaryMarkOf, J as observeThenDisableProtection, Jn as shellBoundedDisplay, Jt as recoveryCommandFlags, K as isTerminalDeleteFailure, Kn as plainOrDescribed, Kt as formatLockOperation, L as resolveExplicitPhysicalId, Lt as markAuxiliaryFailure, M as isQuotableImportValue, Mt as createdBeforeFailure, N as normalizeAwsTagsToCfn, Nt as createdResourceIdentityBeforeFailure, O as assertRegionMatch, Ot as withDerivedNameMasks, P as quotedRemedyLogicalId, Pn as isSoftAbort, Pt as hasCreatedBeforeFailure, Qt as injectiveKey, Rn as SHELL_ACTIVE, Rt as markCreatedBeforeFailure, Sn as MalformedProducerRecordRefusalError, Sr as isThrottlingError, St as stateOrphanRecordRemedy, T as RESOURCE_NOT_FOUND, Tn as ProvisioningError, Tr as wrapMaskedAwsError, Tt as isSecretDerivedValue, Un as isInertUnquoted, Vn as commandHole, Vt as UNREPRODUCIBLE_LOCK_CLAUSE, Wn as pasteableCommand, Xn as withheldTargetClause, Xt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Y as protectionFlipKey, Yn as shellQuote, Yt as sanitizeRecoveryValue, Z as runDeleteAttempt, Zt as DEFAULT_STATE_PREFIX, _n as IntrinsicResolutionRefusalError, _r as isRetryableTransientError, an as ambientCredentialConfig, at as protectedReplacementAdvice, bn as LockError, bt as resourceTypeShown, cn as AccountIdUnavailableError, cr as escapeRegExp$3, ct as monotonicNowMs, d as prepareRemovalForUpdate, er as hasReplayMayCollide, et as DELETION_PROTECTION_DOC_POINTER, f as removalWarning, fn as CrossAccountSecretRefusalError, fr as formatRetryClassificationSignals, ft as isInterruptedWaitError, gn as DynamicReferenceRegionAmbiguousError, gr as isIamPropagationError, gt as compositeIdSeparatorRefusal, hn as DeploymentNotApprovedError, i as holdsSecretDerivedEntry, in as ambientClientDefaults, ir as isReplayedNameCollisionFrom, it as pasteableAwsCommand, jn as SynthesisError, kt as RETRY_AUXILIARY_OWNER, l as withUnchangedSecretPrincipalLists, ln as AssetError, lr as stripControlChars, m as withoutInjectedRemovals, mr as isAmbiguousOutcomeError, mt as canonicalizeRoute53QueryName, nr as isNameCooldownError, on as clientDefaultsFor, or as markReplayMayCollide, pn as DependencyError, pr as isAmbiguousCcHandlerErrorCode, pt as startInterruptWatch, qn as quotedOrDescribed, qt as formatLockOwner, rn as withPasteableAwsProfile, rr as isRecreateRetryableError, sn as credentialFingerprint, sr as relayedNameCollision, st as ElapsedBudgetRegistry, tn as producerRecordKey, tr as isNameCollisionErrorFrom, un as CdkdError, vr as isTransientServerError, vt as logicalIdShown, w as withoutServerErrorRetries, wr as markRedactedCause, wt as createMaskedRetryLogger, xn as MacroExpansionError, xr as isMarkedNonRetryable, xt as segmentAfterAnchor, yr as retryClassificationText, z as ProtectionFlipRegistry, zn as SHELL_ACTIVE_WHY } from "./iam-policy-targets-D94wh05t.js";
3
+ import { $n as plainOrDescribed, $t as formatLockOperation, A as withoutServerErrorRetries, Ar as markNonRetryable, At as createMaskedLogSinks, B as quotedRemedyLogicalId, Bt as createdResourceIdentityBeforeFailure, Cn as DynamicReferenceRegionAmbiguousError, Cr as isIamPropagationError, Ct as compositeIdSeparatorRefusal, Dn as LockError, Dt as resourceTypeShown, Er as retryClassificationText, Ft as withDerivedNameMasks, G as ProtectionFlipRegistry, Gn as SHELL_ACTIVE, Gt as markCreatedBeforeFailure, Hn as normalizeAwsError, Ht as isAuxiliaryFailure, It as RETRY_AUXILIARY_OWNER, J as deleteWithProtectionCompensation, Jn as commandHole, Jt as UNREPRODUCIBLE_LOCK_CLAUSE, K as compensateProtectionFlip, Kn as SHELL_ACTIVE_WHY, Ln as StateError, Lt as carryCreatedBeforeFailure, M as isMarkedNotGone, Mn as ProvisioningError, Mr as wrapMaskedAwsError, Mt as isSecretDerivedValue, N as markNotGone, Nn as ResourceTimeoutError, Nt as maskDeep, On as MacroExpansionError, Or as isMarkedNonRetryable, Ot as segmentAfterAnchor, P as assertRegionMatch, Pn as ResourceUpdateNotSupportedError, Pt as maskerOrIdentity, Q as isTerminalDeleteFailure, Qn as physicalIdShownBesideCommand, Qt as formatLockExpiry, R as isQuotableImportValue, Rn as SynthesisError, Sn as DeploymentNotApprovedError, Tr as isTransientServerError, Tt as logicalIdShown, U as resolveExplicitPhysicalId, Ut as isAuxiliaryMarkOf, V as refusalTypeShown, Vn as isSoftAbort, Vt as hasCreatedBeforeFailure, Wt as markAuxiliaryFailure, Xn as isInertUnquoted, Yt as buildForceUnlockCommand, Zn as pasteableCommand, _ as removalWarning, _n as CdkdError, a as retractCreatedResource, an as injectiveKey, b as withoutInjectedRemovals, bn as DependencyError, br as isAmbiguousCcHandlerErrorCode, bt as startInterruptWatch, cn as producerRecordKey, cr as isNameCollisionErrorFrom, dn as ambientClientDefaults, dr as isReplayedNameCollisionFrom, dt as protectedReplacementAdvice, en as formatLockOwner, er as quotedOrDescribed, et as observeThenDisableProtection, fn as ambientCredentialConfig, g as prepareRemovalForUpdate, gn as AssetError, gr as stripControlChars, hn as AccountIdUnavailableError, hr as escapeRegExp$3, ht as monotonicNowMs, i as reportCreatedResource, in as DEFAULT_STATE_PREFIX, j as RESOURCE_NOT_FOUND, jr as markRedactedCause, jt as createMaskedRetryLogger, kn as MalformedProducerRecordRefusalError, kr as isThrottlingError, kt as stateOrphanRecordRemedy, l as holdsSecretDerivedEntry, lr as isNameCooldownError, m as withUnchangedSecretPrincipalLists, mn as credentialFingerprint, mr as relayedNameCollision, mt as ElapsedBudgetRegistry, n as clearCreatedReport, nn as sanitizeRecoveryValue, nr as shellQuote, or as isUpdateUnsupportedError, ot as DELETION_PROTECTION_DOC_POINTER, pn as clientDefaultsFor, pr as markReplayMayCollide, qn as UNSHOWABLE_VALUE, qt as replayMadeAnotherResource, r as collectCreatedResources, rn as CUSTOM_RESOURCE_RESPONSE_PREFIX, rr as withheldTargetClause, rt as runDeleteAttempt, sr as hasReplayMayCollide, t as CreatedResourceSink, tn as recoveryCommandFlags, tr as shellBoundedDisplay, tt as protectionFlipKey, un as withPasteableAwsProfile, ur as isRecreateRetryableError, ut as pasteableAwsCommand, wn as IntrinsicResolutionRefusalError, wr as isRetryableTransientError, xr as isAmbiguousOutcomeError, xt as canonicalizeRoute53QueryName, yn as CrossAccountSecretRefusalError, yr as formatRetryClassificationSignals, yt as isInterruptedWaitError, z as normalizeAwsTagsToCfn, zt as createdBeforeFailure } from "./created-resource-sink-BT2Dfnpt.js";
4
4
  import { a as setAssumedRoleCredentials, c as ambientRegion, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as quietS3Logger, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BX9Y_fKp.js";
5
- import { t as getCdkdVersion } from "./version-QOtLxcEo.js";
5
+ import { t as getCdkdVersion } from "./version-BqCEt5Wu.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -4987,7 +4987,8 @@ const STATE_SCHEMA_VERSIONS_READABLE = [
4987
4987
  11,
4988
4988
  12,
4989
4989
  13,
4990
- 14
4990
+ 14,
4991
+ 15
4991
4992
  ];
4992
4993
  function hasUnverifiableParameterRefusal(record) {
4993
4994
  return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
@@ -6047,7 +6048,7 @@ var S3StateBackend = class S3StateBackend {
6047
6048
  const body = {
6048
6049
  ...state,
6049
6050
  ...stackInstanceIdCarriedFrom(state),
6050
- version: 14,
6051
+ version: 15,
6051
6052
  stackName,
6052
6053
  region
6053
6054
  };
@@ -10278,6 +10279,11 @@ function scrubResourceRecord(record, secrets, sourceProperties, observedProvenan
10278
10279
  secrets
10279
10280
  });
10280
10281
  }
10282
+ const attemptedItems = record.unsettledItems;
10283
+ if (typeof attemptedItems === "object" && attemptedItems !== null && !Array.isArray(attemptedItems)) next.unsettledItems = redactForState(attemptedItems, {
10284
+ provenance: "value-scan",
10285
+ secrets
10286
+ });
10281
10287
  if (record.observedProperties) next.observedProperties = redactAtProvenance(record.observedProperties, secrets, sourceProperties ?? next.properties, observedProvenance ?? (sourceProperties !== void 0 ? "template-sourced" : secrets.size === 0 && observedClaimed ? "state-baseline" : "state-readback"), observedClaimed);
10282
10288
  return next;
10283
10289
  }
@@ -12691,6 +12697,20 @@ function elastiCachePreferredAvailabilityZonesMovedToDisjoint(oldValue, newValue
12691
12697
  if (![...oldValue, ...newValue].every((z) => typeof z === "string")) return false;
12692
12698
  return !newValue.some((z) => oldValue.includes(z));
12693
12699
  }
12700
+ function elastiCacheLeftSingleAzWithoutZones(siblings) {
12701
+ if (siblings === void 0) return false;
12702
+ const { oldProperties: prev, newProperties: next } = siblings;
12703
+ return prev["Engine"] === "memcached" && next["Engine"] === "memcached" && prev["PreferredAvailabilityZone"] == null && next["PreferredAvailabilityZone"] == null && next["PreferredAvailabilityZones"] == null && (next["AZMode"] == null || next["AZMode"] === "single-az");
12704
+ }
12705
+ function elastiCacheAzModeRemovedFromSingleAz(oldValue, newValue, siblings) {
12706
+ return oldValue === "single-az" && newValue == null && elastiCacheLeftSingleAzWithoutZones(siblings);
12707
+ }
12708
+ function elastiCachePreferredAvailabilityZonesRemovedFromSingleAz(oldValue, newValue, siblings) {
12709
+ return Array.isArray(oldValue) && oldValue.length > 0 && newValue == null && siblings?.oldProperties["AZMode"] === "single-az" && elastiCacheLeftSingleAzWithoutZones(siblings);
12710
+ }
12711
+ function elastiCachePreferredAvailabilityZonesReplaced(oldValue, newValue, siblings) {
12712
+ return elastiCachePreferredAvailabilityZonesMovedToDisjoint(oldValue, newValue) || elastiCachePreferredAvailabilityZonesRemovedFromSingleAz(oldValue, newValue, siblings);
12713
+ }
12694
12714
  function emrClusterInstancesReplaced(oldValue, newValue) {
12695
12715
  if (oldValue === void 0 && newValue === void 0) return true;
12696
12716
  return !isDeepStrictEqual(emrInstancesReplacingPart(oldValue), emrInstancesReplacingPart(newValue));
@@ -13025,13 +13045,23 @@ var ReplacementRulesRegistry = class {
13025
13045
  this.rules.set("AWS::RDS::DBProxy", { replacementProperties: /* @__PURE__ */ new Set([
13026
13046
  "DBProxyName",
13027
13047
  "EngineFamily",
13028
- "VpcSubnetIds"
13048
+ "VpcSubnetIds",
13049
+ "EndpointNetworkType",
13050
+ "TargetConnectionNetworkType"
13029
13051
  ]) });
13030
13052
  this.rules.set("AWS::RDS::DBProxyEndpoint", { replacementProperties: /* @__PURE__ */ new Set([
13031
13053
  "DBProxyName",
13032
13054
  "DBProxyEndpointName",
13033
13055
  "VpcSubnetIds",
13034
- "TargetRole"
13056
+ "TargetRole",
13057
+ "EndpointNetworkType"
13058
+ ]) });
13059
+ this.rules.set("AWS::S3Tables::Table", { replacementProperties: /* @__PURE__ */ new Set([
13060
+ "TableBucketARN",
13061
+ "OpenTableFormat",
13062
+ "IcebergMetadata",
13063
+ "StorageClassConfiguration",
13064
+ "WithoutMetadata"
13035
13065
  ]) });
13036
13066
  this.rules.set("AWS::RDS::DBProxyTargetGroup", { replacementProperties: /* @__PURE__ */ new Set(["DBProxyName", "TargetGroupName"]) });
13037
13067
  this.rules.set("AWS::EC2::VPC", {
@@ -13109,7 +13139,7 @@ var ReplacementRulesRegistry = class {
13109
13139
  });
13110
13140
  this.rules.set("AWS::ElastiCache::CacheCluster", {
13111
13141
  replacementProperties: /* @__PURE__ */ new Set(),
13112
- conditionalReplacements: /* @__PURE__ */ new Map([["PreferredAvailabilityZones", elastiCachePreferredAvailabilityZonesMovedToDisjoint]])
13142
+ conditionalReplacements: /* @__PURE__ */ new Map([["AZMode", elastiCacheAzModeRemovedFromSingleAz], ["PreferredAvailabilityZones", elastiCachePreferredAvailabilityZonesReplaced]])
13113
13143
  });
13114
13144
  this.rules.set("AWS::EMR::Cluster", {
13115
13145
  replacementProperties: /* @__PURE__ */ new Set(),
@@ -13929,7 +13959,8 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
13929
13959
  ["SourceDbClusterResourceId"],
13930
13960
  ["SourceRegion"],
13931
13961
  ["StorageEncrypted"],
13932
- ["UseLatestRestorableTime"]
13962
+ ["UseLatestRestorableTime"],
13963
+ ["WithExpressConfiguration"]
13933
13964
  ]],
13934
13965
  ["AWS::RDS::DBInstance", [
13935
13966
  ["BackupTarget"],
@@ -15233,6 +15264,7 @@ const STATEFUL_TYPES = /* @__PURE__ */ new Set([
15233
15264
  "AWS::MemoryDB::Snapshot",
15234
15265
  "AWS::Redshift::Snapshot",
15235
15266
  "AWS::Timestream::InfluxDBBackup",
15267
+ "AWS::EC2::Snapshot",
15236
15268
  "AWS::StorageGateway::Volume",
15237
15269
  "AWS::FSx::FileCache",
15238
15270
  "AWS::DirectoryService::MicrosoftAD",
@@ -16283,21 +16315,20 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16283
16315
  "AgentRuntimeArtifact",
16284
16316
  "AgentRuntimeName",
16285
16317
  "AuthorizerConfiguration",
16318
+ "CapacityProviderConfiguration",
16286
16319
  "ClientToken",
16287
16320
  "Description",
16288
16321
  "EnvironmentVariables",
16322
+ "FilesystemConfigurations",
16289
16323
  "LifecycleConfiguration",
16290
16324
  "NetworkConfiguration",
16325
+ "PlatformVersion",
16291
16326
  "ProtocolConfiguration",
16292
- "RoleArn"
16293
- ]),
16294
- silentDrop: /* @__PURE__ */ new Map([
16295
- ["CapacityProviderConfiguration", "not yet implemented by cdkd"],
16296
- ["FilesystemConfigurations", "not yet implemented by cdkd"],
16297
- ["PlatformVersion", "not yet implemented by cdkd"],
16298
- ["RequestHeaderConfiguration", "not yet implemented by cdkd"],
16299
- ["Tags", "not yet implemented by cdkd"]
16327
+ "RequestHeaderConfiguration",
16328
+ "RoleArn",
16329
+ "Tags"
16300
16330
  ]),
16331
+ silentDrop: /* @__PURE__ */ new Map(),
16301
16332
  createOnlyDrops: /* @__PURE__ */ new Set(),
16302
16333
  readOnly: /* @__PURE__ */ new Set([
16303
16334
  "AgentRuntimeArn",
@@ -16424,6 +16455,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16424
16455
  }],
16425
16456
  ["AWS::CloudWatch::Alarm", {
16426
16457
  handled: /* @__PURE__ */ new Set([
16458
+ "ActionConfiguration",
16427
16459
  "ActionsEnabled",
16428
16460
  "AlarmActions",
16429
16461
  "AlarmDescription",
@@ -16432,7 +16464,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16432
16464
  "DatapointsToAlarm",
16433
16465
  "Dimensions",
16434
16466
  "EvaluateLowSampleCountPercentile",
16467
+ "EvaluationCriteria",
16468
+ "EvaluationInterval",
16435
16469
  "EvaluationPeriods",
16470
+ "EvaluationWindow",
16436
16471
  "ExtendedStatistic",
16437
16472
  "InsufficientDataActions",
16438
16473
  "MetricName",
@@ -16445,15 +16480,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16445
16480
  "Threshold",
16446
16481
  "ThresholdMetricId",
16447
16482
  "TreatMissingData",
16448
- "Unit"
16449
- ]),
16450
- silentDrop: /* @__PURE__ */ new Map([
16451
- ["ActionConfiguration", "not yet implemented by cdkd"],
16452
- ["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."],
16453
- ["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."],
16454
- ["EvaluationWindow", "not yet implemented by cdkd"],
16455
- ["WarmUpConfiguration", "not yet implemented by cdkd"]
16483
+ "Unit",
16484
+ "WarmUpConfiguration"
16456
16485
  ]),
16486
+ silentDrop: /* @__PURE__ */ new Map(),
16457
16487
  createOnlyDrops: /* @__PURE__ */ new Set(),
16458
16488
  readOnly: /* @__PURE__ */ new Set(["Arn"]),
16459
16489
  ccRouteUnavailable: false
@@ -16503,7 +16533,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16503
16533
  ]),
16504
16534
  silentDrop: /* @__PURE__ */ new Map([["Triggers", "not yet implemented by cdkd"]]),
16505
16535
  createOnlyDrops: /* @__PURE__ */ new Set(),
16506
- readOnly: /* @__PURE__ */ new Set(["Arn", "Id"]),
16536
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
16507
16537
  ccRouteUnavailable: true
16508
16538
  }],
16509
16539
  ["AWS::CodeCommit::Repository", {
@@ -16695,6 +16725,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16695
16725
  ["MultiRegionConsistency", "not yet implemented by cdkd"],
16696
16726
  ["ReadOnDemandThroughputSettings", "not yet implemented by cdkd"],
16697
16727
  ["ReadProvisionedThroughputSettings", "not yet implemented by cdkd"],
16728
+ ["TableType", "not yet implemented by cdkd"],
16698
16729
  ["VectorIndexes", "not yet implemented by cdkd"],
16699
16730
  ["WarmThroughput", "not yet implemented by cdkd"]
16700
16731
  ]),
@@ -16726,9 +16757,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16726
16757
  "TableName",
16727
16758
  "Tags",
16728
16759
  "TimeToLiveSpecification",
16760
+ "VectorIndexes",
16729
16761
  "WarmThroughput"
16730
16762
  ]),
16731
- silentDrop: /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"], ["VectorIndexes", "not yet implemented by cdkd"]]),
16763
+ silentDrop: /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]]),
16732
16764
  createOnlyDrops: /* @__PURE__ */ new Set(["ImportSourceSpecification"]),
16733
16765
  readOnly: /* @__PURE__ */ new Set(["Arn", "StreamArn"]),
16734
16766
  ccRouteUnavailable: false
@@ -17096,7 +17128,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
17096
17128
  "VolumeConfigurations",
17097
17129
  "VpcLatticeConfigurations"
17098
17130
  ]),
17099
- silentDrop: /* @__PURE__ */ new Map(),
17131
+ silentDrop: /* @__PURE__ */ new Map([["GatewayConnectors", "not yet implemented by cdkd"]]),
17100
17132
  createOnlyDrops: /* @__PURE__ */ new Set(),
17101
17133
  readOnly: /* @__PURE__ */ new Set(["Name", "ServiceArn"]),
17102
17134
  ccRouteUnavailable: false
@@ -17995,7 +18027,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
17995
18027
  "RetentionInDays",
17996
18028
  "Tags"
17997
18029
  ]),
17998
- silentDrop: /* @__PURE__ */ new Map([["ResourcePolicyDocument", "covered by the separate account-wide AWS::Logs::ResourcePolicy resource type; logs:PutResourcePolicy is account-scoped, not per-log-group, so it has no CreateLogGroup / PutRetentionPolicy counterpart — routed via Cloud Control instead"]]),
18030
+ silentDrop: /* @__PURE__ */ new Map([["ResourcePolicyDocument", "not driven by this provider by decision (issue #1412): no CreateLogGroup / PutRetentionPolicy member carries it, and both policy lifecycles — the account-scoped AWS::Logs::ResourcePolicy type and the log-group-scoped logs:PutResourcePolicy (resourceArn + policyScope RESOURCE) — are ones this provider does not take on — routed via Cloud Control, whose handler applies it"]]),
17999
18031
  createOnlyDrops: /* @__PURE__ */ new Set(),
18000
18032
  readOnly: /* @__PURE__ */ new Set(["Arn"]),
18001
18033
  ccRouteUnavailable: false
@@ -18175,7 +18207,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18175
18207
  ["SourceDbClusterResourceId", "not yet implemented by cdkd"],
18176
18208
  ["SourceRegion", "not yet implemented by cdkd"],
18177
18209
  ["StorageType", "not yet implemented by cdkd"],
18178
- ["UseLatestRestorableTime", "not yet implemented by cdkd"]
18210
+ ["UseLatestRestorableTime", "not yet implemented by cdkd"],
18211
+ ["WithExpressConfiguration", "not yet implemented by cdkd"]
18179
18212
  ]),
18180
18213
  createOnlyDrops: /* @__PURE__ */ new Set([
18181
18214
  "ClusterScalabilityType",
@@ -18187,7 +18220,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18187
18220
  "SourceDBClusterIdentifier",
18188
18221
  "SourceDbClusterResourceId",
18189
18222
  "SourceRegion",
18190
- "UseLatestRestorableTime"
18223
+ "UseLatestRestorableTime",
18224
+ "WithExpressConfiguration"
18191
18225
  ]),
18192
18226
  readOnly: /* @__PURE__ */ new Set([
18193
18227
  "DBClusterArn",
@@ -18324,20 +18358,19 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18324
18358
  "Auth",
18325
18359
  "DBProxyName",
18326
18360
  "DebugLogging",
18361
+ "DefaultAuthScheme",
18362
+ "EndpointNetworkType",
18327
18363
  "EngineFamily",
18328
18364
  "IdleClientTimeout",
18329
18365
  "RequireTLS",
18330
18366
  "RoleArn",
18331
18367
  "Tags",
18368
+ "TargetConnectionNetworkType",
18332
18369
  "VpcSecurityGroupIds",
18333
18370
  "VpcSubnetIds"
18334
18371
  ]),
18335
- silentDrop: /* @__PURE__ */ new Map([
18336
- ["DefaultAuthScheme", "not yet implemented by cdkd"],
18337
- ["EndpointNetworkType", "not yet implemented by cdkd"],
18338
- ["TargetConnectionNetworkType", "not yet implemented by cdkd"]
18339
- ]),
18340
- createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType", "TargetConnectionNetworkType"]),
18372
+ silentDrop: /* @__PURE__ */ new Map(),
18373
+ createOnlyDrops: /* @__PURE__ */ new Set(),
18341
18374
  readOnly: /* @__PURE__ */ new Set([
18342
18375
  "DBProxyArn",
18343
18376
  "Endpoint",
@@ -18349,13 +18382,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18349
18382
  handled: /* @__PURE__ */ new Set([
18350
18383
  "DBProxyEndpointName",
18351
18384
  "DBProxyName",
18385
+ "EndpointNetworkType",
18352
18386
  "Tags",
18353
18387
  "TargetRole",
18354
18388
  "VpcSecurityGroupIds",
18355
18389
  "VpcSubnetIds"
18356
18390
  ]),
18357
- silentDrop: /* @__PURE__ */ new Map([["EndpointNetworkType", "not yet implemented by cdkd"]]),
18358
- createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType"]),
18391
+ silentDrop: /* @__PURE__ */ new Map(),
18392
+ createOnlyDrops: /* @__PURE__ */ new Set(),
18359
18393
  readOnly: /* @__PURE__ */ new Set([
18360
18394
  "DBProxyEndpointArn",
18361
18395
  "Endpoint",
@@ -18479,17 +18513,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18479
18513
  }],
18480
18514
  ["AWS::S3Express::DirectoryBucket", {
18481
18515
  handled: /* @__PURE__ */ new Set([
18516
+ "BucketEncryption",
18482
18517
  "BucketName",
18483
18518
  "DataRedundancy",
18519
+ "InventoryConfigurations",
18520
+ "LifecycleConfiguration",
18484
18521
  "LocationName",
18522
+ "MetricsConfigurations",
18485
18523
  "Tags"
18486
18524
  ]),
18487
- silentDrop: /* @__PURE__ */ new Map([
18488
- ["BucketEncryption", "not yet implemented by cdkd"],
18489
- ["InventoryConfigurations", "not yet implemented by cdkd"],
18490
- ["LifecycleConfiguration", "not yet implemented by cdkd"],
18491
- ["MetricsConfigurations", "not yet implemented by cdkd"]
18492
- ]),
18525
+ silentDrop: /* @__PURE__ */ new Map(),
18493
18526
  createOnlyDrops: /* @__PURE__ */ new Set(),
18494
18527
  readOnly: /* @__PURE__ */ new Set(["Arn", "AvailabilityZoneName"]),
18495
18528
  ccRouteUnavailable: false
@@ -18503,26 +18536,21 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18503
18536
  }],
18504
18537
  ["AWS::S3Tables::Table", {
18505
18538
  handled: /* @__PURE__ */ new Set([
18539
+ "Compaction",
18506
18540
  "Format",
18541
+ "IcebergMetadata",
18507
18542
  "Name",
18508
18543
  "Namespace",
18509
18544
  "OpenTableFormat",
18545
+ "SnapshotManagement",
18546
+ "StorageClassConfiguration",
18510
18547
  "TableBucketARN",
18511
18548
  "TableName",
18512
- "Tags"
18513
- ]),
18514
- silentDrop: /* @__PURE__ */ new Map([
18515
- ["Compaction", "not yet implemented by cdkd"],
18516
- ["IcebergMetadata", "not yet implemented by cdkd"],
18517
- ["SnapshotManagement", "not yet implemented by cdkd"],
18518
- ["StorageClassConfiguration", "not yet implemented by cdkd"],
18519
- ["WithoutMetadata", "not yet implemented by cdkd"]
18520
- ]),
18521
- createOnlyDrops: /* @__PURE__ */ new Set([
18522
- "IcebergMetadata",
18523
- "StorageClassConfiguration",
18549
+ "Tags",
18524
18550
  "WithoutMetadata"
18525
18551
  ]),
18552
+ silentDrop: /* @__PURE__ */ new Map(),
18553
+ createOnlyDrops: /* @__PURE__ */ new Set(),
18526
18554
  readOnly: /* @__PURE__ */ new Set([
18527
18555
  "TableARN",
18528
18556
  "VersionToken",
@@ -18531,14 +18559,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18531
18559
  ccRouteUnavailable: false
18532
18560
  }],
18533
18561
  ["AWS::S3Tables::TableBucket", {
18534
- handled: /* @__PURE__ */ new Set(["TableBucketName", "Tags"]),
18535
- silentDrop: /* @__PURE__ */ new Map([
18536
- ["EncryptionConfiguration", "not yet implemented by cdkd"],
18537
- ["MetricsConfiguration", "not yet implemented by cdkd"],
18538
- ["ReplicationConfiguration", "not yet implemented by cdkd"],
18539
- ["StorageClassConfiguration", "not yet implemented by cdkd"],
18540
- ["UnreferencedFileRemoval", "not yet implemented by cdkd"]
18562
+ handled: /* @__PURE__ */ new Set([
18563
+ "EncryptionConfiguration",
18564
+ "MetricsConfiguration",
18565
+ "ReplicationConfiguration",
18566
+ "StorageClassConfiguration",
18567
+ "TableBucketName",
18568
+ "Tags",
18569
+ "UnreferencedFileRemoval"
18541
18570
  ]),
18571
+ silentDrop: /* @__PURE__ */ new Map(),
18542
18572
  createOnlyDrops: /* @__PURE__ */ new Set(),
18543
18573
  readOnly: /* @__PURE__ */ new Set(["TableBucketARN"]),
18544
18574
  ccRouteUnavailable: false
@@ -18770,25 +18800,24 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
18770
18800
  }],
18771
18801
  ["AWS::WAFv2::WebACL", {
18772
18802
  handled: /* @__PURE__ */ new Set([
18803
+ "ApplicationConfig",
18773
18804
  "AssociationConfig",
18774
18805
  "CaptchaConfig",
18775
18806
  "ChallengeConfig",
18776
18807
  "CustomResponseBodies",
18808
+ "DataProtectionConfig",
18777
18809
  "DefaultAction",
18778
18810
  "Description",
18811
+ "MonetizationConfig",
18779
18812
  "Name",
18813
+ "OnSourceDDoSProtectionConfig",
18780
18814
  "Rules",
18781
18815
  "Scope",
18782
18816
  "Tags",
18783
18817
  "TokenDomains",
18784
18818
  "VisibilityConfig"
18785
18819
  ]),
18786
- silentDrop: /* @__PURE__ */ new Map([
18787
- ["ApplicationConfig", "not yet implemented by cdkd"],
18788
- ["DataProtectionConfig", "not yet implemented by cdkd"],
18789
- ["MonetizationConfig", "not yet implemented by cdkd"],
18790
- ["OnSourceDDoSProtectionConfig", "not yet implemented by cdkd"]
18791
- ]),
18820
+ silentDrop: /* @__PURE__ */ new Map(),
18792
18821
  createOnlyDrops: /* @__PURE__ */ new Set(),
18793
18822
  readOnly: /* @__PURE__ */ new Set([
18794
18823
  "Arn",
@@ -19130,7 +19159,8 @@ const NON_PROVISIONABLE_TYPES = /* @__PURE__ */ new Set([
19130
19159
  "AWS::WAFRegional::XssMatchSet",
19131
19160
  "AWS::Wisdom::Session",
19132
19161
  "AWS::WorkSpaces::WorkSpaceApplication",
19133
- "AWS::WorkSpaces::WorkspaceBundle"
19162
+ "AWS::WorkSpaces::WorkspaceBundle",
19163
+ "AWS::WorkSpaces::WorkspaceImage"
19134
19164
  ]);
19135
19165
 
19136
19166
  //#endregion
@@ -19253,21 +19283,39 @@ function excludeCreateOnly(resourceType, names) {
19253
19283
  return names.filter((property) => !createOnly.has(property));
19254
19284
  }
19255
19285
  function withoutUnwrittenSilentDropProperties(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
19256
- const drops = findSilentDropProperties(resourceType, recordedProperties);
19257
- if (drops.length === 0) return recordedProperties;
19258
19286
  const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops;
19259
- const accepted = new Set(findAcceptedSilentDrops(resourceType, desiredProperties, allowedKeys, recordedProperties));
19260
- const removable = drops.map(({ property }) => property).filter((property) => createOnly?.has(property) !== true || evidence.has(property) && !accepted.has(property));
19287
+ const removable = findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly?.has(property) !== true).concat(evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence).filter((property) => desiredProperties === void 0 || !Object.hasOwn(desiredProperties, property) || askedUnchanged(recordedProperties, desiredProperties, property)));
19261
19288
  if (removable.length === 0) return recordedProperties;
19262
19289
  const narrowed = { ...recordedProperties };
19263
19290
  for (const property of removable) delete narrowed[property];
19264
19291
  return narrowed;
19265
19292
  }
19266
19293
  function findUnwrittenCreateOnlyDrops(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
19267
- const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops;
19268
- if (createOnly === void 0 || createOnly.size === 0 || evidence.size === 0) return [];
19294
+ return evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence).filter((property) => Object.hasOwn(desiredProperties, property) && askedUnchanged(recordedProperties, desiredProperties, property));
19295
+ }
19296
+ function evidenceNamedUnwritten(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence) {
19297
+ if (evidence.size === 0) return [];
19298
+ const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops ?? /* @__PURE__ */ new Set();
19269
19299
  const accepted = new Set(findAcceptedSilentDrops(resourceType, desiredProperties, allowedKeys, recordedProperties));
19270
- return findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && evidence.has(property) && !accepted.has(property) && Object.hasOwn(desiredProperties, property) && sameJsonValue(recordedProperties[property], desiredProperties[property], "unchanged"));
19300
+ return [...findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && evidence.has(property) && !accepted.has(property)), ...findHandledUnwrittenCreateOnly(resourceType, recordedProperties, evidence)].sort((a, b) => a.localeCompare(b));
19301
+ }
19302
+ function askedUnchanged(recordedProperties, desiredProperties, property) {
19303
+ return sameJsonValue(recordedProperties[property], desiredProperties[property], "unchanged");
19304
+ }
19305
+ function findHandledUnwrittenCreateOnly(resourceType, recordedProperties, evidence) {
19306
+ if (evidence.size === 0) return [];
19307
+ const handled = getPropertyCoverage(resourceType)?.handled;
19308
+ if (handled === void 0) return [];
19309
+ const createOnlyRoots = new Set((CREATE_ONLY_PATHS_SNAPSHOT.get(resourceType) ?? []).filter((path) => path.length === 1).map((path) => path[0]));
19310
+ return [...evidence].filter((property) => handled.has(property) && createOnlyRoots.has(property) && Object.hasOwn(recordedProperties, property)).sort((a, b) => a.localeCompare(b));
19311
+ }
19312
+ function acceptedCreateOnlyDropsEvidence(recordedProperties, resourceType, provisionedBy, carried) {
19313
+ if (provisionedBy !== "sdk") return void 0;
19314
+ const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops ?? /* @__PURE__ */ new Set();
19315
+ const names = findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && (carried === void 0 || carried.has(property)));
19316
+ const handled = carried === void 0 ? [] : findHandledUnwrittenCreateOnly(resourceType, recordedProperties, carried);
19317
+ const all = [...names, ...handled].sort((a, b) => a.localeCompare(b));
19318
+ return all.length > 0 ? all : void 0;
19271
19319
  }
19272
19320
  function unwrittenCreateOnlyReplacement(resourceType, recordedProperties, desiredProperties, allowedKeys, evidence, replacingPaths) {
19273
19321
  if (replacingPaths.length === 0) return [];
@@ -21107,6 +21155,9 @@ const REF_RETURNS_ARN_FROM_STATE = /* @__PURE__ */ new Map([
21107
21155
  ["AWS::AppSync::DataSource", ["DataSourceArn"]],
21108
21156
  ["AWS::AppSync::Resolver", ["ResolverArn"]]
21109
21157
  ]);
21158
+ function graphQLSchemaCfnId(physicalId) {
21159
+ return /^[a-z0-9]+$/.test(physicalId) ? `${physicalId}GraphQLSchema` : physicalId;
21160
+ }
21110
21161
  function isStalePlaceholderArnAttribute(resourceType, attributeName, value) {
21111
21162
  if (!REF_RETURNS_ARN_FROM_STATE.get(resourceType)?.includes(attributeName)) return false;
21112
21163
  return typeof value === "string" && isPlaceholderArn(value);
@@ -21187,6 +21238,7 @@ function lacksRecordedTableArn(resource) {
21187
21238
  }
21188
21239
  function cfnRefValueFromPhysicalId(resourceType, physicalId, stateLookup) {
21189
21240
  if (resourceType === "AWS::S3Tables::Table") return s3TablesTableRefFromPhysicalId(physicalId, stateLookup);
21241
+ if (resourceType === "AWS::AppSync::GraphQLSchema") return graphQLSchemaCfnId(physicalId);
21190
21242
  if (resourceType === "AWS::Glue::Table") {
21191
21243
  const tableName = glueTableRefFromPhysicalId(physicalId, stateLookup);
21192
21244
  if (tableName !== void 0) return tableName;
@@ -23956,6 +24008,7 @@ async function constructAttributeForAppTypes(resolver, resource, attributeName,
23956
24008
  case "ApiId": return physicalId;
23957
24009
  default: return guardedPhysicalIdFallback(resolver, logicalId, attributeName, resourceType, physicalId, context);
23958
24010
  }
24011
+ if (resourceType === "AWS::AppSync::GraphQLSchema" && attributeName === "Id") return graphQLSchemaCfnId(physicalId);
23959
24012
  if (resourceType === "AWS::ApiGatewayV2::Api") switch (attributeName) {
23960
24013
  case "ExecuteApiArn": return `arn:${partition}:execute-api:${region}:${accountId}:${physicalId}`;
23961
24014
  case "ApiId": return physicalId;
@@ -26006,14 +26059,80 @@ function withUnsettledProperties(record, names) {
26006
26059
  };
26007
26060
  }
26008
26061
  function withoutUnsettledProperties(record) {
26009
- if (!Object.hasOwn(record, "unsettledProperties")) return record;
26010
- const { unsettledProperties: _cleared, ...rest } = record;
26062
+ if (!Object.hasOwn(record, "unsettledProperties") && !Object.hasOwn(record, "unsettledItems")) return record;
26063
+ const { unsettledProperties: _cleared, unsettledItems: _items, ...rest } = record;
26011
26064
  return rest;
26012
26065
  }
26066
+ const UNSETTLED_ITEMS_PER_PATH_CAP = 100;
26067
+ const UNSETTLED_ITEM_LENGTH_CAP = 255;
26068
+ function unsettledItemsTopKey(path) {
26069
+ const cut = path.search(/[.[]/);
26070
+ return cut === -1 ? path : path.slice(0, cut);
26071
+ }
26072
+ function unsettledItemsOf(record) {
26073
+ const out = /* @__PURE__ */ new Map();
26074
+ if (record === null || typeof record !== "object") return out;
26075
+ const value = record.unsettledItems;
26076
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return out;
26077
+ const unsettled = unsettledPropertiesOf(record);
26078
+ for (const [path, entries] of Object.entries(value)) {
26079
+ if (!unsettled.has(unsettledItemsTopKey(path))) continue;
26080
+ if (!Array.isArray(entries) || entries.length > 100) continue;
26081
+ const names = entries.filter((entry) => typeof entry === "string" && entry !== "" && entry.length <= 255);
26082
+ if (names.length > 0) out.set(path, new Set(names));
26083
+ }
26084
+ return out;
26085
+ }
26086
+ function isUsableAttemptedName(name) {
26087
+ return !name.includes("{{resolve:") && !name.includes("***");
26088
+ }
26089
+ function withUnsettledItems(record, items) {
26090
+ const merged = /* @__PURE__ */ new Map();
26091
+ for (const [path, names] of unsettledItemsOf(record)) merged.set(path, new Set(names));
26092
+ const unsettled = unsettledPropertiesOf(record);
26093
+ let added = false;
26094
+ for (const [path, names] of items) {
26095
+ if (!unsettled.has(unsettledItemsTopKey(path))) continue;
26096
+ const set = merged.get(path) ?? /* @__PURE__ */ new Set();
26097
+ for (const name of names) {
26098
+ if (typeof name !== "string" || name === "" || name.length > 255) continue;
26099
+ if (!set.has(name)) {
26100
+ set.add(name);
26101
+ added = true;
26102
+ }
26103
+ }
26104
+ if (set.size > 0) merged.set(path, set);
26105
+ }
26106
+ if (!added) return record;
26107
+ const field = {};
26108
+ for (const [path, set] of [...merged].sort(([a], [b]) => a.localeCompare(b))) if (set.size <= 100) field[path] = [...set].sort();
26109
+ return {
26110
+ ...record,
26111
+ unsettledItems: field
26112
+ };
26113
+ }
26114
+ function unsettledItemsField(source, keys) {
26115
+ const allowed = new Set(keys);
26116
+ const field = {};
26117
+ for (const [path, names] of unsettledItemsOf(source)) if (allowed.has(unsettledItemsTopKey(path))) field[path] = [...names].sort();
26118
+ return Object.keys(field).length > 0 ? { unsettledItems: field } : {};
26119
+ }
26013
26120
  function unsettledContextOf(...records) {
26014
26121
  const names = /* @__PURE__ */ new Set();
26015
- for (const record of records) for (const name of unsettledPropertiesOf(record)) names.add(name);
26016
- return names.size > 0 ? { unsettledProperties: names } : {};
26122
+ const items = /* @__PURE__ */ new Map();
26123
+ for (const record of records) {
26124
+ for (const name of unsettledPropertiesOf(record)) names.add(name);
26125
+ for (const [path, set] of unsettledItemsOf(record)) {
26126
+ const merged = items.get(path) ?? /* @__PURE__ */ new Set();
26127
+ for (const name of set) merged.add(name);
26128
+ items.set(path, merged);
26129
+ }
26130
+ }
26131
+ if (names.size === 0) return {};
26132
+ return {
26133
+ unsettledProperties: names,
26134
+ ...items.size > 0 && { unsettledItems: items }
26135
+ };
26017
26136
  }
26018
26137
 
26019
26138
  //#endregion
@@ -28671,7 +28790,7 @@ var CloudControlProvider = class {
28671
28790
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
28672
28791
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
28673
28792
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
28674
- const { ASGProvider } = await import("./asg-provider-I1bFHVsO.js");
28793
+ const { ASGProvider } = await import("./asg-provider-CVLTQtQr.js");
28675
28794
  const delegateRegion = ambientRegion();
28676
28795
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
28677
28796
  if (asgProvider === void 0) {
@@ -28780,7 +28899,7 @@ var CloudControlProvider = class {
28780
28899
  const family = SDK_DELETE_FAMILIES.get(resourceType);
28781
28900
  const cached = this.sdkDeleteDelegates.get(family);
28782
28901
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
28783
- const provider = family === "rds" ? new (await (import("./rds-provider-BqwTQeS-.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-8kjFmR1l.js"))).NeptuneProvider({ region: ccRegion });
28902
+ const provider = family === "rds" ? new (await (import("./rds-provider-CXSZq1c8.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-qdoLunCh.js"))).NeptuneProvider({ region: ccRegion });
28784
28903
  this.sdkDeleteDelegates.set(family, {
28785
28904
  region: ccRegion,
28786
28905
  provider
@@ -31592,6 +31711,7 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
31592
31711
  ["Source.Auth", ["Type"]],
31593
31712
  ["Source.GitSubmodulesConfig", ["FetchSubmodules"]],
31594
31713
  ["Tags", ["Key", "Value"]],
31714
+ ["Triggers.FilterGroups", ["Pattern", "Type"]],
31595
31715
  ["Triggers.PullRequestBuildPolicy", ["RequiresCommentApproval"]],
31596
31716
  ["Triggers.ScopeConfiguration", ["Name"]]
31597
31717
  ])],
@@ -31770,6 +31890,7 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
31770
31890
  ["DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration", ["Type", "Value"]],
31771
31891
  ["DeploymentConfiguration.LifecycleHooks", ["LifecycleStages"]],
31772
31892
  ["ForceNewDeployment", ["EnableForceNewDeployment"]],
31893
+ ["GatewayConnectors", ["PortName"]],
31773
31894
  ["LoadBalancers.AdvancedConfiguration", ["AlternateTargetGroupArn"]],
31774
31895
  ["Monitoring", ["MetricConfigurations"]],
31775
31896
  ["Monitoring.MetricConfigurations", ["MetricNames", "ResolutionSeconds"]],
@@ -31799,6 +31920,8 @@ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
31799
31920
  ["ContainerDefinitions.LogConfiguration", ["LogDriver"]],
31800
31921
  ["ContainerDefinitions.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
31801
31922
  ["ContainerDefinitions.ResourceRequirements", ["Type"]],
31923
+ ["ContainerDefinitions.ResourceRequirements.SharingStrategy", ["NvidiaMps"]],
31924
+ ["ContainerDefinitions.ResourceRequirements.SharingStrategy.NvidiaMps", ["Memory"]],
31802
31925
  ["ContainerDefinitions.Secrets", ["Name", "ValueFrom"]],
31803
31926
  ["ContainerDefinitions.Ulimits", [
31804
31927
  "HardLimit",
@@ -32876,6 +32999,7 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
32876
32999
  ["AWS::CloudFront::OriginAccessControl", "{\"OriginAccessControlConfig\":\"object\"}"],
32877
33000
  ["AWS::CloudTrail::Trail", "{\"AdvancedEventSelectors\":\"array\",\"AdvancedEventSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors[].EndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].Equals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEquals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotStartsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].StartsWith\":\"array\",\"AggregationConfigurations\":\"array\",\"AggregationConfigurations[]\":\"object\",\"AggregationConfigurations[].Templates\":\"array\",\"EventSelectors\":\"array\",\"EventSelectors[]\":\"object\",\"EventSelectors[].DataResources\":\"array\",\"EventSelectors[].DataResources[]\":\"object\",\"EventSelectors[].DataResources[].Values\":\"array\",\"EventSelectors[].ExcludeManagementEventSources\":\"array\",\"InsightSelectors\":\"array\",\"InsightSelectors[]\":\"object\",\"InsightSelectors[].EventCategories\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
32878
33001
  ["AWS::CloudWatch::Alarm", "{\"ActionConfiguration\":\"object\",\"ActionConfiguration.AlarmTagsPropagation\":\"object\",\"ActionConfiguration.AlarmTagsPropagation.ExcludedTagKeys\":\"array\",\"ActionConfiguration.AlarmTagsPropagation.IncludedTagKeys\":\"array\",\"AlarmActions\":\"array\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"EvaluationCriteria\":\"object\",\"EvaluationCriteria.PromQLCriteria\":\"object\",\"EvaluationWindow\":\"object\",\"EvaluationWindow.SlidingWindow\":\"object\",\"EvaluationWindow.WallClockWindow\":\"object\",\"InsufficientDataActions\":\"array\",\"Metrics\":\"array\",\"Metrics[]\":\"object\",\"Metrics[].MetricStat\":\"object\",\"Metrics[].MetricStat.Metric\":\"object\",\"Metrics[].MetricStat.Metric.Dimensions\":\"array\",\"Metrics[].MetricStat.Metric.Dimensions[]\":\"object\",\"OKActions\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"WarmUpConfiguration\":\"object\"}"],
33002
+ ["AWS::CodeBuild::Project", "{\"Artifacts\":\"object\",\"BuildBatchConfig\":\"object\",\"BuildBatchConfig.Restrictions\":\"object\",\"BuildBatchConfig.Restrictions.ComputeTypesAllowed\":\"array\",\"BuildBatchConfig.Restrictions.FleetsAllowed\":\"array\",\"Cache\":\"object\",\"Cache.Modes\":\"array\",\"Environment\":\"object\",\"Environment.DockerServer\":\"object\",\"Environment.DockerServer.SecurityGroupIds\":\"array\",\"Environment.EnvironmentVariables\":\"array\",\"Environment.EnvironmentVariables[]\":\"object\",\"Environment.Fleet\":\"object\",\"Environment.RegistryCredential\":\"object\",\"FileSystemLocations\":\"array\",\"FileSystemLocations[]\":\"object\",\"LogsConfig\":\"object\",\"LogsConfig.CloudWatchLogs\":\"object\",\"LogsConfig.S3Logs\":\"object\",\"SecondaryArtifacts\":\"array\",\"SecondaryArtifacts[]\":\"object\",\"SecondarySourceVersions\":\"array\",\"SecondarySourceVersions[]\":\"object\",\"SecondarySources\":\"array\",\"SecondarySources[]\":\"object\",\"SecondarySources[].Auth\":\"object\",\"SecondarySources[].BuildStatusConfig\":\"object\",\"SecondarySources[].GitSubmodulesConfig\":\"object\",\"Source\":\"object\",\"Source.Auth\":\"object\",\"Source.BuildStatusConfig\":\"object\",\"Source.GitSubmodulesConfig\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"object\",\"Triggers.FilterGroups\":\"array\",\"Triggers.FilterGroups[]\":\"array\",\"Triggers.FilterGroups[][]\":\"object\",\"Triggers.PullRequestBuildPolicy\":\"object\",\"Triggers.PullRequestBuildPolicy.ApproverRoles\":\"array\",\"Triggers.ScopeConfiguration\":\"object\",\"VpcConfig\":\"object\",\"VpcConfig.SecurityGroupIds\":\"array\",\"VpcConfig.Subnets\":\"array\"}"],
32879
33003
  ["AWS::CodeCommit::Repository", "{\"Code\":\"object\",\"Code.S3\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"array\",\"Triggers[]\":\"object\",\"Triggers[].Branches\":\"array\",\"Triggers[].Events\":\"array\"}"],
32880
33004
  ["AWS::Cognito::UserPool", "{\"AccountRecoverySetting\":\"object\",\"AccountRecoverySetting.RecoveryMechanisms\":\"array\",\"AccountRecoverySetting.RecoveryMechanisms[]\":\"object\",\"AdminCreateUserConfig\":\"object\",\"AdminCreateUserConfig.InviteMessageTemplate\":\"object\",\"AliasAttributes\":\"array\",\"AutoVerifiedAttributes\":\"array\",\"DeviceConfiguration\":\"object\",\"EmailConfiguration\":\"object\",\"EnabledMfas\":\"array\",\"IssuerConfiguration\":\"object\",\"KeyConfiguration\":\"object\",\"LambdaConfig\":\"object\",\"LambdaConfig.CustomEmailSender\":\"object\",\"LambdaConfig.CustomSMSSender\":\"object\",\"LambdaConfig.InboundFederation\":\"object\",\"LambdaConfig.PreTokenGenerationConfig\":\"object\",\"Policies\":\"object\",\"Policies.PasswordPolicy\":\"object\",\"Policies.SignInPolicy\":\"object\",\"Policies.SignInPolicy.AllowedFirstAuthFactors\":\"array\",\"Schema\":\"array\",\"Schema[]\":\"object\",\"Schema[].NumberAttributeConstraints\":\"object\",\"Schema[].StringAttributeConstraints\":\"object\",\"SmsConfiguration\":\"object\",\"SmsConfiguration.EumsSms\":\"object\",\"UserAttributeUpdateSettings\":\"object\",\"UserAttributeUpdateSettings.AttributesRequireVerificationBeforeUpdate\":\"array\",\"UserPoolAddOns\":\"object\",\"UserPoolAddOns.AdvancedSecurityAdditionalFlows\":\"object\",\"UserPoolTags\":\"object\",\"UsernameAttributes\":\"array\",\"UsernameConfiguration\":\"object\",\"VerificationMessageTemplate\":\"object\"}"],
32881
33005
  ["AWS::DLM::LifecyclePolicy", "{\"CrossRegionCopyTargets\":\"array\",\"CrossRegionCopyTargets[]\":\"object\",\"Exclusions\":\"object\",\"Exclusions.ExcludeTags\":\"array\",\"Exclusions.ExcludeTags[]\":\"object\",\"Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails\":\"object\",\"PolicyDetails.Actions\":\"array\",\"PolicyDetails.Actions[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy\":\"array\",\"PolicyDetails.Actions[].CrossRegionCopy[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].EncryptionConfiguration\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].RetainRule\":\"object\",\"PolicyDetails.CrossRegionCopyTargets\":\"array\",\"PolicyDetails.CrossRegionCopyTargets[]\":\"object\",\"PolicyDetails.EventSource\":\"object\",\"PolicyDetails.EventSource.Parameters\":\"object\",\"PolicyDetails.EventSource.Parameters.SnapshotOwner\":\"array\",\"PolicyDetails.Exclusions\":\"object\",\"PolicyDetails.Exclusions.ExcludeTags\":\"array\",\"PolicyDetails.Exclusions.ExcludeTags[]\":\"object\",\"PolicyDetails.Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails.Parameters\":\"object\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags\":\"array\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags[]\":\"object\",\"PolicyDetails.ResourceLocations\":\"array\",\"PolicyDetails.ResourceTypes\":\"array\",\"PolicyDetails.Schedules\":\"array\",\"PolicyDetails.Schedules[]\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule.RetentionArchiveTier\":\"object\",\"PolicyDetails.Schedules[].CreateRule\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Scripts[]\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts[].Stages\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Times\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[]\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZoneIds\":\"array\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZones\":\"array\",\"PolicyDetails.Schedules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].ShareRules\":\"array\",\"PolicyDetails.Schedules[].ShareRules[]\":\"object\",\"PolicyDetails.Schedules[].ShareRules[].TargetAccounts\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd[]\":\"object\",\"PolicyDetails.Schedules[].VariableTags\":\"array\",\"PolicyDetails.Schedules[].VariableTags[]\":\"object\",\"PolicyDetails.TargetTags\":\"array\",\"PolicyDetails.TargetTags[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
@@ -32894,8 +33018,8 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
32894
33018
  ["AWS::EC2::VPC", "{\"CidrBlockAssociations\":\"array\",\"Ipv6CidrBlocks\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VpcEncryptionControl\":\"object\",\"VpcEncryptionControl.ResourceExclusions\":\"object\",\"VpcEncryptionControl.ResourceExclusions.EgressOnlyInternetGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.ElasticFileSystem\":\"object\",\"VpcEncryptionControl.ResourceExclusions.InternetGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.Lambda\":\"object\",\"VpcEncryptionControl.ResourceExclusions.NatGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VirtualPrivateGateway\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VpcLattice\":\"object\",\"VpcEncryptionControl.ResourceExclusions.VpcPeering\":\"object\"}"],
32895
33019
  ["AWS::ECR::Repository", "{\"EncryptionConfiguration\":\"object\",\"ImageScanningConfiguration\":\"object\",\"ImageTagMutabilityExclusionFilters\":\"array\",\"ImageTagMutabilityExclusionFilters[]\":\"object\",\"LifecyclePolicy\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
32896
33020
  ["AWS::ECS::Cluster", "{\"CapacityProviders\":\"array\",\"ClusterSettings\":\"array\",\"ClusterSettings[]\":\"object\",\"Configuration\":\"object\",\"Configuration.ExecuteCommandConfiguration\":\"object\",\"Configuration.ExecuteCommandConfiguration.LogConfiguration\":\"object\",\"Configuration.ManagedStorageConfiguration\":\"object\",\"DefaultCapacityProviderStrategy\":\"array\",\"DefaultCapacityProviderStrategy[]\":\"object\",\"ServiceConnectDefaults\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
32897
- ["AWS::ECS::Service", "{\"CapacityProviderStrategy\":\"array\",\"CapacityProviderStrategy[]\":\"object\",\"DeploymentConfiguration\":\"object\",\"DeploymentConfiguration.Alarms\":\"object\",\"DeploymentConfiguration.Alarms.AlarmNames\":\"array\",\"DeploymentConfiguration.CanaryConfiguration\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration\":\"object\",\"DeploymentConfiguration.EarlySuccessCriteria\":\"object\",\"DeploymentConfiguration.LifecycleHooks\":\"array\",\"DeploymentConfiguration.LifecycleHooks[]\":\"object\",\"DeploymentConfiguration.LifecycleHooks[].LifecycleStages\":\"array\",\"DeploymentConfiguration.LifecycleHooks[].TimeoutConfiguration\":\"object\",\"DeploymentConfiguration.LinearConfiguration\":\"object\",\"DeploymentController\":\"object\",\"ForceNewDeployment\":\"object\",\"LoadBalancers\":\"array\",\"LoadBalancers[]\":\"object\",\"LoadBalancers[].AdvancedConfiguration\":\"object\",\"Monitoring\":\"object\",\"Monitoring.MetricConfigurations\":\"array\",\"Monitoring.MetricConfigurations[]\":\"object\",\"Monitoring.MetricConfigurations[].MetricNames\":\"array\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration.SecurityGroups\":\"array\",\"NetworkConfiguration.AwsvpcConfiguration.Subnets\":\"array\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"PlacementStrategies\":\"array\",\"PlacementStrategies[]\":\"object\",\"ServiceConnectConfiguration\":\"object\",\"ServiceConnectConfiguration.AccessLogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.Options\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions\":\"array\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions[]\":\"object\",\"ServiceConnectConfiguration.Services\":\"array\",\"ServiceConnectConfiguration.Services[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases\":\"array\",\"ServiceConnectConfiguration.Services[].ClientAliases[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header.Value\":\"object\",\"ServiceConnectConfiguration.Services[].Timeout\":\"object\",\"ServiceConnectConfiguration.Services[].Tls\":\"object\",\"ServiceConnectConfiguration.Services[].Tls.IssuerCertificateAuthority\":\"object\",\"ServiceRegistries\":\"array\",\"ServiceRegistries[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VolumeConfigurations\":\"array\",\"VolumeConfigurations[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags[]\":\"object\",\"VpcLatticeConfigurations\":\"array\",\"VpcLatticeConfigurations[]\":\"object\",\"VpcLatticeConfigurations[].AdvancedConfiguration\":\"object\"}"],
32898
- ["AWS::ECS::TaskDefinition", "{\"ContainerDefinitions\":\"array\",\"ContainerDefinitions[]\":\"object\",\"ContainerDefinitions[].Command\":\"array\",\"ContainerDefinitions[].CredentialSpecs\":\"array\",\"ContainerDefinitions[].DependsOn\":\"array\",\"ContainerDefinitions[].DependsOn[]\":\"object\",\"ContainerDefinitions[].DnsSearchDomains\":\"array\",\"ContainerDefinitions[].DnsServers\":\"array\",\"ContainerDefinitions[].DockerLabels\":\"object\",\"ContainerDefinitions[].DockerSecurityOptions\":\"array\",\"ContainerDefinitions[].EntryPoint\":\"array\",\"ContainerDefinitions[].Environment\":\"array\",\"ContainerDefinitions[].EnvironmentFiles\":\"array\",\"ContainerDefinitions[].EnvironmentFiles[]\":\"object\",\"ContainerDefinitions[].Environment[]\":\"object\",\"ContainerDefinitions[].ExtraHosts\":\"array\",\"ContainerDefinitions[].ExtraHosts[]\":\"object\",\"ContainerDefinitions[].FirelensConfiguration\":\"object\",\"ContainerDefinitions[].FirelensConfiguration.Options\":\"object\",\"ContainerDefinitions[].HealthCheck\":\"object\",\"ContainerDefinitions[].HealthCheck.Command\":\"array\",\"ContainerDefinitions[].Links\":\"array\",\"ContainerDefinitions[].LinuxParameters\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Add\":\"array\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Drop\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Devices[].Permissions\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[].MountOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration\":\"object\",\"ContainerDefinitions[].LogConfiguration.Options\":\"object\",\"ContainerDefinitions[].LogConfiguration.SecretOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration.SecretOptions[]\":\"object\",\"ContainerDefinitions[].MountPoints\":\"array\",\"ContainerDefinitions[].MountPoints[]\":\"object\",\"ContainerDefinitions[].PortMappings\":\"array\",\"ContainerDefinitions[].PortMappings[]\":\"object\",\"ContainerDefinitions[].RepositoryCredentials\":\"object\",\"ContainerDefinitions[].ResourceRequirements\":\"array\",\"ContainerDefinitions[].ResourceRequirements[]\":\"object\",\"ContainerDefinitions[].RestartPolicy\":\"object\",\"ContainerDefinitions[].RestartPolicy.IgnoredExitCodes\":\"array\",\"ContainerDefinitions[].Secrets\":\"array\",\"ContainerDefinitions[].Secrets[]\":\"object\",\"ContainerDefinitions[].SystemControls\":\"array\",\"ContainerDefinitions[].SystemControls[]\":\"object\",\"ContainerDefinitions[].Ulimits\":\"array\",\"ContainerDefinitions[].Ulimits[]\":\"object\",\"ContainerDefinitions[].VolumesFrom\":\"array\",\"ContainerDefinitions[].VolumesFrom[]\":\"object\",\"EphemeralStorage\":\"object\",\"InferenceAccelerators\":\"array\",\"InferenceAccelerators[]\":\"object\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"ProxyConfiguration\":\"object\",\"ProxyConfiguration.ProxyConfigurationProperties\":\"array\",\"ProxyConfiguration.ProxyConfigurationProperties[]\":\"object\",\"RequiresCompatibilities\":\"array\",\"RuntimePlatform\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Volumes\":\"array\",\"Volumes[]\":\"object\",\"Volumes[].DockerVolumeConfiguration\":\"object\",\"Volumes[].DockerVolumeConfiguration.DriverOpts\":\"object\",\"Volumes[].DockerVolumeConfiguration.Labels\":\"object\",\"Volumes[].EFSVolumeConfiguration\":\"object\",\"Volumes[].EFSVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].Host\":\"object\",\"Volumes[].S3FilesVolumeConfiguration\":\"object\"}"],
33021
+ ["AWS::ECS::Service", "{\"CapacityProviderStrategy\":\"array\",\"CapacityProviderStrategy[]\":\"object\",\"DeploymentConfiguration\":\"object\",\"DeploymentConfiguration.Alarms\":\"object\",\"DeploymentConfiguration.Alarms.AlarmNames\":\"array\",\"DeploymentConfiguration.CanaryConfiguration\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker\":\"object\",\"DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration\":\"object\",\"DeploymentConfiguration.EarlySuccessCriteria\":\"object\",\"DeploymentConfiguration.LifecycleHooks\":\"array\",\"DeploymentConfiguration.LifecycleHooks[]\":\"object\",\"DeploymentConfiguration.LifecycleHooks[].LifecycleStages\":\"array\",\"DeploymentConfiguration.LifecycleHooks[].TimeoutConfiguration\":\"object\",\"DeploymentConfiguration.LinearConfiguration\":\"object\",\"DeploymentController\":\"object\",\"ForceNewDeployment\":\"object\",\"GatewayConnectors\":\"array\",\"GatewayConnectors[]\":\"object\",\"GatewayConnectors[].Filters\":\"object\",\"GatewayConnectors[].Filters.AccessTypes\":\"array\",\"GatewayConnectors[].HealthCheck\":\"object\",\"GatewayConnectors[].HealthCheck.Matcher\":\"object\",\"LoadBalancers\":\"array\",\"LoadBalancers[]\":\"object\",\"LoadBalancers[].AdvancedConfiguration\":\"object\",\"Monitoring\":\"object\",\"Monitoring.MetricConfigurations\":\"array\",\"Monitoring.MetricConfigurations[]\":\"object\",\"Monitoring.MetricConfigurations[].MetricNames\":\"array\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration\":\"object\",\"NetworkConfiguration.AwsvpcConfiguration.SecurityGroups\":\"array\",\"NetworkConfiguration.AwsvpcConfiguration.Subnets\":\"array\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"PlacementStrategies\":\"array\",\"PlacementStrategies[]\":\"object\",\"ServiceConnectConfiguration\":\"object\",\"ServiceConnectConfiguration.AccessLogConfiguration\":\"object\",\"ServiceConnectConfiguration.ContainerConfigurations\":\"array\",\"ServiceConnectConfiguration.ContainerConfigurations[]\":\"object\",\"ServiceConnectConfiguration.LogConfiguration\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.Options\":\"object\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions\":\"array\",\"ServiceConnectConfiguration.LogConfiguration.SecretOptions[]\":\"object\",\"ServiceConnectConfiguration.Services\":\"array\",\"ServiceConnectConfiguration.Services[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases\":\"array\",\"ServiceConnectConfiguration.Services[].ClientAliases[]\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header\":\"object\",\"ServiceConnectConfiguration.Services[].ClientAliases[].TestTrafficRules.Header.Value\":\"object\",\"ServiceConnectConfiguration.Services[].Timeout\":\"object\",\"ServiceConnectConfiguration.Services[].Tls\":\"object\",\"ServiceConnectConfiguration.Services[].Tls.IssuerCertificateAuthority\":\"object\",\"ServiceRegistries\":\"array\",\"ServiceRegistries[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"VolumeConfigurations\":\"array\",\"VolumeConfigurations[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[]\":\"object\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags\":\"array\",\"VolumeConfigurations[].ManagedEBSVolume.TagSpecifications[].Tags[]\":\"object\",\"VpcLatticeConfigurations\":\"array\",\"VpcLatticeConfigurations[]\":\"object\",\"VpcLatticeConfigurations[].AdvancedConfiguration\":\"object\"}"],
33022
+ ["AWS::ECS::TaskDefinition", "{\"ContainerDefinitions\":\"array\",\"ContainerDefinitions[]\":\"object\",\"ContainerDefinitions[].Command\":\"array\",\"ContainerDefinitions[].CredentialSpecs\":\"array\",\"ContainerDefinitions[].DependsOn\":\"array\",\"ContainerDefinitions[].DependsOn[]\":\"object\",\"ContainerDefinitions[].DnsSearchDomains\":\"array\",\"ContainerDefinitions[].DnsServers\":\"array\",\"ContainerDefinitions[].DockerLabels\":\"object\",\"ContainerDefinitions[].DockerSecurityOptions\":\"array\",\"ContainerDefinitions[].EntryPoint\":\"array\",\"ContainerDefinitions[].Environment\":\"array\",\"ContainerDefinitions[].EnvironmentFiles\":\"array\",\"ContainerDefinitions[].EnvironmentFiles[]\":\"object\",\"ContainerDefinitions[].Environment[]\":\"object\",\"ContainerDefinitions[].ExtraHosts\":\"array\",\"ContainerDefinitions[].ExtraHosts[]\":\"object\",\"ContainerDefinitions[].FirelensConfiguration\":\"object\",\"ContainerDefinitions[].FirelensConfiguration.Options\":\"object\",\"ContainerDefinitions[].HealthCheck\":\"object\",\"ContainerDefinitions[].HealthCheck.Command\":\"array\",\"ContainerDefinitions[].Links\":\"array\",\"ContainerDefinitions[].LinuxParameters\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities\":\"object\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Add\":\"array\",\"ContainerDefinitions[].LinuxParameters.Capabilities.Drop\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices\":\"array\",\"ContainerDefinitions[].LinuxParameters.Devices[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Devices[].Permissions\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs\":\"array\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[]\":\"object\",\"ContainerDefinitions[].LinuxParameters.Tmpfs[].MountOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration\":\"object\",\"ContainerDefinitions[].LogConfiguration.Options\":\"object\",\"ContainerDefinitions[].LogConfiguration.SecretOptions\":\"array\",\"ContainerDefinitions[].LogConfiguration.SecretOptions[]\":\"object\",\"ContainerDefinitions[].MountPoints\":\"array\",\"ContainerDefinitions[].MountPoints[]\":\"object\",\"ContainerDefinitions[].PortMappings\":\"array\",\"ContainerDefinitions[].PortMappings[]\":\"object\",\"ContainerDefinitions[].RepositoryCredentials\":\"object\",\"ContainerDefinitions[].ResourceRequirements\":\"array\",\"ContainerDefinitions[].ResourceRequirements[]\":\"object\",\"ContainerDefinitions[].ResourceRequirements[].SharingStrategy\":\"object\",\"ContainerDefinitions[].ResourceRequirements[].SharingStrategy.NvidiaMps\":\"object\",\"ContainerDefinitions[].RestartPolicy\":\"object\",\"ContainerDefinitions[].RestartPolicy.IgnoredExitCodes\":\"array\",\"ContainerDefinitions[].Secrets\":\"array\",\"ContainerDefinitions[].Secrets[]\":\"object\",\"ContainerDefinitions[].SystemControls\":\"array\",\"ContainerDefinitions[].SystemControls[]\":\"object\",\"ContainerDefinitions[].Ulimits\":\"array\",\"ContainerDefinitions[].Ulimits[]\":\"object\",\"ContainerDefinitions[].VolumesFrom\":\"array\",\"ContainerDefinitions[].VolumesFrom[]\":\"object\",\"EphemeralStorage\":\"object\",\"InferenceAccelerators\":\"array\",\"InferenceAccelerators[]\":\"object\",\"PlacementConstraints\":\"array\",\"PlacementConstraints[]\":\"object\",\"ProxyConfiguration\":\"object\",\"ProxyConfiguration.ProxyConfigurationProperties\":\"array\",\"ProxyConfiguration.ProxyConfigurationProperties[]\":\"object\",\"RequiresCompatibilities\":\"array\",\"RuntimePlatform\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Volumes\":\"array\",\"Volumes[]\":\"object\",\"Volumes[].DockerVolumeConfiguration\":\"object\",\"Volumes[].DockerVolumeConfiguration.DriverOpts\":\"object\",\"Volumes[].DockerVolumeConfiguration.Labels\":\"object\",\"Volumes[].EFSVolumeConfiguration\":\"object\",\"Volumes[].EFSVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration\":\"object\",\"Volumes[].FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig\":\"object\",\"Volumes[].Host\":\"object\",\"Volumes[].S3FilesVolumeConfiguration\":\"object\"}"],
32899
33023
  ["AWS::EFS::AccessPoint", "{\"AccessPointTags\":\"array\",\"AccessPointTags[]\":\"object\",\"PosixUser\":\"object\",\"PosixUser.SecondaryGids\":\"array\",\"RootDirectory\":\"object\",\"RootDirectory.CreationInfo\":\"object\"}"],
32900
33024
  ["AWS::EFS::FileSystem", "{\"BackupPolicy\":\"object\",\"FileSystemPolicy\":\"object\",\"FileSystemProtection\":\"object\",\"FileSystemTags\":\"array\",\"FileSystemTags[]\":\"object\",\"LifecyclePolicies\":\"array\",\"LifecyclePolicies[]\":\"object\",\"ReplicationConfiguration\":\"object\",\"ReplicationConfiguration.Destinations\":\"array\",\"ReplicationConfiguration.Destinations[]\":\"object\"}"],
32901
33025
  ["AWS::EFS::MountTarget", "{\"SecurityGroups\":\"array\"}"],
@@ -35758,7 +35882,50 @@ function noEchoAttributeNamesFor(run, logicalId, record, carried, leaves) {
35758
35882
  if (declared === void 0 && prior === void 0 && !echoed) return void 0;
35759
35883
  return [...names].sort();
35760
35884
  }
35885
+ function withNoEchoItemsMasked(run, deps, logicalId, record) {
35886
+ const items = record.unsettledItems;
35887
+ if (typeof items !== "object" || items === null || Array.isArray(items)) return record;
35888
+ const secrets = deps.perResourceSecrets().get(logicalId);
35889
+ const plaintexts = secrets === void 0 ? [] : noEchoParameterPlaintextsOf(secrets).filter((plaintext) => plaintext !== "");
35890
+ const positioned = /* @__PURE__ */ new Set();
35891
+ for (const json of run.noEchoPositionedValues.get(logicalId) ?? []) {
35892
+ let value;
35893
+ try {
35894
+ value = JSON.parse(json);
35895
+ } catch {
35896
+ continue;
35897
+ }
35898
+ if (typeof value === "string" && value !== "") positioned.add(value);
35899
+ }
35900
+ if (plaintexts.length === 0 && positioned.size === 0) return record;
35901
+ return withAttemptedItemsMasked(record, [...positioned, ...plaintexts]);
35902
+ }
35903
+ function withAttemptedItemsMasked(record, needles) {
35904
+ const items = record.unsettledItems;
35905
+ if (typeof items !== "object" || items === null || Array.isArray(items)) return record;
35906
+ const usable = needles.filter((needle) => needle !== "" && needle !== "***");
35907
+ if (usable.length === 0) return record;
35908
+ let changed = false;
35909
+ const masked = {};
35910
+ for (const [path, entries] of Object.entries(items)) {
35911
+ if (!Array.isArray(entries)) {
35912
+ masked[path] = entries;
35913
+ continue;
35914
+ }
35915
+ masked[path] = [...new Set(entries.map((entry) => {
35916
+ if (typeof entry !== "string") return entry;
35917
+ const served = usable.some((needle) => entry.includes(needle));
35918
+ if (served) changed = true;
35919
+ return served ? "***" : entry;
35920
+ }))];
35921
+ }
35922
+ return changed ? {
35923
+ ...record,
35924
+ unsettledItems: masked
35925
+ } : record;
35926
+ }
35761
35927
  function applyNoEchoPersist(run, deps, logicalId, record, scrubbed, templateProps, resources, secrets, carried = false) {
35928
+ scrubbed = withNoEchoItemsMasked(run, deps, logicalId, scrubbed);
35762
35929
  const sources = noEchoPositionSources(run, resources);
35763
35930
  if (sources === void 0) return scrubbed;
35764
35931
  const leaves = noEchoLeavesFor(run, deps, logicalId, record, templateProps, sources);
@@ -37258,6 +37425,10 @@ function maskingRetryLogger(logger, secrets) {
37258
37425
  //#region src/deployment/deploy-engine/options.ts
37259
37426
  const DEFAULT_RESOURCE_WARN_AFTER_MS = 3e5;
37260
37427
  const DEFAULT_RESOURCE_TIMEOUT_MS = 18e5;
37428
+ const DEFAULT_UNSETTLED_REVERT_WAIT = {
37429
+ timeoutMs: DEFAULT_RESOURCE_TIMEOUT_MS,
37430
+ pollMs: 1e4
37431
+ };
37261
37432
 
37262
37433
  //#endregion
37263
37434
  //#region src/analyzer/skipped-outputs.ts
@@ -39533,7 +39704,7 @@ const MERGE_SEMANTICS_KEYS = /* @__PURE__ */ new Set(["Tags"]);
39533
39704
  async function readLive(args, names) {
39534
39705
  const { provider, physicalId, logicalId, resourceType, recordedProperties } = args;
39535
39706
  let live;
39536
- if (provider.readUnsettled !== void 0) live = await provider.readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, args.desired);
39707
+ if (provider.readUnsettled !== void 0) live = await provider.readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, args.desired, args.attemptedItems);
39537
39708
  else if (provider.readCurrentState !== void 0) live = await provider.readCurrentState(physicalId, logicalId, resourceType, recordedProperties);
39538
39709
  else return;
39539
39710
  if (typeof live !== "object" || live === null || Array.isArray(live)) return "unreadable";
@@ -39551,23 +39722,55 @@ async function settleUnsettledPrevious(args) {
39551
39722
  if (moving.size > 0) throw refusal(args, moving, "AWS is still changing it or cdkd could not confirm it settled");
39552
39723
  }
39553
39724
  const substituted = new Set([...names].filter((name) => !MERGE_SEMANTICS_KEYS.has(name)));
39554
- if (substituted.size === 0) return previous;
39725
+ const attemptedTags = [...args.attemptedItems?.get("Tags") ?? []].filter(isUsableAttemptedName);
39726
+ const mergeNeedsLive = names.has("Tags") && attemptedTags.length > 0;
39727
+ if (substituted.size === 0 && !mergeNeedsLive) return previous;
39555
39728
  let live;
39556
39729
  try {
39557
- live = await readLive(args, substituted);
39730
+ live = await readLive(args, substituted.size > 0 ? substituted : /* @__PURE__ */ new Set(["Tags"]));
39558
39731
  } catch (error) {
39732
+ if (substituted.size === 0) return previous;
39559
39733
  if (error instanceof ProvisioningError) throw error;
39560
39734
  const wrapped = refusal(args, substituted, "the resource could not be read to converge it");
39561
39735
  if (error instanceof Error) wrapped.cause = error;
39562
39736
  throw wrapped;
39563
39737
  }
39564
39738
  if (live === void 0) return previous;
39565
- if (live === "unreadable") throw refusal(args, substituted, "the resource could not be read to converge it");
39739
+ if (live === "unreadable") {
39740
+ if (substituted.size === 0) return previous;
39741
+ throw refusal(args, substituted, "the resource could not be read to converge it");
39742
+ }
39566
39743
  const out = { ...previous };
39567
39744
  for (const name of substituted) if (Object.hasOwn(live, name) && live[name] !== void 0) out[name] = live[name];
39568
39745
  else delete out[name];
39746
+ if (mergeNeedsLive) {
39747
+ const withAttempted = withAttemptedTags(out["Tags"], live["Tags"], args.desired?.["Tags"], attemptedTags);
39748
+ if (withAttempted !== void 0) out["Tags"] = withAttempted;
39749
+ }
39569
39750
  return out;
39570
39751
  }
39752
+ function withAttemptedTags(recorded, live, desired, attempted) {
39753
+ const keysOf = (value) => {
39754
+ if (value === void 0 || value === null) return /* @__PURE__ */ new Set();
39755
+ if (!Array.isArray(value)) return void 0;
39756
+ const keys = /* @__PURE__ */ new Set();
39757
+ for (const entry of value) {
39758
+ const key = entry?.Key;
39759
+ if (typeof key !== "string") return void 0;
39760
+ keys.add(key);
39761
+ }
39762
+ return keys;
39763
+ };
39764
+ const recordedKeys = keysOf(recorded);
39765
+ const desiredKeys = keysOf(desired);
39766
+ if (recordedKeys === void 0 || desiredKeys === void 0 || !Array.isArray(live)) return void 0;
39767
+ const removable = live.filter((entry) => {
39768
+ const key = entry?.Key;
39769
+ return typeof key === "string" && attempted.includes(key) && !recordedKeys.has(key) && !desiredKeys.has(key);
39770
+ });
39771
+ if (removable.length === 0) return void 0;
39772
+ return [...recorded ?? [], ...removable];
39773
+ }
39571
39774
  function tagsHeld(desired, live) {
39572
39775
  const asMap = (value) => {
39573
39776
  if (value === void 0 || value === null) return /* @__PURE__ */ new Map();
@@ -39624,7 +39827,42 @@ async function withUnprovenUnsettled(record, args, warn) {
39624
39827
  const kept = await unsettledAfterUpdate(args);
39625
39828
  if (kept.length === 0) return record;
39626
39829
  warn(safeMsg`${args.logicalId} (${args.resourceType}): the update succeeded, but AWS does not yet show the requested ${kept.join(", ")}; cdkd keeps ${kept.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
39627
- return withUnsettledProperties(record, kept);
39830
+ const withNames = withUnsettledProperties(record, kept);
39831
+ return withUnsettledItems(withNames, args.attemptedItems ?? /* @__PURE__ */ new Map());
39832
+ }
39833
+ async function waitForUnsettledSettled(args) {
39834
+ const { provider, names } = args;
39835
+ const deadline = Date.now() + args.timeoutMs;
39836
+ if (args.running !== void 0) {
39837
+ let returned = false;
39838
+ const done = args.running.then(() => {
39839
+ returned = true;
39840
+ }, () => {
39841
+ returned = true;
39842
+ });
39843
+ while (!returned) {
39844
+ if (args.isInterrupted()) return "interrupted";
39845
+ const left = deadline - Date.now();
39846
+ if (left <= 0) return "moving";
39847
+ await Promise.race([done, new Promise((resolve) => setTimeout(resolve, Math.min(250, left)))]);
39848
+ }
39849
+ }
39850
+ if (provider.unsettledInTransition === void 0 || names.size === 0) return "settled";
39851
+ for (;;) {
39852
+ if (args.isInterrupted()) return "interrupted";
39853
+ let moving = true;
39854
+ try {
39855
+ moving = (await provider.unsettledInTransition(args.physicalId, args.logicalId, args.resourceType, names, args.recordedProperties)).size > 0;
39856
+ } catch {}
39857
+ if (!moving) return "settled";
39858
+ const left = deadline - Date.now();
39859
+ if (left <= 0) return "moving";
39860
+ const until = Date.now() + Math.min(args.pollMs, left);
39861
+ while (Date.now() < until) {
39862
+ if (args.isInterrupted()) return "interrupted";
39863
+ await new Promise((resolve) => setTimeout(resolve, Math.min(250, until - Date.now())));
39864
+ }
39865
+ }
39628
39866
  }
39629
39867
  function splitUnhandledRemovals(unhandled, recordedPrevious, unsettled) {
39630
39868
  const addedByFailedUpdate = unhandled.filter((name) => unsettled.has(name) && !Object.hasOwn(recordedPrevious, name));
@@ -39655,7 +39893,8 @@ async function updateWithRollbackRetry(provider, args, logicalId, logger, isInte
39655
39893
  recordedProperties: recordedPrevious,
39656
39894
  names: context?.unsettledProperties ?? /* @__PURE__ */ new Set(),
39657
39895
  previous: recordedPrevious,
39658
- desired
39896
+ desired,
39897
+ ...context?.unsettledItems !== void 0 && { attemptedItems: context.unsettledItems }
39659
39898
  });
39660
39899
  const removal = prepareRemovalForUpdate(provider, resourceType, desired, previous);
39661
39900
  const revertArgs = [
@@ -40012,7 +40251,8 @@ async function replayRevert(s) {
40012
40251
  resourceType: op.resourceType,
40013
40252
  recordedProperties: current.properties ?? {},
40014
40253
  names: unsettledContextOf(current, previousState).unsettledProperties ?? /* @__PURE__ */ new Set(),
40015
- desired: desiredProps ?? {}
40254
+ desired: desiredProps ?? {},
40255
+ ...unsettledContextOf(current, previousState).unsettledItems !== void 0 && { attemptedItems: unsettledContextOf(current, previousState).unsettledItems }
40016
40256
  }, (message) => logger.warn(mask(message)));
40017
40257
  if (updatePartialReason(revertResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(previousState.properties?.["Policies"], current.properties?.["Policies"]), revertVia);
40018
40258
  const rollbackPartial = updatePartialReason(revertResult);
@@ -40253,11 +40493,13 @@ async function replayReverseReplacement(s) {
40253
40493
  }
40254
40494
  const { observedProperties: _staleObserved, ...prevRecord } = prev;
40255
40495
  recordNoEchoAttributeValues(createResult, secrets, resolvedPrevProps);
40496
+ const restoredProperties = recordedPropertiesAfterReplayCreate(prevRecord, createResult);
40256
40497
  stateResources[op.logicalId] = redactRollbackRecord({
40257
40498
  ...withNameGenerationReached(prevRecord, op.logicalId, op.nameGeneration),
40258
40499
  physicalId: createResult.physicalId,
40259
40500
  attributes: createResult.attributes ?? {},
40260
- properties: recordedPropertiesAfterReplayCreate(prevRecord, createResult)
40501
+ properties: restoredProperties,
40502
+ acceptedCreateOnlyDrops: acceptedCreateOnlyDropsEvidence(restoredProperties, oldType, createProvisionedBy)
40261
40503
  }, secrets, prevRecord.properties, prevRecord.attributes);
40262
40504
  if (!adoptedLiveNewResource) inlinePolicyWriters.record(op.logicalId, "create", stateResources[op.logicalId], false, createProvisionedBy);
40263
40505
  const deferral = s.deferral !== void 0 && !deletedNewFirst && !adoptedLiveNewResource && !rollbackRetainsNewResource(current) ? s.deferral : void 0;
@@ -40674,6 +40916,12 @@ async function replaySingle(op, stateResources, stackName, ctx, resolver, orphan
40674
40916
  function ownRecord(stateResources, logicalId) {
40675
40917
  return Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
40676
40918
  }
40919
+ function withKeysFrom(bag, source, keys) {
40920
+ const out = { ...bag };
40921
+ for (const key of keys) if (source !== void 0 && Object.hasOwn(source, key)) out[key] = source[key];
40922
+ else delete out[key];
40923
+ return out;
40924
+ }
40677
40925
  async function replayFailedOperationsUnbound(failedOps, stateResources, stackName, ctx, options = {}) {
40678
40926
  const inlinePolicyWriters = options.inlinePolicyWriters ?? new RollbackInlinePolicyWriters();
40679
40927
  const result = {
@@ -40906,7 +41154,14 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
40906
41154
  skipUnaddressableReplay(skipScope, logger, op, "force-revert failed UPDATE of");
40907
41155
  break;
40908
41156
  }
40909
- logger.info(` Rollback: force-reverting failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) to its pre-deploy properties (--revert-failed; remote state is unknown)`);
41157
+ const own = options.previousFromRecord?.get(op.logicalId);
41158
+ const fromRecord = own !== void 0;
41159
+ const attemptedBag = fromRecord ? void 0 : op.attemptedProperties;
41160
+ const revertUnsettled = fromRecord ? own.names.size === 0 ? {} : {
41161
+ unsettledProperties: own.names,
41162
+ ...own.items.size > 0 && { unsettledItems: own.items }
41163
+ } : unsettledContextOf(current, prev);
41164
+ logger.info(!fromRecord ? ` Rollback: force-reverting failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) to its pre-deploy properties (--revert-failed; remote state is unknown)` : own.lateSuccess ? ` Rollback: reverting the failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}), whose call completed after the deploy gave up on it, to its pre-deploy properties` : ` Rollback: reverting what the failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) left unsettled (${[...own.names].map(safe).join(", ")}) to its pre-deploy properties`);
40910
41165
  const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
40911
41166
  resourceType: op.resourceType,
40912
41167
  provisionedBy: op.provisionedBy ?? current.provisionedBy
@@ -40923,7 +41178,13 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
40923
41178
  });
40924
41179
  const desiredProps = noEcho.desired;
40925
41180
  refuseMaskedReplayBaseline(desiredProps, op.logicalId, noEcho.inert);
40926
- const attemptedProps = noEcho.onPreviousSide(await resolveReplayProps(op.attemptedProperties ?? current.properties, resolver, secrets, ctx, op.logicalId, op.attemptedProperties === void 0 ? current : void 0));
41181
+ const resolvedPrevious = noEcho.onPreviousSide(await resolveReplayProps(attemptedBag ?? current.properties, resolver, secrets, ctx, op.logicalId, attemptedBag === void 0 ? current : void 0));
41182
+ const excludedKeys = own?.lateSuccess === true ? [...unsettledPropertiesOf(prev)] : [];
41183
+ const attemptedProps = excludedKeys.length === 0 || resolvedPrevious === void 0 ? resolvedPrevious : withKeysFrom(resolvedPrevious, desiredProps, excludedKeys);
41184
+ if (excludedKeys.length > 0) {
41185
+ const one = excludedKeys.length === 1;
41186
+ logger.warn(safeMsg` Rollback: ${safe(op.logicalId)} (${safe(op.resourceType)}): ${excludedKeys.map(safe).join(", ")} ${one ? "was" : "were"} left unsettled by an earlier failed deploy, so this revert leaves ${one ? "it" : "them"} as AWS holds ${one ? "it" : "them"}; the next deploy converges ${one ? "it" : "them"}.`);
41187
+ }
40927
41188
  recordNestedStackParameterExpressions(secrets, op.resourceType, desiredProps, prev.properties, "state-derived");
40928
41189
  opMasker.addNamed({
40929
41190
  resourceType: op.resourceType,
@@ -40957,7 +41218,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
40957
41218
  replayingState: true,
40958
41219
  recordedAttributes: current.attributes,
40959
41220
  ...revertFailedClaimed && { inlinePolicyClaimed: revertFailedClaimed },
40960
- ...unsettledContextOf(current, prev)
41221
+ ...revertUnsettled
40961
41222
  }
40962
41223
  ], op.logicalId, logger, options.isInterrupted, secrets, mask));
40963
41224
  if (revertFailedResult) recordNoEchoAttributeValues(revertFailedResult, secrets, desiredProps);
@@ -40968,10 +41229,12 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
40968
41229
  physicalId: current.physicalId,
40969
41230
  resourceType: op.resourceType,
40970
41231
  recordedProperties: current.properties ?? {},
40971
- names: unsettledContextOf(current, prev).unsettledProperties ?? /* @__PURE__ */ new Set(),
40972
- desired: desiredProps ?? {}
41232
+ names: revertUnsettled.unsettledProperties ?? /* @__PURE__ */ new Set(),
41233
+ desired: desiredProps ?? {},
41234
+ ...revertUnsettled.unsettledItems !== void 0 && { attemptedItems: revertUnsettled.unsettledItems }
40973
41235
  }, (message) => logger.warn(mask(message)));
40974
- if (updatePartialReason(revertFailedResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(prev.properties?.["Policies"], (op.attemptedProperties ?? current.properties)?.["Policies"]), revertVia);
41236
+ if (fromRecord) stateResources[op.logicalId] = withUnsettledItems(withUnsettledProperties(stateResources[op.logicalId], unsettledPropertiesOf(prev)), unsettledItemsOf(prev));
41237
+ if (updatePartialReason(revertFailedResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(prev.properties?.["Policies"], (attemptedBag ?? current.properties)?.["Policies"]), revertVia);
40975
41238
  const revertFailedPartial = updatePartialReason(revertFailedResult);
40976
41239
  if (revertFailedPartial !== void 0) logger.warn(mask(` Rollback: ${safe(op.logicalId)} reverted, ${updatePartialMessage(revertFailedPartial)}`));
40977
41240
  else logger.info(` Rollback: ${safe(op.logicalId)} reverted successfully`);
@@ -42885,7 +43148,7 @@ async function revertNestedChildFromJournal(args) {
42885
43148
  ...carried,
42886
43149
  ...stackInstanceIdCarriedFrom(base),
42887
43150
  ...supersededAfterRollback(base, supersededHost),
42888
- version: 14,
43151
+ version: 15,
42889
43152
  region,
42890
43153
  resources: { ...stateResources },
42891
43154
  ...orphansAfterRollback(base, mintedOrphans),
@@ -43652,7 +43915,7 @@ function replayPrintingBag(deps, entries, stateResources) {
43652
43915
  read
43653
43916
  ]);
43654
43917
  }
43655
- async function performRollback(deps, completedOperations, stateResources, stackName, previousState, failedOperations = [], priorOrphans = []) {
43918
+ async function performRollback(deps, completedOperations, stateResources, stackName, previousState, failedOperations = [], priorOrphans = [], unsettledRevert) {
43656
43919
  const orphanIndexes = [];
43657
43920
  const orphanOps = [];
43658
43921
  failedOperations.forEach((op, i) => {
@@ -43677,7 +43940,7 @@ async function performRollback(deps, completedOperations, stateResources, stackN
43677
43940
  const inlinePolicyWriters = new RollbackInlinePolicyWriters();
43678
43941
  const supersededHost = {};
43679
43942
  const runId = deps.options.eventRecorder?.runId;
43680
- const { result, failed, run } = await withNestedRevertRun(runId, async (scope) => {
43943
+ const { result, failed, unsettled, run } = await withNestedRevertRun(runId, async (scope) => {
43681
43944
  return {
43682
43945
  failed: orphanOps.length > 0 ? await withPrintingSecrets(replayPrintingBag(deps, orphanOps.map((op) => ({
43683
43946
  ...op,
@@ -43686,6 +43949,11 @@ async function performRollback(deps, completedOperations, stateResources, stackN
43686
43949
  emitEnvelope: completedOperations.length === 0,
43687
43950
  inlinePolicyWriters
43688
43951
  })) : void 0,
43952
+ unsettled: await revertUnsettledFailedUpdates(deps, ctx, stackName, stateResources, failedOperations, new Set(orphanIndexes), {
43953
+ emitEnvelope: completedOperations.length === 0 && orphanOps.length === 0,
43954
+ inlinePolicyWriters,
43955
+ hooks: unsettledRevert
43956
+ }),
43689
43957
  result: await withPrintingSecrets(replayPrintingBag(deps, completedReplayEntries(completedOperations), stateResources), () => replayRollback(completedOperations, stateResources, stackName, ctx, {
43690
43958
  inlinePolicyWriters,
43691
43959
  failedOperations,
@@ -43698,11 +43966,12 @@ async function performRollback(deps, completedOperations, stateResources, stackN
43698
43966
  });
43699
43967
  const pendingOrphans = new Set(failed?.remainingFailedOps ?? []);
43700
43968
  const handled = new Set(orphanIndexes.filter((_, k) => !pendingOrphans.has(orphanOps[k])));
43969
+ for (const index of unsettled.handled) handled.add(index);
43701
43970
  return {
43702
43971
  failures: result.failures + (failed?.failures ?? 0),
43703
- warnings: result.warnings + run.warnings + (failed?.warnings ?? 0),
43972
+ warnings: result.warnings + run.warnings + (failed?.warnings ?? 0) + unsettled.warnings,
43704
43973
  skipped: result.skipped + (failed?.skipped ?? 0),
43705
- interrupted: result.interrupted,
43974
+ interrupted: result.interrupted || unsettled.interrupted,
43706
43975
  orphaned: [...failed?.orphaned ?? [], ...result.orphaned],
43707
43976
  rolledBackCreates: [...failed?.rolledBackCreates ?? [], ...result.rolledBackCreates],
43708
43977
  superseded: supersededHost.supersededResources ?? [],
@@ -43710,6 +43979,152 @@ async function performRollback(deps, completedOperations, stateResources, stackN
43710
43979
  remainingFailedOps: failedOperations.filter((_, i) => !handled.has(i))
43711
43980
  };
43712
43981
  }
43982
+ function waitText(ms) {
43983
+ return ms >= 6e4 ? `${Math.round(ms / 6e4)} min` : `${Math.max(1, Math.round(ms / 1e3))}s`;
43984
+ }
43985
+ async function revertUnsettledFailedUpdates(deps, ctx, stackName, stateResources, failedOperations, alreadyReplayed, options) {
43986
+ const out = {
43987
+ handled: [],
43988
+ warnings: 0,
43989
+ interrupted: false
43990
+ };
43991
+ const hooks = options.hooks;
43992
+ if (hooks === void 0) return out;
43993
+ const ownMarks = (logicalId) => {
43994
+ const onRecord = unsettledPropertiesOf(stateResources[logicalId]);
43995
+ const marks = hooks.runMarks(logicalId);
43996
+ const names = new Set([...marks.names].filter((name) => onRecord.has(name)));
43997
+ return {
43998
+ names,
43999
+ items: new Map([...marks.items].filter(([path]) => names.has(unsettledItemsTopKey(path)))),
44000
+ lateSuccess: false
44001
+ };
44002
+ };
44003
+ const candidates = [];
44004
+ failedOperations.forEach((op, index) => {
44005
+ if (alreadyReplayed.has(index) || op.changeType !== "UPDATE") return;
44006
+ if (failedOpOwnRecord(op, stateResources) === void 0) return;
44007
+ const own = ownMarks(op.logicalId);
44008
+ const running = hooks.stillRunning(op.logicalId);
44009
+ if (own.names.size === 0 && running === void 0) return;
44010
+ if (classifyFailedOp(op, stateResources, [...failedOperations]) !== "revert-failed-update") return;
44011
+ candidates.push({
44012
+ index,
44013
+ op,
44014
+ own,
44015
+ running
44016
+ });
44017
+ });
44018
+ if (candidates.length === 0) return out;
44019
+ const { logger } = deps;
44020
+ const isInterrupted = () => deps.userInterrupted();
44021
+ const fallback = (names) => {
44022
+ const one = names.size === 1;
44023
+ const retry = deps.options.parentStackInfo === void 0 ? `, or revert ${one ? "it" : "them"} now with: ${pasteableCommand("cdkd rollback", [{
44024
+ value: stackName,
44025
+ hole: "stack"
44026
+ }, { literal: "--revert-failed" }]).command}` : "";
44027
+ return `cdkd keeps ${one ? "it" : "them"} unsettled: the next deploy converges ${one ? "it" : "them"}${retry}`;
44028
+ };
44029
+ const wait = deps.options.unsettledRevertWait ?? DEFAULT_UNSETTLED_REVERT_WAIT;
44030
+ const verdicts = await Promise.all(candidates.map(async (candidate) => {
44031
+ const { op } = candidate;
44032
+ let provider;
44033
+ try {
44034
+ provider = ctx.providerRegistry.getProviderFor({
44035
+ resourceType: op.resourceType,
44036
+ provisionedBy: op.provisionedBy ?? stateResources[op.logicalId].provisionedBy
44037
+ }).provider;
44038
+ } catch {
44039
+ return "error";
44040
+ }
44041
+ logger.info(safeMsg` Rollback: waiting for ${op.logicalId} (${op.resourceType}) to settle before reverting the failed update`);
44042
+ const started = Date.now();
44043
+ const identity = () => {
44044
+ const record = stateResources[op.logicalId];
44045
+ return {
44046
+ provider,
44047
+ logicalId: op.logicalId,
44048
+ physicalId: record.physicalId,
44049
+ resourceType: op.resourceType,
44050
+ recordedProperties: record.properties ?? {},
44051
+ names: candidate.own.names,
44052
+ timeoutMs: Math.max(0, wait.timeoutMs - (Date.now() - started)),
44053
+ pollMs: wait.pollMs,
44054
+ isInterrupted
44055
+ };
44056
+ };
44057
+ if (candidate.running !== void 0) {
44058
+ let succeeded = false;
44059
+ const returned = await waitForUnsettledSettled({
44060
+ ...identity(),
44061
+ names: /* @__PURE__ */ new Set(),
44062
+ running: candidate.running.then((ok) => {
44063
+ succeeded = ok;
44064
+ })
44065
+ });
44066
+ if (returned === "moving") return "call-running";
44067
+ if (returned === "interrupted") return returned;
44068
+ hooks.recordMarks(op.logicalId);
44069
+ candidate.own = {
44070
+ ...ownMarks(op.logicalId),
44071
+ lateSuccess: succeeded
44072
+ };
44073
+ if (!succeeded && candidate.own.names.size === 0) return "none";
44074
+ }
44075
+ try {
44076
+ return await waitForUnsettledSettled(identity());
44077
+ } catch {
44078
+ return "error";
44079
+ }
44080
+ }));
44081
+ const ready = [];
44082
+ candidates.forEach((candidate, k) => {
44083
+ const verdict = verdicts[k];
44084
+ if (verdict === "settled") {
44085
+ ready.push(candidate);
44086
+ return;
44087
+ }
44088
+ if (verdict === "none") return;
44089
+ if (verdict === "interrupted") {
44090
+ out.interrupted = true;
44091
+ return;
44092
+ }
44093
+ const { op } = candidate;
44094
+ const names = candidate.own.names;
44095
+ const them = names.size === 1 ? "it" : "them";
44096
+ const subject = names.size > 0 ? `the failed update left ${[...names].join(", ")} unsettled` : "the failed update may have applied part of the template";
44097
+ const why = verdict === "call-running" ? `cdkd's own update call, abandoned at the per-resource deadline, had not returned after ${waitText(wait.timeoutMs)}` : verdict === "error" ? "cdkd could not reach its provider to wait for it" : `AWS had not settled ${them} after ${waitText(wait.timeoutMs)}`;
44098
+ logger.warn(safeMsg`${op.logicalId} (${op.resourceType}): ${subject}, and ${why}, so the automatic rollback did not revert ${names.size > 0 ? them : "it"}. ${fallback(names)}`);
44099
+ out.warnings++;
44100
+ });
44101
+ if (ready.length === 0 || out.interrupted) return out;
44102
+ const ops = ready.map(({ op }) => ({ ...op }));
44103
+ const own = new Map(ready.map(({ op, own: marks }) => [op.logicalId, marks]));
44104
+ const replay = await withPrintingSecrets(replayPrintingBag(deps, ops.map((op) => ({
44105
+ ...op,
44106
+ properties: op.attemptedProperties
44107
+ })), stateResources), () => replayFailedOperations(ops, stateResources, stackName, ctx, {
44108
+ emitEnvelope: options.emitEnvelope,
44109
+ inlinePolicyWriters: options.inlinePolicyWriters,
44110
+ isInterrupted,
44111
+ previousFromRecord: own
44112
+ }));
44113
+ out.warnings += replay.warnings + replay.failures;
44114
+ if (replay.interrupted) out.interrupted = true;
44115
+ const pending = new Set(replay.remainingFailedOps);
44116
+ const skipped = new Set(replay.skippedOps ?? []);
44117
+ ops.forEach((op, k) => {
44118
+ const { index, own: marks } = ready[k];
44119
+ if (pending.has(op) || skipped.has(op)) {
44120
+ if (!replay.interrupted) logger.warn(safeMsg`${op.logicalId} (${op.resourceType}): the automatic rollback could not revert ${marks.names.size > 0 ? `what the failed update left unsettled (${[...marks.names].join(", ")})` : "the failed update"} (see above). ${fallback(marks.names)}`);
44121
+ return;
44122
+ }
44123
+ out.handled.push(index);
44124
+ hooks.onReverted(op.logicalId, marks.names);
44125
+ });
44126
+ return out;
44127
+ }
43713
44128
  function foreignHolderResolver(deps) {
43714
44129
  const sameBucketHolderFor = makeForeignHolderScan(deps.stateBackend);
43715
44130
  const crossPrefixHolder = deps.options.crossPrefixHolder;
@@ -46277,12 +46692,8 @@ function extractTemplateAttributes(template, logicalId) {
46277
46692
  };
46278
46693
  }
46279
46694
  function acceptedCreateOnlyDropsField(recordedProperties, resourceType, provisionedBy, mode, previous) {
46280
- if (provisionedBy !== "sdk") return { acceptedCreateOnlyDrops: void 0 };
46281
- const createOnly = getPropertyCoverage(resourceType)?.createOnlyDrops;
46282
- if (createOnly === void 0 || createOnly.size === 0) return { acceptedCreateOnlyDrops: void 0 };
46283
46695
  const carried = mode === "in-place" ? acceptedCreateOnlyDropsOf(previous) : void 0;
46284
- const names = findSilentDropProperties(resourceType, recordedProperties).map(({ property }) => property).filter((property) => createOnly.has(property) && (carried === void 0 || carried.has(property)));
46285
- return { acceptedCreateOnlyDrops: names.length > 0 ? names : void 0 };
46696
+ return { acceptedCreateOnlyDrops: acceptedCreateOnlyDropsEvidence(recordedProperties, resourceType, provisionedBy, carried) };
46286
46697
  }
46287
46698
  function secretNamedAttributesField(result, previous) {
46288
46699
  const reported = result.secretNamedAttributeNames;
@@ -46604,6 +47015,7 @@ async function provisionCreate(engine, logicalId, change, stateResources, stackN
46604
47015
  ...templateAttrs,
46605
47016
  provisionedBy: createDecision.provisionedBy
46606
47017
  };
47018
+ clearCreatedReport();
46607
47019
  engine.recordInlinePolicyWrite(logicalId, "create");
46608
47020
  await establishNoEchoEchoFidelity(engine.noEchoRun, engine.noEchoDeps(), logicalId, stateResources[logicalId], resolvedProps, stateResources, createSecrets);
46609
47021
  const createCaptureSiblings = await buildObservedCaptureSiblings({
@@ -46888,12 +47300,17 @@ const INDEX_TRANSITIONAL_STATUSES = /* @__PURE__ */ new Set([
46888
47300
  function hasTransitionalIndex(indexes) {
46889
47301
  return (indexes ?? []).some((gsi) => INDEX_TRANSITIONAL_STATUSES.has(gsi.IndexStatus ?? ""));
46890
47302
  }
47303
+ function hasTransitionalTableIndex(table) {
47304
+ return hasTransitionalIndex(table?.GlobalSecondaryIndexes) || hasTransitionalIndex(table?.VectorIndexes);
47305
+ }
47306
+ const GSI_INDEX_NOUN = "a global secondary index";
47307
+ const TABLE_INDEX_NOUN = "a global secondary index or vector index";
46891
47308
  const INDEX_BUSY_DELETE_MESSAGE = /cannot delete table while indexes are being/i;
46892
47309
  function isIndexBusyDeleteError(message) {
46893
47310
  return INDEX_BUSY_DELETE_MESSAGE.test(message);
46894
47311
  }
46895
- function relayedIndexBusyDelete(withheldText) {
46896
- return isIndexBusyDeleteError(withheldText) ? " AWS reports that a global secondary index is still being created, updated or deleted; re-running the destroy succeeds once the index is ACTIVE." : "";
47312
+ function relayedIndexBusyDelete(withheldText, indexNoun = GSI_INDEX_NOUN) {
47313
+ return isIndexBusyDeleteError(withheldText) ? ` AWS reports that ${indexNoun} is still being created, updated or deleted; re-running the destroy succeeds once the index is ACTIVE.` : "";
46897
47314
  }
46898
47315
  const DELETE_INDEX_BUSY_REARM_MAX_ATTEMPTS = 60;
46899
47316
  const INDEX_SETTLE_POLL_INTERVAL_MS = 1e3;
@@ -46901,21 +47318,43 @@ const DELETE_INDEX_WAIT_PROCEED_NOTE = `the DeleteTable goes ahead anyway and AW
46901
47318
  async function waitForIndexesSettled(opts) {
46902
47319
  const { tableName, logicalId, logger, describeTable, maxAttempts, proceedNote } = opts;
46903
47320
  const budgetWait = opts.budgetWait;
47321
+ const shortCap = opts.shortCapUnlessVectorBusy;
47322
+ let vectorOnlyBusy = false;
47323
+ let stoppedAtShortCap = false;
47324
+ let announced = false;
47325
+ const effectiveCap = () => shortCap !== void 0 && !vectorOnlyBusy ? Math.min(shortCap, maxAttempts) : maxAttempts;
46904
47326
  const watch = startInterruptWatch(`index settle wait on ${tableName}`);
46905
47327
  let attempt = 0;
46906
47328
  try {
46907
- while (budgetWait ? budgetWait.nextPoll() : attempt < maxAttempts) {
47329
+ for (;;) {
47330
+ if (shortCap !== void 0 && attempt >= shortCap && !vectorOnlyBusy) {
47331
+ stoppedAtShortCap = true;
47332
+ break;
47333
+ }
47334
+ if (!(budgetWait ? budgetWait.nextPoll() : attempt < maxAttempts)) break;
46908
47335
  attempt += 1;
46909
47336
  if (watch.isInterrupted()) {
46910
47337
  logger.debug(`Interrupted while waiting for indexes on ${tableName} (${logicalId}) after ${attempt - 1} DescribeTable polls; ${proceedNote}`);
46911
47338
  return;
46912
47339
  }
46913
47340
  try {
46914
- if (!hasTransitionalIndex((await describeTable()).Table?.GlobalSecondaryIndexes ?? [])) return;
47341
+ const response = await describeTable();
47342
+ if (!hasTransitionalTableIndex(response.Table)) {
47343
+ if (attempt > 1) logger.debug(safeMsg`Indexes on ${tableName} (${logicalId}) settled after ${attempt} DescribeTable polls`);
47344
+ return;
47345
+ }
47346
+ const gsiBusy = hasTransitionalIndex(response.Table?.GlobalSecondaryIndexes);
47347
+ const vectorBusy = hasTransitionalIndex(response.Table?.VectorIndexes);
47348
+ vectorOnlyBusy = vectorBusy && !gsiBusy;
47349
+ if (!announced) {
47350
+ announced = true;
47351
+ const busyKinds = gsiBusy ? vectorBusy ? "a global secondary index and a vector index" : "a global secondary index" : "a vector index";
47352
+ logger.debug(safeMsg`Index settle wait on ${tableName} (${logicalId}): ${busyKinds} still transitioning (poll ${attempt})`);
47353
+ }
46915
47354
  } catch (err) {
46916
47355
  const message = describeAwsFailure(err).detail;
46917
47356
  if (isThrottlingError(err)) {
46918
- logger.debug(`DescribeTable throttled while waiting for indexes on ${tableName} (attempt ${attempt}/${maxAttempts}); still waiting: ${message}`);
47357
+ logger.debug(`DescribeTable throttled while waiting for indexes on ${tableName} (attempt ${attempt}/${effectiveCap()}); still waiting: ${message}`);
46919
47358
  await new Promise((resolve) => setTimeout(resolve, INDEX_SETTLE_POLL_INTERVAL_MS));
46920
47359
  continue;
46921
47360
  }
@@ -46934,14 +47373,14 @@ async function waitForIndexesSettled(opts) {
46934
47373
  watch.dispose();
46935
47374
  }
46936
47375
  const pollSeconds = INDEX_SETTLE_POLL_INTERVAL_MS / 1e3;
46937
- const pollsRun = budgetWait ? budgetWait.pollsRun : maxAttempts;
46938
- logger.warn(`Indexes on ${tableName} (${logicalId}) did not all reach ACTIVE within ${pollsRun} DescribeTable polls (~${pollSeconds}s apart, so a little over ${pollsRun * pollSeconds}s of wall clock).${budgetWait?.note() ?? ""} ${proceedNote}`);
47376
+ const pollsRun = budgetWait ? budgetWait.pollsRun : attempt;
47377
+ logger.warn(`Indexes on ${tableName} (${logicalId}) did not all reach ACTIVE within ${pollsRun} DescribeTable polls (~${pollSeconds}s apart, so a little over ${pollsRun * pollSeconds}s of wall clock).${stoppedAtShortCap ? "" : budgetWait?.note(shortCap !== void 0 && !vectorOnlyBusy ? shortCap : void 0) ?? ""} ${proceedNote}`);
46939
47378
  }
46940
47379
  function indexBusyRetryWarning(opts) {
46941
47380
  const remainingAttempts = Math.max(0, 1 + opts.maxRetries - opts.attemptNumber);
46942
47381
  const settleFloorMinutes = Math.max(1, Math.round((remainingAttempts + 1) * 60 * INDEX_SETTLE_POLL_INTERVAL_MS / 6e4));
46943
47382
  const pollSeconds = INDEX_SETTLE_POLL_INTERVAL_MS / 1e3;
46944
- return `DynamoDB ${opts.typeLabel} ${opts.logicalId}: AWS refused DeleteTable on ${opts.physicalId} because a global secondary index is still being created, updated or deleted — application auto-scaling can start an index capacity change at any moment, including during this destroy. Waiting for the index to settle and retrying (this attempt plus up to ${remainingAttempts} more attempts; each one first waits up to ${60} DescribeTable polls ~${pollSeconds}s apart before its DeleteTable, so cdkd will not give up for at least ~${settleFloorMinutes} more minutes while those settle waits run). Nothing is wrong with the table; a large index backfill can outlast this budget, in which case the destroy fails on AWS's refusal (re-run with --verbose for AWS's own message) and re-running it succeeds once the index is ACTIVE.`;
47383
+ return `DynamoDB ${opts.typeLabel} ${opts.logicalId}: AWS refused DeleteTable on ${opts.physicalId} because ${opts.indexNoun ?? "a global secondary index"} is still being created, updated or deleted — application auto-scaling can start an index capacity change at any moment, including during this destroy. Waiting for the index to settle and retrying (this attempt plus up to ${remainingAttempts} more attempts; each one first waits up to ${60} DescribeTable polls ~${pollSeconds}s apart before its DeleteTable, so cdkd will not give up for at least ~${settleFloorMinutes} more minutes while those settle waits run). Nothing is wrong with the table; a large index backfill can outlast this budget, in which case the destroy fails on AWS's refusal (re-run with --verbose for AWS's own message) and re-running it succeeds once the index is ACTIVE.`;
46945
47384
  }
46946
47385
  async function deleteTableWithIndexBusyRetry(opts) {
46947
47386
  let deleteAttempts = 0;
@@ -46949,12 +47388,13 @@ async function deleteTableWithIndexBusyRetry(opts) {
46949
47388
  try {
46950
47389
  await withRetry(async () => {
46951
47390
  if (deleteAttempts++ > 0) {
46952
- if (deleteAttempts === 2) opts.logger.warn(indexBusyRetryWarning({
47391
+ if (deleteAttempts === 2) opts.logger.warn(opts.retryWarning?.() ?? indexBusyRetryWarning({
46953
47392
  typeLabel: opts.typeLabel,
46954
47393
  logicalId: opts.logicalId,
46955
47394
  physicalId: opts.physicalId,
46956
47395
  attemptNumber: deleteAttempts,
46957
- maxRetries: opts.maxRetries
47396
+ maxRetries: opts.maxRetries,
47397
+ ...opts.indexNoun !== void 0 && { indexNoun: opts.indexNoun }
46958
47398
  }));
46959
47399
  await opts.reArm();
46960
47400
  }
@@ -46977,6 +47417,7 @@ async function deleteTableWithIndexBusyRetry(opts) {
46977
47417
  const DYNAMODB_DELETE_POLL_RTT_MS = 200;
46978
47418
  const DYNAMODB_DELETE_POLL_COST_MS = INDEX_SETTLE_POLL_INTERVAL_MS + 200;
46979
47419
  const DYNAMODB_DELETE_BUDGET_MS = 156e4;
47420
+ const DYNAMODB_DELETE_DEADLINE_MARGIN_MS = 24e4;
46980
47421
  const DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS = 18e5;
46981
47422
  const dynamoDbDeleteBudgetOverride = {};
46982
47423
  function resolveDynamoDbDeleteBudgetMs() {
@@ -47035,11 +47476,12 @@ var DeleteWaitImpl = class {
47035
47476
  get cutShort() {
47036
47477
  return this.endedByBudget && this.ran < 60;
47037
47478
  }
47038
- note() {
47479
+ note(shownCap) {
47039
47480
  if (!this.endedByBudget) return "";
47481
+ const cap = shownCap ?? this.cap;
47040
47482
  const minutes = Math.max(1, Math.round((this.budget?.totalMs ?? 0) / 6e4));
47041
- if (this.cutShort) return ` — cdkd's shared ~${minutes}-minute delete allowance was already spent, so this wait made only ${this.ran} of its ${this.cap} polls and AWS was not given a real wait. Nothing is necessarily wrong with the table; re-run the destroy.`;
47042
- return ` (cdkd's shared ~${minutes}-minute delete allowance capped this wait at ${this.ran} of its ${this.cap} polls.)`;
47483
+ if (this.cutShort) return ` — cdkd's shared ~${minutes}-minute delete allowance was already spent, so this wait made only ${this.ran} of its ${cap} polls and AWS was not given a real wait. Nothing is necessarily wrong with the table; re-run the destroy.`;
47484
+ return ` (cdkd's shared ~${minutes}-minute delete allowance capped this wait at ${this.ran} of its ${cap} polls.)`;
47043
47485
  }
47044
47486
  };
47045
47487
  function beginDeleteWait(cap, budget) {
@@ -47945,7 +48387,8 @@ function identityKeyOf(...lists) {
47945
48387
  return entries.some((entry) => isPlainObject(entry) && IDENTITY_KEYS.some((candidate) => typeof entry[candidate] === "string")) ? "ambiguous" : void 0;
47946
48388
  }
47947
48389
  const POSITIONAL_LIST_KEYS = /* @__PURE__ */ new Set(["KeySchema"]);
47948
- function projectNamed(live, own, wanted, path, unnamed) {
48390
+ function projectNamed(live, own, wanted, path, unnamed, attempted = /* @__PURE__ */ new Map()) {
48391
+ const attemptedAt = (at) => new Set([...attempted.get(at) ?? []].filter(isUsableAttemptedName));
47949
48392
  if (isPlainObject(live) && (isPlainObject(own) || isPlainObject(wanted))) {
47950
48393
  const ownBag = isPlainObject(own) ? own : void 0;
47951
48394
  const wantedBag = isPlainObject(wanted) ? wanted : void 0;
@@ -47956,10 +48399,12 @@ function projectNamed(live, own, wanted, path, unnamed) {
47956
48399
  if (IDENTITY_KEYS.includes(key)) continue;
47957
48400
  if (key === "Tags") {
47958
48401
  if (ownBag !== void 0 && Object.hasOwn(ownBag, "Tags")) out["Tags"] = ownBag["Tags"];
48402
+ const withAttempted = withAttemptedReplicaTags(ownBag?.["Tags"], wantedBag?.["Tags"], live["Tags"], attemptedAt(`${path}.Tags`));
48403
+ if (withAttempted !== void 0) out["Tags"] = withAttempted;
47959
48404
  continue;
47960
48405
  }
47961
48406
  if (!Object.hasOwn(live, key) || live[key] === void 0) continue;
47962
- out[key] = POSITIONAL_LIST_KEYS.has(key) ? live[key] : projectNamed(live[key], ownBag?.[key], wantedBag?.[key], `${path}.${key}`, unnamed);
48407
+ out[key] = POSITIONAL_LIST_KEYS.has(key) ? live[key] : projectNamed(live[key], ownBag?.[key], wantedBag?.[key], `${path}.${key}`, unnamed, attempted);
47963
48408
  }
47964
48409
  return out;
47965
48410
  }
@@ -47986,6 +48431,7 @@ function projectNamed(live, own, wanted, path, unnamed) {
47986
48431
  const ownEntry = ownById.get(value);
47987
48432
  const wantedEntry = wantedById.get(value);
47988
48433
  if (ownEntry === void 0 && wantedEntry === void 0) {
48434
+ if (attemptedAt(path).has(value)) return [entry];
47989
48435
  unnamed.push({
47990
48436
  identity: id,
47991
48437
  value,
@@ -47993,11 +48439,34 @@ function projectNamed(live, own, wanted, path, unnamed) {
47993
48439
  });
47994
48440
  return [];
47995
48441
  }
47996
- return [projectNamed(entry, ownEntry, wantedEntry, `${path}[${value}]`, unnamed)];
48442
+ return [projectNamed(entry, ownEntry, wantedEntry, `${path}[${value}]`, unnamed, attempted)];
47997
48443
  });
47998
48444
  }
47999
48445
  return live;
48000
48446
  }
48447
+ function withAttemptedReplicaTags(recorded, desired, live, attempted) {
48448
+ if (attempted.size === 0 || !Array.isArray(live)) return void 0;
48449
+ const keysOf = (value) => {
48450
+ if (value === void 0 || value === null) return /* @__PURE__ */ new Set();
48451
+ if (!Array.isArray(value)) return void 0;
48452
+ const keys = /* @__PURE__ */ new Set();
48453
+ for (const entry of value) {
48454
+ const key = entry?.Key;
48455
+ if (typeof key !== "string") return void 0;
48456
+ keys.add(key);
48457
+ }
48458
+ return keys;
48459
+ };
48460
+ const recordedKeys = keysOf(recorded);
48461
+ const desiredKeys = keysOf(desired);
48462
+ if (recordedKeys === void 0 || desiredKeys === void 0) return void 0;
48463
+ const removable = live.filter((entry) => {
48464
+ const key = entry?.Key;
48465
+ return typeof key === "string" && attempted.has(key) && !recordedKeys.has(key) && !desiredKeys.has(key);
48466
+ });
48467
+ if (removable.length === 0) return void 0;
48468
+ return [...recorded ?? [], ...removable];
48469
+ }
48001
48470
  const strictReadScope = new AsyncLocalStorage();
48002
48471
  function strictFor(key) {
48003
48472
  return strictReadScope.getStore()?.has(key) === true;
@@ -48008,6 +48477,12 @@ function replicaStrictness(status) {
48008
48477
  return new Set([...current].filter((key) => key !== "Replicas"));
48009
48478
  }
48010
48479
  const unsettledScope = new AsyncLocalStorage();
48480
+ const REGION_SEGMENT = /^[a-z]{2}(-[a-z]+)+-\d+$/;
48481
+ function markAttemptedItems(path, items) {
48482
+ const scope = unsettledScope.getStore();
48483
+ if (scope?.attempted === void 0 || items.length === 0) return;
48484
+ scope.attempted(path, items);
48485
+ }
48011
48486
  function markUnsettled(...keys) {
48012
48487
  const scope = unsettledScope.getStore();
48013
48488
  if (scope === void 0) return;
@@ -48126,6 +48601,11 @@ var DynamoDBGlobalTableProvider = class {
48126
48601
  const warn = log.warn;
48127
48602
  log.debug(`Creating DynamoDB GlobalTable ${logicalId}`);
48128
48603
  const desiredReplicaTags = refuseMalformedReplicaTags(properties, resourceType, logicalId);
48604
+ const disassociationRefusal = disassociationProtectionRefusal(properties, void 0, logicalId);
48605
+ if (disassociationRefusal !== void 0) {
48606
+ if (context?.replayingState !== true) throw new ProvisioningError(log.mask(disassociationRefusal), resourceType, logicalId);
48607
+ warn(`${disassociationRefusal} Proceeding: this create replays a cdkd state record.`);
48608
+ }
48129
48609
  const tableName = properties["TableName"] || generatedNameFor("AWS::DynamoDB::GlobalTable", logicalId);
48130
48610
  const keySchema = properties["KeySchema"];
48131
48611
  const attributeDefinitions = properties["AttributeDefinitions"];
@@ -48276,6 +48756,7 @@ var DynamoDBGlobalTableProvider = class {
48276
48756
  let createdTableId;
48277
48757
  try {
48278
48758
  createdTableId = (await (await this.getCreateClient()).send(new CreateTableCommand(createParams)))?.TableDescription?.TableId;
48759
+ reportCreatedResource(logicalId, resourceType, tableName, createdTableId);
48279
48760
  log.debug(`CreateTable initiated for ${log.value(tableName)}, waiting for ACTIVE`);
48280
48761
  } catch (error) {
48281
48762
  const cause = error instanceof Error ? error : void 0;
@@ -48296,6 +48777,7 @@ var DynamoDBGlobalTableProvider = class {
48296
48777
  await this.applyCrossRegionReplicaTagsDiff(tableInfo.tableArn, region, void 0, replicaTags, resourceType, logicalId, tableName, maskSecrets);
48297
48778
  }
48298
48779
  await this.applyReplicaSettings(tableName, logicalId, currentRegion, wiringProperties, void 0, /* @__PURE__ */ new Set(), false, replayWarn(log, context).onUnusable !== void 0, /* @__PURE__ */ new Set(), void 0, warn, maskSecrets);
48780
+ await this.convergeReplicaDisassociationProtection(tableName, logicalId, currentRegion, wiringProperties, void 0, context?.replayingState === true ? "replay" : "template", warn, maskSecrets);
48299
48781
  const createTtl = planTimeToLive(properties["TimeToLiveSpecification"], void 0, "create");
48300
48782
  if (createTtl.kind === "enable") await this.dynamoDBClient.send(new UpdateTimeToLiveCommand({
48301
48783
  TableName: tableName,
@@ -48347,6 +48829,7 @@ var DynamoDBGlobalTableProvider = class {
48347
48829
  }
48348
48830
  }
48349
48831
  await this.dynamoDBClient.send(new DeleteTableCommand({ TableName: tableName }));
48832
+ retractCreatedResource(logicalId, resourceType, tableName);
48350
48833
  } catch (cleanupErr) {
48351
48834
  tableLeftBehind = true;
48352
48835
  warn(`Partial-create cleanup failed for ${tableName}: ${this.cleanupFailureText(log, `Partial-create cleanup failed for ${tableName}: `, cleanupErr)} To remove the orphaned AWS-side table, run: ` + pasteableAwsCommand(maskSecrets)`aws dynamodb delete-table --table-name ${tableName}`.render());
@@ -48394,6 +48877,7 @@ var DynamoDBGlobalTableProvider = class {
48394
48877
  TableName: tableName,
48395
48878
  ReplicaUpdates: replicaUpdates
48396
48879
  }));
48880
+ markAttemptedItems("Replicas", [region]);
48397
48881
  break;
48398
48882
  } catch (error) {
48399
48883
  if (attempt >= 3 || !isReplicaCopyExistsRefusal(error)) throw error;
@@ -48421,14 +48905,14 @@ var DynamoDBGlobalTableProvider = class {
48421
48905
  DeletionProtectionEnabled: enabled
48422
48906
  }));
48423
48907
  }
48424
- async waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget) {
48908
+ async waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget, member = "DeletionProtectionEnabled", replicaClient = this.getRegionalClient(region)) {
48425
48909
  const wait = beginDeleteWait(60, budget);
48426
- const watch = startInterruptWatch(maskSecrets(`DynamoDB replica ${region} deletion-protection change on ${tableName}`));
48910
+ const watch = startInterruptWatch(maskSecrets(`DynamoDB replica ${region} ${member === "DeletionProtectionEnabled" ? "deletion-protection" : "disassociation-protection"} change on ${tableName}`));
48427
48911
  try {
48428
48912
  while (wait.nextPoll()) {
48429
48913
  if (watch.isInterrupted()) throw watch.onInterrupted();
48430
- const replica = await this.getRegionalClient(region).send(new DescribeTableCommand({ TableName: tableName }));
48431
- if (replica.Table?.TableStatus === "ACTIVE" && replica.Table.DeletionProtectionEnabled === enabled) {
48914
+ const replica = await replicaClient.send(new DescribeTableCommand({ TableName: tableName }));
48915
+ if (replica.Table?.TableStatus === "ACTIVE" && replica.Table[member] === enabled) {
48432
48916
  if ((await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }))).Table?.TableStatus === "ACTIVE") return;
48433
48917
  }
48434
48918
  await new Promise((resolve) => setTimeout(resolve, REPLICA_PROTECTION_SETTLE_POLL_MS));
@@ -48436,7 +48920,7 @@ var DynamoDBGlobalTableProvider = class {
48436
48920
  } finally {
48437
48921
  watch.dispose();
48438
48922
  }
48439
- throw new ProvisioningError(maskSecrets(`DeletionProtectionEnabled=${enabled} on the ${region} replica of ${tableName} did not settle within ${wait.pollsRun} polls${wait.note()}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
48923
+ throw new ProvisioningError(maskSecrets(`${member}=${enabled} on the ${region} replica of ${tableName} did not settle within ${wait.pollsRun} polls${wait.note()}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
48440
48924
  }
48441
48925
  async convergeReplicaDeletionProtection(tableName, logicalId, currentRegion, previousProperties, properties, addedRegions, desiredFromReadback, warn, maskSecrets) {
48442
48926
  const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
@@ -48465,6 +48949,63 @@ var DynamoDBGlobalTableProvider = class {
48465
48949
  if (typeof live === "boolean" && live !== newDpe) await this.setReplicaDeletionProtection(tableName, region, newDpe, logicalId, maskSecrets);
48466
48950
  }
48467
48951
  }
48952
+ async convergeReplicaDisassociationProtection(tableName, logicalId, currentRegion, properties, previousProperties, origin, warn, maskSecrets) {
48953
+ const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
48954
+ let wrote = false;
48955
+ const multiRegion = isMultiRegionReplicaSet(properties);
48956
+ for (const entry of desired) {
48957
+ const replica = asRecord(entry);
48958
+ const region = replica?.["Region"];
48959
+ if (typeof region !== "string" || region === "") continue;
48960
+ const declared = readReplicaDisassociationProtection(replica);
48961
+ const previous = previousProperties === void 0 ? void 0 : readReplicaDisassociationProtection(localReplicaEntry(previousProperties, region));
48962
+ const clientFor = () => region === currentRegion ? this.dynamoDBClient : this.getRegionalClient(region);
48963
+ const readLive = async () => {
48964
+ const client = clientFor();
48965
+ try {
48966
+ return (await client.send(new DescribeTableCommand({ TableName: tableName }))).Table?.DisassociationProtectionEnabled;
48967
+ } catch (readError) {
48968
+ this.logger.debug(maskSecrets(`Could not read ${DISASSOCIATION_PROTECTION_KEY} on the ${region} replica of ${tableName}: ${describeAwsFailure(readError).detail}`));
48969
+ return;
48970
+ }
48971
+ };
48972
+ if (!multiRegion) {
48973
+ if (declared !== void 0) {
48974
+ const message = `${DISASSOCIATION_PROTECTION_KEY}=${declared} on the ${region} replica of ${tableName} is not sent: DynamoDB applies it only to a replica of a multi-Region global table, and this table's Replicas name a single Region.`;
48975
+ const justShrunk = previousProperties !== void 0 && isMultiRegionReplicaSet(previousProperties);
48976
+ if (origin === "template" && (justShrunk || declared !== previous)) warn(message);
48977
+ else this.logger.debug(maskSecrets(message));
48978
+ } else if (origin !== "readback" && replica?.[DISASSOCIATION_PROTECTION_KEY] === void 0 && previous !== void 0) warn(`${DISASSOCIATION_PROTECTION_KEY} was removed from the ${region} replica of ${tableName}, whose Replicas now name a single Region, so nothing is sent and the replica keeps its current setting (${previous} when last deployed).`);
48979
+ continue;
48980
+ }
48981
+ if (declared === void 0) {
48982
+ if (replica?.[DISASSOCIATION_PROTECTION_KEY] !== void 0 || previous === void 0) continue;
48983
+ if (origin === "template") warn(`${DISASSOCIATION_PROTECTION_KEY} was removed from the ${region} replica of ${tableName}; DynamoDB keeps the replica's current setting (${previous} when last deployed), so nothing is sent. Declare it to change it.`);
48984
+ else if (origin === "replay" && previous === false && await readLive() === false) {
48985
+ await this.setReplicaDisassociationProtection(tableName, region, clientFor(), true, logicalId, maskSecrets);
48986
+ wrote = true;
48987
+ }
48988
+ continue;
48989
+ }
48990
+ const changed = declared !== previous || isUnsettled("Replicas");
48991
+ const live = await readLive();
48992
+ if (live === declared) continue;
48993
+ if (live === void 0 && !changed) continue;
48994
+ await this.setReplicaDisassociationProtection(tableName, region, clientFor(), declared, logicalId, maskSecrets);
48995
+ wrote = true;
48996
+ }
48997
+ if (wrote) await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
48998
+ }
48999
+ async setReplicaDisassociationProtection(tableName, region, client, enabled, logicalId, maskSecrets) {
49000
+ await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, client === this.dynamoDBClient ? {} : { region });
49001
+ markUnsettled("Replicas");
49002
+ this.logger.debug(maskSecrets(`Sending UpdateTable ${DISASSOCIATION_PROTECTION_KEY}=${enabled} to the ${region} replica of ${tableName}`));
49003
+ await client.send(new UpdateTableCommand({
49004
+ TableName: tableName,
49005
+ DisassociationProtectionEnabled: enabled
49006
+ }));
49007
+ await this.waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, void 0, DISASSOCIATION_PROTECTION_KEY, client);
49008
+ }
48468
49009
  async convergeReplicaSettings(tableName, logicalId, currentRegion, properties, addedRegions, maskSecrets) {
48469
49010
  const kept = (Array.isArray(properties["Replicas"]) ? properties["Replicas"] : []).map(asRecord).filter((r) => typeof r?.["Region"] === "string" && r["Region"] !== currentRegion && !addedRegions.has(r["Region"]));
48470
49011
  if (kept.every((r) => readReplicaTableClass(r) === void 0)) return;
@@ -49047,7 +49588,8 @@ var DynamoDBGlobalTableProvider = class {
49047
49588
  async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
49048
49589
  return unsettledScope.run({
49049
49590
  mark: (key) => context?.markUnsettled?.(key),
49050
- unsettled: context?.unsettledProperties ?? /* @__PURE__ */ new Set()
49591
+ unsettled: context?.unsettledProperties ?? /* @__PURE__ */ new Set(),
49592
+ attempted: (path, items) => context?.markAttempted?.(path, items)
49051
49593
  }, () => this.updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context));
49052
49594
  }
49053
49595
  async updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context) {
@@ -49058,6 +49600,11 @@ var DynamoDBGlobalTableProvider = class {
49058
49600
  const debug = log.debug;
49059
49601
  debug(`Updating DynamoDB GlobalTable ${logicalId}: ${log.value(physicalId)}`);
49060
49602
  refuseMalformedReplicaTags(properties, resourceType, logicalId, physicalId);
49603
+ const disassociationRefusal = disassociationProtectionRefusal(properties, previousProperties, logicalId);
49604
+ if (disassociationRefusal !== void 0) {
49605
+ if (context?.replayingState !== true && context?.desiredFromAwsReadback !== true) throw new ProvisioningError(log.mask(disassociationRefusal), resourceType, logicalId, physicalId);
49606
+ warn(`${disassociationRefusal} Proceeding: this update restores a recorded or read-back configuration.`);
49607
+ }
49061
49608
  const replaceFlags = "cdkd deploy --replace --force-stateful-recreation";
49062
49609
  const replaceRemedy = async () => {
49063
49610
  let guardRegion = "";
@@ -49132,7 +49679,7 @@ var DynamoDBGlobalTableProvider = class {
49132
49679
  const extractLocalTags = (props) => {
49133
49680
  return localReplicaEntry(props, currentRegion)?.["Tags"];
49134
49681
  };
49135
- if (tableArn) await this.applyTagDiff(tableArn, resourceType, logicalId, extractLocalTags(previousProperties), extractLocalTags(properties), maskSecrets);
49682
+ if (tableArn) await this.applyTagDiff(tableArn, resourceType, logicalId, extractLocalTags(previousProperties), extractLocalTags(properties), maskSecrets, currentRegion);
49136
49683
  const liveWarmByIndexName = /* @__PURE__ */ new Map();
49137
49684
  for (const liveGsi of describeResp.Table?.GlobalSecondaryIndexes ?? []) {
49138
49685
  const name = liveGsi.IndexName;
@@ -49336,7 +49883,10 @@ var DynamoDBGlobalTableProvider = class {
49336
49883
  if (indexUpdates.length > 0) billingUpdate.GlobalSecondaryIndexUpdates = indexUpdates;
49337
49884
  }
49338
49885
  markUnsettled("BillingMode", "WriteProvisionedThroughputSettings");
49339
- if (billingUpdate.GlobalSecondaryIndexUpdates !== void 0) markUnsettled("GlobalSecondaryIndexes");
49886
+ if (billingUpdate.GlobalSecondaryIndexUpdates !== void 0) {
49887
+ markUnsettled("GlobalSecondaryIndexes");
49888
+ for (const indexUpdate of billingUpdate.GlobalSecondaryIndexUpdates) debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Update for index ${maskSecrets(indexUpdate.Update?.IndexName ?? "")} on ${physicalId} (with the billing mode change)`);
49889
+ }
49340
49890
  await this.dynamoDBClient.send(new UpdateTableCommand(billingUpdate));
49341
49891
  await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
49342
49892
  }
@@ -49460,6 +50010,7 @@ var DynamoDBGlobalTableProvider = class {
49460
50010
  "streamTags"
49461
50011
  ] : context?.replayingState === true ? ["pitr"] : []);
49462
50012
  await this.applyReplicaSettings(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, !deepEqual(asRecord(properties["StreamSpecification"])?.["StreamViewType"], asRecord(previousProperties["StreamSpecification"])?.["StreamViewType"]), context?.replayingState === true || context?.desiredFromAwsReadback === true, replicaKeepOnRemoval, describeResp.Table?.LatestStreamArn, warn, maskSecrets);
50013
+ await this.convergeReplicaDisassociationProtection(physicalId, logicalId, currentRegion, properties, previousProperties, context?.desiredFromAwsReadback === true ? "readback" : context?.replayingState === true ? "replay" : "template", warn, maskSecrets);
49463
50014
  const previousTranslatedIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling, "min", void 0, onUnusablePreviousGsiBlock, maskSecrets);
49464
50015
  const previousSdkIndexes = previousGsiUnusable ? buildLiveRecoveryGsiBaseline(desiredSdkIndexes, describeResp.Table?.GlobalSecondaryIndexes, {
49465
50016
  carryLiveValues: oldBilling === newBilling && liveBillingMode === newBilling,
@@ -49483,6 +50034,7 @@ var DynamoDBGlobalTableProvider = class {
49483
50034
  if (!gsi.IndexName) continue;
49484
50035
  const gsiUpdate = { Delete: { IndexName: gsi.IndexName } };
49485
50036
  markUnsettled("GlobalSecondaryIndexes");
50037
+ debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Delete for index ${maskSecrets(gsi.IndexName)} on ${physicalId}`);
49486
50038
  await this.dynamoDBClient.send(new UpdateTableCommand({
49487
50039
  TableName: physicalId,
49488
50040
  GlobalSecondaryIndexUpdates: [gsiUpdate]
@@ -49501,11 +50053,13 @@ var DynamoDBGlobalTableProvider = class {
49501
50053
  ...addedWarmToSend && { WarmThroughput: addedWarmToSend }
49502
50054
  } };
49503
50055
  markUnsettled("GlobalSecondaryIndexes");
50056
+ debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Create for index ${maskSecrets(gsi.IndexName ?? "")} on ${physicalId}`);
49504
50057
  await this.dynamoDBClient.send(new UpdateTableCommand({
49505
50058
  TableName: physicalId,
49506
50059
  AttributeDefinitions: newAttrs,
49507
50060
  GlobalSecondaryIndexUpdates: [gsiUpdate]
49508
50061
  }));
50062
+ markAttemptedItems("GlobalSecondaryIndexes", [gsi.IndexName]);
49509
50063
  await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
49510
50064
  }
49511
50065
  for (const gsi of gsiDiff.modified) {
@@ -49542,6 +50096,7 @@ var DynamoDBGlobalTableProvider = class {
49542
50096
  }
49543
50097
  const gsiUpdate = { Update: update };
49544
50098
  markUnsettled("GlobalSecondaryIndexes");
50099
+ debug(`Sending UpdateTable GlobalSecondaryIndexUpdates Update for index ${maskSecrets(gsi.IndexName ?? "")} on ${physicalId}`);
49545
50100
  await this.dynamoDBClient.send(new UpdateTableCommand({
49546
50101
  TableName: physicalId,
49547
50102
  GlobalSecondaryIndexUpdates: [gsiUpdate]
@@ -49625,8 +50180,8 @@ var DynamoDBGlobalTableProvider = class {
49625
50180
  throw this.wrapMaskedError(log, error, (text) => new ProvisioningError(`Failed to update DynamoDB GlobalTable ${logicalId}: ${text}`, resourceType, logicalId, physicalId, cause));
49626
50181
  }
49627
50182
  }
49628
- async applyTagDiff(tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets) {
49629
- await this.applyTagDiffOnClient(this.dynamoDBClient, tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets);
50183
+ async applyTagDiff(tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets, region) {
50184
+ await this.applyTagDiffOnClient(this.dynamoDBClient, tableArn, resourceType, logicalId, oldTagsRaw, newTagsRaw, maskSecrets, region);
49630
50185
  }
49631
50186
  async applyCrossRegionReplicaTagsDiff(tableArn, region, oldTags, newTags, resourceType, logicalId, physicalIdForLogs, maskSecrets = (text) => text) {
49632
50187
  const warn = (message) => this.logger.warn(maskSecrets(message));
@@ -49642,12 +50197,12 @@ var DynamoDBGlobalTableProvider = class {
49642
50197
  }
49643
50198
  try {
49644
50199
  const regionalClient = this.getRegionalClient(region);
49645
- await this.applyTagDiffOnClient(regionalClient, replicaArn, resourceType, `${logicalId} (replica ${region})`, oldTags, newTags, maskSecrets);
50200
+ await this.applyTagDiffOnClient(regionalClient, replicaArn, resourceType, `${logicalId} (replica ${region})`, oldTags, newTags, maskSecrets, region);
49646
50201
  } catch (tagErr) {
49647
50202
  warn(`Could not apply Tags diff to cross-region replica ${region} of ${physicalIdForLogs}: ${describeAwsFailure(tagErr).detail}. The replica's Tags state will surface as drift until the next successful deploy.`);
49648
50203
  }
49649
50204
  }
49650
- async applyTagDiffOnClient(client, tableArn, resourceType, id, oldTagsRaw, newTagsRaw, maskSecrets = (text) => text) {
50205
+ async applyTagDiffOnClient(client, tableArn, resourceType, id, oldTagsRaw, newTagsRaw, maskSecrets = (text) => text, region) {
49651
50206
  const plan = planTagDiff(oldTagsRaw, newTagsRaw);
49652
50207
  const tagWarning = tagPlanWarning(plan, resourceType, id);
49653
50208
  if (tagWarning !== void 0) this.logger.warn(maskSecrets(tagWarning));
@@ -49669,6 +50224,15 @@ var DynamoDBGlobalTableProvider = class {
49669
50224
  ResourceArn: tableArn,
49670
50225
  Tags: tagsToAdd
49671
50226
  }));
50227
+ if (region !== void 0 && REGION_SEGMENT.test(region)) {
50228
+ let recordedKeys;
50229
+ try {
50230
+ recordedKeys = /* @__PURE__ */ new Set([...planTagDiff(void 0, oldTagsRaw).set.keys()]);
50231
+ } catch {
50232
+ recordedKeys = void 0;
50233
+ }
50234
+ if (recordedKeys !== void 0) markAttemptedItems(`Replicas[${region}].Tags`, tagsToAdd.map((t) => t.Key).filter((key) => !recordedKeys.has(key)));
50235
+ }
49672
50236
  this.logger.debug(maskSecrets(`Added/updated ${tagsToAdd.length} tag(s) on DynamoDB GlobalTable ${tableArn}`));
49673
50237
  }
49674
50238
  }
@@ -50088,7 +50652,7 @@ var DynamoDBGlobalTableProvider = class {
50088
50652
  throw err;
50089
50653
  }
50090
50654
  }
50091
- async readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, desiredProperties) {
50655
+ async readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, desiredProperties, attemptedItems) {
50092
50656
  const live = await strictReadScope.run(names, () => this.readCurrentState(physicalId, logicalId, resourceType, recordedProperties));
50093
50657
  if (typeof live !== "object" || live === null) return live;
50094
50658
  const out = { ...live };
@@ -50096,7 +50660,7 @@ var DynamoDBGlobalTableProvider = class {
50096
50660
  const unnamed = [];
50097
50661
  for (const name of names) {
50098
50662
  if (!Object.hasOwn(out, name)) continue;
50099
- out[name] = projectNamed(out[name], recordedProperties?.[name], desiredProperties?.[name], name, unnamed);
50663
+ out[name] = projectNamed(out[name], recordedProperties?.[name], desiredProperties?.[name], name, unnamed, attemptedItems);
50100
50664
  }
50101
50665
  for (const entry of unnamed.filter((e) => e.ambiguous === true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS has entries cdkd cannot key by an identity, so convergence keeps the recorded ${entry.path} rather than risk removing an entry neither the record nor the template declares. Check it with 'cdkd drift'.`);
50102
50666
  for (const entry of unnamed.filter((e) => e.ambiguous !== true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS holds ${entry.identity} ${entry.value}, which neither the record nor the template declares, so cdkd leaves it in place. If the failed update added it and it should not be there, remove it by hand (for a replica: aws dynamodb update-table --replica-updates Delete; for an index: --global-secondary-index-updates Delete).`);
@@ -50164,13 +50728,16 @@ var DynamoDBGlobalTableProvider = class {
50164
50728
  const subs = await this.readReplicaSubSpecs(client, tableNameForSubs, regionLabel, declaredReplica);
50165
50729
  Object.assign(entry, subs);
50166
50730
  let protection;
50731
+ let disassociationProtection;
50167
50732
  let streamArn;
50168
50733
  if (isLocal) {
50169
50734
  protection = table.DeletionProtectionEnabled;
50735
+ disassociationProtection = table.DisassociationProtectionEnabled;
50170
50736
  streamArn = table.LatestStreamArn;
50171
50737
  } else try {
50172
50738
  const regional = await client.send(new DescribeTableCommand({ TableName: tableNameForSubs }));
50173
50739
  protection = regional.Table?.DeletionProtectionEnabled;
50740
+ disassociationProtection = regional.Table?.DisassociationProtectionEnabled;
50174
50741
  streamArn = regional.Table?.LatestStreamArn;
50175
50742
  } catch (err) {
50176
50743
  if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
@@ -50178,6 +50745,7 @@ var DynamoDBGlobalTableProvider = class {
50178
50745
  else this.logger.debug(safeMsg`Could not read the ${regionLabel} replica of ${tableNameForSubs}: ${describeAwsFailure(err).detail}`);
50179
50746
  }
50180
50747
  if (typeof protection === "boolean") entry["DeletionProtectionEnabled"] = protection;
50748
+ if (typeof disassociationProtection === "boolean" && declaredReplica?.[DISASSOCIATION_PROTECTION_KEY] !== void 0) entry[DISASSOCIATION_PROTECTION_KEY] = disassociationProtection;
50181
50749
  await this.readReplicaPolicies(client, tableNameForSubs, regionLabel, replicaArn, streamArn, declaredReplica, afterOwnWrite, entry);
50182
50750
  if (replicaArn) try {
50183
50751
  const tagsResp = await client.send(new ListTagsOfResourceCommand({ ResourceArn: replicaArn }));
@@ -50573,6 +51141,46 @@ function refuseMalformedReplicaTags(properties, resourceType, logicalId, physica
50573
51141
  });
50574
51142
  return tagsByReplica;
50575
51143
  }
51144
+ const DISASSOCIATION_PROTECTION_KEY = "DisassociationProtectionEnabled";
51145
+ function disassociationProtectionRefusal(properties, previousProperties, logicalId) {
51146
+ const replicas = properties["Replicas"];
51147
+ if (!Array.isArray(replicas)) return void 0;
51148
+ const malformed = [];
51149
+ const singleRegion = [];
51150
+ const multiRegion = isMultiRegionReplicaSet(properties);
51151
+ replicas.forEach((entry, index) => {
51152
+ const replica = asRecord(entry);
51153
+ if (replica === void 0) return;
51154
+ const refusal = configBooleanRefusal(replica, DISASSOCIATION_PROTECTION_KEY, `Replicas[${index}]`);
51155
+ if (refusal !== void 0) {
51156
+ malformed.push(refusal);
51157
+ return;
51158
+ }
51159
+ const declared = readReplicaDisassociationProtection(replica);
51160
+ if (declared === void 0 || multiRegion) return;
51161
+ const region = replica["Region"];
51162
+ const previous = previousProperties === void 0 || typeof region !== "string" ? void 0 : readReplicaDisassociationProtection(localReplicaEntry(previousProperties, region));
51163
+ if (declared === false && declared !== previous) singleRegion.push(`Replicas[${index}].${DISASSOCIATION_PROTECTION_KEY}`);
51164
+ });
51165
+ const parts = [];
51166
+ if (malformed.length > 0) parts.push(`${malformed.join("; ")}. That replica's disassociation protection is left as it is.`);
51167
+ if (singleRegion.length > 0) parts.push(`${singleRegion.join(", ")} is applied by DynamoDB only to a replica of a multi-Region (MREC) global table, and this table's Replicas name a single Region, so cdkd does not send it. Remove ${DISASSOCIATION_PROTECTION_KEY}, or add a replica in another Region.`);
51168
+ if (parts.length === 0) return void 0;
51169
+ return `AWS::DynamoDB::GlobalTable ${logicalId}: ${parts.join(" ")}`;
51170
+ }
51171
+ function isMultiRegionReplicaSet(properties) {
51172
+ const replicas = properties["Replicas"];
51173
+ if (!Array.isArray(replicas)) return false;
51174
+ const regions = /* @__PURE__ */ new Set();
51175
+ for (const entry of replicas) {
51176
+ const region = asRecord(entry)?.["Region"];
51177
+ if (typeof region === "string" && region !== "") regions.add(region);
51178
+ }
51179
+ return regions.size > 1;
51180
+ }
51181
+ function readReplicaDisassociationProtection(replica) {
51182
+ return coerceCfnBoolean(replica?.[DISASSOCIATION_PROTECTION_KEY]);
51183
+ }
50576
51184
  function completeLegacyLocalReplica(baseline, aws, localRegion) {
50577
51185
  const key = "Replicas";
50578
51186
  const baselineReplicas = baseline[key];
@@ -51801,6 +52409,7 @@ async function updateByReplacement(engine, { change, counts, currentProps, curre
51801
52409
  ...extractTemplateAttributes(template, logicalId),
51802
52410
  provisionedBy: replaceDecision.provisionedBy
51803
52411
  };
52412
+ clearCreatedReport();
51804
52413
  engine.recordInlinePolicyWrite(logicalId, "create");
51805
52414
  await establishNoEchoEchoFidelity(engine.noEchoRun, engine.noEchoDeps(), logicalId, stateResources[logicalId], resolvedProps, stateResources, updateSecrets);
51806
52415
  engine.observedCapture.kickOffObservedCapture(replaceProvider, logicalId, createResult.physicalId, resourceType, resolvedProps, { afterOwnWrite: true }, updateSecrets);
@@ -51878,6 +52487,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
51878
52487
  const changedForProvider = new Set(changedProperties);
51879
52488
  for (const key of /* @__PURE__ */ new Set([...Object.keys(previousWithNoEchoHeld), ...Object.keys(previousForUpdate)])) if (keyOrderFreeJson(previousForUpdate[key]) !== keyOrderFreeJson(previousWithNoEchoHeld[key])) changedForProvider.add(key);
51880
52489
  const unsettled = unsettledPropertiesOf(currentResource);
52490
+ const unsettledItems = unsettledItemsOf(currentResource);
51881
52491
  if (changedForProvider.size === 0) for (const key of /* @__PURE__ */ new Set([...Object.keys(updateProps), ...Object.keys(previousForUpdate)])) changedForProvider.add(key);
51882
52492
  if (reattached !== void 0) engine.logger.info(safeMsg` ${logicalId} (${resourceType}) lost its attachment to ${reattached.parents.join(", ")}, which this deploy re-created under the same name: attaching it again`);
51883
52493
  if (droppedPrincipalKinds.length > 0) {
@@ -51895,7 +52505,8 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
51895
52505
  ...unsettledIdentity,
51896
52506
  names: unsettled,
51897
52507
  previous: previousForUpdate,
51898
- desired: updateProps
52508
+ desired: updateProps,
52509
+ attemptedItems: unsettledItems
51899
52510
  });
51900
52511
  if (unsettled.has("Tags")) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): an earlier failed update left Tags unsettled. cdkd re-applies the template's tags and removes only the recorded ones the template dropped; a tag that failed update added and no template declares is left on the resource. Remove it by hand if it should not be there.`);
51901
52512
  const removal = prepareRemovalForUpdate(updateProvider, resourceType, updateProps, previousSettled);
@@ -51925,10 +52536,23 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
51925
52536
  }
51926
52537
  marks.add(propertyName);
51927
52538
  },
51928
- ...unsettled.size > 0 && { unsettledProperties: unsettled }
52539
+ markAttempted: (path, items) => {
52540
+ if (typeof path !== "string" || path === "") return;
52541
+ let byPath = engine.unsettledItemMarks.get(logicalId);
52542
+ if (byPath === void 0) {
52543
+ byPath = /* @__PURE__ */ new Map();
52544
+ engine.unsettledItemMarks.set(logicalId, byPath);
52545
+ }
52546
+ const names = byPath.get(path) ?? /* @__PURE__ */ new Set();
52547
+ for (const item of items) if (typeof item === "string" && item !== "") names.add(item);
52548
+ byPath.set(path, names);
52549
+ },
52550
+ ...unsettled.size > 0 && { unsettledProperties: unsettled },
52551
+ ...unsettledItems.size > 0 && { unsettledItems }
51929
52552
  })), logicalId, void 0, void 0, updateProvider);
51930
52553
  if (result.sentNothing === true) engine.replacementRun.updatesThatSentNothing.add(logicalId);
51931
52554
  engine.unsettledMarks.delete(logicalId);
52555
+ engine.unsettledItemMarks.delete(logicalId);
51932
52556
  if (result.wasReplaced === true && result.outcome === "partial") engine.replacementRun.replacedOldMaySurvive.set(logicalId, result.oldResourceSurvivor === "kept" ? "kept" : "unconfirmed");
51933
52557
  result = withoutInjectedRemovals(result, removal.injected);
51934
52558
  const unhandledByCause = splitUnhandledRemovals(removal.unhandled, previousForUpdate, unsettled);
@@ -52114,6 +52738,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
52114
52738
  generation: fallbackGeneration
52115
52739
  }, replaceFallback));
52116
52740
  engine.unsettledMarks.delete(logicalId);
52741
+ engine.unsettledItemMarks.delete(logicalId);
52117
52742
  result = fallbackOutcome.result;
52118
52743
  resultProvisionedBy = fallbackOutcome.provisionedBy;
52119
52744
  captureProvider = fallbackOutcome.captureProvider;
@@ -52137,7 +52762,8 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
52137
52762
  const stillUnsettled = result.wasReplaced ? [] : await unsettledAfterUpdate({
52138
52763
  ...unsettledIdentity,
52139
52764
  names: unsettled,
52140
- desired: updateProps
52765
+ desired: updateProps,
52766
+ attemptedItems: unsettledItems
52141
52767
  });
52142
52768
  if (stillUnsettled.length > 0) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): the update succeeded, but AWS does not yet show the template's ${stillUnsettled.join(", ")}; cdkd keeps ${stillUnsettled.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
52143
52769
  engine.replacementRun.updateWasReplaced.set(logicalId, result.wasReplaced === true);
@@ -52176,12 +52802,16 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
52176
52802
  ...dependencies && dependencies.length > 0 && { dependencies },
52177
52803
  ...extractTemplateAttributes(template, logicalId),
52178
52804
  provisionedBy: resultProvisionedBy,
52179
- ...stillUnsettled.length > 0 && { unsettledProperties: stillUnsettled },
52805
+ ...stillUnsettled.length > 0 && {
52806
+ unsettledProperties: stillUnsettled,
52807
+ ...unsettledItemsField(currentResource, stillUnsettled)
52808
+ },
52180
52809
  ...keepsParameterRefusal && {
52181
52810
  observedBaselineRefused: true,
52182
52811
  observedBaselineRefusalReason: "unverifiable-parameter"
52183
52812
  }
52184
52813
  };
52814
+ clearCreatedReport();
52185
52815
  if (updatePartialReason(result) === void 0) engine.recordInlinePolicyWrite(logicalId, "update");
52186
52816
  if (keepsParameterRefusal) engine.logger.debug(safeMsg`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
52187
52817
  const updateCaptureSiblings = keepsParameterRefusal ? void 0 : await buildObservedCaptureSiblings({
@@ -52834,6 +53464,8 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
52834
53464
  unwritten,
52835
53465
  routeDriving: findActionableSilentDrops(resourceType, desiredForSkipCheck, allowedForRecord, currentProps).map(({ property }) => property),
52836
53466
  nested: engine.options.parentStackInfo !== void 0,
53467
+ nowWritten: findHandledUnwrittenCreateOnly(resourceType, currentProps, createOnlyEvidence),
53468
+ evidence: [...createOnlyEvidence],
52837
53469
  protectionEvidence: recordedProtectionEvidence(resourceType, currentProps, currentResource.observedProperties, engine.stackRegion)
52838
53470
  }), "CREATE_ONLY_DROP_NEEDS_REPLACEMENT")));
52839
53471
  }
@@ -52945,13 +53577,34 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
52945
53577
  }
52946
53578
  function unwrittenCreateOnlyRefusal(input) {
52947
53579
  const { logicalId, resourceType, unwritten, routeDriving, nested, protectionEvidence } = input;
53580
+ const nowWritten = (input.nowWritten ?? []).filter((property) => unwritten.includes(property));
53581
+ if (nowWritten.length > 0) return nowWrittenCreateOnlyRefusal({
53582
+ ...input,
53583
+ nowWritten
53584
+ });
52948
53585
  const one = unwritten.length === 1;
52949
53586
  const list = unwritten.join(", ");
52950
53587
  const keep = [.../* @__PURE__ */ new Set([...unwritten, ...routeDriving])].sort((a, b) => a.localeCompare(b)).map((property) => `${resourceType}:${property}`).join(",");
52951
- const replaceFlags = nested ? "--replace (which creates the new resource before deleting the old one, so a resource holding a unique value other than its name, such as a CIDR block, collides)" : `--recreate-via-cc-api ${logicalId}, which deletes the old resource first (--replace also works, but creates the new one first, so a resource holding a unique value other than its name, such as a CIDR block, collides)`;
53588
+ const replaceFlags = unwrittenReplaceFlags(logicalId, nested);
52952
53589
  const routed = [...routeDriving].sort((a, b) => a.localeCompare(b)).join(", ");
52953
53590
  return safeMsg`${logicalId} (${resourceType}): ${list} ${one ? "is" : "are"} create-only, and the ` + `state record holds ${one ? "it" : "them"} although this type's SDK provider never writes ${one ? "it" : "them"}, so AWS does not. This deploy routes the resource through ` + safeMsg`Cloud Control (--prefer-sdk-route does not cover ${routed}), and applying a create-only ` + `property means replacing the resource, which cdkd does not do on its own. This ` + safeMsg`resource was not changed. To replace it and apply ${list}, re-run with ${replaceFlags}; a ` + `stateful resource also needs --force-stateful-recreation.` + (protectionEvidence !== void 0 ? safeMsg` ${recordedProtectionNote(protectionEvidence, nested ? "--replace" : `--recreate-via-cc-api ${logicalId} or --replace`)}` : "") + safeMsg` To keep dropping ${one ? "it" : "them"}, re-run with --prefer-sdk-route ${keep}.`;
52954
53591
  }
53592
+ function unwrittenReplaceFlags(logicalId, nested) {
53593
+ return nested ? "--replace (which creates the new resource before deleting the old one, so a resource holding a unique value other than its name, such as a CIDR block, collides)" : `--recreate-via-cc-api ${logicalId}, which deletes the old resource first (--replace also works, but creates the new one first, so a resource holding a unique value other than its name, such as a CIDR block, collides)`;
53594
+ }
53595
+ function nowWrittenCreateOnlyRefusal(input) {
53596
+ const { logicalId, resourceType, unwritten, routeDriving, nested, protectionEvidence } = input;
53597
+ const nowWritten = input.nowWritten;
53598
+ const one = unwritten.length === 1;
53599
+ const list = unwritten.join(", ");
53600
+ const written = nowWritten.join(", ");
53601
+ const writtenOne = nowWritten.length === 1;
53602
+ const stillDropped = unwritten.filter((property) => !nowWritten.includes(property));
53603
+ const keep = [.../* @__PURE__ */ new Set([...stillDropped, ...routeDriving])].filter((property) => !nowWritten.includes(property)).sort((a, b) => a.localeCompare(b)).map((property) => `${resourceType}:${property}`).join(",");
53604
+ const routed = [...routeDriving].sort((a, b) => a.localeCompare(b)).join(", ");
53605
+ const replaceFlags = unwrittenReplaceFlags(logicalId, nested);
53606
+ return safeMsg`${logicalId} (${resourceType}): ${list} ${one ? "is" : "are"} create-only, and the ` + `state record holds ${one ? "it" : "them"} although the SDK provider that built the resource did not write ${one ? "it" : "them"} (an earlier deploy accepted dropping ${one ? "it" : "them"} with --prefer-sdk-route), so AWS does not. ` + safeMsg`This cdkd version's SDK provider writes ${written}, so no flag keeps ` + `${writtenOne ? "it" : "them"} dropped any more` + (routed.length > 0 ? safeMsg`, and this deploy routes the resource through Cloud Control (--prefer-sdk-route does not cover ${routed})` : "") + "; applying a create-only property means replacing the resource, which cdkd does not do on its own. This " + safeMsg`resource was not changed. To replace it and apply ${list}, re-run with ${replaceFlags}; a ` + `stateful resource also needs --force-stateful-recreation.` + (protectionEvidence !== void 0 ? safeMsg` ${recordedProtectionNote(protectionEvidence, nested ? "--replace" : `--recreate-via-cc-api ${logicalId} or --replace`)}` : "") + safeMsg` To keep the resource as it is, remove ${written} from the template` + (keep.length > 0 ? safeMsg` and re-run with --prefer-sdk-route ${keep}.` : ".") + (nested || stillDropped.length > 0 || (input.evidence ?? []).some((property) => !nowWritten.includes(property)) ? "" : safeMsg` If AWS already holds ${written} (cdkd drift compares it), re-record the ` + safeMsg`resource instead: cdkd import with --resource '${logicalId}=PHYSICAL_ID' (its physical ` + `id, quoted) and --force writes a record without this evidence and changes nothing in AWS.`);
53607
+ }
52955
53608
  function scalarLeavesOf(value, into = /* @__PURE__ */ new Set()) {
52956
53609
  if (typeof value === "string") into.add(value);
52957
53610
  else if (typeof value === "number") into.add(String(value));
@@ -53038,7 +53691,7 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
53038
53691
  let nestedChildUnaddressed;
53039
53692
  const deleteGuards = [];
53040
53693
  try {
53041
- await withPrintingSecrets(printingRegistry, () => withResourceDeadline(async () => {
53694
+ await withPrintingSecrets(printingRegistry, () => withResourceDeadline(trackInFlightBody(engine, logicalId, async () => {
53042
53695
  try {
53043
53696
  const { value: bodyResult, unaddressed } = await collectDeleteGuards(deleteGuards, () => collectNestedChildUnaddressed(() => provisionResourceBody(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress)));
53044
53697
  deleteSkipped = bodyResult?.deleteSkipped;
@@ -53070,7 +53723,7 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
53070
53723
  reason: guard.reason
53071
53724
  });
53072
53725
  }
53073
- }, {
53726
+ }), {
53074
53727
  warnAfterMs,
53075
53728
  timeoutMs,
53076
53729
  onWarn: (elapsedMs) => {
@@ -53148,6 +53801,17 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
53148
53801
  renderer.removeTask(logicalId);
53149
53802
  }
53150
53803
  }
53804
+ function trackInFlightBody(engine, logicalId, body) {
53805
+ return () => {
53806
+ const running = body();
53807
+ const entry = running.then(() => true, () => false);
53808
+ engine.inFlightBodies.set(logicalId, entry);
53809
+ entry.then(() => {
53810
+ if (engine.inFlightBodies.get(logicalId) === entry) engine.inFlightBodies.delete(logicalId);
53811
+ });
53812
+ return running;
53813
+ };
53814
+ }
53151
53815
  async function provisionResourceBody(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress) {
53152
53816
  const loadJournal = () => engine.stateBackend.loadRollbackJournal(stackName, engine.stackRegion);
53153
53817
  const priorAttempts = priorAttemptLookup(logicalId, async () => priorAttemptsInJournal(await loadJournal(), logicalId, change.resourceType), async () => provenOrphanIdsInJournal(await loadJournal(), logicalId, change.resourceType));
@@ -53183,6 +53847,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53183
53847
  };
53184
53848
  const completedOperations = [];
53185
53849
  const failedOperations = [];
53850
+ const reportedCreatesToSettle = [];
53186
53851
  let pendingMigration = migrationPending;
53187
53852
  const phaseScope = phaseScopeForStack(stackName, engine.stackRegion);
53188
53853
  let saveChain = Promise.resolve();
@@ -53200,7 +53865,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53200
53865
  const savedFor = savedIds.join(", ");
53201
53866
  try {
53202
53867
  const partialState = {
53203
- version: 14,
53868
+ version: 15,
53204
53869
  region: engine.stackRegion,
53205
53870
  stackName: currentState.stackName,
53206
53871
  resources: newResources,
@@ -53317,9 +53982,10 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53317
53982
  settle
53318
53983
  });
53319
53984
  let succeeded = false;
53985
+ const createdSink = new CreatedResourceSink(logicalId, change.resourceType);
53320
53986
  try {
53321
53987
  try {
53322
- await timePhase(phaseScope, `resource ${change.changeType.toLowerCase()}`, () => provisionResource(engine, logicalId, change, newResources, stackName, template, parameterValues, conditions, actualCounts, progress), `${logicalId} ${change.resourceType}`);
53988
+ await timePhase(phaseScope, `resource ${change.changeType.toLowerCase()}`, () => collectCreatedResources(createdSink, () => provisionResource(engine, logicalId, change, newResources, stackName, template, parameterValues, conditions, actualCounts, progress)), `${logicalId} ${change.resourceType}`);
53323
53989
  settledUpdates.add(logicalId);
53324
53990
  succeeded = true;
53325
53991
  } finally {
@@ -53334,10 +54000,11 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53334
54000
  const attemptedGeneration = change.changeType === "UPDATE" && !refused && !isReplacementNameRefusal(provisionError, logicalId) ? engine.replacementRun.attemptedNameGeneration.get(logicalId) : void 0;
53335
54001
  const statePhysicalId = newResources[logicalId]?.physicalId ?? previousState?.physicalId;
53336
54002
  if (refused && change.changeType === "CREATE" && statePhysicalId === void 0) throw provisionError;
53337
- const createdId = change.changeType === "CREATE" && statePhysicalId === void 0 ? createdBeforeFailure(provisionError, logicalId, change.resourceType) : void 0;
54003
+ const markedCreatedId = createdBeforeFailure(provisionError, logicalId, change.resourceType);
54004
+ const createdId = change.changeType === "CREATE" && statePhysicalId === void 0 ? markedCreatedId : void 0;
53338
54005
  const heldRecord = newResources[logicalId] ?? previousState;
53339
54006
  const replaced = change.changeType === "UPDATE" && !NO_REPLACEMENT_ORPHAN_TYPES.has(change.resourceType) && statePhysicalId !== void 0 && statePhysicalId !== "" && heldRecord?.physicalId === statePhysicalId ? heldRecord : void 0;
53340
- const replacementCreatedId = replaced ? createdBeforeFailure(provisionError, logicalId, change.resourceType) : void 0;
54007
+ const replacementCreatedId = replaced ? markedCreatedId : void 0;
53341
54008
  const orphanedBy = replaced !== void 0 && replacementCreatedId !== void 0 && replacementCreatedId !== replaced.physicalId ? {
53342
54009
  record: replaced,
53343
54010
  createdId: replacementCreatedId
@@ -53373,34 +54040,17 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53373
54040
  if (attemptedGeneration !== void 0 && heldNow !== void 0) newResources[logicalId] = withNameGenerationReached(heldNow, logicalId, attemptedGeneration);
53374
54041
  let replacementOrphanOp;
53375
54042
  if (orphanedBy !== void 0) {
53376
- replacementOrphanOp = {
53377
- logicalId,
53378
- changeType: "CREATE",
53379
- resourceType: change.resourceType,
53380
- provisionedBy: "sdk",
53381
- physicalId: orphanedBy.createdId,
53382
- physicalIdRecoveredFromError: true,
53383
- deletionPolicy: journaledOrphanPolicy(extractTemplateAttributes(template, logicalId).deletionPolicy),
53384
- replacedPhysicalId: orphanedBy.record.physicalId,
53385
- replacedResourceType: orphanedBy.record.resourceType,
53386
- ...engine.replacementRun.oldDeletedBeforeCreate.has(logicalId) && { replacedResourceDeleted: true },
53387
- ...!refused && { attemptedProperties: engine.attemptedResolvedProps.get(logicalId) }
53388
- };
54043
+ replacementOrphanOp = replacementOrphanOpFor(engine, template, logicalId, change.resourceType, orphanedBy.record, orphanedBy.createdId, refused);
53389
54044
  failedOperations.push(replacementOrphanOp);
53390
54045
  }
54046
+ if (markedCreatedId === void 0 && (change.changeType === "CREATE" && statePhysicalId === void 0 || replaced !== void 0) && deadlineFiredFor(provisionError, logicalId)) reportedCreatesToSettle.push({
54047
+ sink: createdSink,
54048
+ failedOp,
54049
+ ...replaced !== void 0 && { replaced },
54050
+ refused
54051
+ });
53391
54052
  const orphanOp = createdId !== void 0 ? failedOp : replacementOrphanOp;
53392
- if (orphanOp?.physicalId !== void 0 && orphanOp.deletionPolicy !== "Retain" && orphanNeedsIdentity(orphanOp)) {
53393
- const markedIdentity = createdResourceIdentityBeforeFailure(provisionError, logicalId, change.resourceType);
53394
- if (markedIdentity !== void 0) orphanOp.createdResourceIdentity = markedIdentity;
53395
- else if (engine.interruptCause !== "user") {
53396
- const identity = await readResourceIdentity(engine.providerRegistry, {
53397
- resourceType: orphanOp.resourceType,
53398
- physicalId: orphanOp.physicalId,
53399
- provisionedBy: orphanOp.provisionedBy
53400
- }, engine.stackRegion);
53401
- if (typeof identity === "string") orphanOp.createdResourceIdentity = identity;
53402
- }
53403
- }
54053
+ if (orphanOp !== void 0) await journalOrphanIdentity(engine, orphanOp, createdResourceIdentityBeforeFailure(provisionError, logicalId, change.resourceType));
53404
54054
  throw provisionError;
53405
54055
  }
53406
54056
  completedOperations.push({
@@ -53551,9 +54201,10 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53551
54201
  engine.logger.warn(safeMsg` ⚠ ${lost.logicalId} (${childType}) was removed from a resource this deploy re-created under the same id, and the deploy failed before writing it again: the next deploy writes it there again (its record keeps only the holders it is still on).`.concat(mayStillBeLive));
53552
54202
  }
53553
54203
  }
54204
+ await settleReportedCreates(engine, template, failedOperations, reportedCreatesToSettle);
53554
54205
  try {
53555
54206
  const preRollbackState = {
53556
- version: 14,
54207
+ version: 15,
53557
54208
  region: engine.stackRegion,
53558
54209
  stackName: currentState.stackName,
53559
54210
  resources: newResources,
@@ -53594,7 +54245,15 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53594
54245
  engine.logger.warn(safeMsg`Partial state has been saved. ${recoveryHint(engine.rollbackDeps(), "Run 'cdkd deploy' to resume, 'cdkd rollback' to revert, or destroy to clean up.")}`);
53595
54246
  } else {
53596
54247
  autoRollbackJournaled = await writeRollbackJournalSegment(engine.rollbackDeps(), stackName, completedOperations, failedOperations, "auto-rollback-started", initialDeploy);
53597
- const rollbackResult = await performRollback(engine.rollbackDeps(), completedOperations, newResources, stackName, currentState, failedOperations, currentState.orphans ?? []);
54248
+ const rollbackResult = await performRollback(engine.rollbackDeps(), completedOperations, newResources, stackName, currentState, failedOperations, currentState.orphans ?? [], {
54249
+ runMarks: (logicalId) => ({
54250
+ names: engine.unsettledMarks.get(logicalId) ?? /* @__PURE__ */ new Set(),
54251
+ items: engine.unsettledItemMarks.get(logicalId) ?? /* @__PURE__ */ new Map()
54252
+ }),
54253
+ stillRunning: (logicalId) => engine.inFlightBodies.get(logicalId),
54254
+ recordMarks: (logicalId) => recordUnsettledMarks(engine, newResources, logicalId),
54255
+ onReverted: (logicalId, settled) => dropUnsettledMarks(engine, logicalId, settled)
54256
+ });
53598
54257
  autoRollbackClean = autoRollbackJournaled && rollbackResult.failures === 0 && rollbackResult.skipped === 0 && !rollbackResult.interrupted;
53599
54258
  if (rollbackResult.interrupted && rollbackResult.failures === 0 && rollbackResult.skipped === 0) {
53600
54259
  const remedy = autoRollbackJournaled ? recoveryHint(engine.rollbackDeps(), "The rollback journal keeps them; finish the rollback with: " + pasteableCommand("cdkd rollback", [{
@@ -53619,7 +54278,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53619
54278
  recordUnsettledMarks(engine, newResources);
53620
54279
  try {
53621
54280
  const postRollbackState = {
53622
- version: 14,
54281
+ version: 15,
53623
54282
  region: engine.stackRegion,
53624
54283
  stackName: currentState.stackName,
53625
54284
  resources: newResources,
@@ -53642,7 +54301,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53642
54301
  const freshEtag = (await engine.stateBackend.getState(stackName, engine.stackRegion))?.etag;
53643
54302
  recordUnsettledMarks(engine, newResources);
53644
54303
  const postRollbackState = {
53645
- version: 14,
54304
+ version: 15,
53646
54305
  region: engine.stackRegion,
53647
54306
  stackName: currentState.stackName,
53648
54307
  resources: newResources,
@@ -53679,7 +54338,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53679
54338
  }
53680
54339
  return {
53681
54340
  state: {
53682
- version: 14,
54341
+ version: 15,
53683
54342
  region: engine.stackRegion,
53684
54343
  stackName: currentState.stackName,
53685
54344
  resources: newResources,
@@ -53698,7 +54357,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
53698
54357
  }
53699
54358
  async function persistStateAfterOutputFailure(engine, stackName, currentState, newResources, currentEtag, pendingMigration) {
53700
54359
  const buildState = () => ({
53701
- version: 14,
54360
+ version: 15,
53702
54361
  region: engine.stackRegion,
53703
54362
  stackName: currentState.stackName,
53704
54363
  resources: newResources,
@@ -53737,6 +54396,73 @@ function recordUnsettledMarks(engine, newResources, only) {
53737
54396
  if (only !== void 0 && logicalId !== only) continue;
53738
54397
  if (marks.size === 0 || !Object.hasOwn(newResources, logicalId)) continue;
53739
54398
  newResources[logicalId] = withUnsettledProperties(newResources[logicalId], marks);
54399
+ const items = engine.unsettledItemMarks.get(logicalId);
54400
+ if (items !== void 0 && items.size > 0) newResources[logicalId] = withUnsettledItems(newResources[logicalId], items);
54401
+ }
54402
+ }
54403
+ function dropUnsettledMarks(engine, logicalId, names) {
54404
+ const marks = engine.unsettledMarks.get(logicalId);
54405
+ if (marks !== void 0) for (const name of names) marks.delete(name);
54406
+ const items = engine.unsettledItemMarks.get(logicalId);
54407
+ if (items !== void 0) {
54408
+ for (const path of [...items.keys()]) if (names.has(unsettledItemsTopKey(path))) items.delete(path);
54409
+ }
54410
+ }
54411
+ function deadlineFiredFor(error, logicalId) {
54412
+ try {
54413
+ let current = error;
54414
+ for (let depth = 0; depth < 5 && typeof current === "object" && current !== null; depth++) {
54415
+ if (current instanceof ResourceTimeoutError) return current.logicalId === logicalId;
54416
+ current = current.cause;
54417
+ }
54418
+ } catch {}
54419
+ return false;
54420
+ }
54421
+ async function settleReportedCreates(engine, template, failedOperations, pending) {
54422
+ for (const { sink, failedOp, replaced, refused } of pending) {
54423
+ const report = sink.report;
54424
+ if (report === void 0) continue;
54425
+ let orphanOp;
54426
+ if (replaced === void 0) {
54427
+ failedOp.provisionedBy = "sdk";
54428
+ failedOp.physicalId = report.physicalId;
54429
+ failedOp.physicalIdRecoveredFromError = true;
54430
+ failedOp.deletionPolicy = journaledOrphanPolicy(extractTemplateAttributes(template, failedOp.logicalId).deletionPolicy);
54431
+ orphanOp = failedOp;
54432
+ } else {
54433
+ if (report.physicalId === replaced.physicalId) continue;
54434
+ failedOp.replacementOrphaned = engine.replacementRun.oldDeletedBeforeCreate.has(failedOp.logicalId) ? "delete-first" : "create-first";
54435
+ orphanOp = replacementOrphanOpFor(engine, template, failedOp.logicalId, failedOp.resourceType, replaced, report.physicalId, refused);
54436
+ failedOperations.push(orphanOp);
54437
+ }
54438
+ await journalOrphanIdentity(engine, orphanOp, report.createdResourceIdentity);
54439
+ }
54440
+ }
54441
+ function replacementOrphanOpFor(engine, template, logicalId, resourceType, record, createdId, refused) {
54442
+ return {
54443
+ logicalId,
54444
+ changeType: "CREATE",
54445
+ resourceType,
54446
+ provisionedBy: "sdk",
54447
+ physicalId: createdId,
54448
+ physicalIdRecoveredFromError: true,
54449
+ deletionPolicy: journaledOrphanPolicy(extractTemplateAttributes(template, logicalId).deletionPolicy),
54450
+ replacedPhysicalId: record.physicalId,
54451
+ replacedResourceType: record.resourceType,
54452
+ ...engine.replacementRun.oldDeletedBeforeCreate.has(logicalId) && { replacedResourceDeleted: true },
54453
+ ...!refused && { attemptedProperties: engine.attemptedResolvedProps.get(logicalId) }
54454
+ };
54455
+ }
54456
+ async function journalOrphanIdentity(engine, orphanOp, carried) {
54457
+ if (orphanOp.physicalId === void 0 || orphanOp.deletionPolicy === "Retain" || !orphanNeedsIdentity(orphanOp)) return;
54458
+ if (carried !== void 0) orphanOp.createdResourceIdentity = carried;
54459
+ else if (engine.interruptCause !== "user") {
54460
+ const identity = await readResourceIdentity(engine.providerRegistry, {
54461
+ resourceType: orphanOp.resourceType,
54462
+ physicalId: orphanOp.physicalId,
54463
+ provisionedBy: orphanOp.provisionedBy
54464
+ }, engine.stackRegion);
54465
+ if (typeof identity === "string") orphanOp.createdResourceIdentity = identity;
53740
54466
  }
53741
54467
  }
53742
54468
 
@@ -53780,7 +54506,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
53780
54506
  clock.lap("state load");
53781
54507
  noteDeployStateRecord(currentStateData?.state !== void 0);
53782
54508
  const currentState = currentStateData?.state ?? {
53783
- version: 14,
54509
+ version: 15,
53784
54510
  region: engine.stackRegion,
53785
54511
  stackName,
53786
54512
  resources: {},
@@ -54083,7 +54809,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
54083
54809
  await resolveStackInstanceId();
54084
54810
  try {
54085
54811
  const refreshedState = {
54086
- version: 14,
54812
+ version: 15,
54087
54813
  region: engine.stackRegion,
54088
54814
  stackName: currentState.stackName,
54089
54815
  resources: currentState.resources,
@@ -54372,6 +55098,8 @@ var DeployEngine = class {
54372
55098
  outputsRun = new OutputsRunState();
54373
55099
  attemptedResolvedProps = /* @__PURE__ */ new Map();
54374
55100
  unsettledMarks = /* @__PURE__ */ new Map();
55101
+ unsettledItemMarks = /* @__PURE__ */ new Map();
55102
+ inFlightBodies = /* @__PURE__ */ new Map();
54375
55103
  resumedCreates = /* @__PURE__ */ new Map();
54376
55104
  generatedNameGuard;
54377
55105
  liveTaskLabels = /* @__PURE__ */ new Map();
@@ -54565,6 +55293,7 @@ var DeployEngine = class {
54565
55293
  this.replacementRun = new ReplacementRunState();
54566
55294
  this.attemptedResolvedProps = /* @__PURE__ */ new Map();
54567
55295
  this.unsettledMarks = /* @__PURE__ */ new Map();
55296
+ this.unsettledItemMarks = /* @__PURE__ */ new Map();
54568
55297
  this.resumedCreates = /* @__PURE__ */ new Map();
54569
55298
  this.generatedNameGuard = void 0;
54570
55299
  this.liveTaskLabels = /* @__PURE__ */ new Map();
@@ -54769,5 +55498,5 @@ function sameGenerationClaimsOf(record) {
54769
55498
  }
54770
55499
 
54771
55500
  //#endregion
54772
- export { computeImplicitDeleteEdges as $, coerceParameterTypedValue as $a, DYNAMIC_REFERENCE_TOKEN_SCAN as $c, applyCustomResourceResponseExpiration as $i, stringifyValue as $l, WITHHELD_NAME_DISPLAY as $n, refuseMalformedOrphanRecords as $o, noEchoExactEchoLeavesOf as $r, readConfigString as $s, lookupEachName as $t, MIGRATE_TMP_PREFIX as $u, beginDeleteWait as A, s3BucketRegionalDomainName as Aa, valueAtCoordinate as Ac, isRefusedByName as Ai, isAccessDenied$1 as Al, resolveReplacementOldType as An, isReadableResourceEntry as Ao, awaitInFlightSibling as Ar, withheldAccountClause as As, displacedOpClause as At, redactedDockerCause as Au, waitForIndexesSettled as B, assertFlagRoleArn as Ba, logOnlyValueCount as Bc, stringifyIfAssigned as Bi, hasUnverifiableParameterRefusal as Bl, updatePartialMessage as Bn, malformedOrphansRefusalMessage as Bo, yellow as Br, isStatefulRecreateTargetForReplace as Bs, getCurrentNestedStackContext as Bt, loadCdkJson as Bu, planContributorInsightsOp as C, withoutUnsettledProperties as Ca, noEchoCoordinatesOf as Cc, resolveAssemblyPath as Cd, ledgerForStack as Ci, isLockInfoExpired as Cl, isJournaledOrphan as Cn, accountArgs as Co, rollbackOrphanIds as Cr, repairMalformedOutputsForReadOnly as Cs, makeSiblingClaimReader as Ct, formatDockerLoginError as Cu, reverseMapTableContributorInsights as D, s3BucketArn as Da, readbackPathFor as Dc, resolveBucketRegion as Dd, DeploymentEventsReader as Di, CrossPrefixScanCache as Dl, recheckFailedPlan as Dn, hasReadableOutputs as Do, mappingPairs as Dr, unpreviewableOrphanRecords as Ds, keptForRetainedRecord as Dt, partitionSensitiveEnv as Du, reverseMapIndexContributorInsights as E, isSettledInstanceState as Ea, passedNoEchoParametersOf as Ec, clearBucketRegionCache as Ed, acquireIdempotencyToken as Ei, CrossPrefixReadError as El, planRollback as En, hasReadableOrphans as Eo, looselyEqual as Er, repairMalformedResourcesForReadOnly as Es, resolvePendingCloudControlRequests as Et, isMalformedEnvKey as Eu, DELETE_INDEX_WAIT_PROCEED_NOTE as F, keepHeldTokenProvenance as Fa, snapshotPassProvenance as Fc, readTagList as Fi, acceptedCreateOnlyDropsOf as Fl, inheritProducerRegions as Fn, malformedLocalResourceEntriesWarning as Fo, bold as Fr, NO_CC_HANDLERS_REASON as Fs, recordDisplacedSkips as Ft, getDockerImageBySourceHash as Fu, sendTtlWaitingOutRateLimit as G, AWS_CREDENTIAL_ENV_KEYS as Ga, unionOfSecretBags as Gc, wouldReturnToSdkProvider as Gi, orphansCarriedFrom as Gl, retiredAfterRollback as Gn, malformedResourceEntriesWarning as Go, removeSuperseded as Gr, isWarmThroughputDecrease as Gs, isHandledOrphan as Gt, resolveStateBucketWithDefault as Gu, isTtlRateLimited as H, explicitRoleArnOrThrow as Ha, recordLogOnlyParameterValue as Hc, ProviderRegistry as Hi, importableOutputs as Hl, nameGenerationCarriedFrom as Hn, malformedOutputsRefusalMessage as Ho, deleteSupersededEntry as Hr, renderStatefulReason as Hs, deleteJournaledOrphans as Ht, resolveAutoAssetStorage as Hu, INDEX_SETTLE_POLL_INTERVAL_MS as I, outputReferenceProvenanceOf as Ia, carryLogOnlyValues as Ic, refuseMalformedDesiredTags as Ii, describeRegionValueKind as Il, REDACTED_DELETE_ADDRESS_SKIP_REASON as In, malformedLocalResourcesWarning as Io, cyan as Ir, hasNoCloudControlHandlers as Is, revertNestedChildFromJournal as It, Synthesizer as Iu, hasCdkAutoDeleteTag as J, envCredentialsAreAssumedRole as Ja, maskSecretsInError as Jc, readsNoEchoDeleteValues as Ji, PhaseClock as Jl, withNameGenerationReached as Jn, malformedScrubResourceEntriesRefusalMessage as Jo, supersededHolderOf as Jr, coerceCfnBoolean as Js, makeForeignHolderScan as Jt, stateBucketExistenceConfirmed as Ju, ECR_AUTO_DELETE_IMAGES_TAG as K, applyCallerIdentityCredentials as Ka, createSecretMasker as Kc, waitForLambdaFunctionActive as Ki, shouldRetainResource as Kl, retiredNameGenerationsAfter as Kn, malformedResourcePropertiesWarning as Ko, supersededAfterRollback as Kr, toCfnInteger as Ks, journaledOrphanLines as Kt, resolveStateBucketWithDefaultAndSource as Ku, deleteTableWithIndexBusyRetry as L, recordedOutputReferenceRegions as La, createUnionSecretMasker as Lc, tagMapAsList as Li, exportNamesCarriedFrom as Ll, isRedactedRecordedValue as Ln, malformedOrphanRecordsRefusalMessage as Lo, gray as Lr, findReplacedReadersOfRecreateTargets as Ls, revertedNestedRowIds as Lt, synthesisStatusMessage as Lu, deleteBudgetKey as M, resolveDynamicReferences as Ma, markSameGenerationBag as Mc, DBPROXY_TAGS_WHAT as Mi, stackInstanceIdOf as Ml, orphanNeedsIdentity as Mn, malformedExportNamesWarning as Mo, getStackRecords as Mr, findSilentDropProperties as Ms, dropSettledNestedJournals as Mt, runDockerStreaming as Mu, resolveDynamoDbDeleteBudgetClock as N, producerLookupOver as Na, redactForState as Nc, DBPROXY_TAG_OPTIONS as Ni, withStackInstanceIdWithheld as Nl, findNestedStackTypeChanges as Nn, malformedExportSourceWarning as No, withStackRecords as Nr, unwrittenCreateOnlyReplacement as Ns, getNestedRevertRun as Nt, warnFinchArgvExposure as Nu, stripIndexContributorInsights as O, s3BucketDomainName as Oa, readsNoEchoSource as Oc, DeploymentEventsStore as Oi, applyCrossPrefixScan as Ol, recordUnderIdIsNotOwn as On, hasReadableResources as Oo, parseMappingFile as Or, unreadableOrphanRecords as Os, recordRetainedForReadoption as Ot, redactDockerArgvValues as Ou, resolveDynamoDbDeleteBudgetMs as P, refuseUnreadableCdkCrossAccountRefs as Pa, recordReferenceProvenanceEntry as Pc, planTagDiff as Pi, splitImportedOps as Pl, getCurrentProducerRegions as Pn, malformedLocalOutputsWarning as Po, replacedDeleteFailureVerdict as Pr, withoutSilentDropProperties as Ps, nestedChildStackName as Pt, AssetManifestLoader as Pu, IMPLICIT_DELETE_DEPENDENCIES as Q, regionLessSecretName as Qa, withoutPhysicalNameCopies as Qc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Qi, isSensitiveAttributeName as Ql, resourcesNamingDeclaredParameter as Qn, refuseMalformedNestedChildOutputs as Qo, noEchoComparisonForTemplate as Qr, configStringRefusal as Qs, isAccessDeniedError as Qt, CFN_TEMPLATE_URL_LIMIT as Qu, maskedLogger as R, recordedReferenceRegions as Ra, hasMaskableValues as Rc, tagPlanWarning as Ri, hasReadableExportSet as Rl, redactedDeleteAddressFields as Rn, malformedOrphanRecordsWarning as Ro, green as Rr, shownType as Rs, withNestedRevertRun as Rt, getDefaultStateBucketName as Ru, indexDeclaresContributorInsights as S, withUnsettledProperties as Sa, maskedLeafCoordinatesOf as Sc, renderAssemblyPathEscape as Sd, earliestDefined as Si, LockManager as Sl, demoteSupersededOrphans as Sn, UNREADABLE_RESOURCES_MAP_ROW as So, movedToHint as Sr, repairMalformedOrphansForReadOnly as Ss, makeCanonicalizePropertiesFn as St, finchSecretArgvRefusal as Su, readContributorInsightsSpec as T, poisonRenderedSpellingsCollidingIn as Ta, noEchoOutputsComparison as Tc, injectedAwsRegionValue as Td, withCreateTokenLedger as Ti, rebuildClientForBucketRegion as Tl, planFailedOps as Tn, displayLogicalId as To, isPairableType as Tr, repairMalformedResourcePropertiesForReadOnly as Ts, pendingRequestCount as Tt, isDockerClientEnvKey as Tu, planTimeToLive as U, isIamRoleArn as Ua, recordLogOnlyValue as Uc, ccBrokenReason as Ui, isReadableBag as Ul, nameGenerationHighWaterOf as Un, malformedOutputsWarning as Uo, holdsSupersededResources as Ur, WARM_THROUGHPUT_MEMBERS as Us, dropFailedCommands as Ut, resolveCaptureObservedState as Uu, isTtlAlreadyDisabled as V, assertSendableRoleArn as Va, printingCorpusOf as Vc, CC_BROKEN_REASON as Vi, importableOutputKeys as Vl, updatePartialReason as Vn, malformedOrphansWarning as Vo, addSuperseded as Vr, isStatefulRecreateTargetSync as Vs, withNestedStackContext as Vt, resolveApp as Vu, readTtlSpec as W, sendableAssumeRoleCommand as Wa, shareLogOnlyValues as Wc, isCustomResource as Wi, orphansAfterRollback as Wl, nameScopeOf as Wn, malformedRenderedContainersWarning as Wo, isSupersededResourceRecord as Wr, coerceWarmThroughput as Ws, dropFailedHint as Wt, resolveSkipPrefix as Wu, getPriorAttempts as X, classifyReplaySecretRegion as Xa, scrubResourceRecord as Xc, getCurrentResourceSecrets as Xi, timePhase as Xl, namesAnyDeclaredParameter as Xn, previewableOrphanRecords as Xo, withoutSuperseded as Xr, configBooleanRefusal as Xs, formatResourceLine as Xt, ssmResolvedValueType as Xu, isTruthyCfnBoolean as Y, classifyRecordedSecretRegion as Ya, maskSecretsInText as Yc, isCustomResourceType as Yi, renderPhaseTimings as Yl, computeParameterTaint as Yn, malformedStateRefusalMessage as Yo, supersededResourcesOf as Yr, coerceCfnInteger as Ys, sameJournaledOrphans as Yt, warnDeprecatedNoPrefixCliFlag as Yu, markRefusedBeforeApplying as Z, producerRegionsFromState as Za, withPhysicalNameCopies as Zc, withPrintingSecrets as Zi, AssetPublisher as Zl, reachableDivergentParameters as Zn, refuseDivergentRecordRegionForDestroy as Zo, noEchoAttributeNamesOf as Zr, configIntegerRefusal as Zs, chunks as Zt, CFN_TEMPLATE_BODY_LIMIT as Zu, streamMemberRefusals as _, reDisableInstanceApiTermination as _a, canonicalCoordinates as _c, nullPrototypeRecord as _d, createPreDeleteFinalSnapshot as _i, recordNoEchoParameterFreshValue as _l, withUnprovenUnsettled as _n, declaresNoEcho as _o, constructPathOf as _r, refuseMalformedResourcesForDeploy as _s, withResourceDeadline as _t, resolveDockerContextDirectory as _u, isProtectionValueActive as a, RollbackInlinePolicyWriters as aa, templateResourceTypes as ac, PARTITION_TABLE as ad, namingSecretsWithRecordedNoEcho as ai, inheritNestedStackParameterAssociations as al, refuseRefactorMarker as an, carriesFetchableDynamicReference as ao, carriedExportAliasExposure as ar, refuseMalformedOutputsForDestroy as as, childTemplateLoader as at, AssetModeResolver as au, CONTRIBUTOR_INSIGHTS_KEY as b, INTRINSIC_KEYS as ba, maskReadbackAtCoordinates as bc, describeFileReadFailure as bd, refusesFinalSnapshot as bi, WHOLE_DYNAMIC_REFERENCE_PATTERN as bl, equalModuloMask as bn, STATE_RESOURCES_MALFORMED as bo, findRefactorHints as br, refuseMalformedState as bs, keptWholeReasonText as bt, describeDockerFailure as bu, DynamoDBGlobalTableProvider as c, deleteLeftInPlace as ca, blockDeviceMappingsDifferOnlyInDeleteOnTermination as cc, AssemblyReader as cd, secretNamePrintingBags as ci, physicalNameCopiesOf as cl, hasPendingMovesOut as cn, AWS_NO_VALUE as co, isWholeDynamicReferenceValue as cr, refuseMalformedResourceEntriesForDeploy as cs, listNestedTemplateRows as ct, ensureAssetStorage as cu, declaredStreamPolicyMember as d, isWaitAbandonedError as da, emrClusterInstancesReplaced as dc, describeJsonParseFailure as dd, stateSecretNameNeedles as di, splitGetAttStringForm as dl, refusePendingMovesOut as dn, lacksRecordedTableArn as do, collectPublishedOutputNames as dr, refuseMalformedResourceEntriesForImportSave as ds, conditionFingerprint as dt, parseBootstrapMarker as du, customResourceResponseExpirationWarning as ea, replayWarn as ec, findLargeInlineResources as ed, noEchoParameterNamesOf as ei, dynamicReferenceTokens as el, withApiLimit as en, isUnboundTemplateParameter as eo, displayTextOrWithheld as er, refuseMalformedOrphanRecordsForDestroy as es, crossStackOutputProvenanceSource as et, WorkGraph as eu, declaredStreamTagsMember as f, markWaitAbandoned as fa, canonicalLambdaFunctionName as fc, parseFailureDebugDetail as fd, storedSecretNameNeedles as fi, carriesSecretMask as fl, replayFailedOperations as fn, refStateLookupFromResource as fo, isExportAliasCollision as fr, refuseMalformedResourceEntriesForOrphan as fs, conditionInputsFrom as ft, readBootstrapMarkerBody as fu, streamDeclaresTags as g, observeThenDisableInstanceApiTermination as ga, TemplateParser as gc, hasPlainPrototype$1 as gd, ccRoutedFinalSnapshotError as gi, recordNoEchoAttributeValues as gl, settleUnsettledPrevious as gn, passedParameterClassesOf as go, maskingRetryLogger as gr, refuseMalformedResourcePropertiesForOrphan as gs, enclosingDeadlineRemainingMs as gt, buildDockerImage as gu, streamDeclaresPolicy as h, isTerminationProtectionPropagationError as ha, DagBuilder as hc, hasOwnKey as hd, buildFinalSnapshotIdentifier as hi, recordMaskOnlyValuesIn as hl, recordAfterRollbackUpdate as hn, parameterInputsFor as ho, DEFAULT_RESOURCE_WARN_AFTER_MS as hr, refuseMalformedResourcePropertiesForExport as hs, enclosingDeadlineExpired as ht, buildDenyExternalAccessPolicy as hu, PROTECTION_PROPERTY_BY_TYPE as i, unchangedBehindSecretReference as ia, prefetchCreateOnlyPropertyPaths as ic, expectedOwnerParam as id, maskEventTextWithBoundBags as ii, identityKeyFor as il, refactorMarkerRefusalMessage as in, carriesDynamicReference as io, secretSafeKeyDisplay as ir, refuseMalformedOutputs as is, serviceTokenBlockingReason as it, rewriteTemplateAssetReferences as iu, compensateRemovedDeletionProtection as j, s3BucketWebsiteUrl as ja, liveMatchesUnresolvedTokenFrame as jc, markDeleteStarted as ji, isNotImplemented as jl, seedsDeleteFirstGuard as jn, malformedDriftResourcePropertiesWarning as jo, destroyStackRecordsView as jr, findActionableSilentDrops as js, displacedPhysicalIdShown as jt, runDockerForeground as ju, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as k, s3BucketDualStackDomainName as ka, recordedNoEchoValuesOf as kc, extractDeploymentEventError as ki, crossPrefixDeniedWarning as kl, replacementNeverSwapped as kn, isReadableOrphanRecord as ko, proposeRenames as kr, unreadableResourceEntries as ks, NESTED_PENDING_PARENT_REASON as kt, redactedCause as ku, STREAM_POLICY_KEY as l, deleteSkipReason as la, dbInstanceEngineChangeIsInPlace as lc, StageLoadError as ld, secretNamedAttributeNamesOf as li, recordAttributeIdCopy as ll, pendingMovesOutOf as ln, cfnRefValueFromPhysicalId as lo, noEchoParameterValueSeed as lr, refuseMalformedResourceEntriesForDestroy as ls, renderNestedTemplateTreeDefect as lt, getBootstrapMarkerKey as lu, reverseMapStreamPolicy as m, ec2InstanceProtectionSite as ma, sameLambdaFunctionAddress as mc, defineOwnKey as md, PRE_DELETE_SNAPSHOT_TYPES as mi, recordMaskOnlyValue as ml, removeProtectionTypeList as mn, withSharedDrainBudget as mo, DEFAULT_RESOURCE_TIMEOUT_MS as mr, refuseMalformedResourcePropertiesForDrift as ms, readRecordedConditionVerdicts as mt, validateContainerRepoName as mu, recordedProtectionEvidence as n, slowCcOperationTimeoutMs as na, requireConfigObject as nc, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as nd, completedReplayEntries as ni, pathCrossesDottedKey as nl, readRefactorMarkerOnce as nn, getAccountInfo as no, secretBearing as nr, refuseMalformedOrphansForDestroy as ns, deferredServiceTokenWarning as nt, createAssetRedirectResolver as nu, perType as o, UNSPECIFIED_SKIP_REASON as oa, describeTypeWithThrottleRetry as oc, canonicalizeRegion as od, orphanRecordsPrintingBag as oi, recordNestedStackParameterExpressions as ol, sameMove as on, isNamelessDynamicReferenceError as oo, exportNameNoEchoParameters as or, refuseMalformedResourceAttributesForOrphan as os, findNestedTemplateTreeDefect as ot, BOOTSTRAP_MARKER_PREFIX as ou, planStreamMemberOps as p, disableInstanceApiTermination as pa, lambdaFunctionNameForMask as pc, utf8ByteLength as pd, ATOMIC_FINAL_SNAPSHOT_TYPES as pi, provenPublicValue as pl, replayRollback as pn, parseWebACLArn as po, bindingSkippedOutputs as pr, refuseMalformedResourcePropertiesForDestroy as ps, parentSuppliedValues as pt, validateAssetBucketName as pu, S3_AUTO_DELETE_OBJECTS_TAG as q, callerEnvCredentials as qa, errorCauseChain as qc, TemplateNoEchoReresolver as qi, stackInstanceIdCarriedFrom as ql, retiredNameGenerationsLeaving as qn, malformedResourcesWarning as qo, supersededHeldByOtherTypeWarning as qr, toFiniteNumber as qs, loadJournaledOrphans as qt, resolveUseCdkBootstrapAssets as qu, recordedProtectionNote as r, onlySecretReferencesDiffer as ra, requireConfigString as rc, decodeListingKey as rd, journaledOrphanPrintingBag as ri, spelledKeysOf as rl, refactorMarkerMovesOf as rn, isImpossibleEmptyStoredAttribute as ro, secretBearingStateKeyWarning as rr, refuseMalformedOrphansForOrphan as rs, findServiceTokenRefusals as rt, loadPublishableAssetManifest as ru, readProtection as s, deleteIndeterminateGuards as sa, withRetry as sc, derivePartitionAndUrlSuffix as sd, secretNamePrintingBag as si, recoverMaskedOutput as sl, updateRefactorMarker as sn, keepsSecretReferenceToken as so, exportNameSecretExposure as sr, refuseMalformedResourceEntries as ss, isAbsoluteAssetPath as st, assertAssetBucketRegion as su, DeployEngine as t, CloudControlProvider as ta, requireConfigArray as tc, uploadCfnTemplate as td, createReadOnlyAttributeHealerFactory as ti, isUncertifiedBaselineMaskPosition as tl, readRefactorMarker as tn, parameterTypeMayLoseSecretIdentity as to, exportAliasCollisionScrubWarning as tr, refuseMalformedOrphans as ts, inheritedProvenanceForChildDiff as tt, buildAssetRedirectMap as tu, STREAM_TAGS_KEY as u, withIndeterminateGuard as ua, ecsServiceLaunchTypeSetOrChanged as uc, processStackMessages as ud, secretNamedRecordNeedles as ui, recordPhysicalNameCopy as ul, pendingMovesRefusalMessage as un, isStalePlaceholderArnAttribute as uo, collectDeclaredOutputNames as ur, refuseMalformedResourceEntriesForImport as us, templateIdentity as ut, isCrossRegionRedirect as uu, streamPolicyMatchesDeclared as v, reEnableInstanceApiTermination as va, isMarkedCoordinate as vc, ownValue as vd, effectiveDeletionPolicy as vi, recordProvenPublicExpression as vl, calculateResourceDrift as vn, JSON_LISTING_HOLE_VALUE as vo, findDestructiveChanges as vr, refuseMalformedResourcesForDestroy as vs, diffSecurity as vt, describeDockerCapturedOutput as vu, planIndexContributorInsightsOps as w, IntrinsicFunctionResolver as wa, noEchoLeavesOf as wc, injectAwsRegion as wd, reserveStackCreateToken as wi, S3StateBackend as wl, isReplacementOrphan as wn, deployRefusesOrphanRowsReason as wo, withMovedTo as wr, repairMalformedResourceEntriesForReadOnly as ws, planOrphanAdoption as wt, getDockerCmd as wu, contributorInsightsRefusals as x, unsettledPropertiesOf as xa, maskWholeValue as xc, displayAssemblyPath as xd, unsupportedFinalSnapshotError as xi, isSingleDynamicReferenceToken as xl, undeclaredEmptyObservedKeys as xn, UNREADABLE_ORPHANS_CONTAINER_ROW as xo, hintSidesOf as xr, repairMalformedOrphanRecordsForReadOnly as xs, mergeNoChangeOutputs as xt, dockerSpawnEnvWithSensitive as xu, streamTagsMatchDeclared as y, DiffCalculator as ya, maskAtCoordinates as yc, absoluteAssemblyPathEscape as yd, isFinalSnapshotError as yi, wholeStringLeavesOf as yl, equalModuloMarkedMask as yn, STATE_REGION_DIVERGED as yo, formatDestructiveChange as yr, refuseMalformedResourcesForExport as ys, isSecretBearingReferenceString as yt, describeDockerExecFailure as yu, relayedIndexBusyDelete as z, applyRoleArnIfSet as za, literalSplitDelimitersOf as zc, definedAttributes as zi, hasReasonlessBaselineRefusal as zl, redactedDeleteAddressSkip as zn, malformedOrphanRowsKeptWarning as zo, red as zr, MULTI_REGION_RECREATE_BLOCKED_TYPES as zs, collectNestedChildUnaddressed as zt, getLegacyStateBucketName as zu };
54773
- //# sourceMappingURL=deploy-engine-DZO2SOQJ.js.map
55501
+ export { getPriorAttempts as $, applyCallerIdentityCredentials as $a, unionOfSecretBags as $c, isCustomResourceType as $i, orphansCarriedFrom as $l, namesAnyDeclaredParameter as $n, malformedResourcePropertiesWarning as $o, withoutSuperseded as $r, isWarmThroughputDecrease as $s, formatResourceLine as $t, resolveStateBucketWithDefault as $u, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as A, withoutUnsettledProperties as Aa, maskedLeafCoordinatesOf as Ac, renderAssemblyPathEscape as Ad, acquireIdempotencyToken as Ai, LockManager as Al, recheckFailedPlan as An, accountArgs as Ao, mappingPairs as Ar, repairMalformedOutputsForReadOnly as As, keptForRetainedRecord as At, finchSecretArgvRefusal as Au, deleteTableWithIndexBusyRetry as B, producerLookupOver as Ba, markSameGenerationBag as Bc, refuseMalformedDesiredTags as Bi, stackInstanceIdOf as Bl, isRedactedRecordedValue as Bn, malformedExportSourceWarning as Bo, gray as Br, findSilentDropProperties as Bs, revertedNestedRowIds as Bt, runDockerStreaming as Bu, planContributorInsightsOp as C, DiffCalculator as Ca, DagBuilder as Cc, hasOwnKey as Cd, isFinalSnapshotError as Ci, recordMaskOnlyValuesIn as Cl, equalModuloMask as Cn, passedParameterClassesOf as Co, findRefactorHints as Cr, refuseMalformedResourcePropertiesForOrphan as Cs, keptWholeReasonText as Ct, buildDenyExternalAccessPolicy as Cu, reverseMapTableContributorInsights as D, unsettledItemsOf as Da, maskAtCoordinates as Dc, absoluteAssemblyPathEscape as Dd, ledgerForStack as Di, wholeStringLeavesOf as Dl, isReplacementOrphan as Dn, STATE_RESOURCES_MALFORMED as Do, withMovedTo as Dr, refuseMalformedState as Ds, planOrphanAdoption as Dt, describeDockerExecFailure as Du, reverseMapIndexContributorInsights as E, unsettledItemsField as Ea, isMarkedCoordinate as Ec, ownValue as Ed, earliestDefined as Ei, recordProvenPublicExpression as El, isJournaledOrphan as En, STATE_REGION_DIVERGED as Eo, rollbackOrphanIds as Er, refuseMalformedResourcesForExport as Es, makeSiblingClaimReader as Et, describeDockerCapturedOutput as Eu, resolveDynamoDbDeleteBudgetClock as F, s3BucketDomainName as Fa, readbackPathFor as Fc, resolveBucketRegion as Fd, markDeleteStarted as Fi, CrossPrefixScanCache as Fl, orphanNeedsIdentity as Fn, hasReadableResources as Fo, getStackRecords as Fr, unreadableOrphanRecords as Fs, dropSettledNestedJournals as Ft, partitionSensitiveEnv as Fu, isTtlRateLimited as G, recordedReferenceRegions as Ga, createUnionSecretMasker as Gc, CC_BROKEN_REASON as Gi, exportNamesCarriedFrom as Gl, nameGenerationCarriedFrom as Gn, malformedOrphanRecordsWarning as Go, deleteSupersededEntry as Gr, findReplacedReadersOfRecreateTargets as Gs, deleteJournaledOrphans as Gt, synthesisStatusMessage as Gu, relayedIndexBusyDelete as H, keepHeldTokenProvenance as Ha, recordReferenceProvenanceEntry as Hc, tagPlanWarning as Hi, splitImportedOps as Hl, redactedDeleteAddressSkip as Hn, malformedLocalResourceEntriesWarning as Ho, red as Hr, withoutSilentDropProperties as Hs, collectNestedChildUnaddressed as Ht, AssetManifestLoader as Hu, resolveDynamoDbDeleteBudgetMs as I, s3BucketDualStackDomainName as Ia, readsNoEchoSource as Ic, DBPROXY_TAGS_WHAT as Ii, applyCrossPrefixScan as Il, findNestedStackTypeChanges as In, isReadableOrphanRecord as Io, withStackRecords as Ir, unreadableResourceEntries as Is, getNestedRevertRun as It, redactDockerArgvValues as Iu, sendTtlWaitingOutRateLimit as J, assertSendableRoleArn as Ja, logOnlyValueCount as Jc, isCustomResource as Ji, hasUnverifiableParameterRefusal as Jl, retiredAfterRollback as Jn, malformedOrphansWarning as Jo, removeSuperseded as Jr, isStatefulRecreateTargetForReplace as Js, isHandledOrphan as Jt, loadCdkJson as Ju, planTimeToLive as K, applyRoleArnIfSet as Ka, hasMaskableValues as Kc, ProviderRegistry as Ki, hasReadableExportSet as Kl, nameGenerationHighWaterOf as Kn, malformedOrphanRowsKeptWarning as Ko, holdsSupersededResources as Kr, shownType as Ks, dropFailedCommands as Kt, getDefaultStateBucketName as Ku, DELETE_INDEX_WAIT_PROCEED_NOTE as L, s3BucketRegionalDomainName as La, recordedNoEchoValuesOf as Lc, DBPROXY_TAG_OPTIONS as Li, crossPrefixDeniedWarning as Ll, getCurrentProducerRegions as Ln, isReadableResourceEntry as Lo, replacedDeleteFailureVerdict as Lr, withheldAccountClause as Ls, nestedChildStackName as Lt, redactedCause as Lu, beginDeleteWait as M, poisonRenderedSpellingsCollidingIn as Ma, noEchoLeavesOf as Mc, injectAwsRegion as Md, DeploymentEventsStore as Mi, S3StateBackend as Ml, replacementNeverSwapped as Mn, displayLogicalId as Mo, proposeRenames as Mr, repairMalformedResourcePropertiesForReadOnly as Ms, NESTED_PENDING_PARENT_REASON as Mt, getDockerCmd as Mu, compensateRemovedDeletionProtection as N, isSettledInstanceState as Na, noEchoOutputsComparison as Nc, injectedAwsRegionValue as Nd, extractDeploymentEventError as Ni, rebuildClientForBucketRegion as Nl, resolveReplacementOldType as Nn, hasReadableOrphans as No, awaitInFlightSibling as Nr, repairMalformedResourcesForReadOnly as Ns, displacedOpClause as Nt, isDockerClientEnvKey as Nu, stripIndexContributorInsights as O, unsettledPropertiesOf as Oa, maskReadbackAtCoordinates as Oc, describeFileReadFailure as Od, reserveStackCreateToken as Oi, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ol, planFailedOps as On, UNREADABLE_ORPHANS_CONTAINER_ROW as Oo, isPairableType as Or, repairMalformedOrphanRecordsForReadOnly as Os, pendingRequestCount as Ot, describeDockerFailure as Ou, deleteBudgetKey as P, s3BucketArn as Pa, passedNoEchoParametersOf as Pc, clearBucketRegionCache as Pd, isRefusedByName as Pi, CrossPrefixReadError as Pl, seedsDeleteFirstGuard as Pn, hasReadableOutputs as Po, destroyStackRecordsView as Pr, unpreviewableOrphanRecords as Ps, displacedPhysicalIdShown as Pt, isMalformedEnvKey as Pu, isTruthyCfnBoolean as Q, AWS_CREDENTIAL_ENV_KEYS as Qa, shareLogOnlyValues as Qc, readsNoEchoDeleteValues as Qi, orphansAfterRollback as Ql, computeParameterTaint as Qn, malformedResourceEntriesWarning as Qo, supersededResourcesOf as Qr, coerceWarmThroughput as Qs, sameJournaledOrphans as Qt, resolveSkipPrefix as Qu, INDEX_SETTLE_POLL_INTERVAL_MS as R, s3BucketWebsiteUrl as Ra, valueAtCoordinate as Rc, planTagDiff as Ri, isAccessDenied$1 as Rl, inheritProducerRegions as Rn, malformedDriftResourcePropertiesWarning as Ro, bold as Rr, findActionableSilentDrops as Rs, recordDisplacedSkips as Rt, redactedDockerCause as Ru, indexDeclaresContributorInsights as S, reEnableInstanceApiTermination as Sa, sameLambdaFunctionAddress as Sc, defineOwnKey as Sd, effectiveDeletionPolicy as Si, recordMaskOnlyValue as Sl, equalModuloMarkedMask as Sn, parameterInputsFor as So, formatDestructiveChange as Sr, refuseMalformedResourcePropertiesForExport as Ss, isSecretBearingReferenceString as St, validateContainerRepoName as Su, readContributorInsightsSpec as T, isUsableAttemptedName as Ta, canonicalCoordinates as Tc, nullPrototypeRecord as Td, unsupportedFinalSnapshotError as Ti, recordNoEchoParameterFreshValue as Tl, demoteSupersededOrphans as Tn, JSON_LISTING_HOLE_VALUE as To, movedToHint as Tr, refuseMalformedResourcesForDestroy as Ts, makeCanonicalizePropertiesFn as Tt, resolveDockerContextDirectory as Tu, waitForIndexesSettled as U, outputReferenceProvenanceOf as Ua, snapshotPassProvenance as Uc, definedAttributes as Ui, acceptedCreateOnlyDropsOf as Ul, updatePartialMessage as Un, malformedLocalResourcesWarning as Uo, yellow as Ur, NO_CC_HANDLERS_REASON as Us, getCurrentNestedStackContext as Ut, getDockerImageBySourceHash as Uu, maskedLogger as V, refuseUnreadableCdkCrossAccountRefs as Va, redactForState as Vc, tagMapAsList as Vi, withStackInstanceIdWithheld as Vl, redactedDeleteAddressFields as Vn, malformedLocalOutputsWarning as Vo, green as Vr, unwrittenCreateOnlyReplacement as Vs, withNestedRevertRun as Vt, warnFinchArgvExposure as Vu, isTtlAlreadyDisabled as W, recordedOutputReferenceRegions as Wa, carryLogOnlyValues as Wc, stringifyIfAssigned as Wi, describeRegionValueKind as Wl, updatePartialReason as Wn, malformedOrphanRecordsRefusalMessage as Wo, addSuperseded as Wr, hasNoCloudControlHandlers as Ws, withNestedStackContext as Wt, Synthesizer as Wu, S3_AUTO_DELETE_OBJECTS_TAG as X, isIamRoleArn as Xa, recordLogOnlyParameterValue as Xc, waitForLambdaFunctionActive as Xi, importableOutputs as Xl, retiredNameGenerationsLeaving as Xn, malformedOutputsWarning as Xo, supersededHeldByOtherTypeWarning as Xr, renderStatefulReason as Xs, loadJournaledOrphans as Xt, resolveAutoAssetStorage as Xu, ECR_AUTO_DELETE_IMAGES_TAG as Y, explicitRoleArnOrThrow as Ya, printingCorpusOf as Yc, wouldReturnToSdkProvider as Yi, importableOutputKeys as Yl, retiredNameGenerationsAfter as Yn, malformedOutputsRefusalMessage as Yo, supersededAfterRollback as Yr, isStatefulRecreateTargetSync as Ys, journaledOrphanLines as Yt, resolveApp as Yu, hasCdkAutoDeleteTag as Z, sendableAssumeRoleCommand as Za, recordLogOnlyValue as Zc, TemplateNoEchoReresolver as Zi, isReadableBag as Zl, withNameGenerationReached as Zn, malformedRenderedContainersWarning as Zo, supersededHolderOf as Zr, WARM_THROUGHPUT_MEMBERS as Zs, makeForeignHolderScan as Zt, resolveCaptureObservedState as Zu, streamMemberRefusals as _, disableInstanceApiTermination as _a, dbInstanceEngineChangeIsInPlace as _c, StageLoadError as _d, ATOMIC_FINAL_SNAPSHOT_TYPES as _i, recordAttributeIdCopy as _l, removeProtectionTypeList as _n, isStalePlaceholderArnAttribute as _o, DEFAULT_RESOURCE_TIMEOUT_MS as _r, refuseMalformedResourceEntriesForImport as _s, readRecordedConditionVerdicts as _t, getBootstrapMarkerKey as _u, isProtectionValueActive as a, CloudControlProvider as aa, configIntegerRefusal as ac, CFN_TEMPLATE_BODY_LIMIT as ad, createReadOnlyAttributeHealerFactory as ai, withPhysicalNameCopies as al, readRefactorMarkerOnce as an, regionLessSecretName as ao, secretBearing as ar, refuseMalformedNestedChildOutputs as as, deferredServiceTokenWarning as at, AssetPublisher as au, CONTRIBUTOR_INSIGHTS_KEY as b, observeThenDisableInstanceApiTermination as ba, canonicalLambdaFunctionName as bc, parseFailureDebugDetail as bd, ccRoutedFinalSnapshotError as bi, carriesSecretMask as bl, withUnprovenUnsettled as bn, parseWebACLArn as bo, constructPathOf as br, refuseMalformedResourcePropertiesForDestroy as bs, withResourceDeadline as bt, readBootstrapMarkerBody as bu, DynamoDBGlobalTableProvider as c, unchangedBehindSecretReference as ca, replayWarn as cc, findLargeInlineResources as cd, maskEventTextWithBoundBags as ci, dynamicReferenceTokens as cl, refuseRefactorMarker as cn, parameterTypeMayLoseSecretIdentity as co, carriedExportAliasExposure as cr, refuseMalformedOrphans as cs, childTemplateLoader as ct, WorkGraph as cu, declaredStreamPolicyMember as d, deleteIndeterminateGuards as da, requireConfigString as dc, decodeListingKey as dd, secretNamePrintingBag as di, spelledKeysOf as dl, hasPendingMovesOut as dn, carriesDynamicReference as do, isWholeDynamicReferenceValue as dr, refuseMalformedOutputs as ds, listNestedTemplateRows as dt, loadPublishableAssetManifest as du, getCurrentResourceSecrets as ea, toCfnInteger as ec, resolveStateBucketWithDefaultAndSource as ed, noEchoAttributeNamesOf as ei, createSecretMasker as el, chunks as en, callerEnvCredentials as eo, reachableDivergentParameters as er, malformedResourcesWarning as es, markRefusedBeforeApplying as et, shouldRetainResource as eu, declaredStreamTagsMember as f, deleteLeftInPlace as fa, prefetchCreateOnlyPropertyPaths as fc, expectedOwnerParam as fd, secretNamePrintingBags as fi, identityKeyFor as fl, pendingMovesOutOf as fn, carriesFetchableDynamicReference as fo, noEchoParameterValueSeed as fr, refuseMalformedOutputsForDestroy as fs, renderNestedTemplateTreeDefect as ft, rewriteTemplateAssetReferences as fu, streamDeclaresTags as g, markWaitAbandoned as ga, blockDeviceMappingsDifferOnlyInDeleteOnTermination as gc, AssemblyReader as gd, storedSecretNameNeedles as gi, physicalNameCopiesOf as gl, replayRollback as gn, cfnRefValueFromPhysicalId as go, bindingSkippedOutputs as gr, refuseMalformedResourceEntriesForDestroy as gs, parentSuppliedValues as gt, ensureAssetStorage as gu, streamDeclaresPolicy as h, isWaitAbandonedError as ha, withRetry as hc, derivePartitionAndUrlSuffix as hd, stateSecretNameNeedles as hi, recoverMaskedOutput as hl, replayFailedOperations as hn, AWS_NO_VALUE as ho, isExportAliasCollision as hr, refuseMalformedResourceEntriesForDeploy as hs, conditionInputsFrom as ht, assertAssetBucketRegion as hu, PROTECTION_PROPERTY_BY_TYPE as i, customResourceResponseExpirationWarning as ia, configBooleanRefusal as ic, ssmResolvedValueType as id, withAttemptedItemsMasked as ii, scrubResourceRecord as il, readRefactorMarker as in, producerRegionsFromState as io, exportAliasCollisionScrubWarning as ir, refuseDivergentRecordRegionForDestroy as is, inheritedProvenanceForChildDiff as it, timePhase as iu, DYNAMODB_DELETE_POLL_COST_MS as j, IntrinsicFunctionResolver as ja, noEchoCoordinatesOf as jc, resolveAssemblyPath as jd, DeploymentEventsReader as ji, isLockInfoExpired as jl, recordUnderIdIsNotOwn as jn, deployRefusesOrphanRowsReason as jo, parseMappingFile as jr, repairMalformedResourceEntriesForReadOnly as js, recordRetainedForReadoption as jt, formatDockerLoginError as ju, DYNAMODB_DELETE_DEADLINE_MARGIN_MS as k, withUnsettledProperties as ka, maskWholeValue as kc, displayAssemblyPath as kd, withCreateTokenLedger as ki, isSingleDynamicReferenceToken as kl, planRollback as kn, UNREADABLE_RESOURCES_MAP_ROW as ko, looselyEqual as kr, repairMalformedOrphansForReadOnly as ks, resolvePendingCloudControlRequests as kt, dockerSpawnEnvWithSensitive as ku, STREAM_POLICY_KEY as l, RollbackInlinePolicyWriters as la, requireConfigArray as lc, uploadCfnTemplate as ld, namingSecretsWithRecordedNoEcho as li, isUncertifiedBaselineMaskPosition as ll, sameMove as ln, getAccountInfo as lo, exportNameNoEchoParameters as lr, refuseMalformedOrphansForDestroy as ls, findNestedTemplateTreeDefect as lt, buildAssetRedirectMap as lu, reverseMapStreamPolicy as m, withIndeterminateGuard as ma, describeTypeWithThrottleRetry as mc, canonicalizeRegion as md, secretNamedRecordNeedles as mi, recordNestedStackParameterExpressions as ml, refusePendingMovesOut as mn, keepsSecretReferenceToken as mo, collectPublishedOutputNames as mr, refuseMalformedResourceEntries as ms, conditionFingerprint as mt, BOOTSTRAP_MARKER_PREFIX as mu, recordedProtectionEvidence as n, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as na, coerceCfnBoolean as nc, stateBucketExistenceConfirmed as nd, noEchoExactEchoLeavesOf as ni, maskSecretsInError as nl, lookupEachName as nn, classifyRecordedSecretRegion as no, WITHHELD_NAME_DISPLAY as nr, malformedStateRefusalMessage as ns, computeImplicitDeleteEdges as nt, PhaseClock as nu, perType as o, slowCcOperationTimeoutMs as oa, configStringRefusal as oc, CFN_TEMPLATE_URL_LIMIT as od, completedReplayEntries as oi, withoutPhysicalNameCopies as ol, refactorMarkerMovesOf as on, coerceParameterTypedValue as oo, secretBearingStateKeyWarning as or, refuseMalformedOrphanRecords as os, findServiceTokenRefusals as ot, isSensitiveAttributeName as ou, planStreamMemberOps as p, deleteSkipReason as pa, templateResourceTypes as pc, PARTITION_TABLE as pd, secretNamedAttributeNamesOf as pi, inheritNestedStackParameterAssociations as pl, pendingMovesRefusalMessage as pn, isNamelessDynamicReferenceError as po, collectDeclaredOutputNames as pr, refuseMalformedResourceAttributesForOrphan as ps, templateIdentity as pt, AssetModeResolver as pu, readTtlSpec as q, assertFlagRoleArn as qa, literalSplitDelimitersOf as qc, ccBrokenReason as qi, hasReasonlessBaselineRefusal as ql, nameScopeOf as qn, malformedOrphansRefusalMessage as qo, isSupersededResourceRecord as qr, MULTI_REGION_RECREATE_BLOCKED_TYPES as qs, dropFailedHint as qt, getLegacyStateBucketName as qu, recordedProtectionNote as r, applyCustomResourceResponseExpiration as ra, coerceCfnInteger as rc, warnDeprecatedNoPrefixCliFlag as rd, noEchoParameterNamesOf as ri, maskSecretsInText as rl, withApiLimit as rn, classifyReplaySecretRegion as ro, displayTextOrWithheld as rr, previewableOrphanRecords as rs, crossStackOutputProvenanceSource as rt, renderPhaseTimings as ru, readProtection as s, onlySecretReferencesDiffer as sa, readConfigString as sc, MIGRATE_TMP_PREFIX as sd, journaledOrphanPrintingBag as si, DYNAMIC_REFERENCE_TOKEN_SCAN as sl, refactorMarkerRefusalMessage as sn, isUnboundTemplateParameter as so, secretSafeKeyDisplay as sr, refuseMalformedOrphanRecordsForDestroy as ss, serviceTokenBlockingReason as st, stringifyValue as su, DeployEngine as t, withPrintingSecrets as ta, toFiniteNumber as tc, resolveUseCdkBootstrapAssets as td, noEchoComparisonForTemplate as ti, errorCauseChain as tl, isAccessDeniedError as tn, envCredentialsAreAssumedRole as to, resourcesNamingDeclaredParameter as tr, malformedScrubResourceEntriesRefusalMessage as ts, IMPLICIT_DELETE_DEPENDENCIES as tt, stackInstanceIdCarriedFrom as tu, STREAM_TAGS_KEY as u, UNSPECIFIED_SKIP_REASON as ua, requireConfigObject as uc, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ud, orphanRecordsPrintingBag as ui, pathCrossesDottedKey as ul, updateRefactorMarker as un, isImpossibleEmptyStoredAttribute as uo, exportNameSecretExposure as ur, refuseMalformedOrphansForOrphan as us, isAbsoluteAssetPath as ut, createAssetRedirectResolver as uu, streamPolicyMatchesDeclared as v, ec2InstanceProtectionSite as va, ecsServiceLaunchTypeSetOrChanged as vc, processStackMessages as vd, PRE_DELETE_SNAPSHOT_TYPES as vi, recordPhysicalNameCopy as vl, recordAfterRollbackUpdate as vn, lacksRecordedTableArn as vo, DEFAULT_RESOURCE_WARN_AFTER_MS as vr, refuseMalformedResourceEntriesForImportSave as vs, enclosingDeadlineExpired as vt, isCrossRegionRedirect as vu, planIndexContributorInsightsOps as w, INTRINSIC_KEYS as wa, TemplateParser as wc, hasPlainPrototype$1 as wd, refusesFinalSnapshot as wi, recordNoEchoAttributeValues as wl, undeclaredEmptyObservedKeys as wn, declaresNoEcho as wo, hintSidesOf as wr, refuseMalformedResourcesForDeploy as ws, mergeNoChangeOutputs as wt, buildDockerImage as wu, contributorInsightsRefusals as x, reDisableInstanceApiTermination as xa, lambdaFunctionNameForMask as xc, utf8ByteLength as xd, createPreDeleteFinalSnapshot as xi, provenPublicValue as xl, calculateResourceDrift as xn, withSharedDrainBudget as xo, findDestructiveChanges as xr, refuseMalformedResourcePropertiesForDrift as xs, diffSecurity as xt, validateAssetBucketName as xu, streamTagsMatchDeclared as y, isTerminationProtectionPropagationError as ya, emrClusterInstancesReplaced as yc, describeJsonParseFailure as yd, buildFinalSnapshotIdentifier as yi, splitGetAttStringForm as yl, settleUnsettledPrevious as yn, refStateLookupFromResource as yo, maskingRetryLogger as yr, refuseMalformedResourceEntriesForOrphan as ys, enclosingDeadlineRemainingMs as yt, parseBootstrapMarker as yu, TABLE_INDEX_NOUN as z, resolveDynamicReferences as za, liveMatchesUnresolvedTokenFrame as zc, readTagList as zi, isNotImplemented as zl, REDACTED_DELETE_ADDRESS_SKIP_REASON as zn, malformedExportNamesWarning as zo, cyan as zr, findHandledUnwrittenCreateOnly as zs, revertNestedChildFromJournal as zt, runDockerForeground as zu };
55502
+ //# sourceMappingURL=deploy-engine-CVNzK__j.js.map