@go-to-k/cdkd 0.290.36 → 0.290.38
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-DWY8_Kn4.js → asg-provider-B70ujDSS.js} +2 -2
- package/dist/{asg-provider-DWY8_Kn4.js.map → asg-provider-B70ujDSS.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-tX_-qy5a.js → deploy-engine-BdYBI1uT.js} +446 -14
- package/dist/deploy-engine-BdYBI1uT.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{program-DcMcqr70.js → program-Br4uc31m.js} +13 -231
- package/dist/{program-DcMcqr70.js.map → program-Br4uc31m.js.map} +1 -1
- package/dist/{version-BYmXwLpd.js → version-BeHfM5ow.js} +2 -2
- package/dist/{version-BYmXwLpd.js.map → version-BeHfM5ow.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-tX_-qy5a.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as displayAwsMessage, D as truncateCodePoints, E as isPasteableIdent, 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-BX4pJk0T.js";
|
|
2
2
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BoIxyCir.js";
|
|
3
|
-
import { t as getCdkdVersion } from "./version-
|
|
3
|
+
import { t as getCdkdVersion } from "./version-BeHfM5ow.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";
|
|
@@ -9481,6 +9481,15 @@ function hasUnverifiableParameterRefusal(record) {
|
|
|
9481
9481
|
return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
|
|
9482
9482
|
}
|
|
9483
9483
|
/**
|
|
9484
|
+
* Whether `record` carries a marker with NO reason this binary knows — written
|
|
9485
|
+
* by an older cdkd, cause unknown. The one caller-side question is whether to read it
|
|
9486
|
+
* fail closed; see `observedBaselineRefusalReason`'s doc.
|
|
9487
|
+
*/
|
|
9488
|
+
function hasReasonlessBaselineRefusal(record) {
|
|
9489
|
+
const reason = record?.observedBaselineRefusalReason;
|
|
9490
|
+
return record?.observedBaselineRefused === true && reason !== "unverifiable-parameter" && reason !== "incomplete-resolution";
|
|
9491
|
+
}
|
|
9492
|
+
/**
|
|
9484
9493
|
* Returns true when a recorded `DeletionPolicy` should prevent cdkd from
|
|
9485
9494
|
* deleting the underlying AWS resource. `Retain` and `RetainExceptOnCreate`
|
|
9486
9495
|
* both keep the resource around; `Delete` / `Snapshot` / undefined all
|
|
@@ -15046,7 +15055,10 @@ function positionListByCrossStackSource(bag, source, secrets) {
|
|
|
15046
15055
|
function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
|
|
15047
15056
|
if (isDynamicReferenceString(source) && typeof bag === "string") {
|
|
15048
15057
|
if (isSingleDynamicReferenceToken(source) && (rules.trustAnyExpression || isKnownSecretExpression(source, secretExpressions))) {
|
|
15049
|
-
if (!rules.sourceIsSameGeneration && isSingleDynamicReferenceToken(bag))
|
|
15058
|
+
if (!rules.sourceIsSameGeneration && isSingleDynamicReferenceToken(bag)) {
|
|
15059
|
+
if (!spanNamesResolvableService(bag)) return redactSecretsForState(bag, secrets);
|
|
15060
|
+
return secrets.get(bag) ?? bag;
|
|
15061
|
+
}
|
|
15050
15062
|
return source;
|
|
15051
15063
|
}
|
|
15052
15064
|
return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
|
|
@@ -15167,7 +15179,8 @@ function subtreeHasDynamicReference(value) {
|
|
|
15167
15179
|
* compiling a pattern per string leaf at the persist choke point, which walks
|
|
15168
15180
|
* every record. Do NOT call `.exec` / `.test` on this constant — those DO
|
|
15169
15181
|
* advance `lastIndex`, which is exactly why the shared instance is safe only
|
|
15170
|
-
* for `.match`.
|
|
15182
|
+
* for `.match`. (ONE site does, `resolvableReferenceSpans`, and it resets
|
|
15183
|
+
* `lastIndex` to 0 in the statement after the `exec`.)
|
|
15171
15184
|
*
|
|
15172
15185
|
* Widening it changes one answer, in the SAFE direction for BOTH readers.
|
|
15173
15186
|
*
|
|
@@ -15656,6 +15669,57 @@ const SECRET_BEARING_REFERENCE_PREFIXES = [
|
|
|
15656
15669
|
"{{resolve:ssm:"
|
|
15657
15670
|
];
|
|
15658
15671
|
/**
|
|
15672
|
+
* Does this complete `{{resolve:...}}` token name a service cdkd RESOLVES?
|
|
15673
|
+
*
|
|
15674
|
+
* The value scan spares a needle match lying inside a token, so that a
|
|
15675
|
+
* plaintext coinciding with a real reference's own text is not spliced into
|
|
15676
|
+
* it (issue #1935). That protection is owed to a REFERENCE only. A token of
|
|
15677
|
+
* any other service is left in place by the resolver, so text inside it is
|
|
15678
|
+
* ordinary persisted text, and a recorded plaintext there must be redacted
|
|
15679
|
+
* (issue [#2743](https://github.com/go-to-k/cdkd/issues/2743)).
|
|
15680
|
+
*/
|
|
15681
|
+
function spanNamesResolvableService(token) {
|
|
15682
|
+
return SECRET_BEARING_REFERENCE_PREFIXES.some((prefix) => token.startsWith(prefix));
|
|
15683
|
+
}
|
|
15684
|
+
/**
|
|
15685
|
+
* The spans of `value` the value scan must not splice a needle into: every
|
|
15686
|
+
* complete token of a resolvable service.
|
|
15687
|
+
*
|
|
15688
|
+
* Two scans, unioned. The ordinary one ({@link dynamicReferenceSpans}) is
|
|
15689
|
+
* LEFTMOST, so behind an opener of an unresolvable service it reports one
|
|
15690
|
+
* outer span and never sees a REAL reference nested in it — which is exactly
|
|
15691
|
+
* the text this module writes when it redacts `{{resolve:<plaintext>}}` to
|
|
15692
|
+
* `{{resolve:{{resolve:secretsmanager:...}}}}`. Dropping that outer span
|
|
15693
|
+
* alone would leave the nested reference unprotected, and a later pass whose
|
|
15694
|
+
* map holds a needle occurring in the reference's own text (`password` is an
|
|
15695
|
+
* ordinary JSON key AND an ordinary secret value) would splice into it, again
|
|
15696
|
+
* on every pass. The second scan starts only at a resolvable-service opener,
|
|
15697
|
+
* so it finds the nested reference — and keeps it only when it is an
|
|
15698
|
+
* expression of the pass's own map (see the loop).
|
|
15699
|
+
*
|
|
15700
|
+
* On a leaf with no unresolvable-service opener the two scans report the same
|
|
15701
|
+
* spans, so every leaf issue #1935 protects is answered exactly as before.
|
|
15702
|
+
*/
|
|
15703
|
+
function resolvableReferenceSpans(value, vouchedExpressions) {
|
|
15704
|
+
const spans = dynamicReferenceSpans(value).filter((span) => spanNamesResolvableService(value.slice(span.start, span.end)));
|
|
15705
|
+
const starts = new Set(spans.map((span) => span.start));
|
|
15706
|
+
for (const prefix of SECRET_BEARING_REFERENCE_PREFIXES) for (let at = value.indexOf(prefix); at >= 0; at = value.indexOf(prefix, at + 1)) {
|
|
15707
|
+
if (starts.has(at)) continue;
|
|
15708
|
+
DYNAMIC_REFERENCE_TOKEN_SCAN.lastIndex = at;
|
|
15709
|
+
const match = DYNAMIC_REFERENCE_TOKEN_SCAN.exec(value);
|
|
15710
|
+
DYNAMIC_REFERENCE_TOKEN_SCAN.lastIndex = 0;
|
|
15711
|
+
if (match?.index !== at) continue;
|
|
15712
|
+
const end = at + match[0].length;
|
|
15713
|
+
if (!vouchedExpressions.has(value.slice(at, end))) continue;
|
|
15714
|
+
spans.push({
|
|
15715
|
+
start: at,
|
|
15716
|
+
end
|
|
15717
|
+
});
|
|
15718
|
+
starts.add(at);
|
|
15719
|
+
}
|
|
15720
|
+
return spans;
|
|
15721
|
+
}
|
|
15722
|
+
/**
|
|
15659
15723
|
* The prefixes whose SPELLING settles secret-ness, with no lookup and no
|
|
15660
15724
|
* inference — the subset of {@link SECRET_BEARING_REFERENCE_PREFIXES} that
|
|
15661
15725
|
* {@link expressionSecretIsInferred} treats as certain.
|
|
@@ -16060,7 +16124,7 @@ function deriveReadbackNeedles(bag, source, secrets, rules) {
|
|
|
16060
16124
|
*/
|
|
16061
16125
|
function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE__ */ new Map()) {
|
|
16062
16126
|
if (typeof value === "string") {
|
|
16063
|
-
if (isSingleDynamicReferenceToken(value) || sourceLiterals.has(value)) return value;
|
|
16127
|
+
if (isSingleDynamicReferenceToken(value) && spanNamesResolvableService(value) || sourceLiterals.has(value)) return value;
|
|
16064
16128
|
if (value === "") return value;
|
|
16065
16129
|
return mark ? POSITION_UNCERTIFIED : "***";
|
|
16066
16130
|
}
|
|
@@ -16362,6 +16426,16 @@ function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RU
|
|
|
16362
16426
|
* security review, and the reason the rule is one predicate over the whole
|
|
16363
16427
|
* leaf rather than a split.
|
|
16364
16428
|
* - **disjoint from every span** -> REPLACED. The ordinary embedded secret.
|
|
16429
|
+
* - **inside a span whose service cdkd does not resolve** -> REPLACED (issue
|
|
16430
|
+
* [#2743](https://github.com/go-to-k/cdkd/issues/2743)). Such a span is not
|
|
16431
|
+
* a reference: `{{resolve:<plaintext>}}` is what an `Fn::Sub` putting a
|
|
16432
|
+
* resolved secret in the SERVICE position assembled, and sparing it
|
|
16433
|
+
* persisted the plaintext. The result, `{{resolve:{{resolve:...}}}}`, is
|
|
16434
|
+
* garbage but not plaintext, the same trade as the stray-opener residual
|
|
16435
|
+
* below; the REAL reference nested in it is protected again
|
|
16436
|
+
* ({@link resolvableReferenceSpans}). The cost: an untainted look-alike
|
|
16437
|
+
* token whose text coincides with a recorded secret is rewritten like any
|
|
16438
|
+
* other text, and a replay then sends the rewritten literal.
|
|
16365
16439
|
*
|
|
16366
16440
|
* Scanning the WHOLE leaf in ONE pass is also what preserves what needle
|
|
16367
16441
|
* PRECEDENCE there is. {@link buildNeedleRegex} sorts alternatives
|
|
@@ -16390,8 +16464,9 @@ function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RU
|
|
|
16390
16464
|
* PLAINTEXT behind two characters any string can contain.
|
|
16391
16465
|
* - **a later `}}` anywhere in the leaf** -> the opener and that `}}` form
|
|
16392
16466
|
* ONE span swallowing everything between them, so a needle in that region
|
|
16393
|
-
* is KEPT
|
|
16394
|
-
*
|
|
16467
|
+
* is KEPT when the opener spells a resolvable service (`{{resolve:ssm:`
|
|
16468
|
+
* ...; any other opener is the unresolvable-service row above) — the only
|
|
16469
|
+
* shape where this rule redacts LESS than the code it replaced. Narrow but real, and the reachable carrier is named rather than
|
|
16395
16470
|
* waved at: the resolver shares this grammar, so such a leaf could not have
|
|
16396
16471
|
* resolved on the deploy path, which leaves an `observedProperties`
|
|
16397
16472
|
* READBACK (arbitrary text from AWS) as the way one arrives.
|
|
@@ -16402,8 +16477,10 @@ function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RU
|
|
|
16402
16477
|
* contradicting this change's own "not repaired, not made worse" property.
|
|
16403
16478
|
* So the residual is documented, not fixed.
|
|
16404
16479
|
*/
|
|
16480
|
+
let vouched;
|
|
16481
|
+
const vouchedExpressions = () => vouched ??= new Set(secrets.values());
|
|
16405
16482
|
const scanLeaf = (value, needles) => {
|
|
16406
|
-
const spans = isDynamicReferenceString(value) ?
|
|
16483
|
+
const spans = isDynamicReferenceString(value) ? resolvableReferenceSpans(value, vouchedExpressions()) : [];
|
|
16407
16484
|
return value.replace(needles, (match, offset) => {
|
|
16408
16485
|
const end = offset + match.length;
|
|
16409
16486
|
if (spans.some((span) => span.start <= offset && end <= span.end && (span.start !== offset || span.end !== end))) return match;
|
|
@@ -16414,7 +16491,7 @@ function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RU
|
|
|
16414
16491
|
if (typeof value === "string") {
|
|
16415
16492
|
const whole = wholeValueExpr(value);
|
|
16416
16493
|
if (whole !== void 0) return whole;
|
|
16417
|
-
if (isSingleDynamicReferenceToken(value)) return value;
|
|
16494
|
+
if (isSingleDynamicReferenceToken(value) && spanNamesResolvableService(value)) return value;
|
|
16418
16495
|
if (!regex) return value;
|
|
16419
16496
|
regex.lastIndex = 0;
|
|
16420
16497
|
if (!regex.test(value)) return value;
|
|
@@ -27765,7 +27842,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
27765
27842
|
/** Recursively resolve a value. */
|
|
27766
27843
|
async resolveValue(value, context) {
|
|
27767
27844
|
if (typeof value !== "object" || value === null) {
|
|
27768
|
-
if (typeof value === "string" && value.includes("{{resolve:")) return await this.
|
|
27845
|
+
if (typeof value === "string" && value.includes("{{resolve:")) return await this.resolveTemplateLeafReferences(value, context);
|
|
27769
27846
|
return value;
|
|
27770
27847
|
}
|
|
27771
27848
|
if (Array.isArray(value)) return (await allSettledKeepingFirstRejection(value.map((v) => this.resolveValue(v, context)), (pending) => this.warnAbandonedParts(pending))).filter((v) => v !== AWS_NO_VALUE);
|
|
@@ -31073,7 +31150,30 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31073
31150
|
displayLeaf(value, context) {
|
|
31074
31151
|
return this.displayMasked(this.logTextOfLeaf(value, context), context);
|
|
31075
31152
|
}
|
|
31153
|
+
/**
|
|
31154
|
+
* Resolve the dynamic references of a PERSISTED string leaf: text read back
|
|
31155
|
+
* out of a state record, a rollback journal or a producer stack's outputs.
|
|
31156
|
+
* That is what every caller of this method hands it (`cdkd drift`, the
|
|
31157
|
+
* rollback replay, `cdkd scrub`'s per-token delegation, the cross-stack
|
|
31158
|
+
* re-resolution); a TEMPLATE leaf goes through {@link resolve}, which takes
|
|
31159
|
+
* {@link resolveTemplateLeafReferences}.
|
|
31160
|
+
*
|
|
31161
|
+
* The distinction is load-bearing for ONE arm (issue #2743). A token of a
|
|
31162
|
+
* service cdkd does not resolve is REFUSED on the template route when it
|
|
31163
|
+
* holds a secret, because leaving it would send that secret to AWS for the
|
|
31164
|
+
* first time. Persisted text is different on both counts: AWS already holds
|
|
31165
|
+
* it, so refusing buys no confidentiality, and the refusal is DETERMINISTIC
|
|
31166
|
+
* there -- a journal `previousState` holding `{{resolve:<plaintext>}}` beside
|
|
31167
|
+
* the reference that resolves to it would fail its rollback op on every
|
|
31168
|
+
* retry, where replaying the literal is a correct no-op. So this entry point
|
|
31169
|
+
* keeps the warn-and-leave for every such token, and the value scan redacts
|
|
31170
|
+
* whatever is persisted afterwards.
|
|
31171
|
+
*/
|
|
31076
31172
|
async resolveDynamicReferences(value, context) {
|
|
31173
|
+
return (await this.resolveDynamicReferencesWithLogTwin(value, value, context, void 0, true)).result;
|
|
31174
|
+
}
|
|
31175
|
+
/** A TEMPLATE string leaf: the refusing route (see {@link resolveDynamicReferences}). */
|
|
31176
|
+
async resolveTemplateLeafReferences(value, context) {
|
|
31077
31177
|
return (await this.resolveDynamicReferencesWithLogTwin(value, value, context)).result;
|
|
31078
31178
|
}
|
|
31079
31179
|
/**
|
|
@@ -31096,7 +31196,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31096
31196
|
* NEEDLE match that straddles a masked span, which is why the log lines go
|
|
31097
31197
|
* through `logTwinText` rather than masking the twin alone.
|
|
31098
31198
|
*/
|
|
31099
|
-
async resolveDynamicReferencesWithLogTwin(value, logTwin, context, inherited) {
|
|
31199
|
+
async resolveDynamicReferencesWithLogTwin(value, logTwin, context, inherited, persistedText = false) {
|
|
31100
31200
|
const pattern = /\{\{resolve:([^}]+)\}\}/g;
|
|
31101
31201
|
let result = value;
|
|
31102
31202
|
let twin = logTwin;
|
|
@@ -31127,7 +31227,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31127
31227
|
const foreign = await this.resolverForProducerRegion(regionVerdict.region, context, nameLogText(regionVerdict.region)).resolveDynamicReferencesWithLogTwin(fullMatch, fullMatch, withoutProducerRegions(context), {
|
|
31128
31228
|
tokenLogText,
|
|
31129
31229
|
nameLogText
|
|
31130
|
-
});
|
|
31230
|
+
}, persistedText);
|
|
31131
31231
|
result = result.replace(fullMatch, () => foreign.result);
|
|
31132
31232
|
twin = twin.replace(fullMatch, () => foreign.twin);
|
|
31133
31233
|
const [delegated] = foreign.substitutions;
|
|
@@ -31191,6 +31291,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
31191
31291
|
isSecret = true;
|
|
31192
31292
|
resolved = param.value;
|
|
31193
31293
|
} else {
|
|
31294
|
+
if (!persistedText && (tokenLogText !== fullMatch || this.maskNeedlesForLog(fullMatch, context) !== fullMatch)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to resolve ${this.displayMasked(tokenLogText, context)}: its service is not one cdkd resolves (secretsmanager, ssm, ssm-secure), and the reference was assembled from a secret value, so leaving it as written would send that value to AWS and record it in state in the clear.`));
|
|
31194
31295
|
this.logger.warn(this.displayMasked(`Unsupported dynamic reference service: ${this.displayMasked(nameLogText(String(service)), context)}`, context));
|
|
31195
31296
|
complete = false;
|
|
31196
31297
|
continue;
|
|
@@ -33143,7 +33244,7 @@ var CloudControlProvider = class {
|
|
|
33143
33244
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
33144
33245
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
33145
33246
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
33146
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
33247
|
+
const { ASGProvider } = await import("./asg-provider-B70ujDSS.js").then((n) => n.n);
|
|
33147
33248
|
const asgProvider = new ASGProvider();
|
|
33148
33249
|
return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
|
|
33149
33250
|
}
|
|
@@ -40123,6 +40224,294 @@ async function createReplicationGroupFinalSnapshot(client, replicationGroupId, l
|
|
|
40123
40224
|
});
|
|
40124
40225
|
}
|
|
40125
40226
|
|
|
40227
|
+
//#endregion
|
|
40228
|
+
//#region src/analyzer/parameter-dependence.ts
|
|
40229
|
+
/**
|
|
40230
|
+
* The PARAMETER-DEPENDENCE WALK: which resources of a raw template depend on
|
|
40231
|
+
* which template parameters (issues
|
|
40232
|
+
* [#2854](https://github.com/go-to-k/cdkd/issues/2854),
|
|
40233
|
+
* [#3468](https://github.com/go-to-k/cdkd/issues/3468)).
|
|
40234
|
+
*
|
|
40235
|
+
* Pure template analysis with two consumers that must agree: `cdkd import`'s
|
|
40236
|
+
* ARM 4 (`src/cli/commands/import-deployed-parameters.ts` supplies the
|
|
40237
|
+
* divergent parameter set from `DescribeStacks`) and `cdkd deploy`'s reading of
|
|
40238
|
+
* a REASON-LESS `observedBaselineRefused` marker, which has no deployed values
|
|
40239
|
+
* at all and therefore treats every declared parameter as divergent
|
|
40240
|
+
* ({@link resourcesNamingDeclaredParameter}). It lives in this layer because
|
|
40241
|
+
* `src/deployment` may not import from `src/cli`.
|
|
40242
|
+
*
|
|
40243
|
+
* TAINT THROUGH ANOTHER RESOURCE'S ATTRIBUTES IS FOLLOWED within one stack: the
|
|
40244
|
+
* walk records the target of every `Fn::GetAtt` / `${A.Attr}`, and the refused
|
|
40245
|
+
* set is closed over those targets. A plain `Ref` of a resource is NOT
|
|
40246
|
+
* followed: it yields the physical id, and a secret used as a resource NAME is
|
|
40247
|
+
* already disclosed by the identifier itself.
|
|
40248
|
+
*/
|
|
40249
|
+
/**
|
|
40250
|
+
* Every intrinsic the dependence walk knows how to read. An `Fn::`-prefixed
|
|
40251
|
+
* key OUTSIDE this list is unclassifiable: it may name a parameter in a way
|
|
40252
|
+
* the generic recursion cannot see, so the walk fails closed on it.
|
|
40253
|
+
*/
|
|
40254
|
+
const KNOWN_INTRINSICS = /* @__PURE__ */ new Set([
|
|
40255
|
+
"Fn::GetAtt",
|
|
40256
|
+
"Fn::Join",
|
|
40257
|
+
"Fn::Sub",
|
|
40258
|
+
"Fn::Select",
|
|
40259
|
+
"Fn::Split",
|
|
40260
|
+
"Fn::If",
|
|
40261
|
+
"Fn::Equals",
|
|
40262
|
+
"Fn::And",
|
|
40263
|
+
"Fn::Or",
|
|
40264
|
+
"Fn::Not",
|
|
40265
|
+
"Fn::ImportValue",
|
|
40266
|
+
"Fn::GetStackOutput",
|
|
40267
|
+
"Fn::FindInMap",
|
|
40268
|
+
"Fn::Base64",
|
|
40269
|
+
"Fn::GetAZs",
|
|
40270
|
+
"Fn::Cidr"
|
|
40271
|
+
]);
|
|
40272
|
+
/** `${Name}` / `${Name.Attr}` in an `Fn::Sub` string; `${!Literal}` is an escape. */
|
|
40273
|
+
const SUB_VARIABLE = /\$\{([^!}][^}]*)\}/g;
|
|
40274
|
+
/**
|
|
40275
|
+
* Which names (parameters, but also resources and pseudo parameters — the
|
|
40276
|
+
* caller intersects with the divergent set) the RAW `Properties` of a resource
|
|
40277
|
+
* depend on, plus its resource-level `Condition`.
|
|
40278
|
+
*
|
|
40279
|
+
* Generic by design: instead of modelling each intrinsic's argument grammar it
|
|
40280
|
+
* recurses into EVERY value, so a `Ref` nested in an `Fn::Join` / `Fn::Select`
|
|
40281
|
+
* / `Fn::Split` operand, an `Fn::FindInMap` key, or an `Fn::Sub` variable-map
|
|
40282
|
+
* value is found without being named. Only the three forms that name something
|
|
40283
|
+
* by BARE STRING need their own arm: `Ref`, `Fn::Sub`'s template text, and a
|
|
40284
|
+
* condition name (`Fn::If`'s first argument, and `Condition` inside the
|
|
40285
|
+
* `Conditions` section), which is followed transitively through
|
|
40286
|
+
* `template.Conditions`.
|
|
40287
|
+
*
|
|
40288
|
+
* May throw `RangeError` on a bag deeper than the call stack; the caller wraps
|
|
40289
|
+
* it fail-closed, like the discard walk beside it.
|
|
40290
|
+
*/
|
|
40291
|
+
function collectParameterDependencies(properties, resourceCondition, template) {
|
|
40292
|
+
const names = /* @__PURE__ */ new Set();
|
|
40293
|
+
const attributeTargets = /* @__PURE__ */ new Set();
|
|
40294
|
+
const visitedConditions = /* @__PURE__ */ new Set();
|
|
40295
|
+
let unclassifiable = false;
|
|
40296
|
+
const conditions = template.Conditions !== null && typeof template.Conditions === "object" ? template.Conditions : {};
|
|
40297
|
+
const followCondition = (name) => {
|
|
40298
|
+
if (typeof name !== "string") {
|
|
40299
|
+
unclassifiable = true;
|
|
40300
|
+
return;
|
|
40301
|
+
}
|
|
40302
|
+
if (visitedConditions.has(name)) return;
|
|
40303
|
+
visitedConditions.add(name);
|
|
40304
|
+
if (!Object.hasOwn(conditions, name)) {
|
|
40305
|
+
unclassifiable = true;
|
|
40306
|
+
return;
|
|
40307
|
+
}
|
|
40308
|
+
walk(conditions[name], true);
|
|
40309
|
+
};
|
|
40310
|
+
const walk = (node, inConditions) => {
|
|
40311
|
+
if (node === null || typeof node !== "object") return;
|
|
40312
|
+
if (Array.isArray(node)) {
|
|
40313
|
+
for (const element of node) walk(element, inConditions);
|
|
40314
|
+
return;
|
|
40315
|
+
}
|
|
40316
|
+
for (const [key, value] of Object.entries(node)) {
|
|
40317
|
+
if (key === "Ref") {
|
|
40318
|
+
if (typeof value === "string") names.add(value);
|
|
40319
|
+
else unclassifiable = true;
|
|
40320
|
+
continue;
|
|
40321
|
+
}
|
|
40322
|
+
if (key === "Fn::Sub") {
|
|
40323
|
+
const text = Array.isArray(value) ? value[0] : value;
|
|
40324
|
+
if (typeof text !== "string" || Array.isArray(value) && value.length !== 2) unclassifiable = true;
|
|
40325
|
+
else for (const match of text.matchAll(SUB_VARIABLE)) {
|
|
40326
|
+
const variable = (match[1] ?? "").trim();
|
|
40327
|
+
names.add(variable);
|
|
40328
|
+
const dot = variable.indexOf(".");
|
|
40329
|
+
if (dot > 0) {
|
|
40330
|
+
names.add(variable.slice(0, dot));
|
|
40331
|
+
attributeTargets.add(variable.slice(0, dot));
|
|
40332
|
+
}
|
|
40333
|
+
}
|
|
40334
|
+
if (Array.isArray(value)) walk(value[1], inConditions);
|
|
40335
|
+
continue;
|
|
40336
|
+
}
|
|
40337
|
+
if (key === "Fn::GetAtt") {
|
|
40338
|
+
const target = Array.isArray(value) ? value[0] : value;
|
|
40339
|
+
if (typeof target === "string") {
|
|
40340
|
+
const dot = target.indexOf(".");
|
|
40341
|
+
const logicalId = Array.isArray(value) || dot <= 0 ? target : target.slice(0, dot);
|
|
40342
|
+
names.add(logicalId);
|
|
40343
|
+
attributeTargets.add(logicalId);
|
|
40344
|
+
} else unclassifiable = true;
|
|
40345
|
+
walk(value, inConditions);
|
|
40346
|
+
continue;
|
|
40347
|
+
}
|
|
40348
|
+
if (key === "Fn::If") {
|
|
40349
|
+
if (Array.isArray(value) && value.length === 3) {
|
|
40350
|
+
followCondition(value[0]);
|
|
40351
|
+
walk(value[1], inConditions);
|
|
40352
|
+
walk(value[2], inConditions);
|
|
40353
|
+
} else unclassifiable = true;
|
|
40354
|
+
continue;
|
|
40355
|
+
}
|
|
40356
|
+
if (key === "Condition" && inConditions) {
|
|
40357
|
+
followCondition(value);
|
|
40358
|
+
continue;
|
|
40359
|
+
}
|
|
40360
|
+
if (key.startsWith("Fn::") && !KNOWN_INTRINSICS.has(key)) unclassifiable = true;
|
|
40361
|
+
walk(value, inConditions);
|
|
40362
|
+
}
|
|
40363
|
+
};
|
|
40364
|
+
walk(properties, false);
|
|
40365
|
+
if (resourceCondition !== void 0) followCondition(resourceCondition);
|
|
40366
|
+
return {
|
|
40367
|
+
names,
|
|
40368
|
+
attributeTargets,
|
|
40369
|
+
unclassifiable
|
|
40370
|
+
};
|
|
40371
|
+
}
|
|
40372
|
+
/**
|
|
40373
|
+
* The divergent parameters that ANYTHING in the template names. A declared
|
|
40374
|
+
* parameter nothing names cannot have shaped a resource — and CDK's
|
|
40375
|
+
* `BootstrapVersion` is exactly that on every default-synthesized stack: SSM
|
|
40376
|
+
* typed, never bound by the resolver because nothing references it, hence
|
|
40377
|
+
* always "divergent". Left in, it would arm the unclassifiable-shape refusal on
|
|
40378
|
+
* stacks whose every real parameter is proven.
|
|
40379
|
+
*
|
|
40380
|
+
* "Names" is the UNION of this module's walk and `TemplateParser`'s reference
|
|
40381
|
+
* scan — the same scan the resolver uses to decide an SSM-typed parameter is
|
|
40382
|
+
* unreferenced — so the two cannot disagree about `BootstrapVersion`. An
|
|
40383
|
+
* unclassifiable shape does NOT keep the whole set here: CloudFormation names a
|
|
40384
|
+
* parameter only through `Ref`, `Fn::Sub` text or a condition, and the generic
|
|
40385
|
+
* recursion reads those inside any intrinsic, known or not. A walk that THROWS
|
|
40386
|
+
* keeps the whole set (fail closed).
|
|
40387
|
+
*/
|
|
40388
|
+
function reachableDivergentParameters(template, divergent, rawBags) {
|
|
40389
|
+
if (divergent.size === 0) return /* @__PURE__ */ new Set();
|
|
40390
|
+
try {
|
|
40391
|
+
const roots = [
|
|
40392
|
+
rawBags,
|
|
40393
|
+
template.Resources,
|
|
40394
|
+
template.Outputs,
|
|
40395
|
+
template.Conditions
|
|
40396
|
+
];
|
|
40397
|
+
const named = new Set(collectParameterDependencies(roots, void 0, template).names);
|
|
40398
|
+
const parser = new TemplateParser();
|
|
40399
|
+
for (const root of roots) {
|
|
40400
|
+
if (root === null || typeof root !== "object") continue;
|
|
40401
|
+
for (const name of parser.extractReferences(root)) named.add(name);
|
|
40402
|
+
}
|
|
40403
|
+
return new Set([...divergent].filter((name) => named.has(name)));
|
|
40404
|
+
} catch {
|
|
40405
|
+
return new Set(divergent);
|
|
40406
|
+
}
|
|
40407
|
+
}
|
|
40408
|
+
/** Whether any DECLARED parameter is named by anything in the template. */
|
|
40409
|
+
function namesAnyDeclaredParameter(template) {
|
|
40410
|
+
const declared = template.Parameters;
|
|
40411
|
+
if (declared === null || typeof declared !== "object") return false;
|
|
40412
|
+
const names = new Set(Object.keys(declared));
|
|
40413
|
+
return names.size > 0 && reachableDivergentParameters(template, names, []).size > 0;
|
|
40414
|
+
}
|
|
40415
|
+
/**
|
|
40416
|
+
* The per-stack ARM 4 verdict. Each resource is judged on its TEMPLATE
|
|
40417
|
+
* definition (`Properties` + `Condition`) AND on the raw bag the state record
|
|
40418
|
+
* carries, unioned: a record preserved by a selective merge holds a previous
|
|
40419
|
+
* run's RESOLVED literal (`Value: 'CHANGEME'`), which names no parameter, so
|
|
40420
|
+
* judging it on the state bag alone would leave nothing to carry to the
|
|
40421
|
+
* freshly imported resource that reads its attribute. Template resources that
|
|
40422
|
+
* are not in state at all are judged too, for the same reason.
|
|
40423
|
+
*
|
|
40424
|
+
* Seeds are direct dependents and unclassifiable bags (a bag that cannot be
|
|
40425
|
+
* read cannot be vouched for, and neither can what reads its attributes); the
|
|
40426
|
+
* refused set is then closed over ATTRIBUTE reads, to a fixpoint.
|
|
40427
|
+
*/
|
|
40428
|
+
function computeParameterTaint(template, stateBags, divergent) {
|
|
40429
|
+
const refused = /* @__PURE__ */ new Set();
|
|
40430
|
+
const unclassifiable = /* @__PURE__ */ new Set();
|
|
40431
|
+
const parametersHit = /* @__PURE__ */ new Set();
|
|
40432
|
+
if (divergent.size === 0) return {
|
|
40433
|
+
refused,
|
|
40434
|
+
unclassifiable,
|
|
40435
|
+
parametersHit
|
|
40436
|
+
};
|
|
40437
|
+
const templateResources = template.Resources !== null && typeof template.Resources === "object" ? template.Resources : {};
|
|
40438
|
+
const readers = /* @__PURE__ */ new Map();
|
|
40439
|
+
for (const logicalId of /* @__PURE__ */ new Set([...Object.keys(templateResources), ...stateBags.keys()])) {
|
|
40440
|
+
const definition = Object.hasOwn(templateResources, logicalId) ? templateResources[logicalId] : void 0;
|
|
40441
|
+
const record = definition !== null && typeof definition === "object" ? definition : {};
|
|
40442
|
+
try {
|
|
40443
|
+
const dependencies = collectParameterDependencies([record["Properties"], stateBags.get(logicalId)], record["Condition"], template);
|
|
40444
|
+
readers.set(logicalId, new Set(dependencies.attributeTargets));
|
|
40445
|
+
const hits = [...dependencies.names].filter((name) => divergent.has(name));
|
|
40446
|
+
for (const name of hits) parametersHit.add(name);
|
|
40447
|
+
if (hits.length > 0) refused.add(logicalId);
|
|
40448
|
+
else if (dependencies.unclassifiable) {
|
|
40449
|
+
refused.add(logicalId);
|
|
40450
|
+
unclassifiable.add(logicalId);
|
|
40451
|
+
}
|
|
40452
|
+
} catch {
|
|
40453
|
+
refused.add(logicalId);
|
|
40454
|
+
unclassifiable.add(logicalId);
|
|
40455
|
+
}
|
|
40456
|
+
}
|
|
40457
|
+
for (let grew = refused.size > 0; grew;) {
|
|
40458
|
+
grew = false;
|
|
40459
|
+
for (const [logicalId, targets] of readers) {
|
|
40460
|
+
if (refused.has(logicalId)) continue;
|
|
40461
|
+
if (![...targets].some((target) => refused.has(target))) continue;
|
|
40462
|
+
refused.add(logicalId);
|
|
40463
|
+
grew = true;
|
|
40464
|
+
}
|
|
40465
|
+
}
|
|
40466
|
+
return {
|
|
40467
|
+
refused,
|
|
40468
|
+
unclassifiable,
|
|
40469
|
+
parametersHit
|
|
40470
|
+
};
|
|
40471
|
+
}
|
|
40472
|
+
/**
|
|
40473
|
+
* The reading of a REASON-LESS `observedBaselineRefused` marker (issue
|
|
40474
|
+
* [#3468](https://github.com/go-to-k/cdkd/issues/3468)): which resources'
|
|
40475
|
+
* TEMPLATE definitions name a declared parameter, judged with NO deployed
|
|
40476
|
+
* values at hand — so every declared parameter anything names is divergent.
|
|
40477
|
+
* The answer is {@link computeParameterTaint}'s whole refused set: direct
|
|
40478
|
+
* dependents, unclassifiable bags, and attribute readers of either. Pseudo
|
|
40479
|
+
* parameters never count (the hit test intersects with DECLARED names) and
|
|
40480
|
+
* neither does a parameter nothing names, CDK's Rules-only `BootstrapVersion`
|
|
40481
|
+
* included.
|
|
40482
|
+
*
|
|
40483
|
+
* AN UNCLASSIFIABLE BAG COUNTS ONLY WHEN SOME DECLARED PARAMETER IS NAMED
|
|
40484
|
+
* SOMEWHERE in the template, exactly as in ARM 4, and deliberately: this set
|
|
40485
|
+
* has to cover what an older import's ARM 4 can have marked ON TEMPLATE
|
|
40486
|
+
* EVIDENCE (ARM 4 also read the state bags; a deploy's are resolved literals,
|
|
40487
|
+
* so they are not read here), and ARM 4 never ran on a template in which
|
|
40488
|
+
* nothing names a declared parameter. Counting the
|
|
40489
|
+
* bag regardless would make an old refusal of the other class sticky on every
|
|
40490
|
+
* CDK stack (each declares `BootstrapVersion`) and protect nothing.
|
|
40491
|
+
*
|
|
40492
|
+
* FAILS CLOSED, and never throws: a missing or unreadable template, a
|
|
40493
|
+
* `Resources` section that is not an object, or a walk that throws answers
|
|
40494
|
+
* `true` for every logical id, and says so in `failedClosed` — a cause CLASS,
|
|
40495
|
+
* never a template value or an error message. Absent from a readable
|
|
40496
|
+
* template's `Resources` answers `false` — that resource is being removed, and
|
|
40497
|
+
* a DELETE reads no baseline.
|
|
40498
|
+
*/
|
|
40499
|
+
function resourcesNamingDeclaredParameter(template) {
|
|
40500
|
+
const everything = (failedClosed) => Object.assign(() => true, { failedClosed });
|
|
40501
|
+
try {
|
|
40502
|
+
if (template === void 0 || template === null || typeof template !== "object") return everything("unreadable-template");
|
|
40503
|
+
const resources = template.Resources;
|
|
40504
|
+
if (resources === null || typeof resources !== "object" || Array.isArray(resources)) return everything("unreadable-template");
|
|
40505
|
+
const parameters = template.Parameters;
|
|
40506
|
+
if (parameters !== void 0 && (parameters === null || typeof parameters !== "object" || Array.isArray(parameters))) return everything("unreadable-template");
|
|
40507
|
+
const divergent = reachableDivergentParameters(template, new Set(Object.keys(parameters ?? {})), []);
|
|
40508
|
+
const refused = computeParameterTaint(template, /* @__PURE__ */ new Map(), divergent).refused;
|
|
40509
|
+
return Object.assign((logicalId) => refused.has(logicalId), { failedClosed: void 0 });
|
|
40510
|
+
} catch {
|
|
40511
|
+
return everything("walk-threw");
|
|
40512
|
+
}
|
|
40513
|
+
}
|
|
40514
|
+
|
|
40126
40515
|
//#endregion
|
|
40127
40516
|
//#region src/analyzer/skipped-outputs.ts
|
|
40128
40517
|
/**
|
|
@@ -44400,6 +44789,47 @@ var DeployEngine = class DeployEngine {
|
|
|
44400
44789
|
return Object.keys(siblings).length > 0 ? { siblings } : void 0;
|
|
44401
44790
|
}
|
|
44402
44791
|
/**
|
|
44792
|
+
* Issue [#3468](https://github.com/go-to-k/cdkd/issues/3468) — the
|
|
44793
|
+
* fail-closed reading of a REASON-LESS `observedBaselineRefused` marker.
|
|
44794
|
+
*
|
|
44795
|
+
* cdkd 0.290.35 wrote unverifiable-parameter refusals with no reason, so an
|
|
44796
|
+
* absent reason cannot be read as "an UPDATE may clear it". A reason-less
|
|
44797
|
+
* marker on a resource whose TEMPLATE definition names a declared parameter
|
|
44798
|
+
* is stamped `'unverifiable-parameter'` here, IN MEMORY, once, before the
|
|
44799
|
+
* diff: every later arm (the in-place rebuild, the metadata-only spread, the
|
|
44800
|
+
* NO_CHANGE carry, the auto-refresh) then sees the explicit form and needs
|
|
44801
|
+
* no rule of its own, and whatever this deploy saves holds it — the record
|
|
44802
|
+
* heals into the form later binaries read directly. Nothing is saved FOR the
|
|
44803
|
+
* stamp: a deploy that writes no state (`--dry-run`, no changes) re-derives
|
|
44804
|
+
* it next time.
|
|
44805
|
+
*
|
|
44806
|
+
* The template is the RAW one `deploy()` was handed (a nested child engine
|
|
44807
|
+
* gets its own), which is what the dependence walk needs. A template that
|
|
44808
|
+
* cannot be read, or a walk that throws, stamps every reason-less marker
|
|
44809
|
+
* (`resourcesNamingDeclaredParameter` fails closed). A record whose logical
|
|
44810
|
+
* id the template no longer defines is being DELETED and is left alone.
|
|
44811
|
+
*
|
|
44812
|
+
* The RECORD object is replaced, not mutated (a per-record alias taken
|
|
44813
|
+
* before this line keeps what was loaded); the container is updated in
|
|
44814
|
+
* place, which is what lets every later reader of it see the stamp.
|
|
44815
|
+
*/
|
|
44816
|
+
stampReasonlessParameterRefusals(stateResources, template) {
|
|
44817
|
+
let namesParameter;
|
|
44818
|
+
let stamped = 0;
|
|
44819
|
+
for (const [logicalId, resource] of Object.entries(stateResources)) {
|
|
44820
|
+
if (!hasReasonlessBaselineRefusal(resource)) continue;
|
|
44821
|
+
namesParameter ??= resourcesNamingDeclaredParameter(template);
|
|
44822
|
+
if (!namesParameter(logicalId)) continue;
|
|
44823
|
+
stateResources[logicalId] = {
|
|
44824
|
+
...resource,
|
|
44825
|
+
observedBaselineRefusalReason: "unverifiable-parameter"
|
|
44826
|
+
};
|
|
44827
|
+
stamped++;
|
|
44828
|
+
}
|
|
44829
|
+
if (namesParameter?.failedClosed !== void 0) this.logger.debug(`The template's parameter dependence could not be judged (${namesParameter.failedClosed}): every observed-baseline refusal recorded without a reason is treated as an unverifiable-parameter refusal (${stamped} stamped).`);
|
|
44830
|
+
if (stamped > 0) this.logger.debug(`${stamped} resource(s) carry an observed-baseline refusal recorded without a reason by an older cdkd, and their template definition reads a template parameter: treated as an unverifiable-parameter refusal (kept until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter).`);
|
|
44831
|
+
}
|
|
44832
|
+
/**
|
|
44403
44833
|
* Kick off `provider.readCurrentState` for every resource in the
|
|
44404
44834
|
* loaded state that lacks `observedProperties` (e.g. state written
|
|
44405
44835
|
* by a pre-v3 binary, or a v3 record where a NO_CHANGE-skipped
|
|
@@ -44509,6 +44939,7 @@ var DeployEngine = class DeployEngine {
|
|
|
44509
44939
|
this.logger.info(failedOnly ? `A previous deploy of '${stackName}' failed and was automatically rolled back. The failed resource may be partially applied — run 'cdkd rollback ${stackName} --revert-failed' to revert it, or continue deploying to fix forward (a successful deploy clears this note).` : `A previous deploy of '${stackName}' failed or was interrupted. Run 'cdkd rollback ${stackName}' to revert it, or continue deploying to fix forward.`);
|
|
44510
44940
|
}
|
|
44511
44941
|
} catch {}
|
|
44942
|
+
this.stampReasonlessParameterRefusals(currentState.resources, template);
|
|
44512
44943
|
this.kickOffAutoRefreshObservedProperties(currentState.resources);
|
|
44513
44944
|
this.logger.debug(`Template has ${Object.keys(template.Resources || {}).length} resources`);
|
|
44514
44945
|
const outputsDigestSource = structuredClone({
|
|
@@ -44527,6 +44958,7 @@ var DeployEngine = class DeployEngine {
|
|
|
44527
44958
|
const effectiveTemplate = this.templateParser.filterResourcesByCondition(template, conditions);
|
|
44528
44959
|
const orphanCountBeforeAdoption = (currentState.orphans ?? []).length;
|
|
44529
44960
|
const orphanPlan = await this.adoptRollbackOrphans(currentState, effectiveTemplate);
|
|
44961
|
+
if (Object.keys(orphanPlan.adopted).length > 0) this.stampReasonlessParameterRefusals(currentState.resources, template);
|
|
44530
44962
|
const orphansChanged = Object.keys(orphanPlan.adopted).length > 0 || (currentState.orphans ?? []).length !== orphanCountBeforeAdoption;
|
|
44531
44963
|
const resourceTypes = new Set(Object.values(effectiveTemplate.Resources || {}).map((r) => r.Type).filter((type) => type !== "AWS::CDK::Metadata"));
|
|
44532
44964
|
this.providerRegistry.validateResourceTypes(resourceTypes);
|
|
@@ -46520,5 +46952,5 @@ var DeployEngine = class DeployEngine {
|
|
|
46520
46952
|
};
|
|
46521
46953
|
|
|
46522
46954
|
//#endregion
|
|
46523
|
-
export {
|
|
46524
|
-
//# sourceMappingURL=deploy-engine-
|
|
46955
|
+
export { yellow as $, NestedStackChildDirectDestroyError as $i, identityKeyFor as $n, getDockerCmd as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, PARTITION_TABLE as Ai, refuseMalformedNestedChildOutputs as An, stringifyValue as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, setAwsClients as Bi, findSilentDropProperties as Bn, getBootstrapMarkerKey as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, CFN_TEMPLATE_URL_LIMIT as Ci, malformedOutputsWarning as Cn, importableOutputKeys as Cr, slowCcOperationTimeoutMs as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Di, malformedStateRefusalMessage as Dn, orphansCarriedFrom as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, uploadCfnTemplate as Ei, malformedResourcesWarning as En, orphansAfterRollback as Er, deleteSkipReason as Et, extractDeploymentEventError as F, clearBucketRegionCache as Fi, refuseMalformedState as Fn, rewriteTemplateAssetReferences as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, DependencyError as Gi, STATE_SOURCED_BASELINE_RULES as Gn, validateContainerRepoName as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, CdkdError as Hi, withRetry as Hn, parseBootstrapMarker as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, resolveBucketRegion as Ii, repairMalformedOutputsForReadOnly as In, AssetModeResolver as Ir, isNamelessDynamicReferenceError as It, bold as J, IntrinsicResolutionRefusalError as Ji, TEMPLATE_SOURCED_RULES as Jn, describeDockerCapturedOutput as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, DeployCancelledError as Ki, STATE_SOURCED_CROSS_GENERATION_RULES as Kn, buildDenyExternalAccessPolicy as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, AwsClients as Li, repairMalformedResourcePropertiesForReadOnly as Ln, BOOTSTRAP_MARKER_PREFIX as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, derivePartitionAndUrlSuffix as Mi, refuseMalformedOutputsForDestroy as Mn, buildAssetRedirectMap as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, AssemblyReader as Ni, refuseMalformedResourcePropertiesForOrphan as Nn, createAssetRedirectResolver as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, decodeListingKey as Oi, producerRecordKey as On, shouldRetainResource as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, processStackMessages as Pi, refuseMalformedResourcesForDestroy as Pn, loadPublishableAssetManifest as Pr, getAccountInfo as Pt, red as Q, MalformedProducerRecordRefusalError as Qi, errorCauseChain as Qn, formatDockerLoginError as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, getAwsClients as Ri, repairMalformedResourcesForReadOnly as Rn, assertAssetBucketRegion as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, CFN_TEMPLATE_BODY_LIMIT as Si, malformedOutputsRefusalMessage as Sn, hasUnverifiableParameterRefusal as Sr, isWaitAbandonedError as St, resourcesNamingDeclaredParameter as T, findLargeInlineResources as Ti, malformedResourcePropertiesWarning as Tn, isReadableBag as Tr, deleteIndeterminateGuards as Tt, coerceWarmThroughput as U, ConfigError as Ui, DagBuilder as Un, readBootstrapMarkerBody as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, AssetError as Vi, describeTypeWithThrottleRetry as Vn, isCrossRegionRedirect as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, CrossAccountSecretRefusalError as Wi, TemplateParser as Wn, validateAssetBucketName as Wr, assertRegionMatch as Wt, gray as X, LocalStartServiceError as Xi, createSecretMasker as Xn, describeDockerFailure as Xr, readConfigString as Xt, cyan as Y, LocalInvokeBuildError as Yi, carriesSecretMask as Yn, describeDockerExecFailure as Yr, configStringRefusal as Yt, green as Z, LockError as Zi, dynamicReferenceTokens as Zn, dockerSpawnEnvWithSensitive as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, markRedactedCause as _a, resolveStateBucketWithDefaultAndSource as _i, hasReadableOutputs as _n, CUSTOM_RESOURCE_RESPONSE_PREFIX as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, StackTerminationProtectionError as aa, stripControlChars as ai, s3BucketDomainName as an, recoverMaskedOutput as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, safeStringify$1 as ba, warnDeprecatedNoPrefixCliFlag as bi, malformedExportSourceWarning as bn, hasReadableExportSet as br, startInterruptWatch as bt, replayFailedOperations as c, formatError as ca, Synthesizer as ci, s3BucketWebsiteUrl as cn, LockManager as cr, IAMRoleProvider as ct, updatePartialMessage as d, withErrorHandling as da, getLegacyStateBucketName as di, applyCallerIdentityCredentials as dn, UNREPRODUCIBLE_LOCK_CLAUSE as dr, ProviderRegistry as dt, PartialFailureError as ea, partitionSensitiveEnv as ei, requireConfigString as en, isSingleDynamicReferenceToken as er, collectDeclaredOutputNames as et, updatePartialReason as f, isMarkedNonRetryable as fa, resolveApp as fi, callerEnvCredentials as fn, buildForceUnlockCommand as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, markNonRetryable as ga, resolveStateBucketWithDefault as gi, STATE_RESOURCES_MALFORMED as gn, shellQuote as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, isTransientServerError as ha, resolveSkipPrefix as hi, INTRINSIC_KEYS as hn, formatLockExpiry as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, StackHasActiveImportsError as ia, escapeRegExp$1 as ii, s3BucketArn as in, recordMaskOnlyValue as ir, secretBearing as it, isFinalSnapshotError as j, canonicalizeRegion as ji, refuseMalformedOutputs as jn, WorkGraph as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, expectedOwnerParam as ki, refuseDivergentRecordRegionForDestroy as kn, AssetPublisher as kr, IntrinsicFunctionResolver as kt, replayRollback as l, isCdkdError as la, synthesisStatusMessage as li, applyRoleArnIfSet as ln, S3StateBackend as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, isThrottlingError as ma, resolveCaptureObservedState as mi, DiffCalculator as mn, forceQuitRecoveryClause as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, ResourceTimeoutError as na, runDockerForeground as ni, producerRegionsFromState as nn, maskSecretsInError as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, StateError as oa, AssetManifestLoader as oi, s3BucketDualStackDomainName as on, redactSecretsForState as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, isRetryableTransientError as pa, resolveAutoAssetStorage as pi, envCredentialsAreAssumedRole as pn, buildLockContentionMessage as pr, createMaskedRetryLogger as pt, formatResourceLine as q, DynamicReferenceRegionAmbiguousError as qi, STATE_SOURCED_READBACK_RULES as qn, buildDockerImage as qr, configBooleanRefusal as qt, DeployEngine as r, ResourceUpdateNotSupportedError as ra, runDockerStreaming as ri, withSharedDrainBudget as rn, maskSecretsInText as rr, isExportAliasCollision as rt, planRollback as s, SynthesisError as sa, getDockerImageBySourceHash as si, s3BucketRegionalDomainName as sn, scrubResourceRecord as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, ProvisioningError as ta, redactDockerArgvValues as ti, classifyReplaySecretRegion as tn, markSameGenerationBag as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, normalizeAwsError as ua, getDefaultStateBucketName as ui, AWS_CREDENTIAL_ENV_KEYS as un, rebuildClientForBucketRegion as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, retryClassificationText as va, resolveUseCdkBootstrapAssets as vi, hasReadableResources as vn, DEFAULT_STATE_PREFIX as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, MIGRATE_TMP_PREFIX as wi, malformedRenderedContainersWarning as wn, importableOutputs as wr, UNSPECIFIED_SKIP_REASON as wt, bindingSkippedOutputs as x, __exportAll as xa, ssmResolvedValueType as xi, malformedLocalOutputsWarning as xn, hasReasonlessBaselineRefusal as xr, CloudControlProvider as xt, keptWholeReasonText as y, describeAwsFailure as ya, stateBucketExistenceConfirmed as yi, malformedExportNamesWarning as yn, exportNamesCarriedFrom as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, resetAwsClients as zi, findActionableSilentDrops as zn, ensureAssetStorage as zr, refStateLookupFromResource as zt };
|
|
46956
|
+
//# sourceMappingURL=deploy-engine-BdYBI1uT.js.map
|