@go-to-k/cdkd 0.294.9 → 0.294.10
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-3uLGAhIx.js → asg-provider-BFlmarbF.js} +2 -2
- package/dist/{asg-provider-3uLGAhIx.js.map → asg-provider-BFlmarbF.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-BTOCDCWf.js → deploy-engine-RCOtmm4V.js} +571 -205
- package/dist/deploy-engine-RCOtmm4V.js.map +1 -0
- package/dist/{iam-role-provider-CBT2LPe1.js → iam-role-provider-2w-Hr9_h.js} +2 -2
- package/dist/{iam-role-provider-CBT2LPe1.js.map → iam-role-provider-2w-Hr9_h.js.map} +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/{neptune-provider-BQ-CGoYJ.js → neptune-provider-CHnIs1hG.js} +2 -2
- package/dist/{neptune-provider-BQ-CGoYJ.js.map → neptune-provider-CHnIs1hG.js.map} +1 -1
- package/dist/{program-DMJnrQOG.js → program-Eed63bId.js} +5 -5
- package/dist/program-Eed63bId.js.map +1 -0
- package/dist/{provider-classes-DCbt28RB.js → provider-classes-R7yvwymx.js} +180 -60
- package/dist/provider-classes-R7yvwymx.js.map +1 -0
- package/dist/{rds-provider-J6zl27x3.js → rds-provider-DqHELwjV.js} +2 -2
- package/dist/{rds-provider-J6zl27x3.js.map → rds-provider-DqHELwjV.js.map} +1 -1
- package/dist/{version-QrNvZCe0.js → version-BNo3JdVW.js} +2 -2
- package/dist/{version-QrNvZCe0.js.map → version-BNo3JdVW.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-BTOCDCWf.js.map +0 -1
- package/dist/program-DMJnrQOG.js.map +0 -1
- package/dist/provider-classes-DCbt28RB.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js"
|
|
|
2
2
|
import { A as displaySafe, E as UNRENDERABLE, F as safeMsg, L as truncateCodePoints, M as isPasteableIdent, O as displayAwsMessage, P as plainIdentOr, S as withoutGeneratedFallbackName, T as STACK_REF_MAX_CODE_POINTS, _ as getCurrentSkipPrefix, b as withSkipPrefix, c as getLiveRenderer, f as applyDefaultNameForFallback, g as generateResourceNameWithFallback, h as generateResourceName, j as displayStackName, k as displayIdent, m as explicitNamePropertyFor, n as getLogger, r as isStdoutReservedForPayload, s as installLogLineMaskerSource, v as getCurrentStackName, w as SECRET_REF_MAX_CODE_POINTS, x as withStackName, y as looksLikeCdkdGeneratedName } from "./logger-B46YMG0h.js";
|
|
3
3
|
import { $t as StateError, A as isTerminalDeleteFailure, An as isAmbiguousCcHandlerErrorCode, At as clientDefaultsFor, Bn as isMarkedNonRetryable, Bt as IntrinsicResolutionRefusalError, C as refusalTypeShown, Cn as isNameCollisionErrorFrom, D as ProtectionFlipRegistry, Dt as withPasteableAwsProfile, En as isReplayedNameCollisionFrom, Fn as retryClassificationText, Gt as MalformedProducerRecordRefusalError, H as pasteableAwsCommand, Hn as markNonRetryable, In as describeAwsFailure, It as CrossAccountSecretRefusalError, J as isInterruptedWaitError, Jt as ProvisioningError, Lt as DependencyError, M as observeThenDisableProtection, Mn as isIamPropagationError, Mt as AccountIdUnavailableError, N as protectionFlipKey, Nn as isRetryableTransientError, Nt as AssetError, O as compensateProtectionFlip, On as markReplayMayCollide, Ot as ambientClientDefaults, Pn as isTransientServerError, Pt as CdkdError, Q as canonicalizeRoute53QueryName, R as DELETION_PROTECTION_DOC_POINTER, Rn as safeStringify$1, S as quotedRemedyLogicalId, Sn as hasReplayMayCollide, St as injectiveKey, T as resolveExplicitPhysicalId, Tn as isRecreateRetryableError, Tt as producerRecordKey, U as protectedReplacementAdvice, Un as markRedactedCause, Ut as LockError, Vn as isThrottlingError, Wn as wrapMaskedAwsError, Wt as MacroExpansionError, X as ElapsedBudgetRegistry, Xt as ResourceUpdateNotSupportedError, Y as startInterruptWatch, Yt as ResourceTimeoutError, Z as monotonicNowMs, _n as shellQuote, _t as formatLockOperation, at as segmentAfterAnchor, b as isQuotableImportValue, bt as CUSTOM_RESOURCE_RESPONSE_PREFIX, cn as UNSHOWABLE_VALUE, ct as isSecretDerivedValue, d as prepareRemovalForUpdate, dn as isInertUnquoted, dt as withDerivedNameMasks, en as SynthesisError, et as compositeIdSeparatorRefusal, f as removalWarning, fn as pasteableCommand, ft as UNREPRODUCIBLE_LOCK_CLAUSE, g as assertRegionMatch, gn as shellBoundedDisplay, gt as formatLockExpiry, h as RESOURCE_NOT_FOUND, hn as quotedOrDescribed, i as holdsSecretDerivedEntry, it as resourceTypeShown, jn as isAmbiguousOutcomeError, jt as credentialFingerprint, k as deleteWithProtectionCompensation, kn as formatRetryClassificationSignals, kt as ambientCredentialConfig, l as withUnchangedSecretPrincipalLists, ln as commandHole, lt as maskDeep, m as withoutInjectedRemovals, mn as plainOrDescribed, nt as logicalIdShown, on as SHELL_ACTIVE, ot as createMaskedLogSinks, pn as physicalIdShownBesideCommand, pt as buildForceUnlockCommand, rn as normalizeAwsError, sn as SHELL_ACTIVE_WHY, st as createMaskedRetryLogger, ut as maskerOrIdentity, vn as withheldTargetClause, vt as formatLockOwner, wn as isNameCooldownError, x as normalizeAwsTagsToCfn, xn as isUpdateUnsupportedError, xt as DEFAULT_STATE_PREFIX, yt as sanitizeRecoveryValue, zt as DynamicReferenceRegionAmbiguousError } from "./iam-policy-targets-CMSQGQnm.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-D0q0z4dG.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-BNo3JdVW.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
8
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -15683,6 +15683,120 @@ function malformedOrphansForOrphanRefusalMessage(rawStackName, rawRegion, logica
|
|
|
15683
15683
|
return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read — ${namedOrphanRows(logicalIds)} — because the record has no string 'logicalId' or shares it with another row, or its 'state' is not an object, names no resource type, has no non-empty string 'physicalId', or holds a 'properties' or 'attributes' map that is not an object. The record is malformed or truncated. ${verbatim} Those records are not inert: they are what the next 'cdkd deploy' may re-adopt into 'resources' and what 'cdkd diff' previews for adoption, so continuing would report success over damage the next command meets.`, "'cdkd orphan' cannot remove such a record itself: it is not in 'resources', so it has no construct path. Repair the record by hand rather than deleting it — it is the only record that an earlier failed deploy left its resource live in AWS.", ORPHANS_DROP_CAVEAT);
|
|
15684
15684
|
}
|
|
15685
15685
|
|
|
15686
|
+
//#endregion
|
|
15687
|
+
//#region src/deployment/masked-property-fingerprints.ts
|
|
15688
|
+
const FINGERPRINT_LAYOUT$1 = 1;
|
|
15689
|
+
function canonicalJson$2(value) {
|
|
15690
|
+
if (value === void 0) return "null";
|
|
15691
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson$2).join(",")}]`;
|
|
15692
|
+
if (value !== null && typeof value === "object") {
|
|
15693
|
+
const record = value;
|
|
15694
|
+
return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$2(record[key])}`).join(",")}}`;
|
|
15695
|
+
}
|
|
15696
|
+
return JSON.stringify(value) ?? "null";
|
|
15697
|
+
}
|
|
15698
|
+
const REFUSED_FINGERPRINT = "refused:secret-in-template";
|
|
15699
|
+
const FINGERPRINT_PREFIX = "sha256:";
|
|
15700
|
+
function templateCarriesNeedle(templateValue, secrets) {
|
|
15701
|
+
const text = canonicalJson$2(templateValue);
|
|
15702
|
+
for (const needle of printingCorpusOf(secrets).keys()) {
|
|
15703
|
+
if (needle.length < 4) continue;
|
|
15704
|
+
if (text.includes(needle) || text.includes(JSON.stringify(needle).slice(1, -1))) return true;
|
|
15705
|
+
}
|
|
15706
|
+
return false;
|
|
15707
|
+
}
|
|
15708
|
+
function maskedPropertyFingerprint(templateValue) {
|
|
15709
|
+
const digest = createHash("sha256").update(canonicalJson$2({
|
|
15710
|
+
layout: FINGERPRINT_LAYOUT$1,
|
|
15711
|
+
value: templateValue
|
|
15712
|
+
})).digest("hex");
|
|
15713
|
+
return `${FINGERPRINT_PREFIX}${digest}`;
|
|
15714
|
+
}
|
|
15715
|
+
function maskedPropertyFingerprintsFor(recordedProperties, templateProps) {
|
|
15716
|
+
const entries = [];
|
|
15717
|
+
for (const key of Object.keys(recordedProperties)) {
|
|
15718
|
+
if (!Object.hasOwn(templateProps, key)) continue;
|
|
15719
|
+
if (!carriesSecretMask(recordedProperties[key])) continue;
|
|
15720
|
+
entries.push([key, maskedPropertyFingerprint(templateProps[key])]);
|
|
15721
|
+
}
|
|
15722
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
15723
|
+
}
|
|
15724
|
+
function maskedPropertyFingerprintsOf(record) {
|
|
15725
|
+
const read = /* @__PURE__ */ new Map();
|
|
15726
|
+
if (record === null || typeof record !== "object") return read;
|
|
15727
|
+
const field = record.maskedPropertyFingerprints;
|
|
15728
|
+
if (field === null || typeof field !== "object" || Array.isArray(field)) return read;
|
|
15729
|
+
for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
|
|
15730
|
+
return read;
|
|
15731
|
+
}
|
|
15732
|
+
function movedMaskedProperties(record, templateProps) {
|
|
15733
|
+
const recorded = maskedPropertyFingerprintsOf(record);
|
|
15734
|
+
if (recorded.size === 0) return [];
|
|
15735
|
+
const properties = record.properties;
|
|
15736
|
+
if (properties === null || typeof properties !== "object") return [];
|
|
15737
|
+
const moved = [];
|
|
15738
|
+
for (const [key, fingerprint] of recorded) {
|
|
15739
|
+
if (!Object.hasOwn(templateProps, key) || !Object.hasOwn(properties, key)) continue;
|
|
15740
|
+
if (!carriesSecretMask(properties[key])) continue;
|
|
15741
|
+
if (maskedPropertyFingerprint(templateProps[key]) !== fingerprint) moved.push(key);
|
|
15742
|
+
}
|
|
15743
|
+
return moved;
|
|
15744
|
+
}
|
|
15745
|
+
const writtenFromDeployedTemplate = /* @__PURE__ */ new WeakSet();
|
|
15746
|
+
function markWrittenFromDeployedTemplate(bag) {
|
|
15747
|
+
writtenFromDeployedTemplate.add(bag);
|
|
15748
|
+
return bag;
|
|
15749
|
+
}
|
|
15750
|
+
function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, secrets, noEchoParameterValues) {
|
|
15751
|
+
if (templateProps === void 0) return scrubbed;
|
|
15752
|
+
const corpora = [secrets, noEchoParameterValues].filter((corpus) => corpus !== void 0);
|
|
15753
|
+
const written = writtenBag !== null && typeof writtenBag === "object" && writtenFromDeployedTemplate.has(writtenBag);
|
|
15754
|
+
const { maskedPropertyFingerprints: previous, ...rest } = scrubbed;
|
|
15755
|
+
let fingerprints;
|
|
15756
|
+
if (written) fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
|
|
15757
|
+
else {
|
|
15758
|
+
if (previous === void 0 || previous === null || typeof previous !== "object") return scrubbed;
|
|
15759
|
+
if (corpora.length === 0) return scrubbed;
|
|
15760
|
+
fingerprints = { ...previous };
|
|
15761
|
+
}
|
|
15762
|
+
if (fingerprints !== void 0 && corpora.length > 0) {
|
|
15763
|
+
const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
|
|
15764
|
+
if (refused.length > 0) fingerprints = Object.fromEntries(Object.entries(fingerprints).map(([key, value]) => [key, refused.includes(key) ? REFUSED_FINGERPRINT : value]));
|
|
15765
|
+
}
|
|
15766
|
+
if (!written && JSON.stringify(fingerprints) === JSON.stringify(previous)) return scrubbed;
|
|
15767
|
+
return fingerprints === void 0 ? rest : {
|
|
15768
|
+
...rest,
|
|
15769
|
+
maskedPropertyFingerprints: fingerprints
|
|
15770
|
+
};
|
|
15771
|
+
}
|
|
15772
|
+
function backfillMaskedPropertyFingerprints(resources, template, noEchoParameterValues) {
|
|
15773
|
+
const declared = template?.Resources;
|
|
15774
|
+
if (declared === void 0 || declared === null) return 0;
|
|
15775
|
+
let stamped = 0;
|
|
15776
|
+
for (const [logicalId, record] of Object.entries(resources)) {
|
|
15777
|
+
if (record === null || typeof record !== "object") continue;
|
|
15778
|
+
const field = record.maskedPropertyFingerprints;
|
|
15779
|
+
if (field !== void 0 && (field === null || typeof field !== "object" || Array.isArray(field))) continue;
|
|
15780
|
+
const existing = field ?? {};
|
|
15781
|
+
if (!Object.hasOwn(declared, logicalId)) continue;
|
|
15782
|
+
const definition = declared[logicalId];
|
|
15783
|
+
if (definition === void 0 || definition.Type !== record.resourceType) continue;
|
|
15784
|
+
const properties = record.properties;
|
|
15785
|
+
if (properties === null || typeof properties !== "object" || Array.isArray(properties)) continue;
|
|
15786
|
+
const fingerprints = maskedPropertyFingerprintsFor(properties, definition.Properties ?? {});
|
|
15787
|
+
if (fingerprints === void 0) continue;
|
|
15788
|
+
const templateProps = definition.Properties ?? {};
|
|
15789
|
+
const added = Object.entries(fingerprints).filter(([key]) => !Object.hasOwn(existing, key)).map(([key, value]) => noEchoParameterValues !== void 0 && templateCarriesNeedle(templateProps[key], noEchoParameterValues) ? [key, REFUSED_FINGERPRINT] : [key, value]);
|
|
15790
|
+
if (added.length === 0) continue;
|
|
15791
|
+
resources[logicalId] = {
|
|
15792
|
+
...record,
|
|
15793
|
+
maskedPropertyFingerprints: Object.fromEntries([...Object.entries(existing), ...added])
|
|
15794
|
+
};
|
|
15795
|
+
stamped++;
|
|
15796
|
+
}
|
|
15797
|
+
return stamped;
|
|
15798
|
+
}
|
|
15799
|
+
|
|
15686
15800
|
//#endregion
|
|
15687
15801
|
//#region src/deployment/drain-budget.ts
|
|
15688
15802
|
const drainDeadlines = new AsyncLocalStorage();
|
|
@@ -19473,6 +19587,22 @@ var DiffCalculator = class DiffCalculator {
|
|
|
19473
19587
|
if (droppedKeys.length > 0) this.logger.warn(`${logicalId} (${desiredResource.Type}): part of the declared properties cannot be sent as declared and is ignored when comparing against deployed state — the provider narrows them (${droppedKeys.join(", ")}). Fix the template to declare only what the resource supports; until then changes to the ignored keys have no effect.`);
|
|
19474
19588
|
else if (canonicalizeProperties && !this.valuesEqual(desiredPropsForCompare, desiredAfterDrops)) this.logger.debug(`${logicalId} (${desiredResource.Type}): the provider normalizes part of the declared properties before sending them; the comparison uses the normalized form. Nothing is dropped.`);
|
|
19475
19589
|
const propertyChanges = await this.compareProperties(desiredResource.Type, currentPropsForCompare, desiredPropsForCompare, maskForLog);
|
|
19590
|
+
const reported = new Set(propertyChanges.map((pc) => pc.path));
|
|
19591
|
+
for (const key of movedMaskedProperties(currentResource, rawDesiredProps)) {
|
|
19592
|
+
if (reported.has(key)) continue;
|
|
19593
|
+
if (!Object.hasOwn(currentPropsForCompare, key)) continue;
|
|
19594
|
+
if (!Object.hasOwn(desiredPropsForCompare, key)) continue;
|
|
19595
|
+
const oldValue = currentPropsForCompare[key];
|
|
19596
|
+
const newValue = desiredPropsForCompare[key];
|
|
19597
|
+
propertyChanges.push({
|
|
19598
|
+
path: key,
|
|
19599
|
+
oldValue,
|
|
19600
|
+
newValue,
|
|
19601
|
+
requiresReplacement: await this.maskedEditRequiresReplacement(desiredResource.Type, key, oldValue, newValue),
|
|
19602
|
+
maskedExpressionChanged: true
|
|
19603
|
+
});
|
|
19604
|
+
this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression changed (go-to-k/cdkd#4451)`);
|
|
19605
|
+
}
|
|
19476
19606
|
const attributeChanges = this.compareAttributes(currentResource, desiredResource);
|
|
19477
19607
|
if (propertyChanges.length > 0 || attributeChanges.length > 0) {
|
|
19478
19608
|
changes.set(logicalId, {
|
|
@@ -19839,6 +19969,11 @@ var DiffCalculator = class DiffCalculator {
|
|
|
19839
19969
|
}
|
|
19840
19970
|
return changes;
|
|
19841
19971
|
}
|
|
19972
|
+
async maskedEditRequiresReplacement(resourceType, key, oldValue, newValue) {
|
|
19973
|
+
if (this.replacementRules.requiresReplacement(resourceType, key, oldValue, newValue)) return true;
|
|
19974
|
+
if (this.replacementRules.isClassified(resourceType, key)) return false;
|
|
19975
|
+
return (await getCreateOnlyPropertyPaths(resourceType)).some((path) => path.length === 1 && path[0] === key);
|
|
19976
|
+
}
|
|
19842
19977
|
static INTRINSIC_KEYS = INTRINSIC_KEYS;
|
|
19843
19978
|
static isIntrinsic(value) {
|
|
19844
19979
|
if (value === null || value === void 0 || typeof value !== "object" || Array.isArray(value)) return false;
|
|
@@ -20779,7 +20914,7 @@ var CloudControlProvider = class {
|
|
|
20779
20914
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
20780
20915
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
20781
20916
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
20782
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
20917
|
+
const { ASGProvider } = await import("./asg-provider-BFlmarbF.js");
|
|
20783
20918
|
const delegateRegion = ambientRegion();
|
|
20784
20919
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
20785
20920
|
if (asgProvider === void 0) {
|
|
@@ -20885,7 +21020,7 @@ var CloudControlProvider = class {
|
|
|
20885
21020
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
20886
21021
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
20887
21022
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
20888
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
21023
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-DqHELwjV.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-CHnIs1hG.js"))).NeptuneProvider({ region: ccRegion });
|
|
20889
21024
|
this.sdkDeleteDelegates.set(family, {
|
|
20890
21025
|
region: ccRegion,
|
|
20891
21026
|
provider
|
|
@@ -24938,30 +25073,47 @@ async function reserveStackCreateToken(options) {
|
|
|
24938
25073
|
//#region src/deployment/inline-policy-claims.ts
|
|
24939
25074
|
function isInlinePolicyClaimedByCompletedWriter(args, kind, principal, policyName) {
|
|
24940
25075
|
const { selfLogicalId, writers, changes, stateResources } = args;
|
|
24941
|
-
const same = (a, b) => typeof a === "string" && IAM_NAME.test(a) && a.toLowerCase() === b.toLowerCase();
|
|
24942
25076
|
for (const [lid, write] of writers) {
|
|
24943
25077
|
if (lid === selfLogicalId || !Object.hasOwn(stateResources, lid)) continue;
|
|
24944
25078
|
const record = stateResources[lid];
|
|
24945
25079
|
if (record.provisionedBy === "cc-api") continue;
|
|
24946
25080
|
const props = record.properties ?? {};
|
|
24947
25081
|
if (record.resourceType === "AWS::IAM::Policy") {
|
|
24948
|
-
if (!
|
|
25082
|
+
if (!sameIamName(record.physicalId, policyName)) continue;
|
|
24949
25083
|
const listed = props[POLICY_LIST_FIELDS[kind]];
|
|
24950
|
-
if (Array.isArray(listed) && listed.some((p) =>
|
|
25084
|
+
if (Array.isArray(listed) && listed.some((p) => sameIamName(p, principal))) return true;
|
|
24951
25085
|
continue;
|
|
24952
25086
|
}
|
|
24953
25087
|
if (!Object.hasOwn(PRINCIPAL_KINDS, record.resourceType)) continue;
|
|
24954
25088
|
if (PRINCIPAL_KINDS[record.resourceType] !== kind) continue;
|
|
24955
|
-
if (!
|
|
25089
|
+
if (!sameIamName(record.physicalId, principal)) continue;
|
|
24956
25090
|
if (write !== "create" && !ownPoliciesChange(changes.get(lid))) continue;
|
|
24957
25091
|
const policies = props["Policies"];
|
|
24958
25092
|
if (!Array.isArray(policies)) continue;
|
|
24959
|
-
if (policies.some((entry) => typeof entry === "object" && entry !== null && !Array.isArray(entry) &&
|
|
25093
|
+
if (policies.some((entry) => typeof entry === "object" && entry !== null && !Array.isArray(entry) && sameIamName(entry["PolicyName"], policyName))) return true;
|
|
24960
25094
|
}
|
|
24961
25095
|
return false;
|
|
24962
25096
|
}
|
|
24963
25097
|
var RollbackInlinePolicyWriters = class {
|
|
24964
25098
|
entries = /* @__PURE__ */ new Map();
|
|
25099
|
+
removals = /* @__PURE__ */ new Map();
|
|
25100
|
+
unsettled = /* @__PURE__ */ new Map();
|
|
25101
|
+
notePending(ops) {
|
|
25102
|
+
for (const op of ops) if (!this.unsettled.has(op)) this.unsettled.set(op, {
|
|
25103
|
+
logicalId: op.logicalId,
|
|
25104
|
+
state: "pending"
|
|
25105
|
+
});
|
|
25106
|
+
}
|
|
25107
|
+
noteOutcome(op, completed) {
|
|
25108
|
+
if (!completed) {
|
|
25109
|
+
this.unsettled.set(op, {
|
|
25110
|
+
logicalId: op.logicalId,
|
|
25111
|
+
state: "failed"
|
|
25112
|
+
});
|
|
25113
|
+
return;
|
|
25114
|
+
}
|
|
25115
|
+
for (const [key, entry] of this.unsettled) if (key === op || entry.logicalId === op.logicalId) this.unsettled.delete(key);
|
|
25116
|
+
}
|
|
24965
25117
|
record(logicalId, write, record, policiesChanged, via) {
|
|
24966
25118
|
if (via === "cc-api") {
|
|
24967
25119
|
this.entries.delete(logicalId);
|
|
@@ -24993,15 +25145,100 @@ var RollbackInlinePolicyWriters = class {
|
|
|
24993
25145
|
}]
|
|
24994
25146
|
});
|
|
24995
25147
|
}
|
|
24996
|
-
|
|
25148
|
+
const claimed = isInlinePolicyClaimedByCompletedWriter({
|
|
24997
25149
|
selfLogicalId: logicalId,
|
|
24998
25150
|
writers,
|
|
24999
25151
|
changes,
|
|
25000
25152
|
stateResources
|
|
25001
25153
|
}, kind, principal, policyName);
|
|
25154
|
+
if (!claimed) {
|
|
25155
|
+
const key = removalKey(kind, principal, policyName);
|
|
25156
|
+
const noted = this.removals.get(key) ?? {
|
|
25157
|
+
kind,
|
|
25158
|
+
principal,
|
|
25159
|
+
policyName,
|
|
25160
|
+
removers: /* @__PURE__ */ new Map()
|
|
25161
|
+
};
|
|
25162
|
+
noted.removers.set(logicalId, stateResources[logicalId]);
|
|
25163
|
+
this.removals.set(key, noted);
|
|
25164
|
+
}
|
|
25165
|
+
return claimed;
|
|
25002
25166
|
};
|
|
25003
25167
|
}
|
|
25168
|
+
takeHeldRemovals(stateResources) {
|
|
25169
|
+
const held = [];
|
|
25170
|
+
for (const [key, { kind, principal, policyName, removers }] of this.removals) {
|
|
25171
|
+
const { holders, unreadable } = inlinePolicyHolders(stateResources, kind, principal, policyName);
|
|
25172
|
+
const others = holders.filter((h) => !removers.has(h.logicalId) || stateResources[h.logicalId] !== removers.get(h.logicalId));
|
|
25173
|
+
if (others.length === 0) continue;
|
|
25174
|
+
this.removals.delete(key);
|
|
25175
|
+
const open = new Set([...this.unsettled.values()].map((u) => u.logicalId));
|
|
25176
|
+
const unsettled = [...new Set(others.map((h) => h.logicalId))].filter((id) => open.has(id));
|
|
25177
|
+
held.push({
|
|
25178
|
+
kind,
|
|
25179
|
+
holders: others,
|
|
25180
|
+
unreadable,
|
|
25181
|
+
unsettled
|
|
25182
|
+
});
|
|
25183
|
+
}
|
|
25184
|
+
return held;
|
|
25185
|
+
}
|
|
25004
25186
|
};
|
|
25187
|
+
function inlinePolicyHolders(stateResources, kind, principal, policyName) {
|
|
25188
|
+
const holders = [];
|
|
25189
|
+
const unreadable = [];
|
|
25190
|
+
const unnamed = (v) => typeof v !== "string" || !IAM_NAME.test(v);
|
|
25191
|
+
for (const [logicalId, record] of Object.entries(stateResources)) {
|
|
25192
|
+
if (record === null || typeof record !== "object") continue;
|
|
25193
|
+
const props = record.properties ?? {};
|
|
25194
|
+
if (record.resourceType === "AWS::IAM::Policy") {
|
|
25195
|
+
const nameMatches = sameIamName(record.physicalId, policyName);
|
|
25196
|
+
if (!nameMatches && !unnamed(record.physicalId)) continue;
|
|
25197
|
+
const listed = props[POLICY_LIST_FIELDS[kind]];
|
|
25198
|
+
const entries = Array.isArray(listed) ? listed : [];
|
|
25199
|
+
const named = entries.find((p) => sameIamName(p, principal));
|
|
25200
|
+
if (nameMatches && typeof named === "string") holders.push({
|
|
25201
|
+
logicalId,
|
|
25202
|
+
principal: named,
|
|
25203
|
+
policyName: record.physicalId,
|
|
25204
|
+
document: props["PolicyDocument"]
|
|
25205
|
+
});
|
|
25206
|
+
else if (named !== void 0 || entries.some(unnamed)) unreadable.push(logicalId);
|
|
25207
|
+
continue;
|
|
25208
|
+
}
|
|
25209
|
+
if (!Object.hasOwn(PRINCIPAL_KINDS, record.resourceType)) continue;
|
|
25210
|
+
if (PRINCIPAL_KINDS[record.resourceType] !== kind) continue;
|
|
25211
|
+
const principalMatches = sameIamName(record.physicalId, principal);
|
|
25212
|
+
if (!principalMatches && !unnamed(record.physicalId)) continue;
|
|
25213
|
+
const policies = props["Policies"];
|
|
25214
|
+
if (!Array.isArray(policies)) continue;
|
|
25215
|
+
for (const entry of policies) {
|
|
25216
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) continue;
|
|
25217
|
+
const name = entry["PolicyName"];
|
|
25218
|
+
if (principalMatches && sameIamName(name, policyName)) holders.push({
|
|
25219
|
+
logicalId,
|
|
25220
|
+
principal: record.physicalId,
|
|
25221
|
+
policyName: name,
|
|
25222
|
+
document: entry["PolicyDocument"]
|
|
25223
|
+
});
|
|
25224
|
+
else if (unnamed(name) || sameIamName(name, policyName)) unreadable.push(logicalId);
|
|
25225
|
+
}
|
|
25226
|
+
}
|
|
25227
|
+
return {
|
|
25228
|
+
holders,
|
|
25229
|
+
unreadable: [...new Set(unreadable)]
|
|
25230
|
+
};
|
|
25231
|
+
}
|
|
25232
|
+
function sameIamName(a, b) {
|
|
25233
|
+
return typeof a === "string" && IAM_NAME.test(a) && a.toLowerCase() === b.toLowerCase();
|
|
25234
|
+
}
|
|
25235
|
+
function removalKey(kind, principal, policyName) {
|
|
25236
|
+
return JSON.stringify([
|
|
25237
|
+
kind,
|
|
25238
|
+
principal.toLowerCase(),
|
|
25239
|
+
policyName.toLowerCase()
|
|
25240
|
+
]);
|
|
25241
|
+
}
|
|
25005
25242
|
const IAM_NAME = /^[\w+=,.@-]+$/;
|
|
25006
25243
|
const POLICY_LIST_FIELDS = {
|
|
25007
25244
|
role: "Roles",
|
|
@@ -25877,6 +26114,31 @@ function updatePartialMessage(reason) {
|
|
|
25877
26114
|
return `partial (${reason})`;
|
|
25878
26115
|
}
|
|
25879
26116
|
|
|
26117
|
+
//#endregion
|
|
26118
|
+
//#region src/provisioning/redacted-delete-address.ts
|
|
26119
|
+
function isRedactedRecordedValue(value) {
|
|
26120
|
+
if (carriesSecretMask(value)) return true;
|
|
26121
|
+
let text;
|
|
26122
|
+
try {
|
|
26123
|
+
text = typeof value === "string" ? value : JSON.stringify(value);
|
|
26124
|
+
} catch {
|
|
26125
|
+
return false;
|
|
26126
|
+
}
|
|
26127
|
+
return text !== void 0 && dynamicReferenceTokens(text).length > 0;
|
|
26128
|
+
}
|
|
26129
|
+
const REDACTED_DELETE_ADDRESS_SKIP_REASON = "redacted address property in state — no delete issued";
|
|
26130
|
+
function redactedDeleteAddressFields(fields) {
|
|
26131
|
+
return Object.keys(fields).filter((key) => isRedactedRecordedValue(fields[key]));
|
|
26132
|
+
}
|
|
26133
|
+
function redactedDeleteAddressSkip(logger, logicalId, what, redactedFields) {
|
|
26134
|
+
if (redactedFields.length === 0) return void 0;
|
|
26135
|
+
logger.warn(safeMsg`${what} ${logicalId} is recorded in state with ${redactedFields.join(", ")} ` + "redacted (the '***' mask of a NoEcho value it read, or a secret '{{resolve:...}}' reference), which names nothing in AWS; skipping deletion — no AWS call is issued, so the resource is LEFT IN PLACE unless a parent resource this run also deletes removes it (then only the record is stale). Re-deploying records the same redaction again. The state record is KEPT and the run reports the skip: on 'cdkd destroy' / 'cdkd state destroy' (which exits non-zero) and, since issue 1762, on the plain DELETE of a resource removed from the template during cdkd deploy. Remove the resource by hand, then clear the stack's records with 'cdkd state orphan <stack>' — that command drops EVERY record for the stack, not just this one. NOTE a deploy-side REPLACEMENT or rollback delete instead FAILS the resource (https://github.com/go-to-k/cdkd/issues/1762) — the old resource is left untracked there, so remove it by hand.");
|
|
26136
|
+
return {
|
|
26137
|
+
outcome: "skipped",
|
|
26138
|
+
reason: REDACTED_DELETE_ADDRESS_SKIP_REASON
|
|
26139
|
+
};
|
|
26140
|
+
}
|
|
26141
|
+
|
|
25880
26142
|
//#endregion
|
|
25881
26143
|
//#region src/provisioning/final-snapshot.ts
|
|
25882
26144
|
const ATOMIC_FINAL_SNAPSHOT_TYPES = /* @__PURE__ */ new Set([
|
|
@@ -26204,30 +26466,6 @@ async function createReplicationGroupFinalSnapshot(client, replicationGroupId, l
|
|
|
26204
26466
|
const NESTED_STACK_RESOURCE_TYPE$1 = "AWS::CloudFormation::Stack";
|
|
26205
26467
|
const nonEmptyString = (v) => typeof v === "string" && v.length > 0;
|
|
26206
26468
|
|
|
26207
|
-
//#endregion
|
|
26208
|
-
//#region src/deployment/producer-regions-scope.ts
|
|
26209
|
-
const producerRegionsStore = new AsyncLocalStorage();
|
|
26210
|
-
function withProducerRegions(evidence, fn) {
|
|
26211
|
-
return producerRegionsStore.run(evidence, fn);
|
|
26212
|
-
}
|
|
26213
|
-
function getCurrentProducerRegions() {
|
|
26214
|
-
return producerRegionsStore.getStore();
|
|
26215
|
-
}
|
|
26216
|
-
function inheritProducerRegions(own, inherited) {
|
|
26217
|
-
const seen = /* @__PURE__ */ new Set();
|
|
26218
|
-
const regions = [];
|
|
26219
|
-
for (const region of [...own, ...inherited?.regions ?? []]) {
|
|
26220
|
-
const canonical = canonicalizeRegion(region);
|
|
26221
|
-
if (!canonical || seen.has(canonical)) continue;
|
|
26222
|
-
seen.add(canonical);
|
|
26223
|
-
regions.push(region);
|
|
26224
|
-
}
|
|
26225
|
-
return {
|
|
26226
|
-
regions,
|
|
26227
|
-
complete: inherited?.complete === true
|
|
26228
|
-
};
|
|
26229
|
-
}
|
|
26230
|
-
|
|
26231
26469
|
//#endregion
|
|
26232
26470
|
//#region src/deployment/rollback-executor/messages.ts
|
|
26233
26471
|
function throwIfDeleteSkipped(result, logicalId, physicalId, duringClause) {
|
|
@@ -26371,6 +26609,271 @@ function retainedSurvivorMessages(logicalId, resourceType, survivorPhysicalId, s
|
|
|
26371
26609
|
};
|
|
26372
26610
|
}
|
|
26373
26611
|
|
|
26612
|
+
//#endregion
|
|
26613
|
+
//#region src/deployment/rollback-executor/names.ts
|
|
26614
|
+
function replayPrefixScope(input, logger, mask, restoring) {
|
|
26615
|
+
const choice = replayPrefixChoice(input);
|
|
26616
|
+
if (choice.kind === "not-applicable") return (fn) => fn();
|
|
26617
|
+
const setting = (skip) => skip ? "SKIPPED" : "KEPT";
|
|
26618
|
+
const subject = `${safe(input.logicalId)} (${safe(input.resourceType)})`;
|
|
26619
|
+
const declared = choice.declared;
|
|
26620
|
+
const secretDerived = declared !== void 0 && mask(declared) !== declared;
|
|
26621
|
+
const withheld = secretDerived || choice.kind === "unreproduced" && declared === void 0;
|
|
26622
|
+
const shown = (value) => displayIdent(mask(String(value)));
|
|
26623
|
+
const quoted = (value) => {
|
|
26624
|
+
const masked = mask(value);
|
|
26625
|
+
const rendered = displayIdent(masked);
|
|
26626
|
+
return rendered === masked ? `"${masked}"` : rendered;
|
|
26627
|
+
};
|
|
26628
|
+
if (choice.kind === "reproduced" && choice.skipPrefix !== choice.recorded) logger.info(mask(` Rollback: ${restoring ? "re-creating" : "reverting"} ${subject} under the user-supplied-name prefix setting that created ` + (withheld ? `it (its physical id is withheld, as its name is secret-derived): ` : `${shown(input.physicalId)} (`) + `stack-name prefix ${setting(choice.skipPrefix)}; the failed deploy ran with it ${setting(choice.recorded)}${withheld ? "" : ")"}`));
|
|
26629
|
+
else if (choice.kind === "unreproduced" && restoring) {
|
|
26630
|
+
const idUnreadable = typeof input.physicalId !== "string" || input.physicalId === "";
|
|
26631
|
+
const prop = safe(choice.property);
|
|
26632
|
+
const unreadable = declared === void 0 ? idUnreadable ? `its ${prop} or its physical id` : `its ${prop}` : idUnreadable ? `its physical id` : void 0;
|
|
26633
|
+
logger.warn(mask(` ⚠ ${subject}: cdkd cannot tell which user-supplied-name prefix setting created the old resource (` + (withheld ? `its physical id is withheld, as its name is secret-derived or unreadable` : shown(input.physicalId)) + `) — ` + (choice.names === void 0 ? unreadable !== void 0 ? `cdkd cannot read ${unreadable} to compare` : `cdkd cannot derive the names its ${prop} takes to compare` : secretDerived ? `its ${prop} is secret-derived, and neither name it derives matches` : `its ${prop} derives to ${quoted(choice.names.skipped)} (prefix skipped) or ${quoted(choice.names.kept)} (prefix kept), and it is neither`) + `; re-creating it with the stack-name prefix ${setting(choice.skipPrefix)}, as the failed deploy ran, so it may come back under a different physical name.`));
|
|
26634
|
+
}
|
|
26635
|
+
const skip = choice.skipPrefix;
|
|
26636
|
+
return (fn) => withSkipPrefix(skip, fn);
|
|
26637
|
+
}
|
|
26638
|
+
function createOpMasker(logger, secrets) {
|
|
26639
|
+
const base = createMaskedLogSinks(logger, (text) => maskSecretsInText(text, secrets));
|
|
26640
|
+
const pairs = [];
|
|
26641
|
+
let sinks = base;
|
|
26642
|
+
return {
|
|
26643
|
+
mask: (text) => typeof text === "string" ? sinks.mask(text) : text,
|
|
26644
|
+
addNamed: (record) => {
|
|
26645
|
+
pairs.push(...secretDerivedNamePairs(record));
|
|
26646
|
+
sinks = withDerivedNameMasks(logger, base, pairs);
|
|
26647
|
+
}
|
|
26648
|
+
};
|
|
26649
|
+
}
|
|
26650
|
+
const OTHER_SPELLED_NAME_KEYS = {
|
|
26651
|
+
"AWS::Cognito::UserPoolDomain": ["Domain"],
|
|
26652
|
+
"AWS::Cognito::UserPoolUser": ["Username"],
|
|
26653
|
+
"AWS::ECS::TaskDefinition": ["Family"],
|
|
26654
|
+
"AWS::ElastiCache::ReplicationGroup": ["ReplicationGroupId"],
|
|
26655
|
+
"AWS::ElastiCache::User": ["UserId"],
|
|
26656
|
+
"AWS::ElastiCache::UserGroup": ["UserGroupId"],
|
|
26657
|
+
"AWS::SES::EmailIdentity": ["EmailIdentity"]
|
|
26658
|
+
};
|
|
26659
|
+
const COMPOSITE_SCOPE_LAST = /^(?:REGIONAL|CLOUDFRONT|GLOBAL)$/;
|
|
26660
|
+
const COMPOSITE_POOL_FIRST = /^[a-z]{2}(?:-gov)?-[a-z]+-\d+_[A-Za-z0-9]+$/;
|
|
26661
|
+
function idNameSegments(id) {
|
|
26662
|
+
const segments = /* @__PURE__ */ new Set();
|
|
26663
|
+
const arn = /^arn:[^:]*:([^:]*):[^:]*:[^:]*:(.+)$/.exec(id);
|
|
26664
|
+
if (arn !== null) {
|
|
26665
|
+
const service = arn[1];
|
|
26666
|
+
const resource = arn[2];
|
|
26667
|
+
const lambda = service === "lambda" ? /^(?:function|layer):([^:]+)(?::([^:]+))?/.exec(resource) : null;
|
|
26668
|
+
if (lambda !== null) {
|
|
26669
|
+
segments.add(lambda[1]);
|
|
26670
|
+
const qualifier = lambda[2];
|
|
26671
|
+
if (qualifier !== void 0 && !/^\d+$/.test(qualifier)) segments.add(qualifier);
|
|
26672
|
+
} else {
|
|
26673
|
+
const parts = resource.split(/[/:]/).filter((part) => part !== "");
|
|
26674
|
+
let body = parts.length > 1 ? parts.slice(1) : parts;
|
|
26675
|
+
if (body.length > 1 && /^\d+$/.test(body[body.length - 1])) body = body.slice(0, -1);
|
|
26676
|
+
for (const part of body) {
|
|
26677
|
+
segments.add(part);
|
|
26678
|
+
if (service === "secretsmanager") segments.add(part.replace(/-[A-Za-z0-9]{6}$/, ""));
|
|
26679
|
+
}
|
|
26680
|
+
}
|
|
26681
|
+
}
|
|
26682
|
+
if (id.includes("/")) {
|
|
26683
|
+
const afterSlash = id.slice(id.lastIndexOf("/") + 1);
|
|
26684
|
+
segments.add(afterSlash);
|
|
26685
|
+
segments.add(afterSlash.replace(/:\d+$/, ""));
|
|
26686
|
+
}
|
|
26687
|
+
if (id.includes("|")) {
|
|
26688
|
+
const parts = id.split("|");
|
|
26689
|
+
parts.forEach((part, index) => {
|
|
26690
|
+
if (part === "") return;
|
|
26691
|
+
if (index === parts.length - 1 && parts.length > 1 && COMPOSITE_SCOPE_LAST.test(part)) return;
|
|
26692
|
+
if (index === 0 && parts.length > 1 && COMPOSITE_POOL_FIRST.test(part)) return;
|
|
26693
|
+
segments.add(part);
|
|
26694
|
+
});
|
|
26695
|
+
}
|
|
26696
|
+
return [...segments].filter((segment) => segment.length >= 4 && segment !== id);
|
|
26697
|
+
}
|
|
26698
|
+
function ownEntry(table, key) {
|
|
26699
|
+
return Object.hasOwn(table, key) ? table[key] : void 0;
|
|
26700
|
+
}
|
|
26701
|
+
function secretDerivedNamePairs(record) {
|
|
26702
|
+
const { resourceType, properties, logicalId } = record;
|
|
26703
|
+
if (typeof resourceType !== "string" || !isRestorableBag(properties)) return [];
|
|
26704
|
+
const rewritten = reverseReplacementRewrittenNameTypes();
|
|
26705
|
+
const named = /* @__PURE__ */ new Set();
|
|
26706
|
+
const primary = Object.hasOwn(rewritten, resourceType) ? rewritten[resourceType].property : explicitNamePropertyFor(resourceType);
|
|
26707
|
+
if (typeof primary === "string") named.add(primary);
|
|
26708
|
+
for (const key of Object.keys(properties)) if (/(?:Name|Identifier)$/.test(key)) named.add(key);
|
|
26709
|
+
for (const key of ownEntry(OTHER_SPELLED_NAME_KEYS, resourceType) ?? []) named.add(key);
|
|
26710
|
+
const idSpellings = record.physicalIds.filter((id) => typeof id === "string" && id !== "").flatMap((id) => [
|
|
26711
|
+
id,
|
|
26712
|
+
...id.toLowerCase() === id || id.length < 4 ? [] : [id.toLowerCase()],
|
|
26713
|
+
finalSnapshotNamePrefix(id, resourceType),
|
|
26714
|
+
...idNameSegments(id)
|
|
26715
|
+
]);
|
|
26716
|
+
const pairs = [];
|
|
26717
|
+
for (const key of named) {
|
|
26718
|
+
if (!Object.hasOwn(properties, key)) continue;
|
|
26719
|
+
const value = properties[key];
|
|
26720
|
+
if (typeof value !== "string" || value === "") continue;
|
|
26721
|
+
const derived = key === primary && !value.includes("{{resolve:") && value !== "***" ? rewrittenNameSpellings(resourceType, value, logicalId) : [];
|
|
26722
|
+
for (const spelling of [...idSpellings, ...derived]) pairs.push([value, spelling]);
|
|
26723
|
+
}
|
|
26724
|
+
return pairs;
|
|
26725
|
+
}
|
|
26726
|
+
function addRecordNames(opMasker, op, current) {
|
|
26727
|
+
const { logicalId } = op;
|
|
26728
|
+
for (const properties of [op.properties, op.attemptedProperties]) opMasker.addNamed({
|
|
26729
|
+
resourceType: op.resourceType,
|
|
26730
|
+
properties,
|
|
26731
|
+
logicalId,
|
|
26732
|
+
physicalIds: [op.physicalId]
|
|
26733
|
+
});
|
|
26734
|
+
for (const record of [op.previousState, current]) {
|
|
26735
|
+
if (record === null || typeof record !== "object") continue;
|
|
26736
|
+
opMasker.addNamed({
|
|
26737
|
+
resourceType: record.resourceType ?? op.resourceType,
|
|
26738
|
+
properties: record.properties,
|
|
26739
|
+
logicalId,
|
|
26740
|
+
physicalIds: [record.physicalId]
|
|
26741
|
+
});
|
|
26742
|
+
}
|
|
26743
|
+
}
|
|
26744
|
+
const ABSENT_BASELINE_SKIP_CAUSE = "Its recorded previous state has no `properties` bag, so there is nothing to restore it to; the rollback left the resource exactly as it is.";
|
|
26745
|
+
function requireRestorableBaseline(bag, logger, { logicalId, consequence, remedy, retry }) {
|
|
26746
|
+
if (isRestorableBag(bag)) return true;
|
|
26747
|
+
if (bag === void 0) {
|
|
26748
|
+
logger.warn(` Rollback: Cannot restore ${shownLogicalId(logicalId)} \u2014 its recorded previous state has no \`properties\` bag, so there is nothing to restore it to. An empty desired state would ${consequence}. The resource is therefore left exactly as it is. ${remedy}`);
|
|
26749
|
+
return false;
|
|
26750
|
+
}
|
|
26751
|
+
const shape = bag === null ? "null" : Array.isArray(bag) ? "an array" : `a ${typeof bag}`;
|
|
26752
|
+
throw new CdkdError(`Cannot roll ${shownLogicalId(logicalId)} back: its recorded previous state has a \`properties\` field that is not a property bag (${shape}), so cdkd cannot tell what to restore it to. Replaying it would do one of two things, and cdkd does neither: send the malformed value to the provider as-is, or send an empty desired state (which would ${consequence}). The rollback JOURNAL record is kept: once that record holds a property bag again, ${retry}. Otherwise fix forward with \`cdkd deploy\`, or remove the stack with \`cdkd destroy\`.`, "ROLLBACK_UNUSABLE_BASELINE");
|
|
26753
|
+
}
|
|
26754
|
+
function isRestorableBag(bag) {
|
|
26755
|
+
return typeof bag === "object" && bag !== null && !Array.isArray(bag);
|
|
26756
|
+
}
|
|
26757
|
+
async function prepareCreateRollbackFinalSnapshot(op, provisionedBy, ctx, mask) {
|
|
26758
|
+
const { logicalId, resourceType } = op;
|
|
26759
|
+
const physicalId = op.physicalId;
|
|
26760
|
+
switch (finalSnapshotMechanism(resourceType, provisionedBy)) {
|
|
26761
|
+
case "atomic-delete-parameter": return buildFinalSnapshotIdentifier(physicalId, resourceType);
|
|
26762
|
+
case "pre-delete-snapshot":
|
|
26763
|
+
await createPreDeleteFinalSnapshot(resourceType, physicalId, logicalId, ctx.finalSnapshotClients ?? getAwsClients(), {
|
|
26764
|
+
info: (message) => ctx.logger.info(mask(message)),
|
|
26765
|
+
debug: (message) => ctx.logger.debug(mask(message))
|
|
26766
|
+
});
|
|
26767
|
+
return;
|
|
26768
|
+
case "refuse-cc-routed": throw ccRoutedFinalSnapshotError(logicalId, resourceType, SKIP_FINAL_SNAPSHOT_FLAG);
|
|
26769
|
+
case "refuse-unsupported-type": throw unsupportedFinalSnapshotError(logicalId, resourceType, SKIP_FINAL_SNAPSHOT_FLAG);
|
|
26770
|
+
}
|
|
26771
|
+
}
|
|
26772
|
+
|
|
26773
|
+
//#endregion
|
|
26774
|
+
//#region src/deployment/rollback-executor/replay-inline-policy-restore.ts
|
|
26775
|
+
async function restoreHeldInlinePolicies(writers, stateResources, stackName, ctx, result, options = {}) {
|
|
26776
|
+
for (const removal of writers.takeHeldRemovals(stateResources)) await restoreOne(removal, stateResources, stackName, ctx, result, options.refuseAll === true);
|
|
26777
|
+
}
|
|
26778
|
+
async function restoreOne({ kind, holders, unreadable, unsettled }, stateResources, stackName, ctx, result, refuseAll) {
|
|
26779
|
+
const { logger } = ctx;
|
|
26780
|
+
const ids = [...new Set(holders.map((h) => h.logicalId))].map((id) => safe(id)).join(", ");
|
|
26781
|
+
const lost = safeMsg`the ${kind} it is on lacks that inline policy until the resource is next updated, or ` + `'cdkd drift <stack> --revert' restores it`;
|
|
26782
|
+
if (refuseAll || unsettled.length > 0) {
|
|
26783
|
+
const pending = refuseAll ? ids : unsettled.map((id) => safe(id)).join(", ");
|
|
26784
|
+
logger.warn(safeMsg` Rollback: an inline policy this rollback removed is recorded by ${ids}, but the ` + safeMsg`rollback of ${pending} has not completed, so that record may be the failed ` + safeMsg`deploy's and cdkd did not put it back; ${lost}.`);
|
|
26785
|
+
result.warnings++;
|
|
26786
|
+
return;
|
|
26787
|
+
}
|
|
26788
|
+
if (unreadable.length > 0) {
|
|
26789
|
+
logger.warn(safeMsg` Rollback: an inline policy this rollback removed is recorded by ${ids}, and ` + safeMsg`${unreadable.map((id) => safe(id)).join(", ")} may record it too under a redacted ` + safeMsg`name, so cdkd did not put it back; ${lost}.`);
|
|
26790
|
+
result.warnings++;
|
|
26791
|
+
return;
|
|
26792
|
+
}
|
|
26793
|
+
const documents = holders.map((h) => serializedDocument(h.document));
|
|
26794
|
+
if (documents.some((d) => d === void 0)) {
|
|
26795
|
+
logger.warn(safeMsg` Rollback: an inline policy this rollback removed is still recorded by ${ids}, but its ` + safeMsg`recorded document is absent or redacted, so cdkd did not put it back; ${lost}.`);
|
|
26796
|
+
result.warnings++;
|
|
26797
|
+
return;
|
|
26798
|
+
}
|
|
26799
|
+
if (new Set(documents).size > 1) {
|
|
26800
|
+
logger.warn(safeMsg` Rollback: an inline policy this rollback removed is recorded by ${ids} with different ` + safeMsg`documents under one name on one ${kind}, so cdkd put neither back; ${lost}.`);
|
|
26801
|
+
result.warnings++;
|
|
26802
|
+
return;
|
|
26803
|
+
}
|
|
26804
|
+
const holder = holders[0];
|
|
26805
|
+
const secrets = /* @__PURE__ */ new Map();
|
|
26806
|
+
for (const h of holders) {
|
|
26807
|
+
const bag = ctx.logOnlyNeedlesFor?.(h.logicalId);
|
|
26808
|
+
if (bag) carryLogOnlyValues(bag, secrets);
|
|
26809
|
+
}
|
|
26810
|
+
const masker = createOpMasker(logger, secrets);
|
|
26811
|
+
for (const h of holders) {
|
|
26812
|
+
const record = stateResources[h.logicalId];
|
|
26813
|
+
addRecordNames(masker, {
|
|
26814
|
+
logicalId: h.logicalId,
|
|
26815
|
+
resourceType: record?.resourceType,
|
|
26816
|
+
physicalId: record?.physicalId
|
|
26817
|
+
}, record);
|
|
26818
|
+
}
|
|
26819
|
+
try {
|
|
26820
|
+
const { provider, provisionedBy } = ctx.providerRegistry.getProviderFor({
|
|
26821
|
+
resourceType: "AWS::IAM::Policy",
|
|
26822
|
+
provisionedBy: "sdk"
|
|
26823
|
+
});
|
|
26824
|
+
if (provisionedBy !== "sdk") throw new Error("AWS::IAM::Policy is not routed to its SDK provider");
|
|
26825
|
+
await provider.create(holder.logicalId, "AWS::IAM::Policy", {
|
|
26826
|
+
PolicyName: holder.policyName,
|
|
26827
|
+
PolicyDocument: holder.document,
|
|
26828
|
+
[POLICY_LIST_FIELDS[kind]]: [holder.principal]
|
|
26829
|
+
}, { maskSecrets: masker.mask });
|
|
26830
|
+
} catch (error) {
|
|
26831
|
+
logger.warn(maskedFailureText(safeMsg` Rollback: could not put back the inline policy ${ids} records on its ${kind} ` + safeMsg`(${lost}): `, error, masker.mask));
|
|
26832
|
+
result.warnings++;
|
|
26833
|
+
return;
|
|
26834
|
+
}
|
|
26835
|
+
logger.info(safeMsg` Rollback: put back the inline policy ${ids} records on its ${kind}`);
|
|
26836
|
+
const holderType = stateResources[holder.logicalId]?.resourceType;
|
|
26837
|
+
ctx.recordEvent?.({
|
|
26838
|
+
eventType: "ROLLBACK_RESOURCE_SUCCEEDED",
|
|
26839
|
+
stackName,
|
|
26840
|
+
operation: "UPDATE",
|
|
26841
|
+
logicalId: holder.logicalId,
|
|
26842
|
+
...typeof holderType === "string" && { resourceType: holderType },
|
|
26843
|
+
provisionedBy: "sdk",
|
|
26844
|
+
reason: `Put back the inline policy this resource records on its ${kind}, which the rollback had removed from it.`
|
|
26845
|
+
});
|
|
26846
|
+
}
|
|
26847
|
+
function serializedDocument(document) {
|
|
26848
|
+
if (typeof document === "string") return document.length > 0 && !isRedactedRecordedValue(document) ? document : void 0;
|
|
26849
|
+
if (document === null || typeof document !== "object" || Array.isArray(document)) return;
|
|
26850
|
+
return isRedactedRecordedValue(document) ? void 0 : JSON.stringify(document);
|
|
26851
|
+
}
|
|
26852
|
+
|
|
26853
|
+
//#endregion
|
|
26854
|
+
//#region src/deployment/producer-regions-scope.ts
|
|
26855
|
+
const producerRegionsStore = new AsyncLocalStorage();
|
|
26856
|
+
function withProducerRegions(evidence, fn) {
|
|
26857
|
+
return producerRegionsStore.run(evidence, fn);
|
|
26858
|
+
}
|
|
26859
|
+
function getCurrentProducerRegions() {
|
|
26860
|
+
return producerRegionsStore.getStore();
|
|
26861
|
+
}
|
|
26862
|
+
function inheritProducerRegions(own, inherited) {
|
|
26863
|
+
const seen = /* @__PURE__ */ new Set();
|
|
26864
|
+
const regions = [];
|
|
26865
|
+
for (const region of [...own, ...inherited?.regions ?? []]) {
|
|
26866
|
+
const canonical = canonicalizeRegion(region);
|
|
26867
|
+
if (!canonical || seen.has(canonical)) continue;
|
|
26868
|
+
seen.add(canonical);
|
|
26869
|
+
regions.push(region);
|
|
26870
|
+
}
|
|
26871
|
+
return {
|
|
26872
|
+
regions,
|
|
26873
|
+
complete: inherited?.complete === true
|
|
26874
|
+
};
|
|
26875
|
+
}
|
|
26876
|
+
|
|
26374
26877
|
//#endregion
|
|
26375
26878
|
//#region src/deployment/rollback-executor/replay-secrets.ts
|
|
26376
26879
|
function replayProducerRegionEvidence(ctx) {
|
|
@@ -26674,167 +27177,6 @@ function sortRollbackCreates(createOps, stateResources, logger) {
|
|
|
26674
27177
|
return sorted;
|
|
26675
27178
|
}
|
|
26676
27179
|
|
|
26677
|
-
//#endregion
|
|
26678
|
-
//#region src/deployment/rollback-executor/names.ts
|
|
26679
|
-
function replayPrefixScope(input, logger, mask, restoring) {
|
|
26680
|
-
const choice = replayPrefixChoice(input);
|
|
26681
|
-
if (choice.kind === "not-applicable") return (fn) => fn();
|
|
26682
|
-
const setting = (skip) => skip ? "SKIPPED" : "KEPT";
|
|
26683
|
-
const subject = `${safe(input.logicalId)} (${safe(input.resourceType)})`;
|
|
26684
|
-
const declared = choice.declared;
|
|
26685
|
-
const secretDerived = declared !== void 0 && mask(declared) !== declared;
|
|
26686
|
-
const withheld = secretDerived || choice.kind === "unreproduced" && declared === void 0;
|
|
26687
|
-
const shown = (value) => displayIdent(mask(String(value)));
|
|
26688
|
-
const quoted = (value) => {
|
|
26689
|
-
const masked = mask(value);
|
|
26690
|
-
const rendered = displayIdent(masked);
|
|
26691
|
-
return rendered === masked ? `"${masked}"` : rendered;
|
|
26692
|
-
};
|
|
26693
|
-
if (choice.kind === "reproduced" && choice.skipPrefix !== choice.recorded) logger.info(mask(` Rollback: ${restoring ? "re-creating" : "reverting"} ${subject} under the user-supplied-name prefix setting that created ` + (withheld ? `it (its physical id is withheld, as its name is secret-derived): ` : `${shown(input.physicalId)} (`) + `stack-name prefix ${setting(choice.skipPrefix)}; the failed deploy ran with it ${setting(choice.recorded)}${withheld ? "" : ")"}`));
|
|
26694
|
-
else if (choice.kind === "unreproduced" && restoring) {
|
|
26695
|
-
const idUnreadable = typeof input.physicalId !== "string" || input.physicalId === "";
|
|
26696
|
-
const prop = safe(choice.property);
|
|
26697
|
-
const unreadable = declared === void 0 ? idUnreadable ? `its ${prop} or its physical id` : `its ${prop}` : idUnreadable ? `its physical id` : void 0;
|
|
26698
|
-
logger.warn(mask(` ⚠ ${subject}: cdkd cannot tell which user-supplied-name prefix setting created the old resource (` + (withheld ? `its physical id is withheld, as its name is secret-derived or unreadable` : shown(input.physicalId)) + `) — ` + (choice.names === void 0 ? unreadable !== void 0 ? `cdkd cannot read ${unreadable} to compare` : `cdkd cannot derive the names its ${prop} takes to compare` : secretDerived ? `its ${prop} is secret-derived, and neither name it derives matches` : `its ${prop} derives to ${quoted(choice.names.skipped)} (prefix skipped) or ${quoted(choice.names.kept)} (prefix kept), and it is neither`) + `; re-creating it with the stack-name prefix ${setting(choice.skipPrefix)}, as the failed deploy ran, so it may come back under a different physical name.`));
|
|
26699
|
-
}
|
|
26700
|
-
const skip = choice.skipPrefix;
|
|
26701
|
-
return (fn) => withSkipPrefix(skip, fn);
|
|
26702
|
-
}
|
|
26703
|
-
function createOpMasker(logger, secrets) {
|
|
26704
|
-
const base = createMaskedLogSinks(logger, (text) => maskSecretsInText(text, secrets));
|
|
26705
|
-
const pairs = [];
|
|
26706
|
-
let sinks = base;
|
|
26707
|
-
return {
|
|
26708
|
-
mask: (text) => typeof text === "string" ? sinks.mask(text) : text,
|
|
26709
|
-
addNamed: (record) => {
|
|
26710
|
-
pairs.push(...secretDerivedNamePairs(record));
|
|
26711
|
-
sinks = withDerivedNameMasks(logger, base, pairs);
|
|
26712
|
-
}
|
|
26713
|
-
};
|
|
26714
|
-
}
|
|
26715
|
-
const OTHER_SPELLED_NAME_KEYS = {
|
|
26716
|
-
"AWS::Cognito::UserPoolDomain": ["Domain"],
|
|
26717
|
-
"AWS::Cognito::UserPoolUser": ["Username"],
|
|
26718
|
-
"AWS::ECS::TaskDefinition": ["Family"],
|
|
26719
|
-
"AWS::ElastiCache::ReplicationGroup": ["ReplicationGroupId"],
|
|
26720
|
-
"AWS::ElastiCache::User": ["UserId"],
|
|
26721
|
-
"AWS::ElastiCache::UserGroup": ["UserGroupId"],
|
|
26722
|
-
"AWS::SES::EmailIdentity": ["EmailIdentity"]
|
|
26723
|
-
};
|
|
26724
|
-
const COMPOSITE_SCOPE_LAST = /^(?:REGIONAL|CLOUDFRONT|GLOBAL)$/;
|
|
26725
|
-
const COMPOSITE_POOL_FIRST = /^[a-z]{2}(?:-gov)?-[a-z]+-\d+_[A-Za-z0-9]+$/;
|
|
26726
|
-
function idNameSegments(id) {
|
|
26727
|
-
const segments = /* @__PURE__ */ new Set();
|
|
26728
|
-
const arn = /^arn:[^:]*:([^:]*):[^:]*:[^:]*:(.+)$/.exec(id);
|
|
26729
|
-
if (arn !== null) {
|
|
26730
|
-
const service = arn[1];
|
|
26731
|
-
const resource = arn[2];
|
|
26732
|
-
const lambda = service === "lambda" ? /^(?:function|layer):([^:]+)(?::([^:]+))?/.exec(resource) : null;
|
|
26733
|
-
if (lambda !== null) {
|
|
26734
|
-
segments.add(lambda[1]);
|
|
26735
|
-
const qualifier = lambda[2];
|
|
26736
|
-
if (qualifier !== void 0 && !/^\d+$/.test(qualifier)) segments.add(qualifier);
|
|
26737
|
-
} else {
|
|
26738
|
-
const parts = resource.split(/[/:]/).filter((part) => part !== "");
|
|
26739
|
-
let body = parts.length > 1 ? parts.slice(1) : parts;
|
|
26740
|
-
if (body.length > 1 && /^\d+$/.test(body[body.length - 1])) body = body.slice(0, -1);
|
|
26741
|
-
for (const part of body) {
|
|
26742
|
-
segments.add(part);
|
|
26743
|
-
if (service === "secretsmanager") segments.add(part.replace(/-[A-Za-z0-9]{6}$/, ""));
|
|
26744
|
-
}
|
|
26745
|
-
}
|
|
26746
|
-
}
|
|
26747
|
-
if (id.includes("/")) {
|
|
26748
|
-
const afterSlash = id.slice(id.lastIndexOf("/") + 1);
|
|
26749
|
-
segments.add(afterSlash);
|
|
26750
|
-
segments.add(afterSlash.replace(/:\d+$/, ""));
|
|
26751
|
-
}
|
|
26752
|
-
if (id.includes("|")) {
|
|
26753
|
-
const parts = id.split("|");
|
|
26754
|
-
parts.forEach((part, index) => {
|
|
26755
|
-
if (part === "") return;
|
|
26756
|
-
if (index === parts.length - 1 && parts.length > 1 && COMPOSITE_SCOPE_LAST.test(part)) return;
|
|
26757
|
-
if (index === 0 && parts.length > 1 && COMPOSITE_POOL_FIRST.test(part)) return;
|
|
26758
|
-
segments.add(part);
|
|
26759
|
-
});
|
|
26760
|
-
}
|
|
26761
|
-
return [...segments].filter((segment) => segment.length >= 4 && segment !== id);
|
|
26762
|
-
}
|
|
26763
|
-
function ownEntry(table, key) {
|
|
26764
|
-
return Object.hasOwn(table, key) ? table[key] : void 0;
|
|
26765
|
-
}
|
|
26766
|
-
function secretDerivedNamePairs(record) {
|
|
26767
|
-
const { resourceType, properties, logicalId } = record;
|
|
26768
|
-
if (typeof resourceType !== "string" || !isRestorableBag(properties)) return [];
|
|
26769
|
-
const rewritten = reverseReplacementRewrittenNameTypes();
|
|
26770
|
-
const named = /* @__PURE__ */ new Set();
|
|
26771
|
-
const primary = Object.hasOwn(rewritten, resourceType) ? rewritten[resourceType].property : explicitNamePropertyFor(resourceType);
|
|
26772
|
-
if (typeof primary === "string") named.add(primary);
|
|
26773
|
-
for (const key of Object.keys(properties)) if (/(?:Name|Identifier)$/.test(key)) named.add(key);
|
|
26774
|
-
for (const key of ownEntry(OTHER_SPELLED_NAME_KEYS, resourceType) ?? []) named.add(key);
|
|
26775
|
-
const idSpellings = record.physicalIds.filter((id) => typeof id === "string" && id !== "").flatMap((id) => [
|
|
26776
|
-
id,
|
|
26777
|
-
...id.toLowerCase() === id || id.length < 4 ? [] : [id.toLowerCase()],
|
|
26778
|
-
finalSnapshotNamePrefix(id, resourceType),
|
|
26779
|
-
...idNameSegments(id)
|
|
26780
|
-
]);
|
|
26781
|
-
const pairs = [];
|
|
26782
|
-
for (const key of named) {
|
|
26783
|
-
if (!Object.hasOwn(properties, key)) continue;
|
|
26784
|
-
const value = properties[key];
|
|
26785
|
-
if (typeof value !== "string" || value === "") continue;
|
|
26786
|
-
const derived = key === primary && !value.includes("{{resolve:") && value !== "***" ? rewrittenNameSpellings(resourceType, value, logicalId) : [];
|
|
26787
|
-
for (const spelling of [...idSpellings, ...derived]) pairs.push([value, spelling]);
|
|
26788
|
-
}
|
|
26789
|
-
return pairs;
|
|
26790
|
-
}
|
|
26791
|
-
function addRecordNames(opMasker, op, current) {
|
|
26792
|
-
const { logicalId } = op;
|
|
26793
|
-
for (const properties of [op.properties, op.attemptedProperties]) opMasker.addNamed({
|
|
26794
|
-
resourceType: op.resourceType,
|
|
26795
|
-
properties,
|
|
26796
|
-
logicalId,
|
|
26797
|
-
physicalIds: [op.physicalId]
|
|
26798
|
-
});
|
|
26799
|
-
for (const record of [op.previousState, current]) {
|
|
26800
|
-
if (record === null || typeof record !== "object") continue;
|
|
26801
|
-
opMasker.addNamed({
|
|
26802
|
-
resourceType: record.resourceType ?? op.resourceType,
|
|
26803
|
-
properties: record.properties,
|
|
26804
|
-
logicalId,
|
|
26805
|
-
physicalIds: [record.physicalId]
|
|
26806
|
-
});
|
|
26807
|
-
}
|
|
26808
|
-
}
|
|
26809
|
-
const ABSENT_BASELINE_SKIP_CAUSE = "Its recorded previous state has no `properties` bag, so there is nothing to restore it to; the rollback left the resource exactly as it is.";
|
|
26810
|
-
function requireRestorableBaseline(bag, logger, { logicalId, consequence, remedy, retry }) {
|
|
26811
|
-
if (isRestorableBag(bag)) return true;
|
|
26812
|
-
if (bag === void 0) {
|
|
26813
|
-
logger.warn(` Rollback: Cannot restore ${shownLogicalId(logicalId)} \u2014 its recorded previous state has no \`properties\` bag, so there is nothing to restore it to. An empty desired state would ${consequence}. The resource is therefore left exactly as it is. ${remedy}`);
|
|
26814
|
-
return false;
|
|
26815
|
-
}
|
|
26816
|
-
const shape = bag === null ? "null" : Array.isArray(bag) ? "an array" : `a ${typeof bag}`;
|
|
26817
|
-
throw new CdkdError(`Cannot roll ${shownLogicalId(logicalId)} back: its recorded previous state has a \`properties\` field that is not a property bag (${shape}), so cdkd cannot tell what to restore it to. Replaying it would do one of two things, and cdkd does neither: send the malformed value to the provider as-is, or send an empty desired state (which would ${consequence}). The rollback JOURNAL record is kept: once that record holds a property bag again, ${retry}. Otherwise fix forward with \`cdkd deploy\`, or remove the stack with \`cdkd destroy\`.`, "ROLLBACK_UNUSABLE_BASELINE");
|
|
26818
|
-
}
|
|
26819
|
-
function isRestorableBag(bag) {
|
|
26820
|
-
return typeof bag === "object" && bag !== null && !Array.isArray(bag);
|
|
26821
|
-
}
|
|
26822
|
-
async function prepareCreateRollbackFinalSnapshot(op, provisionedBy, ctx, mask) {
|
|
26823
|
-
const { logicalId, resourceType } = op;
|
|
26824
|
-
const physicalId = op.physicalId;
|
|
26825
|
-
switch (finalSnapshotMechanism(resourceType, provisionedBy)) {
|
|
26826
|
-
case "atomic-delete-parameter": return buildFinalSnapshotIdentifier(physicalId, resourceType);
|
|
26827
|
-
case "pre-delete-snapshot":
|
|
26828
|
-
await createPreDeleteFinalSnapshot(resourceType, physicalId, logicalId, ctx.finalSnapshotClients ?? getAwsClients(), {
|
|
26829
|
-
info: (message) => ctx.logger.info(mask(message)),
|
|
26830
|
-
debug: (message) => ctx.logger.debug(mask(message))
|
|
26831
|
-
});
|
|
26832
|
-
return;
|
|
26833
|
-
case "refuse-cc-routed": throw ccRoutedFinalSnapshotError(logicalId, resourceType, SKIP_FINAL_SNAPSHOT_FLAG);
|
|
26834
|
-
case "refuse-unsupported-type": throw unsupportedFinalSnapshotError(logicalId, resourceType, SKIP_FINAL_SNAPSHOT_FLAG);
|
|
26835
|
-
}
|
|
26836
|
-
}
|
|
26837
|
-
|
|
26838
27180
|
//#endregion
|
|
26839
27181
|
//#region src/deployment/rollback-executor/replay-props.ts
|
|
26840
27182
|
async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId) {
|
|
@@ -27410,6 +27752,7 @@ async function replayRollbackUnbound(operations, stateResources, stackName, ctx,
|
|
|
27410
27752
|
};
|
|
27411
27753
|
if (operations.length === 0) {
|
|
27412
27754
|
ctx.logger.info("No completed operations to roll back.");
|
|
27755
|
+
await restoreHeldInlinePolicies(inlinePolicyWriters, stateResources, stackName, ctx, result);
|
|
27413
27756
|
return result;
|
|
27414
27757
|
}
|
|
27415
27758
|
ctx.logger.info(`Rolling back ${operations.length} completed operation(s)...`);
|
|
@@ -27418,6 +27761,7 @@ async function replayRollbackUnbound(operations, stateResources, stackName, ctx,
|
|
|
27418
27761
|
stackName
|
|
27419
27762
|
});
|
|
27420
27763
|
const resolver = new ReplayResolvers(ctx.region);
|
|
27764
|
+
inlinePolicyWriters.notePending(operations);
|
|
27421
27765
|
const { createOps, otherOps } = partitionOps(operations);
|
|
27422
27766
|
for (let i = otherOps.length - 1; i >= 0; i--) {
|
|
27423
27767
|
if (options.isInterrupted?.()) {
|
|
@@ -27436,6 +27780,7 @@ async function replayRollbackUnbound(operations, stateResources, stackName, ctx,
|
|
|
27436
27780
|
await replaySingle(op, stateResources, stackName, ctx, resolver, orphanLogicalIds, result, options.onOrphan, inlinePolicyWriters, options.afterOp, options.isInterrupted);
|
|
27437
27781
|
}
|
|
27438
27782
|
}
|
|
27783
|
+
await restoreHeldInlinePolicies(inlinePolicyWriters, stateResources, stackName, ctx, result);
|
|
27439
27784
|
ctx.logger.info("Rollback completed. Some resources may remain if deletion failed.");
|
|
27440
27785
|
ctx.recordEvent?.({
|
|
27441
27786
|
eventType: "ROLLBACK_FINISHED",
|
|
@@ -27470,6 +27815,7 @@ async function replaySingle(op, stateResources, stackName, ctx, resolver, orphan
|
|
|
27470
27815
|
mask,
|
|
27471
27816
|
createRollbackRoute: void 0
|
|
27472
27817
|
};
|
|
27818
|
+
const recordBefore = ownRecord(stateResources, op.logicalId);
|
|
27473
27819
|
try {
|
|
27474
27820
|
addRecordNames(opMasker, op, stateResources[op.logicalId]);
|
|
27475
27821
|
switch (action) {
|
|
@@ -27514,8 +27860,13 @@ async function replaySingle(op, stateResources, stackName, ctx, resolver, orphan
|
|
|
27514
27860
|
...failedRoute && { provisionedBy: failedRoute },
|
|
27515
27861
|
error: maskedRollbackEventError(rollbackError, mask)
|
|
27516
27862
|
});
|
|
27863
|
+
} finally {
|
|
27864
|
+
inlinePolicyWriters.noteOutcome(op, action === "skip-already-done" || ownRecord(stateResources, op.logicalId) !== recordBefore);
|
|
27517
27865
|
}
|
|
27518
27866
|
}
|
|
27867
|
+
function ownRecord(stateResources, logicalId) {
|
|
27868
|
+
return Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
|
|
27869
|
+
}
|
|
27519
27870
|
async function replayFailedOperationsUnbound(failedOps, stateResources, stackName, ctx, options = {}) {
|
|
27520
27871
|
const inlinePolicyWriters = options.inlinePolicyWriters ?? new RollbackInlinePolicyWriters();
|
|
27521
27872
|
const result = {
|
|
@@ -27552,6 +27903,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
27552
27903
|
mask
|
|
27553
27904
|
};
|
|
27554
27905
|
let createRollbackRoute;
|
|
27906
|
+
const recordBefore = ownRecord(stateResources, op.logicalId);
|
|
27555
27907
|
try {
|
|
27556
27908
|
addRecordNames(opMasker, op, stateResources[op.logicalId]);
|
|
27557
27909
|
switch (action) {
|
|
@@ -27720,7 +28072,9 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
27720
28072
|
error: maskedRollbackEventError(revertError, mask)
|
|
27721
28073
|
});
|
|
27722
28074
|
}
|
|
28075
|
+
inlinePolicyWriters.noteOutcome(op, action === "skip-failed-noop" || ownRecord(stateResources, op.logicalId) !== recordBefore);
|
|
27723
28076
|
}
|
|
28077
|
+
if (result.interrupted) await restoreHeldInlinePolicies(inlinePolicyWriters, stateResources, stackName, ctx, result, { refuseAll: true });
|
|
27724
28078
|
if (emitEnvelope) ctx.recordEvent?.({
|
|
27725
28079
|
eventType: "ROLLBACK_FINISHED",
|
|
27726
28080
|
stackName
|
|
@@ -29264,9 +29618,9 @@ function extractAllDependencies(template, logicalId) {
|
|
|
29264
29618
|
return deps.length > 0 ? deps : void 0;
|
|
29265
29619
|
}
|
|
29266
29620
|
function propertiesToRecord(desiredProperties, result, resourceType, provisionedBy) {
|
|
29267
|
-
if (result.effectiveProperties) return provisionedBy === "sdk" ? withoutSilentDropProperties(resourceType, result.effectiveProperties) : result.effectiveProperties;
|
|
29621
|
+
if (result.effectiveProperties) return markWrittenFromDeployedTemplate(provisionedBy === "sdk" ? withoutSilentDropProperties(resourceType, result.effectiveProperties) : result.effectiveProperties);
|
|
29268
29622
|
const written = provisionedBy === "sdk" ? withoutSilentDropProperties(resourceType, desiredProperties) : desiredProperties;
|
|
29269
|
-
return markSameGenerationBag(written);
|
|
29623
|
+
return markWrittenFromDeployedTemplate(markSameGenerationBag(written));
|
|
29270
29624
|
}
|
|
29271
29625
|
function extractTemplateAttributes(template, logicalId) {
|
|
29272
29626
|
const resource = template?.Resources?.[logicalId];
|
|
@@ -32276,12 +32630,14 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
|
|
|
32276
32630
|
const lostChild = lostCandidate?.mode === "reattach" || lostCandidate !== void 0 && Object.hasOwn(resolvedProps, lostCandidate.property) && Object.hasOwn(currentProps, lostCandidate.property) && keyOrderFreeJson(resolvedProps[lostCandidate.property]) === keyOrderFreeJson(currentProps[lostCandidate.property]) ? lostCandidate : void 0;
|
|
32277
32631
|
const lostWithParent = lostChild?.mode === "recreate" ? lostChild.parent : void 0;
|
|
32278
32632
|
const suppliesFreshMaskOnlyValue = carriesFreshNoEchoValue(resolvedProps, updateSecrets);
|
|
32633
|
+
const movedMasked = new Set(movedMaskedProperties(currentResource, desiredProps));
|
|
32279
32634
|
const desiredForSkipCheck = redactSecretsForState(markSameGenerationBag({ ...resolvedProps }), updateSecrets, desiredProps);
|
|
32280
32635
|
const allowedSilentDrops = this.providerRegistry.getAllowedUnsupportedProperties?.();
|
|
32281
32636
|
const desiredForSkipCheckAsWritten = currentResource.provisionedBy !== "cc-api" && allowedSilentDrops ? withoutAcceptedSilentDropProperties(resourceType, desiredForSkipCheck, allowedSilentDrops, currentResource.properties) : desiredForSkipCheck;
|
|
32282
32637
|
const allowedForRecord = allowedSilentDrops ?? /* @__PURE__ */ new Set();
|
|
32283
32638
|
const createOnlyEvidence = acceptedCreateOnlyDropsOf(currentResource);
|
|
32284
32639
|
const currentPropsAsWritten = currentResource.provisionedBy === "cc-api" ? currentProps : withoutUnwrittenSilentDropProperties(resourceType, currentProps, desiredForSkipCheck, allowedForRecord, createOnlyEvidence);
|
|
32640
|
+
const recordMatchesDesired = movedMasked.size === 0 && keyOrderFreeJson(desiredForSkipCheckAsWritten) === keyOrderFreeJson(currentPropsAsWritten);
|
|
32285
32641
|
const applyAttributeOnlyUpdate = (attributeChanges) => {
|
|
32286
32642
|
const attrSummary = attributeChanges.map((a) => `${a.attribute}: ${a.oldValue ?? "(unset)"} → ${a.newValue ?? "(unset)"}`).join(", ");
|
|
32287
32643
|
this.logger.info(safeMsg` ↻ ${logicalId} (${resourceType}) attribute update: ${attrSummary}`);
|
|
@@ -32295,7 +32651,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
|
|
|
32295
32651
|
renderer.removeTask(logicalId);
|
|
32296
32652
|
this.logger.info(safeMsg`${attrPrefix}${formatResourceLine("updated", logicalId, resourceType, "updated (metadata)")}`);
|
|
32297
32653
|
};
|
|
32298
|
-
if (!typeChanged && !suppliesFreshMaskOnlyValue && lostChild === void 0 && this.recreateDirectionFor(stackName, logicalId) === void 0 &&
|
|
32654
|
+
if (!typeChanged && !suppliesFreshMaskOnlyValue && lostChild === void 0 && this.recreateDirectionFor(stackName, logicalId) === void 0 && recordMatchesDesired) {
|
|
32299
32655
|
if (change.attributeChanges && change.attributeChanges.length > 0) {
|
|
32300
32656
|
applyAttributeOnlyUpdate(change.attributeChanges);
|
|
32301
32657
|
return;
|
|
@@ -32320,7 +32676,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
|
|
|
32320
32676
|
lowered.push(pc);
|
|
32321
32677
|
continue;
|
|
32322
32678
|
}
|
|
32323
|
-
const moved = keyOrderFreeJson(desiredForSkipCheckAsWritten[pc.path]) !== keyOrderFreeJson(currentPropsAsWritten[pc.path]);
|
|
32679
|
+
const moved = movedMasked.has(pc.path) || keyOrderFreeJson(desiredForSkipCheckAsWritten[pc.path]) !== keyOrderFreeJson(currentPropsAsWritten[pc.path]);
|
|
32324
32680
|
const conditionalVerdict = moved && !typeChanged && isReplacementCeiling(pc) ? this.diffCalculator.conditionalReplacementVerdict?.(resourceType, pc.path, currentPropsAsWritten[pc.path], desiredForSkipCheckAsWritten[pc.path]) : void 0;
|
|
32325
32681
|
if (moved && conditionalVerdict !== false) {
|
|
32326
32682
|
lowered.push(pc);
|
|
@@ -32352,7 +32708,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
|
|
|
32352
32708
|
}
|
|
32353
32709
|
change.propertyChanges = lowered;
|
|
32354
32710
|
}
|
|
32355
|
-
if (noEchoHeldPaths.size > 0 && !typeChanged && lostChild === void 0 && this.recreateDirectionFor(stackName, logicalId) === void 0 &&
|
|
32711
|
+
if (noEchoHeldPaths.size > 0 && !typeChanged && lostChild === void 0 && this.recreateDirectionFor(stackName, logicalId) === void 0 && recordMatchesDesired && Object.entries(resolvedProps).every(([key, value]) => noEchoHeldPaths.has(key) || freshNoEchoLeafPositions(value, updateSecrets).length === 0)) {
|
|
32356
32712
|
this.logger.debug(safeMsg`Skipping ${logicalId}: AWS already holds every NoEcho value it carries, and nothing else changed`);
|
|
32357
32713
|
this.attemptedResolvedProps.delete(logicalId);
|
|
32358
32714
|
if (change.attributeChanges && change.attributeChanges.length > 0) {
|
|
@@ -34118,6 +34474,9 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
34118
34474
|
});
|
|
34119
34475
|
const parameterValues = await this.resolver.resolveParameters(template, this.options.parameters, { ...this.options.inheritedSecrets && hasMaskableValues(this.options.inheritedSecrets) && { inheritedSecrets: this.options.inheritedSecrets } });
|
|
34120
34476
|
this.logger.debug(`Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(", ")}`);
|
|
34477
|
+
const backfillNoEchoValues = noEchoParameterValueSeed(template.Parameters, parameterValues, this.options.inheritedSecrets, this.options.parameters);
|
|
34478
|
+
this.fingerprintNoEchoValues = backfillNoEchoValues;
|
|
34479
|
+
let maskedFingerprintsBackfilled = backfillMaskedPropertyFingerprints(currentState.resources, template, backfillNoEchoValues) > 0;
|
|
34121
34480
|
const context = this.buildResolverContext({
|
|
34122
34481
|
template,
|
|
34123
34482
|
resources: currentState.resources,
|
|
@@ -34139,7 +34498,10 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
34139
34498
|
const effectiveTemplate = this.templateParser.filterResourcesByCondition(template, conditions);
|
|
34140
34499
|
const orphanCountBeforeAdoption = (currentState.orphans ?? []).length;
|
|
34141
34500
|
const orphanPlan = await this.adoptRollbackOrphans(currentState, effectiveTemplate);
|
|
34142
|
-
if (Object.keys(orphanPlan.adopted).length > 0)
|
|
34501
|
+
if (Object.keys(orphanPlan.adopted).length > 0) {
|
|
34502
|
+
this.stampReasonlessParameterRefusals(currentState.resources, template);
|
|
34503
|
+
if (backfillMaskedPropertyFingerprints(currentState.resources, template, backfillNoEchoValues) > 0) maskedFingerprintsBackfilled = true;
|
|
34504
|
+
}
|
|
34143
34505
|
const orphansChanged = Object.keys(orphanPlan.adopted).length > 0 || (currentState.orphans ?? []).length !== orphanCountBeforeAdoption;
|
|
34144
34506
|
const resourceTypes = new Set(Object.values(effectiveTemplate.Resources || {}).map((r) => r.Type).filter((type) => type !== "AWS::CDK::Metadata"));
|
|
34145
34507
|
this.providerRegistry.validateResourceTypes(resourceTypes);
|
|
@@ -34216,7 +34578,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
34216
34578
|
const skippedOutputsChanged = !skippedOutputsEqual(currentState.skippedOutputs, this.skippedOutputs);
|
|
34217
34579
|
const healedAttributesPending = this.hasUnpersistedHeals(currentState.resources);
|
|
34218
34580
|
const conditionVerdictsChanged = !conditionVerdictRecordsEqual(readRecordedConditionVerdicts(currentState), conditionVerdicts);
|
|
34219
|
-
if (observedRefresh || conditionVerdictsChanged || outputsChanged || exportSetChanged || skippedOutputsChanged || orphansChanged || healedAttributesPending) try {
|
|
34581
|
+
if (observedRefresh || maskedFingerprintsBackfilled || conditionVerdictsChanged || outputsChanged || exportSetChanged || skippedOutputsChanged || orphansChanged || healedAttributesPending) try {
|
|
34220
34582
|
const refreshedState = {
|
|
34221
34583
|
version: 10,
|
|
34222
34584
|
region: this.stackRegion,
|
|
@@ -34573,6 +34935,7 @@ var DeployEngine = class {
|
|
|
34573
34935
|
noEchoAttributeResources = /* @__PURE__ */ new Map();
|
|
34574
34936
|
perResourceTemplateProps = /* @__PURE__ */ new Map();
|
|
34575
34937
|
perResourceResolvedType = /* @__PURE__ */ new Map();
|
|
34938
|
+
fingerprintNoEchoValues = void 0;
|
|
34576
34939
|
outputSecrets = /* @__PURE__ */ new Map();
|
|
34577
34940
|
outputsPassSecretMaps = [];
|
|
34578
34941
|
outputsTemplateSource = Object.create(null);
|
|
@@ -34620,6 +34983,7 @@ var DeployEngine = class {
|
|
|
34620
34983
|
this.noEchoAttributeResources = /* @__PURE__ */ new Map();
|
|
34621
34984
|
this.perResourceTemplateProps = /* @__PURE__ */ new Map();
|
|
34622
34985
|
this.perResourceResolvedType = /* @__PURE__ */ new Map();
|
|
34986
|
+
this.fingerprintNoEchoValues = void 0;
|
|
34623
34987
|
this.attemptedResolvedProps = /* @__PURE__ */ new Map();
|
|
34624
34988
|
this.liveTaskLabels = /* @__PURE__ */ new Map();
|
|
34625
34989
|
this.outputSecrets = /* @__PURE__ */ new Map();
|
|
@@ -34646,13 +35010,15 @@ var DeployEngine = class {
|
|
|
34646
35010
|
for (const [logicalId, record] of Object.entries(state.resources)) {
|
|
34647
35011
|
const secrets = this.perResourceSecrets.get(logicalId);
|
|
34648
35012
|
const templateProps = this.perResourceTemplateProps.get(logicalId);
|
|
34649
|
-
|
|
35013
|
+
const scrubbed = scrubResourceRecord(this.withHealedAttributes(logicalId, record), secrets ?? /* @__PURE__ */ new Map(), templateProps);
|
|
35014
|
+
resources[logicalId] = withMaskedPropertyFingerprints(scrubbed, record.properties, templateProps, secrets, this.fingerprintNoEchoValues);
|
|
34650
35015
|
}
|
|
34651
35016
|
const orphans = state.orphans?.map((entry) => {
|
|
34652
35017
|
const sameResource = this.perResourceResolvedType.get(entry.logicalId) === entry.state.resourceType;
|
|
35018
|
+
const orphanTemplateProps = sameResource ? this.perResourceTemplateProps.get(entry.logicalId) : void 0;
|
|
34653
35019
|
return {
|
|
34654
35020
|
...entry,
|
|
34655
|
-
state: scrubResourceRecord(entry.state, (sameResource ? this.perResourceSecrets.get(entry.logicalId) : void 0) ?? /* @__PURE__ */ new Map(), sameResource ? this.
|
|
35021
|
+
state: withMaskedPropertyFingerprints(scrubResourceRecord(entry.state, (sameResource ? this.perResourceSecrets.get(entry.logicalId) : void 0) ?? /* @__PURE__ */ new Map(), orphanTemplateProps), entry.state.properties, orphanTemplateProps, sameResource ? this.perResourceSecrets.get(entry.logicalId) : void 0, sameResource ? this.fingerprintNoEchoValues : void 0)
|
|
34656
35022
|
};
|
|
34657
35023
|
});
|
|
34658
35024
|
const outputs = this.redactOutputs(state.outputs);
|
|
@@ -34825,5 +35191,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
|
|
|
34825
35191
|
DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
|
|
34826
35192
|
|
|
34827
35193
|
//#endregion
|
|
34828
|
-
export { nestedChildStackName as $, importableOutputs as $a, describeTypeWithThrottleRetry as $i, coerceParameterTypedValue as $n, resolveStateBucketWithDefaultAndSource as $o, refuseMalformedOutputs as $r, acquireIdempotencyToken as $t, ECR_AUTO_DELETE_IMAGES_TAG as A, pathCrossesDottedKey as Aa, findReplacedReadersOfRecreateTargets as Ai, reEnableInstanceApiTermination as An, formatDockerLoginError as Ao, malformedLocalResourceEntriesWarning as Ar, DeploymentEventsStore as At, gray as B, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ba, toFiniteNumber as Bi, explicitRoleArnOrThrow as Bn, escapeRegExp$2 as Bo, malformedResourceEntriesWarning as Br, noEchoParameterValueSeed as Bt, deleteBudgetKey as C, markSameGenerationBag as Ca, unreadableResourceEntries as Ci, isWaitAbandonedError as Cn, buildDockerImage as Co, hasReadableResources as Cr, absoluteAssemblyPathEscape as Cs, effectiveDeletionPolicy as Ct, INDEX_SETTLE_POLL_INTERVAL_MS as D, DYNAMIC_REFERENCE_TOKEN_SCAN as Da, withoutSilentDropProperties as Di, isTerminationProtectionPropagationError as Dn, describeDockerFailure as Do, malformedExportNamesWarning as Dr, resolveAssemblyPath as Ds, updatePartialMessage as Dt, DELETE_INDEX_WAIT_PROCEED_NOTE as E, recoverMaskedOutput as Ea, unwrittenCreateOnlyReplacement as Ei, ec2InstanceProtectionSite as En, describeDockerExecFailure as Eo, malformedDriftResourcePropertiesWarning as Er, renderAssemblyPathEscape as Es, unsupportedFinalSnapshotError as Et, markRefusedBeforeApplying as F, recordNoEchoAttributeValues as Fa, renderStatefulReason as Fi, producerRegionsFromState as Fn, redactDockerArgvValues as Fo, malformedOrphansRefusalMessage as Fr, secretBearing as Ft, namesAnyDeclaredParameter as G, rebuildClientForBucketRegion as Ga, configStringRefusal as Gi, callerEnvCredentials as Gn, synthesisStatusMessage as Go, previewableOrphanRecords as Gr, DEFAULT_RESOURCE_TIMEOUT_MS as Gt, red as H, LockManager as Ha, coerceCfnInteger as Hi, sendableAssumeRoleCommand as Hn, AssetManifestLoader as Ho, malformedResourcesWarning as Hr, collectPublishedOutputNames as Ht, formatResourceLine as I, STATE_SOURCED_BASELINE_RULES as Ia, WARM_THROUGHPUT_MEMBERS as Ii, regionLessSecretName as In, redactedDockerCause as Io, malformedOrphansWarning as Ir, secretBearingStateKeyWarning as It, makeSiblingClaimReader as J, exportNamesCarriedFrom as Ja, requireConfigArray as Ji, s3BucketArn as Jn, resolveApp as Jo, refuseMalformedOrphanRecords as Jr, RollbackInlinePolicyWriters as Jt, reachableDivergentParameters as K, acceptedCreateOnlyDropsOf as Ka, readConfigString as Ki, envCredentialsAreAssumedRole as Kn, getDefaultStateBucketName as Ko, refuseDivergentRecordRegionForDestroy as Kr, DEFAULT_RESOURCE_WARN_AFTER_MS as Kt, createReadOnlyAttributeHealerFactory as L, STATE_SOURCED_CROSS_GENERATION_RULES as La, coerceWarmThroughput as Li, applyRoleArnIfSet as Ln, runDockerForeground as Lo, malformedOutputsRefusalMessage as Lr, secretSafeKeyDisplay as Lt, hasCdkAutoDeleteTag as M, carriesSecretMask as Ma, MULTI_REGION_RECREATE_BLOCKED_TYPES as Mi, INTRINSIC_KEYS as Mn, isDockerClientEnvKey as Mo, malformedOrphanRecordsRefusalMessage as Mr, WITHHELD_NAME_DISPLAY as Mt, isTruthyCfnBoolean as N, recordMaskOnlyValue as Na, isStatefulRecreateTargetForReplace as Ni, IntrinsicFunctionResolver as Nn, isMalformedEnvKey as No, malformedOrphanRecordsWarning as Nr, displayTextOrWithheld as Nt, deleteTableWithIndexBusyRetry as O, dynamicReferenceTokens as Oa, NO_CC_HANDLERS_REASON as Oi, observeThenDisableInstanceApiTermination as On, dockerSpawnEnvWithSensitive as Oo, malformedExportSourceWarning as Or, clearBucketRegionCache as Os, updatePartialReason as Ot, getPriorAttempts as P, recordMaskOnlyValuesIn as Pa, isStatefulRecreateTargetSync as Pi, classifyReplaySecretRegion as Pn, partitionSensitiveEnv as Po, malformedOrphanRowsKeptWarning as Pr, exportAliasCollisionScrubWarning as Pt, getNestedRevertRun as Q, importableOutputKeys as Qa, templateResourceTypes as Qi, s3BucketWebsiteUrl as Qn, resolveStateBucketWithDefault as Qo, refuseMalformedOrphansForOrphan as Qr, withCreateTokenLedger as Qt, bold as R, STATE_SOURCED_READBACK_RULES as Ra, isWarmThroughputDecrease as Ri, assertFlagRoleArn as Rn, runDockerStreaming as Ro, malformedOutputsWarning as Rr, exportNameSecretExposure as Rt, compensateRemovedDeletionProtection as S, maskSecretsInText as Sa, unreadableOrphanRecords as Si, withIndeterminateGuard as Sn, buildDenyExternalAccessPolicy as So, hasReadableOutputs as Sr, ownValue as Ss, createPreDeleteFinalSnapshot as St, resolveDynamoDbDeleteBudgetMs as T, scrubResourceRecord as Ta, findSilentDropProperties as Ti, disableInstanceApiTermination as Tn, describeDockerCapturedOutput as To, isReadableResourceEntry as Tr, displayAssemblyPath as Ts, refusesFinalSnapshot as Tt, yellow as U, isLockInfoExpired as Ua, configBooleanRefusal as Ui, AWS_CREDENTIAL_ENV_KEYS as Un, getDockerImageBySourceHash as Uo, malformedScrubResourceEntriesRefusalMessage as Ur, isExportAliasCollision as Ut, green as V, isSingleDynamicReferenceToken as Va, coerceCfnBoolean as Vi, isIamRoleArn as Vn, stripControlChars as Vo, malformedResourcePropertiesWarning as Vr, collectDeclaredOutputNames as Vt, computeParameterTaint as W, S3StateBackend as Wa, configIntegerRefusal as Wi, applyCallerIdentityCredentials as Wn, Synthesizer as Wo, malformedStateRefusalMessage as Wr, bindingSkippedOutputs as Wt, NESTED_PENDING_PARENT_REASON as X, hasReasonlessBaselineRefusal as Xa, requireConfigString as Xi, s3BucketDualStackDomainName as Xn, resolveCaptureObservedState as Xo, refuseMalformedOrphans as Xr, ledgerForStack as Xt, planOrphanAdoption as Y, hasReadableExportSet as Ya, requireConfigObject as Yi, s3BucketDomainName as Yn, resolveAutoAssetStorage as Yo, refuseMalformedOrphanRecordsForDestroy as Yr, earliestDefined as Yt, dropSettledNestedJournals as Z, hasUnverifiableParameterRefusal as Za, prefetchCreateOnlyPropertyPaths as Zi, s3BucketRegionalDomainName as Zn, resolveSkipPrefix as Zo, refuseMalformedOrphansForDestroy as Zr, reserveStackCreateToken as Zt, perType as _, recordLogOnlyValue as _a, repairMalformedOutputsForReadOnly as _i, ccProtectionRegistryTypes as _n, isCrossRegionRedirect as _o, UNREADABLE_ORPHANS_CONTAINER_ROW as _r, processStackMessages as _s, inheritProducerRegions as _t, conditionInputsFrom as a, DagBuilder as aa, refuseMalformedResourceEntriesForImport as ai, tagMapAsList as an, isSensitiveAttributeName as ao, carriesFetchableDynamicReference as ar, CFN_TEMPLATE_URL_LIMIT as as, replayFailedOperations as at, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as b, errorCauseChain as ba, repairMalformedResourcesForReadOnly as bi, deleteIndeterminateGuards as bn, validateAssetBucketName as bo, displayLogicalId as br, hasPlainPrototype$1 as bs, buildFinalSnapshotIdentifier as bt, isSecretBearingReferenceString as c, inheritNestedStackParameterAssociations as ca, refuseMalformedResourcePropertiesForDrift as ci, stringifyIfAssigned as cn, buildAssetRedirectMap as co, AWS_NO_VALUE as cr, uploadCfnTemplate as cs, destroyStackRecordsView as ct, makeCanonicalizePropertiesFn as d, createUnionSecretMasker as da, refuseMalformedResourcesForDeploy as di, ccBrokenReason as dn, rewriteTemplateAssetReferences as do, refStateLookupFromResource as dr, expectedOwnerParam as ds, recordAfterRollbackUpdate as dt, withRetry as ea, refuseMalformedOutputsForDestroy as ei, DBPROXY_TAGS_WHAT as en, isReadableBag as eo, isUnboundTemplateParameter as er, resolveUseCdkBootstrapAssets as es, revertNestedChildFromJournal as et, withResourceDeadline as f, hasMaskableValues as fa, refuseMalformedResourcesForDestroy as fi, wouldReturnToSdkProvider as fn, AssetModeResolver as fo, parseWebACLArn as fr, PARTITION_TABLE as fs, planFailedOps as ft, isProtectionValueActive as g, recordLogOnlyParameterValue as ga, repairMalformedOrphansForReadOnly as gi, slowCcOperationTimeoutMs as gn, getBootstrapMarkerKey as go, STATE_RESOURCES_MALFORMED as gr, StageLoadError as gs, getCurrentProducerRegions as gt, PROTECTION_PROPERTY_BY_TYPE as h, printingCorpusOf as ha, repairMalformedOrphanRecordsForReadOnly as hi, CloudControlProvider as hn, ensureAssetStorage as ho, STATE_REGION_DIVERGED as hr, AssemblyReader as hs, findNestedStackTypeChanges as ht, conditionFingerprint as i, sameLambdaFunctionAddress as ia, refuseMalformedResourceEntriesForDestroy as ii, refuseMalformedDesiredTags as in, AssetPublisher as io, carriesDynamicReference as ir, CFN_TEMPLATE_BODY_LIMIT as is, withNestedStackContext as it, S3_AUTO_DELETE_OBJECTS_TAG as j, identityKeyFor as ja, shownType as ji, DiffCalculator as jn, getDockerCmd as jo, malformedLocalResourcesWarning as jr, extractDeploymentEventError as jt, waitForIndexesSettled as k, isUncertifiedBaselineMaskPosition as ka, hasNoCloudControlHandlers as ki, reDisableInstanceApiTermination as kn, finchSecretArgvRefusal as ko, malformedLocalOutputsWarning as kr, resolveBucketRegion as ks, DeploymentEventsReader as kt, keptWholeReasonText as l, recordNestedStackParameterExpressions as la, refuseMalformedResourcePropertiesForExport as li, CC_BROKEN_REASON as ln, createAssetRedirectResolver as lo, cfnRefValueFromPhysicalId as lr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ls, getStackRecords as lt, recordedProtectionNote as m, logOnlyValueCount as ma, refuseMalformedState as mi, getCurrentResourceSecrets as mn, assertAssetBucketRegion as mo, JSON_LISTING_HOLE_VALUE as mr, derivePartitionAndUrlSuffix as ms, resolveReplacementOldType as mt, IMPLICIT_DELETE_DEPENDENCIES as n, canonicalLambdaFunctionName as na, refuseMalformedResourceEntries as ni, planTagDiff as nn, orphansCarriedFrom as no, getAccountInfo as nr, warnDeprecatedNoPrefixCliFlag as ns, withNestedRevertRun as nt, parentSuppliedValues as o, TemplateParser as oa, refuseMalformedResourceEntriesForImportSave as oi, tagPlanWarning as on, stringifyValue as oo, isNamelessDynamicReferenceError as or, MIGRATE_TMP_PREFIX as os, replayRollback as ot, recordedProtectionEvidence as p, literalSplitDelimitersOf as pa, refuseMalformedResourcesForExport as pi, isCustomResourceType as pn, BOOTSTRAP_MARKER_PREFIX as po, withSharedDrainBudget as pr, canonicalizeRegion as ps, planRollback as pt, resourcesNamingDeclaredParameter as q, describeRegionValueKind as qa, replayWarn as qi, isSettledInstanceState as qn, getLegacyStateBucketName as qo, refuseMalformedNestedChildOutputs as qr, maskingRetryLogger as qt, computeImplicitDeleteEdges as r, lambdaFunctionNameForMask as ra, refuseMalformedResourceEntriesForDeploy as ri, readTagList as rn, shouldRetainResource as ro, isImpossibleEmptyStoredAttribute as rr, ssmResolvedValueType as rs, getCurrentNestedStackContext as rt, readRecordedConditionVerdicts as s, liveMatchesUnresolvedTokenFrame as sa, refuseMalformedResourceEntriesForOrphan as si, definedAttributes as sn, WorkGraph as so, keepsSecretReferenceToken as sr, findLargeInlineResources as ss, awaitInFlightSibling as st, DeployEngine as t, markAuxiliaryFailure as ta, refuseMalformedResourceAttributesForOrphan as ti, DBPROXY_TAG_OPTIONS as tn, orphansAfterRollback as to, parameterTypeMayLoseSecretIdentity as tr, stateBucketExistenceConfirmed as ts, revertedNestedRowIds as tt, mergeNoChangeOutputs as u, carryLogOnlyValues as ua, refuseMalformedResourcePropertiesForOrphan as ui, ProviderRegistry as un, loadPublishableAssetManifest as uo, isStalePlaceholderArnAttribute as ur, decodeListingKey as us, withStackRecords as ut, readProtection as v, shareLogOnlyValues as va, repairMalformedResourceEntriesForReadOnly as vi, unchangedBehindSecretReference as vn, parseBootstrapMarker as vo, UNREADABLE_RESOURCES_MAP_ROW as vr, defineOwnKey as vs, ATOMIC_FINAL_SNAPSHOT_TYPES as vt, resolveDynamoDbDeleteBudgetClock as w, redactSecretsForState as wa, findActionableSilentDrops as wi, markWaitAbandoned as wn, resolveDockerContextDirectory as wo, isReadableOrphanRecord as wr, describeFileReadFailure as ws, isFinalSnapshotError as wt, beginDeleteWait as x, maskSecretsInError as xa, unpreviewableOrphanRecords as xi, deleteSkipReason as xn, validateContainerRepoName as xo, hasReadableOrphans as xr, nullPrototypeRecord as xs, ccRoutedFinalSnapshotError as xt, DynamoDBGlobalTableProvider as y, createSecretMasker as ya, repairMalformedResourcePropertiesForReadOnly as yi, UNSPECIFIED_SKIP_REASON as yn, readBootstrapMarkerBody as yo, deployRefusesOrphanRowsReason as yr, hasOwnKey as ys, PRE_DELETE_SNAPSHOT_TYPES as yt, cyan as z, TEMPLATE_SOURCED_RULES as za, toCfnInteger as zi, assertSendableRoleArn as zn, warnFinchArgvExposure as zo, malformedRenderedContainersWarning as zr, isWholeDynamicReferenceValue as zt };
|
|
34829
|
-
//# sourceMappingURL=deploy-engine-
|
|
35194
|
+
export { nestedChildStackName as $, hasReadableExportSet as $a, requireConfigObject as $i, s3BucketDomainName as $n, resolveAutoAssetStorage as $o, refuseMalformedOrphanRecordsForDestroy as $r, earliestDefined as $t, ECR_AUTO_DELETE_IMAGES_TAG as A, recoverMaskedOutput as Aa, unwrittenCreateOnlyReplacement as Ai, ec2InstanceProtectionSite as An, describeDockerExecFailure as Ao, malformedDriftResourcePropertiesWarning as Ar, renderAssemblyPathEscape as As, redactedDeleteAddressSkip as At, gray as B, STATE_SOURCED_BASELINE_RULES as Ba, WARM_THROUGHPUT_MEMBERS as Bi, regionLessSecretName as Bn, redactedDockerCause as Bo, malformedOrphansWarning as Br, secretBearingStateKeyWarning as Bt, deleteBudgetKey as C, createSecretMasker as Ca, repairMalformedResourcePropertiesForReadOnly as Ci, UNSPECIFIED_SKIP_REASON as Cn, readBootstrapMarkerBody as Co, deployRefusesOrphanRowsReason as Cr, hasOwnKey as Cs, effectiveDeletionPolicy as Ct, INDEX_SETTLE_POLL_INTERVAL_MS as D, markSameGenerationBag as Da, unreadableResourceEntries as Di, isWaitAbandonedError as Dn, buildDockerImage as Do, hasReadableResources as Dr, absoluteAssemblyPathEscape as Ds, REDACTED_DELETE_ADDRESS_SKIP_REASON as Dt, DELETE_INDEX_WAIT_PROCEED_NOTE as E, maskSecretsInText as Ea, unreadableOrphanRecords as Ei, withIndeterminateGuard as En, buildDenyExternalAccessPolicy as Eo, hasReadableOutputs as Er, ownValue as Es, unsupportedFinalSnapshotError as Et, markRefusedBeforeApplying as F, identityKeyFor as Fa, shownType as Fi, DiffCalculator as Fn, getDockerCmd as Fo, malformedLocalResourcesWarning as Fr, extractDeploymentEventError as Ft, namesAnyDeclaredParameter as G, isSingleDynamicReferenceToken as Ga, coerceCfnBoolean as Gi, isIamRoleArn as Gn, stripControlChars as Go, malformedResourcePropertiesWarning as Gr, collectDeclaredOutputNames as Gt, red as H, STATE_SOURCED_READBACK_RULES as Ha, isWarmThroughputDecrease as Hi, assertFlagRoleArn as Hn, runDockerStreaming as Ho, malformedOutputsWarning as Hr, exportNameSecretExposure as Ht, formatResourceLine as I, carriesSecretMask as Ia, MULTI_REGION_RECREATE_BLOCKED_TYPES as Ii, INTRINSIC_KEYS as In, isDockerClientEnvKey as Io, malformedOrphanRecordsRefusalMessage as Ir, WITHHELD_NAME_DISPLAY as It, makeSiblingClaimReader as J, S3StateBackend as Ja, configIntegerRefusal as Ji, applyCallerIdentityCredentials as Jn, Synthesizer as Jo, malformedStateRefusalMessage as Jr, bindingSkippedOutputs as Jt, reachableDivergentParameters as K, LockManager as Ka, coerceCfnInteger as Ki, sendableAssumeRoleCommand as Kn, AssetManifestLoader as Ko, malformedResourcesWarning as Kr, collectPublishedOutputNames as Kt, createReadOnlyAttributeHealerFactory as L, recordMaskOnlyValue as La, isStatefulRecreateTargetForReplace as Li, IntrinsicFunctionResolver as Ln, isMalformedEnvKey as Lo, malformedOrphanRecordsWarning as Lr, displayTextOrWithheld as Lt, hasCdkAutoDeleteTag as M, dynamicReferenceTokens as Ma, NO_CC_HANDLERS_REASON as Mi, observeThenDisableInstanceApiTermination as Mn, dockerSpawnEnvWithSensitive as Mo, malformedExportSourceWarning as Mr, clearBucketRegionCache as Ms, updatePartialReason as Mt, isTruthyCfnBoolean as N, isUncertifiedBaselineMaskPosition as Na, hasNoCloudControlHandlers as Ni, reDisableInstanceApiTermination as Nn, finchSecretArgvRefusal as No, malformedLocalOutputsWarning as Nr, resolveBucketRegion as Ns, DeploymentEventsReader as Nt, deleteTableWithIndexBusyRetry as O, redactSecretsForState as Oa, findActionableSilentDrops as Oi, markWaitAbandoned as On, resolveDockerContextDirectory as Oo, isReadableOrphanRecord as Or, describeFileReadFailure as Os, isRedactedRecordedValue as Ot, getPriorAttempts as P, pathCrossesDottedKey as Pa, findReplacedReadersOfRecreateTargets as Pi, reEnableInstanceApiTermination as Pn, formatDockerLoginError as Po, malformedLocalResourceEntriesWarning as Pr, DeploymentEventsStore as Pt, getNestedRevertRun as Q, exportNamesCarriedFrom as Qa, requireConfigArray as Qi, s3BucketArn as Qn, resolveApp as Qo, refuseMalformedOrphanRecords as Qr, RollbackInlinePolicyWriters as Qt, bold as R, recordMaskOnlyValuesIn as Ra, isStatefulRecreateTargetSync as Ri, classifyReplaySecretRegion as Rn, partitionSensitiveEnv as Ro, malformedOrphanRowsKeptWarning as Rr, exportAliasCollisionScrubWarning as Rt, compensateRemovedDeletionProtection as S, shareLogOnlyValues as Sa, repairMalformedResourceEntriesForReadOnly as Si, unchangedBehindSecretReference as Sn, parseBootstrapMarker as So, UNREADABLE_RESOURCES_MAP_ROW as Sr, defineOwnKey as Ss, createPreDeleteFinalSnapshot as St, resolveDynamoDbDeleteBudgetMs as T, maskSecretsInError as Ta, unpreviewableOrphanRecords as Ti, deleteSkipReason as Tn, validateContainerRepoName as To, hasReadableOrphans as Tr, nullPrototypeRecord as Ts, refusesFinalSnapshot as Tt, yellow as U, TEMPLATE_SOURCED_RULES as Ua, toCfnInteger as Ui, assertSendableRoleArn as Un, warnFinchArgvExposure as Uo, malformedRenderedContainersWarning as Ur, isWholeDynamicReferenceValue as Ut, green as V, STATE_SOURCED_CROSS_GENERATION_RULES as Va, coerceWarmThroughput as Vi, applyRoleArnIfSet as Vn, runDockerForeground as Vo, malformedOutputsRefusalMessage as Vr, secretSafeKeyDisplay as Vt, computeParameterTaint as W, WHOLE_DYNAMIC_REFERENCE_PATTERN as Wa, toFiniteNumber as Wi, explicitRoleArnOrThrow as Wn, escapeRegExp$2 as Wo, malformedResourceEntriesWarning as Wr, noEchoParameterValueSeed as Wt, NESTED_PENDING_PARENT_REASON as X, acceptedCreateOnlyDropsOf as Xa, readConfigString as Xi, envCredentialsAreAssumedRole as Xn, getDefaultStateBucketName as Xo, refuseDivergentRecordRegionForDestroy as Xr, DEFAULT_RESOURCE_WARN_AFTER_MS as Xt, planOrphanAdoption as Y, rebuildClientForBucketRegion as Ya, configStringRefusal as Yi, callerEnvCredentials as Yn, synthesisStatusMessage as Yo, previewableOrphanRecords as Yr, DEFAULT_RESOURCE_TIMEOUT_MS as Yt, dropSettledNestedJournals as Z, describeRegionValueKind as Za, replayWarn as Zi, isSettledInstanceState as Zn, getLegacyStateBucketName as Zo, refuseMalformedNestedChildOutputs as Zr, maskingRetryLogger as Zt, perType as _, literalSplitDelimitersOf as _a, refuseMalformedResourcesForExport as _i, isCustomResourceType as _n, BOOTSTRAP_MARKER_PREFIX as _o, withSharedDrainBudget as _r, canonicalizeRegion as _s, inheritProducerRegions as _t, conditionInputsFrom as a, markAuxiliaryFailure as aa, refuseMalformedResourceAttributesForOrphan as ai, DBPROXY_TAG_OPTIONS as an, orphansAfterRollback as ao, parameterTypeMayLoseSecretIdentity as ar, stateBucketExistenceConfirmed as as, replayFailedOperations as at, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as b, recordLogOnlyParameterValue as ba, repairMalformedOrphansForReadOnly as bi, slowCcOperationTimeoutMs as bn, getBootstrapMarkerKey as bo, STATE_RESOURCES_MALFORMED as br, StageLoadError as bs, buildFinalSnapshotIdentifier as bt, isSecretBearingReferenceString as c, sameLambdaFunctionAddress as ca, refuseMalformedResourceEntriesForDestroy as ci, refuseMalformedDesiredTags as cn, AssetPublisher as co, carriesDynamicReference as cr, CFN_TEMPLATE_BODY_LIMIT as cs, destroyStackRecordsView as ct, makeCanonicalizePropertiesFn as d, liveMatchesUnresolvedTokenFrame as da, refuseMalformedResourceEntriesForOrphan as di, definedAttributes as dn, WorkGraph as do, keepsSecretReferenceToken as dr, findLargeInlineResources as ds, recordAfterRollbackUpdate as dt, requireConfigString as ea, refuseMalformedOrphans as ei, ledgerForStack as en, hasReasonlessBaselineRefusal as eo, s3BucketDualStackDomainName as er, resolveCaptureObservedState as es, revertNestedChildFromJournal as et, withResourceDeadline as f, inheritNestedStackParameterAssociations as fa, refuseMalformedResourcePropertiesForDrift as fi, stringifyIfAssigned as fn, buildAssetRedirectMap as fo, AWS_NO_VALUE as fr, uploadCfnTemplate as fs, planFailedOps as ft, isProtectionValueActive as g, hasMaskableValues as ga, refuseMalformedResourcesForDestroy as gi, wouldReturnToSdkProvider as gn, AssetModeResolver as go, parseWebACLArn as gr, PARTITION_TABLE as gs, getCurrentProducerRegions as gt, PROTECTION_PROPERTY_BY_TYPE as h, createUnionSecretMasker as ha, refuseMalformedResourcesForDeploy as hi, ccBrokenReason as hn, rewriteTemplateAssetReferences as ho, refStateLookupFromResource as hr, expectedOwnerParam as hs, findNestedStackTypeChanges as ht, conditionFingerprint as i, withRetry as ia, refuseMalformedOutputsForDestroy as ii, DBPROXY_TAGS_WHAT as in, isReadableBag as io, isUnboundTemplateParameter as ir, resolveUseCdkBootstrapAssets as is, withNestedStackContext as it, S3_AUTO_DELETE_OBJECTS_TAG as j, DYNAMIC_REFERENCE_TOKEN_SCAN as ja, withoutSilentDropProperties as ji, isTerminationProtectionPropagationError as jn, describeDockerFailure as jo, malformedExportNamesWarning as jr, resolveAssemblyPath as js, updatePartialMessage as jt, waitForIndexesSettled as k, scrubResourceRecord as ka, findSilentDropProperties as ki, disableInstanceApiTermination as kn, describeDockerCapturedOutput as ko, isReadableResourceEntry as kr, displayAssemblyPath as ks, redactedDeleteAddressFields as kt, keptWholeReasonText as l, DagBuilder as la, refuseMalformedResourceEntriesForImport as li, tagMapAsList as ln, isSensitiveAttributeName as lo, carriesFetchableDynamicReference as lr, CFN_TEMPLATE_URL_LIMIT as ls, getStackRecords as lt, recordedProtectionNote as m, carryLogOnlyValues as ma, refuseMalformedResourcePropertiesForOrphan as mi, ProviderRegistry as mn, loadPublishableAssetManifest as mo, isStalePlaceholderArnAttribute as mr, decodeListingKey as ms, resolveReplacementOldType as mt, IMPLICIT_DELETE_DEPENDENCIES as n, templateResourceTypes as na, refuseMalformedOrphansForOrphan as ni, withCreateTokenLedger as nn, importableOutputKeys as no, s3BucketWebsiteUrl as nr, resolveStateBucketWithDefault as ns, withNestedRevertRun as nt, parentSuppliedValues as o, canonicalLambdaFunctionName as oa, refuseMalformedResourceEntries as oi, planTagDiff as on, orphansCarriedFrom as oo, getAccountInfo as or, warnDeprecatedNoPrefixCliFlag as os, replayRollback as ot, recordedProtectionEvidence as p, recordNestedStackParameterExpressions as pa, refuseMalformedResourcePropertiesForExport as pi, CC_BROKEN_REASON as pn, createAssetRedirectResolver as po, cfnRefValueFromPhysicalId as pr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ps, planRollback as pt, resourcesNamingDeclaredParameter as q, isLockInfoExpired as qa, configBooleanRefusal as qi, AWS_CREDENTIAL_ENV_KEYS as qn, getDockerImageBySourceHash as qo, malformedScrubResourceEntriesRefusalMessage as qr, isExportAliasCollision as qt, computeImplicitDeleteEdges as r, describeTypeWithThrottleRetry as ra, refuseMalformedOutputs as ri, acquireIdempotencyToken as rn, importableOutputs as ro, coerceParameterTypedValue as rr, resolveStateBucketWithDefaultAndSource as rs, getCurrentNestedStackContext as rt, readRecordedConditionVerdicts as s, lambdaFunctionNameForMask as sa, refuseMalformedResourceEntriesForDeploy as si, readTagList as sn, shouldRetainResource as so, isImpossibleEmptyStoredAttribute as sr, ssmResolvedValueType as ss, awaitInFlightSibling as st, DeployEngine as t, prefetchCreateOnlyPropertyPaths as ta, refuseMalformedOrphansForDestroy as ti, reserveStackCreateToken as tn, hasUnverifiableParameterRefusal as to, s3BucketRegionalDomainName as tr, resolveSkipPrefix as ts, revertedNestedRowIds as tt, mergeNoChangeOutputs as u, TemplateParser as ua, refuseMalformedResourceEntriesForImportSave as ui, tagPlanWarning as un, stringifyValue as uo, isNamelessDynamicReferenceError as ur, MIGRATE_TMP_PREFIX as us, withStackRecords as ut, readProtection as v, logOnlyValueCount as va, refuseMalformedState as vi, getCurrentResourceSecrets as vn, assertAssetBucketRegion as vo, JSON_LISTING_HOLE_VALUE as vr, derivePartitionAndUrlSuffix as vs, ATOMIC_FINAL_SNAPSHOT_TYPES as vt, resolveDynamoDbDeleteBudgetClock as w, errorCauseChain as wa, repairMalformedResourcesForReadOnly as wi, deleteIndeterminateGuards as wn, validateAssetBucketName as wo, displayLogicalId as wr, hasPlainPrototype$1 as ws, isFinalSnapshotError as wt, beginDeleteWait as x, recordLogOnlyValue as xa, repairMalformedOutputsForReadOnly as xi, ccProtectionRegistryTypes as xn, isCrossRegionRedirect as xo, UNREADABLE_ORPHANS_CONTAINER_ROW as xr, processStackMessages as xs, ccRoutedFinalSnapshotError as xt, DynamoDBGlobalTableProvider as y, printingCorpusOf as ya, repairMalformedOrphanRecordsForReadOnly as yi, CloudControlProvider as yn, ensureAssetStorage as yo, STATE_REGION_DIVERGED as yr, AssemblyReader as ys, PRE_DELETE_SNAPSHOT_TYPES as yt, cyan as z, recordNoEchoAttributeValues as za, renderStatefulReason as zi, producerRegionsFromState as zn, redactDockerArgvValues as zo, malformedOrphansRefusalMessage as zr, secretBearing as zt };
|
|
35195
|
+
//# sourceMappingURL=deploy-engine-RCOtmm4V.js.map
|