@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.
- package/dist/{asg-provider-C5FQJwUN.js → asg-provider-rQ1BW281.js} +2 -2
- package/dist/{asg-provider-C5FQJwUN.js.map → asg-provider-rQ1BW281.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-ClLLdy68.js → deploy-engine-DAykhfpV.js} +336 -79
- package/dist/deploy-engine-DAykhfpV.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{program-Du5rJeYT.js → program-DLd8dIyf.js} +5 -5
- package/dist/{program-Du5rJeYT.js.map → program-DLd8dIyf.js.map} +1 -1
- package/dist/{version-DUhfbsEF.js → version-DPykgdNN.js} +2 -2
- package/dist/{version-DUhfbsEF.js.map → version-DPykgdNN.js.map} +1 -1
- package/package.json +4 -4
- package/dist/deploy-engine-ClLLdy68.js.map +0 -1
|
@@ -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-
|
|
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
|
|
6078
|
+
const { ZipArchive } = await import("archiver");
|
|
6079
6079
|
const body = await new Promise((resolve, reject) => {
|
|
6080
6080
|
const chunks = [];
|
|
6081
|
-
const archive =
|
|
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 /
|
|
11293
|
-
*
|
|
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
|
|
11317
|
-
* object the resolver
|
|
11318
|
-
*
|
|
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
|
|
11338
|
+
* mark. Read the per-site list below rather than a rule over all six.
|
|
11327
11339
|
*
|
|
11328
|
-
* The
|
|
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(
|
|
12698
|
-
segments.push(typeof part === "string" ?
|
|
12774
|
+
if (index > 0) segments.push(delimiter);
|
|
12775
|
+
segments.push(typeof part === "string" ? part : UNKNOWN_PART);
|
|
12699
12776
|
});
|
|
12700
|
-
|
|
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(
|
|
12788
|
+
segments.push(template.slice(cursor, hit.index));
|
|
12713
12789
|
const inner = hit[1];
|
|
12714
|
-
segments.push(inner.startsWith("!") ?
|
|
12790
|
+
segments.push(inner.startsWith("!") ? `\${${inner.slice(1)}}` : UNKNOWN_PART);
|
|
12715
12791
|
cursor = hit.index + hit[0].length;
|
|
12716
12792
|
}
|
|
12717
|
-
segments.push(
|
|
12718
|
-
|
|
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}
|
|
12758
|
-
* {@link positionByCrossStackSource} (issue #2059)
|
|
12759
|
-
*
|
|
12760
|
-
*
|
|
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}
|
|
12907
|
-
* then to the value scan, i.e. to today's
|
|
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
|
|
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
|
|
12946
|
-
*
|
|
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}
|
|
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
|
|
12999
|
-
*
|
|
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.
|
|
13109
|
-
*
|
|
13110
|
-
*
|
|
13111
|
-
*
|
|
13112
|
-
*
|
|
13113
|
-
* the value scan and persists in plaintext. `cdkd
|
|
13114
|
-
* repair tool for a pre-GHSA record, cannot repair a
|
|
13115
|
-
*
|
|
13116
|
-
* unreachable from it by construction and the leaf keeps the
|
|
13117
|
-
* The MASKING channel keeps the residual whole:
|
|
13118
|
-
* substring arm carries the same four-character floor,
|
|
13119
|
-
* put `port:{{resolve:...}}` in state, a warn line
|
|
13120
|
-
* still print `port:q7`. Pre-existing and not a
|
|
13121
|
-
* and the reason the list would otherwise
|
|
13122
|
-
* (maintainer review of PR 2753, round 2).
|
|
13123
|
-
*
|
|
13124
|
-
* The next DEPLOY of that resource repairs the leaves
|
|
13125
|
-
* for — a
|
|
13126
|
-
* re-check compares unequal against a record holding the
|
|
13127
|
-
* resource is written again from a bag this pass produced.
|
|
13128
|
-
* named above (an `effectiveProperties` substitution,
|
|
13129
|
-
*
|
|
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),
|
|
13144
|
-
*
|
|
13145
|
-
*
|
|
13146
|
-
*
|
|
13147
|
-
*
|
|
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
|
|
13155
|
-
*
|
|
13156
|
-
*
|
|
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
|
|
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
|
|
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:
|
|
13361
|
-
*
|
|
13362
|
-
*
|
|
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-
|
|
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 $,
|
|
40088
|
-
//# sourceMappingURL=deploy-engine-
|
|
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
|