@go-to-k/cdkd 0.291.25 → 0.291.26

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.
@@ -1,6 +1,6 @@
1
1
  import { C as displayAwsMessage, D as isPasteableIdent, E as displayStackName, O as truncateCodePoints, S as UNRENDERABLE, T as displaySafe, d as applyDefaultNameForFallback, f as explicitNamePropertyFor, g as looksLikeCdkdGeneratedName, h as getCurrentStackName, m as generateResourceNameWithFallback, n as getLogger, p as generateResourceName, r as isStdoutReservedForPayload, s as getLiveRenderer, v as withStackName, w as displayIdent, x as STACK_REF_MAX_CODE_POINTS, y as withoutGeneratedFallbackName } from "./logger-Bt0RGDfb.js";
2
2
  import { a as setAssumedRoleCredentials, c as currentStackAwsScope, i as getPreAssumeEnvCredentials, l as runInStackAwsScope, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-jISU4PHo.js";
3
- import { t as getCdkdVersion } from "./version-BuS5njuZ.js";
3
+ import { t as getCdkdVersion } from "./version-BkoR4hMq.js";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -37,7 +37,7 @@ import { KMSClient, ListAliasesCommand } from "@aws-sdk/client-kms";
37
37
  import { readFile } from "fs/promises";
38
38
  import { isAbsolute as isAbsolute$1, resolve as resolve$1 } from "path";
39
39
  import { CreateRepositoryCommand, DescribeImagesCommand as DescribeImagesCommand$1, DescribeRepositoriesCommand, ECRClient, GetAuthorizationTokenCommand, PutImageTagMutabilityCommand } from "@aws-sdk/client-ecr";
40
- import { inspect } from "node:util";
40
+ import { inspect, isDeepStrictEqual } from "node:util";
41
41
  import { hostname } from "os";
42
42
  import graphlib from "graphlib";
43
43
  import { DescribeDBClustersCommand, DescribeDBInstancesCommand, RDSClient } from "@aws-sdk/client-rds";
@@ -3451,6 +3451,24 @@ function displayAssemblyPath(value) {
3451
3451
  return `"${body}"`;
3452
3452
  }
3453
3453
  /**
3454
+ * A file read-or-parse failure's CAUSE, for a message whose subject already
3455
+ * renders the path through {@link displayAssemblyPath} (go-to-k/cdkd#3617).
3456
+ *
3457
+ * - Node's own errno text repeats the path inside Node's quotes
3458
+ * (`ENOENT: no such file or directory, open '<path>'`), so printing
3459
+ * `err.message` whole re-opens the clause-injection the subject closed, one
3460
+ * colon later. Every occurrence of the path is replaced with `<path>` -- the
3461
+ * subject names it, bounded -- and what is left is sanitized.
3462
+ * - A `JSON.parse` failure is reduced to `invalid JSON`: V8 echoes a window of
3463
+ * the file's own bytes verbatim, `'` included, and the file is assembly-chosen
3464
+ * too -- the rule `AssemblyReader`'s `manifestReadFailureText` already states.
3465
+ */
3466
+ function describeFileReadFailure(err, filePath) {
3467
+ if (err instanceof SyntaxError) return "invalid JSON";
3468
+ const message = err instanceof Error ? err.message : String(err);
3469
+ return displaySafe(filePath === "" ? message : message.split(filePath).join("<path>"));
3470
+ }
3471
+ /**
3454
3472
  * The shared tail of every containment refusal: what the value resolved to,
3455
3473
  * what it escaped, and why that means the assembly is not CDK-generated. Each
3456
3474
  * call site supplies its own subject ("Stack 'X' has templateFile='...' which
@@ -3603,11 +3621,11 @@ function collectStackMessages(assemblyDir, artifact) {
3603
3621
  sideFile = JSON.parse(readFileSync(metadataPath, "utf-8"));
3604
3622
  if (sideFile === null || typeof sideFile !== "object" || Array.isArray(sideFile)) throw new Error("expected a JSON object mapping construct paths to metadata entry arrays");
3605
3623
  for (const [path, entries] of Object.entries(sideFile)) {
3606
- if (!Array.isArray(entries)) throw new Error(`entry for path '${path}' is not an array`);
3624
+ if (!Array.isArray(entries)) throw new Error(`entry for path ${displayStackName(path)} is not an array`);
3607
3625
  merged[path] = [...merged[path] ?? [], ...entries];
3608
3626
  }
3609
3627
  } catch (error) {
3610
- throw new SynthesisError(`Failed to read stack metadata file ${displayAssemblyPath(metadataPath)}: ${displaySafe(error instanceof Error ? error.message : String(error))}`, error instanceof Error ? error : void 0);
3628
+ throw new SynthesisError(`Failed to read stack metadata file ${displayAssemblyPath(metadataPath)}: ${describeFileReadFailure(error, metadataPath)}`);
3611
3629
  }
3612
3630
  }
3613
3631
  const messages = [];
@@ -3999,7 +4017,7 @@ var AssemblyReader = class {
3999
4017
  const content = readFileSync(templatePath, "utf-8");
4000
4018
  template = JSON.parse(content);
4001
4019
  } catch (error) {
4002
- throw new SynthesisError(`Failed to read template for stack ${displayStackName(stackName)}: ${displaySafe(error instanceof Error ? error.message : String(error))}`, error instanceof Error ? error : void 0);
4020
+ throw new SynthesisError(`Failed to read template ${displayAssemblyPath(templatePath)} for stack ${displayStackName(stackName)}: ${describeFileReadFailure(error, templatePath)}`);
4003
4021
  }
4004
4022
  this.logger.debug(`Stack: ${displaySafe(stackName)}, Resources: ${Object.keys(template.Resources ?? {}).length}`);
4005
4023
  let assetManifestPath;
@@ -6888,7 +6906,7 @@ function stringifyParamDefault(value, type, paramKey, logger) {
6888
6906
  if (inner !== void 0 && isListParameterType(inner)) return "placeholder,placeholder";
6889
6907
  return "placeholder";
6890
6908
  }
6891
- logger.warn(`Parameter '${displaySafe(paramKey)}' has unrecognized CFn Type '${displaySafe(type)}'; using a generic string placeholder for the transient macro-expansion changeset. If CFn rejects the changeset with a type error, file an issue with the offending Type.`);
6909
+ logger.warn(`Parameter ${displayIdent(paramKey)} has unrecognized CFn Type ${displayIdent(type)}; using a generic string placeholder for the transient macro-expansion changeset. If CFn rejects the changeset with a type error, file an issue with the offending Type.`);
6892
6910
  return PARAMETER_PLACEHOLDER;
6893
6911
  }
6894
6912
  return PARAMETER_PLACEHOLDER;
@@ -9560,7 +9578,7 @@ function warnEscapingBuildKitPaths(source, base, bound) {
9560
9578
  const escape = assemblyPathEscape(base, bound, ref.path);
9561
9579
  if (escape === void 0) continue;
9562
9580
  const verb = ref.write ? "WRITE to" : "read";
9563
- logger.warn(`Docker asset ${ref.field}` + (ref.where === ref.field ? "" : `['${displaySafe(ref.where)}']`) + ` names a host path outside the assembly, which ${renderAssemblyPathEscape(escape, bound, "load", `cdkd will ${verb} it during the image build, matching the CDK CLI — a pre-synthesized assembly is trusted input. If you did not produce this assembly, that is a host path it chose and the CloudFormation template does not show.`)}`);
9581
+ logger.warn(`Docker asset ${ref.field}` + (ref.where === ref.field ? "" : `[${displayIdent(ref.where)}]`) + ` names a host path outside the assembly, which ${renderAssemblyPathEscape(escape, bound, "load", `cdkd will ${verb} it during the image build, matching the CDK CLI — a pre-synthesized assembly is trusted input. If you did not produce this assembly, that is a host path it chose and the CloudFormation template does not show.`)}`);
9564
9582
  }
9565
9583
  }
9566
9584
  /**
@@ -9578,7 +9596,7 @@ function warnManifestExecutable(executable) {
9578
9596
  const [cmd, ...rest] = executable;
9579
9597
  const logger = getLogger().child("assets");
9580
9598
  logger.debug(`source.executable argv: ${redactDockerArgvValues([...executable]).join(" ")}`);
9581
- logger.warn(`Docker asset source.executable runs a command this asset manifest chose, on this machine: '${displaySafe(cmd ?? "")}'` + (rest.length > 0 ? ` (with ${rest.length} argument(s); --verbose shows them)` : "") + ". cdkd runs it, matching the CDK CLI — a pre-synthesized assembly is trusted input. Note that this means deploying from a pre-synthesized assembly DOES execute code from it, which the CloudFormation template does not show.");
9599
+ logger.warn(`Docker asset source.executable runs a command this asset manifest chose, on this machine: ${displayAssemblyPath(cmd ?? "")}` + (rest.length > 0 ? ` (with ${rest.length} argument(s); --verbose shows them)` : "") + ". cdkd runs it, matching the CDK CLI — a pre-synthesized assembly is trusted input. Note that this means deploying from a pre-synthesized assembly DOES execute code from it, which the CloudFormation template does not show.");
9582
9600
  }
9583
9601
  /**
9584
9602
  * One set per KIND rather than one set of composite keys. A `${kind}` + NUL +
@@ -9619,7 +9637,7 @@ function warnUnrecognizedAssetDestination(opts) {
9619
9637
  const seen = warnedDestinations[opts.kind];
9620
9638
  if (seen.has(opts.name)) return;
9621
9639
  seen.add(opts.name);
9622
- getLogger().child("assets").warn(`Asset destination ${opts.kind} '${displaySafe(opts.name)}' is not a CDK-bootstrap or cdkd-managed name, so cdkd uploads there exactly as this asset manifest wrote it, with your credentials. That is what a custom bootstrap looks like and is expected for one; if you did not configure it, the manifest chose where your assets go.`);
9640
+ getLogger().child("assets").warn(`Asset destination ${opts.kind} ${displayIdent(opts.name)} is not a CDK-bootstrap or cdkd-managed name, so cdkd uploads there exactly as this asset manifest wrote it, with your credentials. That is what a custom bootstrap looks like and is expected for one; if you did not configure it, the manifest chose where your assets go.`);
9623
9641
  }
9624
9642
 
9625
9643
  //#endregion
@@ -12428,7 +12446,7 @@ var S3StateBackend = class {
12428
12446
  await this.ensureClientForBucket();
12429
12447
  const newKey = this.getStateKey(stackName, region);
12430
12448
  const shownStackName = this.displayName(stackName);
12431
- const shownRegionName = displaySafe(region, { asciiOnly: true }) || "<unrenderable>";
12449
+ const shownRegionName = displayIdent(region);
12432
12450
  try {
12433
12451
  this.logger.debug(`Getting state for stack: ${shownStackName} (${shownRegionName})`);
12434
12452
  const response = await this.s3Client.send(new GetObjectCommand({
@@ -12436,8 +12454,8 @@ var S3StateBackend = class {
12436
12454
  ...await this.ownerParam(),
12437
12455
  Key: newKey
12438
12456
  }));
12439
- if (!response.Body) throw new StateError(`State file for stack '${shownStackName}' (${shownRegionName}) has no body`);
12440
- if (!response.ETag) throw new StateError(`State file for stack '${shownStackName}' (${shownRegionName}) has no ETag`);
12457
+ if (!response.Body) throw new StateError(`State file for stack ${shownStackName} (${shownRegionName}) has no body`);
12458
+ if (!response.ETag) throw new StateError(`State file for stack ${shownStackName} (${shownRegionName}) has no ETag`);
12441
12459
  const bodyString = await response.Body.transformToString();
12442
12460
  const parsed = this.parseStateBody(bodyString, stackName);
12443
12461
  const { state, divergentBodyRegion } = this.adoptKeyRegion(parsed, region, shownStackName, shownRegionName);
@@ -12451,14 +12469,14 @@ var S3StateBackend = class {
12451
12469
  if (!isNoSuchKey(error)) {
12452
12470
  if (error instanceof StateError) throw error;
12453
12471
  const detail = displaySafe(error instanceof Error ? error.message : String(error), { asciiOnly: true }) || "<unrenderable>";
12454
- throw new StateError(`Failed to get state for stack '${shownStackName}' (${shownRegionName}): ${detail}`, error instanceof Error ? error : void 0);
12472
+ throw new StateError(`Failed to get state for stack ${shownStackName} (${shownRegionName}): ${detail}`, error instanceof Error ? error : void 0);
12455
12473
  }
12456
12474
  this.logger.debug(`No state at new key for stack: ${shownStackName} (${shownRegionName})`);
12457
12475
  }
12458
12476
  const legacy = await this.tryGetLegacy(stackName, region);
12459
12477
  if (legacy) {
12460
- const shownKey = displaySafe(this.getLegacyStateKey(stackName), { asciiOnly: true }) || "<unrenderable>";
12461
- this.logger.warn(`Loaded legacy state for stack '${shownStackName}' from '${shownKey}'. It will be migrated to the region-scoped layout on next save.`);
12478
+ const shownKey = displayIdent(this.getLegacyStateKey(stackName), { maxCodePoints: STACK_REF_MAX_CODE_POINTS });
12479
+ this.logger.warn(`Loaded legacy state for stack ${shownStackName} from ${shownKey}. It will be migrated to the region-scoped layout on next save.`);
12462
12480
  return {
12463
12481
  ...legacy,
12464
12482
  migrationPending: true
@@ -12548,7 +12566,7 @@ var S3StateBackend = class {
12548
12566
  const legacyProbe = await this.probeLegacyState(stackName);
12549
12567
  if (legacyProbe.kind === "unreadable") {
12550
12568
  const safeName = this.displayName(stackName);
12551
- this.logger.warn(`Could not read the legacy state record for '${safeName}' while cleaning up (${legacyProbe.reason}). If one exists it was left in place. Re-run with --verbose for the details.`);
12569
+ this.logger.warn(`Could not read the legacy state record for ${safeName} while cleaning up (${legacyProbe.reason}). If one exists it was left in place. Re-run with --verbose for the details.`);
12552
12570
  }
12553
12571
  if (legacyProbeBelongsTo(legacyProbe, region)) {
12554
12572
  await this.s3Client.send(new DeleteObjectCommand({
@@ -12595,8 +12613,8 @@ var S3StateBackend = class {
12595
12613
  await this.ensureClientForBucket();
12596
12614
  const key = this.getLegacyStateKey(stackName);
12597
12615
  try {
12598
- const safeStack = displaySafe(stackName, { asciiOnly: true }) || "<unrenderable>";
12599
- this.logger.debug(`Deleting legacy state: ${safeStack} (${displaySafe(key, { asciiOnly: true }) || "<unrenderable>"})`);
12616
+ const safeStack = displayStackName(stackName);
12617
+ this.logger.debug(`Deleting legacy state: ${safeStack} (${displayIdent(key, { maxCodePoints: STACK_REF_MAX_CODE_POINTS })})`);
12600
12618
  await this.s3Client.send(new DeleteObjectCommand({
12601
12619
  Bucket: this.config.bucket,
12602
12620
  ...await this.ownerParam(),
@@ -12608,7 +12626,7 @@ var S3StateBackend = class {
12608
12626
  bucket: this.config.bucket,
12609
12627
  operation: "DeleteObject"
12610
12628
  });
12611
- throw new StateError(`Failed to delete legacy state for stack '${displaySafe(stackName, { asciiOnly: true }) || "<unrenderable>"}': ${normalized.message}`, normalized);
12629
+ throw new StateError(`Failed to delete legacy state for stack ${displayStackName(stackName)}: ${normalized.message}`, normalized);
12612
12630
  }
12613
12631
  }
12614
12632
  /**
@@ -13005,7 +13023,7 @@ var S3StateBackend = class {
13005
13023
  * message that renders one goes through here (issue #2170's class).
13006
13024
  */
13007
13025
  displayName(stackName) {
13008
- return displaySafe(stackName, { asciiOnly: true }) || "<unrenderable>";
13026
+ return displayStackName(stackName);
13009
13027
  }
13010
13028
  /**
13011
13029
  * Make the S3 KEY's region the region of the record read from it, and report
@@ -13073,9 +13091,8 @@ var S3StateBackend = class {
13073
13091
  region
13074
13092
  } };
13075
13093
  const kind = describeRegionValueKind(raw);
13076
- this.logger.warn(`State record for stack '${shownStackName}' carries a 'region' of its own (${kind}) that is not the region of the S3 key it was read from ('${shownRegionName}'). cdkd stamps the key's region into every record it writes, so this record was not written by cdkd. Continuing against '${shownRegionName}' — the key is authoritative. Re-run with --verbose to see the recorded value, where it has one to show.`);
13077
- const shownBodyRegion = truncateCodePoints(displaySafe(raw, { asciiOnly: true }), 255);
13078
- this.logger.debug(`State record for stack '${shownStackName}' carries body region ` + (shownBodyRegion.text === "" ? `${kind}, which renders as nothing — its kind above is the whole of it.` : `'${shownBodyRegion.text}'${shownBodyRegion.truncated ? " [cut]" : ""}.`));
13094
+ this.logger.warn(`State record for stack ${shownStackName} carries a 'region' of its own (${kind}) that is not the region of the S3 key it was read from (${shownRegionName}). cdkd stamps the key's region into every record it writes, so this record was not written by cdkd. Continuing against ${shownRegionName} — the key is authoritative. Re-run with --verbose to see the recorded value, where it has one to show.`);
13095
+ this.logger.debug(`State record for stack ${shownStackName} carries body region ` + (displaySafe(raw, { asciiOnly: true }) === "" ? `${kind}, which renders as nothing — its kind above is the whole of it.` : `${displayIdent(raw)}.`));
13079
13096
  return {
13080
13097
  state: {
13081
13098
  ...state,
@@ -13092,7 +13109,7 @@ var S3StateBackend = class {
13092
13109
  Key: this.getLegacyStateKey(stackName)
13093
13110
  }));
13094
13111
  if (!response.Body) {
13095
- this.logger.debug(`Legacy state probe for '${this.displayName(stackName)}': response carried no body`);
13112
+ this.logger.debug(`Legacy state probe for ${this.displayName(stackName)}: response carried no body`);
13096
13113
  return {
13097
13114
  kind: "unreadable",
13098
13115
  reason: "the response carried no body"
@@ -13102,7 +13119,7 @@ var S3StateBackend = class {
13102
13119
  const raw = JSON.parse(bodyString).region;
13103
13120
  if (!raw) return { kind: "no-region" };
13104
13121
  if (typeof raw !== "string") {
13105
- this.logger.debug(`Legacy state probe for '${this.displayName(stackName)}': 'region' is ${typeof raw}, not a string`);
13122
+ this.logger.debug(`Legacy state probe for ${this.displayName(stackName)}: 'region' is ${typeof raw}, not a string`);
13106
13123
  return {
13107
13124
  kind: "unreadable",
13108
13125
  reason: `its 'region' field is ${typeof raw}, not a string`
@@ -13115,7 +13132,7 @@ var S3StateBackend = class {
13115
13132
  } catch (error) {
13116
13133
  if (isNoSuchKey(error)) return { kind: "absent" };
13117
13134
  const { detail } = describeAwsFailure(error);
13118
- this.logger.debug(`Could not read legacy state region for '${this.displayName(stackName)}': ${displaySafe(detail, { asciiOnly: true }) || "<unrenderable>"}`);
13135
+ this.logger.debug(`Could not read legacy state region for ${this.displayName(stackName)}: ${displaySafe(detail, { asciiOnly: true }) || "<unrenderable>"}`);
13119
13136
  const cls = error instanceof Error && error.name ? error.name : "an unknown error";
13120
13137
  return {
13121
13138
  kind: "unreadable",
@@ -13169,12 +13186,12 @@ var S3StateBackend = class {
13169
13186
  const bodyString = await response.Body.transformToString();
13170
13187
  const state = this.parseStateBody(bodyString, stackName);
13171
13188
  if (state.region && state.region !== region) {
13172
- this.logger.debug(`Legacy state for stack '${this.displayName(stackName)}' has region '${displaySafe(state.region, { asciiOnly: true }) || "<unrenderable>"}', not '${displaySafe(region, { asciiOnly: true }) || "<unrenderable>"}' — skipping legacy fallback.`);
13189
+ this.logger.debug(`Legacy state for stack ${this.displayName(stackName)} has region ${displayIdent(state.region)}, not ${displayIdent(region)} — skipping legacy fallback.`);
13173
13190
  return null;
13174
13191
  }
13175
13192
  const legacyRegion = state.region;
13176
13193
  if (legacyRegion !== void 0 && (typeof legacyRegion !== "string" || legacyRegion === "")) {
13177
- this.logger.debug(`Legacy state for stack '${this.displayName(stackName)}' names no usable region (${describeRegionValueKind(legacyRegion)}); reading it as region-less.`);
13194
+ this.logger.debug(`Legacy state for stack ${this.displayName(stackName)} names no usable region (${describeRegionValueKind(legacyRegion)}); reading it as region-less.`);
13178
13195
  const { region: _dropped, ...withoutRegion } = state;
13179
13196
  return {
13180
13197
  state: withoutRegion,
@@ -13188,7 +13205,7 @@ var S3StateBackend = class {
13188
13205
  } catch (error) {
13189
13206
  if (isNoSuchKey(error)) return null;
13190
13207
  const detail = displaySafe(error instanceof Error ? error.message : String(error), { asciiOnly: true }) || "<unrenderable>";
13191
- throw new StateError(`Failed to get legacy state for stack '${this.displayName(stackName)}': ${detail}`, error instanceof Error ? error : void 0);
13208
+ throw new StateError(`Failed to get legacy state for stack ${this.displayName(stackName)}: ${detail}`, error instanceof Error ? error : void 0);
13192
13209
  }
13193
13210
  }
13194
13211
  /**
@@ -13204,18 +13221,18 @@ var S3StateBackend = class {
13204
13221
  } catch (error) {
13205
13222
  const raw = error instanceof Error ? error.message : String(error);
13206
13223
  const detail = displaySafe(raw, { asciiOnly: true }) || "<unrenderable>";
13207
- throw new StateError(`State file for stack '${this.displayName(stackName)}' is not valid JSON: ${detail}`, error instanceof Error ? error : void 0);
13224
+ throw new StateError(`State file for stack ${this.displayName(stackName)} is not valid JSON: ${detail}`, error instanceof Error ? error : void 0);
13208
13225
  }
13209
13226
  if (root === null || typeof root !== "object" || Array.isArray(root)) {
13210
13227
  const got = root === null ? "null" : Array.isArray(root) ? "an array" : `a ${typeof root}`;
13211
- throw new StateError(`State file for stack '${this.displayName(stackName)}' is not a JSON object (it parses to ${got}), so cdkd cannot read it as a state record.`);
13228
+ throw new StateError(`State file for stack ${this.displayName(stackName)} is not a JSON object (it parses to ${got}), so cdkd cannot read it as a state record.`);
13212
13229
  }
13213
13230
  const parsed = root;
13214
13231
  const v = parsed.version;
13215
13232
  if (v !== void 0 && !STATE_SCHEMA_VERSIONS_READABLE.includes(v)) {
13216
13233
  const vShown = v;
13217
13234
  const shown = displaySafe(vShown === null ? "null" : vShown, { asciiOnly: true }) || "<unrenderable>";
13218
- throw new StateError(`Unsupported state schema version ${shown} for stack '${this.displayName(stackName)}'. This cdkd binary supports versions ${STATE_SCHEMA_VERSIONS_READABLE.join(", ")}. Upgrade cdkd to a version that supports schema ${shown}.`);
13235
+ throw new StateError(`Unsupported state schema version ${shown} for stack ${this.displayName(stackName)}. This cdkd binary supports versions ${STATE_SCHEMA_VERSIONS_READABLE.join(", ")}. Upgrade cdkd to a version that supports schema ${shown}.`);
13219
13236
  }
13220
13237
  return parsed;
13221
13238
  }
@@ -13273,7 +13290,7 @@ const LOCK_OBJECT_DESCRIPTION = "a stack lock heartbeat, which records the lock
13273
13290
  * `grep safeSegment` answers it exactly.
13274
13291
  */
13275
13292
  function safeSegment(value) {
13276
- return displaySafe(value, { asciiOnly: true }) || "<unrenderable>";
13293
+ return displayIdent(value, { maxCodePoints: STACK_REF_MAX_CODE_POINTS });
13277
13294
  }
13278
13295
  /**
13279
13296
  * S3-based lock manager using conditional writes (If-None-Match)
@@ -13481,7 +13498,7 @@ var LockManager = class {
13481
13498
  }
13482
13499
  return false;
13483
13500
  }
13484
- throw new LockError(`Failed to acquire lock for stack '${safeSegment(stackName)}' (${safeSegment(region)}): ${displaySafe(error instanceof Error ? error.message : String(error), { asciiOnly: true }) || "<unrenderable>"}`, error instanceof Error ? error : void 0);
13501
+ throw new LockError(`Failed to acquire lock for stack ${safeSegment(stackName)} (${safeSegment(region)}): ${displaySafe(error instanceof Error ? error.message : String(error), { asciiOnly: true }) || "<unrenderable>"}`, error instanceof Error ? error : void 0);
13485
13502
  }
13486
13503
  }
13487
13504
  /**
@@ -13532,7 +13549,7 @@ var LockManager = class {
13532
13549
  ...await this.ownerParam(),
13533
13550
  Key: key
13534
13551
  }));
13535
- if (!response.Body) throw new LockError(`Lock file for stack '${shownStack}' has no body`);
13552
+ if (!response.Body) throw new LockError(`Lock file for stack ${shownStack} has no body`);
13536
13553
  const bodyString = await response.Body.transformToString();
13537
13554
  const raw = JSON.parse(bodyString);
13538
13555
  if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
@@ -13558,7 +13575,7 @@ var LockManager = class {
13558
13575
  }
13559
13576
  if (error instanceof LockError) throw error;
13560
13577
  const detail = displaySafe(error instanceof Error ? error.message : String(error), { asciiOnly: true }) || "<unrenderable>";
13561
- throw new LockError(`Failed to get lock info for stack '${shownStack}': ${detail}`, error instanceof Error ? error : void 0);
13578
+ throw new LockError(`Failed to get lock info for stack ${shownStack}: ${detail}`, error instanceof Error ? error : void 0);
13562
13579
  }
13563
13580
  }
13564
13581
  /**
@@ -13852,7 +13869,7 @@ var LockManager = class {
13852
13869
  objectDescription: LOCK_OBJECT_DESCRIPTION
13853
13870
  });
13854
13871
  } catch (error) {
13855
- report(`Could not purge noncurrent versions of the lock key '${displaySafe(key)}' in bucket '${this.config.bucket}': the purge could not be started. Their previous versions survive and remain readable via GetObject with a VersionId (${LOCK_OBJECT_DESCRIPTION}). Grant s3:ListBucketVersions and s3:DeleteObjectVersion on the state bucket, or purge the key by hand. Underlying error: ${error instanceof Error ? error.message : String(error)}`);
13872
+ report(`Could not purge noncurrent versions of the lock key ${displayIdent(key, { maxCodePoints: STACK_REF_MAX_CODE_POINTS })} in bucket '${this.config.bucket}': the purge could not be started. Their previous versions survive and remain readable via GetObject with a VersionId (${LOCK_OBJECT_DESCRIPTION}). Grant s3:ListBucketVersions and s3:DeleteObjectVersion on the state bucket, or purge the key by hand. Underlying error: ${error instanceof Error ? error.message : String(error)}`);
13856
13873
  }
13857
13874
  }
13858
13875
  /**
@@ -14054,7 +14071,7 @@ var LockManager = class {
14054
14071
  const lockInfo = await this.getLockInfo(stackName, region);
14055
14072
  if (lockInfo) {
14056
14073
  if (attempt < maxRetries) {
14057
- this.logger.info(`Stack '${safeSegment(stackName)}' (${safeSegment(region)}) is locked by ${lockInfo.owner}${lockInfo.operation ? ` (operation: ${lockInfo.operation})` : ""}. Lock ${formatLockExpiry(lockInfo.expiresAt)}. Retrying in ${this.formatDuration(retryDelay)}... (attempt ${attempt + 1}/${maxRetries})`);
14074
+ this.logger.info(`Stack ${safeSegment(stackName)} (${safeSegment(region)}) is locked by ${lockInfo.owner}${lockInfo.operation ? ` (operation: ${lockInfo.operation})` : ""}. Lock ${formatLockExpiry(lockInfo.expiresAt)}. Retrying in ${this.formatDuration(retryDelay)}... (attempt ${attempt + 1}/${maxRetries})`);
14058
14075
  await new Promise((resolve) => setTimeout(resolve, retryDelay));
14059
14076
  continue;
14060
14077
  }
@@ -14066,7 +14083,7 @@ var LockManager = class {
14066
14083
  const recovery = forceUnlockCommand ? `If you are certain no other process is active, run: ${forceUnlockCommand}` : `If you are certain no other process is active, ${UNREPRODUCIBLE_LOCK_CLAUSE.charAt(0).toLowerCase()}${UNREPRODUCIBLE_LOCK_CLAUSE.slice(1)}`;
14067
14084
  const safeStack = safeSegment(stackName);
14068
14085
  const safeRegion = safeSegment(region);
14069
- throw new LockError(`Failed to acquire lock for stack '${safeStack}' (${safeRegion}) after ${maxRetries + 1} attempts. ` + (lockInfo ? `Locked by: ${lockInfo.owner}${lockInfo.operation ? `, operation: ${lockInfo.operation}` : ""}, ${expiry}. ` + recovery : `Lock exists but could not read lock info. ${recovery}`));
14086
+ throw new LockError(`Failed to acquire lock for stack ${safeStack} (${safeRegion}) after ${maxRetries + 1} attempts. ` + (lockInfo ? `Locked by: ${lockInfo.owner}${lockInfo.operation ? `, operation: ${lockInfo.operation}` : ""}, ${expiry}. ` + recovery : `Lock exists but could not read lock info. ${recovery}`));
14070
14087
  }
14071
14088
  };
14072
14089
  /**
@@ -14701,6 +14718,117 @@ function carriesSecretMask(value) {
14701
14718
  return walk(value);
14702
14719
  }
14703
14720
  /**
14721
+ * The mask-only plaintexts of a pass that are a `NoEcho` value SUPPLIED IN THIS
14722
+ * DEPLOY (go-to-k/cdkd#3662), keyed by the pass's map exactly like
14723
+ * {@link resolvedPairsOf}: a copy of the map is a different pass and starts
14724
+ * with none.
14725
+ *
14726
+ * WHY A SIDE SET, when the sentinel value is otherwise the whole marker: the
14727
+ * mask-only class has TWO populations and one question tells them apart. A
14728
+ * `NoEcho` value (a handler's `Data`, or a producer output recovered from this
14729
+ * process) is fresh evidence that can differ from what the record's `***`
14730
+ * stood for. A DERIVED needle (`Fn::Base64` over a `{{resolve:...}}` input,
14731
+ * issue #2759) is the encoding of a secret whose reference the record already
14732
+ * positions, and treating it as fresh would update that resource on every
14733
+ * deploy — measured on the #3662 review round with a Base64 `UserData`. The
14734
+ * engine's no-change skip asks {@link carriesFreshNoEchoValue}, and only the
14735
+ * first population answers it.
14736
+ */
14737
+ const freshNoEchoValuesOf = /* @__PURE__ */ new WeakMap();
14738
+ function freshNoEchoSet(secrets) {
14739
+ let set = freshNoEchoValuesOf.get(secrets);
14740
+ if (set === void 0) {
14741
+ set = /* @__PURE__ */ new Set();
14742
+ freshNoEchoValuesOf.set(secrets, set);
14743
+ }
14744
+ return set;
14745
+ }
14746
+ /**
14747
+ * {@link recordMaskOnlyValuesIn} for a `NoEcho` value supplied in THIS deploy,
14748
+ * which additionally marks each leaf it registered as FRESH (see
14749
+ * {@link freshNoEchoValuesOf}). The three writers are the ones that hold such a
14750
+ * value: the resolver's `Fn::GetAtt` note for a resource whose provider
14751
+ * declared `NoEcho` earlier in this run, the cross-stack recovery of an output
14752
+ * this process masked, and `Fn::Base64` over an input that embeds one.
14753
+ */
14754
+ function recordFreshNoEchoValuesIn(value, secrets, excluded) {
14755
+ recordMaskOnlyValuesIn(value, secrets, excluded);
14756
+ const fresh = freshNoEchoSet(secrets);
14757
+ const seen = /* @__PURE__ */ new Set();
14758
+ const walk = (node) => {
14759
+ if (typeof node === "string") {
14760
+ if (excluded?.has(node) !== true && isMaskOnlyPlaintext(secrets, node)) fresh.add(node);
14761
+ return;
14762
+ }
14763
+ if (node === null || typeof node !== "object") return;
14764
+ if (seen.has(node)) return;
14765
+ seen.add(node);
14766
+ if (Array.isArray(node)) {
14767
+ for (const item of node) walk(item);
14768
+ return;
14769
+ }
14770
+ for (const child of Object.values(node)) walk(child);
14771
+ };
14772
+ walk(value);
14773
+ }
14774
+ /**
14775
+ * Carry the FRESH mark of `plaintext` from `from` into `to`, when `from` marks
14776
+ * it and `to` holds it as mask-only (go-to-k/cdkd#3717). The one caller is the
14777
+ * resolver's inherited-parameter recording in a nested CHILD: the parent's
14778
+ * bag for the `AWS::CloudFormation::Stack` row is where a `NoEcho` value this
14779
+ * deploy supplied was marked, and the child resource reading the parameter
14780
+ * records the pair into its OWN bag, a different pass — which is exactly the
14781
+ * copy {@link freshNoEchoValuesOf} otherwise starts empty, so without this the
14782
+ * child's no-change skip read the new value's `***` as equal to its record.
14783
+ */
14784
+ function carryFreshNoEchoMark(from, to, plaintext) {
14785
+ if (freshNoEchoValuesOf.get(from)?.has(plaintext) !== true) return;
14786
+ if (!isMaskOnlyPlaintext(to, plaintext)) return;
14787
+ freshNoEchoSet(to).add(plaintext);
14788
+ }
14789
+ /**
14790
+ * Does `text` EMBED a fresh `NoEcho` value of this pass? Asked by
14791
+ * `Fn::Base64`, whose encoded result is a new plaintext that carries the
14792
+ * value's freshness along with its secrecy.
14793
+ */
14794
+ function embedsFreshNoEchoValue(text, secrets) {
14795
+ const fresh = freshNoEchoValuesOf.get(secrets);
14796
+ if (fresh === void 0) return false;
14797
+ for (const value of fresh) if (isMaskOnlyPlaintext(secrets, value) && text.includes(value)) return true;
14798
+ return false;
14799
+ }
14800
+ /**
14801
+ * Does `value` hold a string leaf that {@link redactSecretsForState} will
14802
+ * replace with {@link SECRET_MASK} AND that is a `NoEcho` value supplied in
14803
+ * this deploy (go-to-k/cdkd#3662)?
14804
+ *
14805
+ * A mask-only needle reaches only the whole-value arm, so such a leaf is
14806
+ * masked exactly when the WHOLE leaf is the plaintext. What makes the question
14807
+ * worth asking: the mask identifies nothing. Two expression-redacted bags that
14808
+ * compare equal hold the same references, which is what a rotated secret
14809
+ * behind an unchanged `{{resolve:...}}` means. Two mask-redacted bags that
14810
+ * compare equal prove only that both hold SOME `NoEcho` value, so a caller
14811
+ * deciding "nothing changed" from such a comparison has to ask this first.
14812
+ *
14813
+ * A leaf that already IS the mask does not count: it was read back from state
14814
+ * (the resolver records that read as a redacted read), not supplied fresh in
14815
+ * this pass. Neither does a derived needle (see {@link freshNoEchoValuesOf}).
14816
+ */
14817
+ function carriesFreshNoEchoValue(value, secrets) {
14818
+ const fresh = freshNoEchoValuesOf.get(secrets);
14819
+ if (fresh === void 0 || fresh.size === 0) return false;
14820
+ const seen = /* @__PURE__ */ new Set();
14821
+ const walk = (node) => {
14822
+ if (typeof node === "string") return fresh.has(node) && isMaskOnlyPlaintext(secrets, node);
14823
+ if (node === null || typeof node !== "object") return false;
14824
+ if (seen.has(node)) return false;
14825
+ seen.add(node);
14826
+ if (Array.isArray(node)) return node.some((item) => walk(item));
14827
+ return Object.values(node).some((child) => walk(child));
14828
+ };
14829
+ return walk(value);
14830
+ }
14831
+ /**
14704
14832
  * The plaintexts the PERSIST path may scan for as SUBSTRINGS — every recorded
14705
14833
  * one except the mask-only class. See the mask-only channel note above for why the
14706
14834
  * mask class is whole-leaf only.
@@ -20557,7 +20685,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20557
20685
  ["AWS::ApiGateway::Account", {
20558
20686
  handled: /* @__PURE__ */ new Set(["CloudWatchRoleArn"]),
20559
20687
  silentDrop: /* @__PURE__ */ new Map(),
20560
- createOnlyDrops: /* @__PURE__ */ new Set()
20688
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20689
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
20690
+ ccRouteUnavailable: false
20561
20691
  }],
20562
20692
  ["AWS::ApiGateway::Authorizer", {
20563
20693
  handled: /* @__PURE__ */ new Set([
@@ -20573,7 +20703,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20573
20703
  "Type"
20574
20704
  ]),
20575
20705
  silentDrop: /* @__PURE__ */ new Map(),
20576
- createOnlyDrops: /* @__PURE__ */ new Set()
20706
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20707
+ readOnly: /* @__PURE__ */ new Set(["AuthorizerId"]),
20708
+ ccRouteUnavailable: false
20577
20709
  }],
20578
20710
  ["AWS::ApiGateway::Deployment", {
20579
20711
  handled: /* @__PURE__ */ new Set(["Description", "RestApiId"]),
@@ -20582,7 +20714,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20582
20714
  ["StageDescription", "CFn-only convenience for inline-creating a Stage; declare AWS::ApiGateway::Stage with the Description property instead"],
20583
20715
  ["StageName", "CFn-only convenience for inline-creating a Stage from a Deployment; declare AWS::ApiGateway::Stage explicitly to attach to this Deployment"]
20584
20716
  ]),
20585
- createOnlyDrops: /* @__PURE__ */ new Set(["DeploymentCanarySettings"])
20717
+ createOnlyDrops: /* @__PURE__ */ new Set(["DeploymentCanarySettings"]),
20718
+ readOnly: /* @__PURE__ */ new Set(["DeploymentId"]),
20719
+ ccRouteUnavailable: false
20586
20720
  }],
20587
20721
  ["AWS::ApiGateway::Method", {
20588
20722
  handled: /* @__PURE__ */ new Set([
@@ -20601,7 +20735,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20601
20735
  "RestApiId"
20602
20736
  ]),
20603
20737
  silentDrop: /* @__PURE__ */ new Map(),
20604
- createOnlyDrops: /* @__PURE__ */ new Set()
20738
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20739
+ readOnly: /* @__PURE__ */ new Set(),
20740
+ ccRouteUnavailable: false
20605
20741
  }],
20606
20742
  ["AWS::ApiGateway::Resource", {
20607
20743
  handled: /* @__PURE__ */ new Set([
@@ -20610,7 +20746,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20610
20746
  "RestApiId"
20611
20747
  ]),
20612
20748
  silentDrop: /* @__PURE__ */ new Map(),
20613
- createOnlyDrops: /* @__PURE__ */ new Set()
20749
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20750
+ readOnly: /* @__PURE__ */ new Set(["ResourceId"]),
20751
+ ccRouteUnavailable: false
20614
20752
  }],
20615
20753
  ["AWS::ApiGateway::Stage", {
20616
20754
  handled: /* @__PURE__ */ new Set([
@@ -20630,7 +20768,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20630
20768
  "Variables"
20631
20769
  ]),
20632
20770
  silentDrop: /* @__PURE__ */ new Map(),
20633
- createOnlyDrops: /* @__PURE__ */ new Set()
20771
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20772
+ readOnly: /* @__PURE__ */ new Set(),
20773
+ ccRouteUnavailable: false
20634
20774
  }],
20635
20775
  ["AWS::ApiGatewayV2::Api", {
20636
20776
  handled: /* @__PURE__ */ new Set([
@@ -20655,7 +20795,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20655
20795
  ["RouteKey", "Quick-create shortcut: CreateApi inline-creates a default route+integration from RouteKey/Target/CredentialsArn. cdkd models routes/integrations as explicit AWS::ApiGatewayV2::Route/::Integration resources, so this convenience field is not wired."],
20656
20796
  ["Target", "Quick-create shortcut (paired with RouteKey/CredentialsArn); cdkd models the integration as an explicit AWS::ApiGatewayV2::Integration resource instead."]
20657
20797
  ]),
20658
- createOnlyDrops: /* @__PURE__ */ new Set()
20798
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20799
+ readOnly: /* @__PURE__ */ new Set([
20800
+ "ApiEndpoint",
20801
+ "ApiId",
20802
+ "ExecuteApiArn"
20803
+ ]),
20804
+ ccRouteUnavailable: false
20659
20805
  }],
20660
20806
  ["AWS::ApiGatewayV2::Authorizer", {
20661
20807
  handled: /* @__PURE__ */ new Set([
@@ -20672,7 +20818,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20672
20818
  "Name"
20673
20819
  ]),
20674
20820
  silentDrop: /* @__PURE__ */ new Map(),
20675
- createOnlyDrops: /* @__PURE__ */ new Set()
20821
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20822
+ readOnly: /* @__PURE__ */ new Set(["AuthorizerId"]),
20823
+ ccRouteUnavailable: false
20676
20824
  }],
20677
20825
  ["AWS::ApiGatewayV2::Integration", {
20678
20826
  handled: /* @__PURE__ */ new Set([
@@ -20696,7 +20844,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20696
20844
  "TlsConfig"
20697
20845
  ]),
20698
20846
  silentDrop: /* @__PURE__ */ new Map(),
20699
- createOnlyDrops: /* @__PURE__ */ new Set()
20847
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20848
+ readOnly: /* @__PURE__ */ new Set(["IntegrationId"]),
20849
+ ccRouteUnavailable: false
20700
20850
  }],
20701
20851
  ["AWS::ApiGatewayV2::Route", {
20702
20852
  handled: /* @__PURE__ */ new Set([
@@ -20714,7 +20864,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20714
20864
  "Target"
20715
20865
  ]),
20716
20866
  silentDrop: /* @__PURE__ */ new Map(),
20717
- createOnlyDrops: /* @__PURE__ */ new Set()
20867
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20868
+ readOnly: /* @__PURE__ */ new Set(["RouteId"]),
20869
+ ccRouteUnavailable: false
20718
20870
  }],
20719
20871
  ["AWS::ApiGatewayV2::Stage", {
20720
20872
  handled: /* @__PURE__ */ new Set([
@@ -20731,7 +20883,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20731
20883
  "Tags"
20732
20884
  ]),
20733
20885
  silentDrop: /* @__PURE__ */ new Map(),
20734
- createOnlyDrops: /* @__PURE__ */ new Set()
20886
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20887
+ readOnly: /* @__PURE__ */ new Set(),
20888
+ ccRouteUnavailable: false
20735
20889
  }],
20736
20890
  ["AWS::AppSync::ApiKey", {
20737
20891
  handled: /* @__PURE__ */ new Set([
@@ -20740,7 +20894,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20740
20894
  "Expires"
20741
20895
  ]),
20742
20896
  silentDrop: /* @__PURE__ */ new Map(),
20743
- createOnlyDrops: /* @__PURE__ */ new Set()
20897
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20898
+ readOnly: /* @__PURE__ */ new Set([
20899
+ "ApiKey",
20900
+ "ApiKeyId",
20901
+ "Arn"
20902
+ ]),
20903
+ ccRouteUnavailable: false
20744
20904
  }],
20745
20905
  ["AWS::AppSync::DataSource", {
20746
20906
  handled: /* @__PURE__ */ new Set([
@@ -20759,7 +20919,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20759
20919
  "Type"
20760
20920
  ]),
20761
20921
  silentDrop: /* @__PURE__ */ new Map(),
20762
- createOnlyDrops: /* @__PURE__ */ new Set()
20922
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20923
+ readOnly: /* @__PURE__ */ new Set(["DataSourceArn"]),
20924
+ ccRouteUnavailable: false
20763
20925
  }],
20764
20926
  ["AWS::AppSync::GraphQLApi", {
20765
20927
  handled: /* @__PURE__ */ new Set([
@@ -20783,7 +20945,17 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20783
20945
  "XrayEnabled"
20784
20946
  ]),
20785
20947
  silentDrop: /* @__PURE__ */ new Map(),
20786
- createOnlyDrops: /* @__PURE__ */ new Set()
20948
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20949
+ readOnly: /* @__PURE__ */ new Set([
20950
+ "ApiId",
20951
+ "Arn",
20952
+ "GraphQLDns",
20953
+ "GraphQLEndpointArn",
20954
+ "GraphQLUrl",
20955
+ "RealtimeDns",
20956
+ "RealtimeUrl"
20957
+ ]),
20958
+ ccRouteUnavailable: false
20787
20959
  }],
20788
20960
  ["AWS::AppSync::GraphQLSchema", {
20789
20961
  handled: /* @__PURE__ */ new Set([
@@ -20792,7 +20964,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20792
20964
  "DefinitionS3Location"
20793
20965
  ]),
20794
20966
  silentDrop: /* @__PURE__ */ new Map(),
20795
- createOnlyDrops: /* @__PURE__ */ new Set()
20967
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20968
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
20969
+ ccRouteUnavailable: false
20796
20970
  }],
20797
20971
  ["AWS::AppSync::Resolver", {
20798
20972
  handled: /* @__PURE__ */ new Set([
@@ -20815,7 +20989,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20815
20989
  "TypeName"
20816
20990
  ]),
20817
20991
  silentDrop: /* @__PURE__ */ new Map(),
20818
- createOnlyDrops: /* @__PURE__ */ new Set()
20992
+ createOnlyDrops: /* @__PURE__ */ new Set(),
20993
+ readOnly: /* @__PURE__ */ new Set(["ResolverArn"]),
20994
+ ccRouteUnavailable: false
20819
20995
  }],
20820
20996
  ["AWS::AutoScaling::AutoScalingGroup", {
20821
20997
  handled: /* @__PURE__ */ new Set([
@@ -20861,17 +21037,32 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20861
21037
  ["NotificationConfiguration", "Legacy singular form; use NotificationConfigurations (plural) which cdkd already wires"],
20862
21038
  ["PlacementGroup", "not yet implemented by cdkd"]
20863
21039
  ]),
20864
- createOnlyDrops: /* @__PURE__ */ new Set(["InstanceId"])
21040
+ createOnlyDrops: /* @__PURE__ */ new Set(["InstanceId"]),
21041
+ readOnly: /* @__PURE__ */ new Set(["AutoScalingGroupARN"]),
21042
+ ccRouteUnavailable: false
20865
21043
  }],
20866
21044
  ["AWS::BedrockAgentCore::Browser", {
20867
21045
  handled: /* @__PURE__ */ new Set(),
20868
21046
  silentDrop: /* @__PURE__ */ new Map(),
20869
- createOnlyDrops: /* @__PURE__ */ new Set()
21047
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21048
+ readOnly: /* @__PURE__ */ new Set([
21049
+ "BrowserArn",
21050
+ "BrowserId",
21051
+ "Name",
21052
+ "Status"
21053
+ ]),
21054
+ ccRouteUnavailable: false
20870
21055
  }],
20871
21056
  ["AWS::BedrockAgentCore::CodeInterpreter", {
20872
21057
  handled: /* @__PURE__ */ new Set(),
20873
21058
  silentDrop: /* @__PURE__ */ new Map(),
20874
- createOnlyDrops: /* @__PURE__ */ new Set()
21059
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21060
+ readOnly: /* @__PURE__ */ new Set([
21061
+ "CodeInterpreterArn",
21062
+ "CodeInterpreterId",
21063
+ "Status"
21064
+ ]),
21065
+ ccRouteUnavailable: false
20875
21066
  }],
20876
21067
  ["AWS::BedrockAgentCore::Evaluator", {
20877
21068
  handled: /* @__PURE__ */ new Set([
@@ -20883,7 +21074,15 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20883
21074
  "Tags"
20884
21075
  ]),
20885
21076
  silentDrop: /* @__PURE__ */ new Map(),
20886
- createOnlyDrops: /* @__PURE__ */ new Set()
21077
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21078
+ readOnly: /* @__PURE__ */ new Set([
21079
+ "CreatedAt",
21080
+ "EvaluatorArn",
21081
+ "EvaluatorId",
21082
+ "Status",
21083
+ "UpdatedAt"
21084
+ ]),
21085
+ ccRouteUnavailable: false
20887
21086
  }],
20888
21087
  ["AWS::BedrockAgentCore::Runtime", {
20889
21088
  handled: /* @__PURE__ */ new Set([
@@ -20905,7 +21104,18 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20905
21104
  ["RequestHeaderConfiguration", "not yet implemented by cdkd"],
20906
21105
  ["Tags", "not yet implemented by cdkd"]
20907
21106
  ]),
20908
- createOnlyDrops: /* @__PURE__ */ new Set()
21107
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21108
+ readOnly: /* @__PURE__ */ new Set([
21109
+ "AgentRuntimeArn",
21110
+ "AgentRuntimeId",
21111
+ "AgentRuntimeVersion",
21112
+ "CreatedAt",
21113
+ "FailureReason",
21114
+ "LastUpdatedAt",
21115
+ "Status",
21116
+ "WorkloadIdentityDetails"
21117
+ ]),
21118
+ ccRouteUnavailable: false
20909
21119
  }],
20910
21120
  ["AWS::Budgets::Budget", {
20911
21121
  handled: /* @__PURE__ */ new Set([
@@ -20914,7 +21124,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20914
21124
  "ResourceTags"
20915
21125
  ]),
20916
21126
  silentDrop: /* @__PURE__ */ new Map(),
20917
- createOnlyDrops: /* @__PURE__ */ new Set()
21127
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21128
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21129
+ ccRouteUnavailable: false
20918
21130
  }],
20919
21131
  ["AWS::CertificateManager::Certificate", {
20920
21132
  handled: /* @__PURE__ */ new Set([
@@ -20929,7 +21141,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20929
21141
  "ValidationMethod"
20930
21142
  ]),
20931
21143
  silentDrop: /* @__PURE__ */ new Map(),
20932
- createOnlyDrops: /* @__PURE__ */ new Set()
21144
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21145
+ readOnly: /* @__PURE__ */ new Set(["CertificateArn"]),
21146
+ ccRouteUnavailable: false
20933
21147
  }],
20934
21148
  ["AWS::CloudFormation::Stack", {
20935
21149
  handled: /* @__PURE__ */ new Set(["Parameters", "TemplateURL"]),
@@ -20948,27 +21162,46 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20948
21162
  ["TemplateBody", "CFn-only inline template — cdkd reads the child template from the synth output via Metadata['aws:asset:path'] instead of accepting it inline"],
20949
21163
  ["TimeoutInMinutes", "CFn-only stack-create deadline — cdkd uses per-resource --resource-timeout instead (issue #459 design §9)"]
20950
21164
  ]),
20951
- createOnlyDrops: /* @__PURE__ */ new Set(["StackName"])
21165
+ createOnlyDrops: /* @__PURE__ */ new Set(["StackName"]),
21166
+ readOnly: /* @__PURE__ */ new Set([
21167
+ "ChangeSetId",
21168
+ "CreationTime",
21169
+ "LastUpdateTime",
21170
+ "Outputs",
21171
+ "ParentId",
21172
+ "RootId",
21173
+ "StackId",
21174
+ "StackStatus"
21175
+ ]),
21176
+ ccRouteUnavailable: true
20952
21177
  }],
20953
21178
  ["AWS::CloudFormation::WaitConditionHandle", {
20954
21179
  handled: /* @__PURE__ */ new Set(),
20955
21180
  silentDrop: /* @__PURE__ */ new Map(),
20956
- createOnlyDrops: /* @__PURE__ */ new Set()
21181
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21182
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21183
+ ccRouteUnavailable: false
20957
21184
  }],
20958
21185
  ["AWS::CloudFront::CloudFrontOriginAccessIdentity", {
20959
21186
  handled: /* @__PURE__ */ new Set(["CloudFrontOriginAccessIdentityConfig"]),
20960
21187
  silentDrop: /* @__PURE__ */ new Map(),
20961
- createOnlyDrops: /* @__PURE__ */ new Set()
21188
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21189
+ readOnly: /* @__PURE__ */ new Set(["Id", "S3CanonicalUserId"]),
21190
+ ccRouteUnavailable: false
20962
21191
  }],
20963
21192
  ["AWS::CloudFront::Distribution", {
20964
21193
  handled: /* @__PURE__ */ new Set(["DistributionConfig", "Tags"]),
20965
21194
  silentDrop: /* @__PURE__ */ new Map(),
20966
- createOnlyDrops: /* @__PURE__ */ new Set()
21195
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21196
+ readOnly: /* @__PURE__ */ new Set(["DomainName", "Id"]),
21197
+ ccRouteUnavailable: false
20967
21198
  }],
20968
21199
  ["AWS::CloudFront::OriginAccessControl", {
20969
21200
  handled: /* @__PURE__ */ new Set(["OriginAccessControlConfig"]),
20970
21201
  silentDrop: /* @__PURE__ */ new Map(),
20971
- createOnlyDrops: /* @__PURE__ */ new Set()
21202
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21203
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21204
+ ccRouteUnavailable: false
20972
21205
  }],
20973
21206
  ["AWS::CloudTrail::Trail", {
20974
21207
  handled: /* @__PURE__ */ new Set([
@@ -20989,7 +21222,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20989
21222
  "TrailName"
20990
21223
  ]),
20991
21224
  silentDrop: /* @__PURE__ */ new Map([["AdvancedEventSelectors", "not yet implemented by cdkd"], ["AggregationConfigurations", "not yet implemented by cdkd"]]),
20992
- createOnlyDrops: /* @__PURE__ */ new Set()
21225
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21226
+ readOnly: /* @__PURE__ */ new Set(["Arn", "SnsTopicArn"]),
21227
+ ccRouteUnavailable: false
20993
21228
  }],
20994
21229
  ["AWS::CloudWatch::Alarm", {
20995
21230
  handled: /* @__PURE__ */ new Set([
@@ -21022,7 +21257,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21022
21257
  ["EvaluationWindow", "not yet implemented by cdkd"],
21023
21258
  ["WarmUpConfiguration", "not yet implemented by cdkd"]
21024
21259
  ]),
21025
- createOnlyDrops: /* @__PURE__ */ new Set()
21260
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21261
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
21262
+ ccRouteUnavailable: false
21026
21263
  }],
21027
21264
  ["AWS::CloudWatch::AnomalyDetector", {
21028
21265
  handled: /* @__PURE__ */ new Set([
@@ -21036,7 +21273,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21036
21273
  "Stat"
21037
21274
  ]),
21038
21275
  silentDrop: /* @__PURE__ */ new Map(),
21039
- createOnlyDrops: /* @__PURE__ */ new Set()
21276
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21277
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21278
+ ccRouteUnavailable: true
21040
21279
  }],
21041
21280
  ["AWS::CodeBuild::Project", {
21042
21281
  handled: /* @__PURE__ */ new Set([
@@ -21068,7 +21307,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21068
21307
  ["Triggers", "not yet implemented by cdkd"],
21069
21308
  ["Visibility", "not yet implemented by cdkd"]
21070
21309
  ]),
21071
- createOnlyDrops: /* @__PURE__ */ new Set()
21310
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21311
+ readOnly: /* @__PURE__ */ new Set(["Arn", "Id"]),
21312
+ ccRouteUnavailable: false
21072
21313
  }],
21073
21314
  ["AWS::CodeCommit::Repository", {
21074
21315
  handled: /* @__PURE__ */ new Set([
@@ -21080,7 +21321,15 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21080
21321
  "Triggers"
21081
21322
  ]),
21082
21323
  silentDrop: /* @__PURE__ */ new Map(),
21083
- createOnlyDrops: /* @__PURE__ */ new Set()
21324
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21325
+ readOnly: /* @__PURE__ */ new Set([
21326
+ "Arn",
21327
+ "CloneUrlHttp",
21328
+ "CloneUrlSsh",
21329
+ "Name",
21330
+ "RepositoryId"
21331
+ ]),
21332
+ ccRouteUnavailable: false
21084
21333
  }],
21085
21334
  ["AWS::Cognito::UserPool", {
21086
21335
  handled: /* @__PURE__ */ new Set([
@@ -21116,7 +21365,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21116
21365
  "WebAuthnUserVerification"
21117
21366
  ]),
21118
21367
  silentDrop: /* @__PURE__ */ new Map([["IssuerConfiguration", "not yet implemented by cdkd"], ["KeyConfiguration", "not yet implemented by cdkd"]]),
21119
- createOnlyDrops: /* @__PURE__ */ new Set()
21368
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21369
+ readOnly: /* @__PURE__ */ new Set([
21370
+ "Arn",
21371
+ "ProviderName",
21372
+ "ProviderURL",
21373
+ "UserPoolId"
21374
+ ]),
21375
+ ccRouteUnavailable: false
21120
21376
  }],
21121
21377
  ["AWS::DLM::LifecyclePolicy", {
21122
21378
  handled: /* @__PURE__ */ new Set([
@@ -21134,7 +21390,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21134
21390
  "Tags"
21135
21391
  ]),
21136
21392
  silentDrop: /* @__PURE__ */ new Map(),
21137
- createOnlyDrops: /* @__PURE__ */ new Set()
21393
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21394
+ readOnly: /* @__PURE__ */ new Set(["Arn", "PolicyId"]),
21395
+ ccRouteUnavailable: false
21138
21396
  }],
21139
21397
  ["AWS::DocDB::DBCluster", {
21140
21398
  handled: /* @__PURE__ */ new Set([
@@ -21175,7 +21433,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21175
21433
  "AvailabilityZones",
21176
21434
  "SnapshotIdentifier",
21177
21435
  "SourceDBClusterIdentifier"
21178
- ])
21436
+ ]),
21437
+ readOnly: /* @__PURE__ */ new Set([
21438
+ "ClusterResourceId",
21439
+ "Endpoint",
21440
+ "Id",
21441
+ "ReadEndpoint"
21442
+ ]),
21443
+ ccRouteUnavailable: false
21179
21444
  }],
21180
21445
  ["AWS::DocDB::DBInstance", {
21181
21446
  handled: /* @__PURE__ */ new Set([
@@ -21192,7 +21457,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21192
21457
  ["CertificateRotationRestart", "not yet implemented by cdkd"],
21193
21458
  ["EnablePerformanceInsights", "not yet implemented by cdkd"]
21194
21459
  ]),
21195
- createOnlyDrops: /* @__PURE__ */ new Set()
21460
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21461
+ readOnly: /* @__PURE__ */ new Set([
21462
+ "Endpoint",
21463
+ "Id",
21464
+ "Port"
21465
+ ]),
21466
+ ccRouteUnavailable: false
21196
21467
  }],
21197
21468
  ["AWS::DocDB::DBSubnetGroup", {
21198
21469
  handled: /* @__PURE__ */ new Set([
@@ -21202,7 +21473,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21202
21473
  "Tags"
21203
21474
  ]),
21204
21475
  silentDrop: /* @__PURE__ */ new Map(),
21205
- createOnlyDrops: /* @__PURE__ */ new Set()
21476
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21477
+ readOnly: /* @__PURE__ */ new Set(),
21478
+ ccRouteUnavailable: false
21206
21479
  }],
21207
21480
  ["AWS::DynamoDB::GlobalTable", {
21208
21481
  handled: /* @__PURE__ */ new Set([
@@ -21230,7 +21503,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21230
21503
  ["VectorIndexes", "not yet implemented by cdkd"],
21231
21504
  ["WarmThroughput", "not yet implemented by cdkd"]
21232
21505
  ]),
21233
- createOnlyDrops: /* @__PURE__ */ new Set()
21506
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21507
+ readOnly: /* @__PURE__ */ new Set([
21508
+ "Arn",
21509
+ "StreamArn",
21510
+ "TableId"
21511
+ ]),
21512
+ ccRouteUnavailable: false
21234
21513
  }],
21235
21514
  ["AWS::DynamoDB::Table", {
21236
21515
  handled: /* @__PURE__ */ new Set([
@@ -21255,7 +21534,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21255
21534
  "WarmThroughput"
21256
21535
  ]),
21257
21536
  silentDrop: /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"], ["VectorIndexes", "not yet implemented by cdkd"]]),
21258
- createOnlyDrops: /* @__PURE__ */ new Set(["ImportSourceSpecification"])
21537
+ createOnlyDrops: /* @__PURE__ */ new Set(["ImportSourceSpecification"]),
21538
+ readOnly: /* @__PURE__ */ new Set(["Arn", "StreamArn"]),
21539
+ ccRouteUnavailable: false
21259
21540
  }],
21260
21541
  ["AWS::EC2::EIP", {
21261
21542
  handled: /* @__PURE__ */ new Set([
@@ -21274,7 +21555,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21274
21555
  "Address",
21275
21556
  "IpamPoolId",
21276
21557
  "TransferAddress"
21277
- ])
21558
+ ]),
21559
+ readOnly: /* @__PURE__ */ new Set(["AllocationId", "PublicIp"]),
21560
+ ccRouteUnavailable: false
21278
21561
  }],
21279
21562
  ["AWS::EC2::Instance", {
21280
21563
  handled: /* @__PURE__ */ new Set([
@@ -21335,12 +21618,24 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21335
21618
  "LicenseSpecifications",
21336
21619
  "PlacementGroupName",
21337
21620
  "PrivateIpAddress"
21338
- ])
21621
+ ]),
21622
+ readOnly: /* @__PURE__ */ new Set([
21623
+ "InstanceId",
21624
+ "PrivateDnsName",
21625
+ "PrivateIp",
21626
+ "PublicDnsName",
21627
+ "PublicIp",
21628
+ "State",
21629
+ "VpcId"
21630
+ ]),
21631
+ ccRouteUnavailable: false
21339
21632
  }],
21340
21633
  ["AWS::EC2::InternetGateway", {
21341
21634
  handled: /* @__PURE__ */ new Set(["Tags"]),
21342
21635
  silentDrop: /* @__PURE__ */ new Map(),
21343
- createOnlyDrops: /* @__PURE__ */ new Set()
21636
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21637
+ readOnly: /* @__PURE__ */ new Set(["InternetGatewayId"]),
21638
+ ccRouteUnavailable: false
21344
21639
  }],
21345
21640
  ["AWS::EC2::NatGateway", {
21346
21641
  handled: /* @__PURE__ */ new Set([
@@ -21359,12 +21654,22 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21359
21654
  ["MaxDrainDurationSeconds", "write-only address-drain timeout with no CreateNatGateway member and no NAT gateway modify API; only ec2:DisassociateNatGatewayAddress / UnassignPrivateNatGatewayAddress accept it, and cdkd rejects NatGateway updates outright — routed via Cloud Control instead"],
21360
21655
  ["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]
21361
21656
  ]),
21362
- createOnlyDrops: /* @__PURE__ */ new Set(["AvailabilityMode", "VpcId"])
21657
+ createOnlyDrops: /* @__PURE__ */ new Set(["AvailabilityMode", "VpcId"]),
21658
+ readOnly: /* @__PURE__ */ new Set([
21659
+ "AutoProvisionZones",
21660
+ "AutoScalingIps",
21661
+ "EniId",
21662
+ "NatGatewayId",
21663
+ "RouteTableId"
21664
+ ]),
21665
+ ccRouteUnavailable: false
21363
21666
  }],
21364
21667
  ["AWS::EC2::NetworkAcl", {
21365
21668
  handled: /* @__PURE__ */ new Set(["Tags", "VpcId"]),
21366
21669
  silentDrop: /* @__PURE__ */ new Map(),
21367
- createOnlyDrops: /* @__PURE__ */ new Set()
21670
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21671
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21672
+ ccRouteUnavailable: false
21368
21673
  }],
21369
21674
  ["AWS::EC2::NetworkAclEntry", {
21370
21675
  handled: /* @__PURE__ */ new Set([
@@ -21379,7 +21684,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21379
21684
  "RuleNumber"
21380
21685
  ]),
21381
21686
  silentDrop: /* @__PURE__ */ new Map(),
21382
- createOnlyDrops: /* @__PURE__ */ new Set()
21687
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21688
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21689
+ ccRouteUnavailable: false
21383
21690
  }],
21384
21691
  ["AWS::EC2::Route", {
21385
21692
  handled: /* @__PURE__ */ new Set([
@@ -21400,12 +21707,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21400
21707
  "VpcPeeringConnectionId"
21401
21708
  ]),
21402
21709
  silentDrop: /* @__PURE__ */ new Map([["OdbNetworkArn", "not yet implemented by cdkd"]]),
21403
- createOnlyDrops: /* @__PURE__ */ new Set()
21710
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21711
+ readOnly: /* @__PURE__ */ new Set(["CidrBlock"]),
21712
+ ccRouteUnavailable: false
21404
21713
  }],
21405
21714
  ["AWS::EC2::RouteTable", {
21406
21715
  handled: /* @__PURE__ */ new Set(["Tags", "VpcId"]),
21407
21716
  silentDrop: /* @__PURE__ */ new Map(),
21408
- createOnlyDrops: /* @__PURE__ */ new Set()
21717
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21718
+ readOnly: /* @__PURE__ */ new Set(["RouteTableId"]),
21719
+ ccRouteUnavailable: false
21409
21720
  }],
21410
21721
  ["AWS::EC2::SecurityGroup", {
21411
21722
  handled: /* @__PURE__ */ new Set([
@@ -21417,7 +21728,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21417
21728
  "VpcId"
21418
21729
  ]),
21419
21730
  silentDrop: /* @__PURE__ */ new Map(),
21420
- createOnlyDrops: /* @__PURE__ */ new Set()
21731
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21732
+ readOnly: /* @__PURE__ */ new Set(["GroupId", "Id"]),
21733
+ ccRouteUnavailable: false
21421
21734
  }],
21422
21735
  ["AWS::EC2::SecurityGroupIngress", {
21423
21736
  handled: /* @__PURE__ */ new Set([
@@ -21433,7 +21746,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21433
21746
  "ToPort"
21434
21747
  ]),
21435
21748
  silentDrop: /* @__PURE__ */ new Map([["GroupName", "EC2-Classic-only — use GroupId for VPC security groups (EC2-Classic retired 2022-08-15)"], ["SourceSecurityGroupName", "EC2-Classic-only — use SourceSecurityGroupId for VPC peer security groups (EC2-Classic retired 2022-08-15)"]]),
21436
- createOnlyDrops: /* @__PURE__ */ new Set(["GroupName", "SourceSecurityGroupName"])
21749
+ createOnlyDrops: /* @__PURE__ */ new Set(["GroupName", "SourceSecurityGroupName"]),
21750
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21751
+ ccRouteUnavailable: false
21437
21752
  }],
21438
21753
  ["AWS::EC2::Subnet", {
21439
21754
  handled: /* @__PURE__ */ new Set([
@@ -21465,17 +21780,28 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21465
21780
  "Ipv6Native",
21466
21781
  "Ipv6NetmaskLength",
21467
21782
  "OutpostArn"
21468
- ])
21783
+ ]),
21784
+ readOnly: /* @__PURE__ */ new Set([
21785
+ "BlockPublicAccessStates",
21786
+ "Ipv6CidrBlocks",
21787
+ "NetworkAclAssociationId",
21788
+ "SubnetId"
21789
+ ]),
21790
+ ccRouteUnavailable: false
21469
21791
  }],
21470
21792
  ["AWS::EC2::SubnetNetworkAclAssociation", {
21471
21793
  handled: /* @__PURE__ */ new Set(["NetworkAclId", "SubnetId"]),
21472
21794
  silentDrop: /* @__PURE__ */ new Map(),
21473
- createOnlyDrops: /* @__PURE__ */ new Set()
21795
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21796
+ readOnly: /* @__PURE__ */ new Set(["AssociationId"]),
21797
+ ccRouteUnavailable: false
21474
21798
  }],
21475
21799
  ["AWS::EC2::SubnetRouteTableAssociation", {
21476
21800
  handled: /* @__PURE__ */ new Set(["RouteTableId", "SubnetId"]),
21477
21801
  silentDrop: /* @__PURE__ */ new Map(),
21478
- createOnlyDrops: /* @__PURE__ */ new Set()
21802
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21803
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21804
+ ccRouteUnavailable: false
21479
21805
  }],
21480
21806
  ["AWS::EC2::VPC", {
21481
21807
  handled: /* @__PURE__ */ new Set([
@@ -21494,12 +21820,22 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21494
21820
  "Ipv4IpamPoolId",
21495
21821
  "Ipv4NetmaskLength",
21496
21822
  "VpcEncryptionControl"
21497
- ])
21823
+ ]),
21824
+ readOnly: /* @__PURE__ */ new Set([
21825
+ "CidrBlockAssociations",
21826
+ "DefaultNetworkAcl",
21827
+ "DefaultSecurityGroup",
21828
+ "Ipv6CidrBlocks",
21829
+ "VpcId"
21830
+ ]),
21831
+ ccRouteUnavailable: false
21498
21832
  }],
21499
21833
  ["AWS::EC2::VPCGatewayAttachment", {
21500
21834
  handled: /* @__PURE__ */ new Set(["InternetGatewayId", "VpcId"]),
21501
21835
  silentDrop: /* @__PURE__ */ new Map([["VpnGatewayId", "not yet implemented by cdkd"]]),
21502
- createOnlyDrops: /* @__PURE__ */ new Set()
21836
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21837
+ readOnly: /* @__PURE__ */ new Set(["AttachmentType"]),
21838
+ ccRouteUnavailable: false
21503
21839
  }],
21504
21840
  ["AWS::ECR::Repository", {
21505
21841
  handled: /* @__PURE__ */ new Set([
@@ -21514,7 +21850,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21514
21850
  "Tags"
21515
21851
  ]),
21516
21852
  silentDrop: /* @__PURE__ */ new Map(),
21517
- createOnlyDrops: /* @__PURE__ */ new Set()
21853
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21854
+ readOnly: /* @__PURE__ */ new Set(["Arn", "RepositoryUri"]),
21855
+ ccRouteUnavailable: false
21518
21856
  }],
21519
21857
  ["AWS::ECS::Cluster", {
21520
21858
  handled: /* @__PURE__ */ new Set([
@@ -21527,7 +21865,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21527
21865
  "Tags"
21528
21866
  ]),
21529
21867
  silentDrop: /* @__PURE__ */ new Map(),
21530
- createOnlyDrops: /* @__PURE__ */ new Set()
21868
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21869
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
21870
+ ccRouteUnavailable: false
21531
21871
  }],
21532
21872
  ["AWS::ECS::Service", {
21533
21873
  handled: /* @__PURE__ */ new Set([
@@ -21560,7 +21900,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21560
21900
  "VpcLatticeConfigurations"
21561
21901
  ]),
21562
21902
  silentDrop: /* @__PURE__ */ new Map(),
21563
- createOnlyDrops: /* @__PURE__ */ new Set()
21903
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21904
+ readOnly: /* @__PURE__ */ new Set(["Name", "ServiceArn"]),
21905
+ ccRouteUnavailable: false
21564
21906
  }],
21565
21907
  ["AWS::ECS::TaskDefinition", {
21566
21908
  handled: /* @__PURE__ */ new Set([
@@ -21583,7 +21925,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21583
21925
  "Volumes"
21584
21926
  ]),
21585
21927
  silentDrop: /* @__PURE__ */ new Map([["InferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]]),
21586
- createOnlyDrops: /* @__PURE__ */ new Set(["InferenceAccelerators"])
21928
+ createOnlyDrops: /* @__PURE__ */ new Set(["InferenceAccelerators"]),
21929
+ readOnly: /* @__PURE__ */ new Set(["TaskDefinitionArn"]),
21930
+ ccRouteUnavailable: false
21587
21931
  }],
21588
21932
  ["AWS::EFS::AccessPoint", {
21589
21933
  handled: /* @__PURE__ */ new Set([
@@ -21593,7 +21937,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21593
21937
  "RootDirectory"
21594
21938
  ]),
21595
21939
  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."]]),
21596
- createOnlyDrops: /* @__PURE__ */ new Set(["ClientToken"])
21940
+ createOnlyDrops: /* @__PURE__ */ new Set(["ClientToken"]),
21941
+ readOnly: /* @__PURE__ */ new Set(["AccessPointId", "Arn"]),
21942
+ ccRouteUnavailable: false
21597
21943
  }],
21598
21944
  ["AWS::EFS::FileSystem", {
21599
21945
  handled: /* @__PURE__ */ new Set([
@@ -21611,7 +21957,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21611
21957
  "ThroughputMode"
21612
21958
  ]),
21613
21959
  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."]]),
21614
- createOnlyDrops: /* @__PURE__ */ new Set()
21960
+ createOnlyDrops: /* @__PURE__ */ new Set(),
21961
+ readOnly: /* @__PURE__ */ new Set(["Arn", "FileSystemId"]),
21962
+ ccRouteUnavailable: false
21615
21963
  }],
21616
21964
  ["AWS::EFS::MountTarget", {
21617
21965
  handled: /* @__PURE__ */ new Set([
@@ -21628,7 +21976,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21628
21976
  "IpAddress",
21629
21977
  "IpAddressType",
21630
21978
  "Ipv6Address"
21631
- ])
21979
+ ]),
21980
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
21981
+ ccRouteUnavailable: false
21632
21982
  }],
21633
21983
  ["AWS::ElastiCache::CacheCluster", {
21634
21984
  handled: /* @__PURE__ */ new Set([
@@ -21657,7 +22007,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21657
22007
  "VpcSecurityGroupIds"
21658
22008
  ]),
21659
22009
  silentDrop: /* @__PURE__ */ new Map([["CacheSecurityGroupNames", "EC2-Classic-only — use VpcSecurityGroupIds for VPC-deployed clusters (EC2-Classic retired 2022-08-15)"], ["SnapshotArns", "not yet implemented by cdkd"]]),
21660
- createOnlyDrops: /* @__PURE__ */ new Set(["SnapshotArns"])
22010
+ createOnlyDrops: /* @__PURE__ */ new Set(["SnapshotArns"]),
22011
+ readOnly: /* @__PURE__ */ new Set(["ConfigurationEndpoint", "RedisEndpoint"]),
22012
+ ccRouteUnavailable: false
21661
22013
  }],
21662
22014
  ["AWS::ElastiCache::SubnetGroup", {
21663
22015
  handled: /* @__PURE__ */ new Set([
@@ -21668,7 +22020,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21668
22020
  "Tags"
21669
22021
  ]),
21670
22022
  silentDrop: /* @__PURE__ */ new Map(),
21671
- createOnlyDrops: /* @__PURE__ */ new Set()
22023
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22024
+ readOnly: /* @__PURE__ */ new Set(),
22025
+ ccRouteUnavailable: false
21672
22026
  }],
21673
22027
  ["AWS::ElasticLoadBalancingV2::Listener", {
21674
22028
  handled: /* @__PURE__ */ new Set([
@@ -21683,7 +22037,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21683
22037
  "SslPolicy"
21684
22038
  ]),
21685
22039
  silentDrop: /* @__PURE__ */ new Map([["Tags", "not yet implemented by cdkd"]]),
21686
- createOnlyDrops: /* @__PURE__ */ new Set()
22040
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22041
+ readOnly: /* @__PURE__ */ new Set(["ListenerArn"]),
22042
+ ccRouteUnavailable: false
21687
22043
  }],
21688
22044
  ["AWS::ElasticLoadBalancingV2::LoadBalancer", {
21689
22045
  handled: /* @__PURE__ */ new Set([
@@ -21703,7 +22059,15 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21703
22059
  "Type"
21704
22060
  ]),
21705
22061
  silentDrop: /* @__PURE__ */ new Map(),
21706
- createOnlyDrops: /* @__PURE__ */ new Set()
22062
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22063
+ readOnly: /* @__PURE__ */ new Set([
22064
+ "CanonicalHostedZoneID",
22065
+ "DNSName",
22066
+ "LoadBalancerArn",
22067
+ "LoadBalancerFullName",
22068
+ "LoadBalancerName"
22069
+ ]),
22070
+ ccRouteUnavailable: false
21707
22071
  }],
21708
22072
  ["AWS::ElasticLoadBalancingV2::TargetGroup", {
21709
22073
  handled: /* @__PURE__ */ new Set([
@@ -21729,7 +22093,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21729
22093
  "VpcId"
21730
22094
  ]),
21731
22095
  silentDrop: /* @__PURE__ */ new Map(),
21732
- createOnlyDrops: /* @__PURE__ */ new Set()
22096
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22097
+ readOnly: /* @__PURE__ */ new Set([
22098
+ "LoadBalancerArns",
22099
+ "TargetGroupArn",
22100
+ "TargetGroupFullName",
22101
+ "TargetGroupName"
22102
+ ]),
22103
+ ccRouteUnavailable: false
21733
22104
  }],
21734
22105
  ["AWS::EMR::Cluster", {
21735
22106
  handled: /* @__PURE__ */ new Set([
@@ -21762,7 +22133,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21762
22133
  "VisibleToAllUsers"
21763
22134
  ]),
21764
22135
  silentDrop: /* @__PURE__ */ new Map(),
21765
- createOnlyDrops: /* @__PURE__ */ new Set()
22136
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22137
+ readOnly: /* @__PURE__ */ new Set(["Id", "MasterPublicDNS"]),
22138
+ ccRouteUnavailable: true
21766
22139
  }],
21767
22140
  ["AWS::EMR::InstanceFleetConfig", {
21768
22141
  handled: /* @__PURE__ */ new Set([
@@ -21776,7 +22149,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21776
22149
  "TargetSpotCapacity"
21777
22150
  ]),
21778
22151
  silentDrop: /* @__PURE__ */ new Map(),
21779
- createOnlyDrops: /* @__PURE__ */ new Set()
22152
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22153
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
22154
+ ccRouteUnavailable: true
21780
22155
  }],
21781
22156
  ["AWS::EMR::InstanceGroupConfig", {
21782
22157
  handled: /* @__PURE__ */ new Set([
@@ -21793,7 +22168,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21793
22168
  "Name"
21794
22169
  ]),
21795
22170
  silentDrop: /* @__PURE__ */ new Map(),
21796
- createOnlyDrops: /* @__PURE__ */ new Set()
22171
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22172
+ readOnly: /* @__PURE__ */ new Set(["InstanceGroupId"]),
22173
+ ccRouteUnavailable: true
21797
22174
  }],
21798
22175
  ["AWS::Events::EventBus", {
21799
22176
  handled: /* @__PURE__ */ new Set([
@@ -21807,7 +22184,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21807
22184
  "Tags"
21808
22185
  ]),
21809
22186
  silentDrop: /* @__PURE__ */ new Map(),
21810
- createOnlyDrops: /* @__PURE__ */ new Set()
22187
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22188
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22189
+ ccRouteUnavailable: false
21811
22190
  }],
21812
22191
  ["AWS::Events::Rule", {
21813
22192
  handled: /* @__PURE__ */ new Set([
@@ -21822,7 +22201,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21822
22201
  "Targets"
21823
22202
  ]),
21824
22203
  silentDrop: /* @__PURE__ */ new Map(),
21825
- createOnlyDrops: /* @__PURE__ */ new Set()
22204
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22205
+ readOnly: /* @__PURE__ */ new Set(["Arn", "RuleName"]),
22206
+ ccRouteUnavailable: false
21826
22207
  }],
21827
22208
  ["AWS::FSx::FileSystem", {
21828
22209
  handled: /* @__PURE__ */ new Set([
@@ -21842,12 +22223,22 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21842
22223
  "WindowsConfiguration"
21843
22224
  ]),
21844
22225
  silentDrop: /* @__PURE__ */ new Map(),
21845
- createOnlyDrops: /* @__PURE__ */ new Set()
22226
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22227
+ readOnly: /* @__PURE__ */ new Set([
22228
+ "DNSName",
22229
+ "Id",
22230
+ "LustreMountName",
22231
+ "ResourceARN",
22232
+ "RootVolumeId"
22233
+ ]),
22234
+ ccRouteUnavailable: true
21846
22235
  }],
21847
22236
  ["AWS::Glue::Connection", {
21848
22237
  handled: /* @__PURE__ */ new Set(["CatalogId", "ConnectionInput"]),
21849
22238
  silentDrop: /* @__PURE__ */ new Map([["Tags", "not yet implemented by cdkd"]]),
21850
- createOnlyDrops: /* @__PURE__ */ new Set()
22239
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22240
+ readOnly: /* @__PURE__ */ new Set(["Name"]),
22241
+ ccRouteUnavailable: false
21851
22242
  }],
21852
22243
  ["AWS::Glue::Crawler", {
21853
22244
  handled: /* @__PURE__ */ new Set([
@@ -21868,7 +22259,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21868
22259
  "Targets"
21869
22260
  ]),
21870
22261
  silentDrop: /* @__PURE__ */ new Map(),
21871
- createOnlyDrops: /* @__PURE__ */ new Set()
22262
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22263
+ readOnly: /* @__PURE__ */ new Set(),
22264
+ ccRouteUnavailable: false
21872
22265
  }],
21873
22266
  ["AWS::Glue::Database", {
21874
22267
  handled: /* @__PURE__ */ new Set([
@@ -21877,7 +22270,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21877
22270
  "DatabaseName"
21878
22271
  ]),
21879
22272
  silentDrop: /* @__PURE__ */ new Map(),
21880
- createOnlyDrops: /* @__PURE__ */ new Set()
22273
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22274
+ readOnly: /* @__PURE__ */ new Set(),
22275
+ ccRouteUnavailable: false
21881
22276
  }],
21882
22277
  ["AWS::Glue::Job", {
21883
22278
  handled: /* @__PURE__ */ new Set([
@@ -21907,12 +22302,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21907
22302
  "WorkerType"
21908
22303
  ]),
21909
22304
  silentDrop: /* @__PURE__ */ new Map(),
21910
- createOnlyDrops: /* @__PURE__ */ new Set()
22305
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22306
+ readOnly: /* @__PURE__ */ new Set(),
22307
+ ccRouteUnavailable: false
21911
22308
  }],
21912
22309
  ["AWS::Glue::SecurityConfiguration", {
21913
22310
  handled: /* @__PURE__ */ new Set(["EncryptionConfiguration", "Name"]),
21914
22311
  silentDrop: /* @__PURE__ */ new Map(),
21915
- createOnlyDrops: /* @__PURE__ */ new Set()
22312
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22313
+ readOnly: /* @__PURE__ */ new Set(),
22314
+ ccRouteUnavailable: false
21916
22315
  }],
21917
22316
  ["AWS::Glue::Table", {
21918
22317
  handled: /* @__PURE__ */ new Set([
@@ -21923,7 +22322,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21923
22322
  "TableInput"
21924
22323
  ]),
21925
22324
  silentDrop: /* @__PURE__ */ new Map(),
21926
- createOnlyDrops: /* @__PURE__ */ new Set()
22325
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22326
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
22327
+ ccRouteUnavailable: false
21927
22328
  }],
21928
22329
  ["AWS::Glue::Trigger", {
21929
22330
  handled: /* @__PURE__ */ new Set([
@@ -21939,7 +22340,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21939
22340
  "WorkflowName"
21940
22341
  ]),
21941
22342
  silentDrop: /* @__PURE__ */ new Map(),
21942
- createOnlyDrops: /* @__PURE__ */ new Set()
22343
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22344
+ readOnly: /* @__PURE__ */ new Set(),
22345
+ ccRouteUnavailable: false
21943
22346
  }],
21944
22347
  ["AWS::Glue::Workflow", {
21945
22348
  handled: /* @__PURE__ */ new Set([
@@ -21950,7 +22353,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21950
22353
  "Tags"
21951
22354
  ]),
21952
22355
  silentDrop: /* @__PURE__ */ new Map(),
21953
- createOnlyDrops: /* @__PURE__ */ new Set()
22356
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22357
+ readOnly: /* @__PURE__ */ new Set(),
22358
+ ccRouteUnavailable: false
21954
22359
  }],
21955
22360
  ["AWS::IAM::AccessKey", {
21956
22361
  handled: /* @__PURE__ */ new Set([
@@ -21959,7 +22364,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21959
22364
  "UserName"
21960
22365
  ]),
21961
22366
  silentDrop: /* @__PURE__ */ new Map(),
21962
- createOnlyDrops: /* @__PURE__ */ new Set()
22367
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22368
+ readOnly: /* @__PURE__ */ new Set(["Id", "SecretAccessKey"]),
22369
+ ccRouteUnavailable: true
21963
22370
  }],
21964
22371
  ["AWS::IAM::Group", {
21965
22372
  handled: /* @__PURE__ */ new Set([
@@ -21969,7 +22376,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21969
22376
  "Policies"
21970
22377
  ]),
21971
22378
  silentDrop: /* @__PURE__ */ new Map(),
21972
- createOnlyDrops: /* @__PURE__ */ new Set()
22379
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22380
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22381
+ ccRouteUnavailable: false
21973
22382
  }],
21974
22383
  ["AWS::IAM::InstanceProfile", {
21975
22384
  handled: /* @__PURE__ */ new Set([
@@ -21978,7 +22387,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21978
22387
  "Roles"
21979
22388
  ]),
21980
22389
  silentDrop: /* @__PURE__ */ new Map(),
21981
- createOnlyDrops: /* @__PURE__ */ new Set()
22390
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22391
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22392
+ ccRouteUnavailable: false
21982
22393
  }],
21983
22394
  ["AWS::IAM::ManagedPolicy", {
21984
22395
  handled: /* @__PURE__ */ new Set([
@@ -21992,7 +22403,18 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
21992
22403
  "Users"
21993
22404
  ]),
21994
22405
  silentDrop: /* @__PURE__ */ new Map(),
21995
- createOnlyDrops: /* @__PURE__ */ new Set()
22406
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22407
+ readOnly: /* @__PURE__ */ new Set([
22408
+ "AttachmentCount",
22409
+ "CreateDate",
22410
+ "DefaultVersionId",
22411
+ "IsAttachable",
22412
+ "PermissionsBoundaryUsageCount",
22413
+ "PolicyArn",
22414
+ "PolicyId",
22415
+ "UpdateDate"
22416
+ ]),
22417
+ ccRouteUnavailable: false
21996
22418
  }],
21997
22419
  ["AWS::IAM::Policy", {
21998
22420
  handled: /* @__PURE__ */ new Set([
@@ -22003,7 +22425,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22003
22425
  "Users"
22004
22426
  ]),
22005
22427
  silentDrop: /* @__PURE__ */ new Map(),
22006
- createOnlyDrops: /* @__PURE__ */ new Set()
22428
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22429
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
22430
+ ccRouteUnavailable: false
22007
22431
  }],
22008
22432
  ["AWS::IAM::Role", {
22009
22433
  handled: /* @__PURE__ */ new Set([
@@ -22018,7 +22442,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22018
22442
  "Tags"
22019
22443
  ]),
22020
22444
  silentDrop: /* @__PURE__ */ new Map(),
22021
- createOnlyDrops: /* @__PURE__ */ new Set()
22445
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22446
+ readOnly: /* @__PURE__ */ new Set(["Arn", "RoleId"]),
22447
+ ccRouteUnavailable: false
22022
22448
  }],
22023
22449
  ["AWS::IAM::User", {
22024
22450
  handled: /* @__PURE__ */ new Set([
@@ -22032,12 +22458,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22032
22458
  "UserName"
22033
22459
  ]),
22034
22460
  silentDrop: /* @__PURE__ */ new Map(),
22035
- createOnlyDrops: /* @__PURE__ */ new Set()
22461
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22462
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22463
+ ccRouteUnavailable: false
22036
22464
  }],
22037
22465
  ["AWS::IAM::UserToGroupAddition", {
22038
22466
  handled: /* @__PURE__ */ new Set(["GroupName", "Users"]),
22039
22467
  silentDrop: /* @__PURE__ */ new Map(),
22040
- createOnlyDrops: /* @__PURE__ */ new Set()
22468
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22469
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
22470
+ ccRouteUnavailable: false
22041
22471
  }],
22042
22472
  ["AWS::Kinesis::Stream", {
22043
22473
  handled: /* @__PURE__ */ new Set([
@@ -22051,7 +22481,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22051
22481
  "Tags"
22052
22482
  ]),
22053
22483
  silentDrop: /* @__PURE__ */ new Map([["WarmThroughputMiBps", "not yet implemented by cdkd"]]),
22054
- createOnlyDrops: /* @__PURE__ */ new Set()
22484
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22485
+ readOnly: /* @__PURE__ */ new Set(["Arn", "WarmThroughputObject"]),
22486
+ ccRouteUnavailable: false
22055
22487
  }],
22056
22488
  ["AWS::Kinesis::StreamConsumer", {
22057
22489
  handled: /* @__PURE__ */ new Set([
@@ -22060,7 +22492,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22060
22492
  "Tags"
22061
22493
  ]),
22062
22494
  silentDrop: /* @__PURE__ */ new Map(),
22063
- createOnlyDrops: /* @__PURE__ */ new Set()
22495
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22496
+ readOnly: /* @__PURE__ */ new Set([
22497
+ "ConsumerARN",
22498
+ "ConsumerCreationTimestamp",
22499
+ "ConsumerStatus"
22500
+ ]),
22501
+ ccRouteUnavailable: false
22064
22502
  }],
22065
22503
  ["AWS::KinesisFirehose::DeliveryStream", {
22066
22504
  handled: /* @__PURE__ */ new Set([
@@ -22089,12 +22527,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22089
22527
  "DatabaseSourceConfiguration",
22090
22528
  "DirectPutSourceConfiguration",
22091
22529
  "MSKSourceConfiguration"
22092
- ])
22530
+ ]),
22531
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22532
+ ccRouteUnavailable: false
22093
22533
  }],
22094
22534
  ["AWS::KMS::Alias", {
22095
22535
  handled: /* @__PURE__ */ new Set(["AliasName", "TargetKeyId"]),
22096
22536
  silentDrop: /* @__PURE__ */ new Map(),
22097
- createOnlyDrops: /* @__PURE__ */ new Set()
22537
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22538
+ readOnly: /* @__PURE__ */ new Set(),
22539
+ ccRouteUnavailable: false
22098
22540
  }],
22099
22541
  ["AWS::KMS::Key", {
22100
22542
  handled: /* @__PURE__ */ new Set([
@@ -22112,7 +22554,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22112
22554
  "Tags"
22113
22555
  ]),
22114
22556
  silentDrop: /* @__PURE__ */ new Map(),
22115
- createOnlyDrops: /* @__PURE__ */ new Set()
22557
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22558
+ readOnly: /* @__PURE__ */ new Set(["Arn", "KeyId"]),
22559
+ ccRouteUnavailable: false
22116
22560
  }],
22117
22561
  ["AWS::Lambda::EventInvokeConfig", {
22118
22562
  handled: /* @__PURE__ */ new Set([
@@ -22123,7 +22567,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22123
22567
  "Qualifier"
22124
22568
  ]),
22125
22569
  silentDrop: /* @__PURE__ */ new Map(),
22126
- createOnlyDrops: /* @__PURE__ */ new Set()
22570
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22571
+ readOnly: /* @__PURE__ */ new Set(),
22572
+ ccRouteUnavailable: false
22127
22573
  }],
22128
22574
  ["AWS::Lambda::EventSourceMapping", {
22129
22575
  handled: /* @__PURE__ */ new Set([
@@ -22157,7 +22603,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22157
22603
  "TumblingWindowInSeconds"
22158
22604
  ]),
22159
22605
  silentDrop: /* @__PURE__ */ new Map(),
22160
- createOnlyDrops: /* @__PURE__ */ new Set()
22606
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22607
+ readOnly: /* @__PURE__ */ new Set(["EventSourceMappingArn", "Id"]),
22608
+ ccRouteUnavailable: false
22161
22609
  }],
22162
22610
  ["AWS::Lambda::Function", {
22163
22611
  handled: /* @__PURE__ */ new Set([
@@ -22195,7 +22643,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22195
22643
  ["FunctionScalingConfig", "not yet implemented by cdkd"],
22196
22644
  ["PublishToLatestPublished", "CloudFormation-only version-publishing directive with no AWS SDK equivalent"]
22197
22645
  ]),
22198
- createOnlyDrops: /* @__PURE__ */ new Set()
22646
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22647
+ readOnly: /* @__PURE__ */ new Set(["Arn", "SnapStartResponse"]),
22648
+ ccRouteUnavailable: false
22199
22649
  }],
22200
22650
  ["AWS::Lambda::LayerVersion", {
22201
22651
  handled: /* @__PURE__ */ new Set([
@@ -22207,7 +22657,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22207
22657
  "LicenseInfo"
22208
22658
  ]),
22209
22659
  silentDrop: /* @__PURE__ */ new Map(),
22210
- createOnlyDrops: /* @__PURE__ */ new Set()
22660
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22661
+ readOnly: /* @__PURE__ */ new Set(["LayerVersionArn"]),
22662
+ ccRouteUnavailable: false
22211
22663
  }],
22212
22664
  ["AWS::Lambda::MicrovmImage", {
22213
22665
  handled: /* @__PURE__ */ new Set([
@@ -22227,7 +22679,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22227
22679
  "Tags"
22228
22680
  ]),
22229
22681
  silentDrop: /* @__PURE__ */ new Map(),
22230
- createOnlyDrops: /* @__PURE__ */ new Set()
22682
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22683
+ readOnly: /* @__PURE__ */ new Set([
22684
+ "CreatedAt",
22685
+ "ImageArn",
22686
+ "LatestActiveImageVersion",
22687
+ "LatestFailedImageVersion",
22688
+ "State",
22689
+ "UpdatedAt"
22690
+ ]),
22691
+ ccRouteUnavailable: false
22231
22692
  }],
22232
22693
  ["AWS::Lambda::Permission", {
22233
22694
  handled: /* @__PURE__ */ new Set([
@@ -22242,7 +22703,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22242
22703
  "SourceArn"
22243
22704
  ]),
22244
22705
  silentDrop: /* @__PURE__ */ new Map(),
22245
- createOnlyDrops: /* @__PURE__ */ new Set()
22706
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22707
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
22708
+ ccRouteUnavailable: false
22246
22709
  }],
22247
22710
  ["AWS::Lambda::Url", {
22248
22711
  handled: /* @__PURE__ */ new Set([
@@ -22253,7 +22716,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22253
22716
  "TargetFunctionArn"
22254
22717
  ]),
22255
22718
  silentDrop: /* @__PURE__ */ new Map(),
22256
- createOnlyDrops: /* @__PURE__ */ new Set()
22719
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22720
+ readOnly: /* @__PURE__ */ new Set(["FunctionArn", "FunctionUrl"]),
22721
+ ccRouteUnavailable: false
22257
22722
  }],
22258
22723
  ["AWS::Logs::LogGroup", {
22259
22724
  handled: /* @__PURE__ */ new Set([
@@ -22268,7 +22733,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22268
22733
  "Tags"
22269
22734
  ]),
22270
22735
  silentDrop: /* @__PURE__ */ new Map([["ResourcePolicyDocument", "covered by the separate account-wide AWS::Logs::ResourcePolicy resource type; logs:PutResourcePolicy is account-scoped, not per-log-group, so it has no CreateLogGroup / PutRetentionPolicy counterpart — routed via Cloud Control instead"]]),
22271
- createOnlyDrops: /* @__PURE__ */ new Set()
22736
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22737
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
22738
+ ccRouteUnavailable: false
22272
22739
  }],
22273
22740
  ["AWS::Neptune::DBCluster", {
22274
22741
  handled: /* @__PURE__ */ new Set([
@@ -22311,7 +22778,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22311
22778
  "SnapshotIdentifier",
22312
22779
  "SourceDBClusterIdentifier",
22313
22780
  "UseLatestRestorableTime"
22314
- ])
22781
+ ]),
22782
+ readOnly: /* @__PURE__ */ new Set([
22783
+ "ClusterResourceId",
22784
+ "Endpoint",
22785
+ "Port",
22786
+ "ReadEndpoint"
22787
+ ]),
22788
+ ccRouteUnavailable: false
22315
22789
  }],
22316
22790
  ["AWS::Neptune::DBInstance", {
22317
22791
  handled: /* @__PURE__ */ new Set([
@@ -22331,7 +22805,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22331
22805
  ["DBSnapshotIdentifier", "not yet implemented by cdkd"],
22332
22806
  ["PubliclyAccessible", "not yet implemented by cdkd"]
22333
22807
  ]),
22334
- createOnlyDrops: /* @__PURE__ */ new Set(["DBSnapshotIdentifier"])
22808
+ createOnlyDrops: /* @__PURE__ */ new Set(["DBSnapshotIdentifier"]),
22809
+ readOnly: /* @__PURE__ */ new Set(["Endpoint", "Port"]),
22810
+ ccRouteUnavailable: false
22335
22811
  }],
22336
22812
  ["AWS::Neptune::DBSubnetGroup", {
22337
22813
  handled: /* @__PURE__ */ new Set([
@@ -22341,7 +22817,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22341
22817
  "Tags"
22342
22818
  ]),
22343
22819
  silentDrop: /* @__PURE__ */ new Map(),
22344
- createOnlyDrops: /* @__PURE__ */ new Set()
22820
+ createOnlyDrops: /* @__PURE__ */ new Set(),
22821
+ readOnly: /* @__PURE__ */ new Set(),
22822
+ ccRouteUnavailable: false
22345
22823
  }],
22346
22824
  ["AWS::RDS::DBCluster", {
22347
22825
  handled: /* @__PURE__ */ new Set([
@@ -22420,7 +22898,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22420
22898
  "SourceDbClusterResourceId",
22421
22899
  "SourceRegion",
22422
22900
  "UseLatestRestorableTime"
22423
- ])
22901
+ ]),
22902
+ readOnly: /* @__PURE__ */ new Set([
22903
+ "DBClusterArn",
22904
+ "DBClusterResourceId",
22905
+ "Endpoint",
22906
+ "ReadEndpoint",
22907
+ "StorageEncryptionType",
22908
+ "StorageThroughput"
22909
+ ]),
22910
+ ccRouteUnavailable: false
22424
22911
  }],
22425
22912
  ["AWS::RDS::DBInstance", {
22426
22913
  handled: /* @__PURE__ */ new Set([
@@ -22519,7 +23006,28 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22519
23006
  "NcharCharacterSetName",
22520
23007
  "SourceRegion",
22521
23008
  "Timezone"
22522
- ])
23009
+ ]),
23010
+ readOnly: /* @__PURE__ */ new Set([
23011
+ "AutomaticRestartTime",
23012
+ "CertificateDetails",
23013
+ "DBInstanceArn",
23014
+ "DBInstanceStatus",
23015
+ "DbiResourceId",
23016
+ "Endpoint",
23017
+ "InstanceCreateTime",
23018
+ "IsStorageConfigUpgradeAvailable",
23019
+ "LatestRestorableTime",
23020
+ "ListenerEndpoint",
23021
+ "PercentProgress",
23022
+ "ReadReplicaDBClusterIdentifiers",
23023
+ "ReadReplicaDBInstanceIdentifiers",
23024
+ "ResumeFullAutomationModeTime",
23025
+ "SecondaryAvailabilityZone",
23026
+ "StatusInfos",
23027
+ "StorageOperationPercentProgress",
23028
+ "StorageOperationStatus"
23029
+ ]),
23030
+ ccRouteUnavailable: false
22523
23031
  }],
22524
23032
  ["AWS::RDS::DBProxy", {
22525
23033
  handled: /* @__PURE__ */ new Set([
@@ -22539,7 +23047,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22539
23047
  ["EndpointNetworkType", "not yet implemented by cdkd"],
22540
23048
  ["TargetConnectionNetworkType", "not yet implemented by cdkd"]
22541
23049
  ]),
22542
- createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType", "TargetConnectionNetworkType"])
23050
+ createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType", "TargetConnectionNetworkType"]),
23051
+ readOnly: /* @__PURE__ */ new Set([
23052
+ "DBProxyArn",
23053
+ "Endpoint",
23054
+ "VpcId"
23055
+ ]),
23056
+ ccRouteUnavailable: false
22543
23057
  }],
22544
23058
  ["AWS::RDS::DBProxyEndpoint", {
22545
23059
  handled: /* @__PURE__ */ new Set([
@@ -22551,7 +23065,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22551
23065
  "VpcSubnetIds"
22552
23066
  ]),
22553
23067
  silentDrop: /* @__PURE__ */ new Map([["EndpointNetworkType", "not yet implemented by cdkd"]]),
22554
- createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType"])
23068
+ createOnlyDrops: /* @__PURE__ */ new Set(["EndpointNetworkType"]),
23069
+ readOnly: /* @__PURE__ */ new Set([
23070
+ "DBProxyEndpointArn",
23071
+ "Endpoint",
23072
+ "IsDefault",
23073
+ "VpcId"
23074
+ ]),
23075
+ ccRouteUnavailable: false
22555
23076
  }],
22556
23077
  ["AWS::RDS::DBProxyTargetGroup", {
22557
23078
  handled: /* @__PURE__ */ new Set([
@@ -22562,7 +23083,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22562
23083
  "TargetGroupName"
22563
23084
  ]),
22564
23085
  silentDrop: /* @__PURE__ */ new Map(),
22565
- createOnlyDrops: /* @__PURE__ */ new Set()
23086
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23087
+ readOnly: /* @__PURE__ */ new Set(["TargetGroupArn"]),
23088
+ ccRouteUnavailable: false
22566
23089
  }],
22567
23090
  ["AWS::RDS::DBSubnetGroup", {
22568
23091
  handled: /* @__PURE__ */ new Set([
@@ -22572,7 +23095,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22572
23095
  "Tags"
22573
23096
  ]),
22574
23097
  silentDrop: /* @__PURE__ */ new Map(),
22575
- createOnlyDrops: /* @__PURE__ */ new Set()
23098
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23099
+ readOnly: /* @__PURE__ */ new Set(["DBSubnetGroupArn"]),
23100
+ ccRouteUnavailable: false
22576
23101
  }],
22577
23102
  ["AWS::Route53::HostedZone", {
22578
23103
  handled: /* @__PURE__ */ new Set([
@@ -22584,7 +23109,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22584
23109
  "VPCs"
22585
23110
  ]),
22586
23111
  silentDrop: /* @__PURE__ */ new Map(),
22587
- createOnlyDrops: /* @__PURE__ */ new Set()
23112
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23113
+ readOnly: /* @__PURE__ */ new Set(["Id", "NameServers"]),
23114
+ ccRouteUnavailable: false
22588
23115
  }],
22589
23116
  ["AWS::Route53::RecordSet", {
22590
23117
  handled: /* @__PURE__ */ new Set([
@@ -22607,7 +23134,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22607
23134
  "Weight"
22608
23135
  ]),
22609
23136
  silentDrop: /* @__PURE__ */ new Map(),
22610
- createOnlyDrops: /* @__PURE__ */ new Set()
23137
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23138
+ readOnly: /* @__PURE__ */ new Set(),
23139
+ ccRouteUnavailable: false
22611
23140
  }],
22612
23141
  ["AWS::S3::Bucket", {
22613
23142
  handled: /* @__PURE__ */ new Set([
@@ -22639,12 +23168,22 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22639
23168
  ["MetadataConfiguration", "not yet implemented by cdkd"],
22640
23169
  ["MetadataTableConfiguration", "not yet implemented by cdkd"]
22641
23170
  ]),
22642
- createOnlyDrops: /* @__PURE__ */ new Set(["BucketNamePrefix", "BucketNamespace"])
23171
+ createOnlyDrops: /* @__PURE__ */ new Set(["BucketNamePrefix", "BucketNamespace"]),
23172
+ readOnly: /* @__PURE__ */ new Set([
23173
+ "Arn",
23174
+ "DomainName",
23175
+ "DualStackDomainName",
23176
+ "RegionalDomainName",
23177
+ "WebsiteURL"
23178
+ ]),
23179
+ ccRouteUnavailable: false
22643
23180
  }],
22644
23181
  ["AWS::S3::BucketPolicy", {
22645
23182
  handled: /* @__PURE__ */ new Set(["Bucket", "PolicyDocument"]),
22646
23183
  silentDrop: /* @__PURE__ */ new Map(),
22647
- createOnlyDrops: /* @__PURE__ */ new Set()
23184
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23185
+ readOnly: /* @__PURE__ */ new Set(),
23186
+ ccRouteUnavailable: false
22648
23187
  }],
22649
23188
  ["AWS::S3Express::DirectoryBucket", {
22650
23189
  handled: /* @__PURE__ */ new Set([
@@ -22659,12 +23198,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22659
23198
  ["LifecycleConfiguration", "not yet implemented by cdkd"],
22660
23199
  ["MetricsConfigurations", "not yet implemented by cdkd"]
22661
23200
  ]),
22662
- createOnlyDrops: /* @__PURE__ */ new Set()
23201
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23202
+ readOnly: /* @__PURE__ */ new Set(["Arn", "AvailabilityZoneName"]),
23203
+ ccRouteUnavailable: false
22663
23204
  }],
22664
23205
  ["AWS::S3Tables::Namespace", {
22665
23206
  handled: /* @__PURE__ */ new Set(["Namespace", "TableBucketARN"]),
22666
23207
  silentDrop: /* @__PURE__ */ new Map(),
22667
- createOnlyDrops: /* @__PURE__ */ new Set()
23208
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23209
+ readOnly: /* @__PURE__ */ new Set(),
23210
+ ccRouteUnavailable: false
22668
23211
  }],
22669
23212
  ["AWS::S3Tables::Table", {
22670
23213
  handled: /* @__PURE__ */ new Set([
@@ -22687,7 +23230,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22687
23230
  "IcebergMetadata",
22688
23231
  "StorageClassConfiguration",
22689
23232
  "WithoutMetadata"
22690
- ])
23233
+ ]),
23234
+ readOnly: /* @__PURE__ */ new Set([
23235
+ "TableARN",
23236
+ "VersionToken",
23237
+ "WarehouseLocation"
23238
+ ]),
23239
+ ccRouteUnavailable: false
22691
23240
  }],
22692
23241
  ["AWS::S3Tables::TableBucket", {
22693
23242
  handled: /* @__PURE__ */ new Set(["TableBucketName", "Tags"]),
@@ -22698,7 +23247,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22698
23247
  ["StorageClassConfiguration", "not yet implemented by cdkd"],
22699
23248
  ["UnreferencedFileRemoval", "not yet implemented by cdkd"]
22700
23249
  ]),
22701
- createOnlyDrops: /* @__PURE__ */ new Set()
23250
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23251
+ readOnly: /* @__PURE__ */ new Set(["TableBucketARN"]),
23252
+ ccRouteUnavailable: false
22702
23253
  }],
22703
23254
  ["AWS::S3Vectors::VectorBucket", {
22704
23255
  handled: /* @__PURE__ */ new Set([
@@ -22707,7 +23258,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22707
23258
  "VectorBucketName"
22708
23259
  ]),
22709
23260
  silentDrop: /* @__PURE__ */ new Map(),
22710
- createOnlyDrops: /* @__PURE__ */ new Set()
23261
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23262
+ readOnly: /* @__PURE__ */ new Set(["CreationTime", "VectorBucketArn"]),
23263
+ ccRouteUnavailable: false
22711
23264
  }],
22712
23265
  ["AWS::Scheduler::Schedule", {
22713
23266
  handled: /* @__PURE__ */ new Set([
@@ -22724,7 +23277,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22724
23277
  "Target"
22725
23278
  ]),
22726
23279
  silentDrop: /* @__PURE__ */ new Map(),
22727
- createOnlyDrops: /* @__PURE__ */ new Set()
23280
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23281
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
23282
+ ccRouteUnavailable: true
22728
23283
  }],
22729
23284
  ["AWS::SecretsManager::Secret", {
22730
23285
  handled: /* @__PURE__ */ new Set([
@@ -22738,7 +23293,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22738
23293
  "Type"
22739
23294
  ]),
22740
23295
  silentDrop: /* @__PURE__ */ new Map(),
22741
- createOnlyDrops: /* @__PURE__ */ new Set()
23296
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23297
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
23298
+ ccRouteUnavailable: false
22742
23299
  }],
22743
23300
  ["AWS::ServiceDiscovery::HttpNamespace", {
22744
23301
  handled: /* @__PURE__ */ new Set([
@@ -22747,7 +23304,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22747
23304
  "Tags"
22748
23305
  ]),
22749
23306
  silentDrop: /* @__PURE__ */ new Map(),
22750
- createOnlyDrops: /* @__PURE__ */ new Set()
23307
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23308
+ readOnly: /* @__PURE__ */ new Set(["Arn", "Id"]),
23309
+ ccRouteUnavailable: false
22751
23310
  }],
22752
23311
  ["AWS::ServiceDiscovery::PrivateDnsNamespace", {
22753
23312
  handled: /* @__PURE__ */ new Set([
@@ -22758,7 +23317,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22758
23317
  "Vpc"
22759
23318
  ]),
22760
23319
  silentDrop: /* @__PURE__ */ new Map(),
22761
- createOnlyDrops: /* @__PURE__ */ new Set()
23320
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23321
+ readOnly: /* @__PURE__ */ new Set([
23322
+ "Arn",
23323
+ "HostedZoneId",
23324
+ "Id"
23325
+ ]),
23326
+ ccRouteUnavailable: false
22762
23327
  }],
22763
23328
  ["AWS::ServiceDiscovery::PublicDnsNamespace", {
22764
23329
  handled: /* @__PURE__ */ new Set([
@@ -22768,7 +23333,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22768
23333
  "Tags"
22769
23334
  ]),
22770
23335
  silentDrop: /* @__PURE__ */ new Map(),
22771
- createOnlyDrops: /* @__PURE__ */ new Set()
23336
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23337
+ readOnly: /* @__PURE__ */ new Set([
23338
+ "Arn",
23339
+ "HostedZoneId",
23340
+ "Id"
23341
+ ]),
23342
+ ccRouteUnavailable: false
22772
23343
  }],
22773
23344
  ["AWS::ServiceDiscovery::Service", {
22774
23345
  handled: /* @__PURE__ */ new Set([
@@ -22783,7 +23354,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22783
23354
  "Type"
22784
23355
  ]),
22785
23356
  silentDrop: /* @__PURE__ */ new Map(),
22786
- createOnlyDrops: /* @__PURE__ */ new Set()
23357
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23358
+ readOnly: /* @__PURE__ */ new Set(["Arn", "Id"]),
23359
+ ccRouteUnavailable: false
22787
23360
  }],
22788
23361
  ["AWS::SNS::Subscription", {
22789
23362
  handled: /* @__PURE__ */ new Set([
@@ -22799,7 +23372,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22799
23372
  "TopicArn"
22800
23373
  ]),
22801
23374
  silentDrop: /* @__PURE__ */ new Map([["Region", "CFn-only cross-region subscription hint; cdkd uses the SDK client region directly and has no per-resource region override"]]),
22802
- createOnlyDrops: /* @__PURE__ */ new Set()
23375
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23376
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
23377
+ ccRouteUnavailable: false
22803
23378
  }],
22804
23379
  ["AWS::SNS::Topic", {
22805
23380
  handled: /* @__PURE__ */ new Set([
@@ -22819,12 +23394,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22819
23394
  "TracingConfig"
22820
23395
  ]),
22821
23396
  silentDrop: /* @__PURE__ */ new Map(),
22822
- createOnlyDrops: /* @__PURE__ */ new Set()
23397
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23398
+ readOnly: /* @__PURE__ */ new Set(["TopicArn"]),
23399
+ ccRouteUnavailable: false
22823
23400
  }],
22824
23401
  ["AWS::SNS::TopicPolicy", {
22825
23402
  handled: /* @__PURE__ */ new Set(["PolicyDocument", "Topics"]),
22826
23403
  silentDrop: /* @__PURE__ */ new Map(),
22827
- createOnlyDrops: /* @__PURE__ */ new Set()
23404
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23405
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
23406
+ ccRouteUnavailable: false
22828
23407
  }],
22829
23408
  ["AWS::SQS::Queue", {
22830
23409
  handled: /* @__PURE__ */ new Set([
@@ -22846,12 +23425,16 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22846
23425
  "VisibilityTimeout"
22847
23426
  ]),
22848
23427
  silentDrop: /* @__PURE__ */ new Map(),
22849
- createOnlyDrops: /* @__PURE__ */ new Set()
23428
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23429
+ readOnly: /* @__PURE__ */ new Set(["Arn", "QueueUrl"]),
23430
+ ccRouteUnavailable: false
22850
23431
  }],
22851
23432
  ["AWS::SQS::QueuePolicy", {
22852
23433
  handled: /* @__PURE__ */ new Set(["PolicyDocument", "Queues"]),
22853
23434
  silentDrop: /* @__PURE__ */ new Map(),
22854
- createOnlyDrops: /* @__PURE__ */ new Set()
23435
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23436
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
23437
+ ccRouteUnavailable: false
22855
23438
  }],
22856
23439
  ["AWS::SSM::Parameter", {
22857
23440
  handled: /* @__PURE__ */ new Set([
@@ -22866,7 +23449,9 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22866
23449
  "Value"
22867
23450
  ]),
22868
23451
  silentDrop: /* @__PURE__ */ new Map(),
22869
- createOnlyDrops: /* @__PURE__ */ new Set()
23452
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23453
+ readOnly: /* @__PURE__ */ new Set(["Arn"]),
23454
+ ccRouteUnavailable: false
22870
23455
  }],
22871
23456
  ["AWS::StepFunctions::StateMachine", {
22872
23457
  handled: /* @__PURE__ */ new Set([
@@ -22883,7 +23468,13 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22883
23468
  "TracingConfiguration"
22884
23469
  ]),
22885
23470
  silentDrop: /* @__PURE__ */ new Map(),
22886
- createOnlyDrops: /* @__PURE__ */ new Set()
23471
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23472
+ readOnly: /* @__PURE__ */ new Set([
23473
+ "Arn",
23474
+ "Name",
23475
+ "StateMachineRevisionId"
23476
+ ]),
23477
+ ccRouteUnavailable: false
22887
23478
  }],
22888
23479
  ["AWS::WAFv2::WebACL", {
22889
23480
  handled: /* @__PURE__ */ new Set([
@@ -22906,10 +23497,329 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
22906
23497
  ["MonetizationConfig", "not yet implemented by cdkd"],
22907
23498
  ["OnSourceDDoSProtectionConfig", "not yet implemented by cdkd"]
22908
23499
  ]),
22909
- createOnlyDrops: /* @__PURE__ */ new Set()
23500
+ createOnlyDrops: /* @__PURE__ */ new Set(),
23501
+ readOnly: /* @__PURE__ */ new Set([
23502
+ "Arn",
23503
+ "Capacity",
23504
+ "Id",
23505
+ "LabelNamespace"
23506
+ ]),
23507
+ ccRouteUnavailable: false
22910
23508
  }]
22911
23509
  ]);
22912
23510
 
23511
+ //#endregion
23512
+ //#region src/provisioning/unsupported-types.generated.ts
23513
+ /**
23514
+ * AUTO-GENERATED by scripts/gen-unsupported-types.ts — DO NOT EDIT BY HAND.
23515
+ * Source: docs/_generated/provider-coverage.json (tier3), minus
23516
+ * registry-routed special cases (see REGISTRY_ROUTED_EXCLUSIONS in the
23517
+ * generator).
23518
+ * Regenerate: `vp run gen:unsupported-types`.
23519
+ *
23520
+ * AWS CloudFormation resource types AWS reports as
23521
+ * `ProvisioningType: NON_PROVISIONABLE` (Cloud Control API cannot
23522
+ * create/update/delete them) and for which cdkd has no SDK provider. cdkd
23523
+ * pre-flight rejects these fast with an actionable message instead of letting
23524
+ * the optimistic Cloud Control fallthrough fail mid-deploy.
23525
+ */
23526
+ const NON_PROVISIONABLE_TYPES = /* @__PURE__ */ new Set([
23527
+ "Alexa::ASK::Skill",
23528
+ "AWS::AmazonMQ::ConfigurationAssociation",
23529
+ "AWS::Amplify::Jobs",
23530
+ "AWS::AmplifyUIBuilder::CodegenJob",
23531
+ "AWS::AppMesh::GatewayRoute",
23532
+ "AWS::AppMesh::Mesh",
23533
+ "AWS::AppMesh::Route",
23534
+ "AWS::AppMesh::VirtualGateway",
23535
+ "AWS::AppMesh::VirtualNode",
23536
+ "AWS::AppMesh::VirtualRouter",
23537
+ "AWS::AppMesh::VirtualService",
23538
+ "AWS::AppStream::Fleet",
23539
+ "AWS::AppStream::StackFleetAssociation",
23540
+ "AWS::AppSync::ApiCache",
23541
+ "AWS::Artifact::Report",
23542
+ "AWS::Athena::Session",
23543
+ "AWS::AutoScalingPlans::ScalingPlan",
23544
+ "AWS::BackupSearch::SearchJob",
23545
+ "AWS::BackupSearch::SearchResultExportJob",
23546
+ "AWS::BCMDataExports::Table",
23547
+ "AWS::Bedrock::AsyncInvoke",
23548
+ "AWS::Bedrock::DefaultPromptRouter",
23549
+ "AWS::Bedrock::FlowExecution",
23550
+ "AWS::Bedrock::FoundationModel",
23551
+ "AWS::Bedrock::ImportedModel",
23552
+ "AWS::Bedrock::ModelImportJob",
23553
+ "AWS::Bedrock::ModelInvocationJob",
23554
+ "AWS::BedrockAgentCore::ConfigurationBundleVersion",
23555
+ "AWS::BedrockAgentCore::HarnessVersion",
23556
+ "AWS::BedrockAgentCore::PolicyGeneration",
23557
+ "AWS::BedrockAgentCore::TokenVault",
23558
+ "AWS::Braket::Job",
23559
+ "AWS::Cassandra::Stream",
23560
+ "AWS::Cloud9::EnvironmentEC2",
23561
+ "AWS::CloudFormation::Macro",
23562
+ "AWS::CloudFormation::ResourceScan",
23563
+ "AWS::CloudFormation::WaitCondition",
23564
+ "AWS::CloudFront::StreamingDistribution",
23565
+ "AWS::CodeArtifact::Package",
23566
+ "AWS::CodeBuild::Build",
23567
+ "AWS::CodeBuild::BuildBatch",
23568
+ "AWS::CodeBuild::Sandbox",
23569
+ "AWS::CodeStar::GitHubRepository",
23570
+ "AWS::CognitoSync::Dataset",
23571
+ "AWS::Comprehend::DocumentClassificationJob",
23572
+ "AWS::Comprehend::DominantLanguageDetectionJob",
23573
+ "AWS::Comprehend::EntitiesDetectionJob",
23574
+ "AWS::Comprehend::FlywheelDataset",
23575
+ "AWS::Comprehend::SentimentDetectionJob",
23576
+ "AWS::Comprehend::TargetedSentimentDetectionJob",
23577
+ "AWS::Config::ConfigurationRecorder",
23578
+ "AWS::Config::DeliveryChannel",
23579
+ "AWS::Config::OrganizationConfigRule",
23580
+ "AWS::ControlCatalog::CommonControl",
23581
+ "AWS::ControlCatalog::Control",
23582
+ "AWS::ControlCatalog::Objective",
23583
+ "AWS::DataExchange::Assets",
23584
+ "AWS::DataExchange::EntitledDataSets",
23585
+ "AWS::DataExchange::Job",
23586
+ "AWS::DataSync::TaskExecution",
23587
+ "AWS::DAX::Cluster",
23588
+ "AWS::DAX::SubnetGroup",
23589
+ "AWS::Deadline::Job",
23590
+ "AWS::DirectoryService::MicrosoftAD",
23591
+ "AWS::DMS::ReplicationInstance",
23592
+ "AWS::DRS::RecoveryInstance",
23593
+ "AWS::DynamoDB::Export",
23594
+ "AWS::DynamoDB::Stream",
23595
+ "AWS::EC2::ClientVpnAuthorizationRule",
23596
+ "AWS::EC2::ClientVpnEndpoint",
23597
+ "AWS::EC2::ClientVpnRoute",
23598
+ "AWS::EC2::ClientVpnTargetNetworkAssociation",
23599
+ "AWS::EC2::ExportInstanceTask",
23600
+ "AWS::EC2::NetworkInterfacePermission",
23601
+ "AWS::EC2::ReplaceRootVolumeTask",
23602
+ "AWS::EC2::VpnConnectionDeviceType",
23603
+ "AWS::EC2::VPNGatewayRoutePropagation",
23604
+ "AWS::ECRPublic::Registry",
23605
+ "AWS::ECS::ContainerInstance",
23606
+ "AWS::ECS::Task",
23607
+ "AWS::ElastiCache::ReservedCacheNode",
23608
+ "AWS::ElastiCache::SecurityGroup",
23609
+ "AWS::ElastiCache::SecurityGroupIngress",
23610
+ "AWS::ElasticLoadBalancingV2::ListenerCertificate",
23611
+ "AWS::Elasticsearch::Domain",
23612
+ "AWS::EMR::NotebookExecution",
23613
+ "AWS::EMRContainers::JobRun",
23614
+ "AWS::EMRServerless::JobRun",
23615
+ "AWS::Events::Replay",
23616
+ "AWS::FIS::Experiment",
23617
+ "AWS::FIS::SafetyLever",
23618
+ "AWS::FSx::Snapshot",
23619
+ "AWS::FSx::StorageVirtualMachine",
23620
+ "AWS::Glue::DevEndpoint",
23621
+ "AWS::Glue::Partition",
23622
+ "AWS::Glue::TableVersion",
23623
+ "AWS::Greengrass::ConnectorDefinition",
23624
+ "AWS::Greengrass::ConnectorDefinitionVersion",
23625
+ "AWS::Greengrass::CoreDefinition",
23626
+ "AWS::Greengrass::CoreDefinitionVersion",
23627
+ "AWS::Greengrass::DeviceDefinition",
23628
+ "AWS::Greengrass::DeviceDefinitionVersion",
23629
+ "AWS::Greengrass::FunctionDefinition",
23630
+ "AWS::Greengrass::FunctionDefinitionVersion",
23631
+ "AWS::Greengrass::Group",
23632
+ "AWS::Greengrass::GroupVersion",
23633
+ "AWS::Greengrass::LoggerDefinition",
23634
+ "AWS::Greengrass::LoggerDefinitionVersion",
23635
+ "AWS::Greengrass::ResourceDefinition",
23636
+ "AWS::Greengrass::ResourceDefinitionVersion",
23637
+ "AWS::Greengrass::SubscriptionDefinition",
23638
+ "AWS::Greengrass::SubscriptionDefinitionVersion",
23639
+ "AWS::GreengrassV2::Component",
23640
+ "AWS::GreengrassV2::CoreDevice",
23641
+ "AWS::IdentityStore::AllGroupMemberships",
23642
+ "AWS::ImageBuilder::AllImageBuildVersions",
23643
+ "AWS::ImageBuilder::AllWorkflowBuildVersions",
23644
+ "AWS::ImageBuilder::LifecycleExecution",
23645
+ "AWS::ImageBuilder::WorkflowExecution",
23646
+ "AWS::ImageBuilder::WorkflowStepExecution",
23647
+ "AWS::InternetMonitor::InternetEvent",
23648
+ "AWS::IoT::Index",
23649
+ "AWS::IoT::PolicyPrincipalAttachment",
23650
+ "AWS::IoT::ThingPrincipalAttachment",
23651
+ "AWS::IoTDeviceAdvisor::SuiteRun",
23652
+ "AWS::IoTThingsGraph::FlowTemplate",
23653
+ "AWS::IoTTwinMaker::MetadataTransferJob",
23654
+ "AWS::IVS::Composition",
23655
+ "AWS::KafkaConnect::ConnectorOperation",
23656
+ "AWS::KinesisAnalytics::Application",
23657
+ "AWS::KinesisAnalytics::ApplicationOutput",
23658
+ "AWS::KinesisAnalytics::ApplicationReferenceDataSource",
23659
+ "AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption",
23660
+ "AWS::KinesisAnalyticsV2::ApplicationOutput",
23661
+ "AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource",
23662
+ "AWS::LakeFormation::DataLakeSettings",
23663
+ "AWS::LakeFormation::Permissions",
23664
+ "AWS::LakeFormation::Resource",
23665
+ "AWS::Lambda::DurableExecution",
23666
+ "AWS::Lightsail::ExportSnapshotRecord",
23667
+ "AWS::Location::Job",
23668
+ "AWS::Macie2::ClassificationJob",
23669
+ "AWS::ManagedBlockchain::Member",
23670
+ "AWS::ManagedBlockchain::Node",
23671
+ "AWS::MediaConnect::Offering",
23672
+ "AWS::MediaConnect::Reservation",
23673
+ "AWS::MediaConvert::JobTemplate",
23674
+ "AWS::MediaConvert::Queue",
23675
+ "AWS::MediaLive::Channel",
23676
+ "AWS::MediaLive::Input",
23677
+ "AWS::MediaLive::InputSecurityGroup",
23678
+ "AWS::MediaLive::Offering",
23679
+ "AWS::MediaPackage::HarvestJob",
23680
+ "AWS::MediaPackageV2::HarvestJob",
23681
+ "AWS::MediaStore::Container",
23682
+ "AWS::MedicalImaging::ImageSet",
23683
+ "AWS::MemoryDB::MultiRegionParameterGroup",
23684
+ "AWS::MemoryDB::ReservedNode",
23685
+ "AWS::NeptuneGraph::ExportTask",
23686
+ "AWS::NovaAct::WorkflowRun",
23687
+ "AWS::Omics::ReadSet",
23688
+ "AWS::Omics::Reference",
23689
+ "AWS::Omics::Run",
23690
+ "AWS::Omics::Task",
23691
+ "AWS::OpsWorks::App",
23692
+ "AWS::OpsWorks::ElasticLoadBalancerAttachment",
23693
+ "AWS::OpsWorks::Instance",
23694
+ "AWS::OpsWorks::Layer",
23695
+ "AWS::OpsWorks::Stack",
23696
+ "AWS::OpsWorks::UserProfile",
23697
+ "AWS::OpsWorks::Volume",
23698
+ "AWS::Organizations::Root",
23699
+ "AWS::OSIS::PipelineBlueprint",
23700
+ "AWS::PartnerCentral::ConnectionPreferences",
23701
+ "AWS::PartnerCentral::Partner",
23702
+ "AWS::Personalize::BatchInferenceJob",
23703
+ "AWS::Personalize::BatchSegmentJob",
23704
+ "AWS::Personalize::DataDeletionJob",
23705
+ "AWS::Personalize::DatasetExportJob",
23706
+ "AWS::Personalize::Recipe",
23707
+ "AWS::Pinpoint::ADMChannel",
23708
+ "AWS::Pinpoint::APNSChannel",
23709
+ "AWS::Pinpoint::APNSSandboxChannel",
23710
+ "AWS::Pinpoint::APNSVoipChannel",
23711
+ "AWS::Pinpoint::APNSVoipSandboxChannel",
23712
+ "AWS::Pinpoint::App",
23713
+ "AWS::Pinpoint::ApplicationSettings",
23714
+ "AWS::Pinpoint::BaiduChannel",
23715
+ "AWS::Pinpoint::Campaign",
23716
+ "AWS::Pinpoint::EmailChannel",
23717
+ "AWS::Pinpoint::EmailTemplate",
23718
+ "AWS::Pinpoint::EventStream",
23719
+ "AWS::Pinpoint::GCMChannel",
23720
+ "AWS::Pinpoint::PushTemplate",
23721
+ "AWS::Pinpoint::Segment",
23722
+ "AWS::Pinpoint::SMSChannel",
23723
+ "AWS::Pinpoint::SmsTemplate",
23724
+ "AWS::Pinpoint::VoiceChannel",
23725
+ "AWS::PinpointEmail::ConfigurationSet",
23726
+ "AWS::PinpointEmail::ConfigurationSetEventDestination",
23727
+ "AWS::PinpointEmail::DedicatedIpPool",
23728
+ "AWS::PinpointEmail::Identity",
23729
+ "AWS::QLDB::Ledger",
23730
+ "AWS::QuickSight::AssetBundleExportJob",
23731
+ "AWS::QuickSight::AssetBundleImportJob",
23732
+ "AWS::RDS::DBSecurityGroup",
23733
+ "AWS::RDS::DBSecurityGroupIngress",
23734
+ "AWS::RDS::ReservedDBInstance",
23735
+ "AWS::Redshift::ClusterSecurityGroup",
23736
+ "AWS::Redshift::ClusterSecurityGroupIngress",
23737
+ "AWS::Redshift::DataShare",
23738
+ "AWS::RedshiftServerless::RecoveryPoint",
23739
+ "AWS::ResilienceHub::RecommendationTemplate",
23740
+ "AWS::Route53::RecordSetGroup",
23741
+ "AWS::Route53Resolver::FirewallConfig",
23742
+ "AWS::SageMaker::AutoMLJob",
23743
+ "AWS::SageMaker::CodeRepository",
23744
+ "AWS::SageMaker::ExperimentTrialComponent",
23745
+ "AWS::SageMaker::HubContentVersion",
23746
+ "AWS::SageMaker::HyperParameterTuningJob",
23747
+ "AWS::SageMaker::ModelCardExportJob",
23748
+ "AWS::SageMaker::MonitoringScheduleAlert",
23749
+ "AWS::SageMaker::NotebookInstance",
23750
+ "AWS::SageMaker::NotebookInstanceLifecycleConfig",
23751
+ "AWS::SageMaker::OptimizationJob",
23752
+ "AWS::SageMaker::PipelineExecution",
23753
+ "AWS::SageMaker::TrainingJob",
23754
+ "AWS::SageMaker::TransformJob",
23755
+ "AWS::SageMaker::Workteam",
23756
+ "AWS::SavingsPlans::SavingsPlan",
23757
+ "AWS::SecurityAgent::PentestTask",
23758
+ "AWS::ServiceDiscovery::Instance",
23759
+ "AWS::ServiceQuotas::Quota",
23760
+ "AWS::Signer::SigningJob",
23761
+ "AWS::SSM::AutomationExecution",
23762
+ "AWS::SSM::ManagedInstance",
23763
+ "AWS::SSM::Session",
23764
+ "AWS::SSO::ApplicationProvider",
23765
+ "AWS::States::Execution",
23766
+ "AWS::StepFunctions::MapRun",
23767
+ "AWS::ThinClient::SoftwareSet",
23768
+ "AWS::Transcribe::CallAnalyticsJob",
23769
+ "AWS::Transcribe::MedicalScribeJob",
23770
+ "AWS::Transcribe::MedicalTranscriptionJob",
23771
+ "AWS::Transcribe::TranscriptionJob",
23772
+ "AWS::UserNotifications::ManagedNotificationConfiguration",
23773
+ "AWS::UserNotifications::NotificationEvent",
23774
+ "AWS::WAF::ByteMatchSet",
23775
+ "AWS::WAF::IPSet",
23776
+ "AWS::WAF::Rule",
23777
+ "AWS::WAF::SizeConstraintSet",
23778
+ "AWS::WAF::SqlInjectionMatchSet",
23779
+ "AWS::WAF::WebACL",
23780
+ "AWS::WAF::XssMatchSet",
23781
+ "AWS::WAFRegional::ByteMatchSet",
23782
+ "AWS::WAFRegional::GeoMatchSet",
23783
+ "AWS::WAFRegional::IPSet",
23784
+ "AWS::WAFRegional::RateBasedRule",
23785
+ "AWS::WAFRegional::RegexPatternSet",
23786
+ "AWS::WAFRegional::Rule",
23787
+ "AWS::WAFRegional::SizeConstraintSet",
23788
+ "AWS::WAFRegional::SqlInjectionMatchSet",
23789
+ "AWS::WAFRegional::WebACL",
23790
+ "AWS::WAFRegional::WebACLAssociation",
23791
+ "AWS::WAFRegional::XssMatchSet",
23792
+ "AWS::Wisdom::Session",
23793
+ "AWS::WorkSpaces::WorkSpaceApplication"
23794
+ ]);
23795
+
23796
+ //#endregion
23797
+ //#region src/provisioning/unsupported-types.ts
23798
+ /**
23799
+ * Helpers for cdkd's genuinely-unsupported resource types.
23800
+ *
23801
+ * The data ({@link NON_PROVISIONABLE_TYPES}) is generated from the
23802
+ * provider-coverage audit (`vp run gen:unsupported-types`); this module adds
23803
+ * the runtime predicates + the actionable issue link used by the pre-flight
23804
+ * check (see {@link ../provisioning/provider-registry.ProviderRegistry.validateResourceTypes}).
23805
+ */
23806
+ /**
23807
+ * True if AWS reports the type as `ProvisioningType: NON_PROVISIONABLE`
23808
+ * (Cloud Control API cannot create/update/delete it) and cdkd has no SDK
23809
+ * provider for it.
23810
+ */
23811
+ function isNonProvisionable(resourceType) {
23812
+ return NON_PROVISIONABLE_TYPES.has(resourceType);
23813
+ }
23814
+ /**
23815
+ * A 1-click pre-filled GitHub issue link requesting cdkd support for a
23816
+ * resource type. Surfaced in the pre-flight error so a user hitting an
23817
+ * unsupported type lands directly in the "request support" flow.
23818
+ */
23819
+ function unsupportedTypeIssueUrl(resourceType) {
23820
+ return `https://github.com/go-to-k/cdkd/issues/new?title=${encodeURIComponent(`Support resource type ${resourceType}`)}&labels=resource-support`;
23821
+ }
23822
+
22913
23823
  //#endregion
22914
23824
  //#region src/provisioning/property-coverage.ts
22915
23825
  /**
@@ -22947,9 +23857,11 @@ function getPropertyCoverage(resourceType) {
22947
23857
  * for a single resource. Returns an array of `{ property, rationale }` for
22948
23858
  * each unhandled top-level key in `templateProperties`, sorted alphabetically.
22949
23859
  *
22950
- * Properties NOT in the CFn schema (likely a user typo or
22951
- * `addPropertyOverride` escape hatch) are silently allowed: matching CFn's
22952
- * own tolerance, and we cannot judge intent.
23860
+ * Only properties the committed CFn schema snapshot KNOWS. A key absent from
23861
+ * it is {@link findUnrecognizedProperties}' concern, and it drives routing
23862
+ * through {@link findRoutableUnrecognizedProperties} instead — kept apart
23863
+ * because the state and diff NARROWINGS below read this list and must stay
23864
+ * fixture-only (issue [#3713](https://github.com/go-to-k/cdkd/issues/3713)).
22953
23865
  */
22954
23866
  function findSilentDropProperties(resourceType, templateProperties) {
22955
23867
  if (!templateProperties) return [];
@@ -22967,23 +23879,62 @@ function findSilentDropProperties(resourceType, templateProperties) {
22967
23879
  }
22968
23880
  return drops.sort((a, b) => a.property.localeCompare(b.property));
22969
23881
  }
23882
+ /** Rationale carried by a route-driving key absent from the schema snapshot. */
23883
+ const UNRECOGNIZED_PROPERTY_RATIONALE = "not in cdkd's CFn schema snapshot";
23884
+ /**
23885
+ * The properties that drive the Cloud Control auto-route (issue
23886
+ * [#614](https://github.com/go-to-k/cdkd/issues/614)): every silent drop whose
23887
+ * `<Type>:<Prop>` key is NOT in the `--prefer-sdk-route` allow set, plus every
23888
+ * {@link findRoutableUnrecognizedProperties} key. THE routing predicate —
23889
+ * `getProviderFor`, the sticky-escape, the plan and diff annotations and the
23890
+ * recreate validators all read it, so none can disagree with the route.
23891
+ *
23892
+ * `recordedProperties` is the resource's existing state-record bag, and it
23893
+ * matters only for the unrecognized half; see
23894
+ * {@link findRoutableUnrecognizedProperties}. Omitting it is PRESENCE
23895
+ * semantics, correct for a new physical resource.
23896
+ *
23897
+ * Sorted by property; `[]` for Tier 2 / Custom / unknown types, an absent bag,
23898
+ * or a bag whose every drop is allowed.
23899
+ */
23900
+ function findActionableSilentDrops(resourceType, templateProperties, allowedKeys, recordedProperties, options) {
23901
+ const drops = findSilentDropProperties(resourceType, templateProperties).filter(({ property }) => !allowedKeys.has(`${resourceType}:${property}`));
23902
+ const unrecognized = findRoutableUnrecognizedProperties(resourceType, templateProperties, allowedKeys, recordedProperties, options);
23903
+ if (unrecognized.length === 0) return drops;
23904
+ return [...drops, ...unrecognized.map((property) => ({
23905
+ property,
23906
+ rationale: UNRECOGNIZED_PROPERTY_RATIONALE
23907
+ }))].sort((a, b) => a.property.localeCompare(b.property));
23908
+ }
23909
+ function findRoutableUnrecognizedProperties(resourceType, templateProperties, allowedKeys, recordedProperties, options) {
23910
+ const coverage = getPropertyCoverage(resourceType);
23911
+ if (!templateProperties || !coverage) return [];
23912
+ if (coverage.ccRouteUnavailable || isNonProvisionable(resourceType)) return [];
23913
+ return findUnrecognizedProperties(resourceType, templateProperties).filter((property) => !coverage.readOnly.has(property) && !allowedKeys.has(`${resourceType}:${property}`) && !(recordedProperties != null && typeof recordedProperties === "object" && Object.hasOwn(recordedProperties, property) && sameJsonValue(recordedProperties[property], templateProperties[property], options?.unresolvedAs ?? "unchanged")));
23914
+ }
22970
23915
  /**
22971
- * Same as {@link findSilentDropProperties} but filters out entries whose
22972
- * `<Type>:<Prop>` key is in the supplied allow set (the
22973
- * `--allow-unsupported-properties` user override). Returned drops are the
22974
- * ones that should drive CC API auto-routing (issue
22975
- * [#614](https://github.com/go-to-k/cdkd/issues/614)) — silent drops
22976
- * the user has explicitly opted-into via the override are removed so the
22977
- * resource stays on the SDK Provider path.
22978
- *
22979
- * Mirrors `findSilentDropProperties`'s sort + early-return behavior:
22980
- * returns `[]` for Tier 2 / Custom / unknown types, undefined / empty
22981
- * `templateProperties`, or when every drop is in `allowedKeys`.
23916
+ * Structural equality over the JSON form, for the baseline arm of
23917
+ * {@link findRoutableUnrecognizedProperties}. Not `isDeepStrictEqual` on the raw
23918
+ * values: the two bags are built by different code (the state record is parsed
23919
+ * JSON, the desired bag can be rebuilt with a null prototype by the secret
23920
+ * redaction), and a prototype difference must not read as a changed value —
23921
+ * that would route an unchanged key. Key order does not matter here either.
22982
23922
  */
22983
- function findActionableSilentDrops(resourceType, templateProperties, allowedKeys) {
22984
- const drops = findSilentDropProperties(resourceType, templateProperties);
22985
- if (drops.length === 0) return drops;
22986
- return drops.filter(({ property }) => !allowedKeys.has(`${resourceType}:${property}`));
23923
+ function sameJsonValue(recorded, desired, unresolvedAs) {
23924
+ const recordedJson = toJsonValue(recorded);
23925
+ if (JSON.stringify(recordedJson)?.includes("{{resolve:") === true) return true;
23926
+ const desiredJson = toJsonValue(desired);
23927
+ if (containsIntrinsic(desiredJson)) return unresolvedAs === "unchanged";
23928
+ return isDeepStrictEqual(recordedJson, desiredJson);
23929
+ }
23930
+ /** True when `value` holds a `Ref` / `Fn::*` object anywhere. */
23931
+ function containsIntrinsic(value) {
23932
+ if (Array.isArray(value)) return value.some(containsIntrinsic);
23933
+ if (value === null || typeof value !== "object") return false;
23934
+ return Object.entries(value).some(([key, child]) => key === "Ref" || key.startsWith("Fn::") || containsIntrinsic(child));
23935
+ }
23936
+ function toJsonValue(value) {
23937
+ return value === void 0 ? void 0 : JSON.parse(JSON.stringify(value));
22987
23938
  }
22988
23939
  /**
22989
23940
  * The silent-drop properties in `templateProperties` the user has opted back
@@ -23000,9 +23951,13 @@ function findActionableSilentDrops(resourceType, templateProperties, allowedKeys
23000
23951
  * per-property answer would be wrong for exactly the mixed bag.
23001
23952
  *
23002
23953
  * The complement of {@link findActionableSilentDrops}: one is empty whenever
23003
- * the other is not, unless the bag has no drops at all (both empty).
23954
+ * the other is not, unless the bag has no drops at all (both empty). A
23955
+ * route-driving UNRECOGNIZED key empties this too, which is why it takes the
23956
+ * same `recordedProperties` — but the accepted list itself stays fixture-only,
23957
+ * since it feeds the narrowing.
23004
23958
  */
23005
- function findAcceptedSilentDrops(resourceType, templateProperties, allowedKeys) {
23959
+ function findAcceptedSilentDrops(resourceType, templateProperties, allowedKeys, recordedProperties) {
23960
+ if (findRoutableUnrecognizedProperties(resourceType, templateProperties, allowedKeys, recordedProperties).length > 0) return [];
23006
23961
  const drops = findSilentDropProperties(resourceType, templateProperties);
23007
23962
  const accepted = [];
23008
23963
  for (const { property } of drops) {
@@ -23061,10 +24016,17 @@ function withoutSilentDropProperties(resourceType, properties) {
23061
24016
  * — {@link removableSilentDrops} carries the rationale, and both go through
23062
24017
  * {@link excludeCreateOnly} so they cannot decline on different rules.
23063
24018
  *
24019
+ * `recordedProperties` is the resource's state-record bag — the one
24020
+ * `getProviderFor` receives as `previousProperties` — so this narrows on the
24021
+ * route the deploy actually takes (issue
24022
+ * [#3713](https://github.com/go-to-k/cdkd/issues/3713)). Omitting it for an
24023
+ * existing resource treats an unchanged unrecognized key as route-driving and
24024
+ * declines to narrow.
24025
+ *
23064
24026
  * Returns the input UNCHANGED when nothing applies.
23065
24027
  */
23066
- function withoutAcceptedSilentDropProperties(resourceType, properties, allowedKeys) {
23067
- const removable = excludeCreateOnly(resourceType, findAcceptedSilentDrops(resourceType, properties, allowedKeys));
24028
+ function withoutAcceptedSilentDropProperties(resourceType, properties, allowedKeys, recordedProperties) {
24029
+ const removable = excludeCreateOnly(resourceType, findAcceptedSilentDrops(resourceType, properties, allowedKeys, recordedProperties));
23068
24030
  if (removable.length === 0) return properties;
23069
24031
  const written = { ...properties };
23070
24032
  for (const property of removable) delete written[property];
@@ -23132,16 +24094,14 @@ function unsupportedPropertyIssueUrl(resourceType, property) {
23132
24094
  * `coverage.handled` nor `coverage.silentDrop` (issue
23133
24095
  * [#2718](https://github.com/go-to-k/cdkd/issues/2718)).
23134
24096
  *
23135
- * The complement of {@link findSilentDropProperties}, which deliberately
23136
- * PASSES these through: a property absent from the schema is indistinguishable
23137
- * at deploy time from a user typo or an `addPropertyOverride` escape hatch, so
23138
- * it cannot drive a routing decision. That tolerance is correct for routing
23139
- * and wrong for silence — the routing table is built offline from
23140
- * `tests/fixtures/cfn-schemas/*.json`, so every property AWS publishes AFTER
23141
- * that snapshot lands here, and on the SDK route it reaches neither AWS nor an
23142
- * error while the deploy reports success. That is the issue
23143
- * [#614](https://github.com/go-to-k/cdkd/issues/614) failure class arriving
23144
- * through the one input the #614 machinery cannot observe.
24097
+ * The complement of {@link findSilentDropProperties}. The routing table is
24098
+ * built offline from `tests/fixtures/cfn-schemas/*.json`, so every property
24099
+ * AWS publishes AFTER that snapshot lands here — as does a typo or an
24100
+ * `addPropertyOverride` key. The route-driving subset is
24101
+ * {@link findRoutableUnrecognizedProperties} (issue
24102
+ * [#3713](https://github.com/go-to-k/cdkd/issues/3713)); what stays on the SDK
24103
+ * route (read-only keys, allow-listed or unchanged ones, types Cloud Control
24104
+ * cannot take) is what the caller's warn reports.
23145
24105
  *
23146
24106
  * **Why a warn built on this has no false-positive mode.** An SDK provider
23147
24107
  * writes only what it declares in `handledProperties`, so a top-level property
@@ -25872,6 +26832,15 @@ const IN_PLACE_UPDATE_DERIVED_ATTRS = Object.freeze({ "AWS::EC2::LaunchTemplate"
25872
26832
  */
25873
26833
  const IN_PLACE_UPDATE_DERIVED_ATTR_PREFIXES = Object.freeze({ "AWS::CloudFormation::Stack": Object.freeze(["Outputs."]) });
25874
26834
  /**
26835
+ * The attribute name {@link DiffCalculator.extractGetAttRefs} records for a
26836
+ * `Ref` read (go-to-k/cdkd#3717 / #3722). Not a name any attribute can have, so
26837
+ * the property-name, derived-attribute and prefix arms of the in-place pass
26838
+ * never match it; only the custom-resource arm (whose physical id the handler
26839
+ * may change) and the fresh-parameter arm (a parameter carrying a `NoEcho`
26840
+ * value supplied in this deploy) read it.
26841
+ */
26842
+ const REF_READ = "<Ref>";
26843
+ /**
25875
26844
  * Diff calculator for comparing desired state (template) with current state
25876
26845
  */
25877
26846
  var DiffCalculator = class DiffCalculator {
@@ -25905,7 +26874,7 @@ var DiffCalculator = class DiffCalculator {
25905
26874
  * flag-less deploy.
25906
26875
  * @returns Map of logical ID to resource change
25907
26876
  */
25908
- async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties) {
26877
+ async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters) {
25909
26878
  const changes = /* @__PURE__ */ new Map();
25910
26879
  refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0);
25911
26880
  refuseMalformedResourceProperties(currentState, void 0, void 0);
@@ -25961,7 +26930,7 @@ var DiffCalculator = class DiffCalculator {
25961
26930
  const rawDesiredProps = desiredResource.Properties || {};
25962
26931
  const resolvedDesiredProps = resolveFn ? await this.resolveBestEffort(rawDesiredProps, resolveFn) : rawDesiredProps;
25963
26932
  const sdkRouted = currentResource.provisionedBy !== "cc-api";
25964
- const desiredAfterDrops = sdkRouted && allowedUnsupportedProperties ? withoutAcceptedSilentDropProperties(desiredResource.Type, resolvedDesiredProps, allowedUnsupportedProperties) : resolvedDesiredProps;
26933
+ const desiredAfterDrops = sdkRouted && allowedUnsupportedProperties ? withoutAcceptedSilentDropProperties(desiredResource.Type, resolvedDesiredProps, allowedUnsupportedProperties, currentResource.properties) : resolvedDesiredProps;
25965
26934
  const currentAfterDrops = sdkRouted ? withoutSilentDropProperties(desiredResource.Type, currentResource.properties) : currentResource.properties;
25966
26935
  const desiredPropsForCompare = canonicalizeProperties ? canonicalizeProperties(desiredResource.Type, desiredAfterDrops) : desiredAfterDrops;
25967
26936
  const currentPropsForCompare = canonicalizeProperties && sdkRouted ? canonicalizeProperties(desiredResource.Type, currentAfterDrops) : currentAfterDrops;
@@ -26002,11 +26971,9 @@ var DiffCalculator = class DiffCalculator {
26002
26971
  });
26003
26972
  this.logger.debug(`DELETE: ${logicalId} (${currentResource.resourceType})`);
26004
26973
  }
26005
- let round = 0;
26006
- do {
26007
- round++;
26974
+ do
26008
26975
  this.promoteReplacementDependents(changes, desiredTemplate);
26009
- } while (this.promoteInPlaceAttributeDependents(changes, desiredTemplate, rawGetAttRefs, currentResources, round));
26976
+ while (this.promoteInPlaceAttributeDependents(changes, desiredTemplate, rawGetAttRefs, freshParameters));
26010
26977
  const summary = this.getSummary(changes);
26011
26978
  this.logger.debug(`Diff calculated: ${summary.create} CREATE, ${summary.update} UPDATE, ${summary.delete} DELETE, ${summary.noChange} NO_CHANGE`);
26012
26979
  return changes;
@@ -26122,34 +27089,44 @@ var DiffCalculator = class DiffCalculator {
26122
27089
  * or
26123
27090
  * 3. `Attr` starts with a derived-attribute PREFIX of `Up`'s type — the
26124
27091
  * {@link IN_PLACE_UPDATE_DERIVED_ATTR_PREFIXES} table (issue #3631; a
26125
- * nested stack's `Outputs.<Key>`).
26126
- * (`Ref` resolves to the physical id, which an in-place update never moves, so
26127
- * Ref-only dependents are left NO_CHANGE; likewise a GetAtt of a computed
26128
- * attribute NOT in the allow list, e.g. a Lambda `Arn` on a Description edit.)
27092
+ * nested stack's `Outputs.<Key>`); or
27093
+ * 4. `Up` is a custom resource, whose attributes are all its handler's
27094
+ * response `Data` (go-to-k/cdkd#3662), and whose `Ref` — the physical
27095
+ * id — its handler may also change on an Update by returning a new
27096
+ * `PhysicalResourceId` (go-to-k/cdkd#3722); or
27097
+ * 5. `Up` is a template PARAMETER in `freshParameters`, read by `Ref` or
27098
+ * `${Param}` (go-to-k/cdkd#3717).
27099
+ * (Any other `Ref` resolves to a physical id an in-place update keeps, so
27100
+ * Ref-only dependents of other types are left NO_CHANGE; likewise a GetAtt
27101
+ * of a computed attribute NOT in the allow list, e.g. a Lambda `Arn` on a
27102
+ * Description edit.)
26129
27103
  *
26130
27104
  * Promotion is safe even when speculative: the deploy engine re-resolves the
26131
27105
  * promoted resource against the in-flight state and skips the provider call
26132
- * when nothing actually changed.
27106
+ * when nothing actually changed. Each synthetic change is marked
27107
+ * `inPlacePropagated`, and its `requiresReplacement` is a ceiling the engine
27108
+ * lowers when the resolved value equals the record, so an unmoved value never
27109
+ * replaces a reader that another edit sent to the provider.
26133
27110
  *
26134
27111
  * One pass is single-hop: `changedPropsByUpstream` is frozen at entry, so a
26135
27112
  * chain `A(in-place) -> B(reads A's changed attr) -> C(reads B's now-changed
26136
27113
  * attr)` promotes B but not C. `calculateDiff` re-runs it to a fixpoint, and
26137
27114
  * the pass after B's promotion sees B as an in-place UPDATE.
26138
27115
  *
26139
- * A SPECULATIVE promotion — arm 3 in any round, and every arm after the first
26140
- * round, whose upstreams exist only because an earlier promotion guessed —
26141
- * skips a dependent that reads a MASKED attribute anywhere
26142
- * ({@link readsMaskedAttribute}). The engine resolves the dependent's whole
26143
- * bag and refuses a read of `***` BEFORE its no-change skip, so such a guess
26144
- * would fail a deploy that left the dependent alone before this pass could
26145
- * reach it (go-to-k/cdkd#3662). The first round's arms 1 and 2 keep their
26146
- * behaviour: a property they match really changed.
27116
+ * A dependent reading a MASKED attribute (a `NoEcho` custom resource's
27117
+ * value, persisted `***`, issue #2274) is promoted like any other
27118
+ * (go-to-k/cdkd#3662). The engine takes its no-change skip BEFORE refusing a
27119
+ * redacted read, so a guess whose resolved bag equals the record, mask
27120
+ * included, sends nothing; a fresh `NoEcho` value never takes that skip, so
27121
+ * one the upstream re-minted in this run reaches AWS. What is left is the
27122
+ * refusal's own case: a promoted dependent whose OTHER reads moved while the
27123
+ * masked value was not re-minted fails loudly, as an update of it with a
27124
+ * changed property already did, rather than keeping the stale values.
26147
27125
  *
26148
- * @param round 1-based fixpoint round; see the speculative-promotion note.
26149
27126
  * @returns whether any synthetic PropertyChange was added (the caller's
26150
27127
  * fixpoint signal).
26151
27128
  */
26152
- promoteInPlaceAttributeDependents(changes, desiredTemplate, rawGetAttRefs, currentResources, round) {
27129
+ promoteInPlaceAttributeDependents(changes, desiredTemplate, rawGetAttRefs, freshParameters) {
26153
27130
  const changedPropsByUpstream = /* @__PURE__ */ new Map();
26154
27131
  const inPlaceUpdateTypeByUpstream = /* @__PURE__ */ new Map();
26155
27132
  for (const [logicalId, change] of changes) {
@@ -26159,7 +27136,8 @@ var DiffCalculator = class DiffCalculator {
26159
27136
  const props = propertyChanges.map((pc) => pc.path).filter((p) => typeof p === "string");
26160
27137
  if (props.length > 0) changedPropsByUpstream.set(logicalId, new Set(props));
26161
27138
  }
26162
- if (changedPropsByUpstream.size === 0 && inPlaceUpdateTypeByUpstream.size === 0) return false;
27139
+ const anyFreshParameter = freshParameters !== void 0 && freshParameters.size > 0;
27140
+ if (changedPropsByUpstream.size === 0 && inPlaceUpdateTypeByUpstream.size === 0 && !anyFreshParameter) return false;
26163
27141
  let added = false;
26164
27142
  for (const [dependentId, perProp] of rawGetAttRefs) {
26165
27143
  const resource = desiredTemplate.Resources[dependentId];
@@ -26169,13 +27147,11 @@ var DiffCalculator = class DiffCalculator {
26169
27147
  if (change.changeType !== "NO_CHANGE" && change.changeType !== "UPDATE") continue;
26170
27148
  const existingPaths = new Set((change.propertyChanges ?? []).map((pc) => pc.path));
26171
27149
  const syntheticChanges = [];
26172
- const speculationAllowed = !DiffCalculator.readsMaskedAttribute(perProp, currentResources);
26173
27150
  for (const [propKey, getAttRefs] of perProp) {
26174
27151
  if (existingPaths.has(propKey)) continue;
26175
27152
  let matched = false;
26176
27153
  for (const [upstreamId, attrs] of getAttRefs) {
26177
27154
  if (upstreamId === dependentId) continue;
26178
- if (round > 1 && !speculationAllowed) break;
26179
27155
  const changedProps = changedPropsByUpstream.get(upstreamId);
26180
27156
  if (changedProps && [...attrs].some((attr) => changedProps.has(attr))) {
26181
27157
  matched = true;
@@ -26188,7 +27164,15 @@ var DiffCalculator = class DiffCalculator {
26188
27164
  break;
26189
27165
  }
26190
27166
  const derivedPrefixes = upstreamType !== void 0 && Object.hasOwn(IN_PLACE_UPDATE_DERIVED_ATTR_PREFIXES, upstreamType) ? IN_PLACE_UPDATE_DERIVED_ATTR_PREFIXES[upstreamType] : void 0;
26191
- if (speculationAllowed && derivedPrefixes && [...attrs].some((attr) => derivedPrefixes.some((prefix) => attr.startsWith(prefix)))) {
27167
+ if (derivedPrefixes && [...attrs].some((attr) => derivedPrefixes.some((prefix) => attr.startsWith(prefix)))) {
27168
+ matched = true;
27169
+ break;
27170
+ }
27171
+ if (upstreamType !== void 0 && (upstreamType.startsWith("Custom::") || upstreamType === "AWS::CloudFormation::CustomResource")) {
27172
+ matched = true;
27173
+ break;
27174
+ }
27175
+ if (anyFreshParameter && freshParameters.has(upstreamId) && attrs.has(REF_READ) && !Object.hasOwn(desiredTemplate.Resources, upstreamId)) {
26192
27176
  matched = true;
26193
27177
  break;
26194
27178
  }
@@ -26198,7 +27182,8 @@ var DiffCalculator = class DiffCalculator {
26198
27182
  path: propKey,
26199
27183
  oldValue: change.currentProperties?.[propKey],
26200
27184
  newValue: change.desiredProperties?.[propKey],
26201
- requiresReplacement: this.replacementRules.requiresReplacement(change.resourceType, propKey, void 0, void 0)
27185
+ requiresReplacement: this.replacementRules.requiresReplacement(change.resourceType, propKey, void 0, void 0),
27186
+ inPlacePropagated: true
26202
27187
  });
26203
27188
  }
26204
27189
  if (syntheticChanges.length === 0) continue;
@@ -26212,47 +27197,11 @@ var DiffCalculator = class DiffCalculator {
26212
27197
  return added;
26213
27198
  }
26214
27199
  /**
26215
- * Whether any `Fn::GetAtt` / `Fn::Sub` read of a dependent (its
26216
- * {@link extractGetAttRefs} map, every property and every upstream) lands on
26217
- * a PERSISTED attribute carrying the redaction mask. The attribute is found
26218
- * the way the resolver finds it: the flat key, else the dot-separated path
26219
- * walked through nested objects (a Cloud Control record's
26220
- * `Endpoint.Address`).
26221
- *
26222
- * What it cannot see, and the engine still refuses on a speculative
26223
- * promotion: a masked cross-stack read (`Fn::ImportValue` /
26224
- * `Fn::GetStackOutput`), whose producer record is another stack's, and a
26225
- * `Ref` whose state-key lookup lands on a masked property, since `Ref`
26226
- * reads are not extracted.
26227
- */
26228
- static readsMaskedAttribute(perProp, currentResources) {
26229
- for (const getAttRefs of perProp.values()) for (const [upstreamId, attrs] of getAttRefs) {
26230
- const attributes = Object.hasOwn(currentResources, upstreamId) ? currentResources[upstreamId]?.attributes : void 0;
26231
- if (!attributes) continue;
26232
- for (const attr of attrs) if (carriesSecretMask(DiffCalculator.persistedAttribute(attributes, attr))) return true;
26233
- }
26234
- return false;
26235
- }
26236
- /**
26237
- * A persisted attribute by the resolver's lookup rule: the own flat key, else
26238
- * the dot-separated path through own keys of nested objects; `undefined`
26239
- * when neither exists.
26240
- */
26241
- static persistedAttribute(attributes, attr) {
26242
- if (Object.hasOwn(attributes, attr)) return attributes[attr];
26243
- if (!attr.includes(".")) return void 0;
26244
- let cursor = attributes;
26245
- for (const part of attr.split(".")) {
26246
- if (cursor === null || typeof cursor !== "object" || !Object.hasOwn(cursor, part)) return;
26247
- cursor = cursor[part];
26248
- }
26249
- return cursor;
26250
- }
26251
- /**
26252
27200
  * Extract `Fn::GetAtt` / `Fn::Sub`-`${X.Attr}` references from a property value
26253
27201
  * as a map of `referencedLogicalId -> set of referenced attribute names`.
26254
- * Plain `Ref` is intentionally NOT captured: it resolves to the physical id,
26255
- * which an in-place update never changes. Recurses into arrays / objects so
27202
+ * A plain `Ref` (and a dot-less `${X}`) is recorded under the
27203
+ * {@link REF_READ} name, which only the custom-resource and fresh-parameter
27204
+ * arms of the in-place pass read (go-to-k/cdkd#3717 / #3722). Recurses into arrays / objects so
26256
27205
  * intrinsics nested inside `Fn::Sub`'s variable map / `Fn::Join` etc. are seen.
26257
27206
  */
26258
27207
  static extractGetAttRefs(value) {
@@ -26300,7 +27249,10 @@ var DiffCalculator = class DiffCalculator {
26300
27249
  const placeholder = m[2];
26301
27250
  if (!placeholder) continue;
26302
27251
  const dot = placeholder.indexOf(".");
26303
- if (dot < 0) continue;
27252
+ if (dot < 0) {
27253
+ if (!mapKeys?.has(placeholder)) add(placeholder, REF_READ);
27254
+ continue;
27255
+ }
26304
27256
  const id = placeholder.slice(0, dot);
26305
27257
  const attr = placeholder.slice(dot + 1);
26306
27258
  if (!id || mapKeys?.has(id)) continue;
@@ -26308,7 +27260,10 @@ var DiffCalculator = class DiffCalculator {
26308
27260
  }
26309
27261
  return;
26310
27262
  }
26311
- if ("Ref" in obj && Object.keys(obj).length === 1) return;
27263
+ if ("Ref" in obj && Object.keys(obj).length === 1) {
27264
+ if (typeof obj["Ref"] === "string") add(obj["Ref"], REF_READ);
27265
+ return;
27266
+ }
26312
27267
  Object.values(obj).forEach(walk);
26313
27268
  };
26314
27269
  walk(value);
@@ -30705,6 +31660,18 @@ function stringifyParameterForLog(paramDef, value) {
30705
31660
  if (paramDef?.NoEcho === true) return "<redacted>";
30706
31661
  return stringifyValue(value);
30707
31662
  }
31663
+ /**
31664
+ * `displayIdent` over text THIS file already sanitized, keeping its rule that
31665
+ * an ALTERED value takes a boundary (go-to-k/cdkd#3617). `displayIdent` tests
31666
+ * alteration against its own input, which here is already trimmed and blanked
31667
+ * -- so `ProdStack ` or `ProdStack<NBSP>` would print bare, byte-identical to
31668
+ * a genuine `ProdStack` (the #3164 spoof). Compared against the ORIGINAL, an
31669
+ * altered value is quoted even when what is left is plain.
31670
+ */
31671
+ function boundAltered(original, shown, maxCodePoints) {
31672
+ const bounded = displayIdent(shown, maxCodePoints === void 0 ? void 0 : { maxCodePoints });
31673
+ return shown !== original && !bounded.startsWith("\"") && bounded !== "<unrenderable>" ? `${JSON.stringify(bounded.split(" [cut: ")[0])}${bounded.includes(" [cut: ") ? bounded.slice(bounded.indexOf(" [cut: ")) : ""}` : bounded;
31674
+ }
30708
31675
  var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30709
31676
  logger = getLogger().child("IntrinsicFunctionResolver");
30710
31677
  resolverRegion;
@@ -31096,7 +32063,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31096
32063
  if (!targetRegion) return ambient;
31097
32064
  const target = canonicalizeRegion(targetRegion);
31098
32065
  const loggedTarget = targetLogText ?? (targetRegion === this.explicitRegion ? this.explicitRegionLogText : void 0) ?? target;
31099
- if (!isClientSafeRegion(target)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to build AWS clients for the region '${displaySafe(stripControlChars(loggedTarget)).slice(0, 64)}': it is not a valid AWS region name, and a region is substituted into the AWS service hostname.`));
32066
+ if (!isClientSafeRegion(target)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to build AWS clients for the region ${boundAltered(targetRegion ?? loggedTarget, displaySafe(stripControlChars(loggedTarget)), 64)}: it is not a valid AWS region name, and a region is substituted into the AWS service hostname.`));
31100
32067
  if (typeof ambient.withRegion !== "function") return ambient;
31101
32068
  const cacheKey = clientCacheKey(target, ambient.credentialConfig ?? {});
31102
32069
  const cached = this.regionScopedClients.get(cacheKey);
@@ -31501,6 +32468,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31501
32468
  for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
31502
32469
  const own = inheritedParameterExpression(inherited, parameterName, plaintext);
31503
32470
  recorded.set(plaintext, typeof own === "string" ? own : expression);
32471
+ carryFreshNoEchoMark(inherited, recorded, plaintext);
31504
32472
  }
31505
32473
  }
31506
32474
  /**
@@ -31881,7 +32849,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31881
32849
  */
31882
32850
  noteAttributeSecrecy(logicalId, attributeName, value, context) {
31883
32851
  const declared = context.noEchoAttributeResources?.get(logicalId);
31884
- if ((declared === true || declared !== void 0 && declared.has(attributeName)) && context.recordedSecretValues) recordMaskOnlyValuesIn(value, context.recordedSecretValues);
32852
+ if ((declared === true || declared !== void 0 && declared.has(attributeName)) && context.recordedSecretValues) recordFreshNoEchoValuesIn(value, context.recordedSecretValues);
31885
32853
  if (context.redactedAttributeReads !== void 0 && carriesSecretMask(value)) {
31886
32854
  const maskedAttributeName = this.displayMasked(attributeName, context);
31887
32855
  this.pushRedactedAttributeRead(context, {
@@ -32027,7 +32995,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32027
32995
  * 1. PROBE — construct under a derived context whose fallback raises
32028
32996
  * {@link StaleAttributeMissSignal} instead of deciding. Every per-type arm
32029
32997
  * that CAN answer (the ~40 constructed ARNs, the live-read arms) returns
32030
- * here exactly as before.
32998
+ * here exactly as before — except the heal-first arms
32999
+ * ({@link healBeforeConstructing}, issue #3627), which raise the signal
33000
+ * too because their answer may be wrong for a record lacking the value.
32031
33001
  * 2. HEAL — only on the signal: ask the context's healer, which re-reads the
32032
33002
  * record's attributes through its provider once per deploy. A value for
32033
33003
  * this attribute is served from that read.
@@ -32108,6 +33078,21 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32108
33078
  return value;
32109
33079
  }
32110
33080
  /**
33081
+ * Route an arm that ANSWERS without the record through the #1852 heal first.
33082
+ *
33083
+ * The heal runs only when a construction raises
33084
+ * {@link StaleAttributeMissSignal}, which only `guardedPhysicalIdFallback`
33085
+ * did — so an arm that returned `undefined` (DynamoDB `StreamArn`, IAM
33086
+ * `RoleId`) or built a path-less IAM ARN never healed a record that lacks
33087
+ * the attribute, such as one `cdkd import` wrote before issue #3627's
33088
+ * read-backs. Under the probe phase this raises the signal; in the settled
33089
+ * phase (the read found nothing) or with no healer it returns, and the arm
33090
+ * answers as it always did.
33091
+ */
33092
+ healBeforeConstructing(context) {
33093
+ if (context.staleAttributeHeal?.phase === "probe") throw new StaleAttributeMissSignal();
33094
+ }
33095
+ /**
32111
33096
  * The per-resource-type attribute construction itself.
32112
33097
  *
32113
33098
  * Many CloudFormation attributes are not returned by Cloud Control API,
@@ -32123,7 +33108,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32123
33108
  const region = canonicalizeRegion(accountInfo.region);
32124
33109
  if (resourceType === "AWS::DynamoDB::Table" || resourceType === "AWS::DynamoDB::GlobalTable") switch (attributeName) {
32125
33110
  case "Arn": return `arn:${partition}:dynamodb:${region}:${accountId}:table/${physicalId}`;
32126
- case "StreamArn": return;
33111
+ case "StreamArn":
33112
+ this.healBeforeConstructing(context);
33113
+ return;
32127
33114
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32128
33115
  }
32129
33116
  if (resourceType === "AWS::S3::Bucket") switch (attributeName) {
@@ -32135,8 +33122,12 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32135
33122
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32136
33123
  }
32137
33124
  if (resourceType === "AWS::IAM::Role") switch (attributeName) {
32138
- case "Arn": return `arn:${partition}:iam::${accountId}:role/${physicalId}`;
32139
- case "RoleId": return;
33125
+ case "Arn":
33126
+ this.healBeforeConstructing(context);
33127
+ return `arn:${partition}:iam::${accountId}:role/${physicalId}`;
33128
+ case "RoleId":
33129
+ this.healBeforeConstructing(context);
33130
+ return;
32140
33131
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32141
33132
  }
32142
33133
  if (resourceType === "AWS::EC2::VPC") switch (attributeName) {
@@ -32212,15 +33203,21 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32212
33203
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32213
33204
  }
32214
33205
  if (resourceType === "AWS::IAM::User") switch (attributeName) {
32215
- case "Arn": return `arn:${partition}:iam::${accountId}:user/${physicalId}`;
33206
+ case "Arn":
33207
+ this.healBeforeConstructing(context);
33208
+ return `arn:${partition}:iam::${accountId}:user/${physicalId}`;
32216
33209
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32217
33210
  }
32218
33211
  if (resourceType === "AWS::IAM::Group") switch (attributeName) {
32219
- case "Arn": return `arn:${partition}:iam::${accountId}:group/${physicalId}`;
33212
+ case "Arn":
33213
+ this.healBeforeConstructing(context);
33214
+ return `arn:${partition}:iam::${accountId}:group/${physicalId}`;
32220
33215
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32221
33216
  }
32222
33217
  if (resourceType === "AWS::IAM::InstanceProfile") switch (attributeName) {
32223
- case "Arn": return `arn:${partition}:iam::${accountId}:instance-profile/${physicalId}`;
33218
+ case "Arn":
33219
+ this.healBeforeConstructing(context);
33220
+ return `arn:${partition}:iam::${accountId}:instance-profile/${physicalId}`;
32224
33221
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
32225
33222
  }
32226
33223
  if (resourceType === "AWS::KMS::Key") switch (attributeName) {
@@ -33339,7 +34336,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33339
34336
  if (carriesSecretMask(value)) {
33340
34337
  const recovered = producerOutput === void 0 || producerOutput.crossAccount === true ? void 0 : recoverMaskedOutput(producerOutput.stackName, producerOutput.region, producerOutput.outputKey);
33341
34338
  if (recovered !== void 0) {
33342
- if (context.recordedSecretValues) recordMaskOnlyValuesIn(recovered, context.recordedSecretValues);
34339
+ if (context.recordedSecretValues) recordFreshNoEchoValuesIn(recovered, context.recordedSecretValues);
33343
34340
  return recovered;
33344
34341
  }
33345
34342
  if (context.redactedAttributeReads !== void 0) {
@@ -33645,7 +34642,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33645
34642
  } catch (error) {
33646
34643
  const message = error instanceof Error ? error.message : String(error);
33647
34644
  const cfnNameMask = this.positionalNameMask([[stackName, this.displayMasked(stackName, context)], [region, this.displayMasked(loggedRegionText, context)]]);
33648
- this.logger.warn(`Fn::GetStackOutput: CloudFormation DescribeStacks fallback failed for stack '${this.displayMasked(stackName, context)}' (${this.displayMasked(loggedRegionText, context)}): ${displayAwsMessage(this.displayMasked(cfnNameMask ? cfnNameMask(message) : message, context))}. Grant cloudformation:DescribeStacks to resolve outputs from CloudFormation-managed stacks, or pass --no-cfn-fallback to disable the fallback.`);
34645
+ this.logger.warn(`Fn::GetStackOutput: CloudFormation DescribeStacks fallback failed for stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} (${this.displayMaskedIdent(loggedRegionText, context)}): ${displayAwsMessage(this.displayMasked(cfnNameMask ? cfnNameMask(message) : message, context))}. Grant cloudformation:DescribeStacks to resolve outputs from CloudFormation-managed stacks, or pass --no-cfn-fallback to disable the fallback.`);
33649
34646
  return;
33650
34647
  }
33651
34648
  }
@@ -33775,7 +34772,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33775
34772
  const resolvedRegion = await this.resolveValue(args["Region"], context);
33776
34773
  if (typeof resolvedRegion !== "string" || resolvedRegion === "") throw new Error(`Fn::GetStackOutput: Region must resolve to a non-empty string, got ${typeof resolvedRegion}`);
33777
34774
  const requestedRegion = canonicalizeRegion(resolvedRegion);
33778
- if (!isClientSafeRegion(requestedRegion)) throw new Error(`Fn::GetStackOutput: '${this.displayMasked(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context).slice(0, 64)}' is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`);
34775
+ if (!isClientSafeRegion(requestedRegion)) throw new Error(`Fn::GetStackOutput: ${this.displayMaskedIdent(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context, 64)} is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`);
33779
34776
  region = requestedRegion;
33780
34777
  loggedRegionText = this.regionLogText(resolvedRegion, context);
33781
34778
  }
@@ -33785,9 +34782,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33785
34782
  if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`);
33786
34783
  roleArn = raw;
33787
34784
  }
33788
- if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack '${this.displayMasked(stackName, context)}' in the same region '${this.displayMasked(loggedRegionText, context)}'`);
33789
- const loggedStackName = this.displayMasked(stackName, context);
33790
- const loggedOutputName = this.displayMasked(outputName, context);
34785
+ if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} in the same region ${this.displayMaskedIdent(loggedRegionText, context)}`);
34786
+ const loggedStackName = this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS);
34787
+ const loggedOutputName = this.displayMaskedIdent(outputName, context);
33791
34788
  const loggedRegion = this.displayMasked(loggedRegionText, context);
33792
34789
  const shownRoleArn = roleArn ? displayIdent(roleArn, { maxCodePoints: 613 }) : "";
33793
34790
  this.logger.debug(`Resolving Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName}${roleArn ? `, RoleArn=${shownRoleArn}` : ""}`);
@@ -33795,7 +34792,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33795
34792
  try {
33796
34793
  stateData = roleArn ? await this.getCrossAccountStackState(roleArn, stackName, region, context) : await this.getSameAccountStackState(stackName, region, context);
33797
34794
  } catch (error) {
33798
- this.maskStateReadError(error, [[stackName, loggedStackName], [region, loggedRegion]], context);
34795
+ this.maskStateReadError(error, [[stackName, this.displayMasked(stackName, context)], [region, loggedRegion]], context);
33799
34796
  }
33800
34797
  if (!stateData) {
33801
34798
  if (!roleArn && this.cfnFallback) {
@@ -33803,25 +34800,25 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33803
34800
  if (cfnOutputs) {
33804
34801
  if (!Object.hasOwn(cfnOutputs, outputName)) {
33805
34802
  const available = this.describeAvailableOutputs(Object.keys(cfnOutputs), context);
33806
- throw new Error(`Fn::GetStackOutput: output '${loggedOutputName}' not found in CloudFormation stack '${loggedStackName}' (${loggedRegion}). Available outputs: ${available}`);
34803
+ throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in CloudFormation stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
33807
34804
  }
33808
34805
  const value = cfnOutputs[outputName];
33809
34806
  this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName} (from CloudFormation stack outputs; weak reference — producer is not cdkd-managed)`);
33810
34807
  return value;
33811
34808
  }
33812
34809
  }
33813
- throw new Error(`Fn::GetStackOutput: stack '${loggedStackName}' not found in region '${loggedRegion}'${roleArn ? ` (cross-account via ${shownRoleArn})` : ""}. ${!roleArn && this.cfnFallback ? "Searched cdkd state and CloudFormation stacks. Make sure the producer stack has been deployed (via cdkd or CloudFormation)." : `Make sure the producer stack has been deployed via cdkd.`}`);
34810
+ throw new Error(`Fn::GetStackOutput: stack ${loggedStackName} not found in region ${displayIdent(loggedRegion)}${roleArn ? ` (cross-account via ${shownRoleArn})` : ""}. ${!roleArn && this.cfnFallback ? "Searched cdkd state and CloudFormation stacks. Make sure the producer stack has been deployed (via cdkd or CloudFormation)." : `Make sure the producer stack has been deployed via cdkd.`}`);
33814
34811
  }
33815
- if (!hasReadableOutputs(stateData.state)) throw markNonRetryable(new MalformedProducerRecordRefusalError(`Fn::GetStackOutput: the state record of producer stack '${loggedStackName}' (${loggedRegion}) has no readable 'outputs' map — the record is malformed or truncated. cdkd refuses to resolve from it rather than reading it as a map: 'Object.hasOwn' answers TRUE for '0' on a string and for an index on a list, so continuing would resolve ONE CHARACTER or element of the record as this reference's value and this deploy would send it to AWS. Inspect the producer's record with 'cdkd state show' --json, repair or remove it, then re-run.`));
34812
+ if (!hasReadableOutputs(stateData.state)) throw markNonRetryable(new MalformedProducerRecordRefusalError(`Fn::GetStackOutput: the state record of producer stack ${loggedStackName} (${displayIdent(loggedRegion)}) has no readable 'outputs' map — the record is malformed or truncated. cdkd refuses to resolve from it rather than reading it as a map: 'Object.hasOwn' answers TRUE for '0' on a string and for an index on a list, so continuing would resolve ONE CHARACTER or element of the record as this reference's value and this deploy would send it to AWS. Inspect the producer's record with 'cdkd state show' --json, repair or remove it, then re-run.`));
33816
34813
  const outputs = stateData.state.outputs ?? {};
33817
34814
  if (!Object.hasOwn(outputs, outputName)) {
33818
34815
  const available = this.describeAvailableOutputs(Object.keys(outputs), context);
33819
- throw new Error(`Fn::GetStackOutput: output '${loggedOutputName}' not found in stack '${loggedStackName}' (${loggedRegion}). Available outputs: ${available}`);
34816
+ throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
33820
34817
  }
33821
34818
  const value = outputs[outputName];
33822
34819
  this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName}${roleArn ? `, RoleArn=${shownRoleArn}` : ""} (${carriesDynamicReference(value) ? "redacted dynamic reference" : "literal value"})`);
33823
34820
  if (!roleArn) this.recordOutputRead(context, stackName, region, outputName);
33824
- if (roleArn && !context.skipDynamicReferences && carriesDynamicReference(value)) throw markNonRetryable(new CrossAccountSecretRefusalError(`Fn::GetStackOutput: output '${loggedOutputName}' of stack '${loggedStackName}' (${loggedRegion}) is a redacted dynamic reference, and this is a CROSS-ACCOUNT reference (RoleArn ${shownRoleArn}). cdkd will not resolve a producer account's secret with the consumer's credentials — a same-named secret in the consumer account would answer instead. Export a non-secret value (e.g. the secret's ARN) and resolve it in the consumer stack, or reference the producer stack from within its own account.`));
34821
+ if (roleArn && !context.skipDynamicReferences && carriesDynamicReference(value)) throw markNonRetryable(new CrossAccountSecretRefusalError(`Fn::GetStackOutput: output ${loggedOutputName} of stack ${loggedStackName} (${displayIdent(loggedRegion)}) is a redacted dynamic reference, and this is a CROSS-ACCOUNT reference (RoleArn ${shownRoleArn}). cdkd will not resolve a producer account's secret with the consumer's credentials — a same-named secret in the consumer account would answer instead. Export a non-secret value (e.g. the secret's ARN) and resolve it in the consumer stack, or reference the producer stack from within its own account.`));
33825
34822
  return await this.reresolveCrossStackValue(value, region, context, `Fn::GetStackOutput '${this.displayLeaf(outputName, context)}' (producer ${this.displayLeaf(stackName, context)} / ${this.displayLeaf(loggedRegionText, context)})`, sourceKey, {
33826
34823
  stackName,
33827
34824
  region,
@@ -33858,6 +34855,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33858
34855
  *
33859
34856
  * A pair that DOES carry a mask contributes its raw spelling AND the spelling
33860
34857
  * the reader will actually see. `S3StateBackend` prints names through
34858
+ * `displayStackName`, whose first step is
33861
34859
  * `displaySafe(..., { asciiOnly: true })`, which REPLACES every non-printable
33862
34860
  * character with a space and then trims, so a secret carrying one is a
33863
34861
  * DIFFERENT string by the time it is quoted back and matching the raw form
@@ -33899,9 +34897,16 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33899
34897
  positionalNameMask(pairs) {
33900
34898
  const substitutions = pairs.filter(([raw, masked]) => raw !== "" && raw !== masked).flatMap(([raw, masked]) => {
33901
34899
  const shown = displaySafe(raw, { asciiOnly: true });
33902
- if (shown === raw) return [[raw, masked]];
34900
+ const escaped = (text) => JSON.stringify(text).slice(1, -1);
34901
+ const rendered = displayStackName(raw);
34902
+ const escapedPair = [...shown !== "" && escaped(shown) !== shown ? [[escaped(shown), escaped(displaySafe(masked, { asciiOnly: true }))]] : [], ...rendered !== raw && rendered !== shown && rendered !== escaped(shown) ? [[rendered, displayStackName(displaySafe(masked, { asciiOnly: true }))]] : []];
34903
+ if (shown === raw) return [[raw, masked], ...escapedPair];
33903
34904
  const shownMask = displaySafe(masked, { asciiOnly: true });
33904
- return shown === "" || shownMask === "" ? [[raw, masked]] : [[raw, masked], [shown, shownMask]];
34905
+ return shown === "" || shownMask === "" ? [[raw, masked]] : [
34906
+ [raw, masked],
34907
+ [shown, shownMask],
34908
+ ...escapedPair
34909
+ ];
33905
34910
  }).sort(([a], [b]) => b.length - a.length);
33906
34911
  if (substitutions.length === 0) return void 0;
33907
34912
  return (text) => {
@@ -34115,7 +35120,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
34115
35120
  if (typeof resolvedValue !== "string") throw new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`);
34116
35121
  const result = Buffer.from(resolvedValue).toString("base64");
34117
35122
  const inputLogText = this.logTextOfLeaf(resolvedValue, context);
34118
- if (context.recordedSecretValues && (inputLogText !== resolvedValue || this.maskNeedlesForLog(resolvedValue, context) !== resolvedValue)) recordMaskOnlyValue(context.recordedSecretValues, result);
35123
+ if (context.recordedSecretValues && (inputLogText !== resolvedValue || this.maskNeedlesForLog(resolvedValue, context) !== resolvedValue)) {
35124
+ recordMaskOnlyValue(context.recordedSecretValues, result);
35125
+ if (embedsFreshNoEchoValue(resolvedValue, context.recordedSecretValues)) recordFreshNoEchoValuesIn(result, context.recordedSecretValues);
35126
+ }
34119
35127
  this.logger.debug(`Resolved Fn::Base64: ${this.displayMasked(inputLogText, context)} -> ${this.displayMasked(inputLogText !== resolvedValue ? "***" : result, context)}`);
34120
35128
  return result;
34121
35129
  }
@@ -34781,6 +35789,16 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
34781
35789
  return displaySafe(this.maskThenStripThenMask(value, context));
34782
35790
  }
34783
35791
  /**
35792
+ * {@link displayMasked}, then bounded as an IDENTIFIER (go-to-k/cdkd#3617):
35793
+ * bare when plain, otherwise one JSON string, so a template- or state-chosen
35794
+ * name cannot close a quote of cdkd's own and write a clause into the
35795
+ * message. Masked FIRST: `displayIdent` blanks non-ASCII and cuts, either of
35796
+ * which would stop a recorded plaintext inside the name from matching.
35797
+ */
35798
+ displayMaskedIdent(value, context, maxCodePoints) {
35799
+ return boundAltered(value, this.displayMasked(displaySafe(this.displayMasked(value, context), { asciiOnly: true }), context), maxCodePoints);
35800
+ }
35801
+ /**
34784
35802
  * The display form of a LOG-TWIN leaf — the second render route, named for
34785
35803
  * the same reason as {@link displayMasked} and closed by the same scanner.
34786
35804
  *
@@ -36068,24 +37086,22 @@ function maskDeep(value, mask, depth = 0) {
36068
37086
  * ## Why it has to be guarded
36069
37087
  *
36070
37088
  * The separator is NOT escaped, so a segment that itself contains a `|`
36071
- * produces an id with the wrong arity. Every decode site splits the stored id
36072
- * back apart and the extra segment shifts everything — for a Glue table named
36073
- * `a|b` in database `mydb` the recorded id `mydb|a|b` decodes to database
36074
- * `mydb`, table `a`. Both halves are non-empty, so every existing
36075
- * "is this id well-formed?" guard passes and the deploy SUCCEEDS. What breaks
36076
- * is everything afterwards: `cdkd destroy` deletes the WRONG resource if one
36077
- * exists under the decoded pair (or warn-and-skips, reporting success while
36078
- * the real resource stays alive and billing), and `cdkd drift` reads back
36079
- * `undefined` forever.
36080
- *
36081
- * AWS itself accepts such a name — verified live us-east-1 2026-08-12,
36082
- * `glue:CreateTable` with `TableInput.Name: 'a|b'` succeeds — and
36083
- * CloudFormation manages the resource fine. The limitation is cdkd's own, so
36084
- * the honest answer is to REFUSE at deploy time with a message that says so,
36085
- * rather than to record an id that silently names something else. Escaping the
36086
- * separator, or dropping the packing where the decode sites already receive
36087
- * the properties bag, are the two real fixes and both remain open on #1672;
36088
- * this guard is what closes the data-loss path in the meantime.
37089
+ * produces an id with the wrong arity. A decode site that splits the stored id
37090
+ * back apart shifts every later segment — for `<a>|<b|c>` a bare split yields
37091
+ * `(a, b)`. Both halves are non-empty, so every "is this id well-formed?" guard
37092
+ * passes and the deploy SUCCEEDS. What breaks is everything afterwards:
37093
+ * `cdkd destroy` deletes the WRONG resource if one exists under the decoded
37094
+ * pair (or warn-and-skips, reporting success while the real resource stays
37095
+ * alive and billing), and `cdkd drift` reads back `undefined` forever.
37096
+ *
37097
+ * AWS itself can accept such a segment — `glue:CreateTable` with
37098
+ * `TableInput.Name: 'a|b'` succeeds — and CloudFormation manages the resource
37099
+ * fine. The limitation is cdkd's own, so the honest answer is to REFUSE at
37100
+ * deploy time with a message that says so, rather than to record an id that
37101
+ * silently names something else. `AWS::Glue::Table`'s decode sites now anchor
37102
+ * on the recorded `DatabaseName` instead of splitting, but its `Ref`
37103
+ * extraction still takes the last segment, so the refusal stays for it too.
37104
+ * Escaping the separator is the general fix and remains open on #1672.
36089
37105
  *
36090
37106
  * ## Two entry points, mirroring `config-shape.ts`
36091
37107
  *
@@ -36431,318 +37447,6 @@ function ccProtectionRegistryTypes() {
36431
37447
  return Object.keys(CC_PROTECTION_PROPERTIES);
36432
37448
  }
36433
37449
 
36434
- //#endregion
36435
- //#region src/provisioning/unsupported-types.generated.ts
36436
- /**
36437
- * AUTO-GENERATED by scripts/gen-unsupported-types.ts — DO NOT EDIT BY HAND.
36438
- * Source: docs/_generated/provider-coverage.json (tier3), minus
36439
- * registry-routed special cases (see REGISTRY_ROUTED_EXCLUSIONS in the
36440
- * generator).
36441
- * Regenerate: `vp run gen:unsupported-types`.
36442
- *
36443
- * AWS CloudFormation resource types AWS reports as
36444
- * `ProvisioningType: NON_PROVISIONABLE` (Cloud Control API cannot
36445
- * create/update/delete them) and for which cdkd has no SDK provider. cdkd
36446
- * pre-flight rejects these fast with an actionable message instead of letting
36447
- * the optimistic Cloud Control fallthrough fail mid-deploy.
36448
- */
36449
- const NON_PROVISIONABLE_TYPES = /* @__PURE__ */ new Set([
36450
- "Alexa::ASK::Skill",
36451
- "AWS::AmazonMQ::ConfigurationAssociation",
36452
- "AWS::Amplify::Jobs",
36453
- "AWS::AmplifyUIBuilder::CodegenJob",
36454
- "AWS::AppMesh::GatewayRoute",
36455
- "AWS::AppMesh::Mesh",
36456
- "AWS::AppMesh::Route",
36457
- "AWS::AppMesh::VirtualGateway",
36458
- "AWS::AppMesh::VirtualNode",
36459
- "AWS::AppMesh::VirtualRouter",
36460
- "AWS::AppMesh::VirtualService",
36461
- "AWS::AppStream::Fleet",
36462
- "AWS::AppStream::StackFleetAssociation",
36463
- "AWS::AppSync::ApiCache",
36464
- "AWS::Artifact::Report",
36465
- "AWS::Athena::Session",
36466
- "AWS::AutoScalingPlans::ScalingPlan",
36467
- "AWS::BackupSearch::SearchJob",
36468
- "AWS::BackupSearch::SearchResultExportJob",
36469
- "AWS::BCMDataExports::Table",
36470
- "AWS::Bedrock::AsyncInvoke",
36471
- "AWS::Bedrock::DefaultPromptRouter",
36472
- "AWS::Bedrock::FlowExecution",
36473
- "AWS::Bedrock::FoundationModel",
36474
- "AWS::Bedrock::ImportedModel",
36475
- "AWS::Bedrock::ModelImportJob",
36476
- "AWS::Bedrock::ModelInvocationJob",
36477
- "AWS::BedrockAgentCore::ConfigurationBundleVersion",
36478
- "AWS::BedrockAgentCore::HarnessVersion",
36479
- "AWS::BedrockAgentCore::PolicyGeneration",
36480
- "AWS::BedrockAgentCore::TokenVault",
36481
- "AWS::Braket::Job",
36482
- "AWS::Cassandra::Stream",
36483
- "AWS::Cloud9::EnvironmentEC2",
36484
- "AWS::CloudFormation::Macro",
36485
- "AWS::CloudFormation::ResourceScan",
36486
- "AWS::CloudFormation::WaitCondition",
36487
- "AWS::CloudFront::StreamingDistribution",
36488
- "AWS::CodeArtifact::Package",
36489
- "AWS::CodeBuild::Build",
36490
- "AWS::CodeBuild::BuildBatch",
36491
- "AWS::CodeBuild::Sandbox",
36492
- "AWS::CodeStar::GitHubRepository",
36493
- "AWS::CognitoSync::Dataset",
36494
- "AWS::Comprehend::DocumentClassificationJob",
36495
- "AWS::Comprehend::DominantLanguageDetectionJob",
36496
- "AWS::Comprehend::EntitiesDetectionJob",
36497
- "AWS::Comprehend::FlywheelDataset",
36498
- "AWS::Comprehend::SentimentDetectionJob",
36499
- "AWS::Comprehend::TargetedSentimentDetectionJob",
36500
- "AWS::Config::ConfigurationRecorder",
36501
- "AWS::Config::DeliveryChannel",
36502
- "AWS::Config::OrganizationConfigRule",
36503
- "AWS::ControlCatalog::CommonControl",
36504
- "AWS::ControlCatalog::Control",
36505
- "AWS::ControlCatalog::Objective",
36506
- "AWS::DataExchange::Assets",
36507
- "AWS::DataExchange::EntitledDataSets",
36508
- "AWS::DataExchange::Job",
36509
- "AWS::DataSync::TaskExecution",
36510
- "AWS::DAX::Cluster",
36511
- "AWS::DAX::SubnetGroup",
36512
- "AWS::Deadline::Job",
36513
- "AWS::DirectoryService::MicrosoftAD",
36514
- "AWS::DMS::ReplicationInstance",
36515
- "AWS::DRS::RecoveryInstance",
36516
- "AWS::DynamoDB::Export",
36517
- "AWS::DynamoDB::Stream",
36518
- "AWS::EC2::ClientVpnAuthorizationRule",
36519
- "AWS::EC2::ClientVpnEndpoint",
36520
- "AWS::EC2::ClientVpnRoute",
36521
- "AWS::EC2::ClientVpnTargetNetworkAssociation",
36522
- "AWS::EC2::ExportInstanceTask",
36523
- "AWS::EC2::NetworkInterfacePermission",
36524
- "AWS::EC2::ReplaceRootVolumeTask",
36525
- "AWS::EC2::VpnConnectionDeviceType",
36526
- "AWS::EC2::VPNGatewayRoutePropagation",
36527
- "AWS::ECRPublic::Registry",
36528
- "AWS::ECS::ContainerInstance",
36529
- "AWS::ECS::Task",
36530
- "AWS::ElastiCache::ReservedCacheNode",
36531
- "AWS::ElastiCache::SecurityGroup",
36532
- "AWS::ElastiCache::SecurityGroupIngress",
36533
- "AWS::ElasticLoadBalancingV2::ListenerCertificate",
36534
- "AWS::Elasticsearch::Domain",
36535
- "AWS::EMR::NotebookExecution",
36536
- "AWS::EMRContainers::JobRun",
36537
- "AWS::EMRServerless::JobRun",
36538
- "AWS::Events::Replay",
36539
- "AWS::FIS::Experiment",
36540
- "AWS::FIS::SafetyLever",
36541
- "AWS::FSx::Snapshot",
36542
- "AWS::FSx::StorageVirtualMachine",
36543
- "AWS::Glue::DevEndpoint",
36544
- "AWS::Glue::Partition",
36545
- "AWS::Glue::TableVersion",
36546
- "AWS::Greengrass::ConnectorDefinition",
36547
- "AWS::Greengrass::ConnectorDefinitionVersion",
36548
- "AWS::Greengrass::CoreDefinition",
36549
- "AWS::Greengrass::CoreDefinitionVersion",
36550
- "AWS::Greengrass::DeviceDefinition",
36551
- "AWS::Greengrass::DeviceDefinitionVersion",
36552
- "AWS::Greengrass::FunctionDefinition",
36553
- "AWS::Greengrass::FunctionDefinitionVersion",
36554
- "AWS::Greengrass::Group",
36555
- "AWS::Greengrass::GroupVersion",
36556
- "AWS::Greengrass::LoggerDefinition",
36557
- "AWS::Greengrass::LoggerDefinitionVersion",
36558
- "AWS::Greengrass::ResourceDefinition",
36559
- "AWS::Greengrass::ResourceDefinitionVersion",
36560
- "AWS::Greengrass::SubscriptionDefinition",
36561
- "AWS::Greengrass::SubscriptionDefinitionVersion",
36562
- "AWS::GreengrassV2::Component",
36563
- "AWS::GreengrassV2::CoreDevice",
36564
- "AWS::IdentityStore::AllGroupMemberships",
36565
- "AWS::ImageBuilder::AllImageBuildVersions",
36566
- "AWS::ImageBuilder::AllWorkflowBuildVersions",
36567
- "AWS::ImageBuilder::LifecycleExecution",
36568
- "AWS::ImageBuilder::WorkflowExecution",
36569
- "AWS::ImageBuilder::WorkflowStepExecution",
36570
- "AWS::InternetMonitor::InternetEvent",
36571
- "AWS::IoT::Index",
36572
- "AWS::IoT::PolicyPrincipalAttachment",
36573
- "AWS::IoT::ThingPrincipalAttachment",
36574
- "AWS::IoTDeviceAdvisor::SuiteRun",
36575
- "AWS::IoTThingsGraph::FlowTemplate",
36576
- "AWS::IoTTwinMaker::MetadataTransferJob",
36577
- "AWS::IVS::Composition",
36578
- "AWS::KafkaConnect::ConnectorOperation",
36579
- "AWS::KinesisAnalytics::Application",
36580
- "AWS::KinesisAnalytics::ApplicationOutput",
36581
- "AWS::KinesisAnalytics::ApplicationReferenceDataSource",
36582
- "AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption",
36583
- "AWS::KinesisAnalyticsV2::ApplicationOutput",
36584
- "AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource",
36585
- "AWS::LakeFormation::DataLakeSettings",
36586
- "AWS::LakeFormation::Permissions",
36587
- "AWS::LakeFormation::Resource",
36588
- "AWS::Lambda::DurableExecution",
36589
- "AWS::Lightsail::ExportSnapshotRecord",
36590
- "AWS::Location::Job",
36591
- "AWS::Macie2::ClassificationJob",
36592
- "AWS::ManagedBlockchain::Member",
36593
- "AWS::ManagedBlockchain::Node",
36594
- "AWS::MediaConnect::Offering",
36595
- "AWS::MediaConnect::Reservation",
36596
- "AWS::MediaConvert::JobTemplate",
36597
- "AWS::MediaConvert::Queue",
36598
- "AWS::MediaLive::Channel",
36599
- "AWS::MediaLive::Input",
36600
- "AWS::MediaLive::InputSecurityGroup",
36601
- "AWS::MediaLive::Offering",
36602
- "AWS::MediaPackage::HarvestJob",
36603
- "AWS::MediaPackageV2::HarvestJob",
36604
- "AWS::MediaStore::Container",
36605
- "AWS::MedicalImaging::ImageSet",
36606
- "AWS::MemoryDB::MultiRegionParameterGroup",
36607
- "AWS::MemoryDB::ReservedNode",
36608
- "AWS::NeptuneGraph::ExportTask",
36609
- "AWS::NovaAct::WorkflowRun",
36610
- "AWS::Omics::ReadSet",
36611
- "AWS::Omics::Reference",
36612
- "AWS::Omics::Run",
36613
- "AWS::Omics::Task",
36614
- "AWS::OpsWorks::App",
36615
- "AWS::OpsWorks::ElasticLoadBalancerAttachment",
36616
- "AWS::OpsWorks::Instance",
36617
- "AWS::OpsWorks::Layer",
36618
- "AWS::OpsWorks::Stack",
36619
- "AWS::OpsWorks::UserProfile",
36620
- "AWS::OpsWorks::Volume",
36621
- "AWS::Organizations::Root",
36622
- "AWS::OSIS::PipelineBlueprint",
36623
- "AWS::PartnerCentral::ConnectionPreferences",
36624
- "AWS::PartnerCentral::Partner",
36625
- "AWS::Personalize::BatchInferenceJob",
36626
- "AWS::Personalize::BatchSegmentJob",
36627
- "AWS::Personalize::DataDeletionJob",
36628
- "AWS::Personalize::DatasetExportJob",
36629
- "AWS::Personalize::Recipe",
36630
- "AWS::Pinpoint::ADMChannel",
36631
- "AWS::Pinpoint::APNSChannel",
36632
- "AWS::Pinpoint::APNSSandboxChannel",
36633
- "AWS::Pinpoint::APNSVoipChannel",
36634
- "AWS::Pinpoint::APNSVoipSandboxChannel",
36635
- "AWS::Pinpoint::App",
36636
- "AWS::Pinpoint::ApplicationSettings",
36637
- "AWS::Pinpoint::BaiduChannel",
36638
- "AWS::Pinpoint::Campaign",
36639
- "AWS::Pinpoint::EmailChannel",
36640
- "AWS::Pinpoint::EmailTemplate",
36641
- "AWS::Pinpoint::EventStream",
36642
- "AWS::Pinpoint::GCMChannel",
36643
- "AWS::Pinpoint::PushTemplate",
36644
- "AWS::Pinpoint::Segment",
36645
- "AWS::Pinpoint::SMSChannel",
36646
- "AWS::Pinpoint::SmsTemplate",
36647
- "AWS::Pinpoint::VoiceChannel",
36648
- "AWS::PinpointEmail::ConfigurationSet",
36649
- "AWS::PinpointEmail::ConfigurationSetEventDestination",
36650
- "AWS::PinpointEmail::DedicatedIpPool",
36651
- "AWS::PinpointEmail::Identity",
36652
- "AWS::QLDB::Ledger",
36653
- "AWS::QuickSight::AssetBundleExportJob",
36654
- "AWS::QuickSight::AssetBundleImportJob",
36655
- "AWS::RDS::DBSecurityGroup",
36656
- "AWS::RDS::DBSecurityGroupIngress",
36657
- "AWS::RDS::ReservedDBInstance",
36658
- "AWS::Redshift::ClusterSecurityGroup",
36659
- "AWS::Redshift::ClusterSecurityGroupIngress",
36660
- "AWS::Redshift::DataShare",
36661
- "AWS::RedshiftServerless::RecoveryPoint",
36662
- "AWS::ResilienceHub::RecommendationTemplate",
36663
- "AWS::Route53::RecordSetGroup",
36664
- "AWS::Route53Resolver::FirewallConfig",
36665
- "AWS::SageMaker::AutoMLJob",
36666
- "AWS::SageMaker::CodeRepository",
36667
- "AWS::SageMaker::ExperimentTrialComponent",
36668
- "AWS::SageMaker::HubContentVersion",
36669
- "AWS::SageMaker::HyperParameterTuningJob",
36670
- "AWS::SageMaker::ModelCardExportJob",
36671
- "AWS::SageMaker::MonitoringScheduleAlert",
36672
- "AWS::SageMaker::NotebookInstance",
36673
- "AWS::SageMaker::NotebookInstanceLifecycleConfig",
36674
- "AWS::SageMaker::OptimizationJob",
36675
- "AWS::SageMaker::PipelineExecution",
36676
- "AWS::SageMaker::TrainingJob",
36677
- "AWS::SageMaker::TransformJob",
36678
- "AWS::SageMaker::Workteam",
36679
- "AWS::SavingsPlans::SavingsPlan",
36680
- "AWS::SecurityAgent::PentestTask",
36681
- "AWS::ServiceDiscovery::Instance",
36682
- "AWS::ServiceQuotas::Quota",
36683
- "AWS::Signer::SigningJob",
36684
- "AWS::SSM::AutomationExecution",
36685
- "AWS::SSM::ManagedInstance",
36686
- "AWS::SSM::Session",
36687
- "AWS::SSO::ApplicationProvider",
36688
- "AWS::States::Execution",
36689
- "AWS::StepFunctions::MapRun",
36690
- "AWS::ThinClient::SoftwareSet",
36691
- "AWS::Transcribe::CallAnalyticsJob",
36692
- "AWS::Transcribe::MedicalScribeJob",
36693
- "AWS::Transcribe::MedicalTranscriptionJob",
36694
- "AWS::Transcribe::TranscriptionJob",
36695
- "AWS::UserNotifications::ManagedNotificationConfiguration",
36696
- "AWS::UserNotifications::NotificationEvent",
36697
- "AWS::WAF::ByteMatchSet",
36698
- "AWS::WAF::IPSet",
36699
- "AWS::WAF::Rule",
36700
- "AWS::WAF::SizeConstraintSet",
36701
- "AWS::WAF::SqlInjectionMatchSet",
36702
- "AWS::WAF::WebACL",
36703
- "AWS::WAF::XssMatchSet",
36704
- "AWS::WAFRegional::ByteMatchSet",
36705
- "AWS::WAFRegional::GeoMatchSet",
36706
- "AWS::WAFRegional::IPSet",
36707
- "AWS::WAFRegional::RateBasedRule",
36708
- "AWS::WAFRegional::RegexPatternSet",
36709
- "AWS::WAFRegional::Rule",
36710
- "AWS::WAFRegional::SizeConstraintSet",
36711
- "AWS::WAFRegional::SqlInjectionMatchSet",
36712
- "AWS::WAFRegional::WebACL",
36713
- "AWS::WAFRegional::WebACLAssociation",
36714
- "AWS::WAFRegional::XssMatchSet",
36715
- "AWS::Wisdom::Session",
36716
- "AWS::WorkSpaces::WorkSpaceApplication"
36717
- ]);
36718
-
36719
- //#endregion
36720
- //#region src/provisioning/unsupported-types.ts
36721
- /**
36722
- * Helpers for cdkd's genuinely-unsupported resource types.
36723
- *
36724
- * The data ({@link NON_PROVISIONABLE_TYPES}) is generated from the
36725
- * provider-coverage audit (`vp run gen:unsupported-types`); this module adds
36726
- * the runtime predicates + the actionable issue link used by the pre-flight
36727
- * check (see {@link ../provisioning/provider-registry.ProviderRegistry.validateResourceTypes}).
36728
- */
36729
- /**
36730
- * True if AWS reports the type as `ProvisioningType: NON_PROVISIONABLE`
36731
- * (Cloud Control API cannot create/update/delete it) and cdkd has no SDK
36732
- * provider for it.
36733
- */
36734
- function isNonProvisionable(resourceType) {
36735
- return NON_PROVISIONABLE_TYPES.has(resourceType);
36736
- }
36737
- /**
36738
- * A 1-click pre-filled GitHub issue link requesting cdkd support for a
36739
- * resource type. Surfaced in the pre-flight error so a user hitting an
36740
- * unsupported type lands directly in the "request support" flow.
36741
- */
36742
- function unsupportedTypeIssueUrl(resourceType) {
36743
- return `https://github.com/go-to-k/cdkd/issues/new?title=${encodeURIComponent(`Support resource type ${resourceType}`)}&labels=resource-support`;
36744
- }
36745
-
36746
37450
  //#endregion
36747
37451
  //#region src/provisioning/slow-cc-operation-timeouts.ts
36748
37452
  const MINUTE_MS = 6e4;
@@ -37486,7 +38190,7 @@ var CloudControlProvider = class {
37486
38190
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
37487
38191
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
37488
38192
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
37489
- const { ASGProvider } = await import("./asg-provider-B32vpt_E.js").then((n) => n.n);
38193
+ const { ASGProvider } = await import("./asg-provider-Dbqbr89e.js").then((n) => n.n);
37490
38194
  const asgProvider = new ASGProvider();
37491
38195
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
37492
38196
  }
@@ -38032,7 +38736,11 @@ var CloudControlProvider = class {
38032
38736
  const enriched = { ...attributes };
38033
38737
  switch (resourceType) {
38034
38738
  case "AWS::S3::Bucket":
38035
- if (!enriched["Arn"]) enriched["Arn"] = `arn:aws:s3:::${physicalId}`;
38739
+ if (!enriched["Arn"]) try {
38740
+ enriched["Arn"] = s3BucketArn(physicalId, await this.cloudControlClient.config.region());
38741
+ } catch (error) {
38742
+ this.logger.debug(`Failed to construct S3 Bucket Arn for ${physicalId}: ${describeAwsFailure(error).detail}`);
38743
+ }
38036
38744
  break;
38037
38745
  case "AWS::RDS::DBCluster":
38038
38746
  try {
@@ -39940,7 +40648,7 @@ var CustomResourceProvider = class CustomResourceProvider {
39940
40648
  reuseClientCredentials: true,
39941
40649
  tolerateNonStandardClient: true,
39942
40650
  onRebuild: ({ bucketRegion, currentRegion }) => {
39943
- this.logger.debug(`Custom resource response bucket '${displaySafe(bucket, { asciiOnly: true }) || "<unrenderable>"}' is in '${displaySafe(bucketRegion, { asciiOnly: true }) || "<unrenderable>"}' (client was '${displaySafe(currentRegion, { asciiOnly: true }) || "<unrenderable>"}'); building a region-corrected S3 client for response operations.`);
40651
+ this.logger.debug(`Custom resource response bucket ${displayIdent(bucket)} is in ${displayIdent(bucketRegion)} (client was ${displayIdent(currentRegion)}); building a region-corrected S3 client for response operations.`);
39944
40652
  }
39945
40653
  });
39946
40654
  if (generation !== this.responseClientGeneration) {
@@ -42611,7 +43319,7 @@ var ProviderRegistry = class {
42611
43319
  }
42612
43320
  const specificProvider = this.providers.get(resourceType);
42613
43321
  if (specificProvider) {
42614
- const actionableDrops = findActionableSilentDrops(resourceType, properties, this.allowedUnsupportedProperties);
43322
+ const actionableDrops = findActionableSilentDrops(resourceType, properties, this.allowedUnsupportedProperties, input.previousProperties);
42615
43323
  if (actionableDrops.length === 0) {
42616
43324
  this.logger.debug(`Using specific SDK provider for ${resourceType}`);
42617
43325
  if (returningToSdk) {
@@ -42851,15 +43559,18 @@ var ProviderRegistry = class {
42851
43559
  * surface every time.
42852
43560
  */
42853
43561
  reportSilentDropDecisions(resources) {
42854
- for (const { logicalId, resourceType, properties, provisionedBy } of resources) {
43562
+ for (const { logicalId, resourceType, properties, provisionedBy, previousProperties } of resources) {
42855
43563
  const drops = findSilentDropProperties(resourceType, properties);
43564
+ const unrecognizedRoute = findRoutableUnrecognizedProperties(resourceType, properties, this.allowedUnsupportedProperties, previousProperties);
42856
43565
  const stickyCc = provisionedBy === "cc-api" && !STICKY_CC_MIGRATION_EXEMPT.has(resourceType);
42857
- const overridden = stickyCc ? [] : findAcceptedSilentDrops(resourceType, properties, this.allowedUnsupportedProperties);
42858
- const autoRouted = drops.map(({ property }) => property).filter((property) => !this.allowedUnsupportedProperties.has(`${resourceType}:${property}`));
43566
+ const overridden = stickyCc ? [] : findAcceptedSilentDrops(resourceType, properties, this.allowedUnsupportedProperties, previousProperties);
43567
+ const autoRouted = [...drops.map(({ property }) => property).filter((property) => !this.allowedUnsupportedProperties.has(`${resourceType}:${property}`)), ...unrecognizedRoute].sort((a, b) => a.localeCompare(b));
42859
43568
  if (autoRouted.length > 0) {
42860
43569
  const unroutable = this.ccRouteUnavailableReason(resourceType);
42861
43570
  if (unroutable !== void 0) throw new Error(`${logicalId}: ${this.buildUnroutableSilentDropMessage(resourceType, drops.filter((d) => autoRouted.includes(d.property)), unroutable)}`);
42862
- const message = `${logicalId} (${resourceType}): routing via Cloud Control API (cdkd's SDK Provider does not yet wire ${autoRouted.join(", ")} — CC API will forward the full property map. Override via --prefer-sdk-route ${autoRouted.map((p) => `${resourceType}:${p}`).join(",")}.)`;
43571
+ const propList = autoRouted.join(", ");
43572
+ const overrideHint = autoRouted.map((p) => `${resourceType}:${p}`).join(",");
43573
+ const message = `${logicalId} (${resourceType}): routing via Cloud Control API (cdkd's SDK Provider does not yet wire ${propList} — CC API will forward the full property map.${unrecognizedRoute.length === 0 ? "" : ` ${unrecognizedRoute.join(", ")} ${unrecognizedRoute.length === 1 ? "is" : "are"} not in cdkd's CFn schema snapshot: Cloud Control applies a property AWS published since, and rejects a misspelled one as CloudFormation does.`} Override via --prefer-sdk-route ${overrideHint}.)`;
42863
43574
  if (provisionedBy === "cc-api") this.logger.debug(message);
42864
43575
  else this.logger.info(message);
42865
43576
  }
@@ -42886,67 +43597,70 @@ var ProviderRegistry = class {
42886
43597
  }
42887
43598
  this.reportUnrecognizedProperties(logicalId, resourceType, properties, {
42888
43599
  provisionedBy,
42889
- autoRouted: autoRouted.length > 0
43600
+ autoRouted: autoRouted.length > 0,
43601
+ previousProperties
42890
43602
  });
42891
43603
  }
42892
43604
  }
42893
43605
  /**
42894
43606
  * Warn about top-level template properties this type's committed CFn schema
42895
43607
  * snapshot does not know about, on resources that resolve to the SDK route
42896
- * (issue [#2718](https://github.com/go-to-k/cdkd/issues/2718)).
42897
- *
42898
- * The gap this closes: {@link getProviderFor} decides SDK-vs-Cloud-Control
42899
- * from `property-coverage.generated.ts`, built offline from the schema
42900
- * fixtures, and there is no runtime `DescribeType` on that path. So a
42901
- * property AWS publishes AFTER the fixture snapshot produces no
42902
- * `silentDrop` entry, does not auto-route to Cloud Control, and is dropped
42903
- * with the deploy reporting success — the issue
42904
- * [#614](https://github.com/go-to-k/cdkd/issues/614) failure class reached
42905
- * through the one input the #614 machinery cannot observe. The scheduled
42906
- * fixture-refresh job is the FIX (the property enters the fixture and the
42907
- * existing auto-route handles it); this warn is what protects a user
42908
- * deploying BETWEEN refresh cycles.
42909
- *
42910
- * Fires only on the SDK route, which is where the drop actually happens.
42911
- * The two Cloud-Control routes both forward the full property map verbatim,
42912
- * so the property does reach AWS there and a warn would be false:
42913
- * - `provisionedBy: 'cc-api'` from existing state (sticky rule 2 of
42914
- * {@link getProviderFor}), minus the `STICKY_CC_MIGRATION_EXEMPT` types
42915
- * that deliberately re-route back to their SDK provider;
42916
- * - an actionable silent drop auto-routing this deploy (`autoRouted`).
42917
- *
42918
- * The route test MIRRORS `getProviderFor` rather than re-deriving it — the
42919
- * two answering differently is the only way this warn can be wrong about a
42920
- * resource, and it is not decidable from the message.
42921
- *
42922
- * **Known divergence, in the SAFE direction.** This runs on the template's
42923
- * RAW properties (`deploy-engine.ts` calls `validateResourceProperties`
42924
- * pre-flight) while `getProviderFor` runs on RESOLVED ones. So a silent-drop
42925
- * key present only behind an `Fn::If` that resolves to `AWS::NoValue` makes
42926
- * `autoRouted` true here and suppresses the warn, while the real route ends
42927
- * up on the SDK provider and does drop the unrecognized property. The result
42928
- * is a MISSING warn, never a false one — which is the right direction for an
42929
- * advisory line, and why this is documented rather than fixed by resolving
42930
- * twice. `getProviderFor` remains the authority on routing; nothing here
42931
- * changes a routing decision.
42932
- *
42933
- * Suppressed per `<Type>:<Prop>` by `--allow-unsupported-properties`, whose
42934
- * meaning ("accept the silent drop, stay on the SDK path") is exactly this
42935
- * case; deliberately no new flag. Warn rather than error because the drop
42936
- * may be intended, and deliberately NOT an auto-route: flipping to
42937
- * Cloud Control on an UNRECOGNIZED property would let a typo trigger the
42938
- * currently one-way `cc-api` state flip (issue
42939
- * [#2719](https://github.com/go-to-k/cdkd/issues/2719)), and CC would reject
42940
- * the unknown key anyway.
43608
+ * (issues [#2718](https://github.com/go-to-k/cdkd/issues/2718),
43609
+ * [#3713](https://github.com/go-to-k/cdkd/issues/3713)).
43610
+ *
43611
+ * Such a key normally ROUTES the resource through Cloud Control
43612
+ * (`findRoutableUnrecognizedProperties`), and then no warn is due: Cloud
43613
+ * Control applies it or rejects it as CloudFormation would. What stays on the
43614
+ * SDK route — and is dropped there with the deploy reporting success — falls
43615
+ * into three buckets, each named with its own reason, because a line naming
43616
+ * the wrong one misdirects the reader into the wrong fix:
43617
+ *
43618
+ * - READ-ONLY: an attribute, which no engine sets. CloudFormation ignores it
43619
+ * too, which is why it does not route.
43620
+ * - UNROUTABLE TYPE: Cloud Control cannot take the type over
43621
+ * (`disableCcApiFallback` / `NON_PROVISIONABLE`), so the value has no route.
43622
+ * - UNCHANGED: the state record already holds the key with this value (or
43623
+ * a value that cannot be compared before resolution), so the resource
43624
+ * stays on the SDK route, which does not send it. Changing it routes the
43625
+ * resource. "Never reached AWS" would overclaim: a record `cdkd import`
43626
+ * wrote carries the template's bag, whose value the live resource may hold.
43627
+ * - UNROUTABLE TYPE also covers a `'cc-broken'` sticky-CC exemption, whose
43628
+ * Cloud Control handler cannot manage the type at all.
43629
+ *
43630
+ * Fires only on the SDK route. `provisionedBy: 'cc-api'` from state (minus
43631
+ * the `STICKY_CC_MIGRATION_EXEMPT` types that return to their SDK provider)
43632
+ * and a resource auto-routing this deploy both forward the full map.
43633
+ *
43634
+ * **An intrinsic value is reported as undecided.** This runs on the
43635
+ * template's RAW properties (`deploy-engine.ts` calls
43636
+ * `validateResourceProperties` pre-flight) while `getProviderFor` runs on
43637
+ * RESOLVED ones, so a recorded key whose raw value still holds an intrinsic
43638
+ * cannot be compared here. It is not announced as routing, and its warn
43639
+ * sentence says the route is decided once the value resolves — true on
43640
+ * either outcome. `getProviderFor` remains the authority.
43641
+ *
43642
+ * Suppressed per `<Type>:<Prop>` by `--prefer-sdk-route`, whose meaning
43643
+ * ("accept the silent drop, stay on the SDK path") is exactly this case.
42941
43644
  */
42942
43645
  reportUnrecognizedProperties(logicalId, resourceType, properties, route) {
42943
43646
  if (route.provisionedBy === "cc-api" && !STICKY_CC_MIGRATION_EXEMPT.has(resourceType) || route.autoRouted) return;
42944
43647
  const unrecognized = findUnrecognizedProperties(resourceType, properties).filter((property) => !this.allowedUnsupportedProperties.has(`${resourceType}:${property}`));
42945
43648
  if (unrecognized.length === 0) return;
42946
- const propList = unrecognized.join(", ");
43649
+ const coverage = getPropertyCoverage(resourceType);
43650
+ const unroutable = this.ccRouteUnavailableReason(resourceType) ?? (STICKY_CC_MIGRATION_EXEMPT.get(resourceType)?.mode === "cc-broken" ? "Cloud Control's handler cannot manage this type correctly" : coverage?.ccRouteUnavailable === true ? "the type's SDK provider opts out of the Cloud Control fallback (disableCcApiFallback)" : void 0);
43651
+ const readOnly = unrecognized.filter((p) => coverage?.readOnly.has(p) === true);
43652
+ const notReadOnly = unrecognized.filter((p) => coverage?.readOnly.has(p) !== true);
43653
+ const undecided = unroutable === void 0 ? notReadOnly.filter((p) => containsIntrinsic(properties?.[p]) && route.previousProperties != null && typeof route.previousProperties === "object" && Object.hasOwn(route.previousProperties, p)) : [];
43654
+ const rest = notReadOnly.filter((p) => !undecided.includes(p));
43655
+ const sentences = [];
43656
+ const isAre = (names) => names.length === 1 ? "is" : "are";
43657
+ if (readOnly.length > 0) sentences.push(`${readOnly.join(", ")} ${isAre(readOnly)} read-only — an attribute AWS computes, which no engine sets (CloudFormation ignores it too); remove it.`);
43658
+ if (rest.length > 0 && unroutable !== void 0) sentences.push(`${rest.join(", ")} ${isAre(rest)} not in cdkd's CFn schema snapshot, and this type cannot be routed via Cloud Control API (${unroutable}), so cdkd has no route that applies ${rest.length === 1 ? "it" : "them"}. If it is a property AWS published since the snapshot, please report it: ${unsupportedPropertyIssueUrl(resourceType, rest[0])}.`);
43659
+ else if (rest.length > 0) sentences.push(`${rest.join(", ")} ${isAre(rest)} not in cdkd's CFn schema snapshot and unchanged since this resource was deployed on the SDK route, so it stays there and cdkd does not send ${rest.length === 1 ? "it" : "them"}. Changing ${rest.length === 1 ? "it" : "one"} routes the resource via Cloud Control API, which applies a property AWS published since the snapshot and rejects a misspelled one, as CloudFormation does.`);
43660
+ if (undecided.length > 0) sentences.push(`${undecided.join(", ")} ${isAre(undecided)} not in cdkd's CFn schema snapshot and ${undecided.length === 1 ? "its value holds" : "their values hold"} an intrinsic, so the route is decided once it resolves: a value unchanged since the SDK-route deploy stays there and is not sent, and a changed one routes via Cloud Control API.`);
43661
+ if (sentences.length === 0) return;
42947
43662
  const overrideHint = unrecognized.map((p) => `${resourceType}:${p}`).join(",");
42948
- const one = unrecognized.length === 1;
42949
- this.logger.warn(`${logicalId} (${resourceType}): ${propList} ${one ? "is" : "are"} not in cdkd's CFn schema snapshot for this type, so ${one ? "it" : "they"} will NOT reach AWS — the deploy will still report success. Anything of these shapes looks the same here: a misspelled name (fix the spelling); a read-only attribute, which is not settable on any engine (remove it); or a property AWS published after cdkd's snapshot, which cdkd should be routing via Cloud Control — please report that one: ${unsupportedPropertyIssueUrl(resourceType, unrecognized[0])}${one ? "" : ` (link is for ${unrecognized[0]})`}. If the drop is intended — an addPropertyOverride escape hatch — silence this via --prefer-sdk-route ${overrideHint}.`);
43663
+ this.logger.warn(`${logicalId} (${resourceType}): ${unrecognized.length === 1 ? "a property" : "properties"} ${readOnly.length + rest.length > 0 ? "will NOT" : "may not"} reach AWS — the deploy will still report success. ${sentences.join(" ")} If the drop is intended — an addPropertyOverride escape hatch — silence this via --prefer-sdk-route ${overrideHint}.`);
42950
43664
  }
42951
43665
  /**
42952
43666
  * Pure-functional discovery of every resource whose template uses one or
@@ -42961,8 +43675,8 @@ var ProviderRegistry = class {
42961
43675
  */
42962
43676
  findAutoRouteHits(resources) {
42963
43677
  const hits = [];
42964
- for (const { logicalId, resourceType, properties } of resources) {
42965
- const actionable = findActionableSilentDrops(resourceType, properties, this.allowedUnsupportedProperties);
43678
+ for (const { logicalId, resourceType, properties, previousProperties } of resources) {
43679
+ const actionable = findActionableSilentDrops(resourceType, properties, this.allowedUnsupportedProperties, previousProperties);
42966
43680
  if (actionable.length === 0) continue;
42967
43681
  hits.push({
42968
43682
  logicalId,
@@ -44148,7 +44862,7 @@ function maskEveryOccurrence(text, exposure) {
44148
44862
  function secretBearingExportNameWarning(outputKey, exportName, exposure, secrets) {
44149
44863
  const corpus = secrets ?? exposure;
44150
44864
  const name = secretSafeKeyDisplay(exportName, corpus, exposure);
44151
- const shown = name.kind === "masked" ? `(masked: "${name.text}") ` : "";
44865
+ const shown = name.kind === "masked" ? `${maskedLabel(name.text)} ` : "";
44152
44866
  const ownerForceMask = /* @__PURE__ */ new Map();
44153
44867
  const ownerHaystacks = secretScanHaystacks(outputKey);
44154
44868
  for (const [plaintext, expression] of exposure) {
@@ -44221,6 +44935,22 @@ function displayTextOrWithheld(display) {
44221
44935
  return display.kind === "withheld" ? WITHHELD_NAME_DISPLAY : display.text;
44222
44936
  }
44223
44937
  /**
44938
+ * The `(masked: ...)` label for a secret-bearing key the verdict already
44939
+ * masked, BOUNDED (go-to-k/cdkd#3617): both names are template- or
44940
+ * state-chosen, and inside hand-written quotes a `"` in the key closed them and
44941
+ * wrote a clause of its own.
44942
+ *
44943
+ * WITHHELD rather than bounded when the masked text carries anything
44944
+ * non-ASCII. `displayIdent` blanks such a character to a space AFTER the
44945
+ * verdict's own re-test, so the printed text would no longer be the tested
44946
+ * text -- `correct<NBSP>horse` beside a recorded `correct horse` would print
44947
+ * the secret byte for byte. Withholding keeps one string tested and printed,
44948
+ * the rule #2874 set for this module.
44949
+ */
44950
+ function maskedLabel(maskedText) {
44951
+ return /[^ -~]/.test(maskedText) ? "(masked, name withheld: it carries characters this line cannot show as tested)" : `(masked: ${displayIdent(maskedText)})`;
44952
+ }
44953
+ /**
44224
44954
  * Warning for a state KEY that already holds secret plaintext — the residue an
44225
44955
  * EARLIER binary left when it published an export name that resolved to one.
44226
44956
  *
@@ -44232,8 +44962,8 @@ function displayTextOrWithheld(display) {
44232
44962
  * Reported so the `--dry-run --fail` CI gate stops calling such a state clean.
44233
44963
  */
44234
44964
  function secretBearingStateKeyWarning(stackName, display) {
44235
- const clause = display.kind === "masked" ? `(masked: "${display.text}") ` : `(the name is withheld: masking it would leave the secret readable) `;
44236
- return `State for ${canonicalForSecretScan(stackName)} holds an output KEY that renders a secret ${clause}— cdkd scrub cannot rewrite a key, only a value, because the key IS the export name consumers resolve by. Give that output a non-secret Export.Name and redeploy: the next deploy replaces state.outputs and the exports index entirely. ROTATE the exposed secret.`;
44965
+ const clause = display.kind === "masked" ? `${maskedLabel(display.text)} ` : `(the name is withheld: masking it would leave the secret readable) `;
44966
+ return `State for ${displayStackName(canonicalForSecretScan(stackName))} holds an output KEY that renders a secret ${clause}— cdkd scrub cannot rewrite a key, only a value, because the key IS the export name consumers resolve by. Give that output a non-secret Export.Name and redeploy: the next deploy replaces state.outputs and the exports index entirely. ROTATE the exposed secret.`;
44237
44967
  }
44238
44968
  /**
44239
44969
  * Warning for an `Export.Name` colliding with an output NAME it does not own.
@@ -44790,7 +45520,6 @@ const STATEFUL_TYPES = /* @__PURE__ */ new Set([
44790
45520
  "AWS::S3Express::DirectoryBucket",
44791
45521
  "AWS::S3Tables::TableBucket",
44792
45522
  "AWS::S3Tables::Table",
44793
- "AWS::S3Tables::Namespace",
44794
45523
  "AWS::S3Vectors::VectorBucket",
44795
45524
  "AWS::ECR::Repository",
44796
45525
  "AWS::EC2::Volume",
@@ -49365,6 +50094,15 @@ function deriveLabelRouting(change, existingState, registry, forceCcApi = false)
49365
50094
  }
49366
50095
  }
49367
50096
  /**
50097
+ * Whether a property change's `requiresReplacement` is only a CEILING the diff
50098
+ * set before the value could be known — a synthetic change from in-place
50099
+ * attribute propagation or replacement propagation (go-to-k/cdkd#3662). The
50100
+ * UPDATE arm lowers such a ceiling when the resolved value equals the record.
50101
+ */
50102
+ function isReplacementCeiling(pc) {
50103
+ return pc.requiresReplacement && (pc.inPlacePropagated === true || pc.replacementPropagated === true);
50104
+ }
50105
+ /**
49368
50106
  * Structural equality for resolved Outputs maps (issue #875).
49369
50107
  *
49370
50108
  * Output values are intrinsic-resolved primitives or nested objects/arrays
@@ -49676,6 +50414,15 @@ var DeployEngine = class DeployEngine {
49676
50414
  */
49677
50415
  attemptedResolvedProps = /* @__PURE__ */ new Map();
49678
50416
  /**
50417
+ * The live-progress label `provisionResource` gave each resource, and whether
50418
+ * its verb said `Replacing` (go-to-k/cdkd#3662). The label is chosen before
50419
+ * resolution, so a resource whose only replacement is a CEILING (a synthetic
50420
+ * change, see `isReplacementCeiling`) is labelled `Updating`; the UPDATE arm
50421
+ * re-labels it here if the resolved value keeps the replacement, and the
50422
+ * slow-resource warning reads the current label rather than the first one.
50423
+ */
50424
+ liveTaskLabels = /* @__PURE__ */ new Map();
50425
+ /**
49679
50426
  * Logical ids whose replacement this deploy DELIBERATELY left the old
49680
50427
  * physical resource alive for — `UpdateReplacePolicy: Retain` (issue
49681
50428
  * [#2603](https://github.com/go-to-k/cdkd/issues/2603)).
@@ -49780,6 +50527,7 @@ var DeployEngine = class DeployEngine {
49780
50527
  this.perResourceTemplateProps = /* @__PURE__ */ new Map();
49781
50528
  this.perResourceResolvedType = /* @__PURE__ */ new Map();
49782
50529
  this.attemptedResolvedProps = /* @__PURE__ */ new Map();
50530
+ this.liveTaskLabels = /* @__PURE__ */ new Map();
49783
50531
  this.outputSecrets = /* @__PURE__ */ new Map();
49784
50532
  this.outputsPassSecretMaps = [];
49785
50533
  this.outputsTemplateSource = Object.create(null);
@@ -49819,6 +50567,24 @@ var DeployEngine = class DeployEngine {
49819
50567
  };
49820
50568
  }
49821
50569
  /**
50570
+ * The names of this child's parameters whose value carries a `NoEcho` value
50571
+ * the parent supplied in THIS deploy (go-to-k/cdkd#3717), read off the
50572
+ * inherited bag's fresh marks. `undefined` outside a nested child, or when
50573
+ * none does.
50574
+ *
50575
+ * WHOLE values only. A mask-only needle replaces a leaf only whole, so a
50576
+ * parameter that EMBEDS such a value (`prefix-<token>`) is not redacted for
50577
+ * the diff at all: its readers already diff as UPDATE on the plaintext, and
50578
+ * need no promotion from here.
50579
+ */
50580
+ freshNoEchoParameters(parameterValues) {
50581
+ const inherited = this.options.inheritedSecrets;
50582
+ if (!inherited || inherited.size === 0) return void 0;
50583
+ const fresh = /* @__PURE__ */ new Set();
50584
+ for (const [name, value] of Object.entries(parameterValues)) if (carriesFreshNoEchoValue(value, inherited)) fresh.add(name);
50585
+ return fresh.size > 0 ? fresh : void 0;
50586
+ }
50587
+ /**
49822
50588
  * The parameter bag the DIFF resolver context binds, with any inherited
49823
50589
  * secret plaintext rewritten back to its `{{resolve:...}}` expression (issue
49824
50590
  * #1903).
@@ -50293,7 +51059,8 @@ var DeployEngine = class DeployEngine {
50293
51059
  const { provider } = this.providerRegistry.getProviderFor({
50294
51060
  resourceType: resource.resourceType,
50295
51061
  properties: resource.properties,
50296
- provisionedBy: resource.provisionedBy
51062
+ provisionedBy: resource.provisionedBy,
51063
+ previousProperties: resource.properties
50297
51064
  });
50298
51065
  if (!provider.import) return { kind: "not-attempted" };
50299
51066
  const found = await provider.import({
@@ -50794,7 +51561,8 @@ var DeployEngine = class DeployEngine {
50794
51561
  logicalId,
50795
51562
  resourceType: r.Type,
50796
51563
  properties: r.Properties,
50797
- provisionedBy: currentState.resources[logicalId]?.provisionedBy
51564
+ provisionedBy: currentState.resources[logicalId]?.provisionedBy,
51565
+ previousProperties: currentState.resources[logicalId]?.properties
50798
51566
  }));
50799
51567
  this.providerRegistry.validateResourceProperties(resourcesForPropertyCheck);
50800
51568
  this.logger.debug(`All resource properties validated`);
@@ -50810,7 +51578,7 @@ var DeployEngine = class DeployEngine {
50810
51578
  diffResolverContext.bestEffort = true;
50811
51579
  diffResolverContext.skipDynamicReferences = true;
50812
51580
  const diffResolveFn = (value) => this.resolver.resolve(value, diffResolverContext);
50813
- const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.());
51581
+ const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues));
50814
51582
  const nestedStackTypeChanges = findNestedStackTypeChanges({
50815
51583
  changes,
50816
51584
  stateResources: currentState.resources
@@ -51444,11 +52212,15 @@ var DeployEngine = class DeployEngine {
51444
52212
  const renderer = getLiveRenderer();
51445
52213
  const labelRecreateDirection = this.recreateDirectionFor(stackName, logicalId);
51446
52214
  const labelRecordedType = stateResources[logicalId]?.resourceType;
51447
- const needsReplacement = change.changeType === "UPDATE" && ((change.propertyChanges?.some((pc) => pc.requiresReplacement) ?? false) || labelRecordedType !== void 0 && labelRecordedType !== resourceType) || labelRecreateDirection !== void 0;
52215
+ const needsReplacement = change.changeType === "UPDATE" && ((change.propertyChanges?.some((pc) => pc.requiresReplacement && !isReplacementCeiling(pc)) ?? false) || labelRecordedType !== void 0 && labelRecordedType !== resourceType) || labelRecreateDirection !== void 0;
51448
52216
  const verb = change.changeType === "CREATE" ? "Creating" : change.changeType === "DELETE" ? "Deleting" : needsReplacement ? "Replacing" : "Updating";
51449
52217
  const labelRouting = this.peekRoutingForLabel(change, stateResources[logicalId], stackName, logicalId, needsReplacement, labelRecreateDirection);
51450
52218
  const baseLabel = `${verb} ${logicalId} (${resourceType})${labelRouting === "cc-api" ? " [CC API]" : ""}`;
51451
52219
  renderer.addTask(logicalId, baseLabel);
52220
+ this.liveTaskLabels.set(logicalId, {
52221
+ label: baseLabel,
52222
+ replacing: needsReplacement
52223
+ });
51452
52224
  const operationKind = change.changeType === "CREATE" ? "CREATE" : change.changeType === "DELETE" ? "DELETE" : "UPDATE";
51453
52225
  const providerMinTimeoutMs = this.providerRegistry.getProvider(resourceType).getMinResourceTimeoutMs?.() ?? 0;
51454
52226
  const warnAfterMs = this.options.resourceWarnAfterByType?.[resourceType] ?? this.options.resourceWarnAfterMs ?? 3e5;
@@ -51480,7 +52252,9 @@ var DeployEngine = class DeployEngine {
51480
52252
  onWarn: (elapsedMs) => {
51481
52253
  const minutes = Math.max(1, Math.round(elapsedMs / 6e4));
51482
52254
  const warnSuffix = ` [taking longer than expected, ${minutes}m+]`;
51483
- renderer.updateTaskLabel(logicalId, `${baseLabel}${warnSuffix}`);
52255
+ const current = this.liveTaskLabels.get(logicalId);
52256
+ if (current !== void 0) current.warnSuffix = warnSuffix;
52257
+ renderer.updateTaskLabel(logicalId, `${current?.label ?? baseLabel}${warnSuffix}`);
51484
52258
  renderer.printAbove(() => {
51485
52259
  this.logger.warn(`${logicalId} (${resourceType}) has been ${operationKind === "CREATE" ? "creating" : operationKind === "DELETE" ? "deleting" : "updating"} for ${minutes}m — still waiting`);
51486
52260
  });
@@ -51586,7 +52360,10 @@ var DeployEngine = class DeployEngine {
51586
52360
  if (targets.viaSdkProvider.has(logicalId)) return "sdk";
51587
52361
  }
51588
52362
  peekRoutingForLabel(change, existingState, stackName, logicalId, needsReplacement = false, recreateDirection) {
51589
- if (needsReplacement) return deriveLabelRouting(change, recreateDirection === void 0 ? void 0 : { provisionedBy: recreateDirection }, this.providerRegistry, recreateDirection === "cc-api");
52363
+ if (needsReplacement) return deriveLabelRouting(change, {
52364
+ ...recreateDirection !== void 0 && { provisionedBy: recreateDirection },
52365
+ ...existingState?.properties !== void 0 && { properties: existingState.properties }
52366
+ }, this.providerRegistry, recreateDirection === "cc-api");
51590
52367
  return deriveLabelRouting(change, existingState, this.providerRegistry, this.isPinnedToCcApi(stackName, logicalId));
51591
52368
  }
51592
52369
  /**
@@ -51777,16 +52554,15 @@ var DeployEngine = class DeployEngine {
51777
52554
  const updateSecrets = context.recordedSecretValues ?? /* @__PURE__ */ new Map();
51778
52555
  this.perResourceSecrets.set(logicalId, updateSecrets);
51779
52556
  const resolvedProps = await this.resolver.resolve(desiredProps, context);
51780
- this.refuseRedactedAttributeReads(logicalId, resourceType, context);
51781
52557
  this.perResourceTemplateProps.set(logicalId, desiredProps);
51782
52558
  this.perResourceResolvedType.set(logicalId, resourceType);
51783
52559
  recordNestedStackParameterExpressions(updateSecrets, resourceType, resolvedProps, desiredProps);
51784
52560
  this.auditResolvedAssetReferences(logicalId, resourceType, resolvedProps);
51785
- this.attemptedResolvedProps.set(logicalId, resolvedProps);
52561
+ const suppliesFreshMaskOnlyValue = carriesFreshNoEchoValue(resolvedProps, updateSecrets);
51786
52562
  const desiredForSkipCheck = redactSecretsForState(markSameGenerationBag({ ...resolvedProps }), updateSecrets, desiredProps);
51787
52563
  const allowedSilentDrops = this.providerRegistry.getAllowedUnsupportedProperties?.();
51788
- const desiredForSkipCheckAsWritten = currentResource.provisionedBy !== "cc-api" && allowedSilentDrops ? withoutAcceptedSilentDropProperties(resourceType, desiredForSkipCheck, allowedSilentDrops) : desiredForSkipCheck;
51789
- if (!typeChanged && JSON.stringify(desiredForSkipCheckAsWritten) === JSON.stringify(currentPropsAsWritten)) {
52564
+ const desiredForSkipCheckAsWritten = currentResource.provisionedBy !== "cc-api" && allowedSilentDrops ? withoutAcceptedSilentDropProperties(resourceType, desiredForSkipCheck, allowedSilentDrops, currentResource.properties) : desiredForSkipCheck;
52565
+ if (!typeChanged && !suppliesFreshMaskOnlyValue && JSON.stringify(desiredForSkipCheckAsWritten) === JSON.stringify(currentPropsAsWritten)) {
51790
52566
  if (change.attributeChanges && change.attributeChanges.length > 0) {
51791
52567
  const attrSummary = change.attributeChanges.map((a) => `${a.attribute}: ${a.oldValue ?? "(unset)"} → ${a.newValue ?? "(unset)"}`).join(", ");
51792
52568
  this.logger.info(` ↻ ${logicalId} (${resourceType}) attribute update: ${attrSummary}`);
@@ -51805,12 +52581,32 @@ var DeployEngine = class DeployEngine {
51805
52581
  if (counts) counts.skipped++;
51806
52582
  break;
51807
52583
  }
52584
+ this.refuseRedactedAttributeReads(logicalId, resourceType, context);
52585
+ this.attemptedResolvedProps.set(logicalId, resolvedProps);
52586
+ if (change.propertyChanges?.some((pc) => isReplacementCeiling(pc)) === true) change.propertyChanges = change.propertyChanges.map((pc) => {
52587
+ if (!isReplacementCeiling(pc)) return pc;
52588
+ if (carriesFreshNoEchoValue(resolvedProps[pc.path], updateSecrets)) return pc;
52589
+ return JSON.stringify(desiredForSkipCheckAsWritten[pc.path]) !== JSON.stringify(currentPropsAsWritten[pc.path]) ? pc : {
52590
+ ...pc,
52591
+ requiresReplacement: false
52592
+ };
52593
+ });
51808
52594
  const propertyDrivenReplacement = typeChanged || change.propertyChanges?.some((pc) => pc.requiresReplacement);
51809
52595
  const recreateTargets = this.options.recreateTargets?.stackName === stackName ? this.options.recreateTargets : void 0;
51810
52596
  const recreateViaCcApi = recreateTargets?.viaCcApi.has(logicalId) ?? false;
51811
52597
  const recreateViaSdkProvider = recreateTargets?.viaSdkProvider.has(logicalId) ?? false;
51812
52598
  const recreateFlagged = recreateViaCcApi || recreateViaSdkProvider;
51813
52599
  const needsReplacement = propertyDrivenReplacement || recreateFlagged;
52600
+ const liveLabel = this.liveTaskLabels.get(logicalId);
52601
+ if (needsReplacement && liveLabel !== void 0 && !liveLabel.replacing) {
52602
+ const label = `Replacing ${logicalId} (${resourceType})${this.peekRoutingForLabel(change, currentResource, stackName, logicalId, true, this.recreateDirectionFor(stackName, logicalId)) === "cc-api" ? " [CC API]" : ""}`;
52603
+ this.liveTaskLabels.set(logicalId, {
52604
+ label,
52605
+ replacing: true,
52606
+ ...liveLabel.warnSuffix !== void 0 && { warnSuffix: liveLabel.warnSuffix }
52607
+ });
52608
+ renderer.updateTaskLabel(logicalId, `${label}${liveLabel.warnSuffix ?? ""}`);
52609
+ }
51814
52610
  const dependencies = this.extractAllDependencies(template, logicalId);
51815
52611
  const updateReplacePolicy = template?.Resources?.[logicalId]?.UpdateReplacePolicy;
51816
52612
  if (needsReplacement) {
@@ -51831,6 +52627,7 @@ var DeployEngine = class DeployEngine {
51831
52627
  resourceType,
51832
52628
  properties: resolvedProps,
51833
52629
  ...recreateDirectionHint && { provisionedBy: recreateDirectionHint },
52630
+ previousProperties: currentResource.properties,
51834
52631
  ...recreateViaCcApi && { forceCcApi: true }
51835
52632
  });
51836
52633
  const replaceProvider = replaceDecision.provider;
@@ -52012,7 +52809,8 @@ var DeployEngine = class DeployEngine {
52012
52809
  }
52013
52810
  const replDecision = this.providerRegistry.getProviderFor({
52014
52811
  resourceType,
52015
- properties: resolvedProps
52812
+ properties: resolvedProps,
52813
+ previousProperties: currentResource.properties
52016
52814
  });
52017
52815
  const replProvider = replDecision.provider;
52018
52816
  const replProps = replDecision.provisionedBy === "cc-api" ? this.preparePropertiesForCcApi(resourceType, resolvedProps, logicalId) : resolvedProps;
@@ -52796,5 +53594,5 @@ var DeployEngine = class DeployEngine {
52796
53594
  };
52797
53595
 
52798
53596
  //#endregion
52799
- export { yellow as $, ConfigError as $a, synthesisStatusMessage as $i, refuseMalformedOrphanRecordsForDestroy as $n, forceQuitRecoveryClause as $r, configIntegerRefusal as $t, createPreDeleteFinalSnapshot as A, credentialFingerprint as Aa, validateContainerRepoName as Ai, hasReadableOutputs as An, retryClassificationText as Ao, TEMPLATE_SOURCED_RULES as Ar, deleteSkipReason as At, isStatefulRecreateTargetSync as B, absoluteAssemblyPathEscape as Ba, getDockerCmd as Bi, malformedOrphansRefusalMessage as Bn, maskSecretsInText as Br, isImpossibleEmptyStoredAttribute as Bt, namesAnyDeclaredParameter as C, expectedOwnerParam as Ca, assertAssetBucketRegion as Ci, STATE_REGION_DIVERGED as Cn, shellQuote as Co, describeTypeWithThrottleRetry as Cr, compositeIdSkipResult as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, ambientClientDefaults as Da, parseBootstrapMarker as Di, deployRefusesOrphanRowsReason as Dn, isTransientServerError as Do, STATE_SOURCED_BASELINE_RULES as Dr, maskerOrIdentity as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, derivePartitionAndUrlSuffix as Ea, isCrossRegionRedirect as Ei, UNREADABLE_RESOURCES_MAP_ROW as En, isThrottlingError as Eo, TemplateParser as Er, maskDeep as Et, extractDeploymentEventError as F, defineOwnKey as Fa, describeDockerExecFailure as Fi, malformedExportSourceWarning as Fn, identityKeyFor as Fr, carriesDynamicReference as Ft, toCfnInteger as G, resolveBucketRegion as Ga, runDockerForeground as Gi, malformedResourceEntriesWarning as Gn, redactSecretsForState as Gr, isSettledInstanceState as Gt, WARM_THROUGHPUT_MEMBERS as H, renderAssemblyPathEscape as Ha, isMalformedEnvKey as Hi, malformedOutputsRefusalMessage as Hn, recordMaskOnlyValue as Hr, isUnboundTemplateParameter as Ht, makeSiblingClaimReader as I, hasOwnKey as Ia, describeDockerFailure as Ii, malformedLocalOutputsWarning as In, isSingleDynamicReferenceToken as Ir, carriesFetchableDynamicReference as It, bold as J, resetAwsClients as Ja, escapeRegExp$1 as Ji, malformedStateRefusalMessage as Jn, S3StateBackend as Jr, resolveExplicitPhysicalId as Jt, toFiniteNumber as K, AwsClients as Ka, runDockerStreaming as Ki, malformedResourcePropertiesWarning as Kn, scrubResourceRecord as Kr, WAFv2WebACLProvider as Kt, planOrphanAdoption as L, hasPlainPrototype$1 as La, dockerSpawnEnvWithSensitive as Li, malformedOrphanRecordsRefusalMessage as Ln, isUncertifiedBaselineMaskPosition as Lr, cfnRefValueFromPhysicalId as Lt, refusesFinalSnapshot as M, failedStageNote as Ma, buildDockerImage as Mi, isReadableOrphanRecord as Mn, safeStringify$1 as Mo, createSecretMasker as Mr, disableInstanceApiTermination as Mt, unsupportedFinalSnapshotError as N, globMatches as Na, resolveDockerContextDirectory as Ni, isReadableResourceEntry as Nn, __exportAll as No, dynamicReferenceTokens as Nr, isTerminationProtectionPropagationError as Nt, buildFinalSnapshotIdentifier as O, ambientCredentialConfig as Oa, readBootstrapMarkerBody as Oi, displayLogicalId as On, markNonRetryable as Oo, STATE_SOURCED_CROSS_GENERATION_RULES as Or, UNSPECIFIED_SKIP_REASON as Ot, makeCanonicalizePropertiesFn as P, processStackMessages as Pa, describeDockerCapturedOutput as Pi, malformedExportNamesWarning as Pn, errorCauseChain as Pr, IntrinsicFunctionResolver as Pt, red as Q, CdkdError as Qa, Synthesizer as Qi, refuseMalformedOrphanRecords as Qn, buildLockContentionMessage as Qr, configBooleanRefusal as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, nullPrototypeRecord as Ra, finchSecretArgvRefusal as Ri, malformedOrphanRecordsWarning as Rn, markSameGenerationBag as Rr, coerceParameterTypedValue as Rt, computeParameterTaint as S, decodeListingKey as Sa, BOOTSTRAP_MARKER_PREFIX as Si, INTRINSIC_KEYS as Sn, pasteableCommand as So, findSilentDropProperties as Sr, compositeIdSeparatorRefusal as St, resourcesNamingDeclaredParameter as T, canonicalizeRegion as Ta, getBootstrapMarkerKey as Ti, UNREADABLE_ORPHANS_CONTAINER_ROW as Tn, isRetryableTransientError as To, DagBuilder as Tr, createMaskedRetryLogger as Tt, coerceWarmThroughput as U, resolveAssemblyPath as Ua, partitionSensitiveEnv as Ui, malformedOutputsWarning as Un, recordMaskOnlyValuesIn as Ur, parameterTypeMayLoseSecretIdentity as Ut, renderStatefulReason as V, displayAssemblyPath as Va, isDockerClientEnvKey as Vi, malformedOrphansWarning as Vn, pathCrossesDottedKey as Vr, isNamelessDynamicReferenceError as Vt, isWarmThroughputDecrease as W, clearBucketRegionCache as Wa, redactDockerArgvValues as Wi, malformedRenderedContainersWarning as Wn, recoverMaskedOutput as Wr, refStateLookupFromResource as Wt, gray as X, setAwsClients as Xa, AssetManifestLoader as Xi, refuseDivergentRecordRegionForDestroy as Xn, UNREPRODUCIBLE_LOCK_CLAUSE as Xr, coerceCfnBoolean as Xt, cyan as Y, runWithStackAwsClients as Ya, stripControlChars as Yi, previewableOrphanRecords as Yn, rebuildClientForBucketRegion as Yr, assertRegionMatch as Yt, green as Z, AssetError as Za, getDockerImageBySourceHash as Zi, refuseMalformedNestedChildOutputs as Zn, buildForceUnlockCommand as Zr, coerceCfnInteger as Zt, bagHoldsSecretExpression as _, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as _a, buildAssetRedirectMap as _i, AWS_CREDENTIAL_ENV_KEYS as _n, SynthesisError as _o, safeRegion as _r, startInterruptWatch as _t, DeploymentEventsStore as a, resolveSkipPrefix as aa, hasReadableExportSet as ai, requireConfigString as an, LocalInvokeBuildError as ao, refuseMalformedResourceAttributesForOrphan as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, producerCoordinateKey as ba, rewriteTemplateAssetReferences as bi, envCredentialsAreAssumedRole as bn, normalizeAwsError as bo, unreadableOrphanRecords as br, ccProtectionRegistryTypes as bt, replayFailedOperations as c, resolveUseCdkBootstrapAssets as ca, importableOutputKeys as ci, classifyReplaySecretRegion as cn, MalformedProducerRecordRefusalError as co, refuseMalformedResourcePropertiesForOrphan as cr, IAMRoleProvider as ct, updatePartialMessage as d, ssmResolvedValueType as da, orphansAfterRollback as di, s3BucketArn as dn, ProvisioningError as do, repairMalformedOrphanRecordsForReadOnly as dr, ProviderRegistry as dt, getDefaultStateBucketName as ea, formatLockExpiry as ei, configStringRefusal as en, CrossAccountSecretRefusalError as eo, refuseMalformedOrphans as er, collectDeclaredOutputNames as et, updatePartialReason as f, CFN_TEMPLATE_BODY_LIMIT as fa, orphansCarriedFrom as fi, s3BucketDomainName as fn, ResourceTimeoutError as fo, repairMalformedOrphansForReadOnly as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, uploadCfnTemplate as ga, WorkGraph as gi, applyRoleArnIfSet as gn, StateError as go, repairMalformedResourcesForReadOnly as gr, isInterruptedWaitError as gt, IMPLICIT_DELETE_DEPENDENCIES as h, findLargeInlineResources as ha, stringifyValue as hi, s3BucketWebsiteUrl as hn, StackTerminationProtectionError as ho, repairMalformedResourcePropertiesForReadOnly as hr, interruptWatchListenerCount as ht, DeploymentEventsReader as i, resolveCaptureObservedState as ia, exportNamesCarriedFrom as ii, requireConfigObject as in, IntrinsicResolutionRefusalError as io, refuseMalformedOutputsForDestroy as ir, secretBearing as it, isFinalSnapshotError as j, AssemblyReader as ja, buildDenyExternalAccessPolicy as ji, hasReadableResources as jn, describeAwsFailure as jo, carriesSecretMask as jr, isWaitAbandonedError as jt, ccRoutedFinalSnapshotError as k, clientDefaultsFor as ka, validateAssetBucketName as ki, hasReadableOrphans as kn, markRedactedCause as ko, STATE_SOURCED_READBACK_RULES as kr, deleteIndeterminateGuards as kt, replayRollback as l, stateBucketExistenceConfirmed as la, importableOutputs as li, producerRegionsFromState as ln, NestedStackChildDirectDestroyError as lo, refuseMalformedResourcesForDestroy as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, MIGRATE_TMP_PREFIX as ma, AssetPublisher as mi, s3BucketRegionalDomainName as mn, StackHasActiveImportsError as mo, repairMalformedResourceEntriesForReadOnly as mr, endCommandInterruptScope as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, resolveApp as na, DEFAULT_STATE_PREFIX as ni, replayWarn as nn, DeployCancelledError as no, refuseMalformedOrphansForOrphan as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, resolveStateBucketWithDefault as oa, hasReasonlessBaselineRefusal as oi, definedAttributes as on, LocalStartServiceError as oo, refuseMalformedResourceEntries as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, CFN_TEMPLATE_URL_LIMIT as pa, shouldRetainResource as pi, s3BucketDualStackDomainName as pn, ResourceUpdateNotSupportedError as po, repairMalformedOutputsForReadOnly as pr, beginCommandInterruptScope as pt, formatResourceLine as q, getAwsClients as qa, warnFinchArgvExposure as qi, malformedResourcesWarning as qn, LockManager as qr, normalizeAwsTagsToCfn as qt, DeployEngine as r, resolveAutoAssetStorage as ra, describeRegionValueKind as ri, requireConfigArray as rn, DynamicReferenceRegionAmbiguousError as ro, refuseMalformedOutputs as rr, isExportAliasCollision as rt, planRollback as s, resolveStateBucketWithDefaultAndSource as sa, hasUnverifiableParameterRefusal as si, stringifyIfAssigned as sn, LockError as so, refuseMalformedResourceEntriesForOrphan as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, getLegacyStateBucketName as ta, CUSTOM_RESOURCE_RESPONSE_PREFIX as ti, readConfigString as tn, DependencyError as to, refuseMalformedOrphansForDestroy as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, warnDeprecatedNoPrefixCliFlag as ua, isReadableBag as ui, withSharedDrainBudget as un, PartialFailureError as uo, refuseMalformedState as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, injectiveKey as va, createAssetRedirectResolver as vi, applyCallerIdentityCredentials as vn, formatError as vo, safeStackName as vr, CloudControlProvider as vt, reachableDivergentParameters as w, PARTITION_TABLE as wa, ensureAssetStorage as wi, STATE_RESOURCES_MALFORMED as wn, isMarkedNonRetryable as wo, withRetry as wr, packCompositeId as wt, bindingSkippedOutputs as x, producerRecordKey as xa, AssetModeResolver as xi, DiffCalculator as xn, withErrorHandling as xo, findActionableSilentDrops as xr, compositeIdFormatMessage as xt, keptWholeReasonText as y, injectiveKeyPrefix as ya, loadPublishableAssetManifest as yi, callerEnvCredentials as yn, isCdkdError as yo, unpreviewableOrphanRecords as yr, slowCcOperationTimeoutMs as yt, isStatefulRecreateTargetForReplace as z, ownValue as za, formatDockerLoginError as zi, malformedOrphanRowsKeptWarning as zn, maskSecretsInError as zr, getAccountInfo as zt };
52800
- //# sourceMappingURL=deploy-engine-JdJuqXID.js.map
53597
+ export { yellow as $, CdkdError as $a, synthesisStatusMessage as $i, refuseMalformedOrphanRecordsForDestroy as $n, forceQuitRecoveryClause as $r, configIntegerRefusal as $t, createPreDeleteFinalSnapshot as A, credentialFingerprint as Aa, validateContainerRepoName as Ai, hasReadableOutputs as An, markRedactedCause as Ao, TEMPLATE_SOURCED_RULES as Ar, deleteSkipReason as At, isStatefulRecreateTargetSync as B, absoluteAssemblyPathEscape as Ba, getDockerCmd as Bi, malformedOrphansRefusalMessage as Bn, maskSecretsInText as Br, isImpossibleEmptyStoredAttribute as Bt, namesAnyDeclaredParameter as C, expectedOwnerParam as Ca, assertAssetBucketRegion as Ci, STATE_REGION_DIVERGED as Cn, pasteableCommand as Co, describeTypeWithThrottleRetry as Cr, compositeIdSkipResult as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, ambientClientDefaults as Da, parseBootstrapMarker as Di, deployRefusesOrphanRowsReason as Dn, isThrottlingError as Do, STATE_SOURCED_BASELINE_RULES as Dr, maskerOrIdentity as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, derivePartitionAndUrlSuffix as Ea, isCrossRegionRedirect as Ei, UNREADABLE_RESOURCES_MAP_ROW as En, isRetryableTransientError as Eo, TemplateParser as Er, maskDeep as Et, extractDeploymentEventError as F, defineOwnKey as Fa, describeDockerExecFailure as Fi, malformedExportSourceWarning as Fn, identityKeyFor as Fr, carriesDynamicReference as Ft, toCfnInteger as G, clearBucketRegionCache as Ga, runDockerForeground as Gi, malformedResourceEntriesWarning as Gn, redactSecretsForState as Gr, isSettledInstanceState as Gt, WARM_THROUGHPUT_MEMBERS as H, displayAssemblyPath as Ha, isMalformedEnvKey as Hi, malformedOutputsRefusalMessage as Hn, recordMaskOnlyValue as Hr, isUnboundTemplateParameter as Ht, makeSiblingClaimReader as I, hasOwnKey as Ia, describeDockerFailure as Ii, malformedLocalOutputsWarning as In, isSingleDynamicReferenceToken as Ir, carriesFetchableDynamicReference as It, bold as J, getAwsClients as Ja, escapeRegExp$1 as Ji, malformedStateRefusalMessage as Jn, S3StateBackend as Jr, resolveExplicitPhysicalId as Jt, toFiniteNumber as K, resolveBucketRegion as Ka, runDockerStreaming as Ki, malformedResourcePropertiesWarning as Kn, scrubResourceRecord as Kr, WAFv2WebACLProvider as Kt, planOrphanAdoption as L, hasPlainPrototype$1 as La, dockerSpawnEnvWithSensitive as Li, malformedOrphanRecordsRefusalMessage as Ln, isUncertifiedBaselineMaskPosition as Lr, cfnRefValueFromPhysicalId as Lt, refusesFinalSnapshot as M, failedStageNote as Ma, buildDockerImage as Mi, isReadableOrphanRecord as Mn, describeAwsFailure as Mo, createSecretMasker as Mr, disableInstanceApiTermination as Mt, unsupportedFinalSnapshotError as N, globMatches as Na, resolveDockerContextDirectory as Ni, isReadableResourceEntry as Nn, safeStringify$1 as No, dynamicReferenceTokens as Nr, isTerminationProtectionPropagationError as Nt, buildFinalSnapshotIdentifier as O, ambientCredentialConfig as Oa, readBootstrapMarkerBody as Oi, displayLogicalId as On, isTransientServerError as Oo, STATE_SOURCED_CROSS_GENERATION_RULES as Or, UNSPECIFIED_SKIP_REASON as Ot, makeCanonicalizePropertiesFn as P, processStackMessages as Pa, describeDockerCapturedOutput as Pi, malformedExportNamesWarning as Pn, __exportAll as Po, errorCauseChain as Pr, IntrinsicFunctionResolver as Pt, red as Q, AssetError as Qa, Synthesizer as Qi, refuseMalformedOrphanRecords as Qn, buildLockContentionMessage as Qr, configBooleanRefusal as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, nullPrototypeRecord as Ra, finchSecretArgvRefusal as Ri, malformedOrphanRecordsWarning as Rn, markSameGenerationBag as Rr, coerceParameterTypedValue as Rt, computeParameterTaint as S, decodeListingKey as Sa, BOOTSTRAP_MARKER_PREFIX as Si, INTRINSIC_KEYS as Sn, withErrorHandling as So, findSilentDropProperties as Sr, compositeIdSeparatorRefusal as St, resourcesNamingDeclaredParameter as T, canonicalizeRegion as Ta, getBootstrapMarkerKey as Ti, UNREADABLE_ORPHANS_CONTAINER_ROW as Tn, isMarkedNonRetryable as To, DagBuilder as Tr, createMaskedRetryLogger as Tt, coerceWarmThroughput as U, renderAssemblyPathEscape as Ua, partitionSensitiveEnv as Ui, malformedOutputsWarning as Un, recordMaskOnlyValuesIn as Ur, parameterTypeMayLoseSecretIdentity as Ut, renderStatefulReason as V, describeFileReadFailure as Va, isDockerClientEnvKey as Vi, malformedOrphansWarning as Vn, pathCrossesDottedKey as Vr, isNamelessDynamicReferenceError as Vt, isWarmThroughputDecrease as W, resolveAssemblyPath as Wa, redactDockerArgvValues as Wi, malformedRenderedContainersWarning as Wn, recoverMaskedOutput as Wr, refStateLookupFromResource as Wt, gray as X, runWithStackAwsClients as Xa, AssetManifestLoader as Xi, refuseDivergentRecordRegionForDestroy as Xn, UNREPRODUCIBLE_LOCK_CLAUSE as Xr, coerceCfnBoolean as Xt, cyan as Y, resetAwsClients as Ya, stripControlChars as Yi, previewableOrphanRecords as Yn, rebuildClientForBucketRegion as Yr, assertRegionMatch as Yt, green as Z, setAwsClients as Za, getDockerImageBySourceHash as Zi, refuseMalformedNestedChildOutputs as Zn, buildForceUnlockCommand as Zr, coerceCfnInteger as Zt, bagHoldsSecretExpression as _, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as _a, buildAssetRedirectMap as _i, AWS_CREDENTIAL_ENV_KEYS as _n, StateError as _o, safeRegion as _r, startInterruptWatch as _t, DeploymentEventsStore as a, resolveSkipPrefix as aa, hasReadableExportSet as ai, requireConfigString as an, IntrinsicResolutionRefusalError as ao, refuseMalformedResourceAttributesForOrphan as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, producerCoordinateKey as ba, rewriteTemplateAssetReferences as bi, envCredentialsAreAssumedRole as bn, isCdkdError as bo, unreadableOrphanRecords as br, ccProtectionRegistryTypes as bt, replayFailedOperations as c, resolveUseCdkBootstrapAssets as ca, importableOutputKeys as ci, classifyReplaySecretRegion as cn, LockError as co, refuseMalformedResourcePropertiesForOrphan as cr, IAMRoleProvider as ct, updatePartialMessage as d, ssmResolvedValueType as da, orphansAfterRollback as di, s3BucketArn as dn, PartialFailureError as do, repairMalformedOrphanRecordsForReadOnly as dr, ProviderRegistry as dt, getDefaultStateBucketName as ea, formatLockExpiry as ei, configStringRefusal as en, ConfigError as eo, refuseMalformedOrphans as er, collectDeclaredOutputNames as et, updatePartialReason as f, CFN_TEMPLATE_BODY_LIMIT as fa, orphansCarriedFrom as fi, s3BucketDomainName as fn, ProvisioningError as fo, repairMalformedOrphansForReadOnly as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, uploadCfnTemplate as ga, WorkGraph as gi, applyRoleArnIfSet as gn, StackTerminationProtectionError as go, repairMalformedResourcesForReadOnly as gr, isInterruptedWaitError as gt, IMPLICIT_DELETE_DEPENDENCIES as h, findLargeInlineResources as ha, stringifyValue as hi, s3BucketWebsiteUrl as hn, StackHasActiveImportsError as ho, repairMalformedResourcePropertiesForReadOnly as hr, interruptWatchListenerCount as ht, DeploymentEventsReader as i, resolveCaptureObservedState as ia, exportNamesCarriedFrom as ii, requireConfigObject as in, DynamicReferenceRegionAmbiguousError as io, refuseMalformedOutputsForDestroy as ir, secretBearing as it, isFinalSnapshotError as j, AssemblyReader as ja, buildDenyExternalAccessPolicy as ji, hasReadableResources as jn, retryClassificationText as jo, carriesSecretMask as jr, isWaitAbandonedError as jt, ccRoutedFinalSnapshotError as k, clientDefaultsFor as ka, validateAssetBucketName as ki, hasReadableOrphans as kn, markNonRetryable as ko, STATE_SOURCED_READBACK_RULES as kr, deleteIndeterminateGuards as kt, replayRollback as l, stateBucketExistenceConfirmed as la, importableOutputs as li, producerRegionsFromState as ln, MalformedProducerRecordRefusalError as lo, refuseMalformedResourcesForDestroy as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, MIGRATE_TMP_PREFIX as ma, AssetPublisher as mi, s3BucketRegionalDomainName as mn, ResourceUpdateNotSupportedError as mo, repairMalformedResourceEntriesForReadOnly as mr, endCommandInterruptScope as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, resolveApp as na, DEFAULT_STATE_PREFIX as ni, replayWarn as nn, DependencyError as no, refuseMalformedOrphansForOrphan as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, resolveStateBucketWithDefault as oa, hasReasonlessBaselineRefusal as oi, definedAttributes as on, LocalInvokeBuildError as oo, refuseMalformedResourceEntries as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, CFN_TEMPLATE_URL_LIMIT as pa, shouldRetainResource as pi, s3BucketDualStackDomainName as pn, ResourceTimeoutError as po, repairMalformedOutputsForReadOnly as pr, beginCommandInterruptScope as pt, formatResourceLine as q, AwsClients as qa, warnFinchArgvExposure as qi, malformedResourcesWarning as qn, LockManager as qr, normalizeAwsTagsToCfn as qt, DeployEngine as r, resolveAutoAssetStorage as ra, describeRegionValueKind as ri, requireConfigArray as rn, DeployCancelledError as ro, refuseMalformedOutputs as rr, isExportAliasCollision as rt, planRollback as s, resolveStateBucketWithDefaultAndSource as sa, hasUnverifiableParameterRefusal as si, stringifyIfAssigned as sn, LocalStartServiceError as so, refuseMalformedResourceEntriesForOrphan as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, getLegacyStateBucketName as ta, CUSTOM_RESOURCE_RESPONSE_PREFIX as ti, readConfigString as tn, CrossAccountSecretRefusalError as to, refuseMalformedOrphansForDestroy as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, warnDeprecatedNoPrefixCliFlag as ua, isReadableBag as ui, withSharedDrainBudget as un, NestedStackChildDirectDestroyError as uo, refuseMalformedState as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, injectiveKey as va, createAssetRedirectResolver as vi, applyCallerIdentityCredentials as vn, SynthesisError as vo, safeStackName as vr, CloudControlProvider as vt, reachableDivergentParameters as w, PARTITION_TABLE as wa, ensureAssetStorage as wi, STATE_RESOURCES_MALFORMED as wn, shellQuote as wo, withRetry as wr, packCompositeId as wt, bindingSkippedOutputs as x, producerRecordKey as xa, AssetModeResolver as xi, DiffCalculator as xn, normalizeAwsError as xo, findActionableSilentDrops as xr, compositeIdFormatMessage as xt, keptWholeReasonText as y, injectiveKeyPrefix as ya, loadPublishableAssetManifest as yi, callerEnvCredentials as yn, formatError as yo, unpreviewableOrphanRecords as yr, slowCcOperationTimeoutMs as yt, isStatefulRecreateTargetForReplace as z, ownValue as za, formatDockerLoginError as zi, malformedOrphanRowsKeptWarning as zn, maskSecretsInError as zr, getAccountInfo as zt };
53598
+ //# sourceMappingURL=deploy-engine-BZps_IKn.js.map