@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.
@@ -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-BYmXwLpd.js";
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)) return secrets.get(bag) ?? 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 — the only shape where this rule redacts LESS than the code it
16394
- * replaced. Narrow but real, and the reachable carrier is named rather than
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) ? dynamicReferenceSpans(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.resolveDynamicReferences(value, context);
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-DWY8_Kn4.js").then((n) => n.n);
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 { isExportAliasCollision as $, StackHasActiveImportsError as $i, maskSecretsInText as $n, escapeRegExp$1 as $r, withSharedDrainBudget as $t, makeCanonicalizePropertiesFn as A, clearBucketRegionCache as Ai, refuseMalformedResourcesForDestroy as An, rewriteTemplateAssetReferences as Ar, getAccountInfo as At, isWarmThroughputDecrease as B, DependencyError as Bi, TemplateParser as Bn, validateContainerRepoName as Br, assertRegionMatch as Bt, PRE_DELETE_SNAPSHOT_TYPES as C, decodeListingKey as Ci, malformedStateRefusalMessage as Cn, shouldRetainResource as Cr, disableInstanceApiTermination as Ct, isFinalSnapshotError as D, derivePartitionAndUrlSuffix as Di, refuseMalformedOutputs as Dn, buildAssetRedirectMap as Dr, carriesFetchableDynamicReference as Dt, createPreDeleteFinalSnapshot as E, canonicalizeRegion as Ei, refuseMalformedNestedChildOutputs as En, WorkGraph as Er, carriesDynamicReference as Et, isStatefulRecreateTargetForReplace as F, setAwsClients as Fi, findActionableSilentDrops as Fn, getBootstrapMarkerKey as Fr, refStateLookupFromResource as Ft, cyan as G, LocalStartServiceError as Gi, carriesSecretMask as Gn, describeDockerFailure as Gr, configStringRefusal as Gt, toFiniteNumber as H, DynamicReferenceRegionAmbiguousError as Hi, STATE_SOURCED_CROSS_GENERATION_RULES as Hn, buildDockerImage as Hr, coerceCfnInteger as Ht, isStatefulRecreateTargetSync as I, AssetError as Ii, findSilentDropProperties as In, isCrossRegionRedirect as Ir, isSettledInstanceState as It, red as J, NestedStackChildDirectDestroyError as Ji, errorCauseChain as Jn, getDockerCmd as Jr, requireConfigArray as Jt, gray as K, LockError as Ki, createSecretMasker as Kn, dockerSpawnEnvWithSensitive as Kr, readConfigString as Kt, renderStatefulReason as L, CdkdError as Li, describeTypeWithThrottleRetry as Ln, parseBootstrapMarker as Lr, WAFv2WebACLProvider as Lt, makeSiblingClaimReader as M, AwsClients as Mi, repairMalformedOutputsForReadOnly as Mn, BOOTSTRAP_MARKER_PREFIX as Mr, isNamelessDynamicReferenceError as Mt, planOrphanAdoption as N, getAwsClients as Ni, repairMalformedResourcePropertiesForReadOnly as Nn, assertAssetBucketRegion as Nr, isUnboundTemplateParameter as Nt, refusesFinalSnapshot as O, AssemblyReader as Oi, refuseMalformedOutputsForDestroy as On, createAssetRedirectResolver as Or, cfnRefValueFromPhysicalId as Ot, MULTI_REGION_RECREATE_BLOCKED_TYPES as P, resetAwsClients as Pi, repairMalformedResourcesForReadOnly as Pn, ensureAssetStorage as Pr, parameterTypeMayLoseSecretIdentity as Pt, exportAliasCollisionScrubWarning as Q, ResourceUpdateNotSupportedError as Qi, maskSecretsInError as Qn, runDockerStreaming as Qr, producerRegionsFromState as Qt, WARM_THROUGHPUT_MEMBERS as R, ConfigError as Ri, withRetry as Rn, readBootstrapMarkerBody as Rr, normalizeAwsTagsToCfn as Rt, ATOMIC_FINAL_SNAPSHOT_TYPES as S, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Si, malformedResourcesWarning as Sn, orphansCarriedFrom as Sr, deleteSkipReason as St, ccRoutedFinalSnapshotError as T, PARTITION_TABLE as Ti, refuseDivergentRecordRegionForDestroy as Tn, stringifyValue as Tr, IntrinsicFunctionResolver as Tt, formatResourceLine as U, IntrinsicResolutionRefusalError as Ui, STATE_SOURCED_READBACK_RULES as Un, describeDockerCapturedOutput as Ur, configBooleanRefusal as Ut, toCfnInteger as V, DeployCancelledError as Vi, STATE_SOURCED_BASELINE_RULES as Vn, buildDenyExternalAccessPolicy as Vr, coerceCfnBoolean as Vt, bold as W, LocalInvokeBuildError as Wi, TEMPLATE_SOURCED_RULES as Wn, describeDockerExecFailure as Wr, configIntegerRefusal as Wt, collectDeclaredOutputNames as X, ProvisioningError as Xi, isSingleDynamicReferenceToken as Xn, redactDockerArgvValues as Xr, requireConfigString as Xt, yellow as Y, PartialFailureError as Yi, identityKeyFor as Yn, partitionSensitiveEnv as Yr, requireConfigObject as Yt, collectPublishedOutputNames as Z, ResourceTimeoutError as Zi, markSameGenerationBag as Zn, runDockerForeground as Zr, classifyReplaySecretRegion as Zt, bagHoldsSecretExpression as _, CFN_TEMPLATE_BODY_LIMIT as _i, malformedLocalOutputsWarning as _n, hasUnverifiableParameterRefusal as _r, CloudControlProvider as _t, DeploymentEventsStore as a, normalizeAwsError as aa, getDefaultStateBucketName as ai, applyRoleArnIfSet as an, S3StateBackend as ar, collectInlinePolicyNamesManagedBySiblings as at, mergeNoChangeOutputs as b, findLargeInlineResources as bi, malformedRenderedContainersWarning as bn, isReadableBag as br, UNSPECIFIED_SKIP_REASON as bt, replayFailedOperations as c, isRetryableTransientError as ca, resolveAutoAssetStorage as ci, callerEnvCredentials as cn, buildForceUnlockCommand as cr, wouldReturnToSdkProvider as ct, updatePartialMessage as d, markNonRetryable as da, resolveStateBucketWithDefault as di, INTRINSIC_KEYS as dn, formatLockExpiry as dr, maskerOrIdentity as dt, StackTerminationProtectionError as ea, stripControlChars as ei, s3BucketArn as en, recordMaskOnlyValue as er, secretBearing as et, updatePartialReason as f, markRedactedCause as fa, resolveStateBucketWithDefaultAndSource as fi, STATE_RESOURCES_MALFORMED as fn, shellQuote as fr, beginCommandInterruptScope as ft, computeImplicitDeleteEdges as g, __exportAll as ga, ssmResolvedValueType as gi, malformedExportSourceWarning as gn, hasReadableExportSet as gr, startInterruptWatch as gt, IMPLICIT_DELETE_DEPENDENCIES as h, safeStringify$1 as ha, warnDeprecatedNoPrefixCliFlag as hi, malformedExportNamesWarning as hn, exportNamesCarriedFrom as hr, isInterruptedWaitError as ht, DeploymentEventsReader as i, isCdkdError as ia, synthesisStatusMessage as ii, s3BucketWebsiteUrl as in, LockManager as ir, IAMRoleProvider as it, extractDeploymentEventError as j, resolveBucketRegion as ji, refuseMalformedState as jn, AssetModeResolver as jr, isImpossibleEmptyStoredAttribute as jt, unsupportedFinalSnapshotError as k, processStackMessages as ki, refuseMalformedResourcePropertiesForOrphan as kn, loadPublishableAssetManifest as kr, coerceParameterTypedValue as kt, replayRollback as l, isThrottlingError as la, resolveCaptureObservedState as li, envCredentialsAreAssumedRole as ln, buildLockContentionMessage as lr, createMaskedRetryLogger as lt, maskingRetryLogger as m, describeAwsFailure as ma, stateBucketExistenceConfirmed as mi, hasReadableResources as mn, DEFAULT_STATE_PREFIX as mr, interruptWatchListenerCount as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, SynthesisError as na, getDockerImageBySourceHash as ni, s3BucketDualStackDomainName as nn, redactSecretsForState as nr, secretSafeKeyDisplay as nt, planFailedOps as o, withErrorHandling as oa, getLegacyStateBucketName as oi, AWS_CREDENTIAL_ENV_KEYS as on, rebuildClientForBucketRegion as or, clearOnUpdateRemoval as ot, withResourceDeadline as p, retryClassificationText as pa, resolveUseCdkBootstrapAssets as pi, hasReadableOutputs as pn, CUSTOM_RESOURCE_RESPONSE_PREFIX as pr, endCommandInterruptScope as pt, green as q, MalformedProducerRecordRefusalError as qi, dynamicReferenceTokens as qn, formatDockerLoginError as qr, replayWarn as qt, DeployEngine as r, formatError as ra, Synthesizer as ri, s3BucketRegionalDomainName as rn, scrubResourceRecord as rr, getCurrentResourceSecrets as rt, planRollback as s, isMarkedNonRetryable as sa, resolveApp as si, applyCallerIdentityCredentials as sn, UNREPRODUCIBLE_LOCK_CLAUSE as sr, ProviderRegistry as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, StateError as ta, AssetManifestLoader as ti, s3BucketDomainName as tn, recoverMaskedOutput as tr, secretBearingStateKeyWarning as tt, resolveReplacementOldType as u, isTransientServerError as ua, resolveSkipPrefix as ui, DiffCalculator as un, forceQuitRecoveryClause as ur, maskDeep as ut, isSecretBearingReferenceString as v, CFN_TEMPLATE_URL_LIMIT as vi, malformedOutputsRefusalMessage as vn, importableOutputKeys as vr, isWaitAbandonedError as vt, buildFinalSnapshotIdentifier as w, expectedOwnerParam as wi, producerRecordKey as wn, AssetPublisher as wr, isTerminationProtectionPropagationError as wt, bindingSkippedOutputs as x, uploadCfnTemplate as xi, malformedResourcePropertiesWarning as xn, orphansAfterRollback as xr, deleteIndeterminateGuards as xt, keptWholeReasonText as y, MIGRATE_TMP_PREFIX as yi, malformedOutputsWarning as yn, importableOutputs as yr, slowCcOperationTimeoutMs as yt, coerceWarmThroughput as z, CrossAccountSecretRefusalError as zi, DagBuilder as zn, validateAssetBucketName as zr, resolveExplicitPhysicalId as zt };
46524
- //# sourceMappingURL=deploy-engine-tX_-qy5a.js.map
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