@go-to-k/cdkd 0.296.30 → 0.297.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.
@@ -2,10 +2,10 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js"
2
2
  import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-BaWeCWRz.js";
3
3
  import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Cz2tPxXk.js";
4
4
  import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-D0q0z4dG.js";
5
- import { t as getCdkdVersion } from "./version-B__YmKBy.js";
5
+ import { t as getCdkdVersion } from "./version-DE-djeB0.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
- import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
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";
9
9
  import { CloudControlClient, CreateResourceCommand, DeleteResourceCommand, GetResourceCommand, GetResourceRequestStatusCommand, ListResourcesCommand, UpdateResourceCommand } from "@aws-sdk/client-cloudcontrol";
10
10
  import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
11
11
  import { GetFunctionCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
@@ -204,17 +204,37 @@ var AppExecutor = class {
204
204
 
205
205
  //#endregion
206
206
  //#region src/types/assembly.ts
207
- function parseEnvironment(env) {
208
- const match = env.match(/^aws:\/\/([^/]+)\/(.+)$/);
207
+ const ASSEMBLY_REGION_PREFIX = /^[a-z0-9-]+/;
208
+ const CDK_ENVIRONMENT_PATTERN = /aws:\/\/([a-zA-Z0-9@._-]+)\/([a-z0-9-]+)/;
209
+ const CANONICAL_ASSEMBLY_REGION = /^[a-z0-9-]+$/;
210
+ function parseEnvironment(env, stackName) {
211
+ const match = env.match(/^aws:\/\/([^/]+)\/([\s\S]+)$/);
209
212
  if (!match) return {
210
213
  account: "unknown-account",
211
214
  region: "unknown-region"
212
215
  };
213
- return {
216
+ const raw = match[2];
217
+ const region = ASSEMBLY_REGION_PREFIX.exec(raw)?.[0];
218
+ if (region !== void 0) return {
214
219
  account: match[1] === "unknown-account" ? "unknown-account" : match[1],
215
- region: match[2] === "unknown-region" ? "unknown-region" : match[2]
220
+ region
221
+ };
222
+ const cdk = CDK_ENVIRONMENT_PATTERN.exec(env);
223
+ if (cdk === null) throw new SynthesisError(unparsableRegionMessage(raw, stackName));
224
+ return {
225
+ account: cdk[1],
226
+ region: cdk[2]
216
227
  };
217
228
  }
229
+ function unparsableRegionMessage(region, stackName) {
230
+ const subject = stackName === void 0 ? "The cloud assembly" : `Stack ${displayStackName(stackName)} in the cloud assembly`;
231
+ const lower = region.toLowerCase();
232
+ const caseOnly = CANONICAL_ASSEMBLY_REGION.test(lower);
233
+ const fix = caseOnly ? `Re-synthesize with the region spelled ${displayIdent(lower)}.` : "Re-synthesize with a canonical region, e.g. env: { region: 'us-east-1' }.";
234
+ const head = `${subject} declares region ${displayIdent(region)}, which is not a canonical AWS region spelling (lowercase letters, digits and '-'). The AWS CDK CLI refuses this assembly too ("Unable to parse environment specification"). ${fix}`;
235
+ if (!caseOnly) return head;
236
+ return `${head}\nIf an earlier cdkd version deployed this stack from such an assembly, it recorded the stack's state under that raw region spelling, and a deploy using the canonical spelling will not find that state: it starts the stack from no state at all. 'cdkd state show' and 'cdkd state orphan' still reach that record when '--stack-region' is given the exact raw spelling; 'state orphan' removes the record and leaves its AWS resources in place, unmanaged by cdkd.`;
237
+ }
218
238
 
219
239
  //#endregion
220
240
  //#region src/utils/assembly-path.ts
@@ -606,7 +626,7 @@ var AssemblyReader = class {
606
626
  }
607
627
  if (dependencyNames.length > 0) this.logger.debug(`Stack ${displayStackName(stackName)} depends on: [${dependencyNames.map((n) => displaySafe(n)).join(", ")}]`);
608
628
  let env;
609
- if (artifact.environment) env = parseEnvironment(artifact.environment);
629
+ if (artifact.environment) env = parseEnvironment(artifact.environment, stackName);
610
630
  const nestedTemplates = nullPrototypeRecord();
611
631
  for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
612
632
  if (resource?.Type !== "AWS::CloudFormation::Stack") continue;
@@ -5000,7 +5020,7 @@ function isNotImplemented(error) {
5000
5020
  const status = error?.$metadata?.httpStatusCode;
5001
5021
  return name === "NotImplemented" || status === 501;
5002
5022
  }
5003
- function isAccessDenied(error) {
5023
+ function isAccessDenied$1(error) {
5004
5024
  let current = error;
5005
5025
  for (let depth = 0; depth < 5 && current !== null && typeof current === "object"; depth++) {
5006
5026
  const name = current.name;
@@ -5028,7 +5048,7 @@ async function scanOtherPrefixesForStack(target, stackName, region) {
5028
5048
  try {
5029
5049
  segments = await target.listTopLevelPrefixes();
5030
5050
  } catch (error) {
5031
- return isAccessDenied(error) ? {
5051
+ return isAccessDenied$1(error) ? {
5032
5052
  kind: "denied",
5033
5053
  error,
5034
5054
  stage: "list"
@@ -5051,7 +5071,7 @@ async function scanOtherPrefixesForStack(target, stackName, region) {
5051
5071
  if (held === "holder") found.push(prefix);
5052
5072
  else if (held === "empty") stale.push(prefix);
5053
5073
  } catch (error) {
5054
- if (isAccessDenied(error)) denied ??= error;
5074
+ if (isAccessDenied$1(error)) denied ??= error;
5055
5075
  else failed ??= error;
5056
5076
  }
5057
5077
  }
@@ -5491,7 +5511,7 @@ var S3StateBackend = class S3StateBackend {
5491
5511
  async verifyBucketExists(options = {}) {
5492
5512
  await this.ensureClientForBucket();
5493
5513
  if (options.existenceAlreadyProbed) {
5494
- this.logger.debug(`Skipping the redundant HeadBucket on '${this.config.bucket}' — the default-name resolution already confirmed it exists with these credentials (issue #1283).`);
5514
+ this.logger.debug(`Skipping the redundant HeadBucket on '${this.config.bucket}' — the default-name resolution already confirmed it exists with these credentials.`);
5495
5515
  return;
5496
5516
  }
5497
5517
  try {
@@ -13794,7 +13814,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
13794
13814
  ["Description", "CFn-only informational — no semantic effect on the recursive deploy"],
13795
13815
  ["DisableRollback", "CFn-only — cdkd controls rollback via the top-level deploy-engine --no-rollback flag, not per nested stack"],
13796
13816
  ["EnableTerminationProtection", "CFn-only per-nested-stack flag — cdkd records stack-level terminationProtection at CDK synth time (parent only) and `cdkd destroy` consults that for refusal"],
13797
- ["NotificationARNs", "CFn-only SNS-on-stack-event surface — cdkd has no equivalent (issue #459 design §9)"],
13817
+ ["NotificationARNs", "CFn-only SNS-on-stack-event surface — cdkd has no equivalent"],
13798
13818
  ["RoleARN", "CFn-only role-assumption — cdkd uses the caller credentials directly, no per-resource role assumption"],
13799
13819
  ["StackName", "cdkd derives the child stack name as `<parent>~<logicalId>` per design §3 (state-key uniqueness); a user-provided StackName has no effect"],
13800
13820
  ["StackPolicyBody", "CFn-only stack-update policy — cdkd has no equivalent (per-resource diff replaces stack-level policy)"],
@@ -13802,7 +13822,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
13802
13822
  ["StackStatusReason", "CFn-only read-only output — never a real input property"],
13803
13823
  ["Tags", "CFn-only — cdkd does not tag the synthesized \"stack\" (the parent's synthesized ARN is a cdkd-local placeholder, not a real AWS resource)"],
13804
13824
  ["TemplateBody", "CFn-only inline template — cdkd reads the child template from the synth output via Metadata['aws:asset:path'] instead of accepting it inline"],
13805
- ["TimeoutInMinutes", "CFn-only stack-create deadline — cdkd uses per-resource --resource-timeout instead (issue #459 design §9)"]
13825
+ ["TimeoutInMinutes", "CFn-only stack-create deadline — cdkd uses per-resource --resource-timeout instead"]
13806
13826
  ]),
13807
13827
  createOnlyDrops: /* @__PURE__ */ new Set(["StackName"]),
13808
13828
  readOnly: /* @__PURE__ */ new Set([
@@ -14578,7 +14598,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
14578
14598
  "PosixUser",
14579
14599
  "RootDirectory"
14580
14600
  ]),
14581
- silentDrop: /* @__PURE__ */ new Map([["ClientToken", "cdkd supplies its own retry-stable ClientToken on CreateAccessPoint (issues #2039 and #2080), so a template-supplied value would be overwritten. The SDK does not own this field either: measured against @aws-sdk/client-efs 3.1018.0, an omitted ClientToken is auto-filled with a FRESH uuid per attempt, which leaves a retried 500 free to mint a second access point, while a caller-supplied value goes on the wire verbatim."]]),
14601
+ silentDrop: /* @__PURE__ */ new Map([["ClientToken", "cdkd supplies its own retry-stable ClientToken on CreateAccessPoint, so a template-supplied value would be overwritten. The SDK does not own this field either: an omitted ClientToken is auto-filled with a FRESH uuid per attempt, which leaves a retried 500 free to mint a second access point, while a caller-supplied value goes on the wire verbatim."]]),
14582
14602
  createOnlyDrops: /* @__PURE__ */ new Set(["ClientToken"]),
14583
14603
  readOnly: /* @__PURE__ */ new Set(["AccessPointId", "Arn"]),
14584
14604
  ccRouteUnavailable: false
@@ -14598,7 +14618,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
14598
14618
  "ProvisionedThroughputInMibps",
14599
14619
  "ThroughputMode"
14600
14620
  ]),
14601
- silentDrop: /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider. Tracked as a follow-up to issue #609."]]),
14621
+ silentDrop: /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider."]]),
14602
14622
  createOnlyDrops: /* @__PURE__ */ new Set(),
14603
14623
  readOnly: /* @__PURE__ */ new Set(["Arn", "FileSystemId"]),
14604
14624
  ccRouteUnavailable: false
@@ -15528,7 +15548,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
15528
15548
  ["DBClusterParameterGroupName", "not yet implemented by cdkd"],
15529
15549
  ["DBInstanceParameterGroupName", "not yet implemented by cdkd"],
15530
15550
  ["DBSystemId", "not yet implemented by cdkd"],
15531
- ["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it (issue #3993); kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot (issue #1352), which this flag does not control"],
15551
+ ["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it; kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot, which this flag does not control"],
15532
15552
  ["Domain", "not yet implemented by cdkd"],
15533
15553
  ["DomainIAMRoleName", "not yet implemented by cdkd"],
15534
15554
  ["EnableCloudwatchLogsExports", "not yet implemented by cdkd"],
@@ -15628,7 +15648,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
15628
15648
  ["DBSnapshotIdentifier", "not yet implemented by cdkd"],
15629
15649
  ["DBSystemId", "not yet implemented by cdkd"],
15630
15650
  ["DedicatedLogVolume", "not yet implemented by cdkd"],
15631
- ["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it (issue #3993); kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot (issue #1352), which this flag does not control"],
15651
+ ["DeleteAutomatedBackups", "delete-time flag, sent on the delete when the record carries it; kept unhandled so a template declaring it keeps its Cloud Control route. Final snapshots are governed by DeletionPolicy: Snapshot, which this flag does not control"],
15632
15652
  ["Domain", "not yet implemented by cdkd"],
15633
15653
  ["DomainAuthSecretArn", "not yet implemented by cdkd"],
15634
15654
  ["DomainDnsIps", "not yet implemented by cdkd"],
@@ -19651,7 +19671,7 @@ function recordSecretNamedRead(logicalId, value, context) {
19651
19671
  }
19652
19672
  function rejectPlaceholderArnAttribute(resource, attributeName, value, logicalId, context, healOutcome) {
19653
19673
  if (!isStalePlaceholderArnAttribute(resource.resourceType, attributeName, value)) return;
19654
- throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: the recorded value ${quotedRender(stringifyValue(this.maskValueLeaves(value, context)), "\"")} is a placeholder written by a cdkd version older than issue #1681 — its region and account fields are literal wildcards, so it is not a usable ARN. ` + this.staleRecordRemedy(healOutcome, context)));
19674
+ throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: the recorded value ${quotedRender(stringifyValue(this.maskValueLeaves(value, context)), "\"")} is a placeholder written by an older cdkd version — its region and account fields are literal wildcards, so it is not a usable ARN. ` + this.staleRecordRemedy(healOutcome, context)));
19655
19675
  }
19656
19676
  async function constructAttribute(resource, attributeName, context, logicalId, accountInfo) {
19657
19677
  const { resourceType, physicalId } = resource;
@@ -20922,7 +20942,7 @@ async function resolveSplit(splitArgs, context) {
20922
20942
  const source = this.describeSplitValueSource(value);
20923
20943
  const sourceClause = source ? ` (from ${this.displayMasked(source.label, context)})` : "";
20924
20944
  if (Array.isArray(resolvedValue)) {
20925
- const remedy = source?.kind === "ref" ? "A list-typed parameter — any List<...> type (List<AWS::EC2::Subnet::Id>, List<Number>, …) or CommaDelimitedList — is already a list." : source?.kind === "getatt" ? "A list-valued Fn::GetAtt (for example AWS::Route53::HostedZone.NameServers or AWS::EC2::VPC.Ipv6CidrBlocks) already returns a list. If you wrote the Fn::Split as a workaround for cdkd resolving that attribute to a comma-delimited string, that bug is fixed (PR #1868) and the workaround is no longer needed." : "Several intrinsics already return a list — among them a list-valued Fn::GetAtt, a Ref to a list-typed parameter (any List<...> type or CommaDelimitedList), Fn::GetAZs, Fn::Cidr, and Fn::Split itself.";
20945
+ const remedy = source?.kind === "ref" ? "A list-typed parameter — any List<...> type (List<AWS::EC2::Subnet::Id>, List<Number>, …) or CommaDelimitedList — is already a list." : source?.kind === "getatt" ? "A list-valued Fn::GetAtt (for example AWS::Route53::HostedZone.NameServers or AWS::EC2::VPC.Ipv6CidrBlocks) already returns a list. If you wrote the Fn::Split as a workaround for cdkd resolving that attribute to a comma-delimited string, that bug is fixed and the workaround is no longer needed." : "Several intrinsics already return a list — among them a list-valued Fn::GetAtt, a Ref to a list-typed parameter (any List<...> type or CommaDelimitedList), Fn::GetAZs, Fn::Cidr, and Fn::Split itself.";
20926
20946
  throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Split: the value to split${sourceClause} is ALREADY a list (an array of ${resolvedValue.length} item${resolvedValue.length === 1 ? "" : "s"}), not a string. CloudFormation rejects Fn::Split over a list too, so this template is not valid CloudFormation either. Remove the Fn::Split and use the value directly. ${remedy}`));
20927
20947
  }
20928
20948
  throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Split: the value to split${sourceClause} must be a string, got ${resolvedValue === null ? "null" : typeof resolvedValue}. Fn::Split accepts only a string; check the value or the intrinsic that produced it.`));
@@ -22347,7 +22367,7 @@ var DiffCalculator = class DiffCalculator {
22347
22367
  requiresReplacement: await this.maskedEditRequiresReplacement(desiredResource.Type, key, oldValue, newValue),
22348
22368
  maskedExpressionChanged: true
22349
22369
  });
22350
- this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed (go-to-k/cdkd#4451, go-to-k/cdkd#4543)`);
22370
+ this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed`);
22351
22371
  }
22352
22372
  const attributeChanges = this.compareAttributes(currentResource, desiredResource);
22353
22373
  if (propertyChanges.length > 0 || attributeChanges.length > 0) {
@@ -23125,9 +23145,167 @@ function escapeRegExp$1(text) {
23125
23145
  return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
23126
23146
  }
23127
23147
 
23148
+ //#endregion
23149
+ //#region src/provisioning/getatt-attributes.generated.ts
23150
+ const WRITABLE_GETATT_ATTRIBUTES = {
23151
+ "AWS::Amplify::Branch": ["BranchName"],
23152
+ "AWS::Amplify::Domain": [
23153
+ "AutoSubDomainCreationPatterns",
23154
+ "AutoSubDomainIAMRole",
23155
+ "DomainName",
23156
+ "EnableAutoSubDomain"
23157
+ ],
23158
+ "AWS::AppMesh::GatewayRoute": [
23159
+ "GatewayRouteName",
23160
+ "MeshName",
23161
+ "MeshOwner",
23162
+ "VirtualGatewayName"
23163
+ ],
23164
+ "AWS::AppMesh::Mesh": ["MeshName"],
23165
+ "AWS::AppMesh::Route": [
23166
+ "MeshName",
23167
+ "MeshOwner",
23168
+ "RouteName",
23169
+ "VirtualRouterName"
23170
+ ],
23171
+ "AWS::AppMesh::VirtualGateway": [
23172
+ "MeshName",
23173
+ "MeshOwner",
23174
+ "VirtualGatewayName"
23175
+ ],
23176
+ "AWS::AppMesh::VirtualNode": [
23177
+ "MeshName",
23178
+ "MeshOwner",
23179
+ "VirtualNodeName"
23180
+ ],
23181
+ "AWS::AppMesh::VirtualRouter": [
23182
+ "MeshName",
23183
+ "MeshOwner",
23184
+ "VirtualRouterName"
23185
+ ],
23186
+ "AWS::AppMesh::VirtualService": [
23187
+ "MeshName",
23188
+ "MeshOwner",
23189
+ "VirtualServiceName"
23190
+ ],
23191
+ "AWS::AppSync::DataSource": ["Name"],
23192
+ "AWS::AppSync::DomainName": ["DomainName"],
23193
+ "AWS::AppSync::FunctionConfiguration": ["DataSourceName", "Name"],
23194
+ "AWS::AppSync::Resolver": ["FieldName", "TypeName"],
23195
+ "AWS::Backup::BackupSelection": ["BackupPlanId"],
23196
+ "AWS::Backup::BackupVault": ["BackupVaultName"],
23197
+ "AWS::CleanRooms::AnalysisTemplate": ["Schema"],
23198
+ "AWS::Cloud9::EnvironmentEC2": ["Name"],
23199
+ "AWS::CloudWatch::InsightRule": ["RuleName"],
23200
+ "AWS::CodeArtifact::Domain": ["EncryptionKey"],
23201
+ "AWS::CodeArtifact::Repository": ["DomainName", "DomainOwner"],
23202
+ "AWS::EC2::CapacityReservation": [
23203
+ "AvailabilityZone",
23204
+ "InstanceType",
23205
+ "Tenancy"
23206
+ ],
23207
+ "AWS::EC2::Instance": ["AvailabilityZone"],
23208
+ "AWS::EC2::SecurityGroup": ["VpcId"],
23209
+ "AWS::EC2::Subnet": [
23210
+ "AvailabilityZone",
23211
+ "AvailabilityZoneId",
23212
+ "CidrBlock",
23213
+ "OutpostArn",
23214
+ "VpcId"
23215
+ ],
23216
+ "AWS::EC2::VPC": ["CidrBlock"],
23217
+ "AWS::EFS::MountTarget": ["IpAddress"],
23218
+ "AWS::EKS::Nodegroup": ["ClusterName", "NodegroupName"],
23219
+ "AWS::ElasticLoadBalancingV2::LoadBalancer": ["SecurityGroups"],
23220
+ "AWS::EventSchemas::Discoverer": ["CrossAccount"],
23221
+ "AWS::EventSchemas::Registry": ["RegistryName"],
23222
+ "AWS::EventSchemas::Schema": ["SchemaName"],
23223
+ "AWS::Events::EventBus": ["Name"],
23224
+ "AWS::GameLift::GameSessionQueue": ["Name"],
23225
+ "AWS::GameLift::MatchmakingConfiguration": ["Name"],
23226
+ "AWS::GameLift::MatchmakingRuleSet": ["Name"],
23227
+ "AWS::Grafana::Workspace": ["GrafanaVersion"],
23228
+ "AWS::Greengrass::ConnectorDefinition": ["Name"],
23229
+ "AWS::Greengrass::CoreDefinition": ["Name"],
23230
+ "AWS::Greengrass::DeviceDefinition": ["Name"],
23231
+ "AWS::Greengrass::FunctionDefinition": ["Name"],
23232
+ "AWS::Greengrass::Group": ["Name", "RoleArn"],
23233
+ "AWS::Greengrass::LoggerDefinition": ["Name"],
23234
+ "AWS::Greengrass::ResourceDefinition": ["Name"],
23235
+ "AWS::Greengrass::SubscriptionDefinition": ["Name"],
23236
+ "AWS::ImageBuilder::Component": ["Name"],
23237
+ "AWS::ImageBuilder::ContainerRecipe": ["Name"],
23238
+ "AWS::ImageBuilder::DistributionConfiguration": ["Name"],
23239
+ "AWS::ImageBuilder::ImagePipeline": ["Name"],
23240
+ "AWS::ImageBuilder::ImageRecipe": ["Name"],
23241
+ "AWS::ImageBuilder::InfrastructureConfiguration": ["Name"],
23242
+ "AWS::Kinesis::StreamConsumer": ["ConsumerName", "StreamARN"],
23243
+ "AWS::MSK::Cluster": ["CurrentVersion"],
23244
+ "AWS::ManagedBlockchain::Member": ["NetworkId"],
23245
+ "AWS::ManagedBlockchain::Node": ["MemberId", "NetworkId"],
23246
+ "AWS::MediaConvert::JobTemplate": ["Name"],
23247
+ "AWS::MediaConvert::Preset": ["Name"],
23248
+ "AWS::MediaConvert::Queue": ["Name"],
23249
+ "AWS::OpsWorks::Instance": ["AvailabilityZone"],
23250
+ "AWS::OpsWorks::UserProfile": ["SshUsername"],
23251
+ "AWS::QuickSight::Analysis": ["Errors", "Sheets"],
23252
+ "AWS::RDS::DBInstance": ["DBSystemId"],
23253
+ "AWS::RDS::DBParameterGroup": ["DBParameterGroupName"],
23254
+ "AWS::RedshiftServerless::Workgroup": ["Workgroup"],
23255
+ "AWS::RoboMaker::RobotApplication": ["CurrentRevisionId"],
23256
+ "AWS::RoboMaker::SimulationApplication": ["CurrentRevisionId"],
23257
+ "AWS::Route53Resolver::ResolverEndpoint": [
23258
+ "Direction",
23259
+ "Name",
23260
+ "OutpostArn",
23261
+ "PreferredInstanceType",
23262
+ "ResolverEndpointType"
23263
+ ],
23264
+ "AWS::Route53Resolver::ResolverRule": [
23265
+ "DomainName",
23266
+ "Name",
23267
+ "ResolverEndpointId",
23268
+ "TargetIps"
23269
+ ],
23270
+ "AWS::Route53Resolver::ResolverRuleAssociation": [
23271
+ "Name",
23272
+ "ResolverRuleId",
23273
+ "VPCId"
23274
+ ],
23275
+ "AWS::S3::AccessPoint": ["Name"],
23276
+ "AWS::SNS::Topic": ["TopicName"],
23277
+ "AWS::SQS::Queue": ["QueueName"],
23278
+ "AWS::SSM::Parameter": ["Type"],
23279
+ "AWS::SSM::ResourceDataSync": ["SyncName"],
23280
+ "AWS::SageMaker::CodeRepository": ["CodeRepositoryName"],
23281
+ "AWS::SageMaker::Endpoint": ["EndpointName"],
23282
+ "AWS::SageMaker::EndpointConfig": ["EndpointConfigName"],
23283
+ "AWS::SageMaker::Model": ["ModelName"],
23284
+ "AWS::SageMaker::ModelPackage": ["LastModifiedTime"],
23285
+ "AWS::SageMaker::NotebookInstance": ["NotebookInstanceName"],
23286
+ "AWS::SageMaker::NotebookInstanceLifecycleConfig": ["NotebookInstanceLifecycleConfigName"],
23287
+ "AWS::SageMaker::Workteam": ["WorkteamName"],
23288
+ "AWS::ServiceDiscovery::Service": ["Name"],
23289
+ "AWS::Signer::SigningProfile": ["ProfileName"],
23290
+ "AWS::StepFunctions::Activity": ["Name"],
23291
+ "AWS::Transfer::User": ["ServerId", "UserName"]
23292
+ };
23293
+
23128
23294
  //#endregion
23129
23295
  //#region src/provisioning/read-only-properties.ts
23130
23296
  const readOnlyPropertiesCache = /* @__PURE__ */ new Map();
23297
+ const attributeNamesCache = /* @__PURE__ */ new Map();
23298
+ async function getTopLevelAttributeNames(resourceType) {
23299
+ const readOnly = await getTopLevelReadOnlyProperties(resourceType);
23300
+ if (readOnly === void 0) return void 0;
23301
+ const writable = Object.hasOwn(WRITABLE_GETATT_ATTRIBUTES, resourceType) ? WRITABLE_GETATT_ATTRIBUTES[resourceType] : void 0;
23302
+ if (!writable || writable.length === 0) return readOnly;
23303
+ const cached = attributeNamesCache.get(resourceType);
23304
+ if (cached) return cached;
23305
+ const names = /* @__PURE__ */ new Set([...readOnly, ...writable]);
23306
+ attributeNamesCache.set(resourceType, names);
23307
+ return names;
23308
+ }
23131
23309
  function getTopLevelReadOnlyProperties(resourceType) {
23132
23310
  if (hasNoRegistrySchema(resourceType)) return Promise.resolve(void 0);
23133
23311
  const cached = readOnlyPropertiesCache.get(resourceType);
@@ -23710,7 +23888,7 @@ var CloudControlProvider = class {
23710
23888
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
23711
23889
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
23712
23890
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
23713
- const { ASGProvider } = await import("./asg-provider-BaabA371.js");
23891
+ const { ASGProvider } = await import("./asg-provider-D9Po293s.js");
23714
23892
  const delegateRegion = ambientRegion();
23715
23893
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
23716
23894
  if (asgProvider === void 0) {
@@ -23816,7 +23994,7 @@ var CloudControlProvider = class {
23816
23994
  const family = SDK_DELETE_FAMILIES.get(resourceType);
23817
23995
  const cached = this.sdkDeleteDelegates.get(family);
23818
23996
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
23819
- const provider = family === "rds" ? new (await (import("./rds-provider-IBY6fDvN.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-5yc_bOJ-.js"))).NeptuneProvider({ region: ccRegion });
23997
+ const provider = family === "rds" ? new (await (import("./rds-provider-CU0LZr05.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-xROL9y31.js"))).NeptuneProvider({ region: ccRegion });
23820
23998
  this.sdkDeleteDelegates.set(family, {
23821
23999
  region: ccRegion,
23822
24000
  provider
@@ -24501,7 +24679,7 @@ var CloudControlProvider = class {
24501
24679
  async maskUncertifiedModelValues(model, resourceType, physicalId) {
24502
24680
  const safeType = displaySafe(resourceType, { asciiOnly: true });
24503
24681
  const safeId = displaySafe(physicalId, { asciiOnly: true });
24504
- const attributeNames = await getTopLevelReadOnlyProperties(resourceType);
24682
+ const attributeNames = await getTopLevelAttributeNames(resourceType);
24505
24683
  if (attributeNames === void 0) {
24506
24684
  if (!this.warnedUnresolvableSchemaTypes.has(resourceType)) {
24507
24685
  this.warnedUnresolvableSchemaTypes.add(resourceType);
@@ -24515,7 +24693,7 @@ var CloudControlProvider = class {
24515
24693
  masked[key] = maskLeavesDeep(value);
24516
24694
  maskedCount++;
24517
24695
  }
24518
- if (maskedCount > 0 && attributeNames !== void 0) this.logger.debug(`Masked ${maskedCount} non-attribute key(s) out of the ${safeType} Cloud Control model for ${safeId}: they are not in the type's readOnlyProperties, so CloudFormation would reject an Fn::GetAtt naming them and cdkd has no evidence they are safe to persist.`);
24696
+ if (maskedCount > 0 && attributeNames !== void 0) this.logger.debug(`Masked ${maskedCount} non-attribute key(s) out of the ${safeType} Cloud Control model for ${safeId}: they are not Fn::GetAtt attributes of the type, so CloudFormation would reject an Fn::GetAtt naming them and cdkd has no evidence they are safe to persist.`);
24519
24697
  return masked;
24520
24698
  }
24521
24699
  };
@@ -24626,6 +24804,124 @@ function maskLeavesDeep(value) {
24626
24804
  return "***";
24627
24805
  }
24628
24806
 
24807
+ //#endregion
24808
+ //#region src/state/state-bucket-lifecycle.ts
24809
+ const CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID = "cdkd-custom-resource-responses-expiration";
24810
+ const CUSTOM_RESOURCE_RESPONSE_EXPIRATION_DAYS = 1;
24811
+ const CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX = `${CUSTOM_RESOURCE_RESPONSE_PREFIX}/cdkd-1`;
24812
+ function buildCustomResourceResponseLifecycleRule(legacyPrefix) {
24813
+ const prefix = CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX;
24814
+ return {
24815
+ ID: CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID,
24816
+ Status: "Enabled",
24817
+ ...legacyPrefix ? { Prefix: prefix } : { Filter: { Prefix: prefix } },
24818
+ Expiration: { Days: 1 },
24819
+ NoncurrentVersionExpiration: { NoncurrentDays: 1 }
24820
+ };
24821
+ }
24822
+ async function applyCustomResourceResponseExpiration(s3, bucket, opts = {}) {
24823
+ const owner = opts.expectedBucketOwner ? { ExpectedBucketOwner: opts.expectedBucketOwner } : {};
24824
+ const first = await readLifecycle(s3, bucket, owner);
24825
+ if ("failed" in first) return first.failed;
24826
+ if (first.rules.some((rule) => rule.ID === "cdkd-custom-resource-responses-expiration")) return { status: "present" };
24827
+ let collision;
24828
+ try {
24829
+ collision = await findStateUnderResponsePrefix(s3, bucket, owner);
24830
+ } catch (error) {
24831
+ return failedOutcome("ListObjectsV2", error);
24832
+ }
24833
+ if (collision !== void 0) return {
24834
+ status: "refused",
24835
+ reason: `${CUSTOM_RESOURCE_RESPONSE_PREFIX}/${displaySafe(collision) || "<unrenderable>"} holds objects other than custom-resource responses (a stack deployed with --state-prefix ${CUSTOM_RESOURCE_RESPONSE_PREFIX}), and the rule would expire them`
24836
+ };
24837
+ const latest = await readLifecycle(s3, bucket, owner);
24838
+ if ("failed" in latest) return latest.failed;
24839
+ if (latest.rules.some((rule) => rule.ID === "cdkd-custom-resource-responses-expiration")) return { status: "present" };
24840
+ const existing = latest.rules;
24841
+ const minimumObjectSize = latest.minimumObjectSize;
24842
+ const legacyPrefix = existing.some((rule) => rule.Prefix !== void 0);
24843
+ try {
24844
+ await s3.send(new PutBucketLifecycleConfigurationCommand({
24845
+ Bucket: bucket,
24846
+ ...owner,
24847
+ LifecycleConfiguration: { Rules: [...existing, buildCustomResourceResponseLifecycleRule(legacyPrefix)] },
24848
+ ...minimumObjectSize !== void 0 && { TransitionDefaultMinimumObjectSize: minimumObjectSize }
24849
+ }));
24850
+ } catch (error) {
24851
+ return failedOutcome("PutBucketLifecycleConfiguration", error);
24852
+ }
24853
+ return { status: "added" };
24854
+ }
24855
+ async function readLifecycle(s3, bucket, owner) {
24856
+ try {
24857
+ const current = await s3.send(new GetBucketLifecycleConfigurationCommand({
24858
+ Bucket: bucket,
24859
+ ...owner
24860
+ }));
24861
+ return {
24862
+ rules: current.Rules ?? [],
24863
+ minimumObjectSize: current.TransitionDefaultMinimumObjectSize
24864
+ };
24865
+ } catch (error) {
24866
+ if (error?.name === "NoSuchLifecycleConfiguration") return {
24867
+ rules: [],
24868
+ minimumObjectSize: void 0
24869
+ };
24870
+ return { failed: failedOutcome("GetBucketLifecycleConfiguration", error) };
24871
+ }
24872
+ }
24873
+ function isAccessDenied(error) {
24874
+ const e = error;
24875
+ return e?.name === "AccessDenied" || e?.$metadata?.httpStatusCode === 403;
24876
+ }
24877
+ function failedOutcome(operation, error) {
24878
+ return {
24879
+ status: "failed",
24880
+ reason: failureReason(operation, error),
24881
+ accessDenied: isAccessDenied(error)
24882
+ };
24883
+ }
24884
+ async function findStateUnderResponsePrefix(s3, bucket, owner) {
24885
+ let token;
24886
+ do {
24887
+ const page = await s3.send(new ListObjectsV2Command({
24888
+ Bucket: bucket,
24889
+ ...owner,
24890
+ Prefix: CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_PREFIX,
24891
+ Delimiter: "/",
24892
+ EncodingType: "url",
24893
+ ...token !== void 0 && { ContinuationToken: token }
24894
+ }));
24895
+ const first = decodeListingKey(page.CommonPrefixes?.find((p) => p.Prefix)?.Prefix);
24896
+ if (first !== void 0) return first.slice(CUSTOM_RESOURCE_RESPONSE_PREFIX.length + 1);
24897
+ token = page.IsTruncated ? page.NextContinuationToken : void 0;
24898
+ } while (token !== void 0);
24899
+ }
24900
+ function failureReason(operation, error) {
24901
+ return `${operation} failed: ${displaySafe(describeAwsFailure(error).detail) || "<unrenderable>"}`;
24902
+ }
24903
+ function customResourceResponseExpirationWarning(bucket, outcome) {
24904
+ const remedy = outcome.status === "refused" ? `To add the rule, move that stack to a different --state-prefix.` : outcome.accessDenied ? "To add the rule, grant s3:GetLifecycleConfiguration, s3:PutLifecycleConfiguration and s3:ListBucket on the bucket, and check that this account owns it." : `To add the rule, review the bucket's lifecycle configuration against the reason above.`;
24905
+ return `Could not add the ${1}-day expiration lifecycle rule for ${CUSTOM_RESOURCE_RESPONSE_PREFIX}/ to state bucket ${displaySafe(bucket, { asciiOnly: true }) || "<unrenderable>"} (${outcome.reason}). The bucket's lifecycle configuration was left unchanged. Custom-resource response objects left by an interrupted run stay until 'cdkd gc' removes them. ${remedy}`;
24906
+ }
24907
+ const ensured = /* @__PURE__ */ new Map();
24908
+ function ensureCustomResourceResponseExpirationOnce(s3, bucket, log) {
24909
+ const memo = ensured.get(bucket);
24910
+ if (memo) return memo;
24911
+ const run = (async () => {
24912
+ try {
24913
+ const owner = await expectedOwnerParam(s3);
24914
+ const outcome = await applyCustomResourceResponseExpiration(s3, bucket, { ...owner.ExpectedBucketOwner && { expectedBucketOwner: owner.ExpectedBucketOwner } });
24915
+ if (outcome.status === "failed" || outcome.status === "refused") log.warn(customResourceResponseExpirationWarning(bucket, outcome));
24916
+ else if (outcome.status === "added") log.debug(`Added the ${1}-day expiration lifecycle rule for ${CUSTOM_RESOURCE_RESPONSE_PREFIX}/ to the state bucket.`);
24917
+ } catch (error) {
24918
+ log.warn(customResourceResponseExpirationWarning(bucket, failedOutcome("lifecycle check", error)));
24919
+ }
24920
+ })();
24921
+ ensured.set(bucket, run);
24922
+ return run;
24923
+ }
24924
+
24629
24925
  //#endregion
24630
24926
  //#region src/deployment/resource-secrets-scope.ts
24631
24927
  const currentResourceSecretsStore = new AsyncLocalStorage();
@@ -25779,6 +26075,7 @@ var CustomResourceProvider = class CustomResourceProvider {
25779
26075
  if (!this.responseBucket) return "https://localhost/cfn-response-not-configured";
25780
26076
  await this.ensureResponseClient();
25781
26077
  const bucket = this.responseBucket;
26078
+ if (this.responsePrefix === "custom-resource-responses") ensureCustomResourceResponseExpirationOnce(this.s3Client, bucket, this.logger);
25782
26079
  try {
25783
26080
  await withRetry(() => this.s3Client.send(new PutObjectCommand({
25784
26081
  Bucket: bucket,
@@ -28615,6 +28912,162 @@ const PRINCIPAL_KINDS = {
28615
28912
  "AWS::IAM::Group": "group",
28616
28913
  "AWS::IAM::User": "user"
28617
28914
  };
28915
+ function isInlinePolicyPrincipalType(resourceType) {
28916
+ return Object.hasOwn(PRINCIPAL_KINDS, resourceType);
28917
+ }
28918
+ function principalKindOf(resourceType) {
28919
+ return Object.hasOwn(PRINCIPAL_KINDS, resourceType) ? PRINCIPAL_KINDS[resourceType] : void 0;
28920
+ }
28921
+ const ANY = "*";
28922
+ const PRINCIPAL_NAME_FIELDS = {
28923
+ role: "RoleName",
28924
+ group: "GroupName",
28925
+ user: "UserName"
28926
+ };
28927
+ function nameKey(value) {
28928
+ return typeof value === "string" && IAM_NAME.test(value) ? value.toLowerCase() : ANY;
28929
+ }
28930
+ function templatePrincipalKeys(entry, kind, templateResources, stateResources) {
28931
+ if (typeof entry === "string") return [nameKey(entry)];
28932
+ const ref = typeof entry === "object" && entry !== null && !Array.isArray(entry) ? entry["Ref"] : void 0;
28933
+ if (typeof ref !== "string" || !Object.hasOwn(templateResources, ref)) return [ANY];
28934
+ const target = templateResources[ref];
28935
+ if (principalKindOf(target.Type) !== kind) return [ANY];
28936
+ return principalSelfKeys(ref, kind, target, stateResources);
28937
+ }
28938
+ function principalSelfKeys(logicalId, kind, template, stateResources) {
28939
+ const keys = [`ref:${logicalId}`];
28940
+ const declared = template?.Properties?.[PRINCIPAL_NAME_FIELDS[kind]];
28941
+ const declaredKey = nameKey(declared);
28942
+ if (declaredKey !== ANY) keys.push(declaredKey);
28943
+ const record = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
28944
+ if (record !== void 0 && principalKindOf(record.resourceType) === kind) {
28945
+ const recordedKey = nameKey(record.physicalId);
28946
+ if (recordedKey !== ANY) keys.push(recordedKey);
28947
+ }
28948
+ return keys;
28949
+ }
28950
+ function policiesNames(policies) {
28951
+ if (policies === void 0 || policies === null) return [];
28952
+ if (!Array.isArray(policies)) return [ANY];
28953
+ return policies.map((entry) => typeof entry === "object" && entry !== null && !Array.isArray(entry) ? nameKey(entry["PolicyName"]) : ANY);
28954
+ }
28955
+ function inlinePolicyClaimsOf(logicalId, change, templateResources, stateResources) {
28956
+ const template = Object.hasOwn(templateResources, logicalId) ? templateResources[logicalId] : void 0;
28957
+ const record = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
28958
+ const recorded = record?.resourceType === change.resourceType ? record : void 0;
28959
+ const claims = [];
28960
+ const cross = (kind, principals, names) => {
28961
+ for (const principal of new Set(principals)) for (const name of new Set(names)) claims.push({
28962
+ kind,
28963
+ principal,
28964
+ name
28965
+ });
28966
+ };
28967
+ if (change.resourceType === "AWS::IAM::Policy") {
28968
+ const desired = template?.Properties ?? {};
28969
+ const old = recorded?.properties ?? {};
28970
+ const names = [];
28971
+ if (desired["PolicyName"] !== void 0) names.push(nameKey(desired["PolicyName"]));
28972
+ if (old["PolicyName"] !== void 0) names.push(nameKey(old["PolicyName"]));
28973
+ if (recorded !== void 0) names.push(nameKey(typeof recorded.physicalId === "string" ? recorded.physicalId.split(":")[0] : recorded.physicalId));
28974
+ if (names.length === 0) return claims;
28975
+ for (const kind of [
28976
+ "role",
28977
+ "group",
28978
+ "user"
28979
+ ]) {
28980
+ const field = POLICY_LIST_FIELDS[kind];
28981
+ const principals = [];
28982
+ const listed = desired[field];
28983
+ if (Array.isArray(listed)) for (const entry of listed) principals.push(...templatePrincipalKeys(entry, kind, templateResources, stateResources));
28984
+ else if (listed !== void 0) principals.push(ANY);
28985
+ const held = old[field];
28986
+ if (Array.isArray(held)) principals.push(...held.map(nameKey));
28987
+ else if (held !== void 0 && held !== null) principals.push(ANY);
28988
+ cross(kind, principals, names);
28989
+ }
28990
+ return claims;
28991
+ }
28992
+ const kind = principalKindOf(change.resourceType);
28993
+ if (kind === void 0) return claims;
28994
+ if (!(change.changeType === "CREATE" || (change.propertyChanges ?? []).some((c) => c.requiresReplacement) || ownPoliciesChange(change))) return claims;
28995
+ cross(kind, principalSelfKeys(logicalId, kind, template, stateResources), [...policiesNames(template?.Properties?.["Policies"]), ...policiesNames(recorded?.properties?.["Policies"])]);
28996
+ return claims;
28997
+ }
28998
+ function orderInlinePolicyWriters(args) {
28999
+ const { writes, changes, templateResources, stateResources, dependencies, rank } = args;
29000
+ const writers = writes.filter((id) => {
29001
+ const type = changes.get(id)?.resourceType;
29002
+ return type === "AWS::IAM::Policy" || type !== void 0 && isInlinePolicyPrincipalType(type);
29003
+ });
29004
+ if (writers.length < 2) return [];
29005
+ const exact = /* @__PURE__ */ new Map();
29006
+ const loose = [];
29007
+ const all = [];
29008
+ for (const id of writers) for (const claim of inlinePolicyClaimsOf(id, changes.get(id), templateResources, stateResources)) {
29009
+ all.push({
29010
+ id,
29011
+ claim
29012
+ });
29013
+ if (claim.principal === ANY || claim.name === ANY) {
29014
+ loose.push({
29015
+ id,
29016
+ claim
29017
+ });
29018
+ continue;
29019
+ }
29020
+ const key = JSON.stringify([
29021
+ claim.kind,
29022
+ claim.principal,
29023
+ claim.name
29024
+ ]);
29025
+ const ids = exact.get(key) ?? /* @__PURE__ */ new Set();
29026
+ ids.add(id);
29027
+ exact.set(key, ids);
29028
+ }
29029
+ const principalRows = new Set(writers.filter((id) => isInlinePolicyPrincipalType(changes.get(id).resourceType)));
29030
+ const pairs = /* @__PURE__ */ new Map();
29031
+ const pair = (a, b) => {
29032
+ if (a === b || principalRows.has(a) && principalRows.has(b)) return;
29033
+ const [x, y] = rank(a) < rank(b) || rank(a) === rank(b) && a < b ? [a, b] : [b, a];
29034
+ pairs.set(JSON.stringify([x, y]), [x, y]);
29035
+ };
29036
+ for (const ids of exact.values()) {
29037
+ const list = [...ids];
29038
+ for (let i = 0; i < list.length; i++) for (let j = i + 1; j < list.length; j++) pair(list[i], list[j]);
29039
+ }
29040
+ const meets = (a, b) => a === ANY || b === ANY || a === b;
29041
+ for (const { id, claim } of loose) for (const other of all) {
29042
+ if (other.claim.kind !== claim.kind) continue;
29043
+ if (meets(claim.principal, other.claim.principal) && meets(claim.name, other.claim.name)) pair(id, other.id);
29044
+ }
29045
+ if (pairs.size === 0) return [];
29046
+ const reaches = (from, to) => {
29047
+ const seen = /* @__PURE__ */ new Set();
29048
+ const stack = [from];
29049
+ while (stack.length > 0) {
29050
+ const id = stack.pop();
29051
+ if (id === to) return true;
29052
+ if (seen.has(id)) continue;
29053
+ seen.add(id);
29054
+ for (const dep of dependencies.get(id) ?? []) stack.push(dep);
29055
+ }
29056
+ return false;
29057
+ };
29058
+ const added = [];
29059
+ for (const [before, after] of pairs.values()) {
29060
+ if (reaches(after, before) || reaches(before, after)) continue;
29061
+ const deps = dependencies.get(after) ?? /* @__PURE__ */ new Set();
29062
+ deps.add(before);
29063
+ dependencies.set(after, deps);
29064
+ added.push({
29065
+ before,
29066
+ after
29067
+ });
29068
+ }
29069
+ return added;
29070
+ }
28618
29071
  function ownPoliciesChange(change) {
28619
29072
  return (change?.propertyChanges ?? []).some((c) => c.path === "Policies" && c.inPlacePropagated !== true && c.replacementPropagated !== true);
28620
29073
  }
@@ -29490,13 +29943,55 @@ function secretNamesReadBy(logicalId, record, resources, judge = () => ({
29490
29943
  const bags = judge(otherId);
29491
29944
  const needles = secretNameNeedlesOf(otherId, other, bags.secrets, { embedded: bags.embedded });
29492
29945
  if (needles === void 0) continue;
29493
- for (const needle of needles) if (leaves.some((leaf) => leaf === needle || needle.length >= 4 && leaf.includes(needle))) read.add(needle);
29946
+ for (const needle of needles) if (leavesHoldNeedle(leaves, needle)) read.add(needle);
29494
29947
  }
29495
29948
  return read;
29496
29949
  }
29950
+ function leavesHoldNeedle(leaves, needle) {
29951
+ return leaves.some((leaf) => leaf === needle || needle.length >= 4 && leaf.includes(needle));
29952
+ }
29497
29953
  function stateSecretNameNeedles(resources, secrets) {
29498
29954
  return (logicalId) => secretNameNeedlesOf(logicalId, Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0, secrets, { embedded: void 0 });
29499
29955
  }
29956
+ function storedRecordNameNeedles(logicalId, record, secrets) {
29957
+ const needles = secretNameNeedlesOf(logicalId, record, secrets, { embedded: void 0 });
29958
+ if (needles === void 0) return void 0;
29959
+ const bag = secrets !== void 0 && hasMaskableValues(secrets) ? secrets : void 0;
29960
+ const mask = (text) => bag === void 0 ? text : maskSecretsInText(text, bag);
29961
+ const folded = /* @__PURE__ */ new Map();
29962
+ if (bag !== void 0) for (const needle of printingCorpusOf(bag).keys()) recordLogOnlyValue(folded, needle.toLowerCase());
29963
+ const maskFolded = (text) => hasMaskableValues(folded) ? maskSecretsInText(text.toLowerCase(), folded) : text.toLowerCase();
29964
+ const publicLeaves = [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "" && !leaf.includes("{{resolve:") && leaf !== "***" && !isSecretDerivedValue(leaf.toLowerCase(), maskFolded) && !isSecretDerivedValue(leaf, mask));
29965
+ for (const needle of [...needles]) if (leavesHoldNeedle(publicLeaves, needle)) needles.delete(needle);
29966
+ return needles.size > 0 ? needles : void 0;
29967
+ }
29968
+ function storedSecretNameNeedles(resources, secrets, bag = /* @__PURE__ */ new Map(), outputs) {
29969
+ const named = [];
29970
+ for (const [logicalId, record] of Object.entries(resources)) {
29971
+ const needles = storedRecordNameNeedles(logicalId, record, secrets);
29972
+ if (needles !== void 0) named.push([logicalId, needles]);
29973
+ }
29974
+ if (named.length === 0) return bag;
29975
+ const readers = Object.entries(resources).map(([readerId, record]) => [readerId, [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "")]);
29976
+ readers.push([void 0, [...wholeStringLeavesOf(outputs)].filter((leaf) => leaf !== "")]);
29977
+ for (const [readerId, leaves] of readers) {
29978
+ if (leaves.length === 0) continue;
29979
+ for (const [namedId, needles] of named) {
29980
+ if (namedId === readerId) continue;
29981
+ for (const needle of needles) if (leavesHoldNeedle(leaves, needle)) recordLogOnlyValue(bag, needle);
29982
+ }
29983
+ }
29984
+ return bag;
29985
+ }
29986
+ function secretNamesStoredIn(record, needles) {
29987
+ const leaves = [...wholeStringLeavesOf(record?.properties)].filter((leaf) => leaf !== "");
29988
+ if (leaves.length === 0) return [];
29989
+ return [...needles].filter((needle) => leavesHoldNeedle(leaves, needle));
29990
+ }
29991
+ function secretNamedRecordNeedles(resources, secrets, bag = /* @__PURE__ */ new Map()) {
29992
+ for (const [logicalId, record] of Object.entries(resources)) for (const needle of storedRecordNameNeedles(logicalId, record, secrets) ?? []) recordLogOnlyValue(bag, needle);
29993
+ return bag;
29994
+ }
29500
29995
  function secretNamePrintingBag(logicalId, resources) {
29501
29996
  const bag = /* @__PURE__ */ new Map();
29502
29997
  const record = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
@@ -30707,7 +31202,7 @@ function renderNestedStackTypeChangeRefusal(typeChanges, stackName) {
30707
31202
  const rows = typeChanges.map((tc) => {
30708
31203
  return `${` - ${tc.logicalId}: Type changes from ${tc.currentType} to ${tc.desiredType} (the existing ${tc.currentType} is ${tc.physicalId}).`}\n${tc.direction === "into-nested-stack" ? ` Replacing a single resource BY a nested stack is not supported: the create half of the replacement would deploy a whole child stack "${stackName}~${tc.logicalId}" as one row, while ${tc.physicalId} is still recorded under this logical id.` : ` Replacing a nested stack BY a single resource is not supported: a replacement deletes its old half as a best-effort cleanup step whose failure is only a warning, so the child stack "${stackName}~${tc.logicalId}" and every resource it owns could be left behind, untracked, under a deploy that reports success.`}`;
30709
31204
  });
30710
- return `Refusing to deploy ${stackName}: ` + (typeChanges.length === 1 ? `a resource changes its Type ` : `${typeChanges.length} resources change their Type `) + `into or out of ${NESTED_STACK_RESOURCE_TYPE}, which cdkd does not replace in place (issue #2668).\n${rows.join("\n")}\n Deploy this as two changes instead: give the new resource a DIFFERENT logical id (in CDK, rename the construct) so the existing row is deleted through its own type's provider and the new one is created under its own — or remove the resource in one deploy and add its replacement in the next. There is no flag that overrides this refusal.`;
31205
+ return `Refusing to deploy ${stackName}: ` + (typeChanges.length === 1 ? `a resource changes its Type ` : `${typeChanges.length} resources change their Type `) + `into or out of ${NESTED_STACK_RESOURCE_TYPE}, which cdkd does not replace in place.\n${rows.join("\n")}\n Deploy this as two changes instead: give the new resource a DIFFERENT logical id (in CDK, rename the construct) so the existing row is deleted through its own type's provider and the new one is created under its own — or remove the resource in one deploy and add its replacement in the next. There is no flag that overrides this refusal.`;
30711
31206
  }
30712
31207
 
30713
31208
  //#endregion
@@ -34169,7 +34664,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
34169
34664
  resource
34170
34665
  });
34171
34666
  }
34172
- if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused (issue #2944): their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
34667
+ if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
34173
34668
  if (candidates.length === 0 && masked.length === 0) return;
34174
34669
  const allSiblings = {};
34175
34670
  for (const [lid, res] of Object.entries(stateResources)) allSiblings[lid] = {
@@ -34202,7 +34697,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
34202
34697
  if (masked.length > 0) try {
34203
34698
  producerRegions = producerRegionsFromState(crossStackReads);
34204
34699
  } catch {
34205
- this.logger.debug(safeMsg`Masked observed baseline re-capture skipped for ${masked.length} resource(s): the record's cross-stack reads could not be read (issue #3595).`);
34700
+ this.logger.debug(safeMsg`Masked observed baseline re-capture skipped for ${masked.length} resource(s): the record's cross-stack reads could not be read.`);
34206
34701
  masked.length = 0;
34207
34702
  }
34208
34703
  for (const { logicalId, resource } of masked) {
@@ -34229,7 +34724,7 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
34229
34724
  const task = (async () => {
34230
34725
  const secrets = await resolveRecordSecrets(properties, (token, own) => this.resolver.resolveDynamicReferences(token, persistedTokenResolverContext(own, producerRegions)));
34231
34726
  if (secrets === void 0 || secrets.size === 0) {
34232
- this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: its recorded references did not all resolve to distinct values (issue #3595).`);
34727
+ this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: its recorded references did not all resolve to distinct values.`);
34233
34728
  return;
34234
34729
  }
34235
34730
  const readback = await withCurrentResourceSecrets(secrets, () => readCurrentState(resource.physicalId, logicalId, resource.resourceType, properties, context));
@@ -34241,14 +34736,14 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
34241
34736
  secrets
34242
34737
  });
34243
34738
  if (recaptured === void 0) {
34244
- this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: no masked position could be certified, or the resource no longer reads back as its baseline records (issue #3595).`);
34739
+ this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: no masked position could be certified, or the resource no longer reads back as its baseline records.`);
34245
34740
  return;
34246
34741
  }
34247
34742
  this.recapturedBaselines.set(recaptured, previous);
34248
- this.logger.debug(safeMsg`Re-captured the masked observed baseline of ${logicalId} (issue #3595).`);
34743
+ this.logger.debug(safeMsg`Re-captured the masked observed baseline of ${logicalId}.`);
34249
34744
  return recaptured;
34250
34745
  })().catch(() => {
34251
- this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: the re-capture failed (issue #3595).`);
34746
+ this.logger.debug(safeMsg`Masked observed baseline of ${logicalId} kept: the re-capture failed.`);
34252
34747
  });
34253
34748
  this.observedCaptureTasks.set(logicalId, task);
34254
34749
  }
@@ -34310,17 +34805,27 @@ function deepEqualValue(a, b) {
34310
34805
 
34311
34806
  //#endregion
34312
34807
  //#region src/deployment/deploy-engine/masking.ts
34313
- function diffLogMasker(diffSecrets, template, parameterValues) {
34808
+ function diffLogMasker(diffSecrets, template, parameterValues, resources) {
34314
34809
  const inherited = this.options.inheritedSecrets;
34315
34810
  const noEchoValues = /* @__PURE__ */ new Map();
34316
34811
  const noEchoNames = new Set(Object.entries(template.Parameters ?? {}).filter(([, definition]) => definition?.NoEcho === true).map(([name]) => name));
34317
34812
  const splitDelimiters = literalSplitDelimitersOf(template, noEchoNames);
34318
34813
  for (const [name, definition] of Object.entries(template.Parameters ?? {})) if (definition?.NoEcho === true && Object.hasOwn(parameterValues, name)) recordLogOnlyParameterValue(noEchoValues, parameterValues[name], splitDelimiters);
34319
- return createUnionSecretMasker([
34814
+ const stateNames = /* @__PURE__ */ new Map();
34815
+ const union = createUnionSecretMasker([
34320
34816
  diffSecrets,
34321
34817
  noEchoValues,
34818
+ stateNames,
34322
34819
  inherited
34323
34820
  ]);
34821
+ let judged = false;
34822
+ return (text) => {
34823
+ if (!judged) {
34824
+ judged = true;
34825
+ storedSecretNameNeedles(resources, this.fingerprintNoEchoValues, stateNames);
34826
+ }
34827
+ return union(text);
34828
+ };
34324
34829
  }
34325
34830
  function freshNoEchoParameters(parameterValues) {
34326
34831
  const inherited = this.options.inheritedSecrets;
@@ -34402,7 +34907,7 @@ function refuseRedactedAttributeReads(logicalId, resourceType, context) {
34402
34907
  const producers = [...new Set(reads.map((read) => read.logicalId).filter((id) => !!id))];
34403
34908
  throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: ${producers.map((id) => displayIdent(id)).join(", ")} declared ${reads.length === 1 ? "that attribute" : "those attributes"} NoEcho, so cdkd's recorded state holds only the redaction mask for ${reads.length === 1 ? "it" : "them"}, and cdkd does not re-run a producer to recover a value. Remedy: deploy a change to the producer in the SAME run as ${logicalId} (for a custom resource, change one of its properties, e.g. a nonce / version property, so its handler runs again and supplies the value), or stop declaring the value NoEcho.`, resourceType, logicalId);
34404
34909
  }
34405
- throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource was adopted by 'cdkd import' through the Cloud Control fallback, which records only the attributes the type's CloudFormation schema declares read-only and masks the rest. Either the attribute named above is not one of them — CloudFormation would reject an Fn::GetAtt naming it too, so stop reading it — or cdkd could not read that schema and masked the whole model, which the import warned about when it happened. If that warning named a missing cloudformation:DescribeType permission, grant it first. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
34910
+ throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource was adopted by 'cdkd import' through the Cloud Control fallback, which records only the type's Fn::GetAtt attributes (its read-only properties plus the writable ones CloudFormation also accepts in Fn::GetAtt) and masks the rest. Either the attribute named above is not one of them — CloudFormation would reject an Fn::GetAtt naming it too, so stop reading it — or cdkd could not read that schema and masked the whole model, which the import warned about when it happened. If that warning named a missing cloudformation:DescribeType permission, grant it first. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
34406
34911
  }
34407
34912
  function allRecordedSecrets() {
34408
34913
  const all = /* @__PURE__ */ new Map();
@@ -34787,7 +35292,7 @@ function createReadOnlyAttributeHealerFactory(options) {
34787
35292
  region
34788
35293
  })))().then((outcome) => {
34789
35294
  if (outcome.kind === "read") try {
34790
- logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS for this preview — its state record lacked one a Fn::GetAtt asked for (#1852); nothing is written: ${Object.keys(outcome.attributes).length} attribute(s) read`);
35295
+ logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS for this preview — its state record lacked one a Fn::GetAtt asked for; nothing is written: ${Object.keys(outcome.attributes).length} attribute(s) read`);
34791
35296
  } catch {}
34792
35297
  return outcome;
34793
35298
  }).catch((error) => ({
@@ -34839,7 +35344,7 @@ async function readStaleAttributes(logicalId, resource, stackName) {
34839
35344
  resourceType: resource.resourceType,
34840
35345
  attributes
34841
35346
  });
34842
- this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for (#1852): ${Object.keys(attributes).length} attribute(s) read`);
35347
+ this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
34843
35348
  return outcome;
34844
35349
  }
34845
35350
  function withHealedAttributes(logicalId, record) {
@@ -35188,9 +35693,9 @@ async function refuseUnlicensedGeneratedName(input) {
35188
35693
  }], recoveryCommandFlags(this.options.refusalRecovery).flags).command}\``;
35189
35694
  if (verdict.ownIntent !== void 0) {
35190
35695
  const why = verdict.ownIntent === "abandoned" ? "a deploy of this stack that was killed or force-unlocked" : "a create of this stack that came back failed (a timeout or a server error)";
35191
- return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds. This stack's create-token ledger records that ${why} sent this name, but this type reports no creation time, so cdkd cannot tell that resource is the one it made rather than another deployment's created since. Since ${adoptsText}, creating it would take that resource over. ${displaySafe(logicalId)} was not created. The likely cause: the resource is this stack's own, from that deploy. If it is, ${importLine} and re-run; if it is not, this stack is also deployed under another state backend (go-to-k/cdkd#4705).`);
35696
+ return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds. This stack's create-token ledger records that ${why} sent this name, but this type reports no creation time, so cdkd cannot tell that resource is the one it made rather than another deployment's created since. Since ${adoptsText}, creating it would take that resource over. ${displaySafe(logicalId)} was not created. The likely cause: the resource is this stack's own, from that deploy. If it is, ${importLine} and re-run; if it is not, this stack is also deployed under another state backend.`);
35192
35697
  }
35193
- return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds, and nothing this stack records names that resource: not its state, its rollback journal or create-token ledger, nor what a destroy of it under this state prefix kept. Since ${adoptsText}, creating it would take that resource over, as CloudFormation refuses with "already exists". ${displaySafe(logicalId)} was not created. The likely cause: this stack is also deployed under another state backend (another --state-prefix, --state-bucket or account), where cdkd generates the same names. One stack name per account and region is supported (go-to-k/cdkd#4705): deploy it under one backend only, or give this stack another name. If the resource is this stack's own, ${importLine} and re-run.`);
35698
+ return refuse(`${subject} would be created with ${named}, which an existing resource (${displaySafe(verdict.holder)}) already holds, and nothing this stack records names that resource: not its state, its rollback journal or create-token ledger, nor what a destroy of it under this state prefix kept. Since ${adoptsText}, creating it would take that resource over, as CloudFormation refuses with "already exists". ${displaySafe(logicalId)} was not created. The likely cause: this stack is also deployed under another state backend (another --state-prefix, --state-bucket or account), where cdkd generates the same names. One stack name per account and region is supported: deploy it under one backend only, or give this stack another name. If the resource is this stack's own, ${importLine} and re-run.`);
35194
35699
  }
35195
35700
  }
35196
35701
  }
@@ -36194,7 +36699,7 @@ var DynamoDBGlobalTableProvider = class {
36194
36699
  const droppedOverrides = [];
36195
36700
  if (oldReplicaOverrides.OnDemandThroughputOverride && !replicaOverrides.OnDemandThroughputOverride) droppedOverrides.push("ReadOnDemandThroughputSettings");
36196
36701
  if (oldReplicaOverrides.ProvisionedThroughputOverride && !replicaOverrides.ProvisionedThroughputOverride) droppedOverrides.push("ReadProvisionedThroughputSettings");
36197
- 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 (both live-probed, issue #1436). The previous override is STILL IN EFFECT on AWS. Set an explicit value, or remove and re-add the replica, to change it.`);
36702
+ 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.`);
36198
36703
  }
36199
36704
  if (replica["TableClassOverride"]) updateAction.TableClassOverride = replica["TableClassOverride"];
36200
36705
  if (!(updateAction.KMSMasterKeyId !== void 0 || updateAction.GlobalSecondaryIndexes !== void 0 || updateAction.TableClassOverride !== void 0 || updateAction.ProvisionedThroughputOverride !== void 0 || updateAction.OnDemandThroughputOverride !== void 0)) {
@@ -36697,7 +37202,7 @@ var DynamoDBGlobalTableProvider = class {
36697
37202
  }
36698
37203
  try {
36699
37204
  if (hasTransitionalIndex(preDeleteIndexes)) {
36700
- this.logger.debug(`Waiting for indexes on ${physicalId} to settle before DeleteTable (issue #1521)`);
37205
+ this.logger.debug(`Waiting for indexes on ${physicalId} to settle before DeleteTable`);
36701
37206
  await this.waitForIndexesActive(physicalId, logicalId, {
36702
37207
  proceedNote: DELETE_INDEX_WAIT_PROCEED_NOTE,
36703
37208
  budget
@@ -38628,14 +39133,14 @@ const REMEDY = "To move a custom resource to a different handler, give it a new
38628
39133
  const UNJUDGEABLE_REMEDY = `Where the recorded ServiceToken is unreadable and the handler did not change, put the ARN of the handler that created this resource (the one it was last deployed with, not the one the template names now) back as ServiceToken in state.json (a ServiceToken fed by a NoEcho parameter is recorded only as '${"***"}': feed it from a plain value) and re-deploy.`;
38629
39134
  function renderServiceTokenRefusal(refusals, stackName, mask = (text) => text) {
38630
39135
  const rows = refusals.map((refusal) => ` - ${rowText(refusal, mask)}`);
38631
- return `Refusing to deploy ${stackName}: ` + (refusals.length === 1 ? `a custom resource's ServiceToken changes` : `${refusals.length} custom resources' ServiceTokens change`) + `, which CloudFormation does not allow ("Modifying service token is not allowed") (issue #4749). Nothing was sent to either handler.
39136
+ return `Refusing to deploy ${stackName}: ` + (refusals.length === 1 ? `a custom resource's ServiceToken changes` : `${refusals.length} custom resources' ServiceTokens change`) + `, which CloudFormation does not allow ("Modifying service token is not allowed"). Nothing was sent to either handler.
38632
39137
  ${rows.join("\n")}\n ${REMEDY}` + (refusals.some((refusal) => refusal.kind === "unjudgeable") ? `\n ${UNJUDGEABLE_REMEDY}` : "");
38633
39138
  }
38634
39139
  function serviceTokenBlockingReason(refusal, mask) {
38635
- return `${rowText(refusal, mask)} cdkd deploy refuses a changed custom-resource ServiceToken, as CloudFormation does (issue #4749); give the custom resource a new logical id to move it to another handler.`;
39140
+ return `${rowText(refusal, mask)} cdkd deploy refuses a changed custom-resource ServiceToken, as CloudFormation does; give the custom resource a new logical id to move it to another handler.`;
38636
39141
  }
38637
39142
  function deferredServiceTokenWarning(row) {
38638
- return `${displayIdent(row.logicalId)}: its ServiceToken reads a resource this deploy replaces, creates or updates, or a value this preview cannot resolve. If it resolves to a different ARN than the one recorded, cdkd deploy refuses the update before invoking any handler and rolls back (issue #4749). A replaced backing function is already deleted by then and the rollback re-creates it; if that fails, the record names a function that no longer exists.`;
39143
+ return `${displayIdent(row.logicalId)}: its ServiceToken reads a resource this deploy replaces, creates or updates, or a value this preview cannot resolve. If it resolves to a different ARN than the one recorded, cdkd deploy refuses the update before invoking any handler and rolls back. A replaced backing function is already deleted by then and the rollback re-creates it; if that fails, the record names a function that no longer exists.`;
38639
39144
  }
38640
39145
 
38641
39146
  //#endregion
@@ -39903,6 +40408,7 @@ Drop the record with: ${dropCommand}`);
39903
40408
 
39904
40409
  //#endregion
39905
40410
  //#region src/deployment/deploy-engine/provision.ts
40411
+ const NESTED_STACK_ROW_TYPE = "AWS::CloudFormation::Stack";
39906
40412
  async function provisionResource(logicalId, change, stateResources, stackName, template, parameterValues, conditions, counts, progress) {
39907
40413
  const resourceType = change.resourceType;
39908
40414
  const renderer = getLiveRenderer();
@@ -39938,7 +40444,13 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
39938
40444
  const physicalIdBeforeUpdate = stateResources[logicalId]?.physicalId;
39939
40445
  const provisionedByBeforeUpdate = stateResources[logicalId]?.provisionedBy;
39940
40446
  this.noteSecretNamedRecord(logicalId, stateResources[logicalId]);
40447
+ const readsRegistry = this.secretNameBagFor(logicalId);
40448
+ for (const needle of secretNamesStoredIn(stateResources[logicalId], printingCorpusOf(this.preDeploySecretNamedRecords ?? /* @__PURE__ */ new Map()).keys())) recordLogOnlyValue(readsRegistry, needle);
39941
40449
  if (change.changeType === "DELETE") this.noteSecretNamedReads(logicalId, stateResources[logicalId], stateResources);
40450
+ if (resourceType === NESTED_STACK_ROW_TYPE) {
40451
+ const registry = this.secretNameBagFor(logicalId);
40452
+ for (const needle of printingCorpusOf(this.preDeploySecretNamedRecords ?? /* @__PURE__ */ new Map()).keys()) recordLogOnlyValue(registry, needle);
40453
+ }
39942
40454
  const printingRegistry = this.secretNameBagFor(logicalId);
39943
40455
  let nestedChildUnaddressed;
39944
40456
  const deleteGuards = [];
@@ -40245,16 +40757,29 @@ async function executeDeployment(template, currentState, changes, dag, execution
40245
40757
  this.logger.info(`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
40246
40758
  const createUpdateExecutor = new DagExecutor();
40247
40759
  const provisionable = new Set(createUpdateIds);
40760
+ const createUpdateDeps = /* @__PURE__ */ new Map();
40248
40761
  for (const id of createUpdateIds) {
40249
40762
  const allDeps = this.dagBuilder.getDirectDependencies(dag, id);
40250
- const deps = new Set(allDeps.filter((d) => provisionable.has(d)));
40251
- createUpdateExecutor.add({
40252
- id,
40253
- dependencies: deps,
40254
- state: "pending",
40255
- data: changes.get(id)
40256
- });
40763
+ createUpdateDeps.set(id, new Set(allDeps.filter((d) => provisionable.has(d))));
40257
40764
  }
40765
+ const levelOf = /* @__PURE__ */ new Map();
40766
+ executionLevels.forEach((level, at) => {
40767
+ for (const id of level) levelOf.set(id, at);
40768
+ });
40769
+ for (const { before, after } of orderInlinePolicyWriters({
40770
+ writes: createUpdateIds,
40771
+ changes,
40772
+ templateResources: template.Resources ?? {},
40773
+ stateResources: currentState.resources,
40774
+ dependencies: createUpdateDeps,
40775
+ rank: (id) => levelOf.get(id) ?? Number.MAX_SAFE_INTEGER
40776
+ })) this.logger.debug(safeMsg`${after} waits for ${before}: both write an inline policy name on the same IAM principal`);
40777
+ for (const id of createUpdateIds) createUpdateExecutor.add({
40778
+ id,
40779
+ dependencies: createUpdateDeps.get(id),
40780
+ state: "pending",
40781
+ data: changes.get(id)
40782
+ });
40258
40783
  const enqueueLostChildren = (executor) => {
40259
40784
  const lostIds = noChangeChildrenOfRecreatedParents({
40260
40785
  changes,
@@ -42014,6 +42539,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
42014
42539
  this.seedPersistedNoEchoAttributes(currentState.resources);
42015
42540
  const orphanCountBeforeAdoption = (currentState.orphans ?? []).length;
42016
42541
  const orphanPlan = await this.adoptRollbackOrphans(currentState, effectiveTemplate);
42542
+ this.preDeploySecretNamedRecords = secretNamedRecordNeedles(currentState.resources, this.fingerprintNoEchoValues);
42017
42543
  if (Object.keys(orphanPlan.adopted).length > 0) {
42018
42544
  this.stampReasonlessParameterRefusals(currentState.resources, template);
42019
42545
  if (backfillMaskedPropertyFingerprints(currentState.resources, template, backfillNoEchoValues) > 0) maskedFingerprintsBackfilled = true;
@@ -42048,7 +42574,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
42048
42574
  sources: maskedInputSourcesForDiff,
42049
42575
  rebaselined: /* @__PURE__ */ new Map()
42050
42576
  };
42051
- const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName));
42577
+ const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), freshNoEchoParametersWithDeclared(this.inheritedNoEchoParameters, effectiveTemplate), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery, this.noEchoDiffComparison(currentState.resources, effectiveTemplate, conditions, parameterValues, stackName));
42052
42578
  createOnlyPrefetch.cancel();
42053
42579
  for (const [logicalId, fingerprints] of maskedInputs?.rebaselined ?? []) {
42054
42580
  const record = currentState.resources[logicalId];
@@ -42067,7 +42593,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
42067
42593
  recreateTargetIds: recreateTargetIdsFor(this.options.recreateTargets, stackName)
42068
42594
  }).refused;
42069
42595
  if (serviceTokenRefusals.length > 0) {
42070
- const mask = this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues);
42596
+ const mask = this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources);
42071
42597
  throw markNonRetryable(new CdkdError(renderServiceTokenRefusal(serviceTokenRefusals, stackName, mask), SERVICE_TOKEN_CHANGE_REFUSED));
42072
42598
  }
42073
42599
  const recreatePromotion = promoteRecreateTargets(changes, this.options.recreateTargets, stackName);
@@ -42117,7 +42643,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
42117
42643
  const persistExportSet = new Set(exportNamesToPersist ?? []);
42118
42644
  const exportSetChanged = exportNamesToPersist !== void 0 && (currentEffectiveExports.size !== persistExportSet.size || [...persistExportSet].some((k) => !currentEffectiveExports.has(k)));
42119
42645
  if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} A downstream Fn::ImportValue may fail until the next deploy.`);
42120
- else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path, #2771)`);
42646
+ else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path)`);
42121
42647
  const skippedOutputsChanged = !skippedOutputsEqual(currentState.skippedOutputs, this.skippedOutputs);
42122
42648
  const healedAttributesPending = this.hasUnpersistedHeals(currentState.resources);
42123
42649
  const conditionVerdictsChanged = !conditionVerdictRecordsEqual(readRecordedConditionVerdicts(currentState), conditionVerdicts);
@@ -42146,14 +42672,14 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
42146
42672
  if (outputsChanged || exportSetChanged) {
42147
42673
  persistedOutputs = refreshedState.outputs;
42148
42674
  if (outputsChanged) this.logger.info("Persisted Outputs-only change (no resource diff).");
42149
- else this.logger.debug("Persisted export-set change (no outputs-value diff, no-change path, #2193)");
42675
+ else this.logger.debug("Persisted export-set change (no outputs-value diff, no-change path)");
42150
42676
  if (this.exportIndexStore) await this.exportIndexStore.updateForStack(stackName, this.stackRegion, importableOutputs({
42151
42677
  ...refreshedState,
42152
42678
  outputs: this.redactOutputs(refreshedState.outputs)
42153
42679
  }));
42154
42680
  } else if (observedRefresh) this.logger.debug("Persisted refreshed observedProperties (no-change path)");
42155
- else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path, #1852)");
42156
- else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path, #2740)");
42681
+ else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path)");
42682
+ else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path)");
42157
42683
  } catch (saveError) {
42158
42684
  this.logger.warn(`Failed to persist no-change state update: ${saveError instanceof Error ? saveError.message : String(saveError)} — drift baseline / outputs will be re-resolved on next deploy.`);
42159
42685
  }
@@ -42545,6 +43071,7 @@ var DeployEngine = class {
42545
43071
  perResourceTemplateProps = /* @__PURE__ */ new Map();
42546
43072
  perResourceResolvedType = /* @__PURE__ */ new Map();
42547
43073
  fingerprintNoEchoValues = void 0;
43074
+ preDeploySecretNamedRecords = void 0;
42548
43075
  fingerprintParameters = void 0;
42549
43076
  fingerprintChildTemplates = void 0;
42550
43077
  perResourceInputFingerprints = /* @__PURE__ */ new Map();
@@ -42611,6 +43138,7 @@ var DeployEngine = class {
42611
43138
  this.constructPathTemplate = void 0;
42612
43139
  this.perResourceResolvedType = /* @__PURE__ */ new Map();
42613
43140
  this.fingerprintNoEchoValues = void 0;
43141
+ this.preDeploySecretNamedRecords = void 0;
42614
43142
  this.fingerprintParameters = void 0;
42615
43143
  this.fingerprintChildTemplates = void 0;
42616
43144
  this.perResourceInputFingerprints = /* @__PURE__ */ new Map();
@@ -42699,7 +43227,7 @@ var DeployEngine = class {
42699
43227
  };
42700
43228
  }
42701
43229
  inlinePolicyClaimedFor(resourceType, logicalId, stateResources) {
42702
- if (resourceType !== "AWS::IAM::Policy") return void 0;
43230
+ if (resourceType !== "AWS::IAM::Policy" && !isInlinePolicyPrincipalType(resourceType)) return;
42703
43231
  const args = {
42704
43232
  selfLogicalId: logicalId,
42705
43233
  writers: this.inlinePolicyWriters,
@@ -42846,5 +43374,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
42846
43374
  DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
42847
43375
 
42848
43376
  //#endregion
42849
- export { getPriorAttempts as $, configBooleanRefusal as $a, hasOwnKey as $c, previewableOrphanRecords as $i, acquireIdempotencyToken as $n, recoverMaskedOutput as $o, s3BucketArn as $r, validateAssetBucketName as $s, orphanDeleteNeedsIdentity as $t, noEchoExactEchoLeavesOf as A, unpreviewableOrphanRecords as Aa, resolveCaptureObservedState as Ac, hasReadableOutputs as Ai, maskEventTextWithBoundBags as An, carryLogOnlyValues as Ao, ec2InstanceProtectionSite as Ar, hasUnverifiableParameterRefusal as As, isHandledOrphan as At, beginDeleteWait as B, findReplacedReadersOfRecreateTargets as Ba, MIGRATE_TMP_PREFIX as Bc, malformedOrphanRecordsRefusalMessage as Bi, effectiveDeletionPolicy as Bn, errorCauseChain as Bo, producerRegionsFromState as Br, WorkGraph as Bs, withStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedState as Ca, Synthesizer as Cc, STATE_RESOURCES_MALFORMED as Ci, collectPublishedOutputNames as Cn, noEchoLeavesOf as Co, deleteIndeterminateGuards as Cr, isNotImplemented as Cs, revertedNestedRowIds as Ct, withResourceDeadline as D, repairMalformedResourceEntriesForReadOnly as Da, loadCdkJson as Dc, deployRefusesOrphanRowsReason as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, readsNoEchoSource as Do, isWaitAbandonedError as Dr, exportNamesCarriedFrom as Ds, withNestedStackContext as Dt, serviceTokenBlockingReason as E, repairMalformedOutputsForReadOnly as Ea, getLegacyStateBucketName as Ec, accountArgs as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, readbackPathFor as Eo, withIndeterminateGuard as Er, describeRegionValueKind as Es, getCurrentNestedStackContext as Et, isProtectionValueActive as F, findSilentDropProperties as Fa, stateBucketExistenceConfirmed as Fc, malformedExportNamesWarning as Fi, ATOMIC_FINAL_SNAPSHOT_TYPES as Fn, printingCorpusOf as Fo, DiffCalculator as Fr, orphansCarriedFrom as Fs, replayFailedOperations as Ft, DELETE_INDEX_WAIT_PROCEED_NOTE as G, renderStatefulReason as Ga, expectedOwnerParam as Gc, malformedOutputsRefusalMessage as Gi, constructPathOf as Gn, scrubResourceRecord as Go, explicitRoleArnOrThrow as Gr, AssetModeResolver as Gs, isReplacementOrphan as Gt, deleteBudgetKey as H, MULTI_REGION_RECREATE_BLOCKED_TYPES as Ha, uploadCfnTemplate as Hc, malformedOrphanRowsKeptWarning as Hi, refusesFinalSnapshot as Hn, maskSecretsInText as Ho, applyRoleArnIfSet as Hr, createAssetRedirectResolver as Hs, recordAfterRollbackUpdate as Ht, perType as I, unwrittenCreateOnlyReplacement as Ia, warnDeprecatedNoPrefixCliFlag as Ic, malformedExportSourceWarning as Ii, PRE_DELETE_SNAPSHOT_TYPES as In, recordLogOnlyParameterValue as Io, INTRINSIC_KEYS as Ir, shouldRetainResource as Is, replayRollback as It, waitForIndexesSettled as J, isWarmThroughputDecrease as Ja, derivePartitionAndUrlSuffix as Jc, malformedResourceEntriesWarning as Ji, RollbackInlinePolicyWriters as Jn, isUncertifiedBaselineMaskPosition as Jo, AWS_CREDENTIAL_ENV_KEYS as Jr, ensureAssetStorage as Js, recheckFailedPlan as Jt, INDEX_SETTLE_POLL_INTERVAL_MS as K, WARM_THROUGHPUT_MEMBERS as Ka, PARTITION_TABLE as Kc, malformedOutputsWarning as Ki, findDestructiveChanges as Kn, DYNAMIC_REFERENCE_TOKEN_SCAN as Ko, isIamRoleArn as Kr, BOOTSTRAP_MARKER_PREFIX as Ks, planFailedOps as Kt, readProtection as L, withoutSilentDropProperties as La, ssmResolvedValueType as Lc, malformedLocalOutputsWarning as Li, buildFinalSnapshotIdentifier as Ln, recordLogOnlyValue as Lo, IntrinsicFunctionResolver as Lr, AssetPublisher as Ls, awaitInFlightSibling as Lt, recordedProtectionEvidence as M, unreadableResourceEntries as Ma, resolveStateBucketWithDefault as Mc, isReadableOrphanRecord as Mi, secretNamePrintingBag as Mn, hasMaskableValues as Mo, observeThenDisableInstanceApiTermination as Mr, importableOutputs as Ms, loadJournaledOrphans as Mt, recordedProtectionNote as N, withheldAccountClause as Na, resolveStateBucketWithDefaultAndSource as Nc, isReadableResourceEntry as Ni, stateSecretNameNeedles as Nn, literalSplitDelimitersOf as No, reDisableInstanceApiTermination as Nr, isReadableBag as Ns, makeForeignHolderScan as Nt, noEchoAttributeNamesOf as O, repairMalformedResourcePropertiesForReadOnly as Oa, resolveApp as Oc, displayLogicalId as Oi, completedReplayEntries as On, valueAtCoordinate as Oo, markWaitAbandoned as Or, hasReadableExportSet as Os, deleteJournaledOrphans as Ot, PROTECTION_PROPERTY_BY_TYPE as P, findActionableSilentDrops as Pa, resolveUseCdkBootstrapAssets as Pc, malformedDriftResourcePropertiesWarning as Pi, extractDeploymentEventError as Pn, logOnlyValueCount as Po, reEnableInstanceApiTermination as Pr, orphansAfterRollback as Ps, sameJournaledOrphans as Pt, isTruthyCfnBoolean as Q, coerceCfnInteger as Qa, defineOwnKey as Qc, malformedStateRefusalMessage as Qi, withCreateTokenLedger as Qn, recordNestedStackParameterExpressions as Qo, isSettledInstanceState as Qr, readBootstrapMarkerBody as Qs, seedsDeleteFirstGuard as Qt, DynamoDBGlobalTableProvider as R, NO_CC_HANDLERS_REASON as Ra, CFN_TEMPLATE_BODY_LIMIT as Rc, malformedLocalResourceEntriesWarning as Ri, ccRoutedFinalSnapshotError as Rn, shareLogOnlyValues as Ro, poisonRenderedSpellingsCollidingIn as Rr, isSensitiveAttributeName as Rs, destroyStackRecordsView as Rt, keptForReadoption as S, refuseMalformedResourcesForExport as Sa, getDockerImageBySourceHash as Sc, STATE_REGION_DIVERGED as Si, collectDeclaredOutputNames as Sn, noEchoCoordinatesOf as So, UNSPECIFIED_SKIP_REASON as Sr, isAccessDenied as Ss, revertNestedChildFromJournal as St, findServiceTokenRefusals as T, repairMalformedOrphansForReadOnly as Ta, getDefaultStateBucketName as Tc, UNREADABLE_RESOURCES_MAP_ROW as Ti, bindingSkippedOutputs as Tn, passedNoEchoParametersOf as To, deleteSkipReason as Tr, acceptedCreateOnlyDropsOf as Ts, collectNestedChildUnaddressed as Tt, resolveDynamoDbDeleteBudgetClock as U, isStatefulRecreateTargetForReplace as Ua, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Uc, malformedOrphansRefusalMessage as Ui, unsupportedFinalSnapshotError as Un, markSameGenerationBag as Uo, assertFlagRoleArn as Ur, loadPublishableAssetManifest as Us, demoteSupersededOrphans as Ut, compensateRemovedDeletionProtection as V, shownType as Va, findLargeInlineResources as Vc, malformedOrphanRecordsWarning as Vi, isFinalSnapshotError as Vn, maskSecretsInError as Vo, regionLessSecretName as Vr, buildAssetRedirectMap as Vs, removeProtectionTypeList as Vt, resolveDynamoDbDeleteBudgetMs as W, isStatefulRecreateTargetSync as Wa, decodeListingKey as Wc, malformedOrphansWarning as Wi, maskingRetryLogger as Wn, redactSecretsForState as Wo, assertSendableRoleArn as Wr, rewriteTemplateAssetReferences as Ws, isJournaledOrphan as Wt, S3_AUTO_DELETE_OBJECTS_TAG as X, toFiniteNumber as Xa, StageLoadError as Xc, malformedResourcesWarning as Xi, ledgerForStack as Xn, identityKeyFor as Xo, callerEnvCredentials as Xr, isCrossRegionRedirect as Xs, replacementNeverSwapped as Xt, ECR_AUTO_DELETE_IMAGES_TAG as Y, toCfnInteger as Ya, AssemblyReader as Yc, malformedResourcePropertiesWarning as Yi, earliestDefined as Yn, pathCrossesDottedKey as Yo, applyCallerIdentityCredentials as Yr, getBootstrapMarkerKey as Ys, recordUnderIdIsNotOwn as Yt, hasCdkAutoDeleteTag as Z, coerceCfnBoolean as Za, processStackMessages as Zc, malformedScrubResourceEntriesRefusalMessage as Zi, reserveStackCreateToken as Zn, inheritNestedStackParameterAssociations as Zo, envCredentialsAreAssumedRole as Zr, parseBootstrapMarker as Zs, resolveReplacementOldType as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedResourcePropertiesForDrift as _a, runDockerStreaming as _c, parseWebACLArn as _i, carriedExportAliasExposure as _n, isMarkedCoordinate as _o, getCurrentResourceSecrets as _r, rebuildClientForBucketRegion as _s, displacedPhysicalIdShown as _t, findNestedTemplateTreeDefect as a, refuseMalformedOrphansForDestroy as aa, describeDockerExecFailure as ac, isUnboundTemplateParameter as ai, displayAssemblyPath as al, redactedDeleteAddressFields as an, requireConfigObject as ao, tagMapAsList as ar, recordNoEchoParameterFreshValue as as, gray as at, lookupEachName as b, refuseMalformedResourcesForDeploy as ba, stripControlChars as bc, passedParameterClassesOf as bi, isWholeDynamicReferenceValue as bn, maskWholeValue as bo, slowCcOperationTimeoutMs as br, applyCrossPrefixScan as bs, nestedChildStackName as bt, renderNestedTemplateTreeDefect as c, refuseMalformedOutputsForDestroy as ca, finchSecretArgvRefusal as cc, isImpossibleEmptyStoredAttribute as ci, clearBucketRegionCache as cl, updatePartialReason as cn, templateResourceTypes as co, stringifyIfAssigned as cr, STATE_SOURCED_BASELINE_RULES as cs, yellow as ct, conditionInputsFrom as d, refuseMalformedResourceEntriesForDeploy as da, isDockerClientEnvKey as dc, isNamelessDynamicReferenceError as di, WITHHELD_NAME_DISPLAY as dn, canonicalLambdaFunctionName as do, ccBrokenReason as dr, TEMPLATE_SOURCED_RULES as ds, reachableDivergentParameters as dt, refuseDivergentRecordRegionForDestroy as ea, validateContainerRepoName as ec, s3BucketDomainName as ei, hasPlainPrototype$1 as el, findNestedStackTypeChanges as en, configIntegerRefusal as eo, DBPROXY_TAGS_WHAT as er, carriesSecretMask as es, markRefusedBeforeApplying as et, parentSuppliedValues as f, refuseMalformedResourceEntriesForDestroy as fa, isMalformedEnvKey as fc, keepsSecretReferenceToken as fi, displayTextOrWithheld as fn, lambdaFunctionNameForMask as fo, isCustomResource as fr, WHOLE_DYNAMIC_REFERENCE_PATTERN as fs, resourcesNamingDeclaredParameter as ft, mergeNoChangeOutputs as g, refuseMalformedResourcePropertiesForDestroy as ga, runDockerForeground as gc, refStateLookupFromResource as gi, secretSafeKeyDisplay as gn, canonicalCoordinates as go, isCustomResourceType as gr, S3StateBackend as gs, displacedOpClause as gt, keptWholeReasonText as h, refuseMalformedResourceEntriesForOrphan as ha, redactedDockerCause as hc, isStalePlaceholderArnAttribute as hi, secretBearingStateKeyWarning as hn, TemplateParser as ho, readsNoEchoDeleteValues as hr, isLockInfoExpired as hs, NESTED_PENDING_PARENT_REASON as ht, childTemplateLoader as i, refuseMalformedOrphans as ia, describeDockerCapturedOutput as ic, coerceParameterTypedValue as ii, describeFileReadFailure as il, isRedactedRecordedValue as in, requireConfigArray as io, refuseMalformedDesiredTags as ir, recordNoEchoAttributeValues as is, cyan as it, noEchoParameterNamesOf as j, unreadableOrphanRecords as ja, resolveSkipPrefix as jc, hasReadableResources as ji, orphanRecordsPrintingBag as jn, createUnionSecretMasker as jo, isTerminationProtectionPropagationError as jr, importableOutputKeys as js, journaledOrphanLines as jt, noEchoComparisonForTemplate as k, repairMalformedResourcesForReadOnly as ka, resolveAutoAssetStorage as kc, hasReadableOrphans as ki, journaledOrphanPrintingBag as kn, liveMatchesUnresolvedTokenFrame as ko, disableInstanceApiTermination as kr, hasReasonlessBaselineRefusal as ks, dropFailedHint as kt, templateIdentity as l, refuseMalformedResourceAttributesForOrphan as la, formatDockerLoginError as lc, carriesDynamicReference as li, resolveBucketRegion as ll, DeploymentEventsReader as ln, describeTypeWithThrottleRetry as lo, CC_BROKEN_REASON as lr, STATE_SOURCED_CROSS_GENERATION_RULES as ls, computeParameterTaint as lt, isSecretBearingReferenceString as m, refuseMalformedResourceEntriesForImportSave as ma, redactDockerArgvValues as mc, cfnRefValueFromPhysicalId as mi, secretBearing as mn, DagBuilder as mo, TemplateNoEchoReresolver as mr, LockManager as ms, planOrphanAdoption as mt, IMPLICIT_DELETE_DEPENDENCIES as n, refuseMalformedOrphanRecords as na, buildDockerImage as nc, s3BucketRegionalDomainName as ni, ownValue as nl, inheritProducerRegions as nn, readConfigString as no, planTagDiff as nr, recordMaskOnlyValue as ns, createReadOnlyAttributeHealerFactory as nt, isAbsoluteAssetPath as o, refuseMalformedOrphansForOrphan as oa, describeDockerFailure as oc, parameterTypeMayLoseSecretIdentity as oi, renderAssemblyPathEscape as ol, redactedDeleteAddressSkip as on, requireConfigString as oo, tagPlanWarning as or, recordProvenPublicExpression as os, green as ot, readRecordedConditionVerdicts as p, refuseMalformedResourceEntriesForImport as pa, partitionSensitiveEnv as pc, AWS_NO_VALUE as pi, exportAliasCollisionScrubWarning as pn, sameLambdaFunctionAddress as po, wouldReturnToSdkProvider as pr, isSingleDynamicReferenceToken as ps, makeSiblingClaimReader as pt, deleteTableWithIndexBusyRetry as q, coerceWarmThroughput as qa, canonicalizeRegion as qc, malformedRenderedContainersWarning as qi, formatDestructiveChange as qn, dynamicReferenceTokens as qo, sendableAssumeRoleCommand as qr, assertAssetBucketRegion as qs, planRollback as qt, computeImplicitDeleteEdges as r, refuseMalformedOrphanRecordsForDestroy as ra, resolveDockerContextDirectory as rc, s3BucketWebsiteUrl as ri, absoluteAssemblyPathEscape as rl, REDACTED_DELETE_ADDRESS_SKIP_REASON as rn, replayWarn as ro, readTagList as rr, recordMaskOnlyValuesIn as rs, bold as rt, listNestedTemplateRows as s, refuseMalformedOutputs as sa, dockerSpawnEnvWithSensitive as sc, getAccountInfo as si, resolveAssemblyPath as sl, updatePartialMessage as sn, prefetchCreateOnlyPropertyPaths as so, definedAttributes as sr, wholeStringLeavesOf as ss, red as st, DeployEngine as t, refuseMalformedNestedChildOutputs as ta, buildDenyExternalAccessPolicy as tc, s3BucketDualStackDomainName as ti, nullPrototypeRecord as tl, getCurrentProducerRegions as tn, configStringRefusal as to, DBPROXY_TAG_OPTIONS as tr, provenPublicValue as ts, formatResourceLine as tt, conditionFingerprint as u, refuseMalformedResourceEntries as ua, getDockerCmd as uc, carriesFetchableDynamicReference as ui, DeploymentEventsStore as un, withRetry as uo, ProviderRegistry as ur, STATE_SOURCED_READBACK_RULES as us, namesAnyDeclaredParameter as ut, chunks as v, refuseMalformedResourcePropertiesForExport as va, warnFinchArgvExposure as vc, withSharedDrainBudget as vi, exportNameNoEchoParameters as vn, maskAtCoordinates as vo, withPrintingSecrets as vr, CrossPrefixReadError as vs, dropSettledNestedJournals as vt, deferredServiceTokenWarning as w, repairMalformedOrphanRecordsForReadOnly as wa, synthesisStatusMessage as wc, UNREADABLE_ORPHANS_CONTAINER_ROW as wi, isExportAliasCollision as wn, noEchoOutputsComparison as wo, deleteLeftInPlace as wr, splitImportedOps as ws, withNestedRevertRun as wt, withApiLimit as x, refuseMalformedResourcesForDestroy as xa, AssetManifestLoader as xc, JSON_LISTING_HOLE_VALUE as xi, noEchoParameterValueSeed as xn, maskedLeafCoordinatesOf as xo, unchangedBehindSecretReference as xr, crossPrefixDeniedWarning as xs, recordDisplacedSkips as xt, isAccessDeniedError as y, refuseMalformedResourcePropertiesForOrphan as ya, escapeRegExp$3 as yc, parameterInputsFor as yi, exportNameSecretExposure as yn, maskReadbackAtCoordinates as yo, CloudControlProvider as yr, CrossPrefixScanCache as ys, getNestedRevertRun as yt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as z, hasNoCloudControlHandlers as za, CFN_TEMPLATE_URL_LIMIT as zc, malformedLocalResourcesWarning as zi, createPreDeleteFinalSnapshot as zn, createSecretMasker as zo, classifyReplaySecretRegion as zr, stringifyValue as zs, getStackRecords as zt };
42850
- //# sourceMappingURL=deploy-engine-BuPc2Dfc.js.map
43377
+ export { getPriorAttempts as $, isWarmThroughputDecrease as $a, derivePartitionAndUrlSuffix as $c, malformedResourceEntriesWarning as $i, reserveStackCreateToken as $n, isUncertifiedBaselineMaskPosition as $o, AWS_CREDENTIAL_ENV_KEYS as $r, ensureAssetStorage as $s, orphanDeleteNeedsIdentity as $t, noEchoExactEchoLeavesOf as A, repairMalformedOrphansForReadOnly as Aa, getDefaultStateBucketName as Ac, UNREADABLE_RESOURCES_MAP_ROW as Ai, maskEventTextWithBoundBags as An, passedNoEchoParametersOf as Ao, deleteSkipReason as Ar, acceptedCreateOnlyDropsOf as As, isHandledOrphan as At, beginDeleteWait as B, findSilentDropProperties as Ba, stateBucketExistenceConfirmed as Bc, malformedExportNamesWarning as Bi, ccRoutedFinalSnapshotError as Bn, printingCorpusOf as Bo, DiffCalculator as Br, orphansCarriedFrom as Bs, withStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedResourcePropertiesForExport as Ca, warnFinchArgvExposure as Cc, withSharedDrainBudget as Ci, collectPublishedOutputNames as Cn, maskAtCoordinates as Co, customResourceResponseExpirationWarning as Cr, CrossPrefixReadError as Cs, revertedNestedRowIds as Ct, withResourceDeadline as D, refuseMalformedResourcesForExport as Da, getDockerImageBySourceHash as Dc, STATE_REGION_DIVERGED as Di, DEFAULT_RESOURCE_WARN_AFTER_MS as Dn, noEchoCoordinatesOf as Do, UNSPECIFIED_SKIP_REASON as Dr, isAccessDenied$1 as Ds, withNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourcesForDestroy as Ea, AssetManifestLoader as Ec, JSON_LISTING_HOLE_VALUE as Ei, DEFAULT_RESOURCE_TIMEOUT_MS as En, maskedLeafCoordinatesOf as Eo, unchangedBehindSecretReference as Er, crossPrefixDeniedWarning as Es, getCurrentNestedStackContext as Et, isProtectionValueActive as F, unpreviewableOrphanRecords as Fa, resolveCaptureObservedState as Fc, hasReadableOutputs as Fi, storedSecretNameNeedles as Fn, carryLogOnlyValues as Fo, ec2InstanceProtectionSite as Fr, hasUnverifiableParameterRefusal as Fs, replayFailedOperations as Ft, DELETE_INDEX_WAIT_PROCEED_NOTE as G, findReplacedReadersOfRecreateTargets as Ga, MIGRATE_TMP_PREFIX as Gc, malformedOrphanRecordsRefusalMessage as Gi, unsupportedFinalSnapshotError as Gn, errorCauseChain as Go, producerRegionsFromState as Gr, WorkGraph as Gs, isReplacementOrphan as Gt, deleteBudgetKey as H, withoutSilentDropProperties as Ha, ssmResolvedValueType as Hc, malformedLocalOutputsWarning as Hi, effectiveDeletionPolicy as Hn, recordLogOnlyValue as Ho, IntrinsicFunctionResolver as Hr, AssetPublisher as Hs, recordAfterRollbackUpdate as Ht, perType as I, unreadableOrphanRecords as Ia, resolveSkipPrefix as Ic, hasReadableResources as Ii, extractDeploymentEventError as In, createUnionSecretMasker as Io, isTerminationProtectionPropagationError as Ir, importableOutputKeys as Is, replayRollback as It, waitForIndexesSettled as J, isStatefulRecreateTargetForReplace as Ja, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Jc, malformedOrphansRefusalMessage as Ji, findDestructiveChanges as Jn, markSameGenerationBag as Jo, assertFlagRoleArn as Jr, loadPublishableAssetManifest as Js, recheckFailedPlan as Jt, INDEX_SETTLE_POLL_INTERVAL_MS as K, shownType as Ka, findLargeInlineResources as Kc, malformedOrphanRecordsWarning as Ki, maskingRetryLogger as Kn, maskSecretsInError as Ko, regionLessSecretName as Kr, buildAssetRedirectMap as Ks, planFailedOps as Kt, readProtection as L, unreadableResourceEntries as La, resolveStateBucketWithDefault as Lc, isReadableOrphanRecord as Li, ATOMIC_FINAL_SNAPSHOT_TYPES as Ln, hasMaskableValues as Lo, observeThenDisableInstanceApiTermination as Lr, importableOutputs as Ls, awaitInFlightSibling as Lt, recordedProtectionEvidence as M, repairMalformedResourceEntriesForReadOnly as Ma, loadCdkJson as Mc, deployRefusesOrphanRowsReason as Mi, secretNamePrintingBag as Mn, readsNoEchoSource as Mo, isWaitAbandonedError as Mr, exportNamesCarriedFrom as Ms, loadJournaledOrphans as Mt, recordedProtectionNote as N, repairMalformedResourcePropertiesForReadOnly as Na, resolveApp as Nc, displayLogicalId as Ni, secretNamedRecordNeedles as Nn, valueAtCoordinate as No, markWaitAbandoned as Nr, hasReadableExportSet as Ns, makeForeignHolderScan as Nt, noEchoAttributeNamesOf as O, refuseMalformedState as Oa, Synthesizer as Oc, STATE_RESOURCES_MALFORMED as Oi, completedReplayEntries as On, noEchoLeavesOf as Oo, deleteIndeterminateGuards as Or, isNotImplemented as Os, deleteJournaledOrphans as Ot, PROTECTION_PROPERTY_BY_TYPE as P, repairMalformedResourcesForReadOnly as Pa, resolveAutoAssetStorage as Pc, hasReadableOrphans as Pi, stateSecretNameNeedles as Pn, liveMatchesUnresolvedTokenFrame as Po, disableInstanceApiTermination as Pr, hasReasonlessBaselineRefusal as Ps, sameJournaledOrphans as Pt, isTruthyCfnBoolean as Q, coerceWarmThroughput as Qa, canonicalizeRegion as Qc, malformedRenderedContainersWarning as Qi, ledgerForStack as Qn, dynamicReferenceTokens as Qo, sendableAssumeRoleCommand as Qr, assertAssetBucketRegion as Qs, seedsDeleteFirstGuard as Qt, DynamoDBGlobalTableProvider as R, withheldAccountClause as Ra, resolveStateBucketWithDefaultAndSource as Rc, isReadableResourceEntry as Ri, PRE_DELETE_SNAPSHOT_TYPES as Rn, literalSplitDelimitersOf as Ro, reDisableInstanceApiTermination as Rr, isReadableBag as Rs, destroyStackRecordsView as Rt, keptForReadoption as S, refuseMalformedResourcePropertiesForDrift as Sa, runDockerStreaming as Sc, parseWebACLArn as Si, collectDeclaredOutputNames as Sn, isMarkedCoordinate as So, applyCustomResourceResponseExpiration as Sr, rebuildClientForBucketRegion as Ss, revertNestedChildFromJournal as St, findServiceTokenRefusals as T, refuseMalformedResourcesForDeploy as Ta, stripControlChars as Tc, passedParameterClassesOf as Ti, bindingSkippedOutputs as Tn, maskWholeValue as To, slowCcOperationTimeoutMs as Tr, applyCrossPrefixScan as Ts, collectNestedChildUnaddressed as Tt, resolveDynamoDbDeleteBudgetClock as U, NO_CC_HANDLERS_REASON as Ua, CFN_TEMPLATE_BODY_LIMIT as Uc, malformedLocalResourceEntriesWarning as Ui, isFinalSnapshotError as Un, shareLogOnlyValues as Uo, poisonRenderedSpellingsCollidingIn as Ur, isSensitiveAttributeName as Us, demoteSupersededOrphans as Ut, compensateRemovedDeletionProtection as V, unwrittenCreateOnlyReplacement as Va, warnDeprecatedNoPrefixCliFlag as Vc, malformedExportSourceWarning as Vi, createPreDeleteFinalSnapshot as Vn, recordLogOnlyParameterValue as Vo, INTRINSIC_KEYS as Vr, shouldRetainResource as Vs, removeProtectionTypeList as Vt, resolveDynamoDbDeleteBudgetMs as W, hasNoCloudControlHandlers as Wa, CFN_TEMPLATE_URL_LIMIT as Wc, malformedLocalResourcesWarning as Wi, refusesFinalSnapshot as Wn, createSecretMasker as Wo, classifyReplaySecretRegion as Wr, stringifyValue as Ws, isJournaledOrphan as Wt, S3_AUTO_DELETE_OBJECTS_TAG as X, renderStatefulReason as Xa, expectedOwnerParam as Xc, malformedOutputsRefusalMessage as Xi, RollbackInlinePolicyWriters as Xn, scrubResourceRecord as Xo, explicitRoleArnOrThrow as Xr, AssetModeResolver as Xs, replacementNeverSwapped as Xt, ECR_AUTO_DELETE_IMAGES_TAG as Y, isStatefulRecreateTargetSync as Ya, decodeListingKey as Yc, malformedOrphansWarning as Yi, formatDestructiveChange as Yn, redactSecretsForState as Yo, assertSendableRoleArn as Yr, rewriteTemplateAssetReferences as Ys, recordUnderIdIsNotOwn as Yt, hasCdkAutoDeleteTag as Z, WARM_THROUGHPUT_MEMBERS as Za, PARTITION_TABLE as Zc, malformedOutputsWarning as Zi, earliestDefined as Zn, DYNAMIC_REFERENCE_TOKEN_SCAN as Zo, isIamRoleArn as Zr, BOOTSTRAP_MARKER_PREFIX as Zs, resolveReplacementOldType as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedResourceEntriesForDestroy as _a, isMalformedEnvKey as _c, keepsSecretReferenceToken as _i, carriedExportAliasExposure as _n, lambdaFunctionNameForMask as _o, readsNoEchoDeleteValues as _r, WHOLE_DYNAMIC_REFERENCE_PATTERN as _s, displacedPhysicalIdShown as _t, findNestedTemplateTreeDefect as a, refuseDivergentRecordRegionForDestroy as aa, validateContainerRepoName as ac, s3BucketDomainName as ai, hasPlainPrototype$1 as al, redactedDeleteAddressFields as an, configIntegerRefusal as ao, readTagList as ar, carriesSecretMask as as, gray as at, lookupEachName as b, refuseMalformedResourceEntriesForOrphan as ba, redactedDockerCause as bc, isStalePlaceholderArnAttribute as bi, isWholeDynamicReferenceValue as bn, TemplateParser as bo, withPrintingSecrets as br, isLockInfoExpired as bs, nestedChildStackName as bt, renderNestedTemplateTreeDefect as c, refuseMalformedOrphanRecordsForDestroy as ca, resolveDockerContextDirectory as cc, s3BucketWebsiteUrl as ci, absoluteAssemblyPathEscape as cl, updatePartialReason as cn, replayWarn as co, tagPlanWarning as cr, recordMaskOnlyValuesIn as cs, yellow as ct, conditionInputsFrom as d, refuseMalformedOrphansForOrphan as da, describeDockerFailure as dc, parameterTypeMayLoseSecretIdentity as di, renderAssemblyPathEscape as dl, WITHHELD_NAME_DISPLAY as dn, requireConfigString as do, CC_BROKEN_REASON as dr, recordProvenPublicExpression as ds, reachableDivergentParameters as dt, malformedResourcePropertiesWarning as ea, getBootstrapMarkerKey as ec, applyCallerIdentityCredentials as ei, AssemblyReader as el, findNestedStackTypeChanges as en, toCfnInteger as eo, withCreateTokenLedger as er, pathCrossesDottedKey as es, markRefusedBeforeApplying as et, parentSuppliedValues as f, refuseMalformedOutputs as fa, dockerSpawnEnvWithSensitive as fc, getAccountInfo as fi, resolveAssemblyPath as fl, displayTextOrWithheld as fn, prefetchCreateOnlyPropertyPaths as fo, ProviderRegistry as fr, wholeStringLeavesOf as fs, resourcesNamingDeclaredParameter as ft, mergeNoChangeOutputs as g, refuseMalformedResourceEntriesForDeploy as ga, isDockerClientEnvKey as gc, isNamelessDynamicReferenceError as gi, secretSafeKeyDisplay as gn, canonicalLambdaFunctionName as go, TemplateNoEchoReresolver as gr, TEMPLATE_SOURCED_RULES as gs, displacedOpClause as gt, keptWholeReasonText as h, refuseMalformedResourceEntries as ha, getDockerCmd as hc, carriesFetchableDynamicReference as hi, secretBearingStateKeyWarning as hn, withRetry as ho, wouldReturnToSdkProvider as hr, STATE_SOURCED_READBACK_RULES as hs, NESTED_PENDING_PARENT_REASON as ht, childTemplateLoader as i, previewableOrphanRecords as ia, validateAssetBucketName as ic, s3BucketArn as ii, hasOwnKey as il, isRedactedRecordedValue as in, configBooleanRefusal as io, planTagDiff as ir, recoverMaskedOutput as is, cyan as it, noEchoParameterNamesOf as j, repairMalformedOutputsForReadOnly as ja, getLegacyStateBucketName as jc, accountArgs as ji, orphanRecordsPrintingBag as jn, readbackPathFor as jo, withIndeterminateGuard as jr, describeRegionValueKind as js, journaledOrphanLines as jt, noEchoComparisonForTemplate as k, repairMalformedOrphanRecordsForReadOnly as ka, synthesisStatusMessage as kc, UNREADABLE_ORPHANS_CONTAINER_ROW as ki, journaledOrphanPrintingBag as kn, noEchoOutputsComparison as ko, deleteLeftInPlace as kr, splitImportedOps as ks, dropFailedHint as kt, templateIdentity as l, refuseMalformedOrphans as la, describeDockerCapturedOutput as lc, coerceParameterTypedValue as li, describeFileReadFailure as ll, DeploymentEventsReader as ln, requireConfigArray as lo, definedAttributes as lr, recordNoEchoAttributeValues as ls, computeParameterTaint as lt, isSecretBearingReferenceString as m, refuseMalformedResourceAttributesForOrphan as ma, formatDockerLoginError as mc, carriesDynamicReference as mi, resolveBucketRegion as ml, secretBearing as mn, describeTypeWithThrottleRetry as mo, isCustomResource as mr, STATE_SOURCED_CROSS_GENERATION_RULES as ms, planOrphanAdoption as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedScrubResourceEntriesRefusalMessage as na, parseBootstrapMarker as nc, envCredentialsAreAssumedRole as ni, processStackMessages as nl, inheritProducerRegions as nn, coerceCfnBoolean as no, DBPROXY_TAGS_WHAT as nr, inheritNestedStackParameterAssociations as ns, createReadOnlyAttributeHealerFactory as nt, isAbsoluteAssetPath as o, refuseMalformedNestedChildOutputs as oa, buildDenyExternalAccessPolicy as oc, s3BucketDualStackDomainName as oi, nullPrototypeRecord as ol, redactedDeleteAddressSkip as on, configStringRefusal as oo, refuseMalformedDesiredTags as or, provenPublicValue as os, green as ot, readRecordedConditionVerdicts as p, refuseMalformedOutputsForDestroy as pa, finchSecretArgvRefusal as pc, isImpossibleEmptyStoredAttribute as pi, clearBucketRegionCache as pl, exportAliasCollisionScrubWarning as pn, templateResourceTypes as po, ccBrokenReason as pr, STATE_SOURCED_BASELINE_RULES as ps, makeSiblingClaimReader as pt, deleteTableWithIndexBusyRetry as q, MULTI_REGION_RECREATE_BLOCKED_TYPES as qa, uploadCfnTemplate as qc, malformedOrphanRowsKeptWarning as qi, constructPathOf as qn, maskSecretsInText as qo, applyRoleArnIfSet as qr, createAssetRedirectResolver as qs, planRollback as qt, computeImplicitDeleteEdges as r, malformedStateRefusalMessage as ra, readBootstrapMarkerBody as rc, isSettledInstanceState as ri, defineOwnKey as rl, REDACTED_DELETE_ADDRESS_SKIP_REASON as rn, coerceCfnInteger as ro, DBPROXY_TAG_OPTIONS as rr, recordNestedStackParameterExpressions as rs, bold as rt, listNestedTemplateRows as s, refuseMalformedOrphanRecords as sa, buildDockerImage as sc, s3BucketRegionalDomainName as si, ownValue as sl, updatePartialMessage as sn, readConfigString as so, tagMapAsList as sr, recordMaskOnlyValue as ss, red as st, DeployEngine as t, malformedResourcesWarning as ta, isCrossRegionRedirect as tc, callerEnvCredentials as ti, StageLoadError as tl, getCurrentProducerRegions as tn, toFiniteNumber as to, acquireIdempotencyToken as tr, identityKeyFor as ts, formatResourceLine as tt, conditionFingerprint as u, refuseMalformedOrphansForDestroy as ua, describeDockerExecFailure as uc, isUnboundTemplateParameter as ui, displayAssemblyPath as ul, DeploymentEventsStore as un, requireConfigObject as uo, stringifyIfAssigned as ur, recordNoEchoParameterFreshValue as us, namesAnyDeclaredParameter as ut, chunks as v, refuseMalformedResourceEntriesForImport as va, partitionSensitiveEnv as vc, AWS_NO_VALUE as vi, exportNameNoEchoParameters as vn, sameLambdaFunctionAddress as vo, isCustomResourceType as vr, isSingleDynamicReferenceToken as vs, dropSettledNestedJournals as vt, deferredServiceTokenWarning as w, refuseMalformedResourcePropertiesForOrphan as wa, escapeRegExp$3 as wc, parameterInputsFor as wi, isExportAliasCollision as wn, maskReadbackAtCoordinates as wo, CloudControlProvider as wr, CrossPrefixScanCache as ws, withNestedRevertRun as wt, withApiLimit as x, refuseMalformedResourcePropertiesForDestroy as xa, runDockerForeground as xc, refStateLookupFromResource as xi, noEchoParameterValueSeed as xn, canonicalCoordinates as xo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as xr, S3StateBackend as xs, recordDisplacedSkips as xt, isAccessDeniedError as y, refuseMalformedResourceEntriesForImportSave as ya, redactDockerArgvValues as yc, cfnRefValueFromPhysicalId as yi, exportNameSecretExposure as yn, DagBuilder as yo, getCurrentResourceSecrets as yr, LockManager as ys, getNestedRevertRun as yt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as z, findActionableSilentDrops as za, resolveUseCdkBootstrapAssets as zc, malformedDriftResourcePropertiesWarning as zi, buildFinalSnapshotIdentifier as zn, logOnlyValueCount as zo, reEnableInstanceApiTermination as zr, orphansAfterRollback as zs, getStackRecords as zt };
43378
+ //# sourceMappingURL=deploy-engine-dvf1UDuo.js.map