@go-to-k/cdkd 0.299.4 → 0.299.5
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-BtUUjRnI.js → asg-provider-DZv4iAmI.js} +4 -4
- package/dist/{asg-provider-BtUUjRnI.js.map → asg-provider-DZv4iAmI.js.map} +1 -1
- package/dist/{aws-failure-text-DtvlUugx.js → aws-failure-text-BEQfs6za.js} +12 -3
- package/dist/aws-failure-text-BEQfs6za.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-DWIbDQdg.js → deploy-engine-D6CSo8Gj.js} +241 -126
- package/dist/deploy-engine-D6CSo8Gj.js.map +1 -0
- package/dist/{iam-policy-targets-Pn2m0R67.js → iam-policy-targets-dAY3-gXJ.js} +2 -2
- package/dist/{iam-policy-targets-Pn2m0R67.js.map → iam-policy-targets-dAY3-gXJ.js.map} +1 -1
- package/dist/{iam-role-provider-DTQlG8qe.js → iam-role-provider-vd8u3waQ.js} +4 -4
- package/dist/{iam-role-provider-DTQlG8qe.js.map → iam-role-provider-vd8u3waQ.js.map} +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/{neptune-provider-Bkrw65eO.js → neptune-provider-BHEUW4UW.js} +4 -4
- package/dist/{neptune-provider-Bkrw65eO.js.map → neptune-provider-BHEUW4UW.js.map} +1 -1
- package/dist/{program-B4_qJpAO.js → program-iNas59nt.js} +40 -16
- package/dist/program-iNas59nt.js.map +1 -0
- package/dist/{provider-classes-SNKb1al7.js → provider-classes-ec1KOg_1.js} +29 -19
- package/dist/provider-classes-ec1KOg_1.js.map +1 -0
- package/dist/{rds-provider-B9gz-giS.js → rds-provider-J60TlCOp.js} +4 -4
- package/dist/{rds-provider-B9gz-giS.js.map → rds-provider-J60TlCOp.js.map} +1 -1
- package/dist/{version-B-AQELPJ.js → version-FFcDgFAc.js} +2 -2
- package/dist/{version-B-AQELPJ.js.map → version-FFcDgFAc.js.map} +1 -1
- package/package.json +1 -1
- package/dist/aws-failure-text-DtvlUugx.js.map +0 -1
- package/dist/deploy-engine-DWIbDQdg.js.map +0 -1
- package/dist/program-B4_qJpAO.js.map +0 -1
- package/dist/provider-classes-SNKb1al7.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as getAwsClients, s as __exportAll } from "./aws-clients-Bj7qH5Ph.js";
|
|
2
|
-
import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as
|
|
3
|
-
import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-
|
|
2
|
+
import { A as UNRENDERABLE, B as safeMsg, C as looksLikeCdkdGeneratedName, D as SAFE_MSG_ALTERED_CHAR, E as withoutGeneratedFallbackName, F as displaySafe, H as terminalSafe, I as displayStackName, L as isPasteableIdent, N as displayAwsMessage, O as SECRET_REF_MAX_CODE_POINTS, P as displayIdent, S as getCurrentStackName, T as withStackName, U as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, j as asIsMessage, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as plainIdentOr } from "./aws-failure-text-BEQfs6za.js";
|
|
3
|
+
import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-dAY3-gXJ.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-DBXBcg0J.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-FFcDgFAc.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
8
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -7206,6 +7206,28 @@ function nanIfUncoercible(value) {
|
|
|
7206
7206
|
//#endregion
|
|
7207
7207
|
//#region src/deployment/secret-redaction/rules.ts
|
|
7208
7208
|
const MIN_NEEDLE_LENGTH = 4;
|
|
7209
|
+
function printingNeedles(values) {
|
|
7210
|
+
const out = /* @__PURE__ */ new Set();
|
|
7211
|
+
for (const value of values) {
|
|
7212
|
+
if (value.length < 4) continue;
|
|
7213
|
+
out.add(value);
|
|
7214
|
+
const flat = flattenedSpelling(value);
|
|
7215
|
+
if (flat !== void 0 && flat.trim().length >= 4) out.add(flat);
|
|
7216
|
+
}
|
|
7217
|
+
return [...out];
|
|
7218
|
+
}
|
|
7219
|
+
const FLATTENED_MEMO_CAP = 4096;
|
|
7220
|
+
const flattenedMemo = /* @__PURE__ */ new Map();
|
|
7221
|
+
function flattenedSpelling(value) {
|
|
7222
|
+
if (!SAFE_MSG_ALTERED_CHAR.test(value)) return void 0;
|
|
7223
|
+
let flat = flattenedMemo.get(value);
|
|
7224
|
+
if (flat === void 0) {
|
|
7225
|
+
flat = safeMsg`${value}`;
|
|
7226
|
+
if (flattenedMemo.size >= FLATTENED_MEMO_CAP) flattenedMemo.clear();
|
|
7227
|
+
flattenedMemo.set(value, flat);
|
|
7228
|
+
}
|
|
7229
|
+
return flat === value ? void 0 : flat;
|
|
7230
|
+
}
|
|
7209
7231
|
function escapeRegExp$2(value) {
|
|
7210
7232
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
7211
7233
|
}
|
|
@@ -9260,9 +9282,10 @@ function isSameGenerationBag(bag) {
|
|
|
9260
9282
|
//#region src/deployment/secret-redaction/mask-errors.ts
|
|
9261
9283
|
function maskSecretsInText(text, secrets) {
|
|
9262
9284
|
const logOnly = logOnlyValuesOf.get(secrets);
|
|
9263
|
-
|
|
9264
|
-
if (
|
|
9265
|
-
|
|
9285
|
+
const noLogOnly = logOnly === void 0 || logOnly.size === 0;
|
|
9286
|
+
if (secrets.size === 0 && noLogOnly) return text;
|
|
9287
|
+
if (text !== "" && (secrets.has(text) || logOnly?.has(text) === true)) return "***";
|
|
9288
|
+
return maskMatchSpans(text, printingNeedles(noLogOnly ? secrets.keys() : [...secrets.keys(), ...logOnly]), "***");
|
|
9266
9289
|
}
|
|
9267
9290
|
function maskRecordedSecretsInText(text, secrets) {
|
|
9268
9291
|
if (secrets.size === 0) return text;
|
|
@@ -9626,7 +9649,7 @@ function createUnionSecretMasker(bags) {
|
|
|
9626
9649
|
for (const plaintext of bag.keys()) needles.add(plaintext);
|
|
9627
9650
|
for (const plaintext of logOnlyValuesOf.get(bag) ?? []) needles.add(plaintext);
|
|
9628
9651
|
}
|
|
9629
|
-
scanned =
|
|
9652
|
+
scanned = printingNeedles(needles);
|
|
9630
9653
|
stamp = now;
|
|
9631
9654
|
}
|
|
9632
9655
|
if (text !== "" && needles.has(text)) return "***";
|
|
@@ -11446,7 +11469,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
|
|
|
11446
11469
|
["AWS::AppSync::ApiKey", [["ApiId"]]],
|
|
11447
11470
|
["AWS::AppSync::DataSource", [["ApiId"], ["Name"]]],
|
|
11448
11471
|
["AWS::AppSync::GraphQLApi", []],
|
|
11449
|
-
["AWS::AppSync::GraphQLSchema", [
|
|
11472
|
+
["AWS::AppSync::GraphQLSchema", []],
|
|
11450
11473
|
["AWS::AppSync::Resolver", [
|
|
11451
11474
|
["ApiId"],
|
|
11452
11475
|
["FieldName"],
|
|
@@ -11461,7 +11484,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
|
|
|
11461
11484
|
"BaseEvaluatorId"
|
|
11462
11485
|
], ["EvaluatorName"]]],
|
|
11463
11486
|
["AWS::BedrockAgentCore::Runtime", [["AgentRuntimeName"]]],
|
|
11464
|
-
["AWS::Budgets::Budget", [["NotificationsWithSubscribers"]]],
|
|
11487
|
+
["AWS::Budgets::Budget", [["Budget", "BudgetName"], ["NotificationsWithSubscribers"]]],
|
|
11465
11488
|
["AWS::CertificateManager::Certificate", [
|
|
11466
11489
|
["CertificateAuthorityArn"],
|
|
11467
11490
|
["CertificateExport"],
|
|
@@ -11952,7 +11975,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
|
|
|
11952
11975
|
]],
|
|
11953
11976
|
["AWS::RDS::DBProxyTargetGroup", [["DBProxyName"], ["TargetGroupName"]]],
|
|
11954
11977
|
["AWS::RDS::DBSubnetGroup", [["DBSubnetGroupName"]]],
|
|
11955
|
-
["AWS::Route53::HostedZone", [["Name"]]],
|
|
11978
|
+
["AWS::Route53::HostedZone", [["DelegationSetId"], ["Name"]]],
|
|
11956
11979
|
["AWS::Route53::RecordSet", [["HostedZoneId"], ["HostedZoneName"]]],
|
|
11957
11980
|
["AWS::S3::Bucket", [
|
|
11958
11981
|
["BucketName"],
|
|
@@ -14412,7 +14435,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
14412
14435
|
]),
|
|
14413
14436
|
silentDrop: /* @__PURE__ */ new Map(),
|
|
14414
14437
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
14415
|
-
readOnly: /* @__PURE__ */ new Set(["
|
|
14438
|
+
readOnly: /* @__PURE__ */ new Set(["Id"]),
|
|
14416
14439
|
ccRouteUnavailable: true
|
|
14417
14440
|
}],
|
|
14418
14441
|
["AWS::CodeBuild::Project", {
|
|
@@ -16275,8 +16298,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16275
16298
|
"QueryLoggingConfig",
|
|
16276
16299
|
"VPCs"
|
|
16277
16300
|
]),
|
|
16278
|
-
silentDrop: /* @__PURE__ */ new Map(),
|
|
16279
|
-
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
16301
|
+
silentDrop: /* @__PURE__ */ new Map([["DelegationSetId", "not yet implemented by cdkd"]]),
|
|
16302
|
+
createOnlyDrops: /* @__PURE__ */ new Set(["DelegationSetId"]),
|
|
16280
16303
|
readOnly: /* @__PURE__ */ new Set(["Id", "NameServers"]),
|
|
16281
16304
|
ccRouteUnavailable: false
|
|
16282
16305
|
}],
|
|
@@ -25929,7 +25952,7 @@ var CloudControlProvider = class {
|
|
|
25929
25952
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
25930
25953
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
25931
25954
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
25932
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
25955
|
+
const { ASGProvider } = await import("./asg-provider-DZv4iAmI.js");
|
|
25933
25956
|
const delegateRegion = ambientRegion();
|
|
25934
25957
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
25935
25958
|
if (asgProvider === void 0) {
|
|
@@ -26035,7 +26058,7 @@ var CloudControlProvider = class {
|
|
|
26035
26058
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
26036
26059
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
26037
26060
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
26038
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
26061
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-J60TlCOp.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-BHEUW4UW.js"))).NeptuneProvider({ region: ccRegion });
|
|
26039
26062
|
this.sdkDeleteDelegates.set(family, {
|
|
26040
26063
|
region: ccRegion,
|
|
26041
26064
|
provider
|
|
@@ -26263,7 +26286,8 @@ var CloudControlProvider = class {
|
|
|
26263
26286
|
const causeText = safeDisplay === "" ? "" : `: ${safeDisplay}`;
|
|
26264
26287
|
if (described.detail !== "") this.logger.debug(`${operation} ${logicalId}: the abandoned operation's underlying failure was: ${displaySafe(described.detail)}`);
|
|
26265
26288
|
const identifierClause = lastSeenIdentifier === void 0 ? "" : ` The last status cdkd read named the resource ${displaySafe(lastSeenIdentifier, { asciiOnly: true })}.`;
|
|
26266
|
-
const
|
|
26289
|
+
const consequence = operation === "CREATE" ? "cdkd has NO state record for it, so any resource it creates is untracked by rollback and by cdkd destroy" : operation === "DELETE" ? "the resource may or may not have been removed; its state record is kept so a re-run can finish the delete" : "its state record still holds the PREVIOUS properties, so the record may no longer describe the live resource";
|
|
26290
|
+
const error = new CloudControlWaitAbandonedError(safeMsg`${operation} of ${logicalId} was accepted by Cloud Control API, but cdkd stopped waiting for it ` + safeMsg`(${reason}${causeText}). The operation may still be running in AWS, and ${consequence}.` + `${identifierClause} Check what it did with:\n ${await this.buildResumeCommand(requestToken)}`, resourceType, logicalId, requestToken, operation, lastSeenIdentifier, cause instanceof Error ? cause : void 0);
|
|
26267
26291
|
if (described.marker) markRedactedCause(error);
|
|
26268
26292
|
return operation === "CREATE" ? markNonRetryable(error) : error;
|
|
26269
26293
|
}
|
|
@@ -29847,6 +29871,7 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
|
|
|
29847
29871
|
["AWS::AutoScaling::AutoScalingGroup", "{\"AvailabilityZoneDistribution\":\"object\",\"AvailabilityZoneIds\":\"array\",\"AvailabilityZoneImpairmentPolicy\":\"object\",\"AvailabilityZones\":\"array\",\"CapacityReservationSpecification\":\"object\",\"CapacityReservationSpecification.CapacityReservationTarget\":\"object\",\"CapacityReservationSpecification.CapacityReservationTarget.CapacityReservationIds\":\"array\",\"CapacityReservationSpecification.CapacityReservationTarget.CapacityReservationResourceGroupArns\":\"array\",\"InstanceLifecyclePolicy\":\"object\",\"InstanceLifecyclePolicy.RetentionTriggers\":\"object\",\"InstanceMaintenancePolicy\":\"object\",\"LaunchTemplate\":\"object\",\"LifecycleHookSpecificationList\":\"array\",\"LifecycleHookSpecificationList[]\":\"object\",\"LoadBalancerNames\":\"array\",\"MetricsCollection\":\"array\",\"MetricsCollection[]\":\"object\",\"MetricsCollection[].Metrics\":\"array\",\"MixedInstancesPolicy\":\"object\",\"MixedInstancesPolicy.InstancesDistribution\":\"object\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments\":\"array\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments[]\":\"object\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments[].TargetCapacityTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.LaunchTemplateSpecification\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[]\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorManufacturers\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorNames\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorTotalMemoryMiB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AllowedInstanceTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselineEbsBandwidthMbps\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu.References\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu.References[]\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.CpuManufacturers\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.ExcludedInstanceTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.InstanceGenerations\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.LocalStorageTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.MemoryGiBPerVCpu\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.MemoryMiB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.NetworkBandwidthGbps\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.NetworkInterfaceCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.TotalLocalStorageGB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.VCpuCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].LaunchTemplateSpecification\":\"object\",\"NotificationConfiguration\":\"object\",\"NotificationConfiguration.NotificationTypes\":\"array\",\"NotificationConfigurations\":\"array\",\"NotificationConfigurations[]\":\"object\",\"NotificationConfigurations[].NotificationTypes\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"TargetGroupARNs\":\"array\",\"TerminationPolicies\":\"array\",\"TrafficSources\":\"array\",\"TrafficSources[]\":\"object\",\"VPCZoneIdentifier\":\"array\"}"],
|
|
29848
29872
|
["AWS::BedrockAgentCore::Evaluator", "{\"EvaluatorConfig\":\"object\",\"EvaluatorConfig.CodeBased\":\"object\",\"EvaluatorConfig.CodeBased.LambdaConfig\":\"object\",\"EvaluatorConfig.Derived\":\"object\",\"EvaluatorConfig.Derived.ModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.AdditionalModelRequestFields\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig.StopSequences\":\"array\",\"EvaluatorConfig.Derived.ModelConfig.ResponsesEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.ResponsesEvaluatorModelConfig.Reasoning\":\"object\",\"EvaluatorConfig.LlmAsAJudge\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.AdditionalModelRequestFields\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig.StopSequences\":\"array\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig.Reasoning\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical\":\"array\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical[]\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical\":\"array\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
29849
29873
|
["AWS::BedrockAgentCore::Runtime", "{\"AgentRuntimeArtifact\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.Code\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.Code.S3\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.EntryPoint\":\"array\",\"AgentRuntimeArtifact.ContainerConfiguration\":\"object\",\"AuthorizerConfiguration\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedAudience\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedClients\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedScopes\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.WorkloadIdentities\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue.ClaimMatchValue\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue.ClaimMatchValue.MatchValueStringList\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.SecurityGroupIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.SubnetIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.Tags\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.SelfManagedLatticeResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.SecurityGroupIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.SubnetIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.Tags\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.SelfManagedLatticeResource\":\"object\",\"CapacityProviderConfiguration\":\"object\",\"EnvironmentVariables\":\"object\",\"FilesystemConfigurations\":\"array\",\"FilesystemConfigurations[]\":\"object\",\"FilesystemConfigurations[].CapacityProviderVolume\":\"object\",\"FilesystemConfigurations[].EfsAccessPoint\":\"object\",\"FilesystemConfigurations[].S3FilesAccessPoint\":\"object\",\"FilesystemConfigurations[].SessionStorage\":\"object\",\"LifecycleConfiguration\":\"object\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.NetworkModeConfig\":\"object\",\"NetworkConfiguration.NetworkModeConfig.SecurityGroups\":\"array\",\"NetworkConfiguration.NetworkModeConfig.Subnets\":\"array\",\"RequestHeaderConfiguration\":\"object\",\"RequestHeaderConfiguration.RequestHeaderAllowlist\":\"array\",\"Tags\":\"object\",\"WorkloadIdentityDetails\":\"object\"}"],
|
|
29874
|
+
["AWS::Budgets::Budget", "{\"Budget\":\"object\",\"Budget.AutoAdjustData\":\"object\",\"Budget.AutoAdjustData.HistoricalOptions\":\"object\",\"Budget.BudgetLimit\":\"object\",\"Budget.CostFilters\":\"object\",\"Budget.CostTypes\":\"object\",\"Budget.FilterExpression\":\"object\",\"Budget.FilterExpression.And\":\"array\",\"Budget.FilterExpression.CostCategories\":\"object\",\"Budget.FilterExpression.CostCategories.MatchOptions\":\"array\",\"Budget.FilterExpression.CostCategories.Values\":\"array\",\"Budget.FilterExpression.Dimensions\":\"object\",\"Budget.FilterExpression.Dimensions.MatchOptions\":\"array\",\"Budget.FilterExpression.Dimensions.Values\":\"array\",\"Budget.FilterExpression.Or\":\"array\",\"Budget.FilterExpression.Tags\":\"object\",\"Budget.FilterExpression.Tags.MatchOptions\":\"array\",\"Budget.FilterExpression.Tags.Values\":\"array\",\"Budget.Metrics\":\"array\",\"Budget.PlannedBudgetLimits\":\"object\",\"Budget.TimePeriod\":\"object\",\"NotificationsWithSubscribers\":\"array\",\"NotificationsWithSubscribers[]\":\"object\",\"NotificationsWithSubscribers[].Notification\":\"object\",\"NotificationsWithSubscribers[].Subscribers\":\"array\",\"NotificationsWithSubscribers[].Subscribers[]\":\"object\",\"ResourceTags\":\"array\",\"ResourceTags[]\":\"object\"}"],
|
|
29850
29875
|
["AWS::CertificateManager::Certificate", "{\"DomainValidationOptions\":\"array\",\"DomainValidationOptions[]\":\"object\",\"SubjectAlternativeNames\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
29851
29876
|
["AWS::CloudFormation::Stack", "{\"Capabilities\":\"array\",\"NotificationARNs\":\"array\",\"Outputs\":\"array\",\"Outputs[]\":\"object\",\"Parameters\":\"object\",\"StackPolicyBody\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
29852
29877
|
["AWS::CloudFront::CloudFrontOriginAccessIdentity", "{\"CloudFrontOriginAccessIdentityConfig\":\"object\"}"],
|
|
@@ -29854,7 +29879,6 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
|
|
|
29854
29879
|
["AWS::CloudFront::OriginAccessControl", "{\"OriginAccessControlConfig\":\"object\"}"],
|
|
29855
29880
|
["AWS::CloudTrail::Trail", "{\"AdvancedEventSelectors\":\"array\",\"AdvancedEventSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors[].EndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].Equals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEquals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotStartsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].StartsWith\":\"array\",\"AggregationConfigurations\":\"array\",\"AggregationConfigurations[]\":\"object\",\"AggregationConfigurations[].Templates\":\"array\",\"EventSelectors\":\"array\",\"EventSelectors[]\":\"object\",\"EventSelectors[].DataResources\":\"array\",\"EventSelectors[].DataResources[]\":\"object\",\"EventSelectors[].DataResources[].Values\":\"array\",\"EventSelectors[].ExcludeManagementEventSources\":\"array\",\"InsightSelectors\":\"array\",\"InsightSelectors[]\":\"object\",\"InsightSelectors[].EventCategories\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
29856
29881
|
["AWS::CloudWatch::Alarm", "{\"AlarmActions\":\"array\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"EvaluationCriteria\":\"object\",\"EvaluationCriteria.PromQLCriteria\":\"object\",\"EvaluationWindow\":\"object\",\"EvaluationWindow.SlidingWindow\":\"object\",\"EvaluationWindow.WallClockWindow\":\"object\",\"InsufficientDataActions\":\"array\",\"Metrics\":\"array\",\"Metrics[]\":\"object\",\"Metrics[].MetricStat\":\"object\",\"Metrics[].MetricStat.Metric\":\"object\",\"Metrics[].MetricStat.Metric.Dimensions\":\"array\",\"Metrics[].MetricStat.Metric.Dimensions[]\":\"object\",\"OKActions\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"WarmUpConfiguration\":\"object\"}"],
|
|
29857
|
-
["AWS::CloudWatch::AnomalyDetector", "{\"Configuration\":\"object\",\"Configuration.ExcludedTimeRanges\":\"array\",\"Configuration.ExcludedTimeRanges[]\":\"object\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"MetricCharacteristics\":\"object\",\"MetricMathAnomalyDetector\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries\":\"array\",\"MetricMathAnomalyDetector.MetricDataQueries[]\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric.Dimensions\":\"array\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric.Dimensions[]\":\"object\",\"SingleMetricAnomalyDetector\":\"object\",\"SingleMetricAnomalyDetector.Dimensions\":\"array\",\"SingleMetricAnomalyDetector.Dimensions[]\":\"object\"}"],
|
|
29858
29882
|
["AWS::CodeCommit::Repository", "{\"Code\":\"object\",\"Code.S3\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"array\",\"Triggers[]\":\"object\",\"Triggers[].Branches\":\"array\",\"Triggers[].Events\":\"array\"}"],
|
|
29859
29883
|
["AWS::Cognito::UserPool", "{\"AccountRecoverySetting\":\"object\",\"AccountRecoverySetting.RecoveryMechanisms\":\"array\",\"AccountRecoverySetting.RecoveryMechanisms[]\":\"object\",\"AdminCreateUserConfig\":\"object\",\"AdminCreateUserConfig.InviteMessageTemplate\":\"object\",\"AliasAttributes\":\"array\",\"AutoVerifiedAttributes\":\"array\",\"DeviceConfiguration\":\"object\",\"EmailConfiguration\":\"object\",\"EnabledMfas\":\"array\",\"IssuerConfiguration\":\"object\",\"KeyConfiguration\":\"object\",\"LambdaConfig\":\"object\",\"LambdaConfig.CustomEmailSender\":\"object\",\"LambdaConfig.CustomSMSSender\":\"object\",\"LambdaConfig.InboundFederation\":\"object\",\"LambdaConfig.PreTokenGenerationConfig\":\"object\",\"Policies\":\"object\",\"Policies.PasswordPolicy\":\"object\",\"Policies.SignInPolicy\":\"object\",\"Policies.SignInPolicy.AllowedFirstAuthFactors\":\"array\",\"Schema\":\"array\",\"Schema[]\":\"object\",\"Schema[].NumberAttributeConstraints\":\"object\",\"Schema[].StringAttributeConstraints\":\"object\",\"SmsConfiguration\":\"object\",\"SmsConfiguration.EumsSms\":\"object\",\"UserAttributeUpdateSettings\":\"object\",\"UserAttributeUpdateSettings.AttributesRequireVerificationBeforeUpdate\":\"array\",\"UserPoolAddOns\":\"object\",\"UserPoolAddOns.AdvancedSecurityAdditionalFlows\":\"object\",\"UserPoolTags\":\"object\",\"UsernameAttributes\":\"array\",\"UsernameConfiguration\":\"object\",\"VerificationMessageTemplate\":\"object\"}"],
|
|
29860
29884
|
["AWS::DLM::LifecyclePolicy", "{\"CrossRegionCopyTargets\":\"array\",\"CrossRegionCopyTargets[]\":\"object\",\"Exclusions\":\"object\",\"Exclusions.ExcludeTags\":\"array\",\"Exclusions.ExcludeTags[]\":\"object\",\"Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails\":\"object\",\"PolicyDetails.Actions\":\"array\",\"PolicyDetails.Actions[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy\":\"array\",\"PolicyDetails.Actions[].CrossRegionCopy[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].EncryptionConfiguration\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].RetainRule\":\"object\",\"PolicyDetails.CrossRegionCopyTargets\":\"array\",\"PolicyDetails.CrossRegionCopyTargets[]\":\"object\",\"PolicyDetails.EventSource\":\"object\",\"PolicyDetails.EventSource.Parameters\":\"object\",\"PolicyDetails.EventSource.Parameters.SnapshotOwner\":\"array\",\"PolicyDetails.Exclusions\":\"object\",\"PolicyDetails.Exclusions.ExcludeTags\":\"array\",\"PolicyDetails.Exclusions.ExcludeTags[]\":\"object\",\"PolicyDetails.Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails.Parameters\":\"object\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags\":\"array\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags[]\":\"object\",\"PolicyDetails.ResourceLocations\":\"array\",\"PolicyDetails.ResourceTypes\":\"array\",\"PolicyDetails.Schedules\":\"array\",\"PolicyDetails.Schedules[]\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule.RetentionArchiveTier\":\"object\",\"PolicyDetails.Schedules[].CreateRule\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Scripts[]\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts[].Stages\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Times\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[]\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZoneIds\":\"array\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZones\":\"array\",\"PolicyDetails.Schedules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].ShareRules\":\"array\",\"PolicyDetails.Schedules[].ShareRules[]\":\"object\",\"PolicyDetails.Schedules[].ShareRules[].TargetAccounts\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd[]\":\"object\",\"PolicyDetails.Schedules[].VariableTags\":\"array\",\"PolicyDetails.Schedules[].VariableTags[]\":\"object\",\"PolicyDetails.TargetTags\":\"array\",\"PolicyDetails.TargetTags[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
|
|
@@ -30213,7 +30237,9 @@ var ProviderRegistry = class {
|
|
|
30213
30237
|
if (this.providers.get(resourceType)?.disableCcApiFallback === true) return "the type's SDK provider opts out of the Cloud Control fallback (disableCcApiFallback)";
|
|
30214
30238
|
}
|
|
30215
30239
|
buildUnroutableSilentDropMessage(resourceType, drops, reason) {
|
|
30216
|
-
|
|
30240
|
+
const details = drops.map((d) => safeMsg` - ${d.property}: ${d.rationale}`).join("\n");
|
|
30241
|
+
const overrideHint = drops.map((d) => safeMsg`${resourceType}:${d.property}`).join(",");
|
|
30242
|
+
return safeMsg`${resourceType} uses properties cdkd's SDK Provider does not handle, and ` + safeMsg`this type cannot fall back to Cloud Control API (${reason}):\n` + `${details}\nRemove the properties, or force the SDK provider path and accept the drop via --prefer-sdk-route ${overrideHint} (the provider may still reject the resource if the property is required).`;
|
|
30217
30243
|
}
|
|
30218
30244
|
getProvider(resourceType) {
|
|
30219
30245
|
return this.getProviderFor({ resourceType }).provider;
|
|
@@ -30287,7 +30313,7 @@ var ProviderRegistry = class {
|
|
|
30287
30313
|
const autoRouted = [...drops.map(({ property }) => property).filter((property) => !this.allowedUnsupportedProperties.has(`${resourceType}:${property}`)), ...unrecognizedRoute].sort((a, b) => a.localeCompare(b));
|
|
30288
30314
|
if (autoRouted.length > 0) {
|
|
30289
30315
|
const unroutable = this.ccRouteUnavailableReason(resourceType);
|
|
30290
|
-
if (unroutable !== void 0) throw new Error(`${logicalId}:
|
|
30316
|
+
if (unroutable !== void 0) throw new Error(safeMsg`${logicalId}: ` + this.buildUnroutableSilentDropMessage(resourceType, drops.filter((d) => autoRouted.includes(d.property)), unroutable));
|
|
30291
30317
|
const propList = autoRouted.join(", ");
|
|
30292
30318
|
const overrideHint = autoRouted.map((p) => `${resourceType}:${p}`).join(",");
|
|
30293
30319
|
const message = `${logicalId} (${resourceType}): routing via Cloud Control API (cdkd's SDK Provider does not yet wire ${propList} — CC API will forward the full property map.${unrecognizedRoute.length === 0 ? "" : ` ${unrecognizedRoute.join(", ")} ${unrecognizedRoute.length === 1 ? "is" : "are"} not in cdkd's CFn schema snapshot: Cloud Control applies a property AWS published since, and rejects a misspelled one as CloudFormation does.`} Override via --prefer-sdk-route ${overrideHint}.)`;
|
|
@@ -32437,9 +32463,9 @@ function handleOutputResolutionFailure(error, outputKey, outputs, secrets, inher
|
|
|
32437
32463
|
const detail = maskSecretsInText(error instanceof Error ? error.message || error.name : String(error), union);
|
|
32438
32464
|
if (this.options.strictGetAtt) {
|
|
32439
32465
|
const cause = typeof error === "string" ? maskSecretsInText(error, union) : maskSecretsInError(error, union);
|
|
32440
|
-
throw new Error(`Failed to resolve output ${outputKey}
|
|
32466
|
+
throw new Error(safeMsg`Failed to resolve output ${outputKey} ` + `(--strict-getatt promotes output resolution failures to deploy errors; ` + safeMsg`drop the flag to skip the output instead): ${asIsMessage(detail)}`, cause instanceof Error || typeof cause === "string" ? { cause } : {});
|
|
32441
32467
|
}
|
|
32442
|
-
this.logger.warn(`Failed to resolve output ${outputKey}: ${detail}`);
|
|
32468
|
+
this.logger.warn(safeMsg`Failed to resolve output ${outputKey}: ${asIsMessage(detail)}`);
|
|
32443
32469
|
outputs[outputKey] = void 0;
|
|
32444
32470
|
}
|
|
32445
32471
|
async function resolveOutputs(template, resources, stackName, digestSource, parameterValues, conditions) {
|
|
@@ -32460,7 +32486,7 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
|
|
|
32460
32486
|
const refuseMaskedOutputReads = (outputKey, ownReads) => {
|
|
32461
32487
|
const added = ownReads.filter((read) => read.kind === "ref-state-key");
|
|
32462
32488
|
if (added.length === 0) return;
|
|
32463
|
-
throw markNonRetryable(/* @__PURE__ */ new Error(`Cannot resolve ${added.map((read) => read.display).join(", ")} for output ${outputKey}: cdkd's recorded state holds only the redaction mask there, so this output would publish a value cdkd cannot confirm (for most such types the resource's raw physical id) instead of the value CloudFormation's Ref returns — a possibly wrong value that a consuming stack's Fn::ImportValue would accept and send to AWS. The output is not published. ${DeployEngine.maskedRecordRemedyFor(added, context.resources)}`));
|
|
32489
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(safeMsg`Cannot resolve ${added.map((read) => read.display).join(", ")} for output ${outputKey}: cdkd's recorded state ` + `holds only the redaction mask there, so this output would publish a value cdkd cannot confirm (for most such types the resource's raw physical id) instead of the value CloudFormation's Ref returns — a possibly wrong value that a consuming stack's Fn::ImportValue would accept and send to AWS. The output is not published. ${DeployEngine.maskedRecordRemedyFor(added, context.resources)}`));
|
|
32464
32490
|
};
|
|
32465
32491
|
const outputsPassSecrets = context.recordedSecretValues ?? EMPTY_SECRETS;
|
|
32466
32492
|
const outputsPassInherited = context.inheritedSecrets ?? EMPTY_SECRETS;
|
|
@@ -32470,7 +32496,7 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
|
|
|
32470
32496
|
try {
|
|
32471
32497
|
for (const [outputKey, output] of Object.entries(template.Outputs)) {
|
|
32472
32498
|
if (isOutputSuppressedByCondition(output, conditions)) {
|
|
32473
|
-
this.logger.debug(`Skipping output ${outputKey} — condition ${output.Condition} is false`);
|
|
32499
|
+
this.logger.debug(safeMsg`Skipping output ${outputKey} — condition ${output.Condition} is false`);
|
|
32474
32500
|
continue;
|
|
32475
32501
|
}
|
|
32476
32502
|
const ownReads = [];
|
|
@@ -36064,11 +36090,11 @@ async function adoptRollbackOrphans(currentState, effectiveTemplate) {
|
|
|
36064
36090
|
for (const notice of plan.notices) this.logger.info(maskSecretsInText(notice, named));
|
|
36065
36091
|
const adoptedFrom = /* @__PURE__ */ new Map();
|
|
36066
36092
|
adoptedOrphanRecords.set(this, adoptedFrom);
|
|
36067
|
-
if (plan.refusals.length > 0) throw new Error(`Deploy refused — cdkd left ${plan.refusals.length} resource(s) in AWS that it cannot safely re-adopt
|
|
36093
|
+
if (plan.refusals.length > 0) throw new Error(safeMsg`Deploy refused — cdkd left ${plan.refusals.length} resource(s) in AWS that it cannot ` + "safely re-adopt:" + plan.refusals.map((r) => safeMsg`\n ${maskSecretsInText(r, named)}`).join(""));
|
|
36068
36094
|
for (const [logicalId, record] of Object.entries(plan.adopted)) {
|
|
36069
36095
|
adoptedFrom.set(logicalId, records.findLast((r) => r.logicalId === logicalId)?.state);
|
|
36070
36096
|
currentState.resources[logicalId] = record;
|
|
36071
|
-
this.logger.info(`Adopting ${displayIdent(logicalId)} (${displayIdent(record.resourceType)}) left in AWS by an earlier rollback as ${displaySafe(maskSecretsInText(record.physicalId, named))}`);
|
|
36097
|
+
this.logger.info(safeMsg`Adopting ${displayIdent(logicalId)} (${displayIdent(record.resourceType)}) left in AWS ` + safeMsg`by an earlier rollback as ${displaySafe(maskSecretsInText(record.physicalId, named))}`);
|
|
36072
36098
|
}
|
|
36073
36099
|
if (records.length > 0) currentState.orphans = plan.remaining;
|
|
36074
36100
|
return plan;
|
|
@@ -36245,7 +36271,7 @@ async function deleteRollbackJournalBestEffort(stackName, supersededLogicalIds =
|
|
|
36245
36271
|
try {
|
|
36246
36272
|
deleted = await this.stateBackend.deleteRollbackJournal(stackName, this.stackRegion);
|
|
36247
36273
|
} catch (err) {
|
|
36248
|
-
this.logger.debug(safeMsg`Failed to delete rollback journal for ${stackName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
36274
|
+
this.logger.debug(safeMsg`Failed to delete rollback journal for ${displayStackName(stackName)}: ${err instanceof Error ? err.message : String(err)}`);
|
|
36249
36275
|
deleted = false;
|
|
36250
36276
|
}
|
|
36251
36277
|
if (deleted !== false) return true;
|
|
@@ -36253,7 +36279,7 @@ async function deleteRollbackJournalBestEffort(stackName, supersededLogicalIds =
|
|
|
36253
36279
|
try {
|
|
36254
36280
|
await this.stateBackend.markRollbackJournalSuperseded(stackName, this.stackRegion, supersededLogicalIds);
|
|
36255
36281
|
} catch (markErr) {
|
|
36256
|
-
this.logger.debug(safeMsg`Failed to record superseded logical ids on the rollback journal for ${stackName}: ${markErr instanceof Error ? markErr.message : String(markErr)}`);
|
|
36282
|
+
this.logger.debug(safeMsg`Failed to record superseded logical ids on the rollback journal for ${displayStackName(stackName)}: ${markErr instanceof Error ? markErr.message : String(markErr)}`);
|
|
36257
36283
|
}
|
|
36258
36284
|
return false;
|
|
36259
36285
|
}
|
|
@@ -36262,7 +36288,7 @@ async function settleJournalAfterCleanRollback(stackName, failedOperations, init
|
|
|
36262
36288
|
try {
|
|
36263
36289
|
await this.stateBackend.popRollbackJournalSegment(stackName, this.stackRegion);
|
|
36264
36290
|
} catch (err) {
|
|
36265
|
-
this.logger.debug(`Failed to pop the rollback journal segment after the clean rollback: ${err instanceof Error ? err.message : String(err)}`);
|
|
36291
|
+
this.logger.debug(safeMsg`Failed to pop the rollback journal segment after the clean rollback: ${asIsMessage(err instanceof Error ? err.message : String(err))}`);
|
|
36266
36292
|
return false;
|
|
36267
36293
|
}
|
|
36268
36294
|
return true;
|
|
@@ -36274,7 +36300,7 @@ async function settleJournalAfterCleanRollback(stackName, failedOperations, init
|
|
|
36274
36300
|
return false;
|
|
36275
36301
|
}
|
|
36276
36302
|
if (!await this.writeRollbackJournalSegment(stackName, [], failedOperations, "auto-rollback-clean", initialDeploy)) return true;
|
|
36277
|
-
this.logger.info(
|
|
36303
|
+
this.logger.info("The automatic rollback restored the pre-deploy state. The failed resource's pre-failure record was kept — if it was left partially applied, revert it." + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
|
|
36278
36304
|
value: stackName,
|
|
36279
36305
|
hole: "stack"
|
|
36280
36306
|
}, { literal: "--revert-failed" }]).command}`);
|
|
@@ -36342,10 +36368,10 @@ async function writeRollbackJournalSegment(stackName, completedOperations, faile
|
|
|
36342
36368
|
...nestedPending?.previousCrossStackReads && { previousCrossStackReads: nestedPending.previousCrossStackReads }
|
|
36343
36369
|
};
|
|
36344
36370
|
await this.stateBackend.appendRollbackJournalSegment(stackName, this.stackRegion, segment);
|
|
36345
|
-
this.logger.debug(`Rollback journal segment written (${reason})`);
|
|
36371
|
+
this.logger.debug(safeMsg`Rollback journal segment written (${reason})`);
|
|
36346
36372
|
return true;
|
|
36347
36373
|
} catch (journalError) {
|
|
36348
|
-
this.logger.warn(`Failed to write rollback journal: ${journalError instanceof Error ? journalError.message : String(journalError)}. 'cdkd rollback' will NOT be able to revert this deploy — use 'cdkd deploy' to resume or 'cdkd destroy' to clean up.`);
|
|
36374
|
+
this.logger.warn(safeMsg`Failed to write rollback journal: ${asIsMessage(journalError instanceof Error ? journalError.message : String(journalError))}. ` + `'cdkd rollback' will NOT be able to revert this deploy — use 'cdkd deploy' to resume or 'cdkd destroy' to clean up.`);
|
|
36349
36375
|
return false;
|
|
36350
36376
|
}
|
|
36351
36377
|
}
|
|
@@ -36660,7 +36686,7 @@ function kickOffObservedCapture(provider, logicalId, physicalId, resourceType, r
|
|
|
36660
36686
|
this.printingSecretsFor(logicalId),
|
|
36661
36687
|
this.fingerprintNoEchoValues
|
|
36662
36688
|
]);
|
|
36663
|
-
this.logger.debug(
|
|
36689
|
+
this.logger.debug(safeMsg`observedProperties capture for ${mask(logicalId)} (${mask(resourceType)}) failed: ${asIsMessage(mask(err instanceof Error ? err.message : String(err)))} — drift will fall back to template properties for this resource until the next successful deploy.`);
|
|
36664
36690
|
});
|
|
36665
36691
|
const promise = secrets === void 0 ? read() : withCurrentResourceSecrets(secrets, read);
|
|
36666
36692
|
this.observedCaptureTasks.set(logicalId, promise);
|
|
@@ -36754,8 +36780,8 @@ function stampReasonlessParameterRefusals(stateResources, template) {
|
|
|
36754
36780
|
};
|
|
36755
36781
|
stamped++;
|
|
36756
36782
|
}
|
|
36757
|
-
if (namesParameter?.failedClosed !== void 0) this.logger.debug(`The template's parameter dependence could not be judged (${namesParameter.failedClosed}): every observed-baseline refusal recorded without a reason is treated as an unverifiable-parameter refusal (${stamped} stamped).`);
|
|
36758
|
-
if (stamped > 0) this.logger.debug(`${stamped} resource(s) carry an observed-baseline refusal recorded without a reason by an older cdkd, and their template definition reads a template parameter: treated as an unverifiable-parameter refusal (kept until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter).`);
|
|
36783
|
+
if (namesParameter?.failedClosed !== void 0) this.logger.debug(safeMsg`The template's parameter dependence could not be judged (${namesParameter.failedClosed}): every observed-baseline refusal recorded without a reason is treated as an unverifiable-parameter refusal (${stamped} stamped).`);
|
|
36784
|
+
if (stamped > 0) this.logger.debug(safeMsg`${stamped} resource(s) carry an observed-baseline refusal recorded without a reason by an older cdkd, and their template definition reads a template parameter: treated as an unverifiable-parameter refusal (kept until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter).`);
|
|
36759
36785
|
}
|
|
36760
36786
|
function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
|
|
36761
36787
|
if (this.options.captureObservedState !== true) return;
|
|
@@ -36782,7 +36808,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
|
|
|
36782
36808
|
resource
|
|
36783
36809
|
});
|
|
36784
36810
|
}
|
|
36785
|
-
if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
|
|
36811
|
+
if (refused > 0) this.logger.debug(safeMsg`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
|
|
36786
36812
|
if (candidates.length === 0 && masked.length === 0) return;
|
|
36787
36813
|
const allSiblings = {};
|
|
36788
36814
|
for (const [lid, res] of Object.entries(stateResources)) allSiblings[lid] = {
|
|
@@ -36810,7 +36836,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
|
|
|
36810
36836
|
} : void 0);
|
|
36811
36837
|
toRefresh++;
|
|
36812
36838
|
}
|
|
36813
|
-
if (toRefresh > 0) this.logger.warn(`cdkd state schema upgrade detected — refreshing observed-properties baseline for ${toRefresh} resource(s) (one-time, runs in parallel with deploy)`);
|
|
36839
|
+
if (toRefresh > 0) this.logger.warn(safeMsg`cdkd state schema upgrade detected — refreshing observed-properties baseline for ${toRefresh} resource(s) (one-time, runs in parallel with deploy)`);
|
|
36814
36840
|
let producerRegions = [];
|
|
36815
36841
|
if (masked.length > 0) try {
|
|
36816
36842
|
producerRegions = producerRegionsFromState(crossStackReads);
|
|
@@ -36974,9 +37000,9 @@ function refuseRedactedAttributeReads(logicalId, resourceType, context) {
|
|
|
36974
37000
|
if (reads === void 0 || reads.length === 0) return;
|
|
36975
37001
|
if (reads.every((read) => read.kind === "attribute" && read.declaredNoEcho === true)) {
|
|
36976
37002
|
const producers = [...new Set(reads.map((read) => read.logicalId).filter((id) => !!id))];
|
|
36977
|
-
throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}:
|
|
37003
|
+
throw new ProvisioningError(safeMsg`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: ` + safeMsg`${producers.map((id) => displayIdent(id)).join(", ")} declared ${reads.length === 1 ? "that attribute" : "those attributes"} NoEcho, ` + safeMsg`so cdkd's recorded state holds only the redaction mask for ${reads.length === 1 ? "it" : "them"}, ` + `and cdkd does not re-run a producer to recover a value. Remedy: deploy a change to the ` + safeMsg`producer in the SAME run as ${logicalId} (for a custom resource, change one of its ` + "properties, e.g. a nonce / version property, so its handler runs again and supplies the value), or stop declaring the value NoEcho.", resourceType, logicalId);
|
|
36978
37004
|
}
|
|
36979
|
-
throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource is recorded through the Cloud Control fallback (by a deploy or by 'cdkd import'), which keeps in the clear only the Fn::GetAtt attributes it can vouch for and masks the rest. If the name above is not an Fn::GetAtt attribute CloudFormation accepts for that resource type, no record will ever hold it: stop reading it. If it is one, 'cdkd import' masked it because it could not vouch for the value, or could not read the schema and warned about it when it happened (if that warning named a missing cloudformation:DescribeType permission, grant it first); a deploy that creates or updates the resource records it, unless its value came from a secret. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
|
|
37005
|
+
throw new ProvisioningError(safeMsg`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the ` + `redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource is recorded through the Cloud Control fallback (by a deploy or by 'cdkd import'), which keeps in the clear only the Fn::GetAtt attributes it can vouch for and masks the rest. If the name above is not an Fn::GetAtt attribute CloudFormation accepts for that resource type, no record will ever hold it: stop reading it. If it is one, 'cdkd import' masked it because it could not vouch for the value, or could not read the schema and warned about it when it happened (if that warning named a missing cloudformation:DescribeType permission, grant it first); a deploy that creates or updates the resource records it, unless its value came from a secret. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
|
|
36980
37006
|
}
|
|
36981
37007
|
function allRecordedSecrets() {
|
|
36982
37008
|
const all = /* @__PURE__ */ new Map();
|
|
@@ -37168,7 +37194,8 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
|
|
|
37168
37194
|
maskSecrets: createUnionSecretMasker([secrets, this.secretNameBagFor(logicalId)])
|
|
37169
37195
|
}));
|
|
37170
37196
|
} catch (deleteError) {
|
|
37171
|
-
|
|
37197
|
+
const shownSecrets = unionOfSecretBags([secrets, this.printingSecretsFor(logicalId)]);
|
|
37198
|
+
throw new Error(safeMsg`Failed to delete old resource ${maskSecretsInText(logicalId, shownSecrets)} ` + safeMsg`(${maskSecretsInText(currentResource.physicalId, shownSecrets)}) ` + `during the --replace delete-first fallback: ` + safeMsg`${asIsMessage(maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), shownSecrets))}`, { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, secrets) : void 0 });
|
|
37172
37199
|
}
|
|
37173
37200
|
reportDeleteGuards(deleteResult, {
|
|
37174
37201
|
physicalId: currentResource.physicalId,
|
|
@@ -37177,9 +37204,9 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
|
|
|
37177
37204
|
});
|
|
37178
37205
|
const replaceSkipReason = deleteSkipReason(deleteResult);
|
|
37179
37206
|
if (replaceSkipReason !== void 0) throw new Error(deleteSkippedMessage(logicalId, currentResource.physicalId, replaceSkipReason, "during the --replace delete-first fallback"));
|
|
37180
|
-
this.logger.info(` ${green("✓")} Old resource deleted`);
|
|
37207
|
+
this.logger.info(safeMsg` ${green("✓")} Old resource deleted`);
|
|
37181
37208
|
this.oldDeletedBeforeCreate.add(logicalId);
|
|
37182
|
-
this.logger.info(` Re-creating ${logicalId}...`);
|
|
37209
|
+
this.logger.info(safeMsg` Re-creating ${logicalId}...`);
|
|
37183
37210
|
try {
|
|
37184
37211
|
return await withRetry(() => this.withRetry(() => withCurrentResourceSecrets(secrets, () => replaceProvider.create(logicalId, resourceType, replaceProps, createContext)), logicalId, void 0, void 0, replaceProvider), logicalId, {
|
|
37185
37212
|
maxRetries: 8,
|
|
@@ -37191,7 +37218,8 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
|
|
|
37191
37218
|
isRetryable: isRecreateRetryableError
|
|
37192
37219
|
});
|
|
37193
37220
|
} catch (recreateError) {
|
|
37194
|
-
|
|
37221
|
+
const shownSecrets = unionOfSecretBags([secrets, this.printingSecretsFor(logicalId)]);
|
|
37222
|
+
throw new Error(safeMsg`Failed to re-create ${maskSecretsInText(logicalId, shownSecrets)} after the ` + safeMsg`--replace delete-first fallback already deleted the old resource (${maskSecretsInText(currentResource.physicalId, shownSecrets)}). ` + safeMsg`Re-run the deploy to create it fresh. Cause: ${asIsMessage(maskSecretsInText(recreateError instanceof Error ? recreateError.message : String(recreateError), shownSecrets))}`, { cause: recreateError instanceof Error ? maskSecretsInError(recreateError, secrets) : void 0 });
|
|
37195
37223
|
}
|
|
37196
37224
|
}
|
|
37197
37225
|
function typeChangeNameQuestion(resourceType, input) {
|
|
@@ -37283,7 +37311,7 @@ async function createFirstThenDeleteOld(input) {
|
|
|
37283
37311
|
await this.deleteReplacedAfterCreate(logicalId, input.oldResourceType, currentResource, input.deleteProvider, input.deleteProperties, finalSnapshotIdentifier, input.deletePolicy, secrets, input.deleteProvisionedBy, input.noEchoDeleteValues);
|
|
37284
37312
|
return createResult;
|
|
37285
37313
|
}
|
|
37286
|
-
async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues) {
|
|
37314
|
+
async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues, isRetry = false) {
|
|
37287
37315
|
let deleteResult = void 0;
|
|
37288
37316
|
let deleteFailed = false;
|
|
37289
37317
|
const inlinePolicyClaimed = isStandaloneInlinePolicyType(oldResourceType) ? this.inlinePolicyClaimedFor(oldResourceType, logicalId, this.deployStateResources) : void 0;
|
|
@@ -37302,6 +37330,18 @@ async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentReso
|
|
|
37302
37330
|
} catch (deleteError) {
|
|
37303
37331
|
const deleteMsg = maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), secrets);
|
|
37304
37332
|
deleteFailed = true;
|
|
37333
|
+
const deferred = this.deferredReplacedDeletes;
|
|
37334
|
+
if (!isRetry && deferred !== void 0) {
|
|
37335
|
+
this.logger.info(safeMsg` Could not delete old ${logicalId} (${currentResource.physicalId}) yet: ${deleteMsg}. Retrying after the rest of the deploy.`);
|
|
37336
|
+
deferred.set(logicalId, {
|
|
37337
|
+
physicalId: currentResource.physicalId,
|
|
37338
|
+
resourceType: oldResourceType,
|
|
37339
|
+
provisionedBy: deleteProvisionedBy,
|
|
37340
|
+
failureMessage: deleteMsg,
|
|
37341
|
+
retry: () => this.deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues, true)
|
|
37342
|
+
});
|
|
37343
|
+
return;
|
|
37344
|
+
}
|
|
37305
37345
|
this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${currentResource.physicalId}): ${deleteMsg}`);
|
|
37306
37346
|
}
|
|
37307
37347
|
reportDeleteGuards(deleteResult, {
|
|
@@ -37312,8 +37352,67 @@ async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentReso
|
|
|
37312
37352
|
const skipReason = deleteSkipReason(deleteResult);
|
|
37313
37353
|
if (skipReason !== void 0) {
|
|
37314
37354
|
this.replacedDeleteSkips.set(logicalId, `the replaced ${oldResourceType} (${currentResource.physicalId}) was not deleted (${skipReason}) and is no longer tracked by cdkd`);
|
|
37315
|
-
this.logger.warn(` ⚠ ${deleteSkippedMessage(logicalId, currentResource.physicalId, skipReason, "while cleaning up the replaced resource", { commandFreeLine: true })}. Delete it manually — it is no longer tracked in state.`);
|
|
37316
|
-
} else if (!deleteFailed) this.logger.info(` ${green("✓")} Old resource deleted`);
|
|
37355
|
+
this.logger.warn(safeMsg` ⚠ ${deleteSkippedMessage(logicalId, currentResource.physicalId, skipReason, "while cleaning up the replaced resource", { commandFreeLine: true })}. Delete it manually — it is no longer tracked in state.`);
|
|
37356
|
+
} else if (!deleteFailed) this.logger.info(isRetry ? safeMsg` ${green("✓")} Old ${logicalId} (${currentResource.physicalId}) deleted` : safeMsg` ${green("✓")} Old resource deleted`);
|
|
37357
|
+
}
|
|
37358
|
+
async function retryDeferredReplacedDeletes(stackName, counts) {
|
|
37359
|
+
const deferred = this.deferredReplacedDeletes;
|
|
37360
|
+
this.deferredReplacedDeletes = void 0;
|
|
37361
|
+
if (deferred === void 0 || deferred.size === 0) return;
|
|
37362
|
+
this.logger.info(safeMsg`Retrying the delete of ${deferred.size} replaced resource(s)`);
|
|
37363
|
+
const retryOne = async (logicalId, entry) => {
|
|
37364
|
+
const guards = [];
|
|
37365
|
+
try {
|
|
37366
|
+
await withPrintingSecrets(this.secretNameBagFor(logicalId), () => withStackRecords(this.stackRecordsView, () => collectDeleteGuards(guards, async () => {
|
|
37367
|
+
this.logger.info(safeMsg` Deleting old ${logicalId} (${entry.physicalId})...`);
|
|
37368
|
+
try {
|
|
37369
|
+
await entry.retry();
|
|
37370
|
+
} catch {
|
|
37371
|
+
this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${entry.physicalId}): the retry failed unexpectedly`);
|
|
37372
|
+
}
|
|
37373
|
+
})));
|
|
37374
|
+
} finally {
|
|
37375
|
+
for (const guard of guards) this.recordEvent({
|
|
37376
|
+
eventType: "RESOURCE_GUARD_INDETERMINATE",
|
|
37377
|
+
stackName,
|
|
37378
|
+
operation: "DELETE",
|
|
37379
|
+
logicalId,
|
|
37380
|
+
resourceType: guard.resourceType,
|
|
37381
|
+
...guard.provisionedBy && { provisionedBy: guard.provisionedBy },
|
|
37382
|
+
...guard.physicalId && { physicalId: maskSecretsInText(guard.physicalId, this.perResourceSecrets.get(logicalId) ?? EMPTY_SECRETS) },
|
|
37383
|
+
guard: guard.guard,
|
|
37384
|
+
reason: guard.reason
|
|
37385
|
+
});
|
|
37386
|
+
}
|
|
37387
|
+
const skip = this.replacedDeleteSkips.get(logicalId);
|
|
37388
|
+
if (skip === void 0) return;
|
|
37389
|
+
this.replacedDeleteSkips.delete(logicalId);
|
|
37390
|
+
if (entry.rowPartial !== true) {
|
|
37391
|
+
counts.updated = Math.max(0, counts.updated - 1);
|
|
37392
|
+
counts.updatePartial++;
|
|
37393
|
+
}
|
|
37394
|
+
this.recordEvent({
|
|
37395
|
+
eventType: "RESOURCE_SKIPPED",
|
|
37396
|
+
stackName,
|
|
37397
|
+
operation: "UPDATE",
|
|
37398
|
+
logicalId,
|
|
37399
|
+
resourceType: entry.resourceType,
|
|
37400
|
+
...entry.provisionedBy && { provisionedBy: entry.provisionedBy },
|
|
37401
|
+
physicalId: entry.physicalId,
|
|
37402
|
+
reason: skip
|
|
37403
|
+
});
|
|
37404
|
+
};
|
|
37405
|
+
const queue = [...deferred];
|
|
37406
|
+
const workers = Math.max(1, Math.min(this.options.concurrency ?? 1, queue.length));
|
|
37407
|
+
await Promise.all(Array.from({ length: workers }, async () => {
|
|
37408
|
+
for (let next = queue.shift(); next !== void 0; next = queue.shift()) await retryOne(...next);
|
|
37409
|
+
}));
|
|
37410
|
+
}
|
|
37411
|
+
function warnUnretriedReplacedDeletes(why) {
|
|
37412
|
+
const deferred = this.deferredReplacedDeletes;
|
|
37413
|
+
this.deferredReplacedDeletes = void 0;
|
|
37414
|
+
const note = why === "failed" ? "not retried: the deploy failed first" : "not retried: the deploy was interrupted";
|
|
37415
|
+
for (const [logicalId, entry] of deferred ?? []) withPrintingSecrets(this.secretNameBagFor(logicalId), () => this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${entry.physicalId}): ${entry.failureMessage} (${note})`));
|
|
37317
37416
|
}
|
|
37318
37417
|
|
|
37319
37418
|
//#endregion
|
|
@@ -37417,7 +37516,7 @@ async function readStaleAttributes(logicalId, resource, stackName) {
|
|
|
37417
37516
|
resourceType: resource.resourceType,
|
|
37418
37517
|
attributes
|
|
37419
37518
|
});
|
|
37420
|
-
this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
|
|
37519
|
+
this.logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
|
|
37421
37520
|
return outcome;
|
|
37422
37521
|
}
|
|
37423
37522
|
function withHealedAttributes(logicalId, record) {
|
|
@@ -37444,8 +37543,8 @@ function auditResolvedAssetReferences(logicalId, resourceType, resolvedProps) {
|
|
|
37444
37543
|
if (!redirect) return;
|
|
37445
37544
|
const findings = findUnrewrittenAssetReferences(resolvedProps, redirect);
|
|
37446
37545
|
if (findings.length === 0) return;
|
|
37447
|
-
const detail = findings.map((f) => ` - ${f.path}: still references '${f.source}'`).join("\n");
|
|
37448
|
-
throw new ProvisioningError(`Unrewritten asset reference on '${logicalId}' (${resourceType}): this region uses cdkd-owned asset storage, but the following resolved properties still point at the CDK bootstrap storage that 'cdk gc' may garbage-collect:\n${detail}\nThis is a template shape cdkd's asset-reference rewrite did not cover — deploying it would split-brain the stack (assets in cdkd storage, properties reading the CDK bucket). Please report this at https://github.com/go-to-k/cdkd/issues with the property shape. Workaround: deploy with --use-cdk-bootstrap-assets to pin the legacy destinations for this app.`, resourceType, logicalId);
|
|
37546
|
+
const detail = findings.map((f) => safeMsg` - ${f.path}: still references '${f.source}'`).join("\n");
|
|
37547
|
+
throw new ProvisioningError(safeMsg`Unrewritten asset reference on '${logicalId}' (${resourceType}): this region uses ` + `cdkd-owned asset storage, but the following resolved properties still point at the CDK bootstrap storage that 'cdk gc' may garbage-collect:\n${detail}\nThis is a template shape cdkd's asset-reference rewrite did not cover — deploying it would split-brain the stack (assets in cdkd storage, properties reading the CDK bucket). Please report this at https://github.com/go-to-k/cdkd/issues with the property shape. Workaround: deploy with --use-cdk-bootstrap-assets to pin the legacy destinations for this app.`, resourceType, logicalId);
|
|
37449
37548
|
}
|
|
37450
37549
|
function extractAllDependencies(template, logicalId) {
|
|
37451
37550
|
const resource = template?.Resources?.[logicalId];
|
|
@@ -37735,7 +37834,7 @@ async function provisionCreate(logicalId, change, stateResources, stackName, tem
|
|
|
37735
37834
|
if (progress) progress.current++;
|
|
37736
37835
|
const createPrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
|
|
37737
37836
|
renderer.removeTask(logicalId);
|
|
37738
|
-
this.logger.info(`${createPrefix}${formatResourceLine("created", logicalId, resourceType)}`);
|
|
37837
|
+
this.logger.info(safeMsg`${createPrefix}${formatResourceLine("created", logicalId, resourceType)}`);
|
|
37739
37838
|
}
|
|
37740
37839
|
async function refuseUnlicensedGeneratedName(input) {
|
|
37741
37840
|
const { logicalId, resourceType } = input;
|
|
@@ -43082,20 +43181,20 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43082
43181
|
if (statefulReason && this.options.forceStatefulRecreation !== true) {
|
|
43083
43182
|
const immutableProps = change.propertyChanges?.filter((pc) => pc.requiresReplacement).map((pc) => pc.path).join(", ") || "Type";
|
|
43084
43183
|
const protection = recordedProtectionEvidence(oldResourceType, currentProps, currentResource.observedProperties, this.stackRegion);
|
|
43085
|
-
throw markNonRetryable(new CdkdError(`${logicalId} (${oldResourceType}) requires replacement (immutable property changed: ${immutableProps}${typeChanged ? `, to ${resourceType}` : ""}) but it is a stateful resource —
|
|
43184
|
+
throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${oldResourceType}) requires replacement (immutable property changed: ${immutableProps}${typeChanged ? `, to ${resourceType}` : ""}) but it is a stateful resource — ` + safeMsg`${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--force-stateful-recreation")} Or change ` + `the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change."), "STATEFUL_REPLACE_BLOCKED"));
|
|
43086
43185
|
}
|
|
43087
43186
|
}
|
|
43088
43187
|
if (recreateViaCcApi) {
|
|
43089
43188
|
const noCcRoute = this.providerRegistry.ccRouteUnavailableReason(resourceType);
|
|
43090
|
-
if (noCcRoute !== void 0) throw markNonRetryable(new CdkdError(`--recreate-via-cc-api cannot recreate ${logicalId} (${resourceType}): Cloud Control API cannot create this type (${noCcRoute}). Nothing was deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
|
|
43189
|
+
if (noCcRoute !== void 0) throw markNonRetryable(new CdkdError(safeMsg`--recreate-via-cc-api cannot recreate ${logicalId} (${resourceType}): Cloud ` + safeMsg`Control API cannot create this type (${noCcRoute}). Nothing was deleted. ` + safeMsg`Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
|
|
43091
43190
|
const ccBroken = ccBrokenReason(resourceType);
|
|
43092
|
-
if (ccBroken !== void 0) throw markNonRetryable(new CdkdError(`--recreate-via-cc-api cannot move ${logicalId} (${resourceType}) to Cloud Control: ${ccBroken}, so cdkd keeps it on its SDK provider. Nothing was deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
|
|
43191
|
+
if (ccBroken !== void 0) throw markNonRetryable(new CdkdError(safeMsg`--recreate-via-cc-api cannot move ${logicalId} (${resourceType}) to Cloud ` + safeMsg`Control: ${ccBroken}, so cdkd keeps it on its SDK provider. Nothing was ` + safeMsg`deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
|
|
43093
43192
|
}
|
|
43094
43193
|
let replacementReason;
|
|
43095
43194
|
if (recreateViaCcApi) replacementReason = "--recreate-via-cc-api flag (mid-life SDK→CC migration)";
|
|
43096
43195
|
else if (recreateViaSdkProvider) replacementReason = "--recreate-via-sdk-provider flag (mid-life CC→SDK migration)";
|
|
43097
43196
|
else replacementReason = `immutable properties changed: ${change.propertyChanges?.filter((pc) => pc.requiresReplacement).map((pc) => pc.path).join(", ")}`;
|
|
43098
|
-
this.logger.info(`Replacing ${logicalId} (${typeChanged ? `${oldResourceType} -> ${resourceType}` : resourceType}) - ${replacementReason}`);
|
|
43197
|
+
this.logger.info(safeMsg`Replacing ${logicalId} (${typeChanged ? `${oldResourceType} -> ${resourceType}` : resourceType}) - ${replacementReason}`);
|
|
43099
43198
|
const recreateDirectionHint = recreateViaCcApi ? "cc-api" : recreateViaSdkProvider ? "sdk" : void 0;
|
|
43100
43199
|
const replaceDecision = this.providerRegistry.getProviderFor({
|
|
43101
43200
|
resourceType,
|
|
@@ -43164,9 +43263,9 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43164
43263
|
if (updateReplacePolicy === "Retain") {
|
|
43165
43264
|
this.retainedOldOnReplacement.add(logicalId);
|
|
43166
43265
|
await noteRetainedResource(oldResourceType, logicalId);
|
|
43167
|
-
this.logger.warn(` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — ${recreateFlagName} will leak the old physical resource (${currentResource.physicalId}). The new resource shares the same name where applicable; if the type has user-supplied names (e.g. functionName, bucketName), the create will deterministically collide with the retained orphan
|
|
43266
|
+
this.logger.warn(safeMsg` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — ${recreateFlagName} will ` + safeMsg`leak the old physical resource (${currentResource.physicalId}). The new ` + "resource shares the same name where applicable; if the type has user-supplied names (e.g. functionName, bucketName), the create will deterministically collide with the retained orphan.");
|
|
43168
43267
|
} else {
|
|
43169
|
-
this.logger.info(` Destroying old ${logicalId} (${currentResource.physicalId}) before recreate...`);
|
|
43268
|
+
this.logger.info(safeMsg` Destroying old ${logicalId} (${currentResource.physicalId}) before recreate...`);
|
|
43170
43269
|
const recreateFinalSnapshotId = await this.prepareFinalSnapshotForDelete(logicalId, oldResourceType, currentResource, updateReplacePolicy);
|
|
43171
43270
|
let recreateDeleteResult;
|
|
43172
43271
|
try {
|
|
@@ -43181,7 +43280,8 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43181
43280
|
maskSecrets: createUnionSecretMasker([updateSecrets, this.secretNameBagFor(logicalId)])
|
|
43182
43281
|
}));
|
|
43183
43282
|
} catch (deleteError) {
|
|
43184
|
-
|
|
43283
|
+
const shownSecrets = unionOfSecretBags([updateSecrets, this.printingSecretsFor(logicalId)]);
|
|
43284
|
+
throw new Error(safeMsg`Failed to destroy old resource ${maskSecretsInText(logicalId, shownSecrets)} ` + safeMsg`(${maskSecretsInText(currentResource.physicalId, shownSecrets)}) during ${recreateFlagName}: ` + safeMsg`${asIsMessage(maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), shownSecrets))}`, { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, updateSecrets) : void 0 });
|
|
43185
43285
|
}
|
|
43186
43286
|
reportDeleteGuards(recreateDeleteResult, {
|
|
43187
43287
|
physicalId: currentResource.physicalId,
|
|
@@ -43190,10 +43290,10 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43190
43290
|
});
|
|
43191
43291
|
const recreateSkipReason = deleteSkipReason(recreateDeleteResult);
|
|
43192
43292
|
if (recreateSkipReason !== void 0) throw new Error(deleteSkippedMessage(logicalId, currentResource.physicalId, recreateSkipReason, `during ${recreateFlagName}`));
|
|
43193
|
-
this.logger.info(` ${green("✓")} Old resource deleted`);
|
|
43293
|
+
this.logger.info(safeMsg` ${green("✓")} Old resource deleted`);
|
|
43194
43294
|
this.oldDeletedBeforeCreate.add(logicalId);
|
|
43195
43295
|
}
|
|
43196
|
-
this.logger.info(` Creating new ${logicalId}...`);
|
|
43296
|
+
this.logger.info(safeMsg` Creating new ${logicalId}...`);
|
|
43197
43297
|
createResult = await withRetry(() => this.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => replaceProvider.create(logicalId, resourceType, replaceProps, { maskSecrets: createSecretMasker(updateSecrets) })), logicalId, void 0, void 0, replaceProvider), logicalId, {
|
|
43198
43298
|
maxRetries: 8,
|
|
43199
43299
|
initialDelayMs: 2e3,
|
|
@@ -43203,9 +43303,9 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43203
43303
|
onInterrupted: () => new InterruptedError(this.interruptCause ?? "user"),
|
|
43204
43304
|
isRetryable: isRecreateRetryableError
|
|
43205
43305
|
});
|
|
43206
|
-
if (equalIdIsSameResource && updateReplacePolicy === "Retain" && createResult.physicalId === currentResource.physicalId) throw new CdkdError(`${logicalId} (${resourceType}) recreate returned the existing resource (${currentResource.physicalId}) instead of creating a new one — its Create API is name-idempotent — and UpdateReplacePolicy: Retain means the old resource was never destroyed, so the new properties were not applied. Rename the resource in your CDK code (or remove the explicit physical name) so the recreate can produce a genuinely new resource
|
|
43306
|
+
if (equalIdIsSameResource && updateReplacePolicy === "Retain" && createResult.physicalId === currentResource.physicalId) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) recreate returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one — its Create ` + "API is name-idempotent — and UpdateReplacePolicy: Retain means the old resource was never destroyed, so the new properties were not applied. Rename the resource in your CDK code (or remove the explicit physical name) so the recreate can produce a genuinely new resource.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
|
|
43207
43307
|
} else {
|
|
43208
|
-
this.logger.info(` Creating new ${logicalId}...`);
|
|
43308
|
+
this.logger.info(safeMsg` Creating new ${logicalId}...`);
|
|
43209
43309
|
let deletedOldFirst = lostWithParent !== void 0;
|
|
43210
43310
|
if (lostWithParent !== void 0) {
|
|
43211
43311
|
this.oldDeletedBeforeCreate.add(logicalId);
|
|
@@ -43225,7 +43325,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43225
43325
|
observed: currentResource.observedProperties,
|
|
43226
43326
|
physicalId: currentResource.physicalId
|
|
43227
43327
|
});
|
|
43228
|
-
if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement, but the create-first attempt collided: ${createMsg}. ${renderNameHeldElsewhere(nameHeldElsewhere)}` + (this.options.replace === true ? ` — so --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " — so removing UpdateReplacePolicy: Retain and re-running with `cdkd deploy --replace` would delete this resource and still collide." : " — so `cdkd deploy --replace` would delete this resource and still collide.") + " Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
|
|
43328
|
+
if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but the create-first ` + safeMsg`attempt collided: ${createMsg}. ${renderNameHeldElsewhere(nameHeldElsewhere)}` + (this.options.replace === true ? ` — so --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " — so removing UpdateReplacePolicy: Retain and re-running with `cdkd deploy --replace` would delete this resource and still collide." : " — so `cdkd deploy --replace` would delete this resource and still collide.") + " Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
|
|
43229
43329
|
const holder = replacementOldHoldsSentName({
|
|
43230
43330
|
createType: resourceType,
|
|
43231
43331
|
holderType: oldResourceType,
|
|
@@ -43243,26 +43343,26 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43243
43343
|
const flagClause = this.options.replace === true ? ` --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " Nothing was deleted. UpdateReplacePolicy: Retain keeps the resource being replaced in place; removing it and re-running with `cdkd deploy --replace` would refuse the same way rather than delete it." : " Nothing was deleted, and `cdkd deploy --replace` would refuse the same way rather than delete it.";
|
|
43244
43344
|
throw markNonRetryable(new CdkdError(maskSecretsInText(`${displaySafe(logicalId)} (${displaySafe(resourceType)}) requires replacement, but the create-first attempt collided: ${holder.diagnosis} — ` + (holder.known ? "so another resource holds the colliding name (an orphan of an earlier attempt, or one made outside this stack), and deleting the resource being replaced would destroy it and collide again." + flagClause + " Remove or rename the resource holding that name if it is yours, then re-run the deploy." : "so if another resource holds it (an orphan of an earlier attempt, or one made outside this stack), deleting the resource being replaced would destroy it and collide again." + flagClause + " Remove or rename whatever holds that name if it is yours — if that is the resource being replaced itself, delete it by hand — then re-run the deploy.") + ` Underlying collision: ${createMsg}`, updateSecrets), "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
|
|
43245
43345
|
}
|
|
43246
|
-
if (updateReplacePolicy === "Retain") throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place. ${nameOrigin.descriptor}.
|
|
43247
|
-
if (this.options.replace !== true) throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but the create-first attempt collided with the existing resource: ${createMsg}.
|
|
43248
|
-
this.logger.info(` Create-first collided with the existing resource's name and --replace is set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
|
|
43346
|
+
if (updateReplacePolicy === "Retain") throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its physical name ` + `is still held by the existing resource AND UpdateReplacePolicy: Retain ` + safeMsg`pins that resource in place. ${nameOrigin.descriptor}. ` + safeMsg`${nameOrigin.remedy} — with Retain, the old resource keeps the name, so a ` + `same-name replacement can never proceed.`, "NAMED_REPLACEMENT_COLLISION");
|
|
43347
|
+
if (this.options.replace !== true) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but the create-first ` + safeMsg`attempt collided with the existing resource: ${createMsg}. ` + safeMsg`${nameOrigin.descriptor}, so the CloudFormation-style safe replacement ` + "order (create the new resource before deleting the old) cannot reuse the occupied name — CloudFormation refuses this shape with \"cannot update a stack when a custom-named resource requires replacing\". " + safeMsg`${nameOrigin.remedy}, or re-run with \`cdkd deploy --replace\` to delete ` + "the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated).", "NAMED_REPLACEMENT_COLLISION");
|
|
43348
|
+
this.logger.info(` Create-first collided with the existing resource's name and --replace is ` + safeMsg`set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
|
|
43249
43349
|
deletedOldFirst = true;
|
|
43250
43350
|
createResult = await this.replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourceType, currentResource, oldDeleteProvider, replaceProvider, replaceProps, updateSecrets, updateReplacePolicy, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
|
|
43251
43351
|
}
|
|
43252
43352
|
if (equalIdIsSameResource && !deletedOldFirst && createResult.physicalId === currentResource.physicalId) {
|
|
43253
43353
|
const idempotentNameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
|
|
43254
|
-
if (updateReplacePolicy === "Retain") throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create-first attempt returned the existing resource (${currentResource.physicalId}) instead of creating a new one, and UpdateReplacePolicy: Retain pins that resource in place.
|
|
43255
|
-
if (this.options.replace !== true) throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create-first attempt returned the EXISTING resource (${currentResource.physicalId}) instead of creating a new one, so deleting the "old" resource would silently destroy the resource the deploy just reported as created. ${idempotentNameOrigin.descriptor};
|
|
43256
|
-
this.logger.info(` Create-first returned the existing resource (name-idempotent Create API) and --replace is set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
|
|
43354
|
+
if (updateReplacePolicy === "Retain") throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create API is ` + `name-idempotent: the create-first attempt returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, and ` + `UpdateReplacePolicy: Retain pins that resource in place. ` + safeMsg`${idempotentNameOrigin.descriptor}. ${idempotentNameOrigin.remedy} — with ` + "Retain, the old resource keeps the name, so a same-name replacement can never proceed.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
|
|
43355
|
+
if (this.options.replace !== true) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create API is ` + `name-idempotent: the create-first attempt returned the EXISTING resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, so deleting ` + `the "old" resource would silently destroy the resource the deploy just ` + safeMsg`reported as created. ${idempotentNameOrigin.descriptor}; ` + safeMsg`${idempotentNameOrigin.remedy}, or re-run with ` + "`cdkd deploy --replace` to delete the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated). Note: this branch is also reached when the old resource was deleted out-of-band and the physical id is name-derived — there the create was a genuine fresh create; `--replace` converges that case too.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
|
|
43356
|
+
this.logger.info(` Create-first returned the existing resource (name-idempotent Create API) ` + safeMsg`and --replace is set — deleting old ${logicalId} ` + safeMsg`(${currentResource.physicalId}) first...`);
|
|
43257
43357
|
deletedOldFirst = true;
|
|
43258
43358
|
createResult = await this.replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourceType, currentResource, oldDeleteProvider, replaceProvider, replaceProps, updateSecrets, updateReplacePolicy, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
|
|
43259
43359
|
}
|
|
43260
43360
|
if (deletedOldFirst) {} else if (updateReplacePolicy === "Retain") {
|
|
43261
43361
|
this.retainedOldOnReplacement.add(logicalId);
|
|
43262
43362
|
await noteRetainedResource(oldResourceType, logicalId);
|
|
43263
|
-
this.logger.info(` Retaining old ${logicalId} (${currentResource.physicalId}) - UpdateReplacePolicy: Retain`);
|
|
43363
|
+
this.logger.info(safeMsg` Retaining old ${logicalId} (${currentResource.physicalId}) - UpdateReplacePolicy: Retain`);
|
|
43264
43364
|
} else {
|
|
43265
|
-
this.logger.info(` Deleting old ${logicalId} (${currentResource.physicalId})...`);
|
|
43365
|
+
this.logger.info(safeMsg` Deleting old ${logicalId} (${currentResource.physicalId})...`);
|
|
43266
43366
|
let cleanupFinalSnapshotId;
|
|
43267
43367
|
let snapshotBlockedDelete = false;
|
|
43268
43368
|
try {
|
|
@@ -43270,7 +43370,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43270
43370
|
} catch (snapshotError) {
|
|
43271
43371
|
if (snapshotError instanceof CdkdError && snapshotError.code === "FINAL_SNAPSHOT_UNSUPPORTED") throw snapshotError;
|
|
43272
43372
|
snapshotBlockedDelete = true;
|
|
43273
|
-
this.logger.warn(` ⚠ Final snapshot for old ${logicalId} (${currentResource.physicalId}) failed: ${snapshotError instanceof Error ? snapshotError.message : String(snapshotError)}. The old resource was NOT deleted (UpdateReplacePolicy: Snapshot) — delete it manually once you have a snapshot; it is no longer tracked in state
|
|
43373
|
+
this.logger.warn(safeMsg` ⚠ Final snapshot for old ${logicalId} (${currentResource.physicalId}) ` + safeMsg`failed: ${asIsMessage(snapshotError instanceof Error ? snapshotError.message : String(snapshotError))}. ` + "The old resource was NOT deleted (UpdateReplacePolicy: Snapshot) — delete it manually once you have a snapshot; it is no longer tracked in state.");
|
|
43274
43374
|
}
|
|
43275
43375
|
if (!snapshotBlockedDelete) await this.deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, oldDeleteProvider, currentResource.properties, cleanupFinalSnapshotId, updateReplacePolicy, updateSecrets, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
|
|
43276
43376
|
}
|
|
@@ -43296,9 +43396,9 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43296
43396
|
const replacePrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
|
|
43297
43397
|
renderer.removeTask(logicalId);
|
|
43298
43398
|
const replacedSkip = this.replacedDeleteSkips.get(logicalId);
|
|
43299
|
-
const replacedLine = `${replacePrefix}${yellow("↻")} ${bold(logicalId)} ${gray(`(${resourceType})`)} ${yellow("replaced")}`;
|
|
43399
|
+
const replacedLine = safeMsg`${replacePrefix}${yellow("↻")} ${bold(logicalId)} ${gray(`(${resourceType})`)} ${yellow("replaced")}`;
|
|
43300
43400
|
if (replacedSkip !== void 0) {
|
|
43301
|
-
this.logger.warn(replacedLine
|
|
43401
|
+
this.logger.warn(safeMsg`${replacedLine} ${updatePartialMessage(replacedSkip)}`);
|
|
43302
43402
|
return;
|
|
43303
43403
|
}
|
|
43304
43404
|
this.logger.info(replacedLine);
|
|
@@ -43307,7 +43407,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
43307
43407
|
//#endregion
|
|
43308
43408
|
//#region src/deployment/deploy-engine/update-in-place.ts
|
|
43309
43409
|
async function updateInPlace({ conditions, counts, currentProps, currentPropsAsWritten, currentResource, dependencies, desiredForSkipCheckAsWritten, logicalId, noEchoHeldPaths, parameterValues, progress, renderer, resolvedProps, resourceType, stackName, stateResources, template, updateReplacePolicy, updateSecrets, reattach }) {
|
|
43310
|
-
this.logger.debug(`Updating ${logicalId} (${resourceType})`);
|
|
43410
|
+
this.logger.debug(safeMsg`Updating ${logicalId} (${resourceType})`);
|
|
43311
43411
|
const updateDecision = this.providerRegistry.getProviderFor({
|
|
43312
43412
|
resourceType,
|
|
43313
43413
|
properties: resolvedProps,
|
|
@@ -43321,12 +43421,12 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43321
43421
|
let message;
|
|
43322
43422
|
switch (exemptMode) {
|
|
43323
43423
|
case "cc-broken":
|
|
43324
|
-
message = `${logicalId} (${resourceType}): moving to the SDK provider — Cloud Control cannot manage this type correctly. ${preserved}, and this routing is not optional.`;
|
|
43424
|
+
message = safeMsg`${logicalId} (${resourceType}): moving to the SDK provider — Cloud ` + `Control cannot manage this type correctly. ${preserved}, and this routing is not optional.`;
|
|
43325
43425
|
break;
|
|
43326
43426
|
case "sdk-coverage":
|
|
43327
|
-
message = `${logicalId} (${resourceType}): returning to the SDK provider — cdkd now covers every property this resource uses. ${preserved}; pass
|
|
43427
|
+
message = safeMsg`${logicalId} (${resourceType}): returning to the SDK provider — cdkd now ` + `covers every property this resource uses. ${preserved}; pass ` + safeMsg`--pin-cc-api ${logicalId} to decline this for a deploy.`;
|
|
43328
43428
|
break;
|
|
43329
|
-
default: message = `${logicalId} (${resourceType}): moving to the SDK provider. ${preserved}.`;
|
|
43429
|
+
default: message = safeMsg`${logicalId} (${resourceType}): moving to the SDK provider. ${preserved}.`;
|
|
43330
43430
|
}
|
|
43331
43431
|
this.logger.info(message);
|
|
43332
43432
|
}
|
|
@@ -43374,7 +43474,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43374
43474
|
const statefulReason = retainOldOnReplace ? null : isStatefulRecreateTargetForReplace(resourceType, currentProps, currentResource.observedProperties);
|
|
43375
43475
|
if (statefulReason && this.options.forceStatefulRecreation !== true) {
|
|
43376
43476
|
const protection = recordedProtectionEvidence(resourceType, currentProps, currentResource.observedProperties, this.stackRegion);
|
|
43377
|
-
throw markNonRetryable(new CdkdError(replaceOptIn ? `--replace would DELETE + CREATE the stateful resource ${logicalId} (${resourceType}) — ${renderStatefulReason(statefulReason)}. ` + (protection ? `${recordedProtectionNote(protection, "--replace --force-stateful-recreation")} Or change the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change.") : `${logicalId} (${resourceType}) cannot be updated in place by the provisioning layer it routes through, so applying this change would DELETE + CREATE it — but it is a stateful resource:
|
|
43477
|
+
throw markNonRetryable(new CdkdError(replaceOptIn ? safeMsg`--replace would DELETE + CREATE the stateful resource ${logicalId} ` + safeMsg`(${resourceType}) — ${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--replace --force-stateful-recreation")} ` + `Or change the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change.") : safeMsg`${logicalId} (${resourceType}) cannot be updated in place by the ` + "provisioning layer it routes through, so applying this change would DELETE + CREATE it — but it is a stateful resource: " + safeMsg`${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--force-stateful-recreation")} ` + `Or change the resource's definition to avoid the update.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the update."), "STATEFUL_REPLACE_BLOCKED", updateError instanceof Error ? updateError : void 0));
|
|
43378
43478
|
}
|
|
43379
43479
|
const replDecision = this.providerRegistry.getProviderFor({
|
|
43380
43480
|
resourceType,
|
|
@@ -43405,7 +43505,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43405
43505
|
secrets: updateSecrets,
|
|
43406
43506
|
inputSources: template && this.maskedInputSources(template, stateResources, this.noEchoConditions, stackName)
|
|
43407
43507
|
});
|
|
43408
|
-
this.logger.info(retainOldOnReplace ? `UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE only — UpdateReplacePolicy: Retain keeps the old resource)` : createFirst ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE → DELETE — the new name differs from the old resource's)` : `UPDATE not supported for ${logicalId} (${resourceType}), replacing (DELETE → CREATE)`);
|
|
43508
|
+
this.logger.info(retainOldOnReplace ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing ` + `(CREATE only — UpdateReplacePolicy: Retain keeps the old resource)` : createFirst ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE → DELETE — the new name differs from the old resource's)` : safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (DELETE → CREATE)`);
|
|
43409
43509
|
if (retainOldOnReplace) await noteRetainedResource(resourceType, logicalId);
|
|
43410
43510
|
if (!retainOldOnReplace && !createFirst) {
|
|
43411
43511
|
const fallbackUpdateReplacePolicy = template?.Resources?.[logicalId]?.UpdateReplacePolicy ?? currentResource.updateReplacePolicy;
|
|
@@ -43424,7 +43524,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43424
43524
|
}));
|
|
43425
43525
|
} catch (deleteError) {
|
|
43426
43526
|
const deleteMsg = deleteError instanceof Error ? deleteError.message : String(deleteError);
|
|
43427
|
-
if (!isWaitAbandonedError(deleteError) && !isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && (deleteMsg.includes("does not exist") || deleteMsg.includes("not found") || deleteMsg.includes("NotFound"))) this.logger.debug(`Old resource ${logicalId} already gone, proceeding with CREATE`);
|
|
43527
|
+
if (!isWaitAbandonedError(deleteError) && !isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && (deleteMsg.includes("does not exist") || deleteMsg.includes("not found") || deleteMsg.includes("NotFound"))) this.logger.debug(safeMsg`Old resource ${logicalId} already gone, proceeding with CREATE`);
|
|
43428
43528
|
else throw deleteError;
|
|
43429
43529
|
}
|
|
43430
43530
|
reportDeleteGuards(fallbackDeleteResult, {
|
|
@@ -43464,7 +43564,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43464
43564
|
}) : await this.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => replProvider.create(logicalId, resourceType, replProps, { maskSecrets: createSecretMasker(updateSecrets) })), logicalId, void 0, void 0, replProvider);
|
|
43465
43565
|
} catch (createError) {
|
|
43466
43566
|
if (createFirst) throw createError;
|
|
43467
|
-
if (!retainOldOnReplace)
|
|
43567
|
+
if (!retainOldOnReplace) {
|
|
43568
|
+
const shownSecrets = unionOfSecretBags([updateSecrets, this.printingSecretsFor(logicalId)]);
|
|
43569
|
+
throw new Error(safeMsg`Failed to create ${maskSecretsInText(logicalId, shownSecrets)} after the ` + safeMsg`UPDATE-not-supported replacement: the old resource (${maskSecretsInText(currentResource.physicalId, shownSecrets)}) ` + safeMsg`is now gone. Re-run the deploy to create it fresh. Cause: ${asIsMessage(maskSecretsInText(createError instanceof Error ? createError.message : String(createError), shownSecrets))}`, { cause: createError instanceof Error ? createError : void 0 });
|
|
43570
|
+
}
|
|
43468
43571
|
if (!isNameCollisionErrorFrom(createError, logicalId)) throw createError;
|
|
43469
43572
|
const nameHeldElsewhere = replacementRequestsDifferentName({
|
|
43470
43573
|
oldResourceType: resourceType,
|
|
@@ -43474,9 +43577,9 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43474
43577
|
observed: currentResource.observedProperties,
|
|
43475
43578
|
physicalId: currentResource.physicalId
|
|
43476
43579
|
});
|
|
43477
|
-
if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement because the provisioning layer cannot update it in place, but the create collided.
|
|
43580
|
+
if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement because the ` + `provisioning layer cannot update it in place, but the create collided. ` + safeMsg`${renderNameHeldElsewhere(nameHeldElsewhere)} — so removing ` + "UpdateReplacePolicy: Retain would delete this resource and still collide. Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
|
|
43478
43581
|
const nameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
|
|
43479
|
-
throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement because the provisioning layer cannot update it in place — but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place.
|
|
43582
|
+
throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement because the ` + "provisioning layer cannot update it in place — but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place. " + safeMsg`${nameOrigin.descriptor}. ${nameOrigin.remedy} — with Retain, the old ` + "resource keeps the name, so a same-name replacement can never proceed. Removing UpdateReplacePolicy: Retain lets cdkd delete the old resource first, which destroys it and any data it holds.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
|
|
43480
43583
|
}
|
|
43481
43584
|
if (!retainOldOnReplace && !createFirst && createResult.physicalId === currentResource.physicalId && !equalIdNamesDifferentResources({
|
|
43482
43585
|
resourceType,
|
|
@@ -43492,10 +43595,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43492
43595
|
newProperties: resolvedProps
|
|
43493
43596
|
})) {
|
|
43494
43597
|
const idempotentNameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
|
|
43495
|
-
throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create returned the existing resource (${currentResource.physicalId}) instead of creating a new one, and UpdateReplacePolicy: Retain pins that resource in place, so the new properties were not applied. ${idempotentNameOrigin.descriptor}.
|
|
43598
|
+
throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create ` + `API is name-idempotent: the create returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, and ` + `UpdateReplacePolicy: Retain pins that resource in place, so the new ` + safeMsg`properties were not applied. ${idempotentNameOrigin.descriptor}. ` + safeMsg`${idempotentNameOrigin.remedy} — with Retain, the old resource keeps ` + `the name, so a same-name replacement can never proceed.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE"));
|
|
43496
43599
|
}
|
|
43497
43600
|
this.retainedOldOnReplacement.add(logicalId);
|
|
43498
|
-
this.logger.warn(` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — the old physical resource (${currentResource.physicalId}) is RETAINED and is no longer tracked by cdkd: it keeps running and incurring cost, and
|
|
43601
|
+
this.logger.warn(safeMsg` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — the old physical ` + safeMsg`resource (${currentResource.physicalId}) is RETAINED and is no longer ` + "tracked by cdkd: it keeps running and incurring cost, and `cdkd destroy` will not remove it. Delete it yourself once you no longer need its data.");
|
|
43499
43602
|
retainedSurvivorReason = `UpdateReplacePolicy: Retain kept the old ${resourceType} (${currentResource.physicalId}), now untracked by cdkd`;
|
|
43500
43603
|
}
|
|
43501
43604
|
const replacementResult = {
|
|
@@ -43526,7 +43629,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43526
43629
|
physicalId: result.physicalId,
|
|
43527
43630
|
properties: resolvedProps
|
|
43528
43631
|
});
|
|
43529
|
-
this.logger.info(`Resource ${logicalId} was replaced: ${currentResource.physicalId} -> ${result.physicalId}`);
|
|
43632
|
+
this.logger.info(safeMsg`Resource ${logicalId} was replaced: ${currentResource.physicalId} -> ${result.physicalId}`);
|
|
43530
43633
|
}
|
|
43531
43634
|
const dischargedByReplacement = result.wasReplaced === true && result.physicalId !== currentResource.physicalId;
|
|
43532
43635
|
const keepsParameterRefusal = !dischargedByReplacement && hasUnverifiableParameterRefusal(currentResource);
|
|
@@ -43555,7 +43658,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43555
43658
|
}
|
|
43556
43659
|
};
|
|
43557
43660
|
if (updatePartialReason(result) === void 0) this.recordInlinePolicyWrite(logicalId, "update");
|
|
43558
|
-
if (keepsParameterRefusal) this.logger.debug(`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
|
|
43661
|
+
if (keepsParameterRefusal) this.logger.debug(safeMsg`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
|
|
43559
43662
|
const updateCaptureSiblings = keepsParameterRefusal ? void 0 : await this.buildObservedCaptureSiblings(resourceType, logicalId, result.physicalId, template, stateResources, stackName, parameterValues, conditions);
|
|
43560
43663
|
if (!keepsParameterRefusal) this.kickOffObservedCapture(captureProvider, logicalId, result.physicalId, resourceType, resolvedProps, {
|
|
43561
43664
|
...updateCaptureSiblings,
|
|
@@ -43572,11 +43675,11 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
43572
43675
|
const replacedSkip = this.replacedDeleteSkips.get(logicalId);
|
|
43573
43676
|
const shownPartial = updatePartial !== void 0 && replacedSkip !== void 0 ? `${updatePartial}; ${replacedSkip}` : updatePartial ?? replacedSkip;
|
|
43574
43677
|
if (shownPartial !== void 0) {
|
|
43575
|
-
this.logger.warn(`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)} ` + updatePartialMessage(shownPartial));
|
|
43678
|
+
this.logger.warn(safeMsg`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)} ` + safeMsg`${updatePartialMessage(shownPartial)}`);
|
|
43576
43679
|
if (updatePartial !== void 0) return { updatePartial };
|
|
43577
43680
|
return;
|
|
43578
43681
|
}
|
|
43579
|
-
this.logger.info(`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)}`);
|
|
43682
|
+
this.logger.info(safeMsg`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)}`);
|
|
43580
43683
|
}
|
|
43581
43684
|
|
|
43582
43685
|
//#endregion
|
|
@@ -43661,10 +43764,10 @@ async function provisionDelete(logicalId, change, stateResources, stackName, tem
|
|
|
43661
43764
|
const existingState = stateResources[logicalId];
|
|
43662
43765
|
const renderer = getLiveRenderer();
|
|
43663
43766
|
const currentResource = existingState;
|
|
43664
|
-
if (!currentResource) throw new Error(`Cannot delete ${logicalId}: resource not found in state`);
|
|
43767
|
+
if (!currentResource) throw new Error(safeMsg`Cannot delete ${logicalId}: resource not found in state`);
|
|
43665
43768
|
const deletionPolicy = currentResource.deletionPolicy ?? template?.Resources?.[logicalId]?.DeletionPolicy;
|
|
43666
43769
|
if (shouldRetainResource(deletionPolicy)) {
|
|
43667
|
-
this.logger.info(`Retaining ${logicalId} (${resourceType}) - DeletionPolicy: ${deletionPolicy}`);
|
|
43770
|
+
this.logger.info(safeMsg`Retaining ${logicalId} (${resourceType}) - DeletionPolicy: ${deletionPolicy}`);
|
|
43668
43771
|
delete stateResources[logicalId];
|
|
43669
43772
|
await noteRetainedResource(resourceType, logicalId);
|
|
43670
43773
|
if (keptForReadoption(currentResource)) {
|
|
@@ -43736,7 +43839,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43736
43839
|
provisionedBy: currentResource.provisionedBy
|
|
43737
43840
|
});
|
|
43738
43841
|
const deleteProvider = deleteRoute.provider;
|
|
43739
|
-
this.logger.debug(`Deleting ${logicalId} (${resourceType})`);
|
|
43842
|
+
this.logger.debug(safeMsg`Deleting ${logicalId} (${resourceType})`);
|
|
43740
43843
|
let deleteResult = void 0;
|
|
43741
43844
|
const inlinePolicyClaimed = this.inlinePolicyClaimedFor(resourceType, logicalId, stateResources);
|
|
43742
43845
|
try {
|
|
@@ -43752,7 +43855,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43752
43855
|
}), logicalId, 3, 5e3, deleteProvider);
|
|
43753
43856
|
} catch (deleteError) {
|
|
43754
43857
|
const msg = deleteError instanceof Error ? deleteError.message : String(deleteError);
|
|
43755
|
-
if (!isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && !isWaitAbandonedError(deleteError) && (msg.includes("does not exist") || msg.includes("was not found") || msg.includes("not found") || msg.includes("No policy found") || msg.includes("NoSuchEntity") || msg.includes("NotFoundException") || msg.includes("ResourceNotFoundException"))) this.logger.debug(`Resource ${logicalId} already deleted (${msg}), removing from state`);
|
|
43858
|
+
if (!isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && !isWaitAbandonedError(deleteError) && (msg.includes("does not exist") || msg.includes("was not found") || msg.includes("not found") || msg.includes("No policy found") || msg.includes("NoSuchEntity") || msg.includes("NotFoundException") || msg.includes("ResourceNotFoundException"))) this.logger.debug(safeMsg`Resource ${logicalId} already deleted (${asIsMessage(msg)}), removing from state`);
|
|
43756
43859
|
else throw deleteError;
|
|
43757
43860
|
}
|
|
43758
43861
|
reportDeleteGuards(deleteResult, {
|
|
@@ -43765,7 +43868,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43765
43868
|
if (progress) progress.current++;
|
|
43766
43869
|
const skipPrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
|
|
43767
43870
|
renderer.removeTask(logicalId);
|
|
43768
|
-
this.logger.info(`${skipPrefix}${formatResourceLine("skipped", logicalId, resourceType, `skipped (${deleteSkipped})`)}`);
|
|
43871
|
+
this.logger.info(safeMsg`${skipPrefix}${formatResourceLine("skipped", logicalId, resourceType, `skipped (${deleteSkipped})`)}`);
|
|
43769
43872
|
const nested = resourceType === "AWS::CloudFormation::Stack";
|
|
43770
43873
|
const recordStack = nested ? nestedChildStackName(stackName, logicalId) : stackName;
|
|
43771
43874
|
const interrupted = nested && deleteSkipped.endsWith(" was interrupted");
|
|
@@ -43777,7 +43880,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43777
43880
|
hole: nested ? "child-stack" : "stack",
|
|
43778
43881
|
opts: { plainIdent: true }
|
|
43779
43882
|
};
|
|
43780
|
-
this.logger.warn(deleteSkippedMessage(logicalId, currentResource.physicalId, deleteSkipped, "while removing it from the template") + ". Its cdkd state record was KEPT, so the next 'cdkd deploy' re-attempts the delete. Repair the record first (for a nested stack it is the CHILD's own state, whose other resources may already be gone), or delete the resource by hand and drop the record." + (interrupted ? " The commands name the child stack record. Its destroy was interrupted: re-run 'cdkd deploy' to resume it, and drop the child record only if that cannot finish, after deleting by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop)." : nested ? " The commands name the child stack record. Dropping it drops every record the child still has and nothing reaches those resources again, so first delete by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop). The next 'cdkd deploy' then removes this row." : " Keep '--resource' on the drop: without it the command drops the record of every resource in this still-deployed stack.") + (accountClause === "" ? "" : ` ${accountClause}`) + `\nInspect it with: ${pasteableCommand("cdkd state show", [
|
|
43883
|
+
this.logger.warn(safeMsg`${deleteSkippedMessage(logicalId, currentResource.physicalId, deleteSkipped, "while removing it from the template")}` + ". Its cdkd state record was KEPT, so the next 'cdkd deploy' re-attempts the delete. Repair the record first (for a nested stack it is the CHILD's own state, whose other resources may already be gone), or delete the resource by hand and drop the record." + (interrupted ? " The commands name the child stack record. Its destroy was interrupted: re-run 'cdkd deploy' to resume it, and drop the child record only if that cannot finish, after deleting by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop)." : nested ? " The commands name the child stack record. Dropping it drops every record the child still has and nothing reaches those resources again, so first delete by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop). The next 'cdkd deploy' then removes this row." : " Keep '--resource' on the drop: without it the command drops the record of every resource in this still-deployed stack.") + (accountClause === "" ? "" : safeMsg` ${accountClause}`) + safeMsg`\nInspect it with: ${pasteableCommand("cdkd state show", [
|
|
43781
43884
|
stackArg,
|
|
43782
43885
|
{
|
|
43783
43886
|
flag: "--stack-region",
|
|
@@ -43785,7 +43888,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43785
43888
|
hole: "region"
|
|
43786
43889
|
},
|
|
43787
43890
|
...account
|
|
43788
|
-
]).command}
|
|
43891
|
+
]).command}` + safeMsg`\nDrop the record with: ${pasteableCommand("cdkd state orphan", [
|
|
43789
43892
|
stackArg,
|
|
43790
43893
|
{
|
|
43791
43894
|
flag: "--stack-region",
|
|
@@ -43808,7 +43911,7 @@ Drop the record with: ${dropCommand}`);
|
|
|
43808
43911
|
if (progress) progress.current++;
|
|
43809
43912
|
const deletePrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
|
|
43810
43913
|
renderer.removeTask(logicalId);
|
|
43811
|
-
this.logger.info(`${deletePrefix}${formatResourceLine("deleted", logicalId, resourceType)}`);
|
|
43914
|
+
this.logger.info(safeMsg`${deletePrefix}${formatResourceLine("deleted", logicalId, resourceType)}`);
|
|
43812
43915
|
}
|
|
43813
43916
|
|
|
43814
43917
|
//#endregion
|
|
@@ -43876,6 +43979,8 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
|
|
|
43876
43979
|
}
|
|
43877
43980
|
} else updatePartial = `${updatePartial}; ${replacedSkip}`;
|
|
43878
43981
|
}
|
|
43982
|
+
const deferred = this.deferredReplacedDeletes?.get(logicalId);
|
|
43983
|
+
if (deferred !== void 0 && updatePartial !== void 0) deferred.rowPartial = true;
|
|
43879
43984
|
nestedChildUnaddressed = unaddressed;
|
|
43880
43985
|
} finally {
|
|
43881
43986
|
for (const guard of deleteGuards.splice(0)) this.recordEvent({
|
|
@@ -43900,7 +44005,7 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
|
|
|
43900
44005
|
if (current !== void 0) current.warnSuffix = warnSuffix;
|
|
43901
44006
|
renderer.updateTaskLabel(logicalId, `${current?.label ?? baseLabel}${warnSuffix}`);
|
|
43902
44007
|
renderer.printAbove(() => {
|
|
43903
|
-
this.logger.warn(`${logicalId} (${resourceType}) has been ${operationKind === "CREATE" ? "creating" : operationKind === "DELETE" ? "deleting" : "updating"} for ${minutes}m — still waiting`);
|
|
44008
|
+
this.logger.warn(safeMsg`${logicalId} (${resourceType}) has been ${operationKind === "CREATE" ? "creating" : operationKind === "DELETE" ? "deleting" : "updating"} for ${minutes}m — still waiting`);
|
|
43904
44009
|
});
|
|
43905
44010
|
},
|
|
43906
44011
|
onTimeout: (elapsedMs) => new ResourceTimeoutError(logicalId, resourceType, this.stackRegion, elapsedMs, operationKind, timeoutMs)
|
|
@@ -43948,7 +44053,9 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
|
|
|
43948
44053
|
} catch (error) {
|
|
43949
44054
|
renderer.removeTask(logicalId);
|
|
43950
44055
|
const message = error instanceof Error ? error.message : String(error);
|
|
43951
|
-
this.
|
|
44056
|
+
const shownMessage = this.maskForResource(logicalId, message);
|
|
44057
|
+
const shownId = safeMsg`${logicalId}`;
|
|
44058
|
+
this.logger.error(this.maskForResource(logicalId, `Failed to ${change.changeType.toLowerCase()} ${shownId}: ${shownMessage}`));
|
|
43952
44059
|
const orphanAdvice = this.orphanedNameCollisionAdvice(change.changeType, logicalId, error);
|
|
43953
44060
|
if (orphanAdvice) this.logger.error(this.maskForResource(logicalId, orphanAdvice));
|
|
43954
44061
|
this.recordEvent({
|
|
@@ -43961,7 +44068,7 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
|
|
|
43961
44068
|
durationMs: Date.now() - resourceStartedAt,
|
|
43962
44069
|
error: extractDeploymentEventError(error)
|
|
43963
44070
|
});
|
|
43964
|
-
throw new ProvisioningError(`Failed to ${change.changeType.toLowerCase()} resource ${logicalId}`, resourceType, logicalId, stateResources[logicalId]?.physicalId, error instanceof Error ? maskSecretsInError(error, this.printingSecretsFor(logicalId) ?? EMPTY_SECRETS) : void 0);
|
|
44071
|
+
throw new ProvisioningError(safeMsg`Failed to ${change.changeType.toLowerCase()} resource ${logicalId}`, resourceType, logicalId, stateResources[logicalId]?.physicalId, error instanceof Error ? maskSecretsInError(error, this.printingSecretsFor(logicalId) ?? EMPTY_SECRETS) : void 0);
|
|
43965
44072
|
} finally {
|
|
43966
44073
|
renderer.removeTask(logicalId);
|
|
43967
44074
|
}
|
|
@@ -44141,9 +44248,9 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44141
44248
|
migrateLegacy: migrate
|
|
44142
44249
|
});
|
|
44143
44250
|
if (migrate) pendingMigration = false;
|
|
44144
|
-
this.logger.debug(`State saved after ${logicalId}`);
|
|
44251
|
+
this.logger.debug(safeMsg`State saved after ${logicalId}`);
|
|
44145
44252
|
} catch (error) {
|
|
44146
|
-
this.logger.warn(`Failed to save state after ${logicalId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
44253
|
+
this.logger.warn(safeMsg`Failed to save state after ${logicalId}: ${asIsMessage(error instanceof Error ? error.message : String(error))}`);
|
|
44147
44254
|
}
|
|
44148
44255
|
});
|
|
44149
44256
|
};
|
|
@@ -44152,6 +44259,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44152
44259
|
const settledUpdates = /* @__PURE__ */ new Set();
|
|
44153
44260
|
const inFlightWrites = /* @__PURE__ */ new Map();
|
|
44154
44261
|
this.stackRecordsView = deployStackRecordsView(newResources, currentState.resources, deleteChanges, (logicalId) => startedUpdates.has(logicalId) && !settledUpdates.has(logicalId), () => [...inFlightWrites.values()].map(({ write }) => write));
|
|
44262
|
+
this.deferredReplacedDeletes = /* @__PURE__ */ new Map();
|
|
44155
44263
|
try {
|
|
44156
44264
|
const createUpdateIds = [];
|
|
44157
44265
|
for (const [id, change] of changes.entries()) {
|
|
@@ -44160,7 +44268,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44160
44268
|
createUpdateIds.push(id);
|
|
44161
44269
|
}
|
|
44162
44270
|
if (createUpdateIds.length > 0) {
|
|
44163
|
-
this.logger.info(`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
|
|
44271
|
+
this.logger.info(safeMsg`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
|
|
44164
44272
|
const createUpdateExecutor = new DagExecutor();
|
|
44165
44273
|
const provisionable = new Set(createUpdateIds);
|
|
44166
44274
|
const createUpdateDeps = /* @__PURE__ */ new Map();
|
|
@@ -44329,7 +44437,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44329
44437
|
if (this.interrupted && this.hasPending(createUpdateExecutor)) throw new InterruptedError(this.interruptCause ?? "user");
|
|
44330
44438
|
}
|
|
44331
44439
|
if (deleteChanges.size > 0) {
|
|
44332
|
-
this.logger.info(`${red("Deleting")} ${red(deleteChanges.size)} resource(s)`);
|
|
44440
|
+
this.logger.info(safeMsg`${red("Deleting")} ${red(deleteChanges.size)} resource(s)`);
|
|
44333
44441
|
const deleteDeps = this.buildDeletionDependencies(deleteChanges, currentState);
|
|
44334
44442
|
const deleteExecutor = new DagExecutor();
|
|
44335
44443
|
for (const id of deleteChanges) deleteExecutor.add({
|
|
@@ -44374,7 +44482,10 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44374
44482
|
}
|
|
44375
44483
|
if (this.interrupted && this.hasPending(deleteExecutor)) throw new InterruptedError(this.interruptCause ?? "user");
|
|
44376
44484
|
}
|
|
44485
|
+
if (this.interrupted) this.warnUnretriedReplacedDeletes("interrupted");
|
|
44486
|
+
else await this.retryDeferredReplacedDeletes(stackName, actualCounts);
|
|
44377
44487
|
} catch (error) {
|
|
44488
|
+
this.warnUnretriedReplacedDeletes(this.interruptCause === "user" ? "interrupted" : "failed");
|
|
44378
44489
|
const initialDeploy = currentEtag === void 0;
|
|
44379
44490
|
const written = /* @__PURE__ */ new Set([...this.restoredLostChildren, ...completedOperations.map((op) => op.logicalId)]);
|
|
44380
44491
|
for (const logicalId of this.updatesThatSentNothing) written.delete(logicalId);
|
|
@@ -44450,7 +44561,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44450
44561
|
if (migrate) pendingMigration = false;
|
|
44451
44562
|
this.logger.debug("Partial state saved before rollback (orphaned resource tracking)");
|
|
44452
44563
|
} catch (saveError) {
|
|
44453
|
-
this.logger.warn(`Failed to save partial state before rollback: ${saveError instanceof Error ? saveError.message : String(saveError)}`);
|
|
44564
|
+
this.logger.warn(safeMsg`Failed to save partial state before rollback: ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
|
|
44454
44565
|
}
|
|
44455
44566
|
let autoRollbackClean = false;
|
|
44456
44567
|
let autoRollbackJournaled = false;
|
|
@@ -44459,7 +44570,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44459
44570
|
let rollbackRemainingFailedOps = failedOperations;
|
|
44460
44571
|
if (error instanceof InterruptedError || isInterruptedWaitError(error) || this.interruptCause === "user") {
|
|
44461
44572
|
await this.writeRollbackJournalSegment(stackName, completedOperations, failedOperations, "interrupted", initialDeploy);
|
|
44462
|
-
this.logger.info(`Partial state saved (${Object.keys(newResources).length} resources). Run deploy again to resume, 'cdkd rollback' to revert, or destroy to clean up
|
|
44573
|
+
this.logger.info(safeMsg`Partial state saved (${Object.keys(newResources).length} resources). ` + "Run deploy again to resume, 'cdkd rollback' to revert, or destroy to clean up.");
|
|
44463
44574
|
throw error;
|
|
44464
44575
|
}
|
|
44465
44576
|
if (this.options.noRollback) {
|
|
@@ -44498,7 +44609,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44498
44609
|
this.logger.debug("State saved after deployment failure");
|
|
44499
44610
|
if (autoRollbackClean) await this.settleNestedChildrenAfterCleanRollback(stackName, rollbackSettledNested, await this.settleJournalAfterCleanRollback(stackName, rollbackRemainingFailedOps, initialDeploy));
|
|
44500
44611
|
} catch (saveError) {
|
|
44501
|
-
this.logger.debug(`Retrying state save after rollback (ETag mismatch): ${saveError instanceof Error ? saveError.message : String(saveError)}`);
|
|
44612
|
+
this.logger.debug(safeMsg`Retrying state save after rollback (ETag mismatch): ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
|
|
44502
44613
|
try {
|
|
44503
44614
|
const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
|
|
44504
44615
|
const postRollbackState = {
|
|
@@ -44517,7 +44628,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
44517
44628
|
this.logger.debug("State saved after deployment failure (retry succeeded)");
|
|
44518
44629
|
if (autoRollbackClean) await this.settleNestedChildrenAfterCleanRollback(stackName, rollbackSettledNested, await this.settleJournalAfterCleanRollback(stackName, rollbackRemainingFailedOps, initialDeploy));
|
|
44519
44630
|
} catch (retryError) {
|
|
44520
|
-
this.logger.warn(`Failed to save state after rollback: ${retryError instanceof Error ? retryError.message : String(retryError)}`);
|
|
44631
|
+
this.logger.warn(safeMsg`Failed to save state after rollback: ${asIsMessage(retryError instanceof Error ? retryError.message : String(retryError))}`);
|
|
44521
44632
|
}
|
|
44522
44633
|
}
|
|
44523
44634
|
throw error;
|
|
@@ -44572,13 +44683,13 @@ async function persistStateAfterOutputFailure(stackName, currentState, newResour
|
|
|
44572
44683
|
});
|
|
44573
44684
|
this.logger.debug("State saved after output resolution failure");
|
|
44574
44685
|
} catch (saveError) {
|
|
44575
|
-
this.logger.debug(`Retrying state save after output resolution failure (ETag mismatch): ${saveError instanceof Error ? saveError.message : String(saveError)}`);
|
|
44686
|
+
this.logger.debug(safeMsg`Retrying state save after output resolution failure (ETag mismatch): ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
|
|
44576
44687
|
try {
|
|
44577
44688
|
const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
|
|
44578
44689
|
await this.stateBackend.saveState(stackName, this.stackRegion, this.withParentInfo(buildState()), { ...freshEtag !== void 0 && { expectedEtag: freshEtag } });
|
|
44579
44690
|
this.logger.debug("State saved after output resolution failure (retry succeeded)");
|
|
44580
44691
|
} catch (retryError) {
|
|
44581
|
-
this.logger.warn(`Failed to save state after output resolution failure: ${retryError instanceof Error ? retryError.message : String(retryError)} — resources were provisioned but not recorded; run deploy again to reconcile.`);
|
|
44692
|
+
this.logger.warn(safeMsg`Failed to save state after output resolution failure: ${asIsMessage(retryError instanceof Error ? retryError.message : String(retryError))} — resources were provisioned but not recorded; run deploy again to reconcile.`);
|
|
44582
44693
|
}
|
|
44583
44694
|
}
|
|
44584
44695
|
}
|
|
@@ -45892,7 +46003,7 @@ function inheritedProvenanceForChildDiff(args) {
|
|
|
45892
46003
|
const TAIL_WARM_CONNECTIONS = 3;
|
|
45893
46004
|
async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
45894
46005
|
const startTime = Date.now();
|
|
45895
|
-
this.logger.debug(`Starting deployment for stack: ${stackName}`);
|
|
46006
|
+
this.logger.debug(safeMsg`Starting deployment for stack: ${displayStackName(stackName)}`);
|
|
45896
46007
|
const renderer = getLiveRenderer();
|
|
45897
46008
|
this.interrupted = false;
|
|
45898
46009
|
this.interruptCause = null;
|
|
@@ -45938,7 +46049,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
45938
46049
|
refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
45939
46050
|
this.provenanceBaseline = provenanceBaselineOf(currentState, isKnownTokenFreeState(currentStateData?.state));
|
|
45940
46051
|
const migrationPending = currentStateData?.migrationPending ?? false;
|
|
45941
|
-
this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
|
|
46052
|
+
this.logger.debug(safeMsg`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
|
|
45942
46053
|
if (this.options.onCurrentStateLoaded) {
|
|
45943
46054
|
const gate = this.options.onCurrentStateLoaded(stackName, currentStateData?.state);
|
|
45944
46055
|
if (currentStateData === null || currentStateData === void 0) {
|
|
@@ -45964,10 +46075,10 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
45964
46075
|
};
|
|
45965
46076
|
if (journal && journal.segments.length > 0) {
|
|
45966
46077
|
const failedOnly = journal.segments.every((s) => s.operations.length === 0) && journal.segments.some((s) => (s.failedOperations?.length ?? 0) > 0);
|
|
45967
|
-
this.logger.info(failedOnly ? `A previous deploy of ${displayStackName(stackName)} failed and was automatically rolled back. The failed resource may be partially applied — revert it, or continue deploying to fix forward (${this.options.parentStackInfo ? "a successful deploy of the top-level stack clears this note" : "a successful deploy clears this note"})
|
|
46078
|
+
this.logger.info(failedOnly ? safeMsg`A previous deploy of ${displayStackName(stackName)} failed and was automatically rolled back. ` + `The failed resource may be partially applied — revert it, or continue ` + safeMsg`deploying to fix forward (${this.options.parentStackInfo ? "a successful deploy of the top-level stack clears this note" : "a successful deploy clears this note"}).` + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
|
|
45968
46079
|
value: stackName,
|
|
45969
46080
|
hole: "stack"
|
|
45970
|
-
}, { literal: "--revert-failed" }]).command}` : `A previous deploy of ${displayStackName(stackName)} failed or was interrupted. Revert it, or continue deploying to fix forward
|
|
46081
|
+
}, { literal: "--revert-failed" }]).command}` : safeMsg`A previous deploy of ${displayStackName(stackName)} failed or was interrupted. Revert it, ` + `or continue deploying to fix forward.` + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
|
|
45971
46082
|
value: stackName,
|
|
45972
46083
|
hole: "stack"
|
|
45973
46084
|
}]).command}`);
|
|
@@ -45975,13 +46086,13 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
45975
46086
|
} catch {}
|
|
45976
46087
|
this.stampReasonlessParameterRefusals(currentState.resources, template);
|
|
45977
46088
|
this.kickOffAutoRefreshObservedProperties(currentState.resources, currentState);
|
|
45978
|
-
this.logger.debug(`Template has ${Object.keys(template.Resources || {}).length} resources`);
|
|
46089
|
+
this.logger.debug(safeMsg`Template has ${Object.keys(template.Resources || {}).length} resources`);
|
|
45979
46090
|
const outputsDigestSource = structuredClone({
|
|
45980
46091
|
...template,
|
|
45981
46092
|
Resources: {}
|
|
45982
46093
|
});
|
|
45983
46094
|
const parameterValues = await this.resolver.resolveParameters(template, this.options.parameters, { ...this.options.inheritedSecrets && hasMaskableValues(this.options.inheritedSecrets) && { inheritedSecrets: this.options.inheritedSecrets } });
|
|
45984
|
-
this.logger.debug(`Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(", ")}`);
|
|
46095
|
+
this.logger.debug(safeMsg`Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(", ")}`);
|
|
45985
46096
|
poisonRenderedSpellingsCollidingIn(template, parameterValues, this.options.inheritedSecrets);
|
|
45986
46097
|
this.inheritedNoEchoParameters = /* @__PURE__ */ new Set([...this.freshNoEchoParameters(parameterValues) ?? [], ...this.options.passedNoEchoParameters ?? []]);
|
|
45987
46098
|
const backfillNoEchoValues = noEchoParameterValueSeed(template.Parameters, parameterValues, this.options.inheritedSecrets, this.options.parameters);
|
|
@@ -46001,7 +46112,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46001
46112
|
parameters: parameterValues
|
|
46002
46113
|
}, stackName);
|
|
46003
46114
|
const conditions = await this.resolver.evaluateConditions(context);
|
|
46004
|
-
this.logger.debug(`Evaluated ${Object.keys(conditions).length} conditions: ${Object.keys(conditions).join(", ")}`);
|
|
46115
|
+
this.logger.debug(safeMsg`Evaluated ${Object.keys(conditions).length} conditions: ${Object.keys(conditions).join(", ")}`);
|
|
46005
46116
|
refuseNoValueOutputs(template.Outputs, conditions);
|
|
46006
46117
|
let conditionVerdicts;
|
|
46007
46118
|
if (conditionsReadByDiff(template, conditions).size > 0) {
|
|
@@ -46039,7 +46150,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46039
46150
|
this.logger.debug(`All resource properties validated`);
|
|
46040
46151
|
const dag = this.dagBuilder.buildGraph(effectiveTemplate);
|
|
46041
46152
|
const executionLevels = this.dagBuilder.getExecutionLevels(dag);
|
|
46042
|
-
this.logger.debug(`Dependency graph: ${executionLevels.length} execution levels`);
|
|
46153
|
+
this.logger.debug(safeMsg`Dependency graph: ${executionLevels.length} execution levels`);
|
|
46043
46154
|
const diffResolverContext = this.buildResolverContext({
|
|
46044
46155
|
template: effectiveTemplate,
|
|
46045
46156
|
resources: currentState.resources,
|
|
@@ -46139,8 +46250,8 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46139
46250
|
const outputsChanged = !outputMapsEqual(persistedOutputs, outputsToPersist);
|
|
46140
46251
|
const persistExportSet = new Set(exportNamesToPersist ?? []);
|
|
46141
46252
|
const exportSetChanged = exportNamesToPersist !== void 0 && (currentEffectiveExports.size !== persistExportSet.size || [...persistExportSet].some((k) => !currentEffectiveExports.has(k)));
|
|
46142
|
-
if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} A downstream Fn::ImportValue may fail until the next deploy
|
|
46143
|
-
else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path)
|
|
46253
|
+
if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(safeMsg`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} ` + "A downstream Fn::ImportValue may fail until the next deploy.");
|
|
46254
|
+
else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(safeMsg`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), ` + "carried export aliases included, that could not be resolved (no-change path)");
|
|
46144
46255
|
const skippedOutputsChanged = !skippedOutputsEqual(currentState.skippedOutputs, this.skippedOutputs);
|
|
46145
46256
|
const healedAttributesPending = this.hasUnpersistedHeals(currentState.resources);
|
|
46146
46257
|
const conditionVerdictsChanged = !conditionVerdictRecordsEqual(readRecordedConditionVerdicts(currentState), conditionVerdicts);
|
|
@@ -46179,7 +46290,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46179
46290
|
else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path)");
|
|
46180
46291
|
else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path)");
|
|
46181
46292
|
} catch (saveError) {
|
|
46182
|
-
this.logger.warn(`Failed to persist no-change state update: ${saveError instanceof Error ? saveError.message : String(saveError)} — drift baseline / outputs will be re-resolved on next deploy.`);
|
|
46293
|
+
this.logger.warn(safeMsg`Failed to persist no-change state update: ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))} — drift baseline / outputs will be re-resolved on next deploy.`);
|
|
46183
46294
|
}
|
|
46184
46295
|
}
|
|
46185
46296
|
return {
|
|
@@ -46198,7 +46309,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46198
46309
|
const createChanges = this.diffCalculator.filterByType(changes, "CREATE");
|
|
46199
46310
|
const updateChanges = this.diffCalculator.filterByType(changes, "UPDATE");
|
|
46200
46311
|
const deleteChanges = this.diffCalculator.filterByType(changes, "DELETE");
|
|
46201
|
-
this.logger.info(`Changes: ${green(createChanges.length)} to create, ${yellow(updateChanges.length)} to update, ${red(deleteChanges.length)} to delete`);
|
|
46312
|
+
this.logger.info(safeMsg`Changes: ${green(createChanges.length)} to create, ${yellow(updateChanges.length)} to update, ${red(deleteChanges.length)} to delete`);
|
|
46202
46313
|
if (this.options.dryRun) {
|
|
46203
46314
|
this.logger.info("Dry run mode - skipping actual deployment");
|
|
46204
46315
|
return {
|
|
@@ -46277,7 +46388,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46277
46388
|
...newState,
|
|
46278
46389
|
conditionVerdicts
|
|
46279
46390
|
} : newState)), flushKeptForReadoption(this)]);
|
|
46280
|
-
this.logger.debug(`State saved (ETag: ${newEtag})`);
|
|
46391
|
+
this.logger.debug(safeMsg`State saved (ETag: ${newEtag})`);
|
|
46281
46392
|
const ledgerAndKeptCleanup = (async () => {
|
|
46282
46393
|
await forgetRecordedCreateTokens(Object.keys(newState.resources));
|
|
46283
46394
|
const readopted = await this.generatedNameGuard?.readoptedFromRetained() ?? [];
|
|
@@ -46338,7 +46449,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
46338
46449
|
await this.lockManager.releaseLock(stackName, this.stackRegion);
|
|
46339
46450
|
this.logger.debug("Lock released");
|
|
46340
46451
|
} catch (lockError) {
|
|
46341
|
-
this.logger.warn(`Failed to release lock: ${lockError instanceof Error ? lockError.message : String(lockError)}`);
|
|
46452
|
+
this.logger.warn(safeMsg`Failed to release lock: ${asIsMessage(lockError instanceof Error ? lockError.message : String(lockError))}`);
|
|
46342
46453
|
}
|
|
46343
46454
|
}
|
|
46344
46455
|
}
|
|
@@ -46493,7 +46604,7 @@ function addImplicitDeleteDependencies(deleteIds, state, dependedBy) {
|
|
|
46493
46604
|
if (!dependedBy.has(id)) dependedBy.set(id, /* @__PURE__ */ new Set());
|
|
46494
46605
|
if (!dependedBy.get(id).has(depId)) {
|
|
46495
46606
|
dependedBy.get(id).add(depId);
|
|
46496
|
-
this.logger.debug(`Implicit delete dependency: ${depId} (${depType}) must be deleted before ${id} (${resource.resourceType})`);
|
|
46607
|
+
this.logger.debug(safeMsg`Implicit delete dependency: ${depId} (${depType}) must be deleted before ${id} (${resource.resourceType})`);
|
|
46497
46608
|
}
|
|
46498
46609
|
}
|
|
46499
46610
|
}
|
|
@@ -46507,7 +46618,7 @@ function addImplicitDeleteDependencies(deleteIds, state, dependedBy) {
|
|
|
46507
46618
|
if (!dependedBy.has(after)) dependedBy.set(after, /* @__PURE__ */ new Set());
|
|
46508
46619
|
if (!dependedBy.get(after).has(before)) {
|
|
46509
46620
|
dependedBy.get(after).add(before);
|
|
46510
|
-
this.logger.debug(`Implicit delete dependency: ${before} (${scoped[before]?.resourceType}) must be deleted before ${after} (${scoped[after]?.resourceType})`);
|
|
46621
|
+
this.logger.debug(safeMsg`Implicit delete dependency: ${before} (${scoped[before]?.resourceType}) must be deleted before ${after} (${scoped[after]?.resourceType})`);
|
|
46511
46622
|
}
|
|
46512
46623
|
}
|
|
46513
46624
|
}
|
|
@@ -46572,6 +46683,7 @@ var DeployEngine = class {
|
|
|
46572
46683
|
noEchoExactEchoes = /* @__PURE__ */ new Map();
|
|
46573
46684
|
noEchoAttributeReads = /* @__PURE__ */ new Map();
|
|
46574
46685
|
replacedDeleteSkips = /* @__PURE__ */ new Map();
|
|
46686
|
+
deferredReplacedDeletes = void 0;
|
|
46575
46687
|
secretNameNeedles = /* @__PURE__ */ new Map();
|
|
46576
46688
|
perResourceTemplateProps = /* @__PURE__ */ new Map();
|
|
46577
46689
|
perResourceResolvedType = /* @__PURE__ */ new Map();
|
|
@@ -46649,6 +46761,7 @@ var DeployEngine = class {
|
|
|
46649
46761
|
this.noEchoExactEchoes = /* @__PURE__ */ new Map();
|
|
46650
46762
|
this.noEchoAttributeReads = /* @__PURE__ */ new Map();
|
|
46651
46763
|
this.replacedDeleteSkips = /* @__PURE__ */ new Map();
|
|
46764
|
+
this.deferredReplacedDeletes = void 0;
|
|
46652
46765
|
this.secretNameNeedles = /* @__PURE__ */ new Map();
|
|
46653
46766
|
this.perResourceTemplateProps = /* @__PURE__ */ new Map();
|
|
46654
46767
|
this.constructPathTemplate = void 0;
|
|
@@ -46885,6 +46998,8 @@ DeployEngine.prototype.typeChangeNameQuestion = typeChangeNameQuestion;
|
|
|
46885
46998
|
DeployEngine.prototype.checkedReplacementNameChange = checkedReplacementNameChange;
|
|
46886
46999
|
DeployEngine.prototype.createFirstThenDeleteOld = createFirstThenDeleteOld;
|
|
46887
47000
|
DeployEngine.prototype.deleteReplacedAfterCreate = deleteReplacedAfterCreate;
|
|
47001
|
+
DeployEngine.prototype.retryDeferredReplacedDeletes = retryDeferredReplacedDeletes;
|
|
47002
|
+
DeployEngine.prototype.warnUnretriedReplacedDeletes = warnUnretriedReplacedDeletes;
|
|
46888
47003
|
DeployEngine.prototype.diffLogMasker = diffLogMasker;
|
|
46889
47004
|
DeployEngine.prototype.freshNoEchoParameters = freshNoEchoParameters;
|
|
46890
47005
|
DeployEngine.prototype.redactParametersForDiff = redactParametersForDiff;
|
|
@@ -46939,4 +47054,4 @@ DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice
|
|
|
46939
47054
|
|
|
46940
47055
|
//#endregion
|
|
46941
47056
|
export { S3_AUTO_DELETE_OBJECTS_TAG as $, unwrittenCreateOnlyReplacement as $a, getLegacyStateBucketName as $c, malformedExportSourceWarning as $i, formatDestructiveChange as $n, recordLogOnlyParameterValue as $o, explicitRoleArnOrThrow as $r, hasReadableExportSet as $s, replacementNeverSwapped as $t, diffSecurity as A, refuseMalformedResourceEntriesForImport as Aa, describeDockerExecFailure as Ac, cfnRefValueFromPhysicalId as Ai, absoluteAssemblyPathEscape as Al, DEFAULT_RESOURCE_WARN_AFTER_MS as An, sameLambdaFunctionAddress as Ao, RollbackInlinePolicyWriters as Ar, recordNoEchoParameterFreshValue as As, withNestedStackContext as At, readProtection as B, refuseMalformedState as Ba, redactedCause as Bc, STATE_RESOURCES_MALFORMED as Bi, extractDeploymentEventError as Bn, noEchoLeavesOf as Bo, isTerminationProtectionPropagationError as Br, isLockInfoExpired as Bs, awaitInFlightSibling as Bt, withApiLimit as C, refuseMalformedOrphansForOrphan as Ca, readBootstrapMarkerBody as Cc, getAccountInfo as Ci, StageLoadError as Cl, isWholeDynamicReferenceValue as Cn, requireConfigString as Co, withPrintingSecrets as Cr, recordPhysicalNameCopy as Cs, nestedChildStackName as Ct, findServiceTokenRefusals as D, refuseMalformedResourceEntries as Da, buildDockerImage as Dc, isNamelessDynamicReferenceError as Di, hasPlainPrototype$1 as Dl, isExportAliasCollision as Dn, withRetry as Do, CloudControlProvider as Dr, recordMaskOnlyValue as Ds, withNestedRevertRun as Dt, deferredServiceTokenWarning as E, refuseMalformedResourceAttributesForOrphan as Ea, buildDenyExternalAccessPolicy as Ec, carriesFetchableDynamicReference as Ei, hasOwnKey as El, collectPublishedOutputNames as En, describeTypeWithThrottleRetry as Eo, customResourceResponseExpirationWarning as Er, provenPublicValue as Es, revertedNestedRowIds as Et, recordedProtectionEvidence as F, refuseMalformedResourcePropertiesForExport as Fa, getDockerCmd as Fc, parameterInputsFor as Fi, injectAwsRegion as Fl, secretNamePrintingBag as Fn, maskAtCoordinates as Fo, withIndeterminateGuard as Fr, STATE_SOURCED_READBACK_RULES as Fs, loadJournaledOrphans as Ft, deleteBudgetKey as G, repairMalformedResourcePropertiesForReadOnly as Ga, escapeRegExp$3 as Gc, displayLogicalId as Gi, createPreDeleteFinalSnapshot as Gn, valueAtCoordinate as Go, INTRINSIC_KEYS as Gr, applyCrossPrefixScan as Gs, recordAfterRollbackUpdate as Gt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as H, repairMalformedOrphansForReadOnly as Ha, runDockerForeground as Hc, UNREADABLE_RESOURCES_MAP_ROW as Hi, PRE_DELETE_SNAPSHOT_TYPES as Hn, passedNoEchoParametersOf as Ho, reDisableInstanceApiTermination as Hr, rebuildClientForBucketRegion as Hs, getStackRecords as Ht, recordedProtectionNote as I, refuseMalformedResourcePropertiesForOrphan as Ia, isDockerClientEnvKey as Ic, passedParameterClassesOf as Ii, injectedAwsRegionValue as Il, secretNamePrintingBags as In, maskReadbackAtCoordinates as Io, isWaitAbandonedError as Ir, TEMPLATE_SOURCED_RULES as Is, makeForeignHolderScan as It, DELETE_INDEX_WAIT_PROCEED_NOTE as J, unreadableOrphanRecords as Ja, AssetManifestLoader as Jc, hasReadableResources as Ji, refusesFinalSnapshot as Jn, createUnionSecretMasker as Jo, producerLookupOver as Jr, isNotImplemented as Js, isReplacementOrphan as Jt, resolveDynamoDbDeleteBudgetClock as K, repairMalformedResourcesForReadOnly as Ka, stripControlChars as Kc, hasReadableOrphans as Ki, effectiveDeletionPolicy as Kn, liveMatchesUnresolvedTokenFrame as Ko, IntrinsicFunctionResolver as Kr, crossPrefixDeniedWarning as Ks, demoteSupersededOrphans as Kt, PROTECTION_PROPERTY_BY_TYPE as L, refuseMalformedResourcesForDeploy as La, isMalformedEnvKey as Lc, declaresNoEcho as Li, clearBucketRegionCache as Ll, secretNamedRecordNeedles as Ln, maskWholeValue as Lo, markWaitAbandoned as Lr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ls, sameJournaledOrphans as Lt, noEchoComparisonForTemplate as M, refuseMalformedResourceEntriesForOrphan as Ma, dockerSpawnEnvWithSensitive as Mc, refStateLookupFromResource as Mi, displayAssemblyPath as Ml, journaledOrphanPrintingBag as Mn, TemplateParser as Mo, deleteIndeterminateGuards as Mr, wholeStringLeavesOf as Ms, dropFailedHint as Mt, noEchoExactEchoLeavesOf as N, refuseMalformedResourcePropertiesForDestroy as Na, finchSecretArgvRefusal as Nc, parseWebACLArn as Ni, renderAssemblyPathEscape as Nl, maskEventTextWithBoundBags as Nn, canonicalCoordinates as No, deleteLeftInPlace as Nr, STATE_SOURCED_BASELINE_RULES as Ns, isHandledOrphan as Nt, serviceTokenBlockingReason as O, refuseMalformedResourceEntriesForDeploy as Oa, resolveDockerContextDirectory as Oc, keepsSecretReferenceToken as Oi, nullPrototypeRecord as Ol, bindingSkippedOutputs as On, canonicalLambdaFunctionName as Oo, slowCcOperationTimeoutMs as Or, recordMaskOnlyValuesIn as Os, collectNestedChildUnaddressed as Ot, noEchoParameterNamesOf as P, refuseMalformedResourcePropertiesForDrift as Pa, formatDockerLoginError as Pc, withSharedDrainBudget as Pi, resolveAssemblyPath as Pl, orphanRecordsPrintingBag as Pn, isMarkedCoordinate as Po, deleteSkipReason as Pr, STATE_SOURCED_CROSS_GENERATION_RULES as Ps, journaledOrphanLines as Pt, ECR_AUTO_DELETE_IMAGES_TAG as Q, findSilentDropProperties as Qa, getDefaultStateBucketName as Qc, malformedExportNamesWarning as Qi, findDestructiveChanges as Qn, printingCorpusOf as Qo, assertSendableRoleArn as Qr, exportNamesCarriedFrom as Qs, recordUnderIdIsNotOwn as Qt, isProtectionValueActive as R, refuseMalformedResourcesForDestroy as Ra, partitionSensitiveEnv as Rc, JSON_LISTING_HOLE_VALUE as Ri, resolveBucketRegion as Rl, stateSecretNameNeedles as Rn, maskedLeafCoordinatesOf as Ro, disableInstanceApiTermination as Rr, isSingleDynamicReferenceToken as Rs, replayFailedOperations as Rt, lookupEachName as S, refuseMalformedOrphansForDestroy as Sa, parseBootstrapMarker as Sc, parameterTypeMayLoseSecretIdentity as Si, AssemblyReader as Sl, exportNameSecretExposure as Sn, requireConfigObject as So, getCurrentResourceSecrets as Sr, recordAttributeIdCopy as Ss, getNestedRevertRun as St, recordRetainedForReadoption as T, refuseMalformedOutputsForDestroy as Ta, validateContainerRepoName as Tc, carriesDynamicReference as Ti, defineOwnKey as Tl, collectDeclaredOutputNames as Tn, templateResourceTypes as To, applyCustomResourceResponseExpiration as Tr, carriesSecretMask as Ts, revertNestedChildFromJournal as Tt, beginDeleteWait as U, repairMalformedOutputsForReadOnly as Ua, runDockerStreaming as Uc, accountArgs as Ui, buildFinalSnapshotIdentifier as Un, readbackPathFor as Uo, reEnableInstanceApiTermination as Ur, CrossPrefixReadError as Us, withStackRecords as Ut, DynamoDBGlobalTableProvider as V, repairMalformedOrphanRecordsForReadOnly as Va, redactedDockerCause as Vc, UNREADABLE_ORPHANS_CONTAINER_ROW as Vi, ATOMIC_FINAL_SNAPSHOT_TYPES as Vn, noEchoOutputsComparison as Vo, observeThenDisableInstanceApiTermination as Vr, S3StateBackend as Vs, destroyStackRecordsView as Vt, compensateRemovedDeletionProtection as W, repairMalformedResourceEntriesForReadOnly as Wa, warnFinchArgvExposure as Wc, deployRefusesOrphanRowsReason as Wi, ccRoutedFinalSnapshotError as Wn, readsNoEchoSource as Wo, DiffCalculator as Wr, CrossPrefixScanCache as Ws, removeProtectionTypeList as Wt, deleteTableWithIndexBusyRetry as X, withheldAccountClause as Xa, Synthesizer as Xc, isReadableResourceEntry as Xi, maskingRetryLogger as Xn, literalSplitDelimitersOf as Xo, applyRoleArnIfSet as Xr, acceptedCreateOnlyDropsOf as Xs, planRollback as Xt, INDEX_SETTLE_POLL_INTERVAL_MS as Y, unreadableResourceEntries as Ya, getDockerImageBySourceHash as Yc, isReadableOrphanRecord as Yi, unsupportedFinalSnapshotError as Yn, hasMaskableValues as Yo, refuseUnreadableCdkCrossAccountRefs as Yr, splitImportedOps as Ys, planFailedOps as Yt, waitForIndexesSettled as Z, findActionableSilentDrops as Za, synthesisStatusMessage as Zc, malformedDriftResourcePropertiesWarning as Zi, constructPathOf as Zn, logOnlyValueCount as Zo, assertFlagRoleArn as Zr, describeRegionValueKind as Zs, recheckFailedPlan as Zt, keptWholeReasonText as _, refuseDivergentRecordRegionForDestroy as _a, BOOTSTRAP_MARKER_PREFIX as _c, classifyReplaySecretRegion as _i, decodeListingKey as _l, secretBearing as _n, configIntegerRefusal as _o, isCustomResource as _r, identityKeyFor as _s, planOrphanAdoption as _t, inheritedProvenanceForChildDiff as a, malformedOrphanRowsKeptWarning as aa, orphansAfterRollback as ac, envCredentialsAreAssumedRole as ai, resolveStateBucketWithDefault as al, inheritProducerRegions as an, MULTI_REGION_RECREATE_BLOCKED_TYPES as ao, DBPROXY_TAGS_WHAT as ar, maskSecretsInText as as, createReadOnlyAttributeHealerFactory as at, chunks as b, refuseMalformedOrphanRecordsForDestroy as ba, getBootstrapMarkerKey as bc, coerceParameterTypedValue as bi, canonicalizeRegion as bl, carriedExportAliasExposure as bn, replayWarn as bo, readsNoEchoDeleteValues as br, recoverMaskedOutput as bs, displacedPhysicalIdShown as bt, isAbsoluteAssetPath as c, malformedOutputsRefusalMessage as ca, AssetPublisher as cc, outputReferenceProvenanceOf as ci, stateBucketExistenceConfirmed as cl, redactedDeleteAddressFields as cn, renderStatefulReason as co, readTagList as cr, snapshotPassProvenance as cs, gray as ct, templateIdentity as d, malformedResourceEntriesWarning as da, WorkGraph as dc, s3BucketArn as di, CFN_TEMPLATE_BODY_LIMIT as dl, updatePartialReason as dn, isWarmThroughputDecrease as do, tagPlanWarning as dr, withPhysicalNameCopies as ds, yellow as dt, malformedLocalOutputsWarning as ea, hasReasonlessBaselineRefusal as ec, isIamRoleArn as ei, loadCdkJson as el, resolveReplacementOldType as en, withoutSilentDropProperties as eo, earliestDefined as er, recordLogOnlyValue as es, hasCdkAutoDeleteTag as et, conditionFingerprint as f, malformedResourcePropertiesWarning as fa, buildAssetRedirectMap as fc, s3BucketDomainName as fi, CFN_TEMPLATE_URL_LIMIT as fl, DeploymentEventsReader as fn, toCfnInteger as fo, definedAttributes as fr, withoutPhysicalNameCopies as fs, computeParameterTaint as ft, isSecretBearingReferenceString as g, previewableOrphanRecords as ga, AssetModeResolver as gc, classifyRecordedSecretRegion as gi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as gl, exportAliasCollisionScrubWarning as gn, configBooleanRefusal as go, ccBrokenReason as gr, pathCrossesDottedKey as gs, makeSiblingClaimReader as gt, readRecordedConditionVerdicts as h, malformedStateRefusalMessage as ha, rewriteTemplateAssetReferences as hc, s3BucketWebsiteUrl as hi, uploadCfnTemplate as hl, displayTextOrWithheld as hn, coerceCfnInteger as ho, ProviderRegistry as hr, isUncertifiedBaselineMaskPosition as hs, resourcesNamingDeclaredParameter as ht, crossStackOutputProvenanceSource as i, malformedOrphanRecordsWarning as ia, isReadableBag as ic, callerEnvCredentials as ii, resolveSkipPrefix as il, getCurrentProducerRegions as in, shownType as io, acquireIdempotencyToken as ir, maskSecretsInError as is, formatResourceLine as it, noEchoAttributeNamesOf as j, refuseMalformedResourceEntriesForImportSave as ja, describeDockerFailure as jc, isStalePlaceholderArnAttribute as ji, describeFileReadFailure as jl, completedReplayEntries as jn, DagBuilder as jo, UNSPECIFIED_SKIP_REASON as jr, recordProvenPublicExpression as js, deleteJournaledOrphans as jt, withResourceDeadline as k, refuseMalformedResourceEntriesForDestroy as ka, describeDockerCapturedOutput as kc, AWS_NO_VALUE as ki, ownValue as kl, DEFAULT_RESOURCE_TIMEOUT_MS as kn, lambdaFunctionNameForMask as ko, unchangedBehindSecretReference as kr, recordNoEchoAttributeValues as ks, getCurrentNestedStackContext as kt, listNestedTemplateRows as l, malformedOutputsWarning as la, isSensitiveAttributeName as lc, recordedOutputReferenceRegions as li, warnDeprecatedNoPrefixCliFlag as ll, redactedDeleteAddressSkip as ln, WARM_THROUGHPUT_MEMBERS as lo, refuseMalformedDesiredTags as lr, redactSecretsForState as ls, green as lt, parentSuppliedValues as m, malformedScrubResourceEntriesRefusalMessage as ma, loadPublishableAssetManifest as mc, s3BucketRegionalDomainName as mi, findLargeInlineResources as ml, WITHHELD_NAME_DISPLAY as mn, coerceCfnBoolean as mo, CC_BROKEN_REASON as mr, dynamicReferenceTokens as ms, reachableDivergentParameters as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedLocalResourcesWarning as na, importableOutputKeys as nc, AWS_CREDENTIAL_ENV_KEYS as ni, resolveAutoAssetStorage as nl, orphanDeleteNeedsIdentity as nn, hasNoCloudControlHandlers as no, reserveStackCreateToken as nr, createSecretMasker as ns, getPriorAttempts as nt, childTemplateLoader as o, malformedOrphansRefusalMessage as oa, orphansCarriedFrom as oc, isSettledInstanceState as oi, resolveStateBucketWithDefaultAndSource as ol, REDACTED_DELETE_ADDRESS_SKIP_REASON as on, isStatefulRecreateTargetForReplace as oo, DBPROXY_TAG_OPTIONS as or, markSameGenerationBag as os, bold as ot, conditionInputsFrom as p, malformedResourcesWarning as pa, createAssetRedirectResolver as pc, s3BucketDualStackDomainName as pi, MIGRATE_TMP_PREFIX as pl, DeploymentEventsStore as pn, toFiniteNumber as po, stringifyIfAssigned as pr, DYNAMIC_REFERENCE_TOKEN_SCAN as ps, namesAnyDeclaredParameter as pt, resolveDynamoDbDeleteBudgetMs as q, unpreviewableOrphanRecords as qa, stripForDisplay as qc, hasReadableOutputs as qi, isFinalSnapshotError as qn, carryLogOnlyValues as qo, poisonRenderedSpellingsCollidingIn as qr, isAccessDenied$1 as qs, isJournaledOrphan as qt, computeImplicitDeleteEdges as r, malformedOrphanRecordsRefusalMessage as ra, importableOutputs as rc, applyCallerIdentityCredentials as ri, resolveCaptureObservedState as rl, findNestedStackTypeChanges as rn, findReplacedReadersOfRecreateTargets as ro, withCreateTokenLedger as rr, errorCauseChain as rs, markRefusedBeforeApplying as rt, findNestedTemplateTreeDefect as s, malformedOrphansWarning as sa, shouldRetainResource as sc, keepHeldTokenProvenance as si, resolveUseCdkBootstrapAssets as sl, isRedactedRecordedValue as sn, isStatefulRecreateTargetSync as so, planTagDiff as sr, recordReferenceProvenanceEntry as ss, cyan as st, DeployEngine as t, malformedLocalResourceEntriesWarning as ta, hasUnverifiableParameterRefusal as tc, sendableAssumeRoleCommand as ti, resolveApp as tl, seedsDeleteFirstGuard as tn, NO_CC_HANDLERS_REASON as to, ledgerForStack as tr, shareLogOnlyValues as ts, isTruthyCfnBoolean as tt, renderNestedTemplateTreeDefect as u, malformedRenderedContainersWarning as ua, stringifyValue as uc, recordedReferenceRegions as ui, ssmResolvedValueType as ul, updatePartialMessage as un, coerceWarmThroughput as uo, tagMapAsList as ur, scrubResourceRecord as us, red as ut, mergeNoChangeOutputs as v, refuseMalformedNestedChildOutputs as va, assertAssetBucketRegion as vc, producerRegionsFromState as vi, expectedOwnerParam as vl, secretBearingStateKeyWarning as vn, configStringRefusal as vo, wouldReturnToSdkProvider as vr, inheritNestedStackParameterAssociations as vs, NESTED_PENDING_PARENT_REASON as vt, keptForReadoption as w, refuseMalformedOutputs as wa, validateAssetBucketName as wc, isImpossibleEmptyStoredAttribute as wi, processStackMessages as wl, noEchoParameterValueSeed as wn, prefetchCreateOnlyPropertyPaths as wo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as wr, splitGetAttStringForm as ws, recordDisplacedSkips as wt, isAccessDeniedError as x, refuseMalformedOrphans as xa, isCrossRegionRedirect as xc, isUnboundTemplateParameter as xi, derivePartitionAndUrlSuffix as xl, exportNameNoEchoParameters as xn, requireConfigArray as xo, isCustomResourceType as xr, physicalNameCopiesOf as xs, dropSettledNestedJournals as xt, makeCanonicalizePropertiesFn as y, refuseMalformedOrphanRecords as ya, ensureAssetStorage as yc, regionLessSecretName as yi, PARTITION_TABLE as yl, secretSafeKeyDisplay as yn, readConfigString as yo, TemplateNoEchoReresolver as yr, recordNestedStackParameterExpressions as ys, displacedOpClause as yt, perType as z, refuseMalformedResourcesForExport as za, redactDockerArgvValues as zc, STATE_REGION_DIVERGED as zi, storedSecretNameNeedles as zn, noEchoCoordinatesOf as zo, ec2InstanceProtectionSite as zr, LockManager as zs, replayRollback as zt };
|
|
46942
|
-
//# sourceMappingURL=deploy-engine-
|
|
47057
|
+
//# sourceMappingURL=deploy-engine-D6CSo8Gj.js.map
|