@go-to-k/cdkd 0.289.2 → 0.289.3

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 { 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 } from "./logger-D2Md1kTq.js";
2
2
  import { t as awsClientDefaults } from "./aws-client-defaults-D-iYiIJ6.js";
3
- import { t as getCdkdVersion } from "./version-DUhfbsEF.js";
3
+ import { t as getCdkdVersion } from "./version-DPykgdNN.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";
@@ -6075,16 +6075,16 @@ var FileAssetPublisher = class {
6075
6075
  * Create ZIP archive and upload to S3
6076
6076
  */
6077
6077
  async uploadZip(client, dirPath, bucket, key) {
6078
- const archiver = await import("archiver");
6078
+ const { ZipArchive } = await import("archiver");
6079
6079
  const body = await new Promise((resolve, reject) => {
6080
6080
  const chunks = [];
6081
- const archive = archiver.default("zip", { zlib: { level: 9 } });
6081
+ const archive = new ZipArchive({ zlib: { level: 9 } });
6082
6082
  archive.on("data", (chunk) => chunks.push(chunk));
6083
6083
  archive.on("end", () => resolve(Buffer.concat(chunks)));
6084
6084
  archive.on("error", reject);
6085
6085
  if (statSync(dirPath).isDirectory()) archive.directory(dirPath, false);
6086
6086
  else archive.file(dirPath, { name: basename(dirPath) });
6087
- archive.finalize();
6087
+ archive.finalize().catch(reject);
6088
6088
  });
6089
6089
  await client.send(new PutObjectCommand({
6090
6090
  Bucket: bucket,
@@ -11272,6 +11272,15 @@ function resolvedPlaintextOf(secrets, expression) {
11272
11272
  return typeof recorded === "string" ? recorded : void 0;
11273
11273
  }
11274
11274
  /**
11275
+ * Every expression the pass that owns `secrets` resolved — the pair table's
11276
+ * keys, a CONFLICTING one included (it is still an expression this pass saw,
11277
+ * and a second sighting is what a uniqueness rule must count). The map's own
11278
+ * values name only the SURVIVOR per plaintext; this names the losers too.
11279
+ */
11280
+ function resolvedExpressionsOf(secrets) {
11281
+ return [...resolvedPairsOf.get(secrets)?.keys() ?? []];
11282
+ }
11283
+ /**
11275
11284
  * The bag OBJECTS a deploy pass produced ITSELF and installed on a success
11276
11285
  * path — the fact the resolved-pair evidence above cannot state (issue
11277
11286
  * [#2516](https://github.com/go-to-k/cdkd/issues/2516)).
@@ -11289,8 +11298,9 @@ function resolvedPlaintextOf(secrets, expression) {
11289
11298
  * is carried on the object: {@link markSameGenerationBag} at the moment the
11290
11299
  * successful result is installed, consulted by {@link redactSecretsForState}
11291
11300
  * for the object it is handed. A copy of the bag, a derived needle map, a
11292
- * previous generation's record, a scrub / import / drift walk and a bag the
11293
- * engine did not mark all answer `false` and keep the fall-through.
11301
+ * previous generation's record, a scrub / drift walk and a bag nobody marked
11302
+ * all answer `false` and keep the fall-through. `cdkd import` marks the one
11303
+ * bag its own resolver produced (the sixth site below, issue #2745).
11294
11304
  *
11295
11305
  * A `WeakSet` for the reason {@link resolvedPairsOf} is a `WeakMap`: the mark
11296
11306
  * dies with the object it is on, and nothing has to clear it.
@@ -11313,9 +11323,11 @@ const sameGenerationBags = /* @__PURE__ */ new WeakSet();
11313
11323
  * be written as the token this pass recorded. What never qualifies is a bag of
11314
11324
  * MIXED provenance: a provider's `effectiveProperties` replacement may carry
11315
11325
  * previous-state values IN, so an object-level mark on it would prove nothing
11316
- * for those leaves — it stays unmarked and keeps the residual. Nor does the
11317
- * object the resolver produced, marked at resolution time: it is not
11318
- * necessarily the object state ends up holding.
11326
+ * for those leaves — it stays unmarked and keeps the residual. Nor does an
11327
+ * object marked INSIDE the resolver, at resolution time: whether that object,
11328
+ * a narrowed copy of it or a provider's replacement is what gets redacted and
11329
+ * stored is the CALLER's decision, so the mark is taken by the caller at the
11330
+ * redaction call — the engine's five sites, and `cdkd import`'s one.
11319
11331
  *
11320
11332
  * The CONDITIONS are per SITE, not global, and stating them globally is what
11321
11333
  * this paragraph kept getting wrong (PR 2753, rounds 3 and 4). "After the
@@ -11323,9 +11335,9 @@ const sameGenerationBags = /* @__PURE__ */ new WeakSet();
11323
11335
  * and may skip it entirely. "Every leaf this pass produced" is false for the
11324
11336
  * auto-refresh readback of an UNCHANGED resource, where nothing was resolved
11325
11337
  * at all — there the safety comes from the empty secrets map, not from the
11326
- * mark. Read the per-site list below rather than a rule over all five.
11338
+ * mark. Read the per-site list below rather than a rule over all six.
11327
11339
  *
11328
- * The five call sites, and which of them the record HOLDS, because the earlier
11340
+ * The six call sites, and which of them the record HOLDS, because the earlier
11329
11341
  * "two never-installed copies" reading of this paragraph was false once the
11330
11342
  * third copy arrived:
11331
11343
  * - `propertiesToRecord` — the record's `properties`, installed. The resolved
@@ -11359,11 +11371,28 @@ const sameGenerationBags = /* @__PURE__ */ new WeakSet();
11359
11371
  * - the rollback journal's FAILED-op `attemptedProperties` — a marked copy, so
11360
11372
  * that persisted artifact does not carry the plaintext on exactly the
11361
11373
  * failure path. NOT installed on the record.
11374
+ * - `cdkd import`'s `resolveImportedProperties` (issue #2745) — the bag
11375
+ * import's OWN resolver produced from the imported template, marked as the
11376
+ * redaction input; the record holds the redacted COPY, unmarked. Not a
11377
+ * deploy pass, and the mark does not say it is: what it claims is PAIR
11378
+ * PROVENANCE — this bag was produced from this source, in this pass, by the
11379
+ * resolver that recorded these pairs — which import's resolve satisfies
11380
+ * exactly as the create arm's does, since `unresolvedProperties` is the
11381
+ * template bag it resolved and its per-resource map holds the pairs. What
11382
+ * it does NOT claim is that AWS holds the value: `observedProperties` is
11383
+ * captured separately, against the redacted record, and is never marked
11384
+ * here.
11362
11385
  */
11363
11386
  function markSameGenerationBag(bag) {
11364
11387
  sameGenerationBags.add(bag);
11365
11388
  return bag;
11366
11389
  }
11390
+ /**
11391
+ * Exported for `cdkd import`'s unit test, which asserts that the STORED record
11392
+ * is not the marked object (maintainer review of PR 3052). Read-only over the
11393
+ * `WeakSet`: no behavior in this module changes with the export, and the only
11394
+ * writer, {@link markSameGenerationBag}, was exported already.
11395
+ */
11367
11396
  function isSameGenerationBag(bag) {
11368
11397
  return sameGenerationBags.has(bag);
11369
11398
  }
@@ -12683,6 +12712,55 @@ function joinSkeletonSegments(segments) {
12683
12712
  * choice, not the only option.
12684
12713
  */
12685
12714
  function intrinsicSkeletonPattern(source) {
12715
+ const segments = intrinsicSkeletonSegments(source);
12716
+ if (segments === void 0) return void 0;
12717
+ return anchoredSkeletonPattern(segments);
12718
+ }
12719
+ /**
12720
+ * {@link joinSkeletonSegments} anchored at both ends, or `undefined` where the
12721
+ * wildcard cap refused it. The one place the skeleton's regex is built, for
12722
+ * both readers of the segment form — and the one place a literal segment is
12723
+ * ESCAPED: it takes the segment form itself (literal text, or
12724
+ * {@link UNKNOWN_PART}), never pre-built regex text, so a third caller cannot
12725
+ * hand it raw template text and get a pattern with live metacharacters and no
12726
+ * type error (maintainer review of PR 3052).
12727
+ */
12728
+ function anchoredSkeletonPattern(segments) {
12729
+ const body = joinSkeletonSegments(segments.map((segment) => segment === UNKNOWN_PART ? SKELETON_WILDCARD : escapeRegExp(segment)));
12730
+ return body === void 0 ? void 0 : new RegExp(`^${body}$`);
12731
+ }
12732
+ /**
12733
+ * A source part the skeleton cannot know — an `Fn::Join` element that is
12734
+ * itself an intrinsic, or an `Fn::Sub` `${...}` variable. The segment form of
12735
+ * {@link SKELETON_WILDCARD}: what a part IS, before {@link anchoredSkeletonPattern}
12736
+ * — the one speller — turns it into the wildcard.
12737
+ */
12738
+ const UNKNOWN_PART = Symbol("unknown intrinsic part");
12739
+ /**
12740
+ * Stands in, while a source is RENDERED to text, for a part the skeleton cannot
12741
+ * know. A single character so the rendered string keeps the literal parts at
12742
+ * their true offsets, and NOT `}` so {@link dynamicReferenceSpans} reads it as
12743
+ * a token's INNER text (the resolver's `[^}]+`) rather than as its terminator —
12744
+ * which is exactly how a `{Ref}` sitting inside a `{{resolve:...}}` opening
12745
+ * must read. A NUL, RESERVED here as the placeholder: a template string can
12746
+ * carry one (CDK preserves it), so a source whose literal text does is refused
12747
+ * outright rather than rendered with one unknowable part too many.
12748
+ */
12749
+ const UNKNOWN_PART_PLACEHOLDER = "\0";
12750
+ /**
12751
+ * The text of an `Fn::Join` / `Fn::Sub` source in order: a literal part as its
12752
+ * RAW text, an unknowable part as {@link UNKNOWN_PART}. ONE parser for the two
12753
+ * readers of that shape — {@link intrinsicSkeletonPattern}, which hands every
12754
+ * segment to {@link anchoredSkeletonPattern} to spell as a regex, and
12755
+ * {@link positionByIntrinsicFrame}, which needs the
12756
+ * literal text VERBATIM to know where a token's frame begins and ends — so
12757
+ * the two cannot disagree about what a source says (issue #2745).
12758
+ *
12759
+ * `undefined` for any source this cannot describe, per the pattern reader's
12760
+ * doc: a delimiter that is itself an intrinsic, a non-array `Fn::Join`, a
12761
+ * non-string `Fn::Sub` template, an object that is not a single-key intrinsic.
12762
+ */
12763
+ function intrinsicSkeletonSegments(source) {
12686
12764
  const keys = Object.keys(source);
12687
12765
  if (keys.length !== 1) return void 0;
12688
12766
  const key = keys[0];
@@ -12691,14 +12769,12 @@ function intrinsicSkeletonPattern(source) {
12691
12769
  if (!Array.isArray(args) || args.length !== 2) return void 0;
12692
12770
  const [delimiter, parts] = args;
12693
12771
  if (typeof delimiter !== "string" || !Array.isArray(parts)) return void 0;
12694
- const separator = escapeRegExp(delimiter);
12695
12772
  const segments = [];
12696
12773
  parts.forEach((part, index) => {
12697
- if (index > 0) segments.push(separator);
12698
- segments.push(typeof part === "string" ? escapeRegExp(part) : SKELETON_WILDCARD);
12774
+ if (index > 0) segments.push(delimiter);
12775
+ segments.push(typeof part === "string" ? part : UNKNOWN_PART);
12699
12776
  });
12700
- const body = joinSkeletonSegments(segments);
12701
- return body === void 0 ? void 0 : new RegExp(`^${body}$`);
12777
+ return segments;
12702
12778
  }
12703
12779
  if (key === "Fn::Sub") {
12704
12780
  const args = source[key];
@@ -12709,14 +12785,13 @@ function intrinsicSkeletonPattern(source) {
12709
12785
  const variable = /\$\{([^}]*)\}/g;
12710
12786
  let hit;
12711
12787
  while ((hit = variable.exec(template)) !== null) {
12712
- segments.push(escapeRegExp(template.slice(cursor, hit.index)));
12788
+ segments.push(template.slice(cursor, hit.index));
12713
12789
  const inner = hit[1];
12714
- segments.push(inner.startsWith("!") ? escapeRegExp(`\${${inner.slice(1)}}`) : SKELETON_WILDCARD);
12790
+ segments.push(inner.startsWith("!") ? `\${${inner.slice(1)}}` : UNKNOWN_PART);
12715
12791
  cursor = hit.index + hit[0].length;
12716
12792
  }
12717
- segments.push(escapeRegExp(template.slice(cursor)));
12718
- const body = joinSkeletonSegments(segments);
12719
- return body === void 0 ? void 0 : new RegExp(`^${body}$`);
12793
+ segments.push(template.slice(cursor));
12794
+ return segments;
12720
12795
  }
12721
12796
  }
12722
12797
  /** Poison for an expression this pass recorded against two different plaintexts. */
@@ -12754,10 +12829,11 @@ const CONFLICTING_PLAINTEXT = Symbol("conflicting plaintext");
12754
12829
  * iterating it never yields one plaintext twice and a second sighting of an
12755
12830
  * expression is always a DIFFERENT plaintext.
12756
12831
  *
12757
- * SHARED by {@link positionByIntrinsicSkeleton} and
12758
- * {@link positionByCrossStackSource} (issue #2059) rather than copied into the
12759
- * second: the poisoning rule is the subtle half of condition 3, and two copies
12760
- * are two places for it to be relaxed independently.
12832
+ * SHARED by {@link positionByIntrinsicSkeleton},
12833
+ * {@link positionByCrossStackSource} (issue #2059) and
12834
+ * {@link positionByIntrinsicFrame} (issue #2745) rather than copied: the
12835
+ * poisoning rule is the subtle half of condition 3, and every copy is another
12836
+ * place for it to be relaxed independently.
12761
12837
  */
12762
12838
  function plaintextIndexOf(secrets) {
12763
12839
  const plaintextOf = /* @__PURE__ */ new Map();
@@ -12903,8 +12979,9 @@ function associationForSource(source, secrets) {
12903
12979
  * leaf identity; the arm fires only for the spellings
12904
12980
  * {@link crossStackSourceKey} can key; and
12905
12981
  * condition 1 still demands that the bag leaf be a plaintext this pass
12906
- * resolved. Every rejection degrades to {@link positionByIntrinsicSkeleton} and
12907
- * then to the value scan, i.e. to today's behavior.
12982
+ * resolved. Every rejection degrades to {@link positionByIntrinsicSkeleton},
12983
+ * {@link positionByIntrinsicFrame} and then to the value scan, i.e. to today's
12984
+ * behavior.
12908
12985
  */
12909
12986
  function positionByCrossStackSource(bag, source, secrets) {
12910
12987
  const association = associationForSource(source, secrets);
@@ -12930,7 +13007,8 @@ function positionByCrossStackSource(bag, source, secrets) {
12930
13007
  * 1. The bag leaf's WHOLE value is a recorded secret plaintext. The skeleton
12931
13008
  * describes ONE complete `{{resolve:...}}` token, so a leaf that merely
12932
13009
  * EMBEDS a secret (a join with surrounding text) is not this shape at all
12933
- * and must keep going to the value scan, which rewrites just the substring.
13010
+ * and goes on to {@link positionByIntrinsicFrame} (issue #2745), and only
13011
+ * where that refuses to the value scan, which rewrites just the substring.
12934
13012
  * 2. EXACTLY ONE candidate matches. Two matching candidates mean the skeleton
12935
13013
  * genuinely cannot separate them (`{Ref}` in the position that differs), and
12936
13014
  * guessing would be the collapse this fix exists to remove, one step over.
@@ -12942,8 +13020,9 @@ function positionByCrossStackSource(bag, source, secrets) {
12942
13020
  * candidate absent from that map is a collapsed LOSER, which is the case
12943
13021
  * this whole function exists to serve, so it is accepted.
12944
13022
  *
12945
- * Every rejection degrades to the value scan, i.e. to today's behavior, so no
12946
- * case gets worse than it is without this pass.
13023
+ * Every rejection falls to {@link positionByIntrinsicFrame} (issue #2745) and,
13024
+ * where that arm refuses too, to the value scan, i.e. to today's behavior, so
13025
+ * no case gets worse than it is without this pass.
12947
13026
  *
12948
13027
  * One residual is worth naming rather than leaving to be rediscovered: a single
12949
13028
  * WRONG candidate can win only when this leaf's own expression is in NEITHER
@@ -12990,13 +13069,14 @@ function positionByIntrinsicSkeleton(bag, source, secrets, secretExpressions) {
12990
13069
  return matched;
12991
13070
  }
12992
13071
  /**
12993
- * The ONE-span frame shared by {@link positionByEmbeddedSpan} and
13072
+ * The ONE-span frame shared by {@link positionByEmbeddedSpan},
13073
+ * {@link positionByIntrinsicFrame} (over the source's rendered text) and
12994
13074
  * {@link learnMixedLeafNeedle}: a source holding exactly one `{{resolve:...}}`
12995
13075
  * token, and a bag that starts with the source's prefix and ends with its
12996
13076
  * suffix with something non-empty between them that is NOT itself a complete
12997
13077
  * token (an already-redacted record is a persisted answer, not a plaintext).
12998
- * `undefined` for any other shape. One helper rather than two copies so the
12999
- * two refusals cannot drift apart.
13078
+ * `undefined` for any other shape. One helper rather than three copies so the
13079
+ * three refusals cannot drift apart.
13000
13080
  */
13001
13081
  function singleSpanFrame(bag, source) {
13002
13082
  const spans = dynamicReferenceSpans(source);
@@ -13105,32 +13185,28 @@ function singleSpanFrame(bag, source) {
13105
13185
  * for a 4+ character coincidence in a readback. Every refusal of this arm
13106
13186
  * returns the scan's answer, so a leaf refused for interference (a frame
13107
13187
  * that is itself a recorded plaintext, say) has its frame rewritten and its
13108
- * sub-floor middle left in plaintext. And this arm positions a LITERAL
13109
- * source leaf only: an `Fn::Join` / `Fn::Sub` source rendering the same
13110
- * `port:` + token goes to {@link positionByIntrinsicSkeleton}, which refuses
13111
- * unless the WHOLE bag is a recorded plaintext, so a sub-floor secret
13112
- * embedded through an intrinsic the dominant CDK shape still falls to
13113
- * the value scan and persists in plaintext. `cdkd scrub`, the documented
13114
- * repair tool for a pre-GHSA record, cannot repair a sub-floor embedded leaf
13115
- * either: it walks a STORED bag, which no deploy marked, so the arm is
13116
- * unreachable from it by construction and the leaf keeps the scan's answer.
13117
- * The MASKING channel keeps the residual whole: `maskSecretsInText`'s
13118
- * substring arm carries the same four-character floor, so once this arm has
13119
- * put `port:{{resolve:...}}` in state, a warn line quoting an AWS message can
13120
- * still print `port:q7`. Pre-existing and not a regression -- the #2453 class,
13121
- * and the reason the list would otherwise read as complete when it is not
13122
- * (maintainer review of PR 2753, round 2).
13123
- *
13124
- * The next DEPLOY of that resource repairs the leaves this arm is eligible
13125
- * for — a LITERAL source leaf on a bag the engine marks — because the
13126
- * re-check compares unequal against a record holding the plaintext and the
13127
- * resource is written again from a bag this pass produced. The residuals
13128
- * named above (an `effectiveProperties` substitution, an intrinsic source
13129
- * shape) are not repaired by that deploy either; they stay tracked by
13130
- * #2745. Tracked, with the sub-floor
13131
- * residuals of a nested-stack child's inherited parameter and of `cdkd
13132
- * import`'s own resolution, by issue
13133
- * [#2745](https://github.com/go-to-k/cdkd/issues/2745).
13188
+ * sub-floor middle left in plaintext. This arm positions a LITERAL source
13189
+ * leaf; an `Fn::Join` / `Fn::Sub` source rendering the same `port:` + token
13190
+ * the dominant CDK shape — is {@link positionByIntrinsicFrame}'s (issue
13191
+ * #2745), which shares this arm's bound and mark and refuses a frame that is
13192
+ * not wholly literal (a region `Ref` OUTSIDE the token), where a sub-floor
13193
+ * secret still falls to the value scan and persists in plaintext. `cdkd
13194
+ * scrub`, the documented repair tool for a pre-GHSA record, cannot repair a
13195
+ * sub-floor embedded leaf: it walks a STORED bag, which no deploy marked, so
13196
+ * both arms are unreachable from it by construction and the leaf keeps the
13197
+ * scan's answer. The MASKING channel keeps the residual whole:
13198
+ * `maskSecretsInText`'s substring arm carries the same four-character floor,
13199
+ * so once this arm has put `port:{{resolve:...}}` in state, a warn line
13200
+ * quoting an AWS message can still print `port:q7`. Pre-existing and not a
13201
+ * regression -- the #2453 class, and the reason the list would otherwise
13202
+ * read as complete when it is not (maintainer review of PR 2753, round 2).
13203
+ *
13204
+ * The next DEPLOY of that resource repairs the leaves the two arms are
13205
+ * eligible for — a literal-frame source leaf on a bag the engine marks —
13206
+ * because the re-check compares unequal against a record holding the
13207
+ * plaintext and the resource is written again from a bag this pass produced.
13208
+ * The residuals named above (an `effectiveProperties` substitution, a
13209
+ * nonliteral frame) are not repaired by that deploy either.
13134
13210
  *
13135
13211
  * One shape reaches this arm that a reader may not expect: a WHOLE-token
13136
13212
  * source that FAILED the whole-token arm's `isKnownSecretExpression` gate (an
@@ -13140,31 +13216,58 @@ function singleSpanFrame(bag, source) {
13140
13216
  * where the scan wrote the survivor. Stated so it is not mistaken for a leak.
13141
13217
  *
13142
13218
  * Everything else keeps the pre-#2485 fall-through: two or more spans (which
13143
- * span produced which value is genuinely ambiguous when they share one), an
13144
- * `Fn::Sub` / `Fn::Join` source (an object, not this arm at all — issue #2320's
13145
- * placeholder primitive), a frame mismatch, a middle that is itself a complete
13146
- * token (an already-redacted record, per the same refusal
13147
- * {@link learnMixedLeafNeedle} makes), and a middle this pass cannot vouch for.
13219
+ * span produced which value is genuinely ambiguous when they share one), a
13220
+ * frame mismatch, a middle that is itself a complete token (an
13221
+ * already-redacted record, per the same refusal {@link learnMixedLeafNeedle}
13222
+ * makes), and a middle this pass cannot vouch for. An `Fn::Sub` / `Fn::Join`
13223
+ * source (an object, not this arm at all issue #2320's placeholder
13224
+ * primitive) is {@link positionByIntrinsicFrame}'s since #2745, and reaches
13225
+ * the value scan only where that arm refuses.
13148
13226
  *
13149
13227
  * The frame is copied from the SOURCE, not scanned. A needle occurring in the
13150
13228
  * literal frame would be a reference the template never had at that offset —
13151
13229
  * the fabricated-baseline direction {@link preferPositionDecisions} refuses —
13152
13230
  * and the whole-token arm returns its source unscanned for the same reason.
13153
13231
  *
13154
- * RETURNS THE VALUE SCAN'S ANSWER ON EVERY REFUSAL, not `undefined`: the scan
13155
- * is computed once, here, for `(bag, secrets)` the arm's bound below compares
13156
- * against it, and every fall-through IS it — so the compared value provably
13232
+ * RETURNS THE VALUE SCAN'S ANSWER ON EVERY REFUSAL, not `undefined`: the two
13233
+ * early returns below compute it for `(bag, secrets)`, and the bound in
13234
+ * {@link writeFramedTokenWithinScanBound} computes its own from the same two
13235
+ * arguments — every fall-through IS that scan — so the compared value provably
13157
13236
  * comes from the same bag and map the arm positions. An earlier revision took
13158
13237
  * the scan as a parameter, which left the bound one wrong caller away from
13159
- * comparing against a scan of some other bag with no type error.
13238
+ * comparing against a scan of some other bag with no type error; the shared
13239
+ * helper keeps that property by taking `(bag, secrets)` rather than a scan.
13160
13240
  */
13161
13241
  function positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration) {
13162
- const scanned = redactSecretsForState(bag, secrets);
13163
13242
  const frame = singleSpanFrame(bag, source);
13164
- if (frame === void 0) return scanned;
13243
+ if (frame === void 0) return redactSecretsForState(bag, secrets);
13244
+ const recorded = resolvedPlaintextOf(secrets, frame.token);
13245
+ if (recorded === void 0 || recorded !== frame.middle) return redactSecretsForState(bag, secrets);
13246
+ return writeFramedTokenWithinScanBound(bag, secrets, frame, bagIsSameGeneration);
13247
+ }
13248
+ /**
13249
+ * Write `prefix + token + suffix` for a framed leaf whose pass-local pair the
13250
+ * CALLER has already verified (`token` resolved to `middle` in the pass that
13251
+ * owns `secrets`), and ONLY where that stays within the value scan's own class
13252
+ * of answer — or, below the scan's floor, on a bag the engine marked. Returns
13253
+ * the scan's answer on every refusal.
13254
+ *
13255
+ * ONE helper for {@link positionByEmbeddedSpan} (a literal source, issue
13256
+ * #2485) and {@link positionByIntrinsicFrame} (an `Fn::Join` / `Fn::Sub`
13257
+ * source, issue #2745), for the reason {@link singleSpanFrame} is one: the
13258
+ * bound and the mark are the two claims this module makes about a FRAMED
13259
+ * leaf, and two copies are two places for one of them to be relaxed alone.
13260
+ *
13261
+ * THE SCAN IS COMPUTED HERE, for `(bag, secrets)` — the bound below compares
13262
+ * against it, and every fall-through IS it — so the compared value provably
13263
+ * comes from the same bag and map the token is written into. An earlier
13264
+ * revision of the literal arm took the scan as a parameter, which left the
13265
+ * bound one wrong caller away from comparing against a scan of some other
13266
+ * bag with no type error.
13267
+ */
13268
+ function writeFramedTokenWithinScanBound(bag, secrets, frame, bagIsSameGeneration) {
13269
+ const scanned = redactSecretsForState(bag, secrets);
13165
13270
  const { token, prefix, suffix, middle } = frame;
13166
- const recorded = resolvedPlaintextOf(secrets, token);
13167
- if (recorded === void 0 || recorded !== middle) return scanned;
13168
13271
  const survivor = secrets.get(middle);
13169
13272
  if (survivor === void 0) return scanned;
13170
13273
  if (scanned === prefix + survivor + suffix) return prefix + token + suffix;
@@ -13172,6 +13275,152 @@ function positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration) {
13172
13275
  return scanned;
13173
13276
  }
13174
13277
  /**
13278
+ * Position a bag leaf whose `Fn::Join` / `Fn::Sub` source EMBEDS exactly one
13279
+ * `{{resolve:...}}` token inside LITERAL surrounding text — `port:` + token —
13280
+ * by writing that token into the frame the source states (issue
13281
+ * [#2745](https://github.com/go-to-k/cdkd/issues/2745)).
13282
+ *
13283
+ * This is the intrinsic twin of {@link positionByEmbeddedSpan}, and the shape
13284
+ * is the DOMINANT one rather than a corner: `'port:' + secret.secretValueFromJson('pin')`
13285
+ * renders the secret ARN as a `Ref`, so CDK emits
13286
+ * `{"Fn::Join": ["", ["port:{{resolve:secretsmanager:", {"Ref": ...}, ":SecretString:pin::}}"]]}`
13287
+ * — the prefix FUSED into the token's opening part, the `Ref` INSIDE the
13288
+ * token. Before this arm such a leaf had no positioning route at all:
13289
+ * {@link positionByIntrinsicSkeleton} refuses unless the WHOLE bag is a
13290
+ * recorded plaintext (its condition 1), and {@link positionByEmbeddedSpan}
13291
+ * needs a source STRING to copy its frame from. So it fell to the value scan,
13292
+ * which for a 4+ character middle writes the map's SURVIVOR (a same-plaintext
13293
+ * sibling's spelling, the #1904 / #2485 class) and for a 1-3 character middle
13294
+ * writes NOTHING — {@link buildNeedleRegex} drops it from the alternation —
13295
+ * and `port:q7` was persisted in plaintext.
13296
+ *
13297
+ * HOW THE FRAME IS FOUND. The source is rendered to text by
13298
+ * {@link intrinsicSkeletonSegments} — the same parser the skeleton arm reads —
13299
+ * with each unknowable part as one {@link UNKNOWN_PART_PLACEHOLDER}, and
13300
+ * {@link singleSpanFrame} then finds the ONE token in that text exactly as it
13301
+ * does for a literal source. The prefix and suffix must be wholly literal: a
13302
+ * placeholder OUTSIDE the token (a region `Ref` after it, the `DB_URL` shape
13303
+ * of the `secrets-dynamic-ref` fixture) means the source cannot establish
13304
+ * where the middle ends, and the leaf is REFUSED — the nonliteral-frame shape
13305
+ * #2745 deliberately defers. Inside the token a placeholder becomes a
13306
+ * {@link SKELETON_WILDCARD}, capped by {@link MAX_SKELETON_WILDCARDS} through
13307
+ * the same {@link joinSkeletonSegments}, so the token pattern is the skeleton
13308
+ * arm's pattern restricted to the token's own extent.
13309
+ *
13310
+ * THE EVIDENCE, three checks and each removes a different way of being wrong:
13311
+ *
13312
+ * 1. EXACTLY ONE candidate expression matches the token pattern, and is not
13313
+ * DEMONSTRABLY another value's — the skeleton arm's conditions 2 and 3,
13314
+ * over its two candidate stores PLUS the pass-local pair table
13315
+ * ({@link resolvedExpressionsOf}; the code says why), and the same
13316
+ * {@link plaintextIndexOf} poisoning rule, with `middle` in the role the
13317
+ * whole bag plays there.
13318
+ * 2. THIS PASS resolved that candidate to the middle ({@link recordResolvedPair},
13319
+ * per map instance) — the literal arm's evidence, and what a
13320
+ * shape-plausible expression this pass never resolved to the middle
13321
+ * (another resource's, typically) cannot satisfy. What it does NOT prove
13322
+ * is that the candidate is THIS leaf's token. A leaf
13323
+ * whose own reference resolved PUBLIC (an `ssm` `String`, which nothing
13324
+ * records) and carries an unknowable part INSIDE its token (a `Ref` in the
13325
+ * parameter name — a wholly literal public token matches no candidate and
13326
+ * refuses), beside a same-service SECRET sibling whose value coincides
13327
+ * with the middle, passes all three checks and takes the sibling's
13328
+ * expression — a wrong REFERENCE, not a disclosure, the class the
13329
+ * floorless whole-value scan already accepts for a whole-leaf coincidence.
13330
+ * Against the value scan: the scan writes the map's SURVIVOR for a 4+
13331
+ * character middle and nothing below the floor, while this arm writes the
13332
+ * same-service candidate — the two coincide only when that candidate is
13333
+ * the survivor, so at 4+ the arm can change WHICH wrong reference is
13334
+ * taken, and below the floor on a marked bag it adds one where the scan
13335
+ * wrote nothing. "Not a disclosure" is a claim about the STORED artifact
13336
+ * only: `resolveReplayProps` (`rollback-executor.ts`) re-resolves every
13337
+ * `{{resolve:` token in a replayed bag without regard to which reference
13338
+ * the leaf named, so a later failed deploy plus `cdkd rollback` resolves
13339
+ * the sibling's expression and writes its CURRENT plaintext into the live
13340
+ * property — the transformed-value-meets-inverse-transform shape of
13341
+ * GHSA-p5qg-v9gv-hc7w's consumer, reached here through a wrong reference
13342
+ * rather than a wrong value (maintainer review of PR 3052). THREE live
13343
+ * consumers re-resolve a stored expression this way, each with a weaker
13344
+ * precondition than the last. `cdkd drift --revert`
13345
+ * (`resolveStateSecretExpressions`, `drift.ts`) needs no failed deploy:
13346
+ * once the sibling rotates, the re-resolved baseline diverges from AWS,
13347
+ * drift fires, and `--revert` pushes the sibling's plaintext to the live
13348
+ * property — and `--accept` is no way out there, since the AWS-side value
13349
+ * of a secret-classified path is masked and `runAccept` refuses to persist
13350
+ * the mask, leaving `--revert` (the harmful button) or a redeploy. A
13351
+ * consumer stack's cross-stack read (`reresolveCrossStackValue`,
13352
+ * `intrinsic-function-resolver.ts`: `Fn::ImportValue`, `Fn::GetStackOutput`,
13353
+ * a parent's `Fn::GetAtt Nested.Outputs.X`) needs nothing at all: the
13354
+ * outputs bag is marked, so a sub-floor write reaches `state.outputs`, and
13355
+ * an ORDINARY deploy of the consumer after the sibling rotates hands the
13356
+ * sibling's current plaintext to the consumer's `provider.create` /
13357
+ * `update`. Stated rather than closed, and pinned by the unit file:
13358
+ * nothing records a public resolution, so this arm cannot tell "absent
13359
+ * because public" from "absent because collapsed"; the PR that closes
13360
+ * #2745's nested-stack site weighs these consumers rather than re-deriving
13361
+ * them.
13362
+ * 3. The write stays within the value scan's class of answer, or — below the
13363
+ * scan's floor — the bag carries the engine's same-generation mark:
13364
+ * {@link writeFramedTokenWithinScanBound}, shared with the literal arm.
13365
+ *
13366
+ * One shape reaches this arm that a reader may not expect, the literal arm's
13367
+ * own: a WHOLE-token source, i.e. an EMPTY frame, where the leaf IS the
13368
+ * middle. {@link positionByIntrinsicSkeleton} runs first and answers for
13369
+ * every such leaf it can; what falls through is its REFUSAL, and this arm
13370
+ * re-asks over a wider candidate set — the pair table names a token this pass
13371
+ * resolved but never pinned (an `ssm` reference whose type came back
13372
+ * unclassifiable, #1901) and which lost the map slot to a sibling, a token
13373
+ * neither of the skeleton's stores can see. With the pair and the bound that
13374
+ * leaf is written back as ITSELF, where the scan wrote the survivor: the
13375
+ * leaf's own expression, never another's. Where the skeleton refused for two
13376
+ * matches, so does this arm (same pattern, a superset of candidates, same
13377
+ * rule); where it refused for want of one — nothing matched, or its only
13378
+ * match was skipped as another plaintext's — this arm may find the leaf's
13379
+ * own token in the pair table. Either way the whole-token answer changes ONLY
13380
+ * where the skeleton had none.
13381
+ *
13382
+ * Every refusal before the bound returns `undefined` and the walk falls to the
13383
+ * value scan; the bound's own refusals return that scan directly — the same
13384
+ * answer either way, today's behavior, so no REFUSAL makes a case worse. The
13385
+ * one ACCEPTANCE that can is check 2's residual above, where a public leaf
13386
+ * gains a wrong reference in place of its plaintext. What stays: the
13387
+ * nonliteral frame above; a source with more than one token; an `Fn::Join`
13388
+ * whose delimiter is itself an intrinsic (the parser refuses it); and
13389
+ * everything the shared bound refuses, listed on the literal arm.
13390
+ */
13391
+ function positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration) {
13392
+ const segments = intrinsicSkeletonSegments(source);
13393
+ if (segments === void 0) return void 0;
13394
+ if (segments.some((s) => s !== UNKNOWN_PART && s.includes(UNKNOWN_PART_PLACEHOLDER))) return;
13395
+ const frame = singleSpanFrame(bag, segments.map((s) => s === UNKNOWN_PART ? UNKNOWN_PART_PLACEHOLDER : s).join(""));
13396
+ if (frame === void 0) return void 0;
13397
+ const { token, prefix, suffix, middle } = frame;
13398
+ if (prefix.includes(UNKNOWN_PART_PLACEHOLDER) || suffix.includes(UNKNOWN_PART_PLACEHOLDER)) return;
13399
+ const pattern = anchoredSkeletonPattern(token.split(UNKNOWN_PART_PLACEHOLDER).flatMap((literal, i) => i === 0 ? [literal] : [UNKNOWN_PART, literal]));
13400
+ if (pattern === void 0) return void 0;
13401
+ const plaintextOf = plaintextIndexOf(secrets);
13402
+ let matched;
13403
+ for (const candidate of /* @__PURE__ */ new Set([
13404
+ ...secretExpressions,
13405
+ ...recordedSecretExpressions$1,
13406
+ ...resolvedExpressionsOf(secrets)
13407
+ ])) {
13408
+ if (candidate.length > MAX_SKELETON_CANDIDATE_LENGTH) return void 0;
13409
+ if (!pattern.test(candidate)) continue;
13410
+ const recordedPlaintext = plaintextOf.get(candidate);
13411
+ if (recordedPlaintext !== void 0 && recordedPlaintext !== middle) continue;
13412
+ if (matched !== void 0) return void 0;
13413
+ matched = candidate;
13414
+ }
13415
+ if (matched === void 0 || resolvedPlaintextOf(secrets, matched) !== middle) return;
13416
+ return writeFramedTokenWithinScanBound(bag, secrets, {
13417
+ token: matched,
13418
+ prefix,
13419
+ suffix,
13420
+ middle
13421
+ }, bagIsSameGeneration);
13422
+ }
13423
+ /**
13175
13424
  * Keys tried, in order, when pairing two arrays whose ORDER cannot be trusted
13176
13425
  * (issue #1915).
13177
13426
  *
@@ -13337,7 +13586,7 @@ function positionListByCrossStackSource(bag, source, secrets) {
13337
13586
  * fetch and no value matching.
13338
13587
  *
13339
13588
  * A source leaf that is an intrinsic OBJECT has no string to copy, so it goes
13340
- * through two positioning passes before the value scan, in this order:
13589
+ * through three positioning passes before the value scan, in this order:
13341
13590
  *
13342
13591
  * - {@link positionByCrossStackSource} (issue #2059), for the two CROSS-STACK
13343
13592
  * spellings `Fn::ImportValue` / `Fn::GetStackOutput`. Those carry no text
@@ -13348,6 +13597,11 @@ function positionListByCrossStackSource(bag, source, secrets) {
13348
13597
  * `Fn::Sub`: when the intrinsic's literal parts describe exactly one of the
13349
13598
  * recorded secret expressions, THAT is persisted. This is the dominant CDK
13350
13599
  * shape — an L2 secret token renders the ARN as a `Ref`, hence a join.
13600
+ * - {@link positionByIntrinsicFrame} (issue #2745), for the same two spellings
13601
+ * when their literal parts FRAME one token (`port:` +
13602
+ * `secretValueFromJson(...)`): the one candidate this pass resolved to the
13603
+ * framed middle is written into the frame, under the literal span arm's
13604
+ * bound and mark.
13351
13605
  *
13352
13606
  * An ARRAY leaf beside such an intrinsic OBJECT — the shape a
13353
13607
  * `CommaDelimitedList` nested-stack parameter produces once the child has
@@ -13357,9 +13611,10 @@ function positionListByCrossStackSource(bag, source, secrets) {
13357
13611
  * is aligned against a source array that does not exist; see that function for
13358
13612
  * the two shapes it refuses.
13359
13613
  *
13360
- * The value scan is still applied wherever none can answer: a leaf that merely
13361
- * EMBEDS a secret inside surrounding text, an intrinsic whose skeleton matches
13362
- * zero or several candidates, a cross-stack leaf whose identity is not
13614
+ * The value scan is still applied wherever none can answer: an embedding leaf
13615
+ * the span arms refuse (a nonliteral frame, a middle no pair of this pass
13616
+ * vouches for), an intrinsic whose skeleton matches several candidates (or
13617
+ * none, the pair table included), a cross-stack leaf whose identity is not
13363
13618
  * literally computable, a diverged shape, a key the source lacks. So the passes
13364
13619
  * are complementary rather than alternatives — path where position is knowable,
13365
13620
  * association where the position is a cross-stack read, skeleton where it is a
@@ -13378,6 +13633,8 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
13378
13633
  if (certified !== void 0) return certified;
13379
13634
  const positioned = positionByIntrinsicSkeleton(bag, source, secrets, secretExpressions);
13380
13635
  if (positioned !== void 0) return positioned;
13636
+ const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
13637
+ if (framed !== void 0) return framed;
13381
13638
  }
13382
13639
  if (Array.isArray(bag) && isPlainObject$2(source)) {
13383
13640
  const positionedList = positionListByCrossStackSource(bag, source, secrets);
@@ -27748,7 +28005,7 @@ var CloudControlProvider = class {
27748
28005
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
27749
28006
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
27750
28007
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
27751
- const { ASGProvider } = await import("./asg-provider-C5FQJwUN.js").then((n) => n.n);
28008
+ const { ASGProvider } = await import("./asg-provider-rQ1BW281.js").then((n) => n.n);
27752
28009
  const asgProvider = new ASGProvider();
27753
28010
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
27754
28011
  }
@@ -40084,5 +40341,5 @@ var DeployEngine = class DeployEngine {
40084
40341
  };
40085
40342
 
40086
40343
  //#endregion
40087
- export { collectInlinePolicyNamesManagedBySiblings as $, describeDockerCapturedOutput as $n, LocalInvokeBuildError as $r, DagBuilder as $t, isStatefulRecreateTargetForReplace as A, orphansAfterRollback as An, uploadCfnTemplate as Ar, coerceCfnBoolean as At, gray as B, AssetModeResolver as Bn, resolveBucketRegion as Br, withSharedDrainBudget as Bt, refusesFinalSnapshot as C, forceQuitRecoveryClause as Cn, resolveUseCdkBootstrapAssets as Cr, isUnboundTemplateParameter as Ct, makeSiblingClaimReader as D, exportNamesCarriedFrom as Dn, CFN_TEMPLATE_URL_LIMIT as Dr, normalizeAwsTagsToCfn as Dt, extractDeploymentEventError as E, DEFAULT_STATE_PREFIX as En, CFN_TEMPLATE_BODY_LIMIT as Er, WAFv2WebACLProvider as Et, isWarmThroughputDecrease as F, WorkGraph as Fn, canonicalizeRegion as Fr, requireConfigArray as Ft, collectPublishedOutputNames as G, isCrossRegionRedirect as Gn, AssetError as Gr, s3BucketWebsiteUrl as Gt, red as H, assertAssetBucketRegion as Hn, getAwsClients as Hr, s3BucketDomainName as Ht, toFiniteNumber as I, buildAssetRedirectMap as In, derivePartitionAndUrlSuffix as Ir, requireConfigObject as It, secretBearing as J, validateAssetBucketName as Jn, CrossAccountSecretRefusalError as Jr, INTRINSIC_KEYS as Jt, exportAliasCollisionScrubWarning as K, parseBootstrapMarker as Kn, CdkdError as Kr, applyRoleArnIfSet as Kt, formatResourceLine as L, createAssetRedirectResolver as Ln, AssemblyReader as Lr, requireConfigString as Lt, renderStatefulReason as M, shouldRetainResource as Mn, displaySafe as Mr, configStringRefusal as Mt, WARM_THROUGHPUT_MEMBERS as N, AssetPublisher as Nn, expectedOwnerParam as Nr, readConfigString as Nt, planOrphanAdoption as O, importableOutputKeys as On, MIGRATE_TMP_PREFIX as Or, resolveExplicitPhysicalId as Ot, coerceWarmThroughput as P, stringifyValue as Pn, PARTITION_TABLE as Pr, replayWarn as Pt, IAMRoleProvider as Q, buildDockerImage as Qn, IntrinsicResolutionRefusalError as Qr, withRetry as Qt, bold as R, loadPublishableAssetManifest as Rn, processStackMessages as Rr, classifyReplaySecretRegion as Rt, isFinalSnapshotError as S, __exportAll as Si, buildLockContentionMessage as Sn, resolveStateBucketWithDefaultAndSource as Sr, getAccountInfo as St, makeCanonicalizePropertiesFn as T, CUSTOM_RESOURCE_RESPONSE_PREFIX as Tn, warnDeprecatedNoPrefixCliFlag as Tr, refStateLookupFromResource as Tt, yellow as U, ensureAssetStorage as Un, resetAwsClients as Ur, s3BucketDualStackDomainName as Ut, green as V, BOOTSTRAP_MARKER_PREFIX as Vn, AwsClients as Vr, s3BucketArn as Vt, collectDeclaredOutputNames as W, getBootstrapMarkerKey as Wn, setAwsClients as Wr, s3BucketRegionalDomainName as Wt, secretSafeKeyDisplay as X, buildDenyExternalAccessPolicy as Xn, DeployCancelledError as Xr, findSilentDropProperties as Xt, secretBearingStateKeyWarning as Y, validateContainerRepoName as Yn, DependencyError as Yr, findActionableSilentDrops as Yt, getCurrentResourceSecrets as Z, describeAwsFailure as Zn, DynamicReferenceRegionAmbiguousError as Zr, describeTypeWithThrottleRetry as Zt, ATOMIC_FINAL_SNAPSHOT_TYPES as _, isThrottlingError as _i, LockManager as _n, resolveApp as _r, isTerminationProtectionPropagationError as _t, DeploymentEventsStore as a, ResourceTimeoutError as ai, carriesSecretMask as an, partitionSensitiveEnv as ar, maskerOrIdentity as at, ccRoutedFinalSnapshotError as b, markRedactedCause as bi, UNRENDERABLE as bn, resolveSkipPrefix as br, cfnRefValueFromPhysicalId as bt, replayFailedOperations as c, StackTerminationProtectionError as ci, errorCauseChain as cn, runDockerStreaming as cr, interruptWatchListenerCount as ct, updatePartialReason as d, formatError as di, maskSecretsInError as dn, AssetManifestLoader as dr, CloudControlProvider as dt, LocalStartServiceError as ei, TemplateParser as en, describeDockerExecFailure as er, clearOnUpdateRemoval as et, withResourceDeadline as f, isCdkdError as fi, maskSecretsInText as fn, getDockerImageBySourceHash as fr, slowCcOperationTimeoutMs as ft, bindingSkippedOutputs as g, isRetryableTransientError as gi, scrubResourceRecord as gn, getLegacyStateBucketName as gr, disableInstanceApiTermination as gt, computeImplicitDeleteEdges as h, isMarkedNonRetryable as hi, redactSecretsForState as hn, getDefaultStateBucketName as hr, deleteSkipReason as ht, DeploymentEventsReader as i, ProvisioningError as ii, TEMPLATE_SOURCED_RULES as in, getDockerCmd as ir, maskDeep as it, isStatefulRecreateTargetSync as j, orphansCarriedFrom as jn, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as jr, configBooleanRefusal as jt, MULTI_REGION_RECREATE_BLOCKED_TYPES as k, importableOutputs as kn, findLargeInlineResources as kr, assertRegionMatch as kt, replayRollback as l, StateError as li, identityKeyFor as ln, escapeRegExp$1 as lr, isInterruptedWaitError as lt, IMPLICIT_DELETE_DEPENDENCIES as m, withErrorHandling as mi, recoverMaskedOutput as mn, synthesisStatusMessage as mr, deleteIndeterminateGuards as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, NestedStackChildDirectDestroyError as ni, STATE_SOURCED_CROSS_GENERATION_RULES as nn, dockerSpawnEnvWithSensitive as nr, wouldReturnToSdkProvider as nt, planFailedOps as o, ResourceUpdateNotSupportedError as oi, createSecretMasker as on, redactDockerArgvValues as or, beginCommandInterruptScope as ot, maskingRetryLogger as p, normalizeAwsError as pi, recordMaskOnlyValue as pn, Synthesizer as pr, UNSPECIFIED_SKIP_REASON as pt, isExportAliasCollision as q, readBootstrapMarkerBody as qn, ConfigError as qr, DiffCalculator as qt, DeployEngine as r, PartialFailureError as ri, STATE_SOURCED_READBACK_RULES as rn, formatDockerLoginError as rr, createMaskedRetryLogger as rt, planRollback as s, StackHasActiveImportsError as si, dynamicReferenceTokens as sn, runDockerForeground as sr, endCommandInterruptScope as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, LockError as ti, STATE_SOURCED_BASELINE_RULES as tn, describeDockerFailure as tr, ProviderRegistry as tt, updatePartialMessage as u, SynthesisError as ui, isSingleDynamicReferenceToken as un, stripControlChars as ur, startInterruptWatch as ut, PRE_DELETE_SNAPSHOT_TYPES as v, isTransientServerError as vi, S3StateBackend as vn, resolveAutoAssetStorage as vr, IntrinsicFunctionResolver as vt, unsupportedFinalSnapshotError as w, shellQuote as wn, stateBucketExistenceConfirmed as wr, parameterTypeMayLoseSecretIdentity as wt, createPreDeleteFinalSnapshot as x, retryClassificationText as xi, buildForceUnlockCommand as xn, resolveStateBucketWithDefault as xr, coerceParameterTypedValue as xt, buildFinalSnapshotIdentifier as y, markNonRetryable as yi, rebuildClientForBucketRegion as yn, resolveCaptureObservedState as yr, carriesDynamicReference as yt, cyan as z, rewriteTemplateAssetReferences as zn, clearBucketRegionCache as zr, producerRegionsFromState as zt };
40088
- //# sourceMappingURL=deploy-engine-ClLLdy68.js.map
40344
+ export { collectInlinePolicyNamesManagedBySiblings as $, buildDockerImage as $n, IntrinsicResolutionRefusalError as $r, DagBuilder as $t, isStatefulRecreateTargetForReplace as A, importableOutputs as An, findLargeInlineResources as Ar, coerceCfnBoolean as At, gray as B, rewriteTemplateAssetReferences as Bn, clearBucketRegionCache as Br, withSharedDrainBudget as Bt, refusesFinalSnapshot as C, __exportAll as Ci, buildLockContentionMessage as Cn, resolveStateBucketWithDefaultAndSource as Cr, isUnboundTemplateParameter as Ct, makeSiblingClaimReader as D, DEFAULT_STATE_PREFIX as Dn, CFN_TEMPLATE_BODY_LIMIT as Dr, normalizeAwsTagsToCfn as Dt, extractDeploymentEventError as E, CUSTOM_RESOURCE_RESPONSE_PREFIX as En, warnDeprecatedNoPrefixCliFlag as Er, WAFv2WebACLProvider as Et, isWarmThroughputDecrease as F, stringifyValue as Fn, PARTITION_TABLE as Fr, requireConfigArray as Ft, collectPublishedOutputNames as G, getBootstrapMarkerKey as Gn, setAwsClients as Gr, s3BucketWebsiteUrl as Gt, red as H, BOOTSTRAP_MARKER_PREFIX as Hn, AwsClients as Hr, s3BucketDomainName as Ht, toFiniteNumber as I, WorkGraph as In, canonicalizeRegion as Ir, requireConfigObject as It, secretBearing as J, readBootstrapMarkerBody as Jn, ConfigError as Jr, INTRINSIC_KEYS as Jt, exportAliasCollisionScrubWarning as K, isCrossRegionRedirect as Kn, AssetError as Kr, applyRoleArnIfSet as Kt, formatResourceLine as L, buildAssetRedirectMap as Ln, derivePartitionAndUrlSuffix as Lr, requireConfigString as Lt, renderStatefulReason as M, orphansCarriedFrom as Mn, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Mr, configStringRefusal as Mt, WARM_THROUGHPUT_MEMBERS as N, shouldRetainResource as Nn, displaySafe as Nr, readConfigString as Nt, planOrphanAdoption as O, exportNamesCarriedFrom as On, CFN_TEMPLATE_URL_LIMIT as Or, resolveExplicitPhysicalId as Ot, coerceWarmThroughput as P, AssetPublisher as Pn, expectedOwnerParam as Pr, replayWarn as Pt, IAMRoleProvider as Q, describeAwsFailure as Qn, DynamicReferenceRegionAmbiguousError as Qr, withRetry as Qt, bold as R, createAssetRedirectResolver as Rn, AssemblyReader as Rr, classifyReplaySecretRegion as Rt, isFinalSnapshotError as S, retryClassificationText as Si, buildForceUnlockCommand as Sn, resolveStateBucketWithDefault as Sr, getAccountInfo as St, makeCanonicalizePropertiesFn as T, shellQuote as Tn, stateBucketExistenceConfirmed as Tr, refStateLookupFromResource as Tt, yellow as U, assertAssetBucketRegion as Un, getAwsClients as Ur, s3BucketDualStackDomainName as Ut, green as V, AssetModeResolver as Vn, resolveBucketRegion as Vr, s3BucketArn as Vt, collectDeclaredOutputNames as W, ensureAssetStorage as Wn, resetAwsClients as Wr, s3BucketRegionalDomainName as Wt, secretSafeKeyDisplay as X, validateContainerRepoName as Xn, DependencyError as Xr, findSilentDropProperties as Xt, secretBearingStateKeyWarning as Y, validateAssetBucketName as Yn, CrossAccountSecretRefusalError as Yr, findActionableSilentDrops as Yt, getCurrentResourceSecrets as Z, buildDenyExternalAccessPolicy as Zn, DeployCancelledError as Zr, describeTypeWithThrottleRetry as Zt, ATOMIC_FINAL_SNAPSHOT_TYPES as _, isRetryableTransientError as _i, scrubResourceRecord as _n, getLegacyStateBucketName as _r, isTerminationProtectionPropagationError as _t, DeploymentEventsStore as a, ProvisioningError as ai, carriesSecretMask as an, getDockerCmd as ar, maskerOrIdentity as at, ccRoutedFinalSnapshotError as b, markNonRetryable as bi, rebuildClientForBucketRegion as bn, resolveCaptureObservedState as br, cfnRefValueFromPhysicalId as bt, replayFailedOperations as c, StackHasActiveImportsError as ci, errorCauseChain as cn, runDockerForeground as cr, interruptWatchListenerCount as ct, updatePartialReason as d, SynthesisError as di, markSameGenerationBag as dn, stripControlChars as dr, CloudControlProvider as dt, LocalInvokeBuildError as ei, TemplateParser as en, describeDockerCapturedOutput as er, clearOnUpdateRemoval as et, withResourceDeadline as f, formatError as fi, maskSecretsInError as fn, AssetManifestLoader as fr, slowCcOperationTimeoutMs as ft, bindingSkippedOutputs as g, isMarkedNonRetryable as gi, redactSecretsForState as gn, getDefaultStateBucketName as gr, disableInstanceApiTermination as gt, computeImplicitDeleteEdges as h, withErrorHandling as hi, recoverMaskedOutput as hn, synthesisStatusMessage as hr, deleteSkipReason as ht, DeploymentEventsReader as i, PartialFailureError as ii, TEMPLATE_SOURCED_RULES as in, formatDockerLoginError as ir, maskDeep as it, isStatefulRecreateTargetSync as j, orphansAfterRollback as jn, uploadCfnTemplate as jr, configBooleanRefusal as jt, MULTI_REGION_RECREATE_BLOCKED_TYPES as k, importableOutputKeys as kn, MIGRATE_TMP_PREFIX as kr, assertRegionMatch as kt, replayRollback as l, StackTerminationProtectionError as li, identityKeyFor as ln, runDockerStreaming as lr, isInterruptedWaitError as lt, IMPLICIT_DELETE_DEPENDENCIES as m, normalizeAwsError as mi, recordMaskOnlyValue as mn, Synthesizer as mr, deleteIndeterminateGuards as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, LockError as ni, STATE_SOURCED_CROSS_GENERATION_RULES as nn, describeDockerFailure as nr, wouldReturnToSdkProvider as nt, planFailedOps as o, ResourceTimeoutError as oi, createSecretMasker as on, partitionSensitiveEnv as or, beginCommandInterruptScope as ot, maskingRetryLogger as p, isCdkdError as pi, maskSecretsInText as pn, getDockerImageBySourceHash as pr, UNSPECIFIED_SKIP_REASON as pt, isExportAliasCollision as q, parseBootstrapMarker as qn, CdkdError as qr, DiffCalculator as qt, DeployEngine as r, NestedStackChildDirectDestroyError as ri, STATE_SOURCED_READBACK_RULES as rn, dockerSpawnEnvWithSensitive as rr, createMaskedRetryLogger as rt, planRollback as s, ResourceUpdateNotSupportedError as si, dynamicReferenceTokens as sn, redactDockerArgvValues as sr, endCommandInterruptScope as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, LocalStartServiceError as ti, STATE_SOURCED_BASELINE_RULES as tn, describeDockerExecFailure as tr, ProviderRegistry as tt, updatePartialMessage as u, StateError as ui, isSingleDynamicReferenceToken as un, escapeRegExp$1 as ur, startInterruptWatch as ut, PRE_DELETE_SNAPSHOT_TYPES as v, isThrottlingError as vi, LockManager as vn, resolveApp as vr, IntrinsicFunctionResolver as vt, unsupportedFinalSnapshotError as w, forceQuitRecoveryClause as wn, resolveUseCdkBootstrapAssets as wr, parameterTypeMayLoseSecretIdentity as wt, createPreDeleteFinalSnapshot as x, markRedactedCause as xi, UNRENDERABLE as xn, resolveSkipPrefix as xr, coerceParameterTypedValue as xt, buildFinalSnapshotIdentifier as y, isTransientServerError as yi, S3StateBackend as yn, resolveAutoAssetStorage as yr, carriesDynamicReference as yt, cyan as z, loadPublishableAssetManifest as zn, processStackMessages as zr, producerRegionsFromState as zt };
40345
+ //# sourceMappingURL=deploy-engine-DAykhfpV.js.map