@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.
- package/dist/{asg-provider-CWCv370K.js → asg-provider-DaYT8UPi.js} +2 -2
- package/dist/{asg-provider-CWCv370K.js.map → asg-provider-DaYT8UPi.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-DIZztJy5.js → deploy-engine-CidtgaFr.js} +920 -96
- package/dist/deploy-engine-CidtgaFr.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{program-WCBWtvb0.js → program-DP27UiVh.js} +531 -128
- package/dist/{program-WCBWtvb0.js.map → program-DP27UiVh.js.map} +1 -1
- package/dist/{version-CuKFdkKV.js → version-CyFoAN6V.js} +2 -2
- package/dist/{version-CuKFdkKV.js.map → version-CyFoAN6V.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-DIZztJy5.js.map +0 -1
|
@@ -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-
|
|
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
|
|
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 `
|
|
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
|
-
|
|
2032
|
+
const retry = pasteableCommand("cdkd destroy", [{
|
|
2011
2033
|
value: stackName,
|
|
2012
2034
|
hole: "stack",
|
|
2013
|
-
opts: {
|
|
2014
|
-
|
|
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
|
|
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: {
|
|
2064
|
-
|
|
2065
|
-
|
|
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
|
-
|
|
2069
|
-
|
|
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.
|
|
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
|
|
20571
|
-
|
|
20572
|
-
|
|
20573
|
-
|
|
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-
|
|
20818
|
+
//#region src/provisioning/create-only-paths.ts
|
|
20607
20819
|
/**
|
|
20608
|
-
*
|
|
20609
|
-
*
|
|
20610
|
-
*
|
|
20611
|
-
*
|
|
20612
|
-
*
|
|
20613
|
-
*
|
|
20614
|
-
*
|
|
20615
|
-
*
|
|
20616
|
-
*
|
|
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
|
|
20661
|
-
*
|
|
20662
|
-
*
|
|
20663
|
-
*
|
|
20664
|
-
*
|
|
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)
|
|
20670
|
-
|
|
20671
|
-
|
|
20672
|
-
|
|
20673
|
-
|
|
20674
|
-
|
|
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
|
-
*
|
|
20747
|
-
*
|
|
20748
|
-
*
|
|
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
|
-
|
|
20751
|
-
const
|
|
20752
|
-
|
|
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
|
|
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
|
|
34832
|
+
if (Object.hasOwn(variables, varNameStr)) {
|
|
34018
34833
|
replacement = String(variables[varNameStr]);
|
|
34019
|
-
twinReplacement = varNameStr
|
|
34020
|
-
if (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-
|
|
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
|
|
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-
|
|
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
|