@go-to-k/cdkd 0.291.27 → 0.291.28

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-qSDe1fA_.js";
3
- import { t as getCdkdVersion } from "./version-CuKFdkKV.js";
3
+ import { t as getCdkdVersion } from "./version-CyFoAN6V.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";
@@ -1314,8 +1314,8 @@ function isUpdateUnsupportedError(error, logicalId) {
1314
1314
  * EXISTS — `scripts/check-pasteable-command-shapes.ts`, whose unit test is its
1315
1315
  * enforcement. A list of what is not yet covered goes stale the moment
1316
1316
  * something is, so derive it rather than reading it: the fence reports the
1317
- * shapes, and its `EXEMPTIONS` name the sites deliberately left for a
1318
- * follow-up PR.
1317
+ * shapes, and its `EXEMPTIONS` (empty today) name any site deliberately left
1318
+ * for a follow-up PR.
1319
1319
  */
1320
1320
  /**
1321
1321
  * Quote a value for a pasteable shell command.
@@ -1349,6 +1349,28 @@ function commandHole(name) {
1349
1349
  return `'<${name}>'`;
1350
1350
  }
1351
1351
  /**
1352
+ * An identifier for the PROSE of a message that also carries a labelled
1353
+ * pasteable line: the value itself when `isPasteableIdent` admits it,
1354
+ * otherwise a description. A value with a newline, or with padding that wraps
1355
+ * on screen, could otherwise spell a counterfeit labelled row beside the real
1356
+ * one — the rule `.claude/rules/state-malformed-containers.md` states for
1357
+ * naming a target beside a labelled line (go-to-k/cdkd#3328,
1358
+ * go-to-k/cdkd#3759).
1359
+ */
1360
+ function plainOrDescribed(value, what) {
1361
+ return isPasteableIdent(value) ? value : `a ${what} that is not a plain identifier`;
1362
+ }
1363
+ /**
1364
+ * {@link plainOrDescribed} for a sentence that quotes the name: `'value'` when
1365
+ * `isPasteableIdent` admits it, otherwise the same description UNQUOTED, so the
1366
+ * prose never reads `'a stack name that is not a plain identifier'` as if that
1367
+ * were the name. A plain name's spelling is byte-identical to the literal
1368
+ * `'${value}'` it replaces, which `docs/design/459-nested-stacks.md` quotes.
1369
+ */
1370
+ function quotedOrDescribed(value, what) {
1371
+ return isPasteableIdent(value) ? `'${value}'` : plainOrDescribed(value, what);
1372
+ }
1373
+ /**
1352
1374
  * WHY a value must become a hole, or `undefined` when it may be NAMED.
1353
1375
  *
1354
1376
  * FIRST MATCH WINS, in the order written: `empty`, `altered`, `too-long`,
@@ -1466,7 +1488,7 @@ function pasteableCommand(verb, args = [], extraFlags = []) {
1466
1488
  * right thing, and substituting one arm's text for another's is exactly the
1467
1489
  * disagreement M11 closed.
1468
1490
  */
1469
- function withheldTargetClause(built, hole, verb) {
1491
+ function withheldTargetClause(built, hole, verb, subject = "This record's name") {
1470
1492
  const reason = built.withheld.find((w) => w.hole === hole)?.reason;
1471
1493
  if (reason === void 0) return "";
1472
1494
  let why;
@@ -1491,7 +1513,7 @@ function withheldTargetClause(built, hole, verb) {
1491
1513
  break;
1492
1514
  default: throw new Error(`withheldTargetClause: unhandled WithholdReason ${String(reason)}`);
1493
1515
  }
1494
- return ` This record's name ${why} — so it is not named in the command below; list the records as stored with 'cdkd state list --long' and act on the one whose key matches.`;
1516
+ return ` ${subject} ${why} — so it is not named in the command below; list the records as stored with 'cdkd state list --long' and act on the one whose key matches.`;
1495
1517
  }
1496
1518
 
1497
1519
  //#endregion
@@ -2007,11 +2029,15 @@ var ResourceUpdateNotSupportedError = class ResourceUpdateNotSupportedError exte
2007
2029
  var StackTerminationProtectionError = class StackTerminationProtectionError extends CdkdError {
2008
2030
  stackName;
2009
2031
  constructor(stackName, cause) {
2010
- super(`Stack '${stackName}' has terminationProtection: true and cannot be destroyed. Set terminationProtection: false in the CDK code, redeploy, then retry the destroy.\nRetry with: ${pasteableCommand("cdkd destroy", [{
2032
+ const retry = pasteableCommand("cdkd destroy", [{
2011
2033
  value: stackName,
2012
2034
  hole: "stack",
2013
- opts: { patternMatched: true }
2014
- }]).command}`, "STACK_TERMINATION_PROTECTION", cause);
2035
+ opts: {
2036
+ patternMatched: true,
2037
+ plainIdent: true
2038
+ }
2039
+ }]);
2040
+ super(`Stack ${quotedOrDescribed(stackName, "stack name")} has terminationProtection: true and cannot be destroyed. Set terminationProtection: false in the CDK code, redeploy, then retry the destroy.` + withheldTargetClause(retry, "stack", "cdkd destroy", "This stack's name") + `\nRetry with: ${retry.command}`, "STACK_TERMINATION_PROTECTION", cause);
2015
2041
  this.stackName = stackName;
2016
2042
  this.name = "StackTerminationProtectionError";
2017
2043
  Object.setPrototypeOf(this, StackTerminationProtectionError.prototype);
@@ -2056,17 +2082,24 @@ var NestedStackChildDirectDestroyError = class NestedStackChildDirectDestroyErro
2056
2082
  parentStack;
2057
2083
  parentLogicalId;
2058
2084
  constructor(stackName, parentStack, parentLogicalId, cause) {
2059
- const logicalIdSuffix = parentLogicalId ? ` (parent's logical id: ${parentLogicalId})` : "";
2060
- const cascadeCommand = pasteableCommand("cdkd destroy", [{
2085
+ const logicalIdSuffix = parentLogicalId ? ` (parent's logical id: ${plainOrDescribed(parentLogicalId, "logical id")})` : "";
2086
+ const cascade = pasteableCommand("cdkd destroy", [{
2061
2087
  value: parentStack,
2062
2088
  hole: "parent",
2063
- opts: { patternMatched: true }
2064
- }]).command;
2065
- const childDestroyCommand = pasteableCommand("cdkd state destroy", [{
2089
+ opts: {
2090
+ patternMatched: true,
2091
+ plainIdent: true
2092
+ }
2093
+ }]);
2094
+ const childDestroy = pasteableCommand("cdkd state destroy", [{
2066
2095
  value: stackName,
2067
- hole: "stack"
2068
- }]).command;
2069
- super(`Stack '${stackName}' is a nested child of '${parentStack}'${logicalIdSuffix}; directly destroying a nested stack is not supported. Either cascade-delete this child along with its parent, or destroy the child on its own — which deletes its AWS resources and its record, and leaves the parent's reference dangling (the synth-free escape hatch).\nCascade-delete with: ${cascadeCommand}\nDestroy the child alone with: ${childDestroyCommand}`, "NESTED_STACK_CHILD_DIRECT_DESTROY", cause);
2096
+ hole: "stack",
2097
+ opts: { plainIdent: true }
2098
+ }]);
2099
+ const withheld = withheldTargetClause(cascade, "parent", "cdkd destroy", "The parent stack's name") + withheldTargetClause(childDestroy, "stack", "cdkd state destroy", "The child stack's name");
2100
+ const child = quotedOrDescribed(stackName, "stack name");
2101
+ const parent = quotedOrDescribed(parentStack, "stack name");
2102
+ super(`Stack ${child} is a nested child of ${parent}${logicalIdSuffix}; directly destroying a nested stack is not supported. Either cascade-delete this child along with its parent, or destroy the child on its own — which deletes its AWS resources and its record, and leaves the parent's reference dangling (the synth-free escape hatch).${withheld}\nCascade-delete with: ${cascade.command}\nDestroy the child alone with: ${childDestroy.command}`, "NESTED_STACK_CHILD_DIRECT_DESTROY", cause);
2070
2103
  this.stackName = stackName;
2071
2104
  this.parentStack = parentStack;
2072
2105
  if (parentLogicalId !== void 0) this.parentLogicalId = parentLogicalId;
@@ -14978,7 +15011,13 @@ function recordedExpressionsOf(secrets) {
14978
15011
  * go-to-k/cdkd#3691: the writer's `credentialFingerprint`, which every reader
14979
15012
  * computes the same way from the clients it resolves with), written at the
14980
15013
  * moment the producer's outputs are redacted and read at the three cross-stack
14981
- * sites above. It answers only for a producer
15014
+ * sites above. The fingerprint covers only an EXPLICIT `profile` /
15015
+ * `accessKeyId`: a library caller that switches accounts through the
15016
+ * process-wide environment or default credential chain (e.g. `AWS_PROFILE`,
15017
+ * `AWS_ACCESS_KEY_ID`, the shared config file, web identity) with clients
15018
+ * carrying neither shares one identity key across those accounts — the same
15019
+ * boundary as the resolver's value caches (go-to-k/cdkd#3692). It answers
15020
+ * only for a producer
14982
15021
  * THIS PROCESS deployed in THIS run, which is exactly the population that has a
14983
15022
  * plaintext to hand back: a separate `cdkd deploy` of the consumer has none, and
14984
15023
  * that case is refused rather than guessed at.
@@ -20522,6 +20561,98 @@ async function withRetry(operation, logicalId, opts = {}) {
20522
20561
  throw lastError;
20523
20562
  }
20524
20563
 
20564
+ //#endregion
20565
+ //#region src/utils/concurrency-limiter.ts
20566
+ /** The rejection of a background task withdrawn by `cancel()`. */
20567
+ var BackgroundTaskCancelledError = class extends Error {
20568
+ constructor() {
20569
+ super("Background task cancelled");
20570
+ this.name = "BackgroundTaskCancelledError";
20571
+ }
20572
+ };
20573
+ function createConcurrencyLimiter(limit) {
20574
+ if (!Number.isInteger(limit) || limit < 1) throw new Error(`Concurrency limit must be a positive integer, got ${String(limit)}`);
20575
+ let active = 0;
20576
+ const queue = [];
20577
+ const insert = (entry) => {
20578
+ if (!entry.urgent) {
20579
+ queue.push(entry);
20580
+ return;
20581
+ }
20582
+ const firstBackground = queue.findIndex((e) => !e.urgent);
20583
+ if (firstBackground === -1) queue.push(entry);
20584
+ else queue.splice(firstBackground, 0, entry);
20585
+ };
20586
+ const drain = () => {
20587
+ while (active < limit && queue.length > 0) queue.shift().start();
20588
+ };
20589
+ return {
20590
+ schedule(task, options) {
20591
+ let resolveTask;
20592
+ let rejectTask;
20593
+ const promise = new Promise((resolve, reject) => {
20594
+ resolveTask = resolve;
20595
+ rejectTask = reject;
20596
+ });
20597
+ const controller = new AbortController();
20598
+ let settled = false;
20599
+ let released = false;
20600
+ const release = () => {
20601
+ if (released) return;
20602
+ released = true;
20603
+ active--;
20604
+ drain();
20605
+ };
20606
+ const entry = {
20607
+ urgent: options?.background !== true,
20608
+ start: () => {
20609
+ active++;
20610
+ Promise.resolve().then(() => task(controller.signal)).then((value) => {
20611
+ if (settled) return;
20612
+ settled = true;
20613
+ resolveTask(value);
20614
+ }, (error) => {
20615
+ if (settled) return;
20616
+ settled = true;
20617
+ rejectTask(error);
20618
+ }).finally(release);
20619
+ }
20620
+ };
20621
+ insert(entry);
20622
+ drain();
20623
+ return {
20624
+ promise,
20625
+ promote: () => {
20626
+ if (entry.urgent) return;
20627
+ entry.urgent = true;
20628
+ const index = queue.indexOf(entry);
20629
+ if (index === -1) return;
20630
+ queue.splice(index, 1);
20631
+ insert(entry);
20632
+ },
20633
+ cancel: () => {
20634
+ if (entry.urgent || settled) return false;
20635
+ settled = true;
20636
+ const index = queue.indexOf(entry);
20637
+ if (index !== -1) queue.splice(index, 1);
20638
+ else {
20639
+ controller.abort();
20640
+ release();
20641
+ }
20642
+ rejectTask(new BackgroundTaskCancelledError());
20643
+ return true;
20644
+ }
20645
+ };
20646
+ },
20647
+ get activeCount() {
20648
+ return active;
20649
+ },
20650
+ get pendingCount() {
20651
+ return queue.length;
20652
+ }
20653
+ };
20654
+ }
20655
+
20525
20656
  //#endregion
20526
20657
  //#region src/provisioning/describe-type.ts
20527
20658
  /**
@@ -20558,6 +20689,33 @@ const describeTypeRetryDelays = {};
20558
20689
  */
20559
20690
  const MAX_THROTTLE_RETRIES = 4;
20560
20691
  /**
20692
+ * Most `DescribeType` calls in flight at once, process-wide (issue #3718).
20693
+ *
20694
+ * The quota behaves as a RATE limit, not a concurrency one: measured in
20695
+ * us-east-1, a 30-call burst after idle drew no throttle, but 134 calls drew
20696
+ * throttles at 134 in parallel (45-61 across runs), at 20 (95) and even one at
20697
+ * a time (73).
20698
+ * So no cap makes a 134-type prefetch throttle-free. What the cap buys is
20699
+ * ordering: with at most 20 in flight, an awaited lookup (URGENT) is sent
20700
+ * ahead of queued prefetches instead of joining the back of an unbounded
20701
+ * burst — at the cost of up to one round trip (~0.2 s) for an awaited lookup
20702
+ * that arrives while the first 20 background calls hold every slot. Measured
20703
+ * on the same 134 types, the 5 lookups a diff awaited 300 ms
20704
+ * after the prefetch started took 18 s before and 0.65-0.8 s with the cap, and
20705
+ * lookups that exhausted their retries fell from 86-94 to 9-23. The price is a
20706
+ * longer tail for the prefetch as a whole (35 s -> 53-63 s), which nothing
20707
+ * waits on and which its owner cancels once done. 20 keeps enough calls
20708
+ * overlapped to spend the burst quickly.
20709
+ */
20710
+ const DESCRIBE_TYPE_MAX_IN_FLIGHT = 20;
20711
+ /**
20712
+ * ONE limiter for every DescribeType-backed resolver, since the throttle is
20713
+ * per account rather than per caller. A slot is held across the throttle
20714
+ * retries too: a throttled call backing off is exactly the moment to send
20715
+ * fewer, not more.
20716
+ */
20717
+ const describeTypeLimiter = createConcurrencyLimiter(20);
20718
+ /**
20561
20719
  * Issue `DescribeType` for a resource type, retrying throttle-shaped failures
20562
20720
  * with exponential backoff. Any other failure (or a throttle persisting past
20563
20721
  * the retry budget) is thrown to the caller unchanged.
@@ -20565,16 +20723,70 @@ const MAX_THROTTLE_RETRIES = 4;
20565
20723
  * `client` defaults to the shared `AwsClients.cloudFormation`; callers that
20566
20724
  * carry their own injected client (`cdkd export`'s primary-identifier
20567
20725
  * resolution) pass it so test doubles keep intercepting.
20726
+ *
20727
+ * The call waits for a slot of the shared limiter
20728
+ * ({@link DESCRIBE_TYPE_MAX_IN_FLIGHT}) as an URGENT task, ahead of any queued
20729
+ * prefetch.
20568
20730
  */
20569
20731
  function describeTypeWithThrottleRetry(resourceType, client) {
20570
- return withRetry(() => (client ?? getAwsClients().cloudFormation).send(new DescribeTypeCommand({
20571
- Type: "RESOURCE",
20572
- TypeName: resourceType
20573
- })), resourceType, {
20732
+ return scheduleDescribeType(resourceType, { ...client && { client } }).promise;
20733
+ }
20734
+ /**
20735
+ * {@link describeTypeWithThrottleRetry} with the scheduling handle exposed:
20736
+ * `background: true` queues the call behind every urgent one (a speculative
20737
+ * prefetch), `promote()` makes it urgent once a caller starts awaiting that
20738
+ * type, and `cancel()` withdraws it while it is still background.
20739
+ *
20740
+ * A BACKGROUND call must never hold the process open: its request carries the
20741
+ * task's `AbortSignal`, and its throttle backoff sleeps on an UNREF'd timer
20742
+ * that the same signal cuts short, so a cancelled prefetch settles at once and
20743
+ * an uncancelled one keeps a finished command alive no longer than one
20744
+ * in-flight round trip. An urgent call is sent exactly as before, its backoff
20745
+ * on a REF'd timer: the command is waiting on it.
20746
+ */
20747
+ function scheduleDescribeType(resourceType, options = {}) {
20748
+ const { client, background } = options;
20749
+ let cfn;
20750
+ let clientError;
20751
+ try {
20752
+ cfn = client ?? getAwsClients().cloudFormation;
20753
+ } catch (error) {
20754
+ clientError = error;
20755
+ }
20756
+ return describeTypeLimiter.schedule((signal) => withRetry(() => {
20757
+ if (cfn === void 0) throw clientError;
20758
+ const command = new DescribeTypeCommand({
20759
+ Type: "RESOURCE",
20760
+ TypeName: resourceType
20761
+ });
20762
+ return background ? cfn.send(command, { abortSignal: signal }) : cfn.send(command);
20763
+ }, resourceType, {
20574
20764
  maxRetries: MAX_THROTTLE_RETRIES,
20575
- isRetryable: (_message, error) => isThrottlingError(error),
20765
+ isRetryable: (_message, error) => !signal.aborted && isThrottlingError(error),
20576
20766
  logger: getLogger().child("DescribeType"),
20577
- ...describeTypeRetryDelays.sleep ? { sleep: describeTypeRetryDelays.sleep } : {}
20767
+ ...describeTypeRetryDelays.sleep ? { sleep: describeTypeRetryDelays.sleep } : background ? { sleep: (ms) => backgroundSleep(ms, signal) } : {}
20768
+ }), { background: background === true });
20769
+ }
20770
+ /**
20771
+ * The backoff sleep of a BACKGROUND call: an unref'd timer, so a pending
20772
+ * retry never keeps the event loop alive, rejected at once by `signal`.
20773
+ */
20774
+ function backgroundSleep(ms, signal) {
20775
+ return new Promise((resolve, reject) => {
20776
+ if (signal.aborted) {
20777
+ reject(/* @__PURE__ */ new Error("DescribeType prefetch cancelled"));
20778
+ return;
20779
+ }
20780
+ const timer = setTimeout(() => {
20781
+ signal.removeEventListener("abort", onAbort);
20782
+ resolve();
20783
+ }, ms);
20784
+ timer.unref?.();
20785
+ const onAbort = () => {
20786
+ clearTimeout(timer);
20787
+ reject(/* @__PURE__ */ new Error("DescribeType prefetch cancelled"));
20788
+ };
20789
+ signal.addEventListener("abort", onAbort, { once: true });
20578
20790
  });
20579
20791
  }
20580
20792
  /**
@@ -20603,39 +20815,565 @@ function hasNoRegistrySchema(resourceType) {
20603
20815
  }
20604
20816
 
20605
20817
  //#endregion
20606
- //#region src/provisioning/create-only-properties.ts
20818
+ //#region src/provisioning/create-only-paths.ts
20607
20819
  /**
20608
- * Create-only (immutable) property resolution for replacement detection.
20609
- *
20610
- * CloudFormation marks some properties "Update requires: Replacement" — the
20611
- * resource type's registry schema lists them under `createOnlyProperties`.
20612
- * Changing such a property cannot be an in-place UPDATE; CloudFormation
20613
- * transparently DELETE+CREATEs the resource. cdkd's diff classifier
20614
- * (`ReplacementRulesRegistry`) only knows the ~25 types with a hand-authored
20615
- * rule, so for every other type an immutable-property change was previously
20616
- * mis-classified as an in-place UPDATE (the provider's `update()` then either
20617
- * rejected it with a typed error — at best — or silently dropped it).
20618
- *
20619
- * This module resolves each resource type's `createOnlyProperties` from the
20620
- * CloudFormation registry schema via `cloudformation:DescribeType`, reduced to
20621
- * the TOP-LEVEL containing property names (a nested path like
20622
- * `/properties/Foo/Bar` strips to `Foo`) so the diff's top-level property keys
20623
- * match. The diff calculator consults it as a fallback for any property the
20624
- * registry does not explicitly classify, so a createOnly change on ANY type now
20625
- * correctly drives a replacement.
20626
- *
20627
- * Caching / failure semantics are identical to {@link
20628
- * ./write-only-properties.ts} (the sibling DescribeType-backed resolver): only
20629
- * SUCCESSFUL lookups are cached per resource type for the process (deploy)
20630
- * lifetime — `cloudformation:DescribeType` is throttled per-account and the
20631
- * schema cannot change mid-deploy. A FAILED lookup (missing IAM permission,
20632
- * transient throttle / 5xx) is logged as a warning and resolves to an empty set
20633
- * WITHOUT poisoning the cache, so the caller gracefully falls back to the
20634
- * registry-only classification for THIS resource while a later resource of the
20635
- * same type retries. A caller permanently without `cloudformation:DescribeType`
20636
- * simply keeps the pre-existing registry-only behavior — no regression.
20820
+ * The ONE parse of a registry schema's `createOnlyProperties` JSON pointers
20821
+ * into property paths (issue #3718).
20822
+ *
20823
+ * Shared by the live resolver (`create-only-properties.ts`, parsing a
20824
+ * `DescribeType` schema) and the fixture producer
20825
+ * (`scripts/refresh-cfn-schemas.mjs`, whose output is shipped as the offline
20826
+ * fallback). A second spelling would let the fallback disagree with the live
20827
+ * answer for the same schema. An import-free LEAF, so the `.mjs` producer can
20828
+ * load it under Node's type stripping.
20637
20829
  */
20638
20830
  /**
20831
+ * Parse `createOnlyProperties` into segment arrays after `/properties/` (e.g.
20832
+ * `['Name']`, `['SourceParameters', 'KinesisStreamParameters',
20833
+ * 'StartingPosition']`), in schema order.
20834
+ *
20835
+ * Full paths, not top-level reductions: the diff compares at the schema's own
20836
+ * granularity (issue #960). A non-array input or a non-string / non-
20837
+ * `/properties/` entry is skipped. Empty segments are dropped: a trailing slash
20838
+ * degrades to the (more conservative) whole-property path, and no real
20839
+ * registry schema names a property literally "" via an RFC 6901 empty segment.
20840
+ */
20841
+ function parseCreateOnlyPropertyPointers(createOnly) {
20842
+ const result = [];
20843
+ if (!Array.isArray(createOnly)) return result;
20844
+ for (const path of createOnly) {
20845
+ if (typeof path !== "string") continue;
20846
+ if (!path.startsWith("/properties/")) continue;
20847
+ const segments = path.slice(12).split("/").map(unescapeJsonPointerSegment$2).filter((segment) => segment.length > 0);
20848
+ if (segments.length > 0) result.push(segments);
20849
+ }
20850
+ return result;
20851
+ }
20852
+ /**
20853
+ * Unescape an RFC 6901 JSON Pointer segment (`~1` -> `/`, `~0` -> `~`).
20854
+ */
20855
+ function unescapeJsonPointerSegment$2(segment) {
20856
+ return segment.replace(/~1/g, "/").replace(/~0/g, "~");
20857
+ }
20858
+
20859
+ //#endregion
20860
+ //#region src/provisioning/create-only-snapshot.generated.ts
20861
+ /**
20862
+ * AUTO-GENERATED by scripts/gen-property-coverage.ts — DO NOT EDIT BY HAND.
20863
+ * Source: the `createOnlyPropertyPaths` of tests/fixtures/cfn-schemas/*.json.
20864
+ * Regenerate: `vp run gen:property-coverage`.
20865
+ *
20866
+ * cdkd's committed snapshot of each type's create-only property PATHS
20867
+ * (segment arrays after `/properties/`). `getCreateOnlyPropertyPaths`
20868
+ * resolves it ONLY when the live `cloudformation:DescribeType` lookup fails
20869
+ * (issue #3718): the live schema always wins when it can be read.
20870
+ */
20871
+ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
20872
+ ["AWS::ApiGateway::Account", []],
20873
+ ["AWS::ApiGateway::Authorizer", [["RestApiId"]]],
20874
+ ["AWS::ApiGateway::Deployment", [["DeploymentCanarySettings"], ["RestApiId"]]],
20875
+ ["AWS::ApiGateway::Method", [
20876
+ ["HttpMethod"],
20877
+ ["ResourceId"],
20878
+ ["RestApiId"]
20879
+ ]],
20880
+ ["AWS::ApiGateway::Resource", [
20881
+ ["ParentId"],
20882
+ ["PathPart"],
20883
+ ["RestApiId"]
20884
+ ]],
20885
+ ["AWS::ApiGateway::Stage", [["RestApiId"], ["StageName"]]],
20886
+ ["AWS::ApiGatewayV2::Api", [["ProtocolType"]]],
20887
+ ["AWS::ApiGatewayV2::Authorizer", [["ApiId"]]],
20888
+ ["AWS::ApiGatewayV2::Integration", [["ApiId"]]],
20889
+ ["AWS::ApiGatewayV2::Route", [["ApiId"]]],
20890
+ ["AWS::ApiGatewayV2::Stage", [["ApiId"], ["StageName"]]],
20891
+ ["AWS::AppSync::ApiKey", [["ApiId"]]],
20892
+ ["AWS::AppSync::DataSource", [["ApiId"], ["Name"]]],
20893
+ ["AWS::AppSync::GraphQLApi", []],
20894
+ ["AWS::AppSync::GraphQLSchema", [["ApiId"]]],
20895
+ ["AWS::AppSync::Resolver", [
20896
+ ["ApiId"],
20897
+ ["FieldName"],
20898
+ ["TypeName"]
20899
+ ]],
20900
+ ["AWS::AutoScaling::AutoScalingGroup", [["AutoScalingGroupName"], ["InstanceId"]]],
20901
+ ["AWS::BedrockAgentCore::Browser", []],
20902
+ ["AWS::BedrockAgentCore::CodeInterpreter", []],
20903
+ ["AWS::BedrockAgentCore::Evaluator", [["EvaluatorName"]]],
20904
+ ["AWS::BedrockAgentCore::Runtime", [["AgentRuntimeName"]]],
20905
+ ["AWS::Budgets::Budget", [["NotificationsWithSubscribers"]]],
20906
+ ["AWS::CertificateManager::Certificate", [
20907
+ ["CertificateAuthorityArn"],
20908
+ ["CertificateExport"],
20909
+ ["DomainName"],
20910
+ ["DomainValidationOptions"],
20911
+ ["KeyAlgorithm"],
20912
+ ["SubjectAlternativeNames"]
20913
+ ]],
20914
+ ["AWS::CloudFormation::Stack", [["StackName"]]],
20915
+ ["AWS::CloudFormation::WaitConditionHandle", []],
20916
+ ["AWS::CloudFront::CloudFrontOriginAccessIdentity", []],
20917
+ ["AWS::CloudFront::Distribution", []],
20918
+ ["AWS::CloudFront::OriginAccessControl", []],
20919
+ ["AWS::CloudTrail::Trail", [["TrailName"]]],
20920
+ ["AWS::CloudWatch::Alarm", [["AlarmName"]]],
20921
+ ["AWS::CloudWatch::AnomalyDetector", [
20922
+ ["Dimensions"],
20923
+ ["MetricCharacteristics"],
20924
+ ["MetricMathAnomalyDetector"],
20925
+ ["MetricName"],
20926
+ ["Namespace"],
20927
+ ["SingleMetricAnomalyDetector"],
20928
+ ["Stat"]
20929
+ ]],
20930
+ ["AWS::CodeBuild::Project", [["Name"]]],
20931
+ ["AWS::CodeCommit::Repository", []],
20932
+ ["AWS::Cognito::UserPool", []],
20933
+ ["AWS::DLM::LifecyclePolicy", []],
20934
+ ["AWS::DocDB::DBCluster", [
20935
+ ["AvailabilityZones"],
20936
+ ["DBClusterIdentifier"],
20937
+ ["DBSubnetGroupName"],
20938
+ ["KmsKeyId"],
20939
+ ["MasterUsername"],
20940
+ ["SnapshotIdentifier"],
20941
+ ["SourceDBClusterIdentifier"],
20942
+ ["StorageEncrypted"]
20943
+ ]],
20944
+ ["AWS::DocDB::DBInstance", [
20945
+ ["AvailabilityZone"],
20946
+ ["DBClusterIdentifier"],
20947
+ ["DBInstanceIdentifier"]
20948
+ ]],
20949
+ ["AWS::DocDB::DBSubnetGroup", [["DBSubnetGroupName"]]],
20950
+ ["AWS::DynamoDB::GlobalTable", [["TableName"]]],
20951
+ ["AWS::DynamoDB::Table", [["ImportSourceSpecification"], ["TableName"]]],
20952
+ ["AWS::EC2::EIP", [
20953
+ ["Address"],
20954
+ ["IpamPoolId"],
20955
+ ["NetworkBorderGroup"],
20956
+ ["TransferAddress"]
20957
+ ]],
20958
+ ["AWS::EC2::Instance", [
20959
+ ["AvailabilityZone"],
20960
+ ["CpuOptions"],
20961
+ ["ElasticGpuSpecifications"],
20962
+ ["ElasticInferenceAccelerators"],
20963
+ ["EnclaveOptions"],
20964
+ ["HibernationOptions"],
20965
+ ["HostResourceGroupArn"],
20966
+ ["ImageId"],
20967
+ ["Ipv6AddressCount"],
20968
+ ["Ipv6Addresses"],
20969
+ ["KeyName"],
20970
+ ["LaunchTemplate"],
20971
+ ["LicenseSpecifications"],
20972
+ ["NetworkInterfaces"],
20973
+ ["PlacementGroupName"],
20974
+ ["PrivateIpAddress"],
20975
+ ["SecurityGroups"],
20976
+ ["SubnetId"]
20977
+ ]],
20978
+ ["AWS::EC2::InternetGateway", []],
20979
+ ["AWS::EC2::NatGateway", [
20980
+ ["AllocationId"],
20981
+ ["AvailabilityMode"],
20982
+ ["ConnectivityType"],
20983
+ ["PrivateIpAddress"],
20984
+ ["SubnetId"],
20985
+ ["VpcId"]
20986
+ ]],
20987
+ ["AWS::EC2::NetworkAcl", [["VpcId"]]],
20988
+ ["AWS::EC2::NetworkAclEntry", [
20989
+ ["Egress"],
20990
+ ["NetworkAclId"],
20991
+ ["RuleNumber"]
20992
+ ]],
20993
+ ["AWS::EC2::Route", [
20994
+ ["DestinationCidrBlock"],
20995
+ ["DestinationIpv6CidrBlock"],
20996
+ ["DestinationPrefixListId"],
20997
+ ["RouteTableId"]
20998
+ ]],
20999
+ ["AWS::EC2::RouteTable", [["VpcId"]]],
21000
+ ["AWS::EC2::SecurityGroup", [
21001
+ ["GroupDescription"],
21002
+ ["GroupName"],
21003
+ ["VpcId"]
21004
+ ]],
21005
+ ["AWS::EC2::SecurityGroupIngress", [
21006
+ ["CidrIp"],
21007
+ ["CidrIpv6"],
21008
+ ["FromPort"],
21009
+ ["GroupId"],
21010
+ ["GroupName"],
21011
+ ["IpProtocol"],
21012
+ ["SourcePrefixListId"],
21013
+ ["SourceSecurityGroupId"],
21014
+ ["SourceSecurityGroupName"],
21015
+ ["SourceSecurityGroupOwnerId"],
21016
+ ["ToPort"]
21017
+ ]],
21018
+ ["AWS::EC2::Subnet", [
21019
+ ["AvailabilityZone"],
21020
+ ["AvailabilityZoneId"],
21021
+ ["CidrBlock"],
21022
+ ["Ipv4IpamPoolId"],
21023
+ ["Ipv4NetmaskLength"],
21024
+ ["Ipv6IpamPoolId"],
21025
+ ["Ipv6Native"],
21026
+ ["Ipv6NetmaskLength"],
21027
+ ["OutpostArn"],
21028
+ ["VpcId"]
21029
+ ]],
21030
+ ["AWS::EC2::SubnetNetworkAclAssociation", [["NetworkAclId"], ["SubnetId"]]],
21031
+ ["AWS::EC2::SubnetRouteTableAssociation", [["RouteTableId"], ["SubnetId"]]],
21032
+ ["AWS::EC2::VPC", [
21033
+ ["CidrBlock"],
21034
+ ["Ipv4IpamPoolId"],
21035
+ ["Ipv4NetmaskLength"],
21036
+ ["VpcEncryptionControl"]
21037
+ ]],
21038
+ ["AWS::EC2::VPCGatewayAttachment", [["VpcId"]]],
21039
+ ["AWS::ECR::Repository", [
21040
+ ["EncryptionConfiguration"],
21041
+ ["EncryptionConfiguration", "EncryptionType"],
21042
+ ["EncryptionConfiguration", "KmsKey"],
21043
+ ["RepositoryName"]
21044
+ ]],
21045
+ ["AWS::ECS::Cluster", [["ClusterName"]]],
21046
+ ["AWS::ECS::Service", [
21047
+ ["Cluster"],
21048
+ ["Role"],
21049
+ ["SchedulingStrategy"],
21050
+ ["ServiceName"]
21051
+ ]],
21052
+ ["AWS::ECS::TaskDefinition", [
21053
+ ["ContainerDefinitions"],
21054
+ ["Cpu"],
21055
+ ["EnableFaultInjection"],
21056
+ ["EphemeralStorage"],
21057
+ ["ExecutionRoleArn"],
21058
+ ["Family"],
21059
+ ["InferenceAccelerators"],
21060
+ ["IpcMode"],
21061
+ ["Memory"],
21062
+ ["NetworkMode"],
21063
+ ["PidMode"],
21064
+ ["PlacementConstraints"],
21065
+ ["ProxyConfiguration"],
21066
+ ["RequiresCompatibilities"],
21067
+ ["RuntimePlatform"],
21068
+ ["TaskRoleArn"],
21069
+ ["Volumes"]
21070
+ ]],
21071
+ ["AWS::EFS::AccessPoint", [
21072
+ ["ClientToken"],
21073
+ ["CreationInfo"],
21074
+ ["CreationInfo", "OwnerGid"],
21075
+ ["CreationInfo", "OwnerUid"],
21076
+ ["CreationInfo", "Permissions"],
21077
+ ["FileSystemId"],
21078
+ ["PosixUser"],
21079
+ ["PosixUser", "Gid"],
21080
+ ["PosixUser", "SecondaryGids"],
21081
+ ["PosixUser", "Uid"],
21082
+ ["RootDirectory"],
21083
+ ["RootDirectory", "CreationInfo"],
21084
+ ["RootDirectory", "Path"]
21085
+ ]],
21086
+ ["AWS::EFS::FileSystem", [
21087
+ ["AvailabilityZoneName"],
21088
+ ["Encrypted"],
21089
+ ["KmsKeyId"],
21090
+ ["PerformanceMode"]
21091
+ ]],
21092
+ ["AWS::EFS::MountTarget", [
21093
+ ["FileSystemId"],
21094
+ ["IpAddress"],
21095
+ ["IpAddressType"],
21096
+ ["Ipv6Address"],
21097
+ ["SubnetId"]
21098
+ ]],
21099
+ ["AWS::ElastiCache::CacheCluster", [
21100
+ ["CacheSubnetGroupName"],
21101
+ ["ClusterName"],
21102
+ ["Engine"],
21103
+ ["NetworkType"],
21104
+ ["Port"],
21105
+ ["SnapshotArns"],
21106
+ ["SnapshotName"]
21107
+ ]],
21108
+ ["AWS::ElastiCache::SubnetGroup", [["CacheSubnetGroupName"]]],
21109
+ ["AWS::ElasticLoadBalancingV2::Listener", [["LoadBalancerArn"]]],
21110
+ ["AWS::ElasticLoadBalancingV2::LoadBalancer", [
21111
+ ["Name"],
21112
+ ["Scheme"],
21113
+ ["Type"]
21114
+ ]],
21115
+ ["AWS::ElasticLoadBalancingV2::TargetGroup", [
21116
+ ["IpAddressType"],
21117
+ ["Name"],
21118
+ ["Port"],
21119
+ ["Protocol"],
21120
+ ["ProtocolVersion"],
21121
+ ["TargetType"],
21122
+ ["VpcId"]
21123
+ ]],
21124
+ ["AWS::EMR::Cluster", [
21125
+ ["AdditionalInfo"],
21126
+ ["Applications"],
21127
+ ["AutoScalingRole"],
21128
+ ["BootstrapActions"],
21129
+ ["Configurations"],
21130
+ ["CustomAmiId"],
21131
+ ["EbsRootVolumeIops"],
21132
+ ["EbsRootVolumeSize"],
21133
+ ["EbsRootVolumeThroughput"],
21134
+ ["JobFlowRole"],
21135
+ ["KerberosAttributes"],
21136
+ ["LogEncryptionKmsKeyId"],
21137
+ ["LogUri"],
21138
+ ["Name"],
21139
+ ["OSReleaseLabel"],
21140
+ ["PlacementGroupConfigs"],
21141
+ ["ReleaseLabel"],
21142
+ ["ScaleDownBehavior"],
21143
+ ["SecurityConfiguration"],
21144
+ ["ServiceRole"],
21145
+ ["Steps"]
21146
+ ]],
21147
+ ["AWS::EMR::InstanceFleetConfig", [
21148
+ ["ClusterId"],
21149
+ ["InstanceFleetType"],
21150
+ ["LaunchSpecifications"],
21151
+ ["Name"]
21152
+ ]],
21153
+ ["AWS::EMR::InstanceGroupConfig", [
21154
+ ["BidPrice"],
21155
+ ["Configurations"],
21156
+ ["CustomAmiId"],
21157
+ ["EbsConfiguration"],
21158
+ ["InstanceRole"],
21159
+ ["InstanceType"],
21160
+ ["JobFlowId"],
21161
+ ["Market"],
21162
+ ["Name"]
21163
+ ]],
21164
+ ["AWS::Events::EventBus", [["Name"]]],
21165
+ ["AWS::Events::Rule", [["Name"]]],
21166
+ ["AWS::FSx::FileSystem", [
21167
+ ["BackupId"],
21168
+ ["FileSystemType"],
21169
+ ["KmsKeyId"],
21170
+ ["SecurityGroupIds"],
21171
+ ["SubnetIds"]
21172
+ ]],
21173
+ ["AWS::Glue::Connection", [["CatalogId"], ["ConnectionInput", "Name"]]],
21174
+ ["AWS::Glue::Crawler", [["Name"]]],
21175
+ ["AWS::Glue::Database", [["DatabaseName"]]],
21176
+ ["AWS::Glue::Job", [["Name"]]],
21177
+ ["AWS::Glue::SecurityConfiguration", [["Name"]]],
21178
+ ["AWS::Glue::Table", [
21179
+ ["CatalogId"],
21180
+ ["DatabaseName"],
21181
+ ["Name"]
21182
+ ]],
21183
+ ["AWS::Glue::Trigger", [
21184
+ ["Name"],
21185
+ ["Type"],
21186
+ ["WorkflowName"]
21187
+ ]],
21188
+ ["AWS::Glue::Workflow", [["Name"]]],
21189
+ ["AWS::IAM::AccessKey", [["Serial"], ["UserName"]]],
21190
+ ["AWS::IAM::Group", [["GroupName"]]],
21191
+ ["AWS::IAM::InstanceProfile", [["InstanceProfileName"], ["Path"]]],
21192
+ ["AWS::IAM::ManagedPolicy", [
21193
+ ["Description"],
21194
+ ["ManagedPolicyName"],
21195
+ ["Path"]
21196
+ ]],
21197
+ ["AWS::IAM::Policy", []],
21198
+ ["AWS::IAM::Role", [["Path"], ["RoleName"]]],
21199
+ ["AWS::IAM::User", [["UserName"]]],
21200
+ ["AWS::IAM::UserToGroupAddition", []],
21201
+ ["AWS::Kinesis::Stream", [["Name"]]],
21202
+ ["AWS::Kinesis::StreamConsumer", [
21203
+ ["ConsumerName"],
21204
+ ["StreamARN"],
21205
+ ["Tags"]
21206
+ ]],
21207
+ ["AWS::KinesisFirehose::DeliveryStream", [
21208
+ ["AmazonOpenSearchServerlessDestinationConfiguration", "VpcConfiguration"],
21209
+ ["AmazonopensearchserviceDestinationConfiguration", "VpcConfiguration"],
21210
+ ["DatabaseSourceConfiguration"],
21211
+ ["DeliveryStreamName"],
21212
+ ["DeliveryStreamType"],
21213
+ ["DirectPutSourceConfiguration"],
21214
+ ["ElasticsearchDestinationConfiguration", "VpcConfiguration"],
21215
+ ["IcebergDestinationConfiguration", "CatalogConfiguration"],
21216
+ ["KinesisStreamSourceConfiguration"],
21217
+ ["MSKSourceConfiguration"],
21218
+ ["SnowflakeDestinationConfiguration", "SnowflakeVpcConfiguration"]
21219
+ ]],
21220
+ ["AWS::KMS::Alias", [["AliasName"]]],
21221
+ ["AWS::KMS::Key", []],
21222
+ ["AWS::Lambda::EventInvokeConfig", [["FunctionName"], ["Qualifier"]]],
21223
+ ["AWS::Lambda::EventSourceMapping", [
21224
+ ["EventSourceArn"],
21225
+ ["SelfManagedEventSource"],
21226
+ ["StartingPosition"],
21227
+ ["StartingPositionTimestamp"]
21228
+ ]],
21229
+ ["AWS::Lambda::Function", [
21230
+ ["FunctionName"],
21231
+ ["PackageType"],
21232
+ ["TenancyConfig"]
21233
+ ]],
21234
+ ["AWS::Lambda::LayerVersion", [
21235
+ ["CompatibleArchitectures"],
21236
+ ["CompatibleRuntimes"],
21237
+ ["Content"],
21238
+ ["Description"],
21239
+ ["LayerName"],
21240
+ ["LicenseInfo"]
21241
+ ]],
21242
+ ["AWS::Lambda::MicrovmImage", [["Name"]]],
21243
+ ["AWS::Lambda::Permission", [
21244
+ ["Action"],
21245
+ ["EventSourceToken"],
21246
+ ["FunctionName"],
21247
+ ["FunctionUrlAuthType"],
21248
+ ["InvokedViaFunctionUrl"],
21249
+ ["Principal"],
21250
+ ["PrincipalOrgID"],
21251
+ ["SourceAccount"],
21252
+ ["SourceArn"]
21253
+ ]],
21254
+ ["AWS::Lambda::Url", [["Qualifier"], ["TargetFunctionArn"]]],
21255
+ ["AWS::Logs::LogGroup", [["LogGroupName"]]],
21256
+ ["AWS::Neptune::DBCluster", [
21257
+ ["AvailabilityZones"],
21258
+ ["DBClusterIdentifier"],
21259
+ ["DBSubnetGroupName"],
21260
+ ["GlobalClusterIdentifier"],
21261
+ ["KmsKeyId"],
21262
+ ["RestoreToTime"],
21263
+ ["RestoreType"],
21264
+ ["SnapshotIdentifier"],
21265
+ ["SourceDBClusterIdentifier"],
21266
+ ["StorageEncrypted"],
21267
+ ["UseLatestRestorableTime"]
21268
+ ]],
21269
+ ["AWS::Neptune::DBInstance", [
21270
+ ["AvailabilityZone"],
21271
+ ["DBClusterIdentifier"],
21272
+ ["DBInstanceIdentifier"],
21273
+ ["DBSnapshotIdentifier"],
21274
+ ["DBSubnetGroupName"]
21275
+ ]],
21276
+ ["AWS::Neptune::DBSubnetGroup", [["DBSubnetGroupName"]]],
21277
+ ["AWS::RDS::DBCluster", [
21278
+ ["ClusterScalabilityType"],
21279
+ ["DBClusterIdentifier"],
21280
+ ["DBSubnetGroupName"],
21281
+ ["DBSystemId"],
21282
+ ["DatabaseName"],
21283
+ ["EngineMode"],
21284
+ ["KmsKeyId"],
21285
+ ["PubliclyAccessible"],
21286
+ ["RestoreToTime"],
21287
+ ["RestoreType"],
21288
+ ["SnapshotIdentifier"],
21289
+ ["SourceDBClusterIdentifier"],
21290
+ ["SourceDbClusterResourceId"],
21291
+ ["SourceRegion"],
21292
+ ["StorageEncrypted"],
21293
+ ["UseLatestRestorableTime"]
21294
+ ]],
21295
+ ["AWS::RDS::DBInstance", [
21296
+ ["BackupTarget"],
21297
+ ["CharacterSetName"],
21298
+ ["CustomIAMInstanceProfile"],
21299
+ ["DBClusterIdentifier"],
21300
+ ["DBInstanceIdentifier"],
21301
+ ["DBName"],
21302
+ ["DBSubnetGroupName"],
21303
+ ["DBSystemId"],
21304
+ ["KmsKeyId"],
21305
+ ["MasterUsername"],
21306
+ ["NcharCharacterSetName"],
21307
+ ["SourceRegion"],
21308
+ ["StorageEncrypted"],
21309
+ ["Timezone"]
21310
+ ]],
21311
+ ["AWS::RDS::DBProxy", [
21312
+ ["DBProxyName"],
21313
+ ["EndpointNetworkType"],
21314
+ ["EngineFamily"],
21315
+ ["TargetConnectionNetworkType"],
21316
+ ["VpcSubnetIds"]
21317
+ ]],
21318
+ ["AWS::RDS::DBProxyEndpoint", [
21319
+ ["DBProxyEndpointName"],
21320
+ ["DBProxyName"],
21321
+ ["EndpointNetworkType"],
21322
+ ["VpcSubnetIds"]
21323
+ ]],
21324
+ ["AWS::RDS::DBProxyTargetGroup", [["DBProxyName"], ["TargetGroupName"]]],
21325
+ ["AWS::RDS::DBSubnetGroup", [["DBSubnetGroupName"]]],
21326
+ ["AWS::Route53::HostedZone", [["Name"]]],
21327
+ ["AWS::Route53::RecordSet", [["HostedZoneId"], ["HostedZoneName"]]],
21328
+ ["AWS::S3::Bucket", [
21329
+ ["BucketName"],
21330
+ ["BucketNamePrefix"],
21331
+ ["BucketNamespace"]
21332
+ ]],
21333
+ ["AWS::S3::BucketPolicy", [["Bucket"]]],
21334
+ ["AWS::S3Express::DirectoryBucket", [
21335
+ ["BucketName"],
21336
+ ["DataRedundancy"],
21337
+ ["LocationName"]
21338
+ ]],
21339
+ ["AWS::S3Tables::Namespace", [["Namespace"], ["TableBucketARN"]]],
21340
+ ["AWS::S3Tables::Table", [
21341
+ ["IcebergMetadata"],
21342
+ ["OpenTableFormat"],
21343
+ ["StorageClassConfiguration"],
21344
+ ["TableBucketARN"],
21345
+ ["WithoutMetadata"]
21346
+ ]],
21347
+ ["AWS::S3Tables::TableBucket", [["TableBucketName"]]],
21348
+ ["AWS::S3Vectors::VectorBucket", [["EncryptionConfiguration"], ["VectorBucketName"]]],
21349
+ ["AWS::Scheduler::Schedule", [["Name"]]],
21350
+ ["AWS::SecretsManager::Secret", [["Name"]]],
21351
+ ["AWS::ServiceDiscovery::HttpNamespace", [["Name"]]],
21352
+ ["AWS::ServiceDiscovery::PrivateDnsNamespace", [["Name"], ["Vpc"]]],
21353
+ ["AWS::ServiceDiscovery::PublicDnsNamespace", [["Name"]]],
21354
+ ["AWS::ServiceDiscovery::Service", [
21355
+ ["HealthCheckCustomConfig"],
21356
+ ["Name"],
21357
+ ["NamespaceId"],
21358
+ ["Type"]
21359
+ ]],
21360
+ ["AWS::SNS::Subscription", [
21361
+ ["Endpoint"],
21362
+ ["Protocol"],
21363
+ ["TopicArn"]
21364
+ ]],
21365
+ ["AWS::SNS::Topic", [["FifoTopic"], ["TopicName"]]],
21366
+ ["AWS::SNS::TopicPolicy", []],
21367
+ ["AWS::SQS::Queue", [["FifoQueue"], ["QueueName"]]],
21368
+ ["AWS::SQS::QueuePolicy", []],
21369
+ ["AWS::SSM::Parameter", [["Name"]]],
21370
+ ["AWS::StepFunctions::StateMachine", [["StateMachineName"], ["StateMachineType"]]],
21371
+ ["AWS::WAFv2::WebACL", [["Name"], ["Scope"]]]
21372
+ ]);
21373
+
21374
+ //#endregion
21375
+ //#region src/provisioning/create-only-properties.ts
21376
+ /**
20639
21377
  * Per-type cache of SUCCESSFUL lookups only. The value is the in-flight (or
20640
21378
  * settled) promise so concurrent diffs of the same resource type share a
20641
21379
  * single DescribeType call. A failed lookup removes its own entry so a later
@@ -20643,6 +21381,13 @@ function hasNoRegistrySchema(resourceType) {
20643
21381
  */
20644
21382
  const createOnlyPropertiesCache = /* @__PURE__ */ new Map();
20645
21383
  /**
21384
+ * The scheduling handle of each lookup still IN FLIGHT, so an awaited lookup
21385
+ * of a type a prefetch already queued promotes that one call instead of
21386
+ * issuing a second one, and a prefetch's `cancel()` can withdraw the calls it
21387
+ * started (issue #3718).
21388
+ */
21389
+ const inFlightLookups = /* @__PURE__ */ new Map();
21390
+ /**
20646
21391
  * Resolve the create-only (immutable) property PATHS for a resource type,
20647
21392
  * each as the segment array after `/properties/` (e.g.
20648
21393
  * `['Name']`, `['SourceParameters', 'KinesisStreamParameters',
@@ -20657,25 +21402,103 @@ const createOnlyPropertiesCache = /* @__PURE__ */ new Map();
20657
21402
  * consults {@link createOnlyChangeRequiresReplacement} to compare at the
20658
21403
  * schema's actual path granularity.
20659
21404
  *
20660
- * Never throws: a DescribeType failure logs a warning and resolves to an empty
20661
- * list (graceful fallback to the registry-only classification). Only SUCCESSFUL
20662
- * lookups are cached per resource type for the process lifetime; a failed
20663
- * lookup is NOT cached, so a later call for the same type retries DescribeType
20664
- * (a transient throttle must not poison the deploy's replacement detection).
21405
+ * Never throws: a DescribeType failure logs a warning and resolves to the
21406
+ * committed snapshot's paths for the type, or to an empty list for a type
21407
+ * with no snapshot (graceful fallback to the registry-only classification).
21408
+ * Only SUCCESSFUL lookups are cached per resource type for the process
21409
+ * lifetime; a failed lookup is NOT cached, so a later call for the same type
21410
+ * retries DescribeType (a transient throttle must not pin the deploy to the
21411
+ * snapshot).
21412
+ *
21413
+ * The call is an URGENT DescribeType: it waits only behind other urgent ones,
21414
+ * never behind a queued {@link prefetchCreateOnlyPropertyPaths}, and awaiting
21415
+ * a type a prefetch already queued promotes that queued call.
20665
21416
  */
20666
21417
  function getCreateOnlyPropertyPaths(resourceType) {
21418
+ return lookupCreateOnlyPropertyPaths(resourceType, false);
21419
+ }
21420
+ /**
21421
+ * Warm the cache for each of `resourceTypes` without waiting (issue #1180),
21422
+ * as BACKGROUND DescribeType calls behind every awaited lookup (issue #3718).
21423
+ * Duplicates and schema-less types are skipped; it never throws and never
21424
+ * leaves an unhandled rejection.
21425
+ *
21426
+ * The prefetch is purely opportunistic, so its owner MUST `cancel()` it when
21427
+ * the work it was warming for is done: an unfinished background lookup (a
21428
+ * throttle backoff can run to ~15 s) must never delay a command's completion.
21429
+ * The handle is per call, so a nested-stack child engine cancelling its own
21430
+ * prefetch cannot withdraw its parent's.
21431
+ */
21432
+ function prefetchCreateOnlyPropertyPaths(resourceTypes) {
21433
+ const started = [];
21434
+ for (const type of new Set(resourceTypes)) {
21435
+ if (hasNoRegistrySchema(type) || createOnlyPropertiesCache.has(type)) continue;
21436
+ lookupCreateOnlyPropertyPaths(type, true).catch(() => {});
21437
+ const lookup = inFlightLookups.get(type);
21438
+ if (lookup) started.push([type, lookup]);
21439
+ }
21440
+ return { cancel: () => {
21441
+ for (const [type, lookup] of started.splice(0).reverse()) {
21442
+ if (inFlightLookups.get(type) !== lookup || !lookup.scheduled.cancel()) continue;
21443
+ inFlightLookups.delete(type);
21444
+ createOnlyPropertiesCache.delete(type);
21445
+ }
21446
+ } };
21447
+ }
21448
+ /**
21449
+ * The distinct resource types of a template's `Resources`, for
21450
+ * {@link prefetchCreateOnlyPropertyPaths}. Tolerates a missing or malformed
21451
+ * section (the prefetch must never be the thing that throws).
21452
+ */
21453
+ function templateResourceTypes(resources) {
21454
+ if (resources === null || typeof resources !== "object") return [];
21455
+ const types = /* @__PURE__ */ new Set();
21456
+ for (const resource of Object.values(resources)) {
21457
+ if (resource === null || typeof resource !== "object") continue;
21458
+ const type = resource.Type;
21459
+ if (typeof type === "string") types.add(type);
21460
+ }
21461
+ return [...types];
21462
+ }
21463
+ function lookupCreateOnlyPropertyPaths(resourceType, background) {
20667
21464
  if (hasNoRegistrySchema(resourceType)) return Promise.resolve([]);
20668
21465
  const cached = createOnlyPropertiesCache.get(resourceType);
20669
- if (cached) return cached;
20670
- const entry = fetchCreateOnlyPropertyPaths(resourceType).catch((error) => {
20671
- createOnlyPropertiesCache.delete(resourceType);
20672
- const message = describeAwsFailure(error).detail;
20673
- getLogger().child("CreateOnlyProperties").warn(`Failed to resolve create-only properties for ${resourceType} via cloudformation:DescribeType (${message}). Falling back to the registry-only replacement classification for this resource — an immutable-property change may be mis-classified as an in-place update. Grant cloudformation:DescribeType to enable schema-driven replacement detection.`);
20674
- return [];
21466
+ if (cached) {
21467
+ const inFlight = inFlightLookups.get(resourceType);
21468
+ if (!background && inFlight) {
21469
+ inFlight.awaited = true;
21470
+ inFlight.scheduled.promote();
21471
+ }
21472
+ return cached;
21473
+ }
21474
+ const scheduled = scheduleDescribeType(resourceType, { background });
21475
+ const lookup = {
21476
+ scheduled,
21477
+ awaited: !background
21478
+ };
21479
+ inFlightLookups.set(resourceType, lookup);
21480
+ const entry = scheduled.promise.then((response) => parseCreateOnlyResponse(resourceType, response.Schema)).catch((error) => {
21481
+ if (error instanceof BackgroundTaskCancelledError) return [];
21482
+ if (createOnlyPropertiesCache.get(resourceType) === entry) createOnlyPropertiesCache.delete(resourceType);
21483
+ return fallBackToSnapshot(resourceType, error, lookup.awaited);
21484
+ }).finally(() => {
21485
+ if (inFlightLookups.get(resourceType) === lookup) inFlightLookups.delete(resourceType);
20675
21486
  });
20676
21487
  createOnlyPropertiesCache.set(resourceType, entry);
20677
21488
  return entry;
20678
21489
  }
21490
+ function fallBackToSnapshot(resourceType, error, awaited) {
21491
+ const message = describeAwsFailure(error).detail;
21492
+ const child = getLogger().child("CreateOnlyProperties");
21493
+ const report = (line) => awaited ? child.warn(line) : child.debug(line);
21494
+ const snapshot = CREATE_ONLY_PATHS_SNAPSHOT.get(resourceType);
21495
+ if (snapshot) {
21496
+ report(`Failed to resolve create-only properties for ${resourceType} via cloudformation:DescribeType (${message}). Falling back to cdkd's bundled schema snapshot for this resource — it can lag AWS's current schema, so a property AWS has since made updatable may be classified as a replacement. Grant cloudformation:DescribeType to use the live schema.`);
21497
+ return snapshot;
21498
+ }
21499
+ report(`Failed to resolve create-only properties for ${resourceType} via cloudformation:DescribeType (${message}). Falling back to the registry-only replacement classification for this resource — an immutable-property change may be mis-classified as an in-place update. Grant cloudformation:DescribeType to enable schema-driven replacement detection.`);
21500
+ return [];
21501
+ }
20679
21502
  /**
20680
21503
  * Decide whether a change to top-level property `topLevelKey` requires
20681
21504
  * replacement per the schema's createOnly paths.
@@ -20743,32 +21566,19 @@ function isIntrinsicShaped(value) {
20743
21566
  return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
20744
21567
  }
20745
21568
  /**
20746
- * Fetch + parse the type's create-only property paths. THROWS on a
20747
- * DescribeType failure — the caller ({@link getCreateOnlyPropertyPaths})
20748
- * catches, warns, and declines to cache so the lookup can be retried later.
21569
+ * Parse a DescribeType response's schema into create-only paths.
21570
+ *
21571
+ * A response without a Schema (e.g. a still-registering / private type, or a
21572
+ * type with no CFn registry schema) carries no createOnlyProperties to
21573
+ * extract; treat it as "none" without a warning — it is a successful,
21574
+ * cacheable lookup, not a failure. A Schema that is not JSON THROWS, which the
21575
+ * caller handles as a failed lookup.
20749
21576
  */
20750
- async function fetchCreateOnlyPropertyPaths(resourceType) {
20751
- const logger = getLogger().child("CreateOnlyProperties");
20752
- const response = await describeTypeWithThrottleRetry(resourceType);
20753
- const result = [];
20754
- if (response.Schema) {
20755
- const createOnly = JSON.parse(response.Schema).createOnlyProperties;
20756
- if (Array.isArray(createOnly)) for (const path of createOnly) {
20757
- if (typeof path !== "string") continue;
20758
- if (!path.startsWith("/properties/")) continue;
20759
- const segments = path.slice(12).split("/").map(unescapeJsonPointerSegment$2).filter((segment) => segment.length > 0);
20760
- if (segments.length > 0) result.push(segments);
20761
- }
20762
- }
20763
- logger.debug(`Resolved ${result.length} create-only property paths for ${resourceType}` + (result.length > 0 ? `: ${result.map((p) => p.join(".")).join(", ")}` : ""));
21577
+ function parseCreateOnlyResponse(resourceType, schema) {
21578
+ const result = schema ? parseCreateOnlyPropertyPointers(JSON.parse(schema).createOnlyProperties) : [];
21579
+ getLogger().child("CreateOnlyProperties").debug(`Resolved ${result.length} create-only property paths for ${resourceType}` + (result.length > 0 ? `: ${result.map((p) => p.join(".")).join(", ")}` : ""));
20764
21580
  return result;
20765
21581
  }
20766
- /**
20767
- * Unescape an RFC 6901 JSON Pointer segment (`~1` -> `/`, `~0` -> `~`).
20768
- */
20769
- function unescapeJsonPointerSegment$2(segment) {
20770
- return segment.replace(/~1/g, "/").replace(/~0/g, "~");
20771
- }
20772
21582
 
20773
21583
  //#endregion
20774
21584
  //#region src/provisioning/property-coverage.generated.ts
@@ -33973,8 +34783,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33973
34783
  const variables = Object.create(null);
33974
34784
  const variableTwins = Object.create(null);
33975
34785
  const variablePasses = Object.create(null);
34786
+ const subTemplateKind = (value) => value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
33976
34787
  if (Array.isArray(subArgs)) {
33977
34788
  const [templateString, variableMap] = subArgs;
34789
+ if (typeof templateString !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Sub: the first element must be a string, got ${subTemplateKind(templateString)}`));
33978
34790
  template = templateString;
33979
34791
  if (typeof variableMap !== "object" || variableMap === null) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Sub: the second element must be a variable map, got ${variableMap === null ? "null" : typeof variableMap}`));
33980
34792
  for (const [key, val] of Object.entries(variableMap)) if (typeof val === "string") {
@@ -33988,7 +34800,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33988
34800
  variableTwins[key] = resolved.twin;
33989
34801
  variablePasses[key] = resolved;
33990
34802
  } else variables[key] = context.abandonedResolutions === void 0 ? await this.resolveValue(val, context) : await this.resolveKeyUnit(key, val, context, context.abandonedResolutions);
33991
- } else template = subArgs;
34803
+ } else {
34804
+ if (typeof subArgs !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Sub: the template must be a string, got ${subTemplateKind(subArgs)}`));
34805
+ template = subArgs;
34806
+ }
33992
34807
  const replacements = [];
33993
34808
  const matches = template.matchAll(/\$\{(!)?([^}]*)\}/g);
33994
34809
  for (const match of matches) {
@@ -34014,10 +34829,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
34014
34829
  let replacement;
34015
34830
  let twinReplacement;
34016
34831
  let pass;
34017
- if (varNameStr in variables) {
34832
+ if (Object.hasOwn(variables, varNameStr)) {
34018
34833
  replacement = String(variables[varNameStr]);
34019
- twinReplacement = varNameStr in variableTwins ? variableTwins[varNameStr] : this.productLogTwin(variables[varNameStr], context);
34020
- if (varNameStr in variablePasses) pass = variablePasses[varNameStr];
34834
+ twinReplacement = Object.hasOwn(variableTwins, varNameStr) ? variableTwins[varNameStr] : this.productLogTwin(variables[varNameStr], context);
34835
+ if (Object.hasOwn(variablePasses, varNameStr)) pass = variablePasses[varNameStr];
34021
34836
  } else {
34022
34837
  const pseudoValue = await this.resolvePseudoParameter(varNameStr, context);
34023
34838
  if (pseudoValue !== void 0) replacement = String(pseudoValue);
@@ -38294,7 +39109,7 @@ var CloudControlProvider = class {
38294
39109
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
38295
39110
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
38296
39111
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
38297
- const { ASGProvider } = await import("./asg-provider-CWCv370K.js").then((n) => n.n);
39112
+ const { ASGProvider } = await import("./asg-provider-DaYT8UPi.js").then((n) => n.n);
38298
39113
  const asgProvider = new ASGProvider();
38299
39114
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
38300
39115
  }
@@ -45642,6 +46457,7 @@ const STATEFUL_TYPES = /* @__PURE__ */ new Set([
45642
46457
  "AWS::Glue::Table",
45643
46458
  "AWS::Logs::LogGroup",
45644
46459
  "AWS::CloudFront::Distribution",
46460
+ "AWS::CloudFormation::Stack",
45645
46461
  "AWS::Cassandra::Table",
45646
46462
  "AWS::DocDBElastic::Cluster",
45647
46463
  "AWS::Lightsail::Database",
@@ -48617,7 +49433,7 @@ async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId)
48617
49433
  }
48618
49434
  if (v !== null && typeof v === "object") {
48619
49435
  const out = {};
48620
- for (const [k, val] of Object.entries(v)) out[k] = await walk(val, path === "" ? k : `${path}.${k}`);
49436
+ for (const [k, val] of Object.entries(v)) defineOwnKey(out, k, await walk(val, path === "" ? k : `${path}.${k}`));
48621
49437
  return out;
48622
49438
  }
48623
49439
  return v;
@@ -51584,9 +52400,16 @@ var DeployEngine = class DeployEngine {
51584
52400
  if (toRefresh > 0) this.logger.warn(`cdkd state schema upgrade detected — refreshing observed-properties baseline for ${toRefresh} resource(s) (one-time, runs in parallel with deploy)`);
51585
52401
  }
51586
52402
  async doDeploy(stackName, template) {
52403
+ const createOnlyPrefetch = prefetchCreateOnlyPropertyPaths(templateResourceTypes(template.Resources).filter((type) => !hasNoRegistrySchema(type)));
52404
+ try {
52405
+ return await this.doDeployWithPrefetch(stackName, template, createOnlyPrefetch);
52406
+ } finally {
52407
+ createOnlyPrefetch.cancel();
52408
+ }
52409
+ }
52410
+ async doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
51587
52411
  const startTime = Date.now();
51588
52412
  this.logger.debug(`Starting deployment for stack: ${stackName}`);
51589
- for (const type of new Set(Object.values(template.Resources).map((r) => r.Type).filter((type) => !hasNoRegistrySchema(type)))) getCreateOnlyPropertyPaths(type).catch(() => {});
51590
52413
  const renderer = getLiveRenderer();
51591
52414
  this.interrupted = false;
51592
52415
  this.interruptCause = null;
@@ -51685,6 +52508,7 @@ var DeployEngine = class DeployEngine {
51685
52508
  diffResolverContext.skipDynamicReferences = true;
51686
52509
  const diffResolveFn = (value) => this.resolver.resolve(value, diffResolverContext);
51687
52510
  const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues));
52511
+ createOnlyPrefetch.cancel();
51688
52512
  const nestedStackTypeChanges = findNestedStackTypeChanges({
51689
52513
  changes,
51690
52514
  stateResources: currentState.resources
@@ -53700,5 +54524,5 @@ var DeployEngine = class DeployEngine {
53700
54524
  };
53701
54525
 
53702
54526
  //#endregion
53703
- 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, isTransientServerError 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, commandHole as Co, describeTypeWithThrottleRetry as Cr, compositeIdSkipResult as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, ambientClientDefaults as Da, parseBootstrapMarker as Di, deployRefusesOrphanRowsReason as Dn, isMarkedNonRetryable 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, withheldTargetClause as Eo, TemplateParser as Er, maskDeep as Et, extractDeploymentEventError as F, defineOwnKey as Fa, describeDockerExecFailure as Fi, malformedExportSourceWarning as Fn, safeStringify$1 as Fo, 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, __exportAll as Io, 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, markRedactedCause as Mo, createSecretMasker as Mr, disableInstanceApiTermination as Mt, unsupportedFinalSnapshotError as N, globMatches as Na, resolveDockerContextDirectory as Ni, isReadableResourceEntry as Nn, retryClassificationText as No, dynamicReferenceTokens as Nr, isTerminationProtectionPropagationError as Nt, buildFinalSnapshotIdentifier as O, ambientCredentialConfig as Oa, readBootstrapMarkerBody as Oi, displayLogicalId as On, isRetryableTransientError 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, describeAwsFailure 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, shellQuote 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, markNonRetryable as jo, carriesSecretMask as jr, isWaitAbandonedError as jt, ccRoutedFinalSnapshotError as k, clientDefaultsFor as ka, validateAssetBucketName as ki, hasReadableOrphans as kn, isThrottlingError 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, pasteableCommand 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 };
53704
- //# sourceMappingURL=deploy-engine-DIZztJy5.js.map
54527
+ export { yellow as $, setAwsClients as $a, getDockerImageBySourceHash as $i, refuseMalformedOrphanRecordsForDestroy as $n, buildForceUnlockCommand as $r, configIntegerRefusal as $t, createPreDeleteFinalSnapshot as A, ambientCredentialConfig as Aa, readBootstrapMarkerBody as Ai, hasReadableOutputs as An, withheldTargetClause as Ao, STATE_SOURCED_CROSS_GENERATION_RULES as Ar, deleteSkipReason as At, isStatefulRecreateTargetSync as B, nullPrototypeRecord as Ba, finchSecretArgvRefusal as Bi, malformedOrphansRefusalMessage as Bn, __exportAll as Bo, markSameGenerationBag as Br, isImpossibleEmptyStoredAttribute as Bt, namesAnyDeclaredParameter as C, producerRecordKey as Ca, AssetModeResolver as Ci, STATE_REGION_DIVERGED as Cn, normalizeAwsError as Co, prefetchCreateOnlyPropertyPaths as Cr, compositeIdSkipResult as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, canonicalizeRegion as Da, getBootstrapMarkerKey as Di, deployRefusesOrphanRowsReason as Dn, plainOrDescribed as Do, DagBuilder as Dr, maskerOrIdentity as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, PARTITION_TABLE as Ea, ensureAssetStorage as Ei, UNREADABLE_RESOURCES_MAP_ROW as En, pasteableCommand as Eo, withRetry as Er, maskDeep as Et, extractDeploymentEventError as F, globMatches as Fa, resolveDockerContextDirectory as Fi, malformedExportSourceWarning as Fn, markNonRetryable as Fo, dynamicReferenceTokens as Fr, carriesDynamicReference as Ft, toCfnInteger as G, renderAssemblyPathEscape as Ga, partitionSensitiveEnv as Gi, malformedResourceEntriesWarning as Gn, recordMaskOnlyValuesIn as Gr, isSettledInstanceState as Gt, WARM_THROUGHPUT_MEMBERS as H, absoluteAssemblyPathEscape as Ha, getDockerCmd as Hi, malformedOutputsRefusalMessage as Hn, maskSecretsInText as Hr, isUnboundTemplateParameter as Ht, makeSiblingClaimReader as I, processStackMessages as Ia, describeDockerCapturedOutput as Ii, malformedLocalOutputsWarning as In, markRedactedCause as Io, errorCauseChain as Ir, carriesFetchableDynamicReference as It, bold as J, resolveBucketRegion as Ja, runDockerStreaming as Ji, malformedStateRefusalMessage as Jn, scrubResourceRecord as Jr, resolveExplicitPhysicalId as Jt, toFiniteNumber as K, resolveAssemblyPath as Ka, redactDockerArgvValues as Ki, malformedResourcePropertiesWarning as Kn, recoverMaskedOutput as Kr, WAFv2WebACLProvider as Kt, planOrphanAdoption as L, defineOwnKey as La, describeDockerExecFailure as Li, malformedOrphanRecordsRefusalMessage as Ln, retryClassificationText as Lo, identityKeyFor as Lr, cfnRefValueFromPhysicalId as Lt, refusesFinalSnapshot as M, credentialFingerprint as Ma, validateContainerRepoName as Mi, isReadableOrphanRecord as Mn, isRetryableTransientError as Mo, TEMPLATE_SOURCED_RULES as Mr, disableInstanceApiTermination as Mt, unsupportedFinalSnapshotError as N, AssemblyReader as Na, buildDenyExternalAccessPolicy as Ni, isReadableResourceEntry as Nn, isThrottlingError as No, carriesSecretMask as Nr, isTerminationProtectionPropagationError as Nt, buildFinalSnapshotIdentifier as O, derivePartitionAndUrlSuffix as Oa, isCrossRegionRedirect as Oi, displayLogicalId as On, quotedOrDescribed as Oo, TemplateParser as Or, UNSPECIFIED_SKIP_REASON as Ot, makeCanonicalizePropertiesFn as P, failedStageNote as Pa, buildDockerImage as Pi, malformedExportNamesWarning as Pn, isTransientServerError as Po, createSecretMasker as Pr, IntrinsicFunctionResolver as Pt, red as Q, runWithStackAwsClients as Qa, AssetManifestLoader as Qi, refuseMalformedOrphanRecords as Qn, UNREPRODUCIBLE_LOCK_CLAUSE as Qr, configBooleanRefusal as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, hasOwnKey as Ra, describeDockerFailure as Ri, malformedOrphanRecordsWarning as Rn, describeAwsFailure as Ro, isSingleDynamicReferenceToken as Rr, coerceParameterTypedValue as Rt, computeParameterTaint as S, producerCoordinateKey as Sa, rewriteTemplateAssetReferences as Si, INTRINSIC_KEYS as Sn, isCdkdError as So, findSilentDropProperties as Sr, compositeIdSeparatorRefusal as St, resourcesNamingDeclaredParameter as T, expectedOwnerParam as Ta, assertAssetBucketRegion as Ti, UNREADABLE_ORPHANS_CONTAINER_ROW as Tn, commandHole as To, describeTypeWithThrottleRetry as Tr, createMaskedRetryLogger as Tt, coerceWarmThroughput as U, describeFileReadFailure as Ua, isDockerClientEnvKey as Ui, malformedOutputsWarning as Un, pathCrossesDottedKey as Ur, parameterTypeMayLoseSecretIdentity as Ut, renderStatefulReason as V, ownValue as Va, formatDockerLoginError as Vi, malformedOrphansWarning as Vn, maskSecretsInError as Vr, isNamelessDynamicReferenceError as Vt, isWarmThroughputDecrease as W, displayAssemblyPath as Wa, isMalformedEnvKey as Wi, malformedRenderedContainersWarning as Wn, recordMaskOnlyValue as Wr, refStateLookupFromResource as Wt, gray as X, getAwsClients as Xa, escapeRegExp$1 as Xi, refuseDivergentRecordRegionForDestroy as Xn, S3StateBackend as Xr, coerceCfnBoolean as Xt, cyan as Y, AwsClients as Ya, warnFinchArgvExposure as Yi, previewableOrphanRecords as Yn, LockManager as Yr, assertRegionMatch as Yt, green as Z, resetAwsClients as Za, stripControlChars as Zi, refuseMalformedNestedChildOutputs as Zn, rebuildClientForBucketRegion as Zr, coerceCfnInteger as Zt, bagHoldsSecretExpression as _, findLargeInlineResources as _a, stringifyValue as _i, AWS_CREDENTIAL_ENV_KEYS as _n, StackHasActiveImportsError as _o, safeRegion as _r, startInterruptWatch as _t, DeploymentEventsStore as a, resolveAutoAssetStorage as aa, describeRegionValueKind as ai, requireConfigString as an, DeployCancelledError as ao, refuseMalformedResourceAttributesForOrphan as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, injectiveKey as ba, createAssetRedirectResolver as bi, envCredentialsAreAssumedRole as bn, SynthesisError as bo, unreadableOrphanRecords as br, ccProtectionRegistryTypes as bt, replayFailedOperations as c, resolveStateBucketWithDefault as ca, hasReasonlessBaselineRefusal as ci, classifyReplaySecretRegion as cn, LocalInvokeBuildError as co, refuseMalformedResourcePropertiesForOrphan as cr, IAMRoleProvider as ct, updatePartialMessage as d, stateBucketExistenceConfirmed as da, importableOutputs as di, s3BucketArn as dn, MalformedProducerRecordRefusalError as do, repairMalformedOrphanRecordsForReadOnly as dr, ProviderRegistry as dt, Synthesizer as ea, buildLockContentionMessage as ei, configStringRefusal as en, AssetError as eo, refuseMalformedOrphans as er, collectDeclaredOutputNames as et, updatePartialReason as f, warnDeprecatedNoPrefixCliFlag as fa, isReadableBag as fi, s3BucketDomainName as fn, NestedStackChildDirectDestroyError as fo, repairMalformedOrphansForReadOnly as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, MIGRATE_TMP_PREFIX as ga, AssetPublisher as gi, applyRoleArnIfSet as gn, ResourceUpdateNotSupportedError as go, repairMalformedResourcesForReadOnly as gr, isInterruptedWaitError as gt, IMPLICIT_DELETE_DEPENDENCIES as h, CFN_TEMPLATE_URL_LIMIT as ha, shouldRetainResource as hi, s3BucketWebsiteUrl as hn, ResourceTimeoutError as ho, repairMalformedResourcePropertiesForReadOnly as hr, interruptWatchListenerCount as ht, DeploymentEventsReader as i, resolveApp as ia, DEFAULT_STATE_PREFIX as ii, requireConfigObject as in, DependencyError as io, refuseMalformedOutputsForDestroy as ir, secretBearing as it, isFinalSnapshotError as j, clientDefaultsFor as ja, validateAssetBucketName as ji, hasReadableResources as jn, isMarkedNonRetryable as jo, STATE_SOURCED_READBACK_RULES as jr, isWaitAbandonedError as jt, ccRoutedFinalSnapshotError as k, ambientClientDefaults as ka, parseBootstrapMarker as ki, hasReadableOrphans as kn, shellQuote as ko, STATE_SOURCED_BASELINE_RULES as kr, deleteIndeterminateGuards as kt, replayRollback as l, resolveStateBucketWithDefaultAndSource as la, hasUnverifiableParameterRefusal as li, producerRegionsFromState as ln, LocalStartServiceError as lo, refuseMalformedResourcesForDestroy as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, CFN_TEMPLATE_BODY_LIMIT as ma, orphansCarriedFrom as mi, s3BucketRegionalDomainName as mn, ProvisioningError as mo, repairMalformedResourceEntriesForReadOnly as mr, endCommandInterruptScope as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, getDefaultStateBucketName as na, formatLockExpiry as ni, replayWarn as nn, ConfigError as no, refuseMalformedOrphansForOrphan as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, resolveCaptureObservedState as oa, exportNamesCarriedFrom as oi, definedAttributes as on, DynamicReferenceRegionAmbiguousError as oo, refuseMalformedResourceEntries as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, ssmResolvedValueType as pa, orphansAfterRollback as pi, s3BucketDualStackDomainName as pn, PartialFailureError as po, repairMalformedOutputsForReadOnly as pr, beginCommandInterruptScope as pt, formatResourceLine as q, clearBucketRegionCache as qa, runDockerForeground as qi, malformedResourcesWarning as qn, redactSecretsForState as qr, normalizeAwsTagsToCfn as qt, DeployEngine as r, getLegacyStateBucketName as ra, CUSTOM_RESOURCE_RESPONSE_PREFIX as ri, requireConfigArray as rn, CrossAccountSecretRefusalError as ro, refuseMalformedOutputs as rr, isExportAliasCollision as rt, planRollback as s, resolveSkipPrefix as sa, hasReadableExportSet as si, stringifyIfAssigned as sn, IntrinsicResolutionRefusalError as so, refuseMalformedResourceEntriesForOrphan as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, synthesisStatusMessage as ta, forceQuitRecoveryClause as ti, readConfigString as tn, CdkdError as to, refuseMalformedOrphansForDestroy as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, resolveUseCdkBootstrapAssets as ua, importableOutputKeys as ui, withSharedDrainBudget as un, LockError as uo, refuseMalformedState as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, uploadCfnTemplate as va, WorkGraph as vi, applyCallerIdentityCredentials as vn, StackTerminationProtectionError as vo, safeStackName as vr, CloudControlProvider as vt, reachableDivergentParameters as w, decodeListingKey as wa, BOOTSTRAP_MARKER_PREFIX as wi, STATE_RESOURCES_MALFORMED as wn, withErrorHandling as wo, templateResourceTypes as wr, packCompositeId as wt, bindingSkippedOutputs as x, injectiveKeyPrefix as xa, loadPublishableAssetManifest as xi, DiffCalculator as xn, formatError as xo, findActionableSilentDrops as xr, compositeIdFormatMessage as xt, keptWholeReasonText as y, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ya, buildAssetRedirectMap as yi, callerEnvCredentials as yn, StateError as yo, unpreviewableOrphanRecords as yr, slowCcOperationTimeoutMs as yt, isStatefulRecreateTargetForReplace as z, hasPlainPrototype$1 as za, dockerSpawnEnvWithSensitive as zi, malformedOrphanRowsKeptWarning as zn, safeStringify$1 as zo, isUncertifiedBaselineMaskPosition as zr, getAccountInfo as zt };
54528
+ //# sourceMappingURL=deploy-engine-CidtgaFr.js.map