@go-to-k/cdkd 0.305.0 → 0.307.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 (35) hide show
  1. package/dist/{asg-provider-C8HDzpYh.js → asg-provider-oKlrkJeO.js} +4 -4
  2. package/dist/{asg-provider-C8HDzpYh.js.map → asg-provider-oKlrkJeO.js.map} +1 -1
  3. package/dist/{aws-clients-WQOzP1x4.js → aws-clients-Bu9EMILF.js} +87 -3
  4. package/dist/aws-clients-Bu9EMILF.js.map +1 -0
  5. package/dist/{aws-failure-text-Durl920o.js → aws-failure-text-NSBdKPYK.js} +7 -1
  6. package/dist/aws-failure-text-NSBdKPYK.js.map +1 -0
  7. package/dist/cli.js +2 -2
  8. package/dist/{db-instance-modify-retry-DfY7rzvu.js → db-instance-modify-retry-DOJPkECL.js} +3 -3
  9. package/dist/{db-instance-modify-retry-DfY7rzvu.js.map → db-instance-modify-retry-DOJPkECL.js.map} +1 -1
  10. package/dist/{deploy-engine-BdqMXegu.js → deploy-engine-BOgsnnk0.js} +857 -83
  11. package/dist/deploy-engine-BOgsnnk0.js.map +1 -0
  12. package/dist/{iam-policy-targets-OyoL9Woo.js → iam-policy-targets-TFGunWmV.js} +56 -56
  13. package/dist/{iam-policy-targets-OyoL9Woo.js.map → iam-policy-targets-TFGunWmV.js.map} +1 -1
  14. package/dist/{iam-role-provider-mYhK_-VN.js → iam-role-provider-DfDYgfqK.js} +5 -5
  15. package/dist/{iam-role-provider-mYhK_-VN.js.map → iam-role-provider-DfDYgfqK.js.map} +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -5
  19. package/dist/{neptune-provider-DvFVCaYo.js → neptune-provider-DvuvSkfJ.js} +5 -5
  20. package/dist/{neptune-provider-DvFVCaYo.js.map → neptune-provider-DvuvSkfJ.js.map} +1 -1
  21. package/dist/{program-CUklr39z.js → program-DU5UlgkO.js} +44 -16
  22. package/dist/program-DU5UlgkO.js.map +1 -0
  23. package/dist/{provider-classes-L1a3Wl0g.js → provider-classes-CPMW_2-R.js} +1069 -236
  24. package/dist/provider-classes-CPMW_2-R.js.map +1 -0
  25. package/dist/{rds-provider-CjasAFV5.js → rds-provider-DcBsBQLi.js} +40 -7
  26. package/dist/rds-provider-DcBsBQLi.js.map +1 -0
  27. package/dist/{version-Cp2r-ot9.js → version-Dhhyrf1v.js} +2 -2
  28. package/dist/{version-Cp2r-ot9.js.map → version-Dhhyrf1v.js.map} +1 -1
  29. package/package.json +2 -2
  30. package/dist/aws-clients-WQOzP1x4.js.map +0 -1
  31. package/dist/aws-failure-text-Durl920o.js.map +0 -1
  32. package/dist/deploy-engine-BdqMXegu.js.map +0 -1
  33. package/dist/program-CUklr39z.js.map +0 -1
  34. package/dist/provider-classes-L1a3Wl0g.js.map +0 -1
  35. package/dist/rds-provider-CjasAFV5.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { r as getAwsClients, s as __exportAll } from "./aws-clients-WQOzP1x4.js";
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-Durl920o.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, d as prepareRemovalForUpdate, dt as startInterruptWatch, er as hasReplayMayCollide, et as DELETION_PROTECTION_DOC_POINTER, f as removalWarning, fn as CrossAccountSecretRefusalError, fr as formatRetryClassificationSignals, ft as ElapsedBudgetRegistry, 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 monotonicNowMs, qn as quotedOrDescribed, qt as formatLockOwner, rn as withPasteableAwsProfile, rr as isRecreateRetryableError, sn as credentialFingerprint, sr as relayedNameCollision, tn as producerRecordKey, tr as isNameCollisionErrorFrom, un as CdkdError, ut as isInterruptedWaitError, 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-OyoL9Woo.js";
1
+ import { c as __exportAll, r as getAwsClients } from "./aws-clients-Bu9EMILF.js";
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-TFGunWmV.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-Cp2r-ot9.js";
5
+ import { t as getCdkdVersion } from "./version-Dhhyrf1v.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";
@@ -10,7 +10,7 @@ import { CloudControlClient, CreateResourceCommand, DeleteResourceCommand, GetRe
10
10
  import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
11
11
  import { GetFunctionCommand, GetFunctionConfigurationCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
12
12
  import { AssumeRoleCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
13
- import { CreateSnapshotCommand, DeleteVolumeCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstanceAttributeCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVolumesCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
13
+ import { CreateSnapshotCommand, DeleteVolumeCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstanceAttributeCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeNatGatewaysCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVolumesCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
14
14
  import { CreateTableCommand, DeleteTableCommand, DescribeContinuousBackupsCommand, DescribeContributorInsightsCommand, DescribeKinesisStreamingDestinationCommand, DescribeTableCommand, DescribeTimeToLiveCommand, DynamoDBClient, ListTagsOfResourceCommand, ResourceNotFoundException as ResourceNotFoundException$1, TagResourceCommand as TagResourceCommand$2, UntagResourceCommand as UntagResourceCommand$2, UpdateTableCommand, UpdateTimeToLiveCommand } from "@aws-sdk/client-dynamodb";
15
15
  import { CloudFormationClient, CreateChangeSetCommand, DeleteStackCommand, DescribeChangeSetCommand, DescribeStacksCommand, DescribeTypeCommand, GetTemplateCommand, ListExportsCommand, waitUntilChangeSetCreateComplete } from "@aws-sdk/client-cloudformation";
16
16
  import { GetRestApiCommand } from "@aws-sdk/client-api-gateway";
@@ -2360,7 +2360,7 @@ async function resolveStateBucketWithDefaultAndSource(cliBucket, region, legacyF
2360
2360
  logger.debug("No state bucket specified, resolving default from account...");
2361
2361
  const { GetCallerIdentityCommand } = await import("@aws-sdk/client-sts");
2362
2362
  const { S3Client, HeadBucketCommand, ListObjectsV2Command } = await import("@aws-sdk/client-s3");
2363
- const { getAwsClients } = await import("./aws-clients-WQOzP1x4.js").then((n) => n.n);
2363
+ const { getAwsClients } = await import("./aws-clients-Bu9EMILF.js").then((n) => n.n);
2364
2364
  const { expectedOwnerParam, recordResolvedAccountId } = await Promise.resolve().then(() => expected_bucket_owner_exports);
2365
2365
  const probeDeps = {
2366
2366
  HeadBucketCommand,
@@ -9430,10 +9430,13 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
9430
9430
  }
9431
9431
  if (isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(source)) {
9432
9432
  const out = Object.create(null);
9433
- for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactForState(v, {
9434
- provenance: "value-scan",
9435
- secrets
9436
- });
9433
+ for (const [k, v] of Object.entries(bag)) {
9434
+ out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactForState(v, {
9435
+ provenance: "value-scan",
9436
+ secrets
9437
+ });
9438
+ if (secrets.size > 0 && RENDERED_DEFINITION_KEYS.has(k) && definitionSourceCarriesSecret(source)) out[k] = nameDefinitionSecrets(out[k], source, secrets);
9439
+ }
9437
9440
  return out;
9438
9441
  }
9439
9442
  return redactForState(bag, {
@@ -9462,8 +9465,211 @@ function pathCrossesDottedKey(bag, path) {
9462
9465
  }
9463
9466
  return false;
9464
9467
  }
9468
+ const DEFINITION_SOURCE_KEYS = [
9469
+ "DefinitionSubstitutions",
9470
+ "DefinitionString",
9471
+ "Definition"
9472
+ ];
9473
+ const RENDERED_DEFINITION_KEYS = /* @__PURE__ */ new Set(["Definition", "DefinitionString"]);
9474
+ function definitionSourceCarriesSecret(source) {
9475
+ return DEFINITION_SOURCE_KEYS.some((k) => Object.hasOwn(source, k) && (subtreeHasDynamicReference(source[k]) || carriesSecretMask(source[k])));
9476
+ }
9477
+ function nameScalarSecrets(value, secrets) {
9478
+ const byValue = /* @__PURE__ */ new Set();
9479
+ for (const plaintext of secrets.keys()) try {
9480
+ const parsed = JSON.parse(plaintext);
9481
+ if (typeof parsed === "number" && Number.isFinite(parsed) || typeof parsed === "boolean") byValue.add(parsed);
9482
+ } catch {}
9483
+ if (byValue.size === 0) return value;
9484
+ const walk = (node) => {
9485
+ if (typeof node === "number" || typeof node === "boolean") {
9486
+ if (typeof node === "number" && !Number.isFinite(node)) return node;
9487
+ return secrets.has(String(node)) || byValue.has(node) ? "***" : node;
9488
+ }
9489
+ if (Array.isArray(node)) return node.map(walk);
9490
+ if (isPlainObject$7(node) && hasPlainPrototype(node)) {
9491
+ const out = Object.create(null);
9492
+ for (const [k, v] of Object.entries(node)) out[k] = walk(v);
9493
+ return out;
9494
+ }
9495
+ return node;
9496
+ };
9497
+ return walk(value);
9498
+ }
9499
+ const SENTINEL_IN_STRING = "";
9500
+ const SENTINEL_OUT_OF_STRING = "";
9501
+ function substitutionIsSecret(value) {
9502
+ return subtreeHasDynamicReference(value) || value.includes("***");
9503
+ }
9504
+ function sentinelDefinitionOf(source) {
9505
+ const subs = source["DefinitionSubstitutions"];
9506
+ const values = /* @__PURE__ */ new Map();
9507
+ if (isPlainObject$7(subs)) {
9508
+ for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") values.set(name, String(value));
9509
+ }
9510
+ for (const key of ["DefinitionString", "Definition"]) {
9511
+ if (!Object.hasOwn(source, key)) continue;
9512
+ const raw = source[key];
9513
+ const body = typeof raw === "string" ? raw : isPlainObject$7(raw) ? JSON.stringify(raw) : void 0;
9514
+ if (body === void 0) continue;
9515
+ if (body.includes(SENTINEL_IN_STRING) || body.includes(SENTINEL_OUT_OF_STRING) || /\\u[eE]00[01]/.test(body)) continue;
9516
+ const names = [];
9517
+ let text = "";
9518
+ let inString = false;
9519
+ let escaped = false;
9520
+ const feed = (c) => {
9521
+ text += c;
9522
+ if (inString) {
9523
+ if (escaped) escaped = false;
9524
+ else if (c === "\\") escaped = true;
9525
+ else if (c === "\"") inString = false;
9526
+ } else if (c === "\"") inString = true;
9527
+ };
9528
+ for (let i = 0; i < body.length; i++) {
9529
+ if (body.startsWith("${", i)) {
9530
+ const end = body.indexOf("}", i + 2);
9531
+ const name = end === -1 ? void 0 : body.slice(i + 2, end);
9532
+ const value = name === void 0 ? void 0 : values.get(name);
9533
+ if (name !== void 0 && value !== void 0) {
9534
+ if (substitutionIsSecret(value)) {
9535
+ const index = names.push(name) - 1;
9536
+ text += inString ? `${SENTINEL_IN_STRING}${index}${SENTINEL_IN_STRING}` : `"${SENTINEL_OUT_OF_STRING}${index}${SENTINEL_OUT_OF_STRING}"`;
9537
+ } else for (const c of value) feed(c);
9538
+ i = end;
9539
+ continue;
9540
+ }
9541
+ }
9542
+ feed(body[i]);
9543
+ }
9544
+ let parsed;
9545
+ try {
9546
+ parsed = JSON.parse(text);
9547
+ } catch {
9548
+ continue;
9549
+ }
9550
+ const keys = /* @__PURE__ */ new Set();
9551
+ const strings = /* @__PURE__ */ new Set();
9552
+ const scalars = /* @__PURE__ */ new Set();
9553
+ const secretLeaves = [];
9554
+ const marked = (t) => t.includes(SENTINEL_IN_STRING) || t.includes(SENTINEL_OUT_OF_STRING);
9555
+ const outOfString = new RegExp(`^${SENTINEL_OUT_OF_STRING}(\\d+)${SENTINEL_OUT_OF_STRING}$`);
9556
+ const inStringMarkers = new RegExp(`${SENTINEL_IN_STRING}(\\d+)${SENTINEL_IN_STRING}`, "g");
9557
+ const written = (t) => t.replace(inStringMarkers, (_m, i) => `\${${names[Number(i)]}}`);
9558
+ const walk = (node, path, shapes) => {
9559
+ if (typeof node === "string") {
9560
+ const m = outOfString.exec(node);
9561
+ if (m !== null) secretLeaves.push({
9562
+ path,
9563
+ shapes,
9564
+ outOfStringName: names[Number(m[1])],
9565
+ asWritten: void 0
9566
+ });
9567
+ else if (marked(node)) secretLeaves.push({
9568
+ path,
9569
+ shapes,
9570
+ outOfStringName: void 0,
9571
+ asWritten: written(node)
9572
+ });
9573
+ else strings.add(node);
9574
+ return;
9575
+ }
9576
+ if (typeof node === "number" || typeof node === "boolean") {
9577
+ scalars.add(node);
9578
+ return;
9579
+ }
9580
+ if (Array.isArray(node)) {
9581
+ node.forEach((item, i) => walk(item, [...path, i], [...shapes, node.length]));
9582
+ return;
9583
+ }
9584
+ if (isPlainObject$7(node)) {
9585
+ const own = new Set(Object.keys(node).map(written));
9586
+ for (const [k, v] of Object.entries(node)) {
9587
+ if (!marked(k)) keys.add(k);
9588
+ walk(v, [...path, written(k)], [...shapes, own]);
9589
+ }
9590
+ }
9591
+ };
9592
+ walk(parsed, [], []);
9593
+ try {
9594
+ collectObjectKeys(JSON.parse(body), keys);
9595
+ } catch {}
9596
+ return {
9597
+ keys,
9598
+ strings,
9599
+ scalars,
9600
+ secretLeaves
9601
+ };
9602
+ }
9603
+ }
9604
+ function alignedSecretLeaf(root, leaf) {
9605
+ let cursor = root;
9606
+ for (const [depth, segment] of leaf.path.entries()) {
9607
+ const shape = leaf.shapes[depth];
9608
+ if (typeof shape === "number") {
9609
+ if (!Array.isArray(cursor) || cursor.length !== shape) return void 0;
9610
+ cursor = cursor[segment];
9611
+ } else {
9612
+ if (!isPlainObject$7(cursor)) return void 0;
9613
+ const own = Object.keys(cursor);
9614
+ if (own.length !== shape.size || own.some((k) => !shape.has(k))) return void 0;
9615
+ if (!Object.hasOwn(cursor, segment)) return void 0;
9616
+ cursor = cursor[segment];
9617
+ }
9618
+ }
9619
+ return { value: cursor };
9620
+ }
9621
+ function collectObjectKeys(value, into) {
9622
+ if (Array.isArray(value)) for (const item of value) collectObjectKeys(item, into);
9623
+ else if (isPlainObject$7(value)) for (const [k, v] of Object.entries(value)) {
9624
+ into.add(k);
9625
+ collectObjectKeys(v, into);
9626
+ }
9627
+ }
9628
+ function spelledKeysOf(properties) {
9629
+ const keys = /* @__PURE__ */ new Set();
9630
+ collectObjectKeys(properties, keys);
9631
+ for (const key of sentinelDefinitionOf(properties)?.keys ?? []) keys.add(key);
9632
+ return keys;
9633
+ }
9634
+ function someKeyIsUnspelled(value, spelled) {
9635
+ if (Array.isArray(value)) return value.some((item) => someKeyIsUnspelled(item, spelled));
9636
+ if (isPlainObject$7(value)) return Object.entries(value).some(([k, v]) => !spelled(k) || someKeyIsUnspelled(v, spelled));
9637
+ return false;
9638
+ }
9639
+ function nameDefinitionSecrets(value, source, secrets) {
9640
+ if (value === null || typeof value !== "object") return value;
9641
+ const sentinel = sentinelDefinitionOf(source);
9642
+ if (sentinel === void 0) {
9643
+ const plaintexts = [...secrets.keys()].filter((p) => p !== "");
9644
+ const keyHoldsSecret = (key) => plaintexts.some((p) => key === p || p.length >= 4 && key.includes(p));
9645
+ if (someKeyIsUnspelled(value, (key) => !keyHoldsSecret(key))) return "***";
9646
+ return nameScalarSecrets(value, secrets);
9647
+ }
9648
+ if (someKeyIsUnspelled(value, (key) => sentinel.keys.has(key))) return "***";
9649
+ let out = value;
9650
+ for (const leaf of sentinel.secretLeaves) {
9651
+ if (alignedSecretLeaf(out, leaf) === void 0) return "***";
9652
+ if (leaf.outOfStringName !== void 0) out = replaceAtPath(out, leaf.path, "***");
9653
+ }
9654
+ return out;
9655
+ }
9656
+ function replaceAtPath(root, path, leaf) {
9657
+ if (path.length === 0) return leaf;
9658
+ const [head, ...rest] = path;
9659
+ if (Array.isArray(root)) {
9660
+ const copy = [...root];
9661
+ copy[head] = replaceAtPath(root[head], rest, leaf);
9662
+ return copy;
9663
+ }
9664
+ const copy = Object.create(null);
9665
+ Object.assign(copy, root);
9666
+ copy[head] = replaceAtPath(root[head], rest, leaf);
9667
+ return copy;
9668
+ }
9465
9669
  function isUncertifiedBaselineMaskPosition(properties, path) {
9466
9670
  if (pathCrossesDottedKey(properties, path)) return false;
9671
+ const [head] = path.split(".");
9672
+ if (head !== void 0 && RENDERED_DEFINITION_KEYS.has(head)) return definitionSourceCarriesSecret(properties);
9467
9673
  let cursor = properties;
9468
9674
  for (const segment of path.split(".")) {
9469
9675
  if (typeof cursor === "string") break;
@@ -9534,7 +9740,79 @@ function deepEqualJsonValue(a, b) {
9534
9740
 
9535
9741
  //#endregion
9536
9742
  //#region src/deployment/secret-redaction/readback-certification.ts
9537
- function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE__ */ new Map()) {
9743
+ function renderedDefinitionLiterals(source) {
9744
+ const keep = /* @__PURE__ */ new Set();
9745
+ const scalarKeep = /* @__PURE__ */ new Set();
9746
+ const keyKeep = /* @__PURE__ */ new Set();
9747
+ const subs = source["DefinitionSubstitutions"];
9748
+ const scalars = [];
9749
+ if (isPlainObject$7(subs)) {
9750
+ for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
9751
+ scalars.push([name, String(value)]);
9752
+ if (typeof value === "string") keep.add(value);
9753
+ addScalarSpelling(scalarKeep, value);
9754
+ }
9755
+ }
9756
+ const bodies = [];
9757
+ for (const key of ["DefinitionString", "Definition"]) {
9758
+ if (!Object.hasOwn(source, key)) continue;
9759
+ const body = source[key];
9760
+ if (typeof body === "string") bodies.push(body);
9761
+ else if (isPlainObject$7(body)) bodies.push(JSON.stringify(body));
9762
+ }
9763
+ for (const body of bodies) {
9764
+ let rendered = body;
9765
+ for (const [name, value] of scalars) rendered = rendered.split(`\${${name}}`).join(value);
9766
+ for (const text of rendered === body ? [body] : [body, rendered]) {
9767
+ keep.add(text);
9768
+ try {
9769
+ const parsed = JSON.parse(text);
9770
+ for (const leaf of wholeStringLeavesOf(parsed)) keep.add(leaf);
9771
+ collectScalarLeaves(parsed, scalarKeep);
9772
+ collectObjectKeys(parsed, keyKeep);
9773
+ } catch {}
9774
+ }
9775
+ }
9776
+ const sentinel = sentinelDefinitionOf(source);
9777
+ if (sentinel !== void 0) {
9778
+ for (const leaf of sentinel.strings) keep.add(leaf);
9779
+ for (const leaf of sentinel.secretLeaves) if (leaf.asWritten !== void 0) keep.add(leaf.asWritten);
9780
+ for (const leaf of sentinel.scalars) scalarKeep.add(leaf);
9781
+ for (const key of sentinel.keys) keyKeep.add(key);
9782
+ }
9783
+ return {
9784
+ strings: keep,
9785
+ scalars: scalarKeep,
9786
+ keys: keyKeep,
9787
+ sentinel
9788
+ };
9789
+ }
9790
+ function certifiedAtSecretPosition(value, rendered) {
9791
+ if (typeof value === "symbol") return true;
9792
+ if (typeof value !== "string") return false;
9793
+ if (isSingleDynamicReferenceToken(value) && spanNamesResolvableService(value)) return true;
9794
+ return (value.includes("{{resolve:") || value.includes("***") || value.includes("${")) && rendered.has(value);
9795
+ }
9796
+ function addScalarSpelling(into, value) {
9797
+ if (typeof value !== "string") {
9798
+ into.add(value);
9799
+ return;
9800
+ }
9801
+ try {
9802
+ const parsed = JSON.parse(value);
9803
+ if (typeof parsed === "number" || typeof parsed === "boolean") into.add(parsed);
9804
+ } catch {}
9805
+ }
9806
+ function collectScalarLeaves(value, into) {
9807
+ if (typeof value === "number" || typeof value === "boolean") {
9808
+ into.add(value);
9809
+ return;
9810
+ }
9811
+ if (Array.isArray(value)) for (const item of value) collectScalarLeaves(item, into);
9812
+ else if (isPlainObject$7(value)) for (const item of Object.values(value)) collectScalarLeaves(item, into);
9813
+ }
9814
+ function refuseUncertifiedSubtree(value, sourceLiterals, mark, scalarLiterals, seen = /* @__PURE__ */ new Map()) {
9815
+ if (scalarLiterals !== void 0 && (typeof value === "number" || typeof value === "boolean") && !scalarLiterals.has(value)) return mark ? POSITION_UNCERTIFIED : "***";
9538
9816
  if (typeof value === "string") {
9539
9817
  if (isSingleDynamicReferenceToken(value) && spanNamesResolvableService(value) || sourceLiterals.has(value)) return value;
9540
9818
  if (value === "") return value;
@@ -9546,13 +9824,13 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE
9546
9824
  if (Array.isArray(value)) {
9547
9825
  const out = [];
9548
9826
  seen.set(value, out);
9549
- for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, seen));
9827
+ for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, scalarLiterals, seen));
9550
9828
  return out;
9551
9829
  }
9552
9830
  if (isPlainObject$7(value) && hasPlainPrototype(value)) {
9553
9831
  const out = Object.create(null);
9554
9832
  seen.set(value, out);
9555
- for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, seen);
9833
+ for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, scalarLiterals, seen);
9556
9834
  return out;
9557
9835
  }
9558
9836
  if (ArrayBuffer.isView(value)) return mark ? POSITION_UNCERTIFIED : "***";
@@ -9576,6 +9854,39 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
9576
9854
  if (learn) learnMixedLeafNeedle(learn, bag, source);
9577
9855
  return mark ? POSITION_DECIDED : source;
9578
9856
  }
9857
+ if (failClosed === true && isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(source) && Object.keys(bag).some((k) => RENDERED_DEFINITION_KEYS.has(k)) && definitionSourceCarriesSecret(source)) {
9858
+ const keep = renderedDefinitionLiterals(source);
9859
+ const out = Object.create(null);
9860
+ const rest = Object.create(null);
9861
+ for (const [k, v] of Object.entries(bag)) if (!RENDERED_DEFINITION_KEYS.has(k)) rest[k] = v;
9862
+ const walkedRest = refuseUncertifiedReadbackPositions(rest, source, secrets, failClosed, learn, mark);
9863
+ for (const [k, v] of Object.entries(bag)) {
9864
+ if (!RENDERED_DEFINITION_KEYS.has(k)) {
9865
+ out[k] = walkedRest[k];
9866
+ continue;
9867
+ }
9868
+ if (someKeyIsUnspelled(v, (key) => keep.keys.has(key))) {
9869
+ out[k] = mark ? POSITION_UNCERTIFIED : "***";
9870
+ continue;
9871
+ }
9872
+ let positioned = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
9873
+ let misaligned = false;
9874
+ for (const leaf of keep.sentinel?.secretLeaves ?? []) {
9875
+ const at = alignedSecretLeaf(positioned, leaf);
9876
+ if (at === void 0) {
9877
+ misaligned = true;
9878
+ break;
9879
+ }
9880
+ if (!certifiedAtSecretPosition(at.value, keep.strings)) positioned = replaceAtPath(positioned, leaf.path, mark ? POSITION_UNCERTIFIED : "***");
9881
+ }
9882
+ if (misaligned) {
9883
+ out[k] = mark ? POSITION_UNCERTIFIED : "***";
9884
+ continue;
9885
+ }
9886
+ out[k] = refuseUncertifiedSubtree(positioned, keep.strings, mark, keep.scalars);
9887
+ }
9888
+ return out;
9889
+ }
9579
9890
  if (!subtreeHasDynamicReference(source)) return bag;
9580
9891
  if (isPlainObject$7(bag) && hasPlainPrototype(bag) && isPlainObject$7(source)) {
9581
9892
  const out = Object.create(null);
@@ -12303,6 +12614,9 @@ function glueTableNameChanged(oldValue, newValue) {
12303
12614
  if (oldName === void 0 || newName === void 0) return false;
12304
12615
  return oldName.toLowerCase() !== newName.toLowerCase();
12305
12616
  }
12617
+ function natZoneAddressesAddedToAutomaticGateway(oldValue, newValue) {
12618
+ return oldValue == null && newValue != null;
12619
+ }
12306
12620
  var ReplacementRulesRegistry = class {
12307
12621
  logger = getLogger().child("ReplacementRulesRegistry");
12308
12622
  rules = /* @__PURE__ */ new Map();
@@ -12627,6 +12941,10 @@ var ReplacementRulesRegistry = class {
12627
12941
  "KeyName",
12628
12942
  "NetworkInterfaces"
12629
12943
  ]) });
12944
+ this.rules.set("AWS::EC2::NatGateway", {
12945
+ replacementProperties: /* @__PURE__ */ new Set(),
12946
+ conditionalReplacements: /* @__PURE__ */ new Map([["AvailabilityZoneAddresses", natZoneAddressesAddedToAutomaticGateway]])
12947
+ });
12630
12948
  this.rules.set("AWS::EC2::Volume", {
12631
12949
  replacementProperties: /* @__PURE__ */ new Set([
12632
12950
  "AvailabilityZone",
@@ -16023,6 +16341,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16023
16341
  "LogsConfig",
16024
16342
  "Name",
16025
16343
  "QueuedTimeoutInMinutes",
16344
+ "ResourceAccessRole",
16026
16345
  "SecondaryArtifacts",
16027
16346
  "SecondarySources",
16028
16347
  "SecondarySourceVersions",
@@ -16031,13 +16350,10 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16031
16350
  "SourceVersion",
16032
16351
  "Tags",
16033
16352
  "TimeoutInMinutes",
16353
+ "Visibility",
16034
16354
  "VpcConfig"
16035
16355
  ]),
16036
- silentDrop: /* @__PURE__ */ new Map([
16037
- ["ResourceAccessRole", "not yet implemented by cdkd"],
16038
- ["Triggers", "not yet implemented by cdkd"],
16039
- ["Visibility", "not yet implemented by cdkd"]
16040
- ]),
16356
+ silentDrop: /* @__PURE__ */ new Map([["Triggers", "not yet implemented by cdkd"]]),
16041
16357
  createOnlyDrops: /* @__PURE__ */ new Set(),
16042
16358
  readOnly: /* @__PURE__ */ new Set(["Arn", "Id"]),
16043
16359
  ccRouteUnavailable: true
@@ -16371,21 +16687,19 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16371
16687
  ["AWS::EC2::NatGateway", {
16372
16688
  handled: /* @__PURE__ */ new Set([
16373
16689
  "AllocationId",
16690
+ "AvailabilityMode",
16691
+ "AvailabilityZoneAddresses",
16374
16692
  "ConnectivityType",
16375
16693
  "PrivateIpAddress",
16376
16694
  "SecondaryAllocationIds",
16377
16695
  "SecondaryPrivateIpAddressCount",
16378
16696
  "SecondaryPrivateIpAddresses",
16379
16697
  "SubnetId",
16380
- "Tags"
16381
- ]),
16382
- silentDrop: /* @__PURE__ */ new Map([
16383
- ["AvailabilityMode", "not yet implemented by cdkd"],
16384
- ["AvailabilityZoneAddresses", "not yet implemented by cdkd"],
16385
- ["MaxDrainDurationSeconds", "write-only address-drain timeout with no CreateNatGateway member and no NAT gateway modify API; only ec2:DisassociateNatGatewayAddress / UnassignPrivateNatGatewayAddress accept it, and cdkd rejects NatGateway updates outright — routed via Cloud Control instead"],
16386
- ["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]
16698
+ "Tags",
16699
+ "VpcId"
16387
16700
  ]),
16388
- createOnlyDrops: /* @__PURE__ */ new Set(["AvailabilityMode", "VpcId"]),
16701
+ silentDrop: /* @__PURE__ */ new Map([["MaxDrainDurationSeconds", "write-only address-drain timeout with no CreateNatGateway member and no NAT gateway modify API; only ec2:DisassociateNatGatewayAddress / UnassignPrivateNatGatewayAddress accept it, and the cdkd NatGateway update releases only the AvailabilityZoneAddresses of a regional gateway, never the secondary addresses of a zonal one — routed via Cloud Control instead"]]),
16702
+ createOnlyDrops: /* @__PURE__ */ new Set(),
16389
16703
  readOnly: /* @__PURE__ */ new Set([
16390
16704
  "AutoProvisionZones",
16391
16705
  "AutoScalingIps",
@@ -16970,8 +17284,12 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16970
17284
  ccRouteUnavailable: true
16971
17285
  }],
16972
17286
  ["AWS::Glue::Connection", {
16973
- handled: /* @__PURE__ */ new Set(["CatalogId", "ConnectionInput"]),
16974
- silentDrop: /* @__PURE__ */ new Map([["Tags", "not yet implemented by cdkd"]]),
17287
+ handled: /* @__PURE__ */ new Set([
17288
+ "CatalogId",
17289
+ "ConnectionInput",
17290
+ "Tags"
17291
+ ]),
17292
+ silentDrop: /* @__PURE__ */ new Map(),
16975
17293
  createOnlyDrops: /* @__PURE__ */ new Set(),
16976
17294
  readOnly: /* @__PURE__ */ new Set(["Name"]),
16977
17295
  ccRouteUnavailable: false
@@ -17210,13 +17528,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
17210
17528
  "DesiredShardLevelMetrics",
17211
17529
  "MaxRecordSizeInKiB",
17212
17530
  "Name",
17531
+ "RecordDistributionStrategy",
17213
17532
  "RetentionPeriodHours",
17214
17533
  "ShardCount",
17215
17534
  "StreamEncryption",
17216
17535
  "StreamModeDetails",
17217
17536
  "Tags"
17218
17537
  ]),
17219
- silentDrop: /* @__PURE__ */ new Map([["RecordDistributionStrategy", "not yet implemented by cdkd"], ["WarmThroughputMiBps", "not yet implemented by cdkd"]]),
17538
+ silentDrop: /* @__PURE__ */ new Map([["WarmThroughputMiBps", "AWS accepts it only on an account enrolled in the Kinesis minimum throughput billing commitment, so the SDK path is not wired (go-to-k/cdkd#1695); Cloud Control forwards it."]]),
17220
17539
  createOnlyDrops: /* @__PURE__ */ new Set(),
17221
17540
  readOnly: /* @__PURE__ */ new Set(["Arn", "WarmThroughputObject"]),
17222
17541
  ccRouteUnavailable: false
@@ -20623,8 +20942,7 @@ const REF_RETURNS_SEGMENT_AFTER_PIPE = /* @__PURE__ */ new Set([
20623
20942
  "AWS::AppConfig::ConfigurationProfile",
20624
20943
  "AWS::AppConfig::HostedConfigurationVersion",
20625
20944
  "AWS::AppConfig::Deployment",
20626
- "AWS::S3Tables::Namespace",
20627
- "AWS::S3Tables::Table"
20945
+ "AWS::S3Tables::Namespace"
20628
20946
  ]);
20629
20947
  const REF_RETURNS_SEGMENT_BEFORE_FIRST_PIPE = /* @__PURE__ */ new Set([
20630
20948
  "AWS::EC2::EIP",
@@ -20706,11 +21024,25 @@ function recordSetRefFromPhysicalId(physicalId, stateLookup) {
20706
21024
  if (recordedName === void 0) return void 0;
20707
21025
  return canonicalizeRoute53QueryName(name) === canonicalizeRoute53QueryName(recordedName) ? name : void 0;
20708
21026
  }
21027
+ function s3TablesTableRefFromPhysicalId(physicalId, stateLookup) {
21028
+ if (!physicalId.includes("|") || !stateLookup) return physicalId;
21029
+ const tableArn = stateLookup(["TableARN"]);
21030
+ if (tableArn === void 0) return physicalId;
21031
+ if (carriesSecretMask(tableArn)) return tableArn;
21032
+ return tableArn.startsWith("arn:") && !tableArn.includes("|") ? tableArn : physicalId;
21033
+ }
21034
+ function lacksRecordedTableArn(resource) {
21035
+ if (resource.resourceType !== "AWS::S3Tables::Table") return false;
21036
+ if (!resource.physicalId.includes("|")) return false;
21037
+ const recorded = (bag) => {
21038
+ if (bag === void 0 || !Object.hasOwn(bag, "TableARN")) return false;
21039
+ const value = bag["TableARN"];
21040
+ return typeof value === "string" && (carriesSecretMask(value) || value.startsWith("arn:") && !value.includes("|"));
21041
+ };
21042
+ return !recorded(resource.properties) && !recorded(resource.attributes);
21043
+ }
20709
21044
  function cfnRefValueFromPhysicalId(resourceType, physicalId, stateLookup) {
20710
- if (resourceType === "AWS::S3Tables::Table" && !physicalId.includes("|") && stateLookup) {
20711
- const tableName = stateLookup(["TableName", "Name"]);
20712
- if (tableName) return tableName;
20713
- }
21045
+ if (resourceType === "AWS::S3Tables::Table") return s3TablesTableRefFromPhysicalId(physicalId, stateLookup);
20714
21046
  if (resourceType === "AWS::Glue::Table") {
20715
21047
  const tableName = glueTableRefFromPhysicalId(physicalId, stateLookup);
20716
21048
  if (tableName !== void 0) return tableName;
@@ -23725,6 +24057,68 @@ async function constructAttributeForComputeTypes(resolver, attributeName, contex
23725
24057
  }
23726
24058
  default: return guardedPhysicalIdFallback(resolver, logicalId, attributeName, resourceType, physicalId, context);
23727
24059
  }
24060
+ if (resourceType === "AWS::EC2::NatGateway") {
24061
+ if (attributeName === "NatGatewayId") return physicalId;
24062
+ if (attributeName === "RouteTableId" || attributeName === "EniId" || attributeName === "AutoProvisionZones" || attributeName === "AutoScalingIps") {
24063
+ const read = async () => {
24064
+ try {
24065
+ const gateway = (await resolver.clients.clientsForRegion(resolver.explicitRegion).ec2.send(new DescribeNatGatewaysCommand({ NatGatewayIds: [physicalId] }))).NatGateways?.find((g) => g.NatGatewayId === physicalId);
24066
+ const addresses = gateway?.NatGatewayAddresses ?? [];
24067
+ const primary = addresses.find((a) => a.IsPrimary === true) ?? addresses[0];
24068
+ const value = attributeName === "RouteTableId" ? gateway?.RouteTableId : attributeName === "AutoProvisionZones" ? gateway?.AutoProvisionZones : attributeName === "AutoScalingIps" ? gateway?.AutoScalingIps : gateway?.AvailabilityMode === "regional" ? void 0 : primary?.NetworkInterfaceId;
24069
+ return {
24070
+ state: gateway?.State,
24071
+ regional: gateway?.AvailabilityMode === "regional",
24072
+ value: typeof value === "string" && value !== "" ? value : void 0
24073
+ };
24074
+ } catch (err) {
24075
+ return refuseUnservedAttribute(resolver, {
24076
+ logicalId,
24077
+ attributeName,
24078
+ resourceType,
24079
+ physicalId,
24080
+ context,
24081
+ observed: describeFailureObserved(resolver, "DescribeNatGateways", err, context),
24082
+ remedy: "Fix the read (the ec2:DescribeNatGateways permission, or the region) and deploy again."
24083
+ });
24084
+ }
24085
+ };
24086
+ let observedRead = await read();
24087
+ if (observedRead.value === void 0 && observedRead.state === "pending") {
24088
+ const watch = startInterruptWatch(`NAT gateway ${logicalId} attribute wait`);
24089
+ try {
24090
+ for (let poll = 0; poll < natGatewayAttributeWait.polls && observedRead.state === "pending"; poll++) {
24091
+ if (watch.isInterrupted()) throw watch.onInterrupted();
24092
+ await natGatewayAttributeWait.sleep(natGatewayAttributeWait.delayMs);
24093
+ observedRead = await read();
24094
+ }
24095
+ } finally {
24096
+ watch.dispose();
24097
+ }
24098
+ }
24099
+ if (observedRead.value !== void 0) return observedRead.value;
24100
+ if (observedRead.state === "pending") return refuseUnservedAttribute(resolver, {
24101
+ logicalId,
24102
+ attributeName,
24103
+ resourceType,
24104
+ physicalId,
24105
+ context,
24106
+ observed: "the NAT gateway was still pending when the attribute wait ran out",
24107
+ remedy: "Check the gateway with `aws ec2 describe-nat-gateways`, then deploy again once it is available."
24108
+ });
24109
+ const remedy = observedRead.state === "available" ? attributeName === "EniId" && observedRead.regional ? "The gateway is available and has no such value: a regional NAT gateway reports no single EniId. Reference another attribute." : attributeName !== "EniId" && !observedRead.regional ? "The gateway is available, and AWS reports no such value for this zonal gateway; the attribute is set on regional NAT gateways. Reference another attribute." : "The gateway is available and AWS reports no such value for it; check it with `aws ec2 describe-nat-gateways`." : observedRead.state === "failed" ? "The gateway is failed and has no such attribute to serve; fix the gateway and deploy again." : observedRead.state === void 0 ? "DescribeNatGateways no longer returns the gateway; check it in the console." : "The gateway is deleted or being deleted and has no such attribute to serve.";
24110
+ return refuseUnservedAttribute(resolver, {
24111
+ logicalId,
24112
+ attributeName,
24113
+ resourceType,
24114
+ physicalId,
24115
+ context,
24116
+ observed: `DescribeNatGateways reports no ${displayMasked(resolver, attributeName, context)}`,
24117
+ remedy
24118
+ });
24119
+ }
24120
+ return guardedPhysicalIdFallback(resolver, logicalId, attributeName, resourceType, physicalId, context);
24121
+ }
23728
24122
  if (resourceType === "AWS::EC2::LaunchTemplate") {
23729
24123
  if (attributeName === "LatestVersionNumber" || attributeName === "DefaultVersionNumber") {
23730
24124
  try {
@@ -23785,6 +24179,11 @@ async function constructAttributeForComputeTypes(resolver, attributeName, contex
23785
24179
  }
23786
24180
  return NOT_CONSTRUCTED;
23787
24181
  }
24182
+ const natGatewayAttributeWait = {
24183
+ polls: 60,
24184
+ delayMs: 1e4,
24185
+ sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms))
24186
+ };
23788
24187
 
23789
24188
  //#endregion
23790
24189
  //#region src/deployment/intrinsic-resolver/functions.ts
@@ -24355,6 +24754,11 @@ function lookupResourceRecord(resolver, logicalId, via, context) {
24355
24754
  async function resolveRef(resolver, logicalId, context, onParameter) {
24356
24755
  const resource = lookupResourceRecord(resolver, logicalId, "Ref", context);
24357
24756
  if (resource) {
24757
+ if (lacksRecordedTableArn(resource)) {
24758
+ const tableArn = await resolveGetAtt(resolver, [logicalId, "TableARN"], context);
24759
+ if (typeof tableArn === "string" && tableArn.startsWith("arn:") && !tableArn.includes("|")) return tableArn;
24760
+ throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Ref ${displayMasked(resolver, logicalId, context)}: the state records no usable TableARN for this S3 Tables table (a cdkd older than v0.201.0 recorded none), and CloudFormation's Ref of a table is its TableARN, which its physical id does not contain. No usable one could be read from AWS either. If the state records none, run 'cdkd deploy' with permission to call s3tables:GetTable so cdkd records it; if it records a value that is not the table's ARN, re-import the table with 'cdkd import'.`));
24761
+ }
24358
24762
  const refValue = resolveRefValue(resolver, logicalId, resource, context);
24359
24763
  recordSecretNamedRead(logicalId, refValue, context);
24360
24764
  resolver.logger.debug(`Resolved Ref to resource: ${logRender(resolver, logicalId, context)} resolved to ${logRender(resolver, String(refValue), context)}`);
@@ -28062,7 +28466,7 @@ var CloudControlProvider = class {
28062
28466
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
28063
28467
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
28064
28468
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
28065
- const { ASGProvider } = await import("./asg-provider-C8HDzpYh.js");
28469
+ const { ASGProvider } = await import("./asg-provider-oKlrkJeO.js");
28066
28470
  const delegateRegion = ambientRegion();
28067
28471
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
28068
28472
  if (asgProvider === void 0) {
@@ -28171,7 +28575,7 @@ var CloudControlProvider = class {
28171
28575
  const family = SDK_DELETE_FAMILIES.get(resourceType);
28172
28576
  const cached = this.sdkDeleteDelegates.get(family);
28173
28577
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
28174
- const provider = family === "rds" ? new (await (import("./rds-provider-CjasAFV5.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-DvFVCaYo.js"))).NeptuneProvider({ region: ccRegion });
28578
+ const provider = family === "rds" ? new (await (import("./rds-provider-DcBsBQLi.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-DvuvSkfJ.js"))).NeptuneProvider({ region: ccRegion });
28175
28579
  this.sdkDeleteDelegates.set(family, {
28176
28580
  region: ccRegion,
28177
28581
  provider
@@ -45305,11 +45709,12 @@ const priorAttemptStore = new AsyncLocalStorage();
45305
45709
  function withPriorAttempts(lookup, fn) {
45306
45710
  return priorAttemptStore.run(lookup, fn);
45307
45711
  }
45308
- function priorAttemptLookup(logicalId, attempts) {
45712
+ function priorAttemptLookup(logicalId, attempts, provenOrphanIds) {
45309
45713
  let landed = false;
45310
45714
  return {
45311
45715
  logicalId,
45312
45716
  attempts,
45717
+ ...provenOrphanIds !== void 0 && { provenOrphanIds },
45313
45718
  notePossiblyLanded: () => {
45314
45719
  landed = true;
45315
45720
  },
@@ -45321,20 +45726,32 @@ function getPriorAttempts(logicalId) {
45321
45726
  return bound?.logicalId === logicalId ? bound : void 0;
45322
45727
  }
45323
45728
  function priorAttemptsInJournal(journal, logicalId, resourceType) {
45324
- let bags = [];
45325
- for (const segment of journal?.segments ?? []) {
45326
- if (segment.operations.some((op) => op.logicalId === logicalId)) bags = [];
45327
- for (const op of segment.failedOperations ?? []) {
45328
- if (op.logicalId !== logicalId || op.resourceType !== resourceType) continue;
45329
- if (op.changeType === "DELETE" || !isBag(op.attemptedProperties)) continue;
45330
- if (op.changeType === "UPDATE" && op.replacementOrphaned !== void 0) continue;
45331
- if (recordedAsNewResource(op)) continue;
45332
- bags.push(op.attemptedProperties);
45333
- }
45334
- if (segment.supersededLogicalIds?.includes(logicalId)) bags = [];
45729
+ const bags = [];
45730
+ for (const op of unsupersededFailedOps(journal, logicalId, resourceType)) {
45731
+ if (op.changeType === "DELETE" || !isBag(op.attemptedProperties)) continue;
45732
+ if (op.changeType === "UPDATE" && op.replacementOrphaned !== void 0) continue;
45733
+ if (recordedAsNewResource(op)) continue;
45734
+ bags.push(op.attemptedProperties);
45335
45735
  }
45336
45736
  return bags;
45337
45737
  }
45738
+ function provenOrphanIdsInJournal(journal, logicalId, resourceType) {
45739
+ const ids = [];
45740
+ for (const op of unsupersededFailedOps(journal, logicalId, resourceType)) {
45741
+ if (op.changeType !== "CREATE" || op.physicalIdRecoveredFromError !== true) continue;
45742
+ if (typeof op.physicalId === "string" && op.physicalId !== "") ids.push(op.physicalId);
45743
+ }
45744
+ return ids;
45745
+ }
45746
+ function unsupersededFailedOps(journal, logicalId, resourceType) {
45747
+ let ops = [];
45748
+ for (const segment of journal?.segments ?? []) {
45749
+ if (segment.operations.some((op) => op.logicalId === logicalId)) ops = [];
45750
+ for (const op of segment.failedOperations ?? []) if (op.logicalId === logicalId && op.resourceType === resourceType) ops.push(op);
45751
+ if (segment.supersededLogicalIds?.includes(logicalId)) ops = [];
45752
+ }
45753
+ return ops;
45754
+ }
45338
45755
  function recordedAsNewResource(op) {
45339
45756
  if (typeof op.physicalId !== "string" || op.physicalId === "") return false;
45340
45757
  if (op.physicalIdRecoveredFromError === true) return false;
@@ -46245,15 +46662,17 @@ var DynamoDBGlobalTableProvider = class {
46245
46662
  }
46246
46663
  if (sdkIndexes.length > 0) createParams.GlobalSecondaryIndexes = sdkIndexes;
46247
46664
  if (properties["LocalSecondaryIndexes"]) createParams.LocalSecondaryIndexes = properties["LocalSecondaryIndexes"];
46248
- if (properties["SSESpecification"]) {
46249
- const sse = properties["SSESpecification"];
46250
- const sseInput = { Enabled: sse["SSEEnabled"] !== void 0 ? Boolean(sse["SSEEnabled"]) : true };
46251
- if (sse["SSEType"]) sseInput.SSEType = sse["SSEType"];
46252
- createParams.SSESpecification = sseInput;
46665
+ const sseEnabledRefusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
46666
+ if (sseEnabledRefusal !== void 0) {
46667
+ const onReplay = replayWarn(log, context).onUnusable;
46668
+ if (!onReplay) throw new ProvisioningError(log.mask(`AWS::DynamoDB::GlobalTable ${logicalId}: ${sseEnabledRefusal}. Nothing was created; fix the template value`), resourceType, logicalId);
46669
+ onReplay(`${sseEnabledRefusal}. Encryption is enabled, the block's default.`);
46253
46670
  }
46671
+ if (properties["SSESpecification"]) createParams.SSESpecification = toSdkTableSseSpecification(properties["SSESpecification"], readReplicaKmsMasterKeyId(localReplicaEntry(properties, currentRegion)));
46254
46672
  const dpeResolved = extractLocalDeletionProtection(properties, currentRegion);
46255
46673
  if (dpeResolved !== void 0) createParams.DeletionProtectionEnabled = dpeResolved;
46256
- if (properties["TableClass"]) createParams.TableClass = properties["TableClass"];
46674
+ const localTableClass = extractLocalTableClass(properties, currentRegion);
46675
+ if (localTableClass !== void 0) createParams.TableClass = localTableClass;
46257
46676
  const createCeilings = collectTableOnDemandCeilings(properties, currentRegion, diagnostics, maskSecrets);
46258
46677
  const createOnDemand = {
46259
46678
  ...createCeilings.read.value !== void 0 && { MaxReadRequestUnits: createCeilings.read.value },
@@ -46333,12 +46752,20 @@ var DynamoDBGlobalTableProvider = class {
46333
46752
  const region = replica.RegionName;
46334
46753
  if (!region || region === currentRegion) continue;
46335
46754
  try {
46755
+ const declared = readReplicaDeletionProtection(localReplicaEntry(wiringProperties, region), region);
46756
+ try {
46757
+ if ((declared === true ? await this.getRegionalClient(region).send(new DescribeTableCommand({ TableName: tableName })) : void 0)?.Table?.DeletionProtectionEnabled === true) await this.setReplicaDeletionProtection(tableName, region, false, logicalId, maskSecrets);
46758
+ } catch (flipError) {
46759
+ if (isInterruptedWaitError(flipError)) throw flipError;
46760
+ log.debug(`Partial-create cleanup: could not turn off deletion protection on the ${region} replica of ${log.value(tableName)}: ` + log.mask(describeAwsFailure(flipError).detail));
46761
+ }
46336
46762
  await this.dynamoDBClient.send(new UpdateTableCommand({
46337
46763
  TableName: tableName,
46338
46764
  ReplicaUpdates: [{ Delete: { RegionName: region } }]
46339
46765
  }));
46340
46766
  await this.waitForReplicaGone(tableName, region, logicalId, void 0, void 0, maskSecrets);
46341
46767
  } catch (replicaCleanupErr) {
46768
+ if (isInterruptedWaitError(replicaCleanupErr)) throw replicaCleanupErr;
46342
46769
  warn(`Partial-create cleanup: failed to drop replica ${region} on ${tableName}: ${this.cleanupFailureText(log, `Partial-create cleanup: failed to drop replica ${region} on ${tableName}: `, replicaCleanupErr)} Run: ${pasteableAwsCommand(maskSecrets)`aws dynamodb update-table --table-name ${tableName} --replica-updates 'Delete={RegionName='${region}'}' --region ${currentRegion}`.render()}`);
46343
46770
  }
46344
46771
  }
@@ -46374,13 +46801,15 @@ var DynamoDBGlobalTableProvider = class {
46374
46801
  }
46375
46802
  async addReplica(tableName, replica, region, logicalId, billingMode, diagnostics, maskSecrets = (text) => text) {
46376
46803
  const create = { RegionName: region };
46377
- if (replica["KMSMasterKeyId"]) create.KMSMasterKeyId = replica["KMSMasterKeyId"];
46804
+ const kmsMasterKeyId = readReplicaKmsMasterKeyId(replica);
46805
+ if (kmsMasterKeyId !== void 0) create.KMSMasterKeyId = kmsMasterKeyId;
46378
46806
  const replicaIndexes = toSdkReplicaGlobalSecondaryIndexes(replica["GlobalSecondaryIndexes"], billingMode, diagnostics, maskSecrets);
46379
46807
  if (replicaIndexes) create.GlobalSecondaryIndexes = replicaIndexes;
46380
46808
  const tableOverrides = toSdkReplicaThroughputOverrides(replica, billingMode, diagnostics, {}, maskSecrets);
46381
46809
  if (tableOverrides.ProvisionedThroughputOverride) create.ProvisionedThroughputOverride = tableOverrides.ProvisionedThroughputOverride;
46382
46810
  if (tableOverrides.OnDemandThroughputOverride) create.OnDemandThroughputOverride = tableOverrides.OnDemandThroughputOverride;
46383
- if (replica["TableClassOverride"]) create.TableClassOverride = replica["TableClassOverride"];
46811
+ const tableClass = readReplicaTableClass(replica);
46812
+ if (tableClass !== void 0) create.TableClassOverride = tableClass;
46384
46813
  const replicaUpdates = [{ Create: create }];
46385
46814
  for (let attempt = 1;; attempt++) try {
46386
46815
  await this.dynamoDBClient.send(new UpdateTableCommand({
@@ -46394,6 +46823,259 @@ var DynamoDBGlobalTableProvider = class {
46394
46823
  await new Promise((resolve) => setTimeout(resolve, REPLICA_COPY_RELEASE_POLL_MS));
46395
46824
  }
46396
46825
  await this.waitForReplicaActive(tableName, region, logicalId, void 0, maskSecrets);
46826
+ if (readReplicaDeletionProtection(replica, region, (message) => this.logger.warn(maskSecrets(message))) === true) await this.setReplicaDeletionProtection(tableName, region, true, logicalId, maskSecrets);
46827
+ }
46828
+ async setReplicaDeletionProtection(tableName, region, enabled, logicalId, maskSecrets, budget) {
46829
+ await this.sendReplicaDeletionProtection(tableName, region, enabled, logicalId, maskSecrets, { budget });
46830
+ await this.waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget);
46831
+ }
46832
+ async sendReplicaDeletionProtection(tableName, region, enabled, logicalId, maskSecrets, opts = {}) {
46833
+ await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, {
46834
+ ...opts,
46835
+ region
46836
+ });
46837
+ await this.writeReplicaDeletionProtection(tableName, region, enabled);
46838
+ }
46839
+ async writeReplicaDeletionProtection(tableName, region, enabled) {
46840
+ await this.getRegionalClient(region).send(new UpdateTableCommand({
46841
+ TableName: tableName,
46842
+ DeletionProtectionEnabled: enabled
46843
+ }));
46844
+ }
46845
+ async waitForReplicaProtectionSettled(tableName, region, enabled, logicalId, maskSecrets, budget) {
46846
+ const wait = beginDeleteWait(60, budget);
46847
+ const watch = startInterruptWatch(maskSecrets(`DynamoDB replica ${region} deletion-protection change on ${tableName}`));
46848
+ try {
46849
+ while (wait.nextPoll()) {
46850
+ if (watch.isInterrupted()) throw watch.onInterrupted();
46851
+ const replica = await this.getRegionalClient(region).send(new DescribeTableCommand({ TableName: tableName }));
46852
+ if (replica.Table?.TableStatus === "ACTIVE" && replica.Table.DeletionProtectionEnabled === enabled) {
46853
+ if ((await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }))).Table?.TableStatus === "ACTIVE") return;
46854
+ }
46855
+ await new Promise((resolve) => setTimeout(resolve, REPLICA_PROTECTION_SETTLE_POLL_MS));
46856
+ }
46857
+ } finally {
46858
+ watch.dispose();
46859
+ }
46860
+ 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);
46861
+ }
46862
+ async convergeReplicaDeletionProtection(tableName, logicalId, currentRegion, previousProperties, properties, addedRegions, warn, maskSecrets) {
46863
+ const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
46864
+ for (const entry of desired) {
46865
+ const replica = asRecord(entry);
46866
+ const region = replica?.["Region"];
46867
+ if (typeof region !== "string" || region === currentRegion || addedRegions.has(region)) continue;
46868
+ const declared = readReplicaDeletionProtection(replica, region, warn);
46869
+ if (declared === UNUSABLE) continue;
46870
+ const previous = readReplicaDeletionProtection(localReplicaEntry(previousProperties, region), region);
46871
+ const newDpe = declared ?? false;
46872
+ const oldDpe = previous === UNUSABLE ? void 0 : previous ?? false;
46873
+ if (oldDpe !== void 0 && newDpe !== oldDpe) {
46874
+ if (oldDpe && declared === void 0) warn(`Auto-disabling DeletionProtectionEnabled on the ${region} replica of ${tableName}: the template no longer sets it for that replica. Set it to false explicitly to silence this warning.`);
46875
+ await this.setReplicaDeletionProtection(tableName, region, newDpe, logicalId, maskSecrets);
46876
+ continue;
46877
+ }
46878
+ if (declared === void 0) continue;
46879
+ let live;
46880
+ try {
46881
+ live = (await this.getRegionalClient(region).send(new DescribeTableCommand({ TableName: tableName }))).Table?.DeletionProtectionEnabled;
46882
+ } catch (readError) {
46883
+ this.logger.debug(maskSecrets(`Could not read DeletionProtectionEnabled on the ${region} replica of ${tableName}: ` + describeAwsFailure(readError).detail));
46884
+ }
46885
+ if (typeof live === "boolean" && live !== newDpe) await this.setReplicaDeletionProtection(tableName, region, newDpe, logicalId, maskSecrets);
46886
+ }
46887
+ }
46888
+ async convergeReplicaSettings(tableName, logicalId, currentRegion, properties, addedRegions, maskSecrets) {
46889
+ const kept = (Array.isArray(properties["Replicas"]) ? properties["Replicas"] : []).map(asRecord).filter((r) => typeof r?.["Region"] === "string" && r["Region"] !== currentRegion && !addedRegions.has(r["Region"]));
46890
+ if (kept.every((r) => readReplicaTableClass(r) === void 0)) return;
46891
+ let liveReplicas;
46892
+ let sourceClass;
46893
+ try {
46894
+ const described = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }));
46895
+ liveReplicas = described.Table?.Replicas;
46896
+ sourceClass = described.Table?.TableClassSummary?.TableClass;
46897
+ } catch (readError) {
46898
+ this.logger.debug(maskSecrets(`Could not read the replicas of ${tableName} to converge their table class: ` + describeAwsFailure(readError).detail));
46899
+ return;
46900
+ }
46901
+ for (const replica of kept) {
46902
+ const region = replica["Region"];
46903
+ const live = liveReplicas?.find((r) => r.RegionName === region);
46904
+ if (!live) continue;
46905
+ const tableClass = readReplicaTableClass(replica);
46906
+ if (tableClass === void 0) continue;
46907
+ if (tableClass === (live.ReplicaTableClassSummary?.TableClass ?? sourceClass ?? "STANDARD")) {
46908
+ this.logger.debug(maskSecrets(`The ${region} replica of ${tableName} already holds its declared table class`));
46909
+ continue;
46910
+ }
46911
+ this.logger.debug(maskSecrets(`Bringing the ${region} replica of ${tableName} to its declared table class`));
46912
+ try {
46913
+ await this.dynamoDBClient.send(new UpdateTableCommand({
46914
+ TableName: tableName,
46915
+ ReplicaUpdates: [{ Update: {
46916
+ RegionName: region,
46917
+ TableClassOverride: tableClass
46918
+ } }]
46919
+ }));
46920
+ await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
46921
+ } catch (convergeError) {
46922
+ if (isInterruptedWaitError(convergeError)) throw convergeError;
46923
+ this.logger.debug(maskSecrets(`Could not bring the ${region} replica of ${tableName} to its declared table class: ` + describeAwsFailure(convergeError).detail));
46924
+ this.logger.warn(maskSecrets(`The ${region} replica of ${tableName} does not hold its declared TableClass, and setting it failed (${describeAwsFailure(convergeError).summary}). The next deploy that updates this table tries again.`));
46925
+ }
46926
+ }
46927
+ }
46928
+ async applyReplicaKeys(tableName, logicalId, currentRegion, properties, previousProperties, addedRegions, deferredSseUpdate, deferredSseFromTemplate, keylessSseFromTemplate, maskSecrets) {
46929
+ if (!(properties["SSESpecification"] !== void 0 && configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification") === void 0 && toSdkTableSseSpecification(properties["SSESpecification"], void 0).Enabled)) return;
46930
+ const declared = /* @__PURE__ */ new Map();
46931
+ for (const entry of Array.isArray(properties["Replicas"]) ? properties["Replicas"] : []) {
46932
+ const replica = asRecord(entry);
46933
+ const region = replica?.["Region"];
46934
+ if (typeof region === "string") declared.set(region, readReplicaKmsMasterKeyId(replica));
46935
+ }
46936
+ if ([...declared.values()].every((key) => key === void 0)) return;
46937
+ const replicaKeyChanged = [...declared].some(([region, key]) => region !== currentRegion && key !== void 0 && !addedRegions.has(region) && key !== readReplicaKmsMasterKeyId(localReplicaEntry(previousProperties, region)));
46938
+ let liveKeys;
46939
+ try {
46940
+ liveKeys = await this.readLiveKeys(tableName, currentRegion);
46941
+ } catch (readError) {
46942
+ if (replicaKeyChanged || deferredSseFromTemplate || keylessSseFromTemplate) throw readError;
46943
+ this.logger.debug(maskSecrets(`Could not read the KMS keys of ${tableName} to converge them: ` + describeAwsFailure(readError).detail));
46944
+ return;
46945
+ }
46946
+ const templateChanged = replicaKeyChanged || keylessSseFromTemplate && [...declared].some(([region, key]) => region !== currentRegion && key !== void 0) || deferredSseFromTemplate && declared.get(currentRegion) !== liveKeys.get(currentRegion);
46947
+ let request;
46948
+ if (liveKeys.size < 2) {
46949
+ if (deferredSseUpdate === void 0) return;
46950
+ request = {
46951
+ TableName: tableName,
46952
+ SSESpecification: deferredSseUpdate
46953
+ };
46954
+ } else {
46955
+ const built = this.replicaKeysRequest(tableName, logicalId, liveKeys, declared, templateChanged, maskSecrets);
46956
+ if (built === void 0) return;
46957
+ request = built;
46958
+ }
46959
+ try {
46960
+ await this.dynamoDBClient.send(new UpdateTableCommand(request));
46961
+ await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
46962
+ } catch (keyError) {
46963
+ if (templateChanged || isInterruptedWaitError(keyError)) throw keyError;
46964
+ this.logger.debug(maskSecrets(`Could not bring the KMS keys of ${tableName} to the declared ones: ` + describeAwsFailure(keyError).detail));
46965
+ this.logger.warn(maskSecrets(`${tableName} does not hold its declared KMS keys, and setting them failed (${describeAwsFailure(keyError).summary}). The next deploy that updates this table tries again.`));
46966
+ }
46967
+ }
46968
+ async readLiveKeys(tableName, currentRegion) {
46969
+ const described = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }));
46970
+ const keys = /* @__PURE__ */ new Map([[currentRegion, described.Table?.SSEDescription?.KMSMasterKeyArn]]);
46971
+ for (const r of described.Table?.Replicas ?? []) if (r.RegionName !== void 0 && r.RegionName !== currentRegion) keys.set(r.RegionName, r.KMSMasterKeyId);
46972
+ return keys;
46973
+ }
46974
+ replicaKeysRequest(tableName, logicalId, liveKeys, declared, templateChanged, maskSecrets) {
46975
+ const drifted = [...liveKeys].some(([region, live]) => {
46976
+ const key = declared.get(region);
46977
+ return isKmsKeyArn(key) && key !== live;
46978
+ });
46979
+ if (!templateChanged && !drifted) {
46980
+ this.logger.debug(maskSecrets(`Every region of ${tableName} already holds its declared KMS key`));
46981
+ return;
46982
+ }
46983
+ const entries = [...liveKeys].map(([region, live]) => ({ Update: {
46984
+ RegionName: region,
46985
+ KMSMasterKeyId: declared.get(region) ?? live
46986
+ } }));
46987
+ const keyless = entries.filter((e) => e.Update.KMSMasterKeyId === void 0);
46988
+ if (keyless.length > 0) {
46989
+ const text = `The KMS keys of ${tableName} were not changed: DynamoDB takes every region's key in one call, and no key is declared or reported for ${keyless.map((e) => e.Update.RegionName).join(", ")}`;
46990
+ if (templateChanged) throw new ProvisioningError(maskSecrets(`${text}. Declare a key for every replica`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
46991
+ this.logger.warn(maskSecrets(`${text}.`));
46992
+ return;
46993
+ }
46994
+ this.logger.debug(maskSecrets(`Setting the KMS key of every region of ${tableName} in one ReplicaUpdates call`));
46995
+ return {
46996
+ TableName: tableName,
46997
+ ReplicaUpdates: entries
46998
+ };
46999
+ }
47000
+ async sendLocalSettingUpdate(input, fromTemplate, what, tableName, logicalId, maskSecrets) {
47001
+ try {
47002
+ await this.dynamoDBClient.send(new UpdateTableCommand(input));
47003
+ await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
47004
+ } catch (error) {
47005
+ if (fromTemplate || isInterruptedWaitError(error)) throw error;
47006
+ this.logger.debug(maskSecrets(`Could not bring the ${what} of ${tableName} to the declared one: ` + describeAwsFailure(error).detail));
47007
+ this.logger.warn(maskSecrets(`${tableName} does not hold its declared ${what}, and setting it failed (${describeAwsFailure(error).summary}). The next deploy that updates this table tries again.`));
47008
+ }
47009
+ }
47010
+ async waitForGlobalTableSettled(tableName, logicalId, maskSecrets, opts = {}) {
47011
+ const wait = beginDeleteWait(opts.maxPolls ?? 600, opts.budget);
47012
+ const watch = startInterruptWatch(maskSecrets(`DynamoDB global table ${tableName} settling after an update`));
47013
+ try {
47014
+ while (wait.nextPoll()) {
47015
+ if (opts.interruptible !== false && watch.isInterrupted()) throw watch.onInterrupted();
47016
+ const table = (await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: tableName }))).Table;
47017
+ if (table?.TableStatus === "ACTIVE" && table.SSEDescription?.Status !== "UPDATING" && (table.Replicas ?? []).every((r) => r.ReplicaStatus === "ACTIVE")) {
47018
+ if (opts.region === void 0) return;
47019
+ if ((await this.getRegionalClient(opts.region).send(new DescribeTableCommand({ TableName: tableName }))).Table?.TableStatus === "ACTIVE") return;
47020
+ }
47021
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
47022
+ }
47023
+ } finally {
47024
+ watch.dispose();
47025
+ }
47026
+ throw new ProvisioningError(maskSecrets(`Table ${tableName} and its replicas did not settle within ${wait.pollsRun} polls${wait.note()}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
47027
+ }
47028
+ async dropReplicaForDelete(tableName, region, removeProtection, logicalId, budget, maskSecrets) {
47029
+ let flippedOff = false;
47030
+ if (removeProtection) {
47031
+ try {
47032
+ if ((await this.getRegionalClient(region).send(new DescribeTableCommand({ TableName: tableName }))).Table?.DeletionProtectionEnabled === true) {
47033
+ await this.sendReplicaDeletionProtection(tableName, region, false, logicalId, maskSecrets, { budget });
47034
+ flippedOff = true;
47035
+ }
47036
+ } catch (flipError) {
47037
+ if (isInterruptedWaitError(flipError)) throw flipError;
47038
+ this.logger.debug(maskSecrets(`Could not disable DeletionProtectionEnabled on the ${region} replica of ${tableName}: ` + describeAwsFailure(flipError).detail));
47039
+ }
47040
+ if (flippedOff) try {
47041
+ await this.waitForReplicaProtectionSettled(tableName, region, false, logicalId, maskSecrets, budget);
47042
+ } catch (waitError) {
47043
+ await this.restoreReplicaDeletionProtection(tableName, region, logicalId, maskSecrets, isInterruptedWaitError(waitError) ? "the destroy was interrupted" : "its deletion-protection change did not settle");
47044
+ throw waitError;
47045
+ }
47046
+ }
47047
+ try {
47048
+ await this.dynamoDBClient.send(new UpdateTableCommand({
47049
+ TableName: tableName,
47050
+ ReplicaUpdates: [{ Delete: { RegionName: region } }]
47051
+ }));
47052
+ } catch (dropError) {
47053
+ if (flippedOff) await this.restoreReplicaDeletionProtection(tableName, region, logicalId, maskSecrets, "it could not be dropped");
47054
+ throw dropError;
47055
+ }
47056
+ }
47057
+ async restoreReplicaDeletionProtection(tableName, region, logicalId, maskSecrets, reason) {
47058
+ for (let attempt = 1;; attempt++) try {
47059
+ if (attempt === 1) await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, {
47060
+ region,
47061
+ maxPolls: 60,
47062
+ interruptible: false
47063
+ }).catch(() => void 0);
47064
+ await this.writeReplicaDeletionProtection(tableName, region, true);
47065
+ return;
47066
+ } catch (restoreError) {
47067
+ if (attempt === 1 && restoreError instanceof Error && restoreError.name === "ThrottlingException") {
47068
+ await new Promise((resolve) => setTimeout(resolve, DELETION_PROTECTION_REFLIP_MS));
47069
+ continue;
47070
+ }
47071
+ try {
47072
+ this.logger.debug(maskSecrets(`Could not restore DeletionProtectionEnabled on the ${region} replica of ${tableName}: ${describeAwsFailure(restoreError).detail}`));
47073
+ const head = maskSecrets(`The ${region} replica of ${tableName} was not deleted (${reason}), and its deletion protection, which this destroy turned off, could not be turned back on (${describeAwsFailure(restoreError).summary}). It is LEFT UNPROTECTED. To restore it, run: `);
47074
+ const command = pasteableAwsCommand(maskSecrets)`aws dynamodb update-table --table-name ${tableName} --deletion-protection-enabled --region ${region}`.render();
47075
+ this.logger.warn(safeMsg`${head}${command}`);
47076
+ } catch {}
47077
+ return;
47078
+ }
46397
47079
  }
46398
47080
  async waitForRegionalCopyReleased(tableName, region, maskSecrets) {
46399
47081
  const client = this.getRegionalClient(region);
@@ -46437,6 +47119,18 @@ var DynamoDBGlobalTableProvider = class {
46437
47119
  } catch {
46438
47120
  guardRegion = "";
46439
47121
  }
47122
+ const protectedReplica = guardRegion === "" || extractLocalDeletionProtection(previousProperties, guardRegion) === true ? void 0 : (Array.isArray(previousProperties["Replicas"]) ? previousProperties["Replicas"] : []).map(asRecord).find((r) => typeof r?.["Region"] === "string" && r["Region"] !== guardRegion && coerceCfnBoolean(r["DeletionProtectionEnabled"]) === true)?.["Region"];
47123
+ if (typeof protectedReplica === "string") return protectedReplacementAdvice({
47124
+ evidence: `cdkd's recorded properties for this table carry DeletionProtectionEnabled: true for the ${protectedReplica} replica`,
47125
+ replaceFlags,
47126
+ disable: {
47127
+ before: "aws dynamodb update-table --table-name",
47128
+ identifier: physicalId,
47129
+ after: "--no-deletion-protection-enabled",
47130
+ caveat: "Run it with --region set to that replica's region.",
47131
+ maskSecrets
47132
+ }
47133
+ });
46440
47134
  return extractLocalDeletionProtection(previousProperties, guardRegion) === true ? protectedReplacementAdvice({
46441
47135
  evidence: "cdkd's recorded properties for this table carry DeletionProtectionEnabled: true for the deploy region",
46442
47136
  replaceFlags,
@@ -46474,8 +47168,12 @@ var DynamoDBGlobalTableProvider = class {
46474
47168
  refuse(describeAwsFailure(error).detail, error);
46475
47169
  }
46476
47170
  if (refusal === void 0 && !deepEqual(properties["StreamSpecification"], previousProperties["StreamSpecification"])) refusal = configStringRefusal(properties["StreamSpecification"], "StreamViewType", "NEW_AND_OLD_IMAGES", "AWS::DynamoDB::GlobalTable StreamSpecification");
47171
+ if (refusal === void 0 && (changed("SSESpecification") || !deepEqual(replicaKeyBlocks(properties), replicaKeyBlocks(previousProperties)))) refusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
46477
47172
  if (refusal === void 0 && changed("GlobalSecondaryIndexes")) refusal = globalSecondaryIndexesShapeDetail(properties["GlobalSecondaryIndexes"], maskSecrets);
46478
47173
  if (refusal !== void 0) refuse(refusal);
47174
+ } else {
47175
+ const sseEnabledRefusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
47176
+ if (sseEnabledRefusal !== void 0) warn(`${sseEnabledRefusal}. Encryption is treated as enabled, the block's default.`);
46479
47177
  }
46480
47178
  const currentRegion = await this.dynamoDBClient.config.region() ?? "";
46481
47179
  let effectiveProperties;
@@ -46539,28 +47237,38 @@ var DynamoDBGlobalTableProvider = class {
46539
47237
  toSdkReplicaThroughputOverrides(replica, newBilling, diagnostics, {}, maskSecrets);
46540
47238
  }
46541
47239
  this.reportThroughputDiagnostics(diagnostics, logicalId, physicalId, maskSecrets);
47240
+ let deferredSseUpdate;
47241
+ let deferredSseFromTemplate = false;
47242
+ let keylessSseFromTemplate = false;
46542
47243
  const newDpe = extractLocalDeletionProtection(properties, currentRegion);
46543
47244
  const oldDpe = extractLocalDeletionProtection(previousProperties, currentRegion);
46544
47245
  const awsDpe = describeResp.Table?.DeletionProtectionEnabled;
46545
47246
  const flatUpdate = { TableName: physicalId };
46546
47247
  let flatChanged = false;
47248
+ let tableClassUpdate;
47249
+ let sseUpdate;
47250
+ let sseFromTemplate = false;
47251
+ let tableClassFromTemplate = false;
46547
47252
  if (newDpe !== oldDpe || newDpe !== void 0 && typeof awsDpe === "boolean" && Boolean(newDpe) !== awsDpe) {
46548
47253
  if ((oldDpe === true || awsDpe === true) && Boolean(newDpe ?? false) === false && !(newDpe !== void 0)) warn(`Auto-disabling DeletionProtectionEnabled on ${physicalId}: the CDK code does not set 'deletionProtection: true' but AWS has it enabled. AWS will accept DeleteTable on this resource after this deploy. If you meant to keep protection on, set 'deletionProtection: true' in your CDK code; if you meant to disable it explicitly, set 'deletionProtection: false' to silence this warning.`);
46549
47254
  flatUpdate.DeletionProtectionEnabled = Boolean(newDpe ?? false);
46550
47255
  flatChanged = true;
46551
47256
  }
46552
- if (properties["TableClass"] !== void 0 && properties["TableClass"] !== previousProperties["TableClass"]) {
46553
- flatUpdate.TableClass = properties["TableClass"];
46554
- flatChanged = true;
46555
- }
46556
- if (properties["SSESpecification"] !== void 0 && !deepEqual(properties["SSESpecification"], previousProperties["SSESpecification"])) {
46557
- const sse = properties["SSESpecification"];
46558
- flatUpdate.SSESpecification = {
46559
- Enabled: sse["SSEEnabled"] !== void 0 ? Boolean(sse["SSEEnabled"]) : true,
46560
- ...sse["SSEType"] !== void 0 && { SSEType: sse["SSEType"] }
46561
- };
46562
- flatChanged = true;
46563
- }
47257
+ const tableClassChange = tableClassToSend(extractLocalTableClass(previousProperties, currentRegion), extractLocalTableClass(properties, currentRegion));
47258
+ const declaredTableClass = extractLocalTableClass(properties, currentRegion);
47259
+ const liveTableClass = describeResp.Table?.TableClassSummary?.TableClass ?? "STANDARD";
47260
+ if (tableClassChange !== void 0) {
47261
+ tableClassUpdate = tableClassChange;
47262
+ tableClassFromTemplate = true;
47263
+ } else if (declaredTableClass !== void 0 && declaredTableClass !== liveTableClass) tableClassUpdate = declaredTableClass;
47264
+ const newLocalKmsKey = readReplicaKmsMasterKeyId(localReplicaEntry(properties, currentRegion));
47265
+ if (properties["SSESpecification"] !== void 0 && (!deepEqual(properties["SSESpecification"], previousProperties["SSESpecification"]) || newLocalKmsKey !== readReplicaKmsMasterKeyId(localReplicaEntry(previousProperties, currentRegion)))) {
47266
+ sseUpdate = toSdkTableSseSpecification(properties["SSESpecification"], newLocalKmsKey);
47267
+ sseFromTemplate = true;
47268
+ } else if (properties["SSESpecification"] === void 0 && previousProperties["SSESpecification"] !== void 0 && toSdkTableSseSpecification(previousProperties["SSESpecification"], void 0).Enabled) {
47269
+ sseUpdate = { Enabled: false };
47270
+ sseFromTemplate = true;
47271
+ } else if (isKmsKeyArn(newLocalKmsKey) && properties["SSESpecification"] !== void 0 && configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification") === void 0 && toSdkTableSseSpecification(properties["SSESpecification"], void 0).Enabled && describeResp.Table?.SSEDescription?.KMSMasterKeyArn !== newLocalKmsKey) sseUpdate = toSdkTableSseSpecification(properties["SSESpecification"], newLocalKmsKey);
46564
47272
  if (properties["StreamSpecification"] !== void 0 && !deepEqual(properties["StreamSpecification"], previousProperties["StreamSpecification"])) {
46565
47273
  let streamSpecUnusable = false;
46566
47274
  const streamViewType = readConfigString(properties["StreamSpecification"], "StreamViewType", "NEW_AND_OLD_IMAGES", "AWS::DynamoDB::GlobalTable StreamSpecification", { onUnusable: (message) => {
@@ -46624,6 +47332,21 @@ var DynamoDBGlobalTableProvider = class {
46624
47332
  await this.dynamoDBClient.send(new UpdateTableCommand(flatUpdate));
46625
47333
  await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
46626
47334
  }
47335
+ if (tableClassUpdate !== void 0) await this.sendLocalSettingUpdate({
47336
+ TableName: physicalId,
47337
+ TableClass: tableClassUpdate
47338
+ }, tableClassFromTemplate, "TableClass", physicalId, logicalId, maskSecrets);
47339
+ const liveHasCrossRegionReplica = (describeResp.Table?.Replicas ?? []).some((r) => r.RegionName !== void 0 && r.RegionName !== currentRegion);
47340
+ if (sseUpdate?.KMSMasterKeyId !== void 0 && liveHasCrossRegionReplica) {
47341
+ deferredSseUpdate = sseUpdate;
47342
+ deferredSseFromTemplate = sseFromTemplate;
47343
+ } else if (sseUpdate !== void 0) {
47344
+ await this.sendLocalSettingUpdate({
47345
+ TableName: physicalId,
47346
+ SSESpecification: sseUpdate
47347
+ }, sseFromTemplate, "encryption", physicalId, logicalId, maskSecrets);
47348
+ keylessSseFromTemplate = sseFromTemplate && sseUpdate.KMSMasterKeyId === void 0 && liveHasCrossRegionReplica;
47349
+ }
46627
47350
  const gsiHandledByBillingFlip = /* @__PURE__ */ new Set();
46628
47351
  if (oldBilling !== newBilling) {
46629
47352
  const billingUpdate = {
@@ -46736,7 +47459,6 @@ var DynamoDBGlobalTableProvider = class {
46736
47459
  }));
46737
47460
  }
46738
47461
  const updateAction = { RegionName: region };
46739
- if (replica["KMSMasterKeyId"] !== void 0) updateAction.KMSMasterKeyId = replica["KMSMasterKeyId"];
46740
47462
  const replicaIndexes = toSdkReplicaGlobalSecondaryIndexes(replica["GlobalSecondaryIndexes"], newBilling, void 0, maskSecrets);
46741
47463
  if (replicaIndexes) updateAction.GlobalSecondaryIndexes = replicaIndexes;
46742
47464
  const replicaOverrides = toSdkReplicaThroughputOverrides(replica, newBilling, void 0, {}, maskSecrets);
@@ -46749,8 +47471,9 @@ var DynamoDBGlobalTableProvider = class {
46749
47471
  if (oldReplicaOverrides.ProvisionedThroughputOverride && !replicaOverrides.ProvisionedThroughputOverride) droppedOverrides.push("ReadProvisionedThroughputSettings");
46750
47472
  if (droppedOverrides.length > 0) warn(`Cross-region replica ${region} of ${physicalId}: the template no longer declares ${droppedOverrides.map((o) => maskSecrets(o)).join(" / ")}, but DynamoDB offers no way to CLEAR a replica-level throughput override — a -1 sentinel is stored literally, and an empty override block wedges the table in UPDATING. The previous override is STILL IN EFFECT on AWS. Set an explicit value, or remove and re-add the replica, to change it.`);
46751
47473
  }
46752
- if (replica["TableClassOverride"]) updateAction.TableClassOverride = replica["TableClassOverride"];
46753
- if (!(updateAction.KMSMasterKeyId !== void 0 || updateAction.GlobalSecondaryIndexes !== void 0 || updateAction.TableClassOverride !== void 0 || updateAction.ProvisionedThroughputOverride !== void 0 || updateAction.OnDemandThroughputOverride !== void 0)) {
47474
+ const replicaTableClassChange = tableClassToSend(readReplicaTableClass(oldReplica), readReplicaTableClass(replica));
47475
+ if (replicaTableClassChange !== void 0) updateAction.TableClassOverride = replicaTableClassChange;
47476
+ if (!(updateAction.GlobalSecondaryIndexes !== void 0 || updateAction.TableClassOverride !== void 0 || updateAction.ProvisionedThroughputOverride !== void 0 || updateAction.OnDemandThroughputOverride !== void 0)) {
46754
47477
  debug(`Cross-region replica ${region} of ${maskSecrets(physicalId)}: only Tags-style changes detected; UpdateReplica skipped (AWS rejects empty Update actions). Tags propagation handled above via per-region client.`);
46755
47478
  continue;
46756
47479
  }
@@ -46760,6 +47483,10 @@ var DynamoDBGlobalTableProvider = class {
46760
47483
  }));
46761
47484
  await this.waitForReplicaActive(physicalId, region, logicalId, void 0, maskSecrets);
46762
47485
  }
47486
+ const addedReplicaRegions = new Set(replicaDiff.added.map((r) => r["Region"]));
47487
+ await this.convergeReplicaDeletionProtection(physicalId, logicalId, currentRegion, previousProperties, properties, addedReplicaRegions, warn, maskSecrets);
47488
+ await this.convergeReplicaSettings(physicalId, logicalId, currentRegion, properties, addedReplicaRegions, maskSecrets);
47489
+ await this.applyReplicaKeys(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, deferredSseUpdate, deferredSseFromTemplate, keylessSseFromTemplate, maskSecrets);
46763
47490
  const previousTranslatedIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling, "min", void 0, onUnusablePreviousGsiBlock, maskSecrets);
46764
47491
  const previousSdkIndexes = previousGsiUnusable ? buildLiveRecoveryGsiBaseline(desiredSdkIndexes, describeResp.Table?.GlobalSecondaryIndexes, {
46765
47492
  carryLiveValues: oldBilling === newBilling && liveBillingMode === newBilling,
@@ -47234,10 +47961,7 @@ var DynamoDBGlobalTableProvider = class {
47234
47961
  try {
47235
47962
  await this.applyAutoScalingDiff(physicalId, "dynamodb:table:ReadCapacityUnits", {}, void 0, this.getRegionalAutoScalingClient(region), void 0, budget, void 0, progress);
47236
47963
  for (const indexName of tableIndexNames) await this.applyAutoScalingDiff(physicalId, "dynamodb:index:ReadCapacityUnits", {}, void 0, this.getRegionalAutoScalingClient(region), indexName, budget, void 0, progress);
47237
- await this.dynamoDBClient.send(new UpdateTableCommand({
47238
- TableName: physicalId,
47239
- ReplicaUpdates: [{ Delete: { RegionName: region } }]
47240
- }));
47964
+ await this.dropReplicaForDelete(physicalId, region, context?.removeProtection === true, logicalId, budget, deleteMask);
47241
47965
  progress.stripped = true;
47242
47966
  await this.waitForReplicaGone(physicalId, region, logicalId, REPLICA_GONE_WAIT_ATTEMPTS, budget, context?.maskSecrets);
47243
47967
  } catch (replicaErr) {
@@ -47755,11 +48479,57 @@ function localReplicaEntry(props, region) {
47755
48479
  return raw.find((r) => r?.["Region"] === region);
47756
48480
  }
47757
48481
  function extractLocalDeletionProtection(props, region) {
47758
- const perReplica = localReplicaEntry(props, region)?.["DeletionProtectionEnabled"];
47759
- if (typeof perReplica === "boolean") return perReplica;
48482
+ const local = localReplicaEntry(props, region);
48483
+ const perReplica = coerceCfnBoolean(local?.["DeletionProtectionEnabled"]);
48484
+ if (perReplica !== void 0) return perReplica;
47760
48485
  const topLevel = props["DeletionProtectionEnabled"];
47761
48486
  return typeof topLevel === "boolean" ? topLevel : void 0;
47762
48487
  }
48488
+ function extractAnyDeletionProtection(props, region) {
48489
+ if ((Array.isArray(props["Replicas"]) ? props["Replicas"] : []).some((r) => coerceCfnBoolean(asRecord(r)?.["DeletionProtectionEnabled"]) === true)) return true;
48490
+ return extractLocalDeletionProtection(props, region);
48491
+ }
48492
+ function readReplicaKmsMasterKeyId(replica) {
48493
+ const key = asRecord(asRecord(replica)?.["SSESpecification"])?.["KMSMasterKeyId"];
48494
+ return typeof key === "string" && key !== "" ? key : void 0;
48495
+ }
48496
+ function readReplicaTableClass(replica) {
48497
+ const tableClass = asRecord(replica)?.["TableClass"];
48498
+ return typeof tableClass === "string" && tableClass !== "" ? tableClass : void 0;
48499
+ }
48500
+ const UNUSABLE = Symbol("unusable");
48501
+ function readReplicaDeletionProtection(replica, region, warn) {
48502
+ const refusal = configBooleanRefusal(replica, "DeletionProtectionEnabled", `AWS::DynamoDB::GlobalTable Replicas[${region}]`);
48503
+ if (refusal !== void 0) {
48504
+ warn?.(`${refusal}. The ${region} replica's deletion protection is left as it is.`);
48505
+ return UNUSABLE;
48506
+ }
48507
+ return coerceCfnBoolean(replica?.["DeletionProtectionEnabled"]);
48508
+ }
48509
+ function replicaKeyBlocks(props) {
48510
+ return (Array.isArray(props["Replicas"]) ? props["Replicas"] : []).map((r) => [asRecord(r)?.["Region"], asRecord(r)?.["SSESpecification"]]);
48511
+ }
48512
+ function isKmsKeyArn(key) {
48513
+ return key !== void 0 && /^arn:aws[a-z-]*:kms:[^:]+:\d+:key\//.test(key);
48514
+ }
48515
+ function tableClassToSend(previous, desired) {
48516
+ if (desired !== void 0) return desired !== previous ? desired : void 0;
48517
+ return previous !== void 0 && previous !== "STANDARD" ? "STANDARD" : void 0;
48518
+ }
48519
+ function toSdkTableSseSpecification(block, kmsMasterKeyId) {
48520
+ const sse = asRecord(block) ?? {};
48521
+ return {
48522
+ Enabled: coerceCfnBoolean(sse["SSEEnabled"]) ?? true,
48523
+ ...sse["SSEType"] !== void 0 && sse["SSEType"] !== "" && { SSEType: sse["SSEType"] },
48524
+ ...kmsMasterKeyId !== void 0 && { KMSMasterKeyId: kmsMasterKeyId }
48525
+ };
48526
+ }
48527
+ function extractLocalTableClass(props, region) {
48528
+ const perReplica = readReplicaTableClass(localReplicaEntry(props, region));
48529
+ if (perReplica !== void 0) return perReplica;
48530
+ const topLevel = props["TableClass"];
48531
+ return typeof topLevel === "string" && topLevel !== "" ? topLevel : void 0;
48532
+ }
47763
48533
  function derivePerCallProvisionedThroughput(properties, region, source = "min", diagnostics, maskSecrets = (text) => text) {
47764
48534
  const rawReplicas = properties["Replicas"];
47765
48535
  const rawRead = (Array.isArray(rawReplicas) ? rawReplicas : []).find((r) => asRecord(r)?.["Region"] === region)?.["ReadProvisionedThroughputSettings"];
@@ -47837,6 +48607,9 @@ function collectAutoScalingTargets(properties, localRegion) {
47837
48607
  }
47838
48608
  const REPLICA_COPY_RELEASE_POLLS = 180;
47839
48609
  const REPLICA_COPY_RELEASE_POLL_MS = 5e3;
48610
+ const DELETION_PROTECTION_REFLIP_MS = 16e3;
48611
+ const REPLICA_PROTECTION_SETTLE_POLLS = 60;
48612
+ const REPLICA_PROTECTION_SETTLE_POLL_MS = 5e3;
47840
48613
  const REPLICA_COPY_RELEASE_ATTEMPTS = 3;
47841
48614
  function isReplicaCopyExistsRefusal(error) {
47842
48615
  return error instanceof Error && /one or more replicas already existed as tables/i.test(error.message);
@@ -48492,7 +49265,7 @@ const PROTECTION_PROPERTY_BY_TYPE = {
48492
49265
  "AWS::Neptune::DBCluster": "DeletionProtection",
48493
49266
  "AWS::Neptune::DBInstance": "DeletionProtection",
48494
49267
  "AWS::DynamoDB::Table": "DeletionProtectionEnabled",
48495
- "AWS::DynamoDB::GlobalTable": (bag, region) => extractLocalDeletionProtection(bag, region ?? ""),
49268
+ "AWS::DynamoDB::GlobalTable": (bag, region) => extractAnyDeletionProtection(bag, region ?? ""),
48496
49269
  "AWS::EC2::Instance": "DisableApiTermination",
48497
49270
  "AWS::Cognito::UserPool": "DeletionProtection",
48498
49271
  "AWS::AutoScaling::AutoScalingGroup": "DeletionProtection",
@@ -48541,7 +49314,7 @@ function isProtectionValueActive(resourceType, value) {
48541
49314
  //#endregion
48542
49315
  //#region src/provisioning/recorded-protection.ts
48543
49316
  const READER_LABELS = {
48544
- "AWS::DynamoDB::GlobalTable": "DeletionProtectionEnabled for the deploy region",
49317
+ "AWS::DynamoDB::GlobalTable": "DeletionProtectionEnabled on the table or a replica",
48545
49318
  "AWS::ElasticLoadBalancingV2::LoadBalancer": "LoadBalancerAttributes deletion_protection.enabled"
48546
49319
  };
48547
49320
  const REPLACEMENT_BLOCKING_VALUES = { "AWS::AutoScaling::AutoScalingGroup": /* @__PURE__ */ new Set(["prevent-all-deletion"]) };
@@ -50137,7 +50910,8 @@ async function provisionResource(engine, logicalId, change, stateResources, stac
50137
50910
  }
50138
50911
  }
50139
50912
  async function provisionResourceBody(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress) {
50140
- const priorAttempts = priorAttemptLookup(logicalId, async () => priorAttemptsInJournal(await engine.stateBackend.loadRollbackJournal(stackName, engine.stackRegion), logicalId, change.resourceType));
50913
+ const loadJournal = () => engine.stateBackend.loadRollbackJournal(stackName, engine.stackRegion);
50914
+ const priorAttempts = priorAttemptLookup(logicalId, async () => priorAttemptsInJournal(await loadJournal(), logicalId, change.resourceType), async () => provenOrphanIdsInJournal(await loadJournal(), logicalId, change.resourceType));
50141
50915
  return withStackRecords(engine.stackRecordsView, () => {
50142
50916
  switch (change.changeType) {
50143
50917
  case "CREATE": return withPriorAttempts(priorAttempts, () => provisionCreate(engine, logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress));
@@ -51743,5 +52517,5 @@ function sameGenerationClaimsOf(record) {
51743
52517
  }
51744
52518
 
51745
52519
  //#endregion
51746
- export { pendingRequestCount as $, malformedLocalResourcesWarning as $a, importableOutputKeys as $c, keepHeldTokenProvenance as $i, resolveApp as $l, destroyStackRecordsView as $n, hasNoCloudControlHandlers as $o, markDeleteStarted as $r, logOnlyValueCount as $s, seedsDeleteFirstGuard as $t, inheritedProvenanceForChildDiff as A, parseWebACLArn as Aa, recordProvenPublicExpression as Ac, deleteSkipReason as Ai, describeDockerCapturedOutput as Al, isWholeDynamicReferenceValue as An, refuseMalformedResourcePropertiesForDestroy as Ao, secretNamePrintingBags as Ar, canonicalCoordinates as As, readRefactorMarkerOnce as At, ownValue as Au, conditionFingerprint as B, accountArgs as Ba, applyCrossPrefixScan as Bc, DiffCalculator as Bi, redactDockerArgvValues as Bl, findDestructiveChanges as Bn, repairMalformedOutputsForReadOnly as Bo, effectiveDeletionPolicy as Br, readbackPathFor as Bs, replayFailedOperations as Bt, hasCdkAutoDeleteTag as C, carriesFetchableDynamicReference as Ca, splitGetAttStringForm as Cc, CloudControlProvider as Ci, parseBootstrapMarker as Cl, exportAliasCollisionScrubWarning as Cn, refuseMalformedResourceAttributesForOrphan as Co, createReadOnlyAttributeHealerFactory as Cr, describeTypeWithThrottleRetry as Cs, sameJournaledOrphans as Ct, describeJsonParseFailure as Cu, IMPLICIT_DELETE_DEPENDENCIES as D, cfnRefValueFromPhysicalId as Da, recordMaskOnlyValuesIn as Dc, UNSPECIFIED_SKIP_REASON as Di, buildDenyExternalAccessPolicy as Dl, carriedExportAliasExposure as Dn, refuseMalformedResourceEntriesForImport as Do, namingSecretsWithRecordedNoEcho as Dr, sameLambdaFunctionAddress as Ds, lookupEachName as Dt, hasOwnKey as Du, markRefusedBeforeApplying as E, AWS_NO_VALUE as Ea, recordMaskOnlyValue as Ec, RollbackInlinePolicyWriters as Ei, validateContainerRepoName as El, secretSafeKeyDisplay as En, refuseMalformedResourceEntriesForDestroy as Eo, maskEventTextWithBoundBags as Er, lambdaFunctionNameForMask as Es, isAccessDeniedError as Et, defineOwnKey as Eu, findNestedTemplateTreeDefect as F, JSON_LISTING_HOLE_VALUE as Fa, isLockInfoExpired as Fc, ec2InstanceProtectionSite as Fi, formatDockerLoginError as Fl, bindingSkippedOutputs as Fn, refuseMalformedResourcesForDestroy as Fo, ATOMIC_FINAL_SNAPSHOT_TYPES as Fr, maskedLeafCoordinatesOf as Fs, updateRefactorMarker as Ft, resolveAssemblyPath as Fu, withResourceDeadline as G, hasReadableResources as Ga, withStackInstanceIdWithheld as Gc, s3BucketArn as Gi, warnFinchArgvExposure as Gl, rollbackOrphanIds as Gn, unreadableOrphanRecords as Go, ledgerForStack as Gr, markSameGenerationBag as Gs, isJournaledOrphan as Gt, parentSuppliedValues as H, displayLogicalId as Ha, isAccessDenied$1 as Hc, IntrinsicFunctionResolver as Hi, redactedDockerCause as Hl, findRefactorHints as Hn, repairMalformedResourcePropertiesForReadOnly as Ho, refusesFinalSnapshot as Hr, recordedNoEchoValuesOf as Hs, removeProtectionTypeList as Ht, isAbsoluteAssetPath as I, STATE_REGION_DIVERGED as Ia, S3StateBackend as Ic, isTerminationProtectionPropagationError as Ii, getDockerCmd as Il, DEFAULT_RESOURCE_TIMEOUT_MS as In, refuseMalformedResourcesForExport as Io, PRE_DELETE_SNAPSHOT_TYPES as Ir, noEchoCoordinatesOf as Is, hasPendingMovesOut as It, injectAwsRegion as Iu, keptWholeReasonText as J, malformedDriftResourcePropertiesWarning as Ja, describeRegionValueKind as Jc, s3BucketRegionalDomainName as Ji, Synthesizer as Jl, looselyEqual as Jn, findActionableSilentDrops as Jo, acquireIdempotencyToken as Jr, snapshotPassProvenance as Js, planRollback as Jt, diffSecurity as K, isReadableOrphanRecord as Ka, splitImportedOps as Kc, s3BucketDomainName as Ki, AssetManifestLoader as Kl, withMovedTo as Kn, unreadableResourceEntries as Ko, reserveStackCreateToken as Kr, redactForState as Ks, isReplacementOrphan as Kt, listNestedTemplateRows as L, STATE_RESOURCES_MALFORMED as La, rebuildClientForBucketRegion as Lc, observeThenDisableInstanceApiTermination as Li, isDockerClientEnvKey as Ll, DEFAULT_RESOURCE_WARN_AFTER_MS as Ln, refuseMalformedState as Lo, buildFinalSnapshotIdentifier as Lr, noEchoLeavesOf as Ls, pendingMovesOutOf as Lt, injectedAwsRegionValue as Lu, findServiceTokenRefusals as M, parameterInputsFor as Ma, WHOLE_DYNAMIC_REFERENCE_PATTERN as Mc, isWaitAbandonedError as Mi, describeDockerFailure as Ml, collectDeclaredOutputNames as Mn, refuseMalformedResourcePropertiesForExport as Mo, secretNamedRecordNeedles as Mr, maskAtCoordinates as Ms, refactorMarkerRefusalMessage as Mt, describeFileReadFailure as Mu, serviceTokenBlockingReason as N, passedParameterClassesOf as Na, isSingleDynamicReferenceToken as Nc, markWaitAbandoned as Ni, dockerSpawnEnvWithSensitive as Nl, collectPublishedOutputNames as Nn, refuseMalformedResourcePropertiesForOrphan as No, stateSecretNameNeedles as Nr, maskReadbackAtCoordinates as Ns, refuseRefactorMarker as Nt, displayAssemblyPath as Nu, computeImplicitDeleteEdges as O, isStalePlaceholderArnAttribute as Oa, recordNoEchoAttributeValues as Oc, deleteIndeterminateGuards as Oi, buildDockerImage as Ol, exportNameNoEchoParameters as On, refuseMalformedResourceEntriesForImportSave as Oo, orphanRecordsPrintingBag as Or, DagBuilder as Os, withApiLimit as Ot, hasPlainPrototype$1 as Ou, childTemplateLoader as P, declaresNoEcho as Pa, LockManager as Pc, disableInstanceApiTermination as Pi, finchSecretArgvRefusal as Pl, isExportAliasCollision as Pn, refuseMalformedResourcesForDeploy as Po, storedSecretNameNeedles as Pr, maskWholeValue as Ps, sameMove as Pt, renderAssemblyPathEscape as Pu, planOrphanAdoption as Q, malformedLocalResourceEntriesWarning as Qa, hasUnverifiableParameterRefusal as Qc, refuseUnreadableCdkCrossAccountRefs as Qi, loadCdkJson as Ql, awaitInFlightSibling as Qn, NO_CC_HANDLERS_REASON as Qo, isRefusedByName as Qr, literalSplitDelimitersOf as Qs, resolveReplacementOldType as Qt, renderNestedTemplateTreeDefect as R, UNREADABLE_ORPHANS_CONTAINER_ROW as Ra, CrossPrefixReadError as Rc, reDisableInstanceApiTermination as Ri, isMalformedEnvKey as Rl, maskingRetryLogger as Rn, repairMalformedOrphanRecordsForReadOnly as Ro, ccRoutedFinalSnapshotError as Rr, noEchoOutputsComparison as Rs, pendingMovesRefusalMessage as Rt, clearBucketRegionCache as Ru, S3_AUTO_DELETE_OBJECTS_TAG as S, carriesDynamicReference as Sa, recordPhysicalNameCopy as Sc, customResourceResponseExpirationWarning as Si, isCrossRegionRedirect as Sl, displayTextOrWithheld as Sn, refuseMalformedOutputsForDestroy as So, noEchoParameterNamesOf as Sr, templateResourceTypes as Ss, makeForeignHolderScan as St, processStackMessages as Su, getPriorAttempts as T, keepsSecretReferenceToken as Ta, provenPublicValue as Tc, unchangedBehindSecretReference as Ti, validateAssetBucketName as Tl, secretBearingStateKeyWarning as Tn, refuseMalformedResourceEntriesForDeploy as To, journaledOrphanPrintingBag as Tr, canonicalLambdaFunctionName as Ts, chunks as Tt, utf8ByteLength as Tu, readRecordedConditionVerdicts as U, hasReadableOrphans as Ua, isNotImplemented as Uc, poisonRenderedSpellingsCollidingIn as Ui, runDockerForeground as Ul, hintSidesOf as Un, repairMalformedResourcesForReadOnly as Uo, unsupportedFinalSnapshotError as Ur, valueAtCoordinate as Us, recordAfterRollbackUpdate as Ut, conditionInputsFrom as V, deployRefusesOrphanRowsReason as Va, crossPrefixDeniedWarning as Vc, INTRINSIC_KEYS as Vi, redactedCause as Vl, formatDestructiveChange as Vn, repairMalformedResourceEntriesForReadOnly as Vo, isFinalSnapshotError as Vr, readsNoEchoSource as Vs, replayRollback as Vt, enclosingDeadlineRemainingMs as W, hasReadableOutputs as Wa, stackInstanceIdOf as Wc, isSettledInstanceState as Wi, runDockerStreaming as Wl, movedToHint as Wn, unpreviewableOrphanRecords as Wo, earliestDefined as Wr, liveMatchesUnresolvedTokenFrame as Ws, demoteSupersededOrphans as Wt, makeCanonicalizePropertiesFn as X, malformedExportSourceWarning as Xa, hasReadableExportSet as Xc, resolveDynamicReferences as Xi, getDefaultStateBucketName as Xl, parseMappingFile as Xn, unwrittenCreateOnlyReplacement as Xo, DeploymentEventsStore as Xr, createUnionSecretMasker as Xs, recordUnderIdIsNotOwn as Xt, mergeNoChangeOutputs as Y, malformedExportNamesWarning as Ya, exportNamesCarriedFrom as Yc, s3BucketWebsiteUrl as Yi, synthesisStatusMessage as Yl, mappingPairs as Yn, findSilentDropProperties as Yo, DeploymentEventsReader as Yr, carryLogOnlyValues as Ys, recheckFailedPlan as Yt, makeSiblingClaimReader as Z, malformedLocalOutputsWarning as Za, hasReasonlessBaselineRefusal as Zc, producerLookupOver as Zi, getLegacyStateBucketName as Zl, proposeRenames as Zn, withoutSilentDropProperties as Zo, extractDeploymentEventError as Zr, hasMaskableValues as Zs, replacementNeverSwapped as Zt, deleteTableWithIndexBusyRetry as _, coerceParameterTypedValue as _a, inheritNestedStackParameterAssociations as _c, isCustomResourceType as _i, AssetModeResolver as _l, computeParameterTaint as _n, refuseMalformedOrphanRecordsForDestroy as _o, supersededResourcesOf as _r, replayWarn as _s, dropFailedCommands as _t, PARTITION_TABLE as _u, isProtectionValueActive as a, assertSendableRoleArn as aa, createSecretMasker as ac, tagMapAsList as ai, stackInstanceIdCarriedFrom as al, isRedactedRecordedValue as an, malformedOutputsRefusalMessage as ao, gray as ar, renderStatefulReason as as, displacedPhysicalIdShown as at, resolveUseCdkBootstrapAssets as au, waitForIndexesSettled as b, getAccountInfo as ba, physicalNameCopiesOf as bc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as bi, ensureAssetStorage as bl, resourcesNamingDeclaredParameter as bn, refuseMalformedOrphansForOrphan as bo, noEchoComparisonForTemplate as br, requireConfigString as bs, journaledOrphanLines as bt, AssemblyReader as bu, DynamoDBGlobalTableProvider as c, sendableAssumeRoleCommand as ca, maskSecretsInText as cc, stringifyIfAssigned as ci, timePhase as cl, updatePartialMessage as cn, malformedResourceEntriesWarning as co, yellow as cr, isWarmThroughputDecrease as cs, nestedChildStackName as ct, ssmResolvedValueType as cu, compensateRemovedDeletionProtection as d, callerEnvCredentials as da, withoutPhysicalNameCopies as dc, ccBrokenReason as di, stringifyValue as dl, nameGenerationHighWaterOf as dn, malformedScrubResourceEntriesRefusalMessage as do, holdsSupersededResources as dr, coerceCfnBoolean as ds, revertedNestedRowIds as dt, MIGRATE_TMP_PREFIX as du, outputReferenceProvenanceOf as ea, printingCorpusOf as ec, DBPROXY_TAGS_WHAT as ei, importableOutputs as el, orphanNeedsIdentity as en, malformedOrphanRecordsRefusalMessage as eo, getStackRecords as er, findReplacedReadersOfRecreateTargets as es, resolvePendingCloudControlRequests as et, resolveAutoAssetStorage as eu, deleteBudgetKey as f, envCredentialsAreAssumedRole as fa, DYNAMIC_REFERENCE_TOKEN_SCAN as fc, isCustomResource as fi, WorkGraph as fl, nameScopeOf as fn, malformedStateRefusalMessage as fo, isSupersededResourceRecord as fr, coerceCfnInteger as fs, withNestedRevertRun as ft, findLargeInlineResources as fu, INDEX_SETTLE_POLL_INTERVAL_MS as g, regionLessSecretName as ga, identityKeyFor as gc, readsNoEchoDeleteValues as gi, rewriteTemplateAssetReferences as gl, withNameGenerationReached as gn, refuseMalformedOrphanRecords as go, supersededHolderOf as gr, readConfigString as gs, deleteJournaledOrphans as gt, expectedOwnerParam as gu, DELETE_INDEX_WAIT_PROCEED_NOTE as h, producerRegionsFromState as ha, pathCrossesDottedKey as hc, TemplateNoEchoReresolver as hi, loadPublishableAssetManifest as hl, retiredNameGenerationsLeaving as hn, refuseMalformedNestedChildOutputs as ho, supersededHeldByOtherTypeWarning as hr, configStringRefusal as hs, withNestedStackContext as ht, decodeListingKey as hu, PROTECTION_PROPERTY_BY_TYPE as i, assertFlagRoleArn as ia, unionOfSecretBags as ic, refuseMalformedDesiredTags as ii, shouldRetainResource as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, malformedOrphansWarning as io, cyan as ir, isStatefulRecreateTargetSync as is, displacedOpClause as it, resolveStateBucketWithDefaultAndSource as iu, deferredServiceTokenWarning as j, withSharedDrainBudget as ja, wholeStringLeavesOf as jc, withIndeterminateGuard as ji, describeDockerExecFailure as jl, noEchoParameterValueSeed as jn, refuseMalformedResourcePropertiesForDrift as jo, secretNamedAttributeNamesOf as jr, isMarkedCoordinate as js, refactorMarkerMovesOf as jt, absoluteAssemblyPathEscape as ju, crossStackOutputProvenanceSource as k, refStateLookupFromResource as ka, recordNoEchoParameterFreshValue as kc, deleteLeftInPlace as ki, resolveDockerContextDirectory as kl, exportNameSecretExposure as kn, refuseMalformedResourceEntriesForOrphan as ko, secretNamePrintingBag as kr, TemplateParser as ks, readRefactorMarker as kt, nullPrototypeRecord as ku, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as l, AWS_CREDENTIAL_ENV_KEYS as la, scrubResourceRecord as lc, CC_BROKEN_REASON as li, AssetPublisher as ll, updatePartialReason as ln, malformedResourcePropertiesWarning as lo, addSuperseded as lr, toCfnInteger as ls, recordDisplacedSkips as lt, CFN_TEMPLATE_BODY_LIMIT as lu, resolveDynamoDbDeleteBudgetMs as m, classifyReplaySecretRegion as ma, isUncertifiedBaselineMaskPosition as mc, waitForLambdaFunctionActive as mi, createAssetRedirectResolver as ml, retiredNameGenerationsAfter as mn, refuseDivergentRecordRegionForDestroy as mo, supersededAfterRollback as mr, configIntegerRefusal as ms, getCurrentNestedStackContext as mt, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as mu, recordedProtectionEvidence as n, recordedReferenceRegions as na, recordLogOnlyValue as nc, planTagDiff as ni, orphansAfterRollback as nl, getCurrentProducerRegions as nn, malformedOrphanRowsKeptWarning as no, replacedDeleteFailureVerdict as nr, MULTI_REGION_RECREATE_BLOCKED_TYPES as ns, recordRetainedForReadoption as nt, resolveSkipPrefix as nu, perType as o, explicitRoleArnOrThrow as oa, errorCauseChain as oc, tagPlanWarning as oi, PhaseClock as ol, redactedDeleteAddressFields as on, malformedOutputsWarning as oo, green as or, WARM_THROUGHPUT_MEMBERS as os, dropSettledNestedJournals as ot, stateBucketExistenceConfirmed as ou, resolveDynamoDbDeleteBudgetClock as p, classifyRecordedSecretRegion as pa, dynamicReferenceTokens as pc, wouldReturnToSdkProvider as pi, buildAssetRedirectMap as pl, retiredAfterRollback as pn, previewableOrphanRecords as po, removeSuperseded as pr, configBooleanRefusal as ps, collectNestedChildUnaddressed as pt, uploadCfnTemplate as pu, isSecretBearingReferenceString as q, isReadableResourceEntry as qa, acceptedCreateOnlyDropsOf as qc, s3BucketDualStackDomainName as qi, getDockerImageBySourceHash as ql, isPairableType as qn, withheldAccountClause as qo, withCreateTokenLedger as qr, recordReferenceProvenanceEntry as qs, planFailedOps as qt, recordedProtectionNote as r, applyRoleArnIfSet as ra, shareLogOnlyValues as rc, readTagList as ri, orphansCarriedFrom as rl, inheritProducerRegions as rn, malformedOrphansRefusalMessage as ro, bold as rr, isStatefulRecreateTargetForReplace as rs, NESTED_PENDING_PARENT_REASON as rt, resolveStateBucketWithDefault as ru, readProtection as s, isIamRoleArn as sa, maskSecretsInError as sc, definedAttributes as si, renderPhaseTimings as sl, redactedDeleteAddressSkip as sn, malformedRenderedContainersWarning as so, red as sr, coerceWarmThroughput as ss, getNestedRevertRun as st, warnDeprecatedNoPrefixCliFlag as su, DeployEngine as t, recordedOutputReferenceRegions as ta, recordLogOnlyParameterValue as tc, DBPROXY_TAG_OPTIONS as ti, isReadableBag as tl, findNestedStackTypeChanges as tn, malformedOrphanRecordsWarning as to, withStackRecords as tr, shownType as ts, keptForRetainedRecord as tt, resolveCaptureObservedState as tu, beginDeleteWait as u, applyCallerIdentityCredentials as ua, withPhysicalNameCopies as uc, ProviderRegistry as ui, isSensitiveAttributeName as ul, nameGenerationCarriedFrom as un, malformedResourcesWarning as uo, deleteSupersededEntry as ur, toFiniteNumber as us, revertNestedChildFromJournal as ut, CFN_TEMPLATE_URL_LIMIT as uu, maskedLogger as v, isUnboundTemplateParameter as va, recordNestedStackParameterExpressions as vc, getCurrentResourceSecrets as vi, BOOTSTRAP_MARKER_PREFIX as vl, namesAnyDeclaredParameter as vn, refuseMalformedOrphans as vo, withoutSuperseded as vr, requireConfigArray as vs, dropFailedHint as vt, canonicalizeRegion as vu, isTruthyCfnBoolean as w, isNamelessDynamicReferenceError as wa, carriesSecretMask as wc, slowCcOperationTimeoutMs as wi, readBootstrapMarkerBody as wl, secretBearing as wn, refuseMalformedResourceEntries as wo, completedReplayEntries as wr, withRetry as ws, formatResourceLine as wt, parseFailureDebugDetail as wu, ECR_AUTO_DELETE_IMAGES_TAG as x, isImpossibleEmptyStoredAttribute as xa, recordAttributeIdCopy as xc, applyCustomResourceResponseExpiration as xi, getBootstrapMarkerKey as xl, WITHHELD_NAME_DISPLAY as xn, refuseMalformedOutputs as xo, noEchoExactEchoLeavesOf as xr, prefetchCreateOnlyPropertyPaths as xs, loadJournaledOrphans as xt, StageLoadError as xu, relayedIndexBusyDelete as y, parameterTypeMayLoseSecretIdentity as ya, recoverMaskedOutput as yc, withPrintingSecrets as yi, assertAssetBucketRegion as yl, reachableDivergentParameters as yn, refuseMalformedOrphansForDestroy as yo, noEchoAttributeNamesOf as yr, requireConfigObject as ys, isHandledOrphan as yt, derivePartitionAndUrlSuffix as yu, templateIdentity as z, UNREADABLE_RESOURCES_MAP_ROW as za, CrossPrefixScanCache as zc, reEnableInstanceApiTermination as zi, partitionSensitiveEnv as zl, constructPathOf as zn, repairMalformedOrphansForReadOnly as zo, createPreDeleteFinalSnapshot as zr, passedNoEchoParametersOf as zs, refusePendingMovesOut as zt, resolveBucketRegion as zu };
51747
- //# sourceMappingURL=deploy-engine-BdqMXegu.js.map
52520
+ export { planOrphanAdoption as $, malformedLocalOutputsWarning as $a, hasReadableExportSet as $c, refuseUnreadableCdkCrossAccountRefs as $i, getDefaultStateBucketName as $l, awaitInFlightSibling as $n, withoutSilentDropProperties as $o, isRefusedByName as $r, hasMaskableValues as $s, resolveReplacementOldType as $t, inheritedProvenanceForChildDiff as A, lacksRecordedTableArn as Aa, recordMaskOnlyValuesIn as Ac, deleteLeftInPlace as Ai, buildDenyExternalAccessPolicy as Al, exportNameSecretExposure as An, refuseMalformedResourceEntriesForImportSave as Ao, secretNamePrintingBag as Ar, DagBuilder as As, readRefactorMarker as At, hasOwnKey as Au, conditionFingerprint as B, UNREADABLE_ORPHANS_CONTAINER_ROW as Ba, rebuildClientForBucketRegion as Bc, reEnableInstanceApiTermination as Bi, isDockerClientEnvKey as Bl, constructPathOf as Bn, repairMalformedOrphanRecordsForReadOnly as Bo, createPreDeleteFinalSnapshot as Br, noEchoOutputsComparison as Bs, refusePendingMovesOut as Bt, injectedAwsRegionValue as Bu, hasCdkAutoDeleteTag as C, carriesDynamicReference as Ca, physicalNameCopiesOf as Cc, customResourceResponseExpirationWarning as Ci, ensureAssetStorage as Cl, displayTextOrWithheld as Cn, refuseMalformedOutputs as Co, noEchoParameterNamesOf as Cr, prefetchCreateOnlyPropertyPaths as Cs, makeForeignHolderScan as Ct, AssemblyReader as Cu, IMPLICIT_DELETE_DEPENDENCIES as D, AWS_NO_VALUE as Da, carriesSecretMask as Dc, RollbackInlinePolicyWriters as Di, readBootstrapMarkerBody as Dl, secretSafeKeyDisplay as Dn, refuseMalformedResourceEntriesForDeploy as Do, maskEventTextWithBoundBags as Dr, canonicalLambdaFunctionName as Ds, isAccessDeniedError as Dt, parseFailureDebugDetail as Du, markRefusedBeforeApplying as E, keepsSecretReferenceToken as Ea, splitGetAttStringForm as Ec, unchangedBehindSecretReference as Ei, parseBootstrapMarker as El, secretBearingStateKeyWarning as En, refuseMalformedResourceEntries as Eo, journaledOrphanPrintingBag as Er, withRetry as Es, chunks as Et, describeJsonParseFailure as Eu, findNestedTemplateTreeDefect as F, passedParameterClassesOf as Fa, WHOLE_DYNAMIC_REFERENCE_PATTERN as Fc, disableInstanceApiTermination as Fi, describeDockerFailure as Fl, isExportAliasCollision as Fn, refuseMalformedResourcePropertiesForOrphan as Fo, storedSecretNameNeedles as Fr, maskReadbackAtCoordinates as Fs, sameMove as Ft, describeFileReadFailure as Fu, enclosingDeadlineRemainingMs as G, hasReadableOrphans as Ga, isAccessDenied$1 as Gc, isSettledInstanceState as Gi, redactedDockerCause as Gl, movedToHint as Gn, repairMalformedResourcesForReadOnly as Go, earliestDefined as Gr, valueAtCoordinate as Gs, demoteSupersededOrphans as Gt, parentSuppliedValues as H, accountArgs as Ha, CrossPrefixScanCache as Hc, INTRINSIC_KEYS as Hi, partitionSensitiveEnv as Hl, formatDestructiveChange as Hn, repairMalformedOutputsForReadOnly as Ho, isFinalSnapshotError as Hr, readbackPathFor as Hs, replayRollback as Ht, resolveBucketRegion as Hu, isAbsoluteAssetPath as I, declaresNoEcho as Ia, isSingleDynamicReferenceToken as Ic, ec2InstanceProtectionSite as Ii, dockerSpawnEnvWithSensitive as Il, bindingSkippedOutputs as In, refuseMalformedResourcesForDeploy as Io, ATOMIC_FINAL_SNAPSHOT_TYPES as Ir, maskWholeValue as Is, updateRefactorMarker as It, displayAssemblyPath as Iu, isSecretBearingReferenceString as J, isReadableOrphanRecord as Ja, withStackInstanceIdWithheld as Jc, s3BucketDualStackDomainName as Ji, warnFinchArgvExposure as Jl, isPairableType as Jn, unreadableResourceEntries as Jo, withCreateTokenLedger as Jr, redactForState as Js, planFailedOps as Jt, withResourceDeadline as K, hasReadableOutputs as Ka, isNotImplemented as Kc, s3BucketArn as Ki, runDockerForeground as Kl, rollbackOrphanIds as Kn, unpreviewableOrphanRecords as Ko, ledgerForStack as Kr, liveMatchesUnresolvedTokenFrame as Ks, isJournaledOrphan as Kt, listNestedTemplateRows as L, JSON_LISTING_HOLE_VALUE as La, LockManager as Lc, isTerminationProtectionPropagationError as Li, finchSecretArgvRefusal as Ll, DEFAULT_RESOURCE_TIMEOUT_MS as Ln, refuseMalformedResourcesForDestroy as Lo, PRE_DELETE_SNAPSHOT_TYPES as Lr, maskedLeafCoordinatesOf as Ls, hasPendingMovesOut as Lt, renderAssemblyPathEscape as Lu, findServiceTokenRefusals as M, parseWebACLArn as Ma, recordNoEchoParameterFreshValue as Mc, withIndeterminateGuard as Mi, resolveDockerContextDirectory as Ml, noEchoParameterValueSeed as Mn, refuseMalformedResourcePropertiesForDestroy as Mo, secretNamedAttributeNamesOf as Mr, canonicalCoordinates as Ms, refactorMarkerMovesOf as Mt, nullPrototypeRecord as Mu, serviceTokenBlockingReason as N, withSharedDrainBudget as Na, recordProvenPublicExpression as Nc, isWaitAbandonedError as Ni, describeDockerCapturedOutput as Nl, collectDeclaredOutputNames as Nn, refuseMalformedResourcePropertiesForDrift as No, secretNamedRecordNeedles as Nr, isMarkedCoordinate as Ns, refactorMarkerRefusalMessage as Nt, ownValue as Nu, computeImplicitDeleteEdges as O, cfnRefValueFromPhysicalId as Oa, provenPublicValue as Oc, UNSPECIFIED_SKIP_REASON as Oi, validateAssetBucketName as Ol, carriedExportAliasExposure as On, refuseMalformedResourceEntriesForDestroy as Oo, namingSecretsWithRecordedNoEcho as Or, lambdaFunctionNameForMask as Os, lookupEachName as Ot, utf8ByteLength as Ou, childTemplateLoader as P, parameterInputsFor as Pa, wholeStringLeavesOf as Pc, markWaitAbandoned as Pi, describeDockerExecFailure as Pl, collectPublishedOutputNames as Pn, refuseMalformedResourcePropertiesForExport as Po, stateSecretNameNeedles as Pr, maskAtCoordinates as Ps, refuseRefactorMarker as Pt, absoluteAssemblyPathEscape as Pu, makeSiblingClaimReader as Q, malformedExportSourceWarning as Qa, exportNamesCarriedFrom as Qc, producerLookupOver as Qi, synthesisStatusMessage as Ql, proposeRenames as Qn, unwrittenCreateOnlyReplacement as Qo, extractDeploymentEventError as Qr, createUnionSecretMasker as Qs, replacementNeverSwapped as Qt, renderNestedTemplateTreeDefect as R, STATE_REGION_DIVERGED as Ra, isLockInfoExpired as Rc, observeThenDisableInstanceApiTermination as Ri, formatDockerLoginError as Rl, DEFAULT_RESOURCE_WARN_AFTER_MS as Rn, refuseMalformedResourcesForExport as Ro, buildFinalSnapshotIdentifier as Rr, noEchoCoordinatesOf as Rs, pendingMovesOutOf as Rt, resolveAssemblyPath as Ru, S3_AUTO_DELETE_OBJECTS_TAG as S, isImpossibleEmptyStoredAttribute as Sa, recoverMaskedOutput as Sc, applyCustomResourceResponseExpiration as Si, assertAssetBucketRegion as Sl, WITHHELD_NAME_DISPLAY as Sn, refuseMalformedOrphansForOrphan as So, noEchoExactEchoLeavesOf as Sr, requireConfigString as Ss, loadJournaledOrphans as St, derivePartitionAndUrlSuffix as Su, getPriorAttempts as T, isNamelessDynamicReferenceError as Ta, recordPhysicalNameCopy as Tc, slowCcOperationTimeoutMs as Ti, isCrossRegionRedirect as Tl, secretBearing as Tn, refuseMalformedResourceAttributesForOrphan as To, completedReplayEntries as Tr, describeTypeWithThrottleRetry as Ts, formatResourceLine as Tt, processStackMessages as Tu, readRecordedConditionVerdicts as U, deployRefusesOrphanRowsReason as Ua, applyCrossPrefixScan as Uc, IntrinsicFunctionResolver as Ui, redactDockerArgvValues as Ul, findRefactorHints as Un, repairMalformedResourceEntriesForReadOnly as Uo, refusesFinalSnapshot as Ur, readsNoEchoSource as Us, removeProtectionTypeList as Ut, conditionInputsFrom as V, UNREADABLE_RESOURCES_MAP_ROW as Va, CrossPrefixReadError as Vc, DiffCalculator as Vi, isMalformedEnvKey as Vl, findDestructiveChanges as Vn, repairMalformedOrphansForReadOnly as Vo, effectiveDeletionPolicy as Vr, passedNoEchoParametersOf as Vs, replayFailedOperations as Vt, clearBucketRegionCache as Vu, enclosingDeadlineExpired as W, displayLogicalId as Wa, crossPrefixDeniedWarning as Wc, poisonRenderedSpellingsCollidingIn as Wi, redactedCause as Wl, hintSidesOf as Wn, repairMalformedResourcePropertiesForReadOnly as Wo, unsupportedFinalSnapshotError as Wr, recordedNoEchoValuesOf as Ws, recordAfterRollbackUpdate as Wt, mergeNoChangeOutputs as X, malformedDriftResourcePropertiesWarning as Xa, acceptedCreateOnlyDropsOf as Xc, s3BucketWebsiteUrl as Xi, getDockerImageBySourceHash as Xl, mappingPairs as Xn, findActionableSilentDrops as Xo, DeploymentEventsReader as Xr, snapshotPassProvenance as Xs, recheckFailedPlan as Xt, keptWholeReasonText as Y, isReadableResourceEntry as Ya, splitImportedOps as Yc, s3BucketRegionalDomainName as Yi, AssetManifestLoader as Yl, looselyEqual as Yn, withheldAccountClause as Yo, acquireIdempotencyToken as Yr, recordReferenceProvenanceEntry as Ys, planRollback as Yt, makeCanonicalizePropertiesFn as Z, malformedExportNamesWarning as Za, describeRegionValueKind as Zc, resolveDynamicReferences as Zi, Synthesizer as Zl, parseMappingFile as Zn, findSilentDropProperties as Zo, DeploymentEventsStore as Zr, carryLogOnlyValues as Zs, recordUnderIdIsNotOwn as Zt, deleteTableWithIndexBusyRetry as _, regionLessSecretName as _a, pathCrossesDottedKey as _c, readsNoEchoDeleteValues as _i, createAssetRedirectResolver as _l, withNameGenerationReached as _n, refuseMalformedNestedChildOutputs as _o, supersededHolderOf as _r, configStringRefusal as _s, deleteJournaledOrphans as _t, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as _u, isProtectionValueActive as a, assertFlagRoleArn as aa, shareLogOnlyValues as ac, refuseMalformedDesiredTags as ai, orphansAfterRollback as al, REDACTED_DELETE_ADDRESS_SKIP_REASON as an, malformedOrphansRefusalMessage as ao, cyan as ar, isStatefulRecreateTargetForReplace as as, displacedOpClause as at, resolveSkipPrefix as au, waitForIndexesSettled as b, parameterTypeMayLoseSecretIdentity as ba, inheritNestedStackParameterAssociations as bc, withPrintingSecrets as bi, AssetModeResolver as bl, reachableDivergentParameters as bn, refuseMalformedOrphans as bo, noEchoAttributeNamesOf as br, requireConfigArray as bs, isHandledOrphan as bt, PARTITION_TABLE as bu, DynamoDBGlobalTableProvider as c, isIamRoleArn as ca, errorCauseChain as cc, definedAttributes as ci, stackInstanceIdCarriedFrom as cl, redactedDeleteAddressSkip as cn, malformedOutputsWarning as co, red as cr, WARM_THROUGHPUT_MEMBERS as cs, getNestedRevertRun as ct, resolveUseCdkBootstrapAssets as cu, compensateRemovedDeletionProtection as d, applyCallerIdentityCredentials as da, scrubResourceRecord as dc, ProviderRegistry as di, timePhase as dl, nameGenerationCarriedFrom as dn, malformedResourcePropertiesWarning as do, deleteSupersededEntry as dr, toCfnInteger as ds, revertNestedChildFromJournal as dt, ssmResolvedValueType as du, keepHeldTokenProvenance as ea, literalSplitDelimitersOf as ec, markDeleteStarted as ei, hasReasonlessBaselineRefusal as el, seedsDeleteFirstGuard as en, malformedLocalResourceEntriesWarning as eo, destroyStackRecordsView as er, NO_CC_HANDLERS_REASON as es, pendingRequestCount as et, getLegacyStateBucketName as eu, deleteBudgetKey as f, callerEnvCredentials as fa, withPhysicalNameCopies as fc, ccBrokenReason as fi, AssetPublisher as fl, nameGenerationHighWaterOf as fn, malformedResourcesWarning as fo, holdsSupersededResources as fr, toFiniteNumber as fs, revertedNestedRowIds as ft, CFN_TEMPLATE_BODY_LIMIT as fu, INDEX_SETTLE_POLL_INTERVAL_MS as g, producerRegionsFromState as ga, isUncertifiedBaselineMaskPosition as gc, TemplateNoEchoReresolver as gi, buildAssetRedirectMap as gl, retiredNameGenerationsLeaving as gn, refuseDivergentRecordRegionForDestroy as go, supersededHeldByOtherTypeWarning as gr, configIntegerRefusal as gs, withNestedStackContext as gt, uploadCfnTemplate as gu, DELETE_INDEX_WAIT_PROCEED_NOTE as h, classifyReplaySecretRegion as ha, dynamicReferenceTokens as hc, waitForLambdaFunctionActive as hi, WorkGraph as hl, retiredNameGenerationsAfter as hn, previewableOrphanRecords as ho, supersededAfterRollback as hr, configBooleanRefusal as hs, getCurrentNestedStackContext as ht, findLargeInlineResources as hu, PROTECTION_PROPERTY_BY_TYPE as i, applyRoleArnIfSet as ia, recordLogOnlyValue as ic, readTagList as ii, isReadableBag as il, inheritProducerRegions as in, malformedOrphanRowsKeptWarning as io, bold as ir, MULTI_REGION_RECREATE_BLOCKED_TYPES as is, NESTED_PENDING_PARENT_REASON as it, resolveCaptureObservedState as iu, deferredServiceTokenWarning as j, refStateLookupFromResource as ja, recordNoEchoAttributeValues as jc, deleteSkipReason as ji, buildDockerImage as jl, isWholeDynamicReferenceValue as jn, refuseMalformedResourceEntriesForOrphan as jo, secretNamePrintingBags as jr, TemplateParser as js, readRefactorMarkerOnce as jt, hasPlainPrototype$1 as ju, crossStackOutputProvenanceSource as k, isStalePlaceholderArnAttribute as ka, recordMaskOnlyValue as kc, deleteIndeterminateGuards as ki, validateContainerRepoName as kl, exportNameNoEchoParameters as kn, refuseMalformedResourceEntriesForImport as ko, orphanRecordsPrintingBag as kr, sameLambdaFunctionAddress as ks, withApiLimit as kt, defineOwnKey as ku, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as l, sendableAssumeRoleCommand as la, maskSecretsInError as lc, stringifyIfAssigned as li, PhaseClock as ll, updatePartialMessage as ln, malformedRenderedContainersWarning as lo, yellow as lr, coerceWarmThroughput as ls, nestedChildStackName as lt, stateBucketExistenceConfirmed as lu, resolveDynamoDbDeleteBudgetMs as m, classifyRecordedSecretRegion as ma, DYNAMIC_REFERENCE_TOKEN_SCAN as mc, wouldReturnToSdkProvider as mi, stringifyValue as ml, retiredAfterRollback as mn, malformedStateRefusalMessage as mo, removeSuperseded as mr, coerceCfnInteger as ms, collectNestedChildUnaddressed as mt, MIGRATE_TMP_PREFIX as mu, recordedProtectionEvidence as n, recordedOutputReferenceRegions as na, printingCorpusOf as nc, DBPROXY_TAG_OPTIONS as ni, importableOutputKeys as nl, findNestedStackTypeChanges as nn, malformedOrphanRecordsRefusalMessage as no, withStackRecords as nr, findReplacedReadersOfRecreateTargets as ns, keptForRetainedRecord as nt, resolveApp as nu, perType as o, assertSendableRoleArn as oa, unionOfSecretBags as oc, tagMapAsList as oi, orphansCarriedFrom as ol, isRedactedRecordedValue as on, malformedOrphansWarning as oo, gray as or, isStatefulRecreateTargetSync as os, displacedPhysicalIdShown as ot, resolveStateBucketWithDefault as ou, resolveDynamoDbDeleteBudgetClock as p, envCredentialsAreAssumedRole as pa, withoutPhysicalNameCopies as pc, isCustomResource as pi, isSensitiveAttributeName as pl, nameScopeOf as pn, malformedScrubResourceEntriesRefusalMessage as po, isSupersededResourceRecord as pr, coerceCfnBoolean as ps, withNestedRevertRun as pt, CFN_TEMPLATE_URL_LIMIT as pu, diffSecurity as q, hasReadableResources as qa, stackInstanceIdOf as qc, s3BucketDomainName as qi, runDockerStreaming as ql, withMovedTo as qn, unreadableOrphanRecords as qo, reserveStackCreateToken as qr, markSameGenerationBag as qs, isReplacementOrphan as qt, recordedProtectionNote as r, recordedReferenceRegions as ra, recordLogOnlyParameterValue as rc, planTagDiff as ri, importableOutputs as rl, getCurrentProducerRegions as rn, malformedOrphanRecordsWarning as ro, replacedDeleteFailureVerdict as rr, shownType as rs, recordRetainedForReadoption as rt, resolveAutoAssetStorage as ru, readProtection as s, explicitRoleArnOrThrow as sa, createSecretMasker as sc, tagPlanWarning as si, shouldRetainResource as sl, redactedDeleteAddressFields as sn, malformedOutputsRefusalMessage as so, green as sr, renderStatefulReason as ss, dropSettledNestedJournals as st, resolveStateBucketWithDefaultAndSource as su, DeployEngine as t, outputReferenceProvenanceOf as ta, logOnlyValueCount as tc, DBPROXY_TAGS_WHAT as ti, hasUnverifiableParameterRefusal as tl, orphanNeedsIdentity as tn, malformedLocalResourcesWarning as to, getStackRecords as tr, hasNoCloudControlHandlers as ts, resolvePendingCloudControlRequests as tt, loadCdkJson as tu, beginDeleteWait as u, AWS_CREDENTIAL_ENV_KEYS as ua, maskSecretsInText as uc, CC_BROKEN_REASON as ui, renderPhaseTimings as ul, updatePartialReason as un, malformedResourceEntriesWarning as uo, addSuperseded as ur, isWarmThroughputDecrease as us, recordDisplacedSkips as ut, warnDeprecatedNoPrefixCliFlag as uu, maskedLogger as v, coerceParameterTypedValue as va, spelledKeysOf as vc, isCustomResourceType as vi, loadPublishableAssetManifest as vl, computeParameterTaint as vn, refuseMalformedOrphanRecords as vo, supersededResourcesOf as vr, readConfigString as vs, dropFailedCommands as vt, decodeListingKey as vu, isTruthyCfnBoolean as w, carriesFetchableDynamicReference as wa, recordAttributeIdCopy as wc, CloudControlProvider as wi, getBootstrapMarkerKey as wl, exportAliasCollisionScrubWarning as wn, refuseMalformedOutputsForDestroy as wo, createReadOnlyAttributeHealerFactory as wr, templateResourceTypes as ws, sameJournaledOrphans as wt, StageLoadError as wu, ECR_AUTO_DELETE_IMAGES_TAG as x, getAccountInfo as xa, recordNestedStackParameterExpressions as xc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as xi, BOOTSTRAP_MARKER_PREFIX as xl, resourcesNamingDeclaredParameter as xn, refuseMalformedOrphansForDestroy as xo, noEchoComparisonForTemplate as xr, requireConfigObject as xs, journaledOrphanLines as xt, canonicalizeRegion as xu, relayedIndexBusyDelete as y, isUnboundTemplateParameter as ya, identityKeyFor as yc, getCurrentResourceSecrets as yi, rewriteTemplateAssetReferences as yl, namesAnyDeclaredParameter as yn, refuseMalformedOrphanRecordsForDestroy as yo, withoutSuperseded as yr, replayWarn as ys, dropFailedHint as yt, expectedOwnerParam as yu, templateIdentity as z, STATE_RESOURCES_MALFORMED as za, S3StateBackend as zc, reDisableInstanceApiTermination as zi, getDockerCmd as zl, maskingRetryLogger as zn, refuseMalformedState as zo, ccRoutedFinalSnapshotError as zr, noEchoLeavesOf as zs, pendingMovesRefusalMessage as zt, injectAwsRegion as zu };
52521
+ //# sourceMappingURL=deploy-engine-BOgsnnk0.js.map