@go-to-k/cdkd 0.307.0 → 0.308.1
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-oKlrkJeO.js → asg-provider-B7pAjRIc.js} +3 -3
- package/dist/{asg-provider-oKlrkJeO.js.map → asg-provider-B7pAjRIc.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{db-instance-modify-retry-DOJPkECL.js → db-instance-modify-retry-BUG7NMWS.js} +3 -3
- package/dist/{db-instance-modify-retry-DOJPkECL.js.map → db-instance-modify-retry-BUG7NMWS.js.map} +1 -1
- package/dist/{deploy-engine-BOgsnnk0.js → deploy-engine-CDjAtIrn.js} +1542 -280
- package/dist/deploy-engine-CDjAtIrn.js.map +1 -0
- package/dist/{iam-policy-targets-TFGunWmV.js → iam-policy-targets-D94wh05t.js} +5 -2
- package/dist/{iam-policy-targets-TFGunWmV.js.map → iam-policy-targets-D94wh05t.js.map} +1 -1
- package/dist/{iam-role-provider-DfDYgfqK.js → iam-role-provider-DbtvFel_.js} +3 -3
- package/dist/{iam-role-provider-DfDYgfqK.js.map → iam-role-provider-DbtvFel_.js.map} +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/{neptune-provider-DvuvSkfJ.js → neptune-provider-Y3Ii8oYI.js} +22 -15
- package/dist/neptune-provider-Y3Ii8oYI.js.map +1 -0
- package/dist/{program-DU5UlgkO.js → program-Ymf7svYk.js} +25 -8
- package/dist/program-Ymf7svYk.js.map +1 -0
- package/dist/{provider-classes-CPMW_2-R.js → provider-classes-BxfIHcea.js} +2645 -1476
- package/dist/provider-classes-BxfIHcea.js.map +1 -0
- package/dist/{rds-provider-DcBsBQLi.js → rds-provider-CZhBLQgJ.js} +49 -22
- package/dist/rds-provider-CZhBLQgJ.js.map +1 -0
- package/dist/{version-Dhhyrf1v.js → version-BWqrjGBS.js} +2 -2
- package/dist/{version-Dhhyrf1v.js.map → version-BWqrjGBS.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-BOgsnnk0.js.map +0 -1
- package/dist/neptune-provider-DvuvSkfJ.js.map +0 -1
- package/dist/program-DU5UlgkO.js.map +0 -1
- package/dist/provider-classes-CPMW_2-R.js.map +0 -1
- package/dist/rds-provider-DcBsBQLi.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { c as __exportAll, r as getAwsClients } from "./aws-clients-Bu9EMILF.js";
|
|
2
2
|
import { A as isNameGeneration, B as SECRET_REF_MAX_CODE_POINTS, D as getCurrentStackInstanceId, E as getCurrentSkipPrefix, F as withSkipPrefix, G as displayAwsMessage, H as UNRENDERABLE, I as withStackScope, J as displayStackName, K as displayIdent, L as withStackScopeBeforeStateRead, N as stackInstanceNameSuffix, O as getCurrentStackName, P as withNameGeneration, Q as safeMsg, R as withoutGeneratedFallbackName, S as fallbackNamePropertyFor, T as generatedNameFor, U as asIsMessage, V as STACK_REF_MAX_CODE_POINTS, Y as isPasteableIdent, Z as plainIdentOr, a as safeStringify$1, c as isStdoutReservedForPayload, et as terminalSafe, f as currentLogLineMasker, j as looksLikeCdkdGeneratedName, m as getLiveRenderer, n as describeAwsFailure, p as installLogLineMaskerSource, q as displaySafe, s as getLogger, t as VERBOSE_POINTER, tt as truncateCodePoints, v as applyDefaultNameForFallback, w as generateResourceNameWithFallback, x as explicitNamePropertyFor, y as currentNameGeneration, z as SAFE_MSG_ALTERED_CHAR } from "./aws-failure-text-NSBdKPYK.js";
|
|
3
|
-
import { $n as isUpdateUnsupportedError, An as StateError, At as carryCreatedBeforeFailure, B as compensateProtectionFlip, Bn as UNSHOWABLE_VALUE, Bt as replayMadeAnotherResource, Cr as markNonRetryable, Ct as createMaskedLogSinks, D as markNotGone, Dn as ResourceUpdateNotSupportedError, Dt as maskerOrIdentity, E as isMarkedNotGone, En as ResourceTimeoutError, Et as maskDeep, F as refusalTypeShown, Fn as normalizeAwsError, Ft as isAuxiliaryFailure, Gn as physicalIdShownBesideCommand, Gt as formatLockExpiry, H as deleteWithProtectionCompensation, Ht as buildForceUnlockCommand, It as isAuxiliaryMarkOf, J as observeThenDisableProtection, Jn as shellBoundedDisplay, Jt as recoveryCommandFlags, K as isTerminalDeleteFailure, Kn as plainOrDescribed, Kt as formatLockOperation, L as resolveExplicitPhysicalId, Lt as markAuxiliaryFailure, M as isQuotableImportValue, Mt as createdBeforeFailure, N as normalizeAwsTagsToCfn, Nt as createdResourceIdentityBeforeFailure, O as assertRegionMatch, Ot as withDerivedNameMasks, P as quotedRemedyLogicalId, Pn as isSoftAbort, Pt as hasCreatedBeforeFailure, Qt as injectiveKey, Rn as SHELL_ACTIVE, Rt as markCreatedBeforeFailure, Sn as MalformedProducerRecordRefusalError, Sr as isThrottlingError, St as stateOrphanRecordRemedy, T as RESOURCE_NOT_FOUND, Tn as ProvisioningError, Tr as wrapMaskedAwsError, Tt as isSecretDerivedValue, Un as isInertUnquoted, Vn as commandHole, Vt as UNREPRODUCIBLE_LOCK_CLAUSE, Wn as pasteableCommand, Xn as withheldTargetClause, Xt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Y as protectionFlipKey, Yn as shellQuote, Yt as sanitizeRecoveryValue, Z as runDeleteAttempt, Zt as DEFAULT_STATE_PREFIX, _n as IntrinsicResolutionRefusalError, _r as isRetryableTransientError, an as ambientCredentialConfig, at as protectedReplacementAdvice, bn as LockError, bt as resourceTypeShown, cn as AccountIdUnavailableError, cr as escapeRegExp$3, ct as monotonicNowMs, d as prepareRemovalForUpdate, er as hasReplayMayCollide, et as DELETION_PROTECTION_DOC_POINTER, f as removalWarning, fn as CrossAccountSecretRefusalError, fr as formatRetryClassificationSignals, ft as isInterruptedWaitError, gn as DynamicReferenceRegionAmbiguousError, gr as isIamPropagationError, gt as compositeIdSeparatorRefusal, hn as DeploymentNotApprovedError, i as holdsSecretDerivedEntry, in as ambientClientDefaults, ir as isReplayedNameCollisionFrom, it as pasteableAwsCommand, jn as SynthesisError, kt as RETRY_AUXILIARY_OWNER, l as withUnchangedSecretPrincipalLists, ln as AssetError, lr as stripControlChars, m as withoutInjectedRemovals, mr as isAmbiguousOutcomeError, mt as canonicalizeRoute53QueryName, nr as isNameCooldownError, on as clientDefaultsFor, or as markReplayMayCollide, pn as DependencyError, pr as isAmbiguousCcHandlerErrorCode, pt as startInterruptWatch, qn as quotedOrDescribed, qt as formatLockOwner, rn as withPasteableAwsProfile, rr as isRecreateRetryableError, sn as credentialFingerprint, sr as relayedNameCollision, st as ElapsedBudgetRegistry, tn as producerRecordKey, tr as isNameCollisionErrorFrom, un as CdkdError, vr as isTransientServerError, vt as logicalIdShown, w as withoutServerErrorRetries, wr as markRedactedCause, wt as createMaskedRetryLogger, xn as MacroExpansionError, xr as isMarkedNonRetryable, xt as segmentAfterAnchor, yr as retryClassificationText, z as ProtectionFlipRegistry, zn as SHELL_ACTIVE_WHY } from "./iam-policy-targets-
|
|
3
|
+
import { $n as isUpdateUnsupportedError, An as StateError, At as carryCreatedBeforeFailure, B as compensateProtectionFlip, Bn as UNSHOWABLE_VALUE, Bt as replayMadeAnotherResource, Cr as markNonRetryable, Ct as createMaskedLogSinks, D as markNotGone, Dn as ResourceUpdateNotSupportedError, Dt as maskerOrIdentity, E as isMarkedNotGone, En as ResourceTimeoutError, Et as maskDeep, F as refusalTypeShown, Fn as normalizeAwsError, Ft as isAuxiliaryFailure, Gn as physicalIdShownBesideCommand, Gt as formatLockExpiry, H as deleteWithProtectionCompensation, Ht as buildForceUnlockCommand, It as isAuxiliaryMarkOf, J as observeThenDisableProtection, Jn as shellBoundedDisplay, Jt as recoveryCommandFlags, K as isTerminalDeleteFailure, Kn as plainOrDescribed, Kt as formatLockOperation, L as resolveExplicitPhysicalId, Lt as markAuxiliaryFailure, M as isQuotableImportValue, Mt as createdBeforeFailure, N as normalizeAwsTagsToCfn, Nt as createdResourceIdentityBeforeFailure, O as assertRegionMatch, Ot as withDerivedNameMasks, P as quotedRemedyLogicalId, Pn as isSoftAbort, Pt as hasCreatedBeforeFailure, Qt as injectiveKey, Rn as SHELL_ACTIVE, Rt as markCreatedBeforeFailure, Sn as MalformedProducerRecordRefusalError, Sr as isThrottlingError, St as stateOrphanRecordRemedy, T as RESOURCE_NOT_FOUND, Tn as ProvisioningError, Tr as wrapMaskedAwsError, Tt as isSecretDerivedValue, Un as isInertUnquoted, Vn as commandHole, Vt as UNREPRODUCIBLE_LOCK_CLAUSE, Wn as pasteableCommand, Xn as withheldTargetClause, Xt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Y as protectionFlipKey, Yn as shellQuote, Yt as sanitizeRecoveryValue, Z as runDeleteAttempt, Zt as DEFAULT_STATE_PREFIX, _n as IntrinsicResolutionRefusalError, _r as isRetryableTransientError, an as ambientCredentialConfig, at as protectedReplacementAdvice, bn as LockError, bt as resourceTypeShown, cn as AccountIdUnavailableError, cr as escapeRegExp$3, ct as monotonicNowMs, d as prepareRemovalForUpdate, er as hasReplayMayCollide, et as DELETION_PROTECTION_DOC_POINTER, f as removalWarning, fn as CrossAccountSecretRefusalError, fr as formatRetryClassificationSignals, ft as isInterruptedWaitError, gn as DynamicReferenceRegionAmbiguousError, gr as isIamPropagationError, gt as compositeIdSeparatorRefusal, hn as DeploymentNotApprovedError, i as holdsSecretDerivedEntry, in as ambientClientDefaults, ir as isReplayedNameCollisionFrom, it as pasteableAwsCommand, jn as SynthesisError, kt as RETRY_AUXILIARY_OWNER, l as withUnchangedSecretPrincipalLists, ln as AssetError, lr as stripControlChars, m as withoutInjectedRemovals, mr as isAmbiguousOutcomeError, mt as canonicalizeRoute53QueryName, nr as isNameCooldownError, on as clientDefaultsFor, or as markReplayMayCollide, pn as DependencyError, pr as isAmbiguousCcHandlerErrorCode, pt as startInterruptWatch, qn as quotedOrDescribed, qt as formatLockOwner, rn as withPasteableAwsProfile, rr as isRecreateRetryableError, sn as credentialFingerprint, sr as relayedNameCollision, st as ElapsedBudgetRegistry, tn as producerRecordKey, tr as isNameCollisionErrorFrom, un as CdkdError, vr as isTransientServerError, vt as logicalIdShown, w as withoutServerErrorRetries, wr as markRedactedCause, wt as createMaskedRetryLogger, xn as MacroExpansionError, xr as isMarkedNonRetryable, xt as segmentAfterAnchor, yr as retryClassificationText, z as ProtectionFlipRegistry, zn as SHELL_ACTIVE_WHY } from "./iam-policy-targets-D94wh05t.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, c as ambientRegion, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as quietS3Logger, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BX9Y_fKp.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-BWqrjGBS.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";
|
|
@@ -11,7 +11,7 @@ import { PublishCommand, SNSClient } from "@aws-sdk/client-sns";
|
|
|
11
11
|
import { GetFunctionCommand, GetFunctionConfigurationCommand, GetFunctionUrlConfigCommand, InvokeCommand, LambdaClient, UpdateFunctionConfigurationCommand, waitUntilFunctionActiveV2, waitUntilFunctionUpdatedV2 } from "@aws-sdk/client-lambda";
|
|
12
12
|
import { AssumeRoleCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
|
|
13
13
|
import { CreateSnapshotCommand, DeleteVolumeCommand, DescribeAvailabilityZonesCommand, DescribeImagesCommand, DescribeInstanceAttributeCommand, DescribeInstancesCommand, DescribeLaunchTemplatesCommand, DescribeNatGatewaysCommand, DescribeRouteTablesCommand, DescribeSecurityGroupsCommand, DescribeSnapshotsCommand, DescribeSubnetsCommand, DescribeVolumesCommand, DescribeVpcsCommand, DescribeVpnGatewaysCommand, EC2Client, ModifyInstanceAttributeCommand } from "@aws-sdk/client-ec2";
|
|
14
|
-
import { CreateTableCommand, DeleteTableCommand, DescribeContinuousBackupsCommand, DescribeContributorInsightsCommand, DescribeKinesisStreamingDestinationCommand, DescribeTableCommand, DescribeTimeToLiveCommand, DynamoDBClient, ListTagsOfResourceCommand, ResourceNotFoundException as ResourceNotFoundException$1, TagResourceCommand as TagResourceCommand$2, UntagResourceCommand as UntagResourceCommand$2, UpdateTableCommand, UpdateTimeToLiveCommand } from "@aws-sdk/client-dynamodb";
|
|
14
|
+
import { CreateTableCommand, DeleteResourcePolicyCommand, DeleteTableCommand, DescribeContinuousBackupsCommand, DescribeContributorInsightsCommand, DescribeKinesisStreamingDestinationCommand, DescribeTableCommand, DescribeTimeToLiveCommand, DisableKinesisStreamingDestinationCommand, DynamoDBClient, EnableKinesisStreamingDestinationCommand, GetResourcePolicyCommand, ListTagsOfResourceCommand, PolicyNotFoundException, PutResourcePolicyCommand, ResourceNotFoundException as ResourceNotFoundException$1, TagResourceCommand as TagResourceCommand$2, UntagResourceCommand as UntagResourceCommand$2, UpdateContinuousBackupsCommand, UpdateContributorInsightsCommand, UpdateKinesisStreamingDestinationCommand, UpdateTableCommand, UpdateTimeToLiveCommand } from "@aws-sdk/client-dynamodb";
|
|
15
15
|
import { CloudFormationClient, CreateChangeSetCommand, DeleteStackCommand, DescribeChangeSetCommand, DescribeStacksCommand, DescribeTypeCommand, GetTemplateCommand, ListExportsCommand, waitUntilChangeSetCreateComplete } from "@aws-sdk/client-cloudformation";
|
|
16
16
|
import { GetRestApiCommand } from "@aws-sdk/client-api-gateway";
|
|
17
17
|
import { DescribeApiDestinationCommand, DescribeConnectionCommand } from "@aws-sdk/client-eventbridge";
|
|
@@ -7845,7 +7845,7 @@ const WHOLE_DYNAMIC_REFERENCE_PATTERN = new RegExp(`^\\{\\{resolve:${DYNAMIC_REF
|
|
|
7845
7845
|
function isSingleDynamicReferenceToken(value) {
|
|
7846
7846
|
return WHOLE_DYNAMIC_REFERENCE_PATTERN.test(value);
|
|
7847
7847
|
}
|
|
7848
|
-
function isPlainObject$
|
|
7848
|
+
function isPlainObject$9(value) {
|
|
7849
7849
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7850
7850
|
}
|
|
7851
7851
|
|
|
@@ -8101,7 +8101,7 @@ function crossStackSourceKey(source) {
|
|
|
8101
8101
|
}
|
|
8102
8102
|
if (key === "Fn::GetStackOutput") {
|
|
8103
8103
|
const args = source[key];
|
|
8104
|
-
if (!isPlainObject$
|
|
8104
|
+
if (!isPlainObject$9(args)) return void 0;
|
|
8105
8105
|
const stackName = Object.hasOwn(args, "StackName") ? literalStringOrUndefined(args["StackName"]) : void 0;
|
|
8106
8106
|
const outputName = Object.hasOwn(args, "OutputName") ? literalStringOrUndefined(args["OutputName"]) : void 0;
|
|
8107
8107
|
if (stackName === void 0 || outputName === void 0) return void 0;
|
|
@@ -8147,7 +8147,7 @@ function crossStackSourceKey(source) {
|
|
|
8147
8147
|
let template;
|
|
8148
8148
|
let variables;
|
|
8149
8149
|
if (typeof raw === "string") template = raw;
|
|
8150
|
-
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$
|
|
8150
|
+
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$9(raw[1])) {
|
|
8151
8151
|
if (typeof raw[0] !== "string") return void 0;
|
|
8152
8152
|
template = raw[0];
|
|
8153
8153
|
variables = raw[1];
|
|
@@ -8441,12 +8441,12 @@ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
|
|
|
8441
8441
|
function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, provenance = "template-derived") {
|
|
8442
8442
|
if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
|
|
8443
8443
|
if (secrets.size === 0) return;
|
|
8444
|
-
if (!isPlainObject$
|
|
8444
|
+
if (!isPlainObject$9(resolvedProperties) || !isPlainObject$9(sourceProperties)) return;
|
|
8445
8445
|
if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
|
|
8446
8446
|
if (!Object.hasOwn(sourceProperties, "Parameters")) return;
|
|
8447
8447
|
const resolvedParameters = resolvedProperties["Parameters"];
|
|
8448
8448
|
const sourceParameters = sourceProperties["Parameters"];
|
|
8449
|
-
if (!isPlainObject$
|
|
8449
|
+
if (!isPlainObject$9(resolvedParameters) || !isPlainObject$9(sourceParameters)) return;
|
|
8450
8450
|
const positioned = redactAtProvenance({ ...resolvedParameters }, secrets, sourceParameters, provenance, true);
|
|
8451
8451
|
let table = nestedStackParameterExpressions.get(secrets);
|
|
8452
8452
|
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
@@ -8495,7 +8495,7 @@ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedPr
|
|
|
8495
8495
|
if (typeof resolvedValue !== "string") return void 0;
|
|
8496
8496
|
const sourceLeaf = sourceParameters[name];
|
|
8497
8497
|
if (typeof sourceLeaf === "string") return sourceLeaf;
|
|
8498
|
-
if (!isPlainObject$
|
|
8498
|
+
if (!isPlainObject$9(sourceLeaf)) return void 0;
|
|
8499
8499
|
const written = positioned[name];
|
|
8500
8500
|
if (typeof written !== "string") return void 0;
|
|
8501
8501
|
const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
|
|
@@ -8832,7 +8832,7 @@ function evaluatePureRead(node, bind, pseudo, split, choose, depth = 0) {
|
|
|
8832
8832
|
}
|
|
8833
8833
|
return { value: out };
|
|
8834
8834
|
}
|
|
8835
|
-
if (!isPlainObject$
|
|
8835
|
+
if (!isPlainObject$9(node)) return void 0;
|
|
8836
8836
|
const keys = Object.keys(node);
|
|
8837
8837
|
if (keys.length !== 1) return void 0;
|
|
8838
8838
|
const key = keys[0];
|
|
@@ -8873,7 +8873,7 @@ function evaluatePureRead(node, bind, pseudo, split, choose, depth = 0) {
|
|
|
8873
8873
|
}
|
|
8874
8874
|
function evaluatePureSub(args, bind, pseudo, evaluate) {
|
|
8875
8875
|
const [text, variables] = typeof args === "string" ? [args, {}] : Array.isArray(args) && args.length === 2 ? [args[0], args[1]] : [void 0, void 0];
|
|
8876
|
-
if (typeof text !== "string" || text.includes("{{resolve:") || !isPlainObject$
|
|
8876
|
+
if (typeof text !== "string" || text.includes("{{resolve:") || !isPlainObject$9(variables)) return;
|
|
8877
8877
|
const bound = /* @__PURE__ */ new Map();
|
|
8878
8878
|
for (const [name, variable] of Object.entries(variables)) {
|
|
8879
8879
|
const evaluated = evaluate(variable);
|
|
@@ -8906,7 +8906,7 @@ function bindReadName(name, bind, pseudo) {
|
|
|
8906
8906
|
function collectRereadConditions(node, names, depth = 0) {
|
|
8907
8907
|
if (depth > MAX_REREAD_DEPTH) return false;
|
|
8908
8908
|
if (Array.isArray(node)) return node.every((element) => collectRereadConditions(element, names, depth + 1));
|
|
8909
|
-
if (!isPlainObject$
|
|
8909
|
+
if (!isPlainObject$9(node)) return true;
|
|
8910
8910
|
if (Object.hasOwn(node, "Fn::If")) {
|
|
8911
8911
|
const args = node["Fn::If"];
|
|
8912
8912
|
if (!Array.isArray(args) || typeof args[0] !== "string") return false;
|
|
@@ -8917,7 +8917,7 @@ function collectRereadConditions(node, names, depth = 0) {
|
|
|
8917
8917
|
function holdsRereadTrigger(node, depth = 0) {
|
|
8918
8918
|
if (depth > MAX_REREAD_DEPTH) return false;
|
|
8919
8919
|
if (Array.isArray(node)) return node.some((element) => holdsRereadTrigger(element, depth + 1));
|
|
8920
|
-
if (!isPlainObject$
|
|
8920
|
+
if (!isPlainObject$9(node)) return false;
|
|
8921
8921
|
return Object.entries(node).some(([key, child]) => REREAD_TRIGGERS.has(key) || holdsRereadTrigger(child, depth + 1));
|
|
8922
8922
|
}
|
|
8923
8923
|
function rendersReadTo(spelling, parentSecrets, value) {
|
|
@@ -8960,7 +8960,7 @@ function namesParameterOnBranches(node, choose, isParameter, depth = 0) {
|
|
|
8960
8960
|
if (depth > MAX_REREAD_DEPTH) return true;
|
|
8961
8961
|
if (typeof node === "string") return node.includes("{{resolve:");
|
|
8962
8962
|
if (Array.isArray(node)) return node.some((element) => namesParameterOnBranches(element, choose, isParameter, depth + 1));
|
|
8963
|
-
if (!isPlainObject$
|
|
8963
|
+
if (!isPlainObject$9(node)) return false;
|
|
8964
8964
|
if (Object.hasOwn(node, "Fn::If")) {
|
|
8965
8965
|
const args = node["Fn::If"];
|
|
8966
8966
|
if (Object.keys(node).length !== 1) return true;
|
|
@@ -9073,7 +9073,7 @@ function appendValuePlaceholderParts(value, out, budget, depth) {
|
|
|
9073
9073
|
if (budget.exhausted) return;
|
|
9074
9074
|
const literal = joinPartLiteralText(value);
|
|
9075
9075
|
if (literal !== void 0) return pushPlaceholderPart(out, literal, budget);
|
|
9076
|
-
if (isPlainObject$
|
|
9076
|
+
if (isPlainObject$9(value) && Object.keys(value).length === 1) {
|
|
9077
9077
|
const ref = value["Ref"];
|
|
9078
9078
|
if (typeof ref === "string" && ref !== "") return pushPlaceholderPart(out, keyedPart({ Ref: ref }), budget);
|
|
9079
9079
|
if (depth >= MAX_PLACEHOLDER_DEPTH) {
|
|
@@ -9105,7 +9105,7 @@ function appendParameterPlaceholderParts(source, out, budget, depth) {
|
|
|
9105
9105
|
let template;
|
|
9106
9106
|
let variables = {};
|
|
9107
9107
|
if (typeof args === "string") template = args;
|
|
9108
|
-
else if (Array.isArray(args) && args.length === 2 && isPlainObject$
|
|
9108
|
+
else if (Array.isArray(args) && args.length === 2 && isPlainObject$9(args[1])) {
|
|
9109
9109
|
template = args[0];
|
|
9110
9110
|
variables = args[1];
|
|
9111
9111
|
} else return false;
|
|
@@ -9268,7 +9268,7 @@ function isUniquelyKeyedBy(items, key) {
|
|
|
9268
9268
|
if (items.length === 0) return false;
|
|
9269
9269
|
const seen = /* @__PURE__ */ new Set();
|
|
9270
9270
|
for (const item of items) {
|
|
9271
|
-
if (!isPlainObject$
|
|
9271
|
+
if (!isPlainObject$9(item) || !Object.hasOwn(item, key)) return false;
|
|
9272
9272
|
const id = item[key];
|
|
9273
9273
|
if (typeof id !== "string" || id === "") return false;
|
|
9274
9274
|
if (seen.has(id)) return false;
|
|
@@ -9296,7 +9296,7 @@ const NEVER_DROPPING_INTRINSICS = /* @__PURE__ */ new Set([
|
|
|
9296
9296
|
]);
|
|
9297
9297
|
function arrayElementDrop(element, depth = 0) {
|
|
9298
9298
|
if (depth > 16) return "unknown";
|
|
9299
|
-
if (!isPlainObject$
|
|
9299
|
+
if (!isPlainObject$9(element)) return "never";
|
|
9300
9300
|
if (Object.hasOwn(element, "Ref")) return element["Ref"] === "AWS::NoValue" ? "always" : "never";
|
|
9301
9301
|
const keys = Object.keys(element);
|
|
9302
9302
|
if (keys.filter((key) => key.startsWith("Fn::") || key === "Condition").length === 0) return "never";
|
|
@@ -9332,7 +9332,7 @@ function keptLiteralsCorroborate(kept, bag, secrets) {
|
|
|
9332
9332
|
return kept.every((element, i) => keptElementCorroborates(element, bag[i], secrets));
|
|
9333
9333
|
}
|
|
9334
9334
|
function isIntrinsicNode(value) {
|
|
9335
|
-
if (!isPlainObject$
|
|
9335
|
+
if (!isPlainObject$9(value)) return false;
|
|
9336
9336
|
const keys = Object.keys(value);
|
|
9337
9337
|
return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
|
|
9338
9338
|
}
|
|
@@ -9345,7 +9345,7 @@ function keptElementCorroborates(source, bag, secrets, depth = 0) {
|
|
|
9345
9345
|
if (source === null || typeof source !== "object") return source === bag;
|
|
9346
9346
|
if (isIntrinsicNode(source)) return true;
|
|
9347
9347
|
if (Array.isArray(source)) return Array.isArray(bag) && bag.length === source.length && source.every((element, i) => keptElementCorroborates(element, bag[i], secrets, depth + 1));
|
|
9348
|
-
if (!isPlainObject$
|
|
9348
|
+
if (!isPlainObject$9(source) || !isPlainObject$9(bag)) return false;
|
|
9349
9349
|
if (Object.keys(bag).some((key) => !Object.hasOwn(source, key))) return false;
|
|
9350
9350
|
return Object.entries(source).every(([key, value]) => Object.hasOwn(bag, key) ? keptElementCorroborates(value, bag[key], secrets, depth + 1) : arrayElementDrop(value) === "always" || arrayElementDrop(value) === "maybe");
|
|
9351
9351
|
}
|
|
@@ -9355,12 +9355,12 @@ function corroboratesWhateverResolves(source, depth = 0) {
|
|
|
9355
9355
|
if (source === null || typeof source !== "object") return true;
|
|
9356
9356
|
if (isIntrinsicNode(source)) return true;
|
|
9357
9357
|
if (Array.isArray(source)) return source.every((element) => arrayElementDrop(element) === "never" && corroboratesWhateverResolves(element, depth + 1));
|
|
9358
|
-
if (!isPlainObject$
|
|
9358
|
+
if (!isPlainObject$9(source)) return false;
|
|
9359
9359
|
if (Object.keys(source).some((key) => key === "Ref" || key.startsWith("Fn::"))) return false;
|
|
9360
9360
|
return Object.values(source).every((value) => arrayElementDrop(value) !== "unknown" && corroboratesWhateverResolves(value, depth + 1));
|
|
9361
9361
|
}
|
|
9362
9362
|
function arrayPairsWhateverDrops(source) {
|
|
9363
|
-
if (!source.some((element) => isPlainObject$
|
|
9363
|
+
if (!source.some((element) => isPlainObject$9(element) && (Object.hasOwn(element, "Fn::If") || element["Ref"] === "AWS::NoValue" || Array.isArray(element["Fn::FindInMap"]) && element["Fn::FindInMap"].length > 3))) return true;
|
|
9364
9364
|
return source.every((element) => corroboratesWhateverResolves(element));
|
|
9365
9365
|
}
|
|
9366
9366
|
function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
|
|
@@ -9377,13 +9377,13 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9377
9377
|
}
|
|
9378
9378
|
return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
|
|
9379
9379
|
}
|
|
9380
|
-
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$
|
|
9380
|
+
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$9(source)) {
|
|
9381
9381
|
const inherited = positionByInheritedParameter(bag, source, secrets);
|
|
9382
9382
|
if (inherited !== void 0) return inherited;
|
|
9383
9383
|
const reread = positionByParameterReread(bag, source, secrets);
|
|
9384
9384
|
if (reread !== void 0) return reread;
|
|
9385
9385
|
}
|
|
9386
|
-
if (typeof bag === "string" && isPlainObject$
|
|
9386
|
+
if (typeof bag === "string" && isPlainObject$9(source)) {
|
|
9387
9387
|
const certified = positionByCrossStackSource(bag, source, secrets);
|
|
9388
9388
|
if (certified !== void 0) return certified;
|
|
9389
9389
|
const placeheld = positionByParameterPlaceholders(bag, source, secrets);
|
|
@@ -9393,7 +9393,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9393
9393
|
const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
|
|
9394
9394
|
if (framed !== void 0) return framed;
|
|
9395
9395
|
}
|
|
9396
|
-
if (Array.isArray(bag) && isPlainObject$
|
|
9396
|
+
if (Array.isArray(bag) && isPlainObject$9(source)) {
|
|
9397
9397
|
const positionedList = positionListByCrossStackSource(bag, source, secrets);
|
|
9398
9398
|
if (positionedList !== void 0) return positionedList;
|
|
9399
9399
|
}
|
|
@@ -9428,7 +9428,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9428
9428
|
if (kept !== void 0 && keptLiteralsCorroborate(kept, bag, secrets)) return bag.map((item, i) => redactByPath(item, kept[i], secrets, rules, secretExpressions, bagIsSameGeneration));
|
|
9429
9429
|
}
|
|
9430
9430
|
}
|
|
9431
|
-
if (isPlainObject$
|
|
9431
|
+
if (isPlainObject$9(bag) && hasPlainPrototype(bag) && isPlainObject$9(source)) {
|
|
9432
9432
|
const out = Object.create(null);
|
|
9433
9433
|
for (const [k, v] of Object.entries(bag)) {
|
|
9434
9434
|
out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactForState(v, {
|
|
@@ -9450,7 +9450,7 @@ function isReadbackProjectedFromState(rules) {
|
|
|
9450
9450
|
function subtreeHasDynamicReference(value) {
|
|
9451
9451
|
if (isDynamicReferenceString(value)) return true;
|
|
9452
9452
|
if (Array.isArray(value)) return value.some(subtreeHasDynamicReference);
|
|
9453
|
-
if (isPlainObject$
|
|
9453
|
+
if (isPlainObject$9(value)) return Object.values(value).some(subtreeHasDynamicReference);
|
|
9454
9454
|
return false;
|
|
9455
9455
|
}
|
|
9456
9456
|
function pathCrossesDottedKey(bag, path) {
|
|
@@ -9487,7 +9487,7 @@ function nameScalarSecrets(value, secrets) {
|
|
|
9487
9487
|
return secrets.has(String(node)) || byValue.has(node) ? "***" : node;
|
|
9488
9488
|
}
|
|
9489
9489
|
if (Array.isArray(node)) return node.map(walk);
|
|
9490
|
-
if (isPlainObject$
|
|
9490
|
+
if (isPlainObject$9(node) && hasPlainPrototype(node)) {
|
|
9491
9491
|
const out = Object.create(null);
|
|
9492
9492
|
for (const [k, v] of Object.entries(node)) out[k] = walk(v);
|
|
9493
9493
|
return out;
|
|
@@ -9504,13 +9504,13 @@ function substitutionIsSecret(value) {
|
|
|
9504
9504
|
function sentinelDefinitionOf(source) {
|
|
9505
9505
|
const subs = source["DefinitionSubstitutions"];
|
|
9506
9506
|
const values = /* @__PURE__ */ new Map();
|
|
9507
|
-
if (isPlainObject$
|
|
9507
|
+
if (isPlainObject$9(subs)) {
|
|
9508
9508
|
for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") values.set(name, String(value));
|
|
9509
9509
|
}
|
|
9510
9510
|
for (const key of ["DefinitionString", "Definition"]) {
|
|
9511
9511
|
if (!Object.hasOwn(source, key)) continue;
|
|
9512
9512
|
const raw = source[key];
|
|
9513
|
-
const body = typeof raw === "string" ? raw : isPlainObject$
|
|
9513
|
+
const body = typeof raw === "string" ? raw : isPlainObject$9(raw) ? JSON.stringify(raw) : void 0;
|
|
9514
9514
|
if (body === void 0) continue;
|
|
9515
9515
|
if (body.includes(SENTINEL_IN_STRING) || body.includes(SENTINEL_OUT_OF_STRING) || /\\u[eE]00[01]/.test(body)) continue;
|
|
9516
9516
|
const names = [];
|
|
@@ -9581,7 +9581,7 @@ function sentinelDefinitionOf(source) {
|
|
|
9581
9581
|
node.forEach((item, i) => walk(item, [...path, i], [...shapes, node.length]));
|
|
9582
9582
|
return;
|
|
9583
9583
|
}
|
|
9584
|
-
if (isPlainObject$
|
|
9584
|
+
if (isPlainObject$9(node)) {
|
|
9585
9585
|
const own = new Set(Object.keys(node).map(written));
|
|
9586
9586
|
for (const [k, v] of Object.entries(node)) {
|
|
9587
9587
|
if (!marked(k)) keys.add(k);
|
|
@@ -9609,7 +9609,7 @@ function alignedSecretLeaf(root, leaf) {
|
|
|
9609
9609
|
if (!Array.isArray(cursor) || cursor.length !== shape) return void 0;
|
|
9610
9610
|
cursor = cursor[segment];
|
|
9611
9611
|
} else {
|
|
9612
|
-
if (!isPlainObject$
|
|
9612
|
+
if (!isPlainObject$9(cursor)) return void 0;
|
|
9613
9613
|
const own = Object.keys(cursor);
|
|
9614
9614
|
if (own.length !== shape.size || own.some((k) => !shape.has(k))) return void 0;
|
|
9615
9615
|
if (!Object.hasOwn(cursor, segment)) return void 0;
|
|
@@ -9620,7 +9620,7 @@ function alignedSecretLeaf(root, leaf) {
|
|
|
9620
9620
|
}
|
|
9621
9621
|
function collectObjectKeys(value, into) {
|
|
9622
9622
|
if (Array.isArray(value)) for (const item of value) collectObjectKeys(item, into);
|
|
9623
|
-
else if (isPlainObject$
|
|
9623
|
+
else if (isPlainObject$9(value)) for (const [k, v] of Object.entries(value)) {
|
|
9624
9624
|
into.add(k);
|
|
9625
9625
|
collectObjectKeys(v, into);
|
|
9626
9626
|
}
|
|
@@ -9633,7 +9633,7 @@ function spelledKeysOf(properties) {
|
|
|
9633
9633
|
}
|
|
9634
9634
|
function someKeyIsUnspelled(value, spelled) {
|
|
9635
9635
|
if (Array.isArray(value)) return value.some((item) => someKeyIsUnspelled(item, spelled));
|
|
9636
|
-
if (isPlainObject$
|
|
9636
|
+
if (isPlainObject$9(value)) return Object.entries(value).some(([k, v]) => !spelled(k) || someKeyIsUnspelled(v, spelled));
|
|
9637
9637
|
return false;
|
|
9638
9638
|
}
|
|
9639
9639
|
function nameDefinitionSecrets(value, source, secrets) {
|
|
@@ -9728,8 +9728,8 @@ function deepEqualJsonValue(a, b) {
|
|
|
9728
9728
|
if (!Array.isArray(b) || a.length !== b.length) return false;
|
|
9729
9729
|
return a.every((item, i) => deepEqualJsonValue(item, b[i]));
|
|
9730
9730
|
}
|
|
9731
|
-
if (isPlainObject$
|
|
9732
|
-
if (!isPlainObject$
|
|
9731
|
+
if (isPlainObject$9(a)) {
|
|
9732
|
+
if (!isPlainObject$9(b)) return false;
|
|
9733
9733
|
if (!hasPlainPrototype(a) || !hasPlainPrototype(b)) return false;
|
|
9734
9734
|
const keys = Object.keys(a);
|
|
9735
9735
|
if (keys.length !== Object.keys(b).length) return false;
|
|
@@ -9746,7 +9746,7 @@ function renderedDefinitionLiterals(source) {
|
|
|
9746
9746
|
const keyKeep = /* @__PURE__ */ new Set();
|
|
9747
9747
|
const subs = source["DefinitionSubstitutions"];
|
|
9748
9748
|
const scalars = [];
|
|
9749
|
-
if (isPlainObject$
|
|
9749
|
+
if (isPlainObject$9(subs)) {
|
|
9750
9750
|
for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
9751
9751
|
scalars.push([name, String(value)]);
|
|
9752
9752
|
if (typeof value === "string") keep.add(value);
|
|
@@ -9758,7 +9758,7 @@ function renderedDefinitionLiterals(source) {
|
|
|
9758
9758
|
if (!Object.hasOwn(source, key)) continue;
|
|
9759
9759
|
const body = source[key];
|
|
9760
9760
|
if (typeof body === "string") bodies.push(body);
|
|
9761
|
-
else if (isPlainObject$
|
|
9761
|
+
else if (isPlainObject$9(body)) bodies.push(JSON.stringify(body));
|
|
9762
9762
|
}
|
|
9763
9763
|
for (const body of bodies) {
|
|
9764
9764
|
let rendered = body;
|
|
@@ -9809,7 +9809,7 @@ function collectScalarLeaves(value, into) {
|
|
|
9809
9809
|
return;
|
|
9810
9810
|
}
|
|
9811
9811
|
if (Array.isArray(value)) for (const item of value) collectScalarLeaves(item, into);
|
|
9812
|
-
else if (isPlainObject$
|
|
9812
|
+
else if (isPlainObject$9(value)) for (const item of Object.values(value)) collectScalarLeaves(item, into);
|
|
9813
9813
|
}
|
|
9814
9814
|
function refuseUncertifiedSubtree(value, sourceLiterals, mark, scalarLiterals, seen = /* @__PURE__ */ new Map()) {
|
|
9815
9815
|
if (scalarLiterals !== void 0 && (typeof value === "number" || typeof value === "boolean") && !scalarLiterals.has(value)) return mark ? POSITION_UNCERTIFIED : "***";
|
|
@@ -9827,7 +9827,7 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, scalarLiterals, s
|
|
|
9827
9827
|
for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, scalarLiterals, seen));
|
|
9828
9828
|
return out;
|
|
9829
9829
|
}
|
|
9830
|
-
if (isPlainObject$
|
|
9830
|
+
if (isPlainObject$9(value) && hasPlainPrototype(value)) {
|
|
9831
9831
|
const out = Object.create(null);
|
|
9832
9832
|
seen.set(value, out);
|
|
9833
9833
|
for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, scalarLiterals, seen);
|
|
@@ -9854,7 +9854,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9854
9854
|
if (learn) learnMixedLeafNeedle(learn, bag, source);
|
|
9855
9855
|
return mark ? POSITION_DECIDED : source;
|
|
9856
9856
|
}
|
|
9857
|
-
if (failClosed === true && isPlainObject$
|
|
9857
|
+
if (failClosed === true && isPlainObject$9(bag) && hasPlainPrototype(bag) && isPlainObject$9(source) && Object.keys(bag).some((k) => RENDERED_DEFINITION_KEYS.has(k)) && definitionSourceCarriesSecret(source)) {
|
|
9858
9858
|
const keep = renderedDefinitionLiterals(source);
|
|
9859
9859
|
const out = Object.create(null);
|
|
9860
9860
|
const rest = Object.create(null);
|
|
@@ -9888,7 +9888,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9888
9888
|
return out;
|
|
9889
9889
|
}
|
|
9890
9890
|
if (!subtreeHasDynamicReference(source)) return bag;
|
|
9891
|
-
if (isPlainObject$
|
|
9891
|
+
if (isPlainObject$9(bag) && hasPlainPrototype(bag) && isPlainObject$9(source)) {
|
|
9892
9892
|
const out = Object.create(null);
|
|
9893
9893
|
for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
|
|
9894
9894
|
return out;
|
|
@@ -9915,14 +9915,14 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9915
9915
|
function isDistinguishingAnchor(value) {
|
|
9916
9916
|
if (typeof value === "string") return value !== "";
|
|
9917
9917
|
if (Array.isArray(value)) return value.some(isDistinguishingAnchor);
|
|
9918
|
-
if (isPlainObject$
|
|
9918
|
+
if (isPlainObject$9(value)) return Object.values(value).some(isDistinguishingAnchor);
|
|
9919
9919
|
return false;
|
|
9920
9920
|
}
|
|
9921
9921
|
const ANCHOR_REFERENCE_MASK = "<ref>";
|
|
9922
9922
|
function anchorSignature(source) {
|
|
9923
9923
|
if (isDynamicReferenceString(source)) return ANCHOR_REFERENCE_MASK;
|
|
9924
9924
|
if (Array.isArray(source)) return `[${source.map(anchorSignature).sort().join(",")}]`;
|
|
9925
|
-
if (isPlainObject$
|
|
9925
|
+
if (isPlainObject$9(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
|
|
9926
9926
|
return JSON.stringify(source) ?? "undefined";
|
|
9927
9927
|
}
|
|
9928
9928
|
function anchorsCorroboratePairing(bag, source, anchors) {
|
|
@@ -9932,8 +9932,8 @@ function anchorsCorroboratePairing(bag, source, anchors) {
|
|
|
9932
9932
|
return true;
|
|
9933
9933
|
}
|
|
9934
9934
|
if (isDynamicReferenceString(source)) return typeof bag === "string";
|
|
9935
|
-
if (isPlainObject$
|
|
9936
|
-
if (!isPlainObject$
|
|
9935
|
+
if (isPlainObject$9(source)) {
|
|
9936
|
+
if (!isPlainObject$9(bag)) return false;
|
|
9937
9937
|
return Object.keys(source).every((k) => Object.hasOwn(bag, k) && anchorsCorroboratePairing(bag[k], source[k], anchors));
|
|
9938
9938
|
}
|
|
9939
9939
|
if (Array.isArray(source)) {
|
|
@@ -10024,13 +10024,13 @@ function learnMixedLeafNeedle(collector, bag, source) {
|
|
|
10024
10024
|
learnNeedle(collector, plaintext, token);
|
|
10025
10025
|
}
|
|
10026
10026
|
function asChild(marks, key) {
|
|
10027
|
-
return isPlainObject$
|
|
10027
|
+
return isPlainObject$9(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
|
|
10028
10028
|
}
|
|
10029
10029
|
function asIndex(marks, index) {
|
|
10030
10030
|
return Array.isArray(marks) ? marks[index] : void 0;
|
|
10031
10031
|
}
|
|
10032
10032
|
function preferPositionDecisions(scanned, refused, bag, marks, inferred) {
|
|
10033
|
-
if (isPlainObject$
|
|
10033
|
+
if (isPlainObject$9(bag) && hasPlainPrototype(bag) && isPlainObject$9(refused) && isPlainObject$9(scanned)) {
|
|
10034
10034
|
const out = Object.create(null);
|
|
10035
10035
|
for (const [k, v] of Object.entries(refused)) out[k] = preferPositionDecisions(scanned[k], v, bag[k], asChild(marks, k), inferred);
|
|
10036
10036
|
return out;
|
|
@@ -11520,7 +11520,7 @@ function readsNoEchoSource(node, sources) {
|
|
|
11520
11520
|
if (typeof argument === "string") return subStringReadsNoEcho(argument, void 0, sources);
|
|
11521
11521
|
if (Array.isArray(argument)) {
|
|
11522
11522
|
const [text, variables] = argument;
|
|
11523
|
-
const vars = isPlainObject$
|
|
11523
|
+
const vars = isPlainObject$9(variables) ? variables : void 0;
|
|
11524
11524
|
if (typeof text === "string" && subStringReadsNoEcho(text, vars, sources)) return true;
|
|
11525
11525
|
return vars !== void 0 && Object.values(vars).some(walk);
|
|
11526
11526
|
}
|
|
@@ -11554,7 +11554,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
11554
11554
|
parameters: sources.parameters,
|
|
11555
11555
|
...sources.conditions !== void 0 && { conditions: sources.conditions }
|
|
11556
11556
|
};
|
|
11557
|
-
const isBareDeclaredGetAtt = (node) => isPlainObject$
|
|
11557
|
+
const isBareDeclaredGetAtt = (node) => isPlainObject$9(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
|
|
11558
11558
|
const walk = (source, value, path) => {
|
|
11559
11559
|
if (value === void 0) return;
|
|
11560
11560
|
if (source === null || typeof source !== "object") return;
|
|
@@ -11570,7 +11570,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
11570
11570
|
const record = source;
|
|
11571
11571
|
const intrinsic = intrinsicKeyOf(record);
|
|
11572
11572
|
if (intrinsic === void 0) {
|
|
11573
|
-
if (!isPlainObject$
|
|
11573
|
+
if (!isPlainObject$9(value)) {
|
|
11574
11574
|
if (readsNoEchoSource(record, parametersOnly)) push(path, source);
|
|
11575
11575
|
return;
|
|
11576
11576
|
}
|
|
@@ -11619,7 +11619,7 @@ function noEchoParameterNodesAt(templateProperties, shape, noEchoParameters, con
|
|
|
11619
11619
|
noEchoCoordinatesOf(templateProperties ?? {}, shape, {
|
|
11620
11620
|
parameters: noEchoParameters,
|
|
11621
11621
|
...conditions !== void 0 && { conditions }
|
|
11622
|
-
}, (coordinate, node) => nodes.set(canonicalJson$
|
|
11622
|
+
}, (coordinate, node) => nodes.set(canonicalJson$4(coordinate), {
|
|
11623
11623
|
coordinate,
|
|
11624
11624
|
node
|
|
11625
11625
|
}));
|
|
@@ -11631,7 +11631,7 @@ function recordedNoEchoValuesOf(templateProperties, record, noEchoParameterNames
|
|
|
11631
11631
|
if (properties === null || typeof properties !== "object") return bag;
|
|
11632
11632
|
const coordinates = /* @__PURE__ */ new Map();
|
|
11633
11633
|
if (noEchoParameterNames.size > 0 && templateProperties !== void 0) for (const [key, { coordinate }] of noEchoParameterNodesAt(templateProperties, properties, noEchoParameterNames, conditions)) coordinates.set(key, coordinate);
|
|
11634
|
-
for (const coordinate of noEchoLeavesOf(record ?? {}) ?? []) coordinates.set(canonicalJson$
|
|
11634
|
+
for (const coordinate of noEchoLeavesOf(record ?? {}) ?? []) coordinates.set(canonicalJson$4(coordinate), coordinate);
|
|
11635
11635
|
const recordLeaf = (leaf) => {
|
|
11636
11636
|
if (typeof leaf === "string") {
|
|
11637
11637
|
if (leaf === "***" || leaf.includes("{{resolve:")) return;
|
|
@@ -11655,7 +11655,7 @@ function maskWholeValue(value) {
|
|
|
11655
11655
|
if (value === null || value === void 0) return value;
|
|
11656
11656
|
if (typeof value === "string" && isSingleDynamicReferenceToken(value)) return value;
|
|
11657
11657
|
if (Array.isArray(value)) return value.map(maskWholeValue);
|
|
11658
|
-
if (isPlainObject$
|
|
11658
|
+
if (isPlainObject$9(value)) {
|
|
11659
11659
|
const out = {};
|
|
11660
11660
|
for (const [key, child] of Object.entries(value)) Object.defineProperty(out, key, {
|
|
11661
11661
|
value: maskWholeValue(child),
|
|
@@ -11678,7 +11678,7 @@ function readAt(bag, coordinate) {
|
|
|
11678
11678
|
node = node[segment];
|
|
11679
11679
|
continue;
|
|
11680
11680
|
}
|
|
11681
|
-
if (!isPlainObject$
|
|
11681
|
+
if (!isPlainObject$9(node) || !Object.hasOwn(node, segment)) return {
|
|
11682
11682
|
found: false,
|
|
11683
11683
|
value: void 0
|
|
11684
11684
|
};
|
|
@@ -11694,7 +11694,7 @@ function valueAtCoordinate(bag, coordinate) {
|
|
|
11694
11694
|
}
|
|
11695
11695
|
function cloneContainer(node) {
|
|
11696
11696
|
if (Array.isArray(node)) return [...node];
|
|
11697
|
-
if (isPlainObject$
|
|
11697
|
+
if (isPlainObject$9(node)) return { ...node };
|
|
11698
11698
|
return node;
|
|
11699
11699
|
}
|
|
11700
11700
|
function maskAtCoordinates(bag, coordinates) {
|
|
@@ -11761,20 +11761,20 @@ function readbackPathFor(readback, properties, coordinate) {
|
|
|
11761
11761
|
if (!Array.isArray(live)) return path.length === 0 ? void 0 : path;
|
|
11762
11762
|
const key = Array.isArray(desired) ? identityKeyFor(live, desired) : void 0;
|
|
11763
11763
|
const element = Array.isArray(desired) ? desired[segment] : void 0;
|
|
11764
|
-
if (key === void 0 || !isPlainObject$
|
|
11764
|
+
if (key === void 0 || !isPlainObject$9(element)) return path;
|
|
11765
11765
|
const identity = element[key];
|
|
11766
|
-
const index = live.findIndex((item) => isPlainObject$
|
|
11766
|
+
const index = live.findIndex((item) => isPlainObject$9(item) && item[key] === identity);
|
|
11767
11767
|
if (index < 0) return path;
|
|
11768
11768
|
path.push(index);
|
|
11769
11769
|
live = live[index];
|
|
11770
11770
|
desired = element;
|
|
11771
11771
|
continue;
|
|
11772
11772
|
}
|
|
11773
|
-
if (!isPlainObject$
|
|
11773
|
+
if (!isPlainObject$9(live)) return path.length === 0 ? void 0 : path;
|
|
11774
11774
|
if (!Object.hasOwn(live, segment)) return void 0;
|
|
11775
11775
|
path.push(segment);
|
|
11776
11776
|
live = live[segment];
|
|
11777
|
-
desired = isPlainObject$
|
|
11777
|
+
desired = isPlainObject$9(desired) ? desired[segment] : void 0;
|
|
11778
11778
|
}
|
|
11779
11779
|
return path;
|
|
11780
11780
|
}
|
|
@@ -11803,7 +11803,7 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11803
11803
|
const confirmed = [];
|
|
11804
11804
|
const differing = [];
|
|
11805
11805
|
const walk = (s, t, v, path) => {
|
|
11806
|
-
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$
|
|
11806
|
+
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$9(v) ? !isPlainObject$9(s) : false)) {
|
|
11807
11807
|
if (s === void 0 || containsMask(s)) return s;
|
|
11808
11808
|
if (jsonEqual(s, t)) {
|
|
11809
11809
|
confirmed.push(path);
|
|
@@ -11832,8 +11832,8 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11832
11832
|
});
|
|
11833
11833
|
return changed ? out : s;
|
|
11834
11834
|
}
|
|
11835
|
-
if (isPlainObject$
|
|
11836
|
-
const tt = isPlainObject$
|
|
11835
|
+
if (isPlainObject$9(v) && isPlainObject$9(s)) {
|
|
11836
|
+
const tt = isPlainObject$9(t) ? t : {};
|
|
11837
11837
|
let out;
|
|
11838
11838
|
for (const key of Object.keys(v)) {
|
|
11839
11839
|
if (!Object.hasOwn(s, key)) continue;
|
|
@@ -11856,13 +11856,13 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11856
11856
|
function containsMask(value) {
|
|
11857
11857
|
if (value === "***") return true;
|
|
11858
11858
|
if (Array.isArray(value)) return value.some(containsMask);
|
|
11859
|
-
if (isPlainObject$
|
|
11859
|
+
if (isPlainObject$9(value)) return Object.values(value).some(containsMask);
|
|
11860
11860
|
return false;
|
|
11861
11861
|
}
|
|
11862
11862
|
function jsonEqual(a, b) {
|
|
11863
|
-
return canonicalJson$
|
|
11863
|
+
return canonicalJson$4(a) === canonicalJson$4(b);
|
|
11864
11864
|
}
|
|
11865
|
-
function canonicalJson$
|
|
11865
|
+
function canonicalJson$4(value) {
|
|
11866
11866
|
return JSON.stringify(value, (_key, node) => {
|
|
11867
11867
|
if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
|
|
11868
11868
|
const sorted = Object.create(null);
|
|
@@ -11900,7 +11900,7 @@ function noEchoComparison(options) {
|
|
|
11900
11900
|
const out = node.map(walk);
|
|
11901
11901
|
return out.some((item, i) => item !== node[i]) ? out : node;
|
|
11902
11902
|
}
|
|
11903
|
-
if (isPlainObject$
|
|
11903
|
+
if (isPlainObject$9(node)) {
|
|
11904
11904
|
let out;
|
|
11905
11905
|
for (const [key, child] of Object.entries(node)) {
|
|
11906
11906
|
const next = walk(child);
|
|
@@ -11943,8 +11943,8 @@ function noEchoOutputsComparison(templateValues, sources) {
|
|
|
11943
11943
|
return (current, desired) => {
|
|
11944
11944
|
const coordinates = noEchoCoordinatesOf(templateValues, desired, sources);
|
|
11945
11945
|
const maskedKeys = new Set(coordinates.map((coordinate) => coordinate[0]).filter((key) => typeof key === "string"));
|
|
11946
|
-
const maskedValues = new Set([...maskedKeys].map((key) => canonicalJson$
|
|
11947
|
-
for (const key of Object.keys(desired)) if (!Object.hasOwn(templateValues, key) && maskedValues.has(canonicalJson$
|
|
11946
|
+
const maskedValues = new Set([...maskedKeys].map((key) => canonicalJson$4(desired[key])));
|
|
11947
|
+
for (const key of Object.keys(desired)) if (!Object.hasOwn(templateValues, key) && maskedValues.has(canonicalJson$4(desired[key]))) maskedKeys.add(key);
|
|
11948
11948
|
if (maskedKeys.size === 0) return {
|
|
11949
11949
|
current,
|
|
11950
11950
|
desired,
|
|
@@ -11958,7 +11958,7 @@ function noEchoOutputsComparison(templateValues, sources) {
|
|
|
11958
11958
|
const stored = current[key];
|
|
11959
11959
|
if (containsMask(stored)) continue;
|
|
11960
11960
|
normalized = { ...normalized ?? {} };
|
|
11961
|
-
normalized[key] = canonicalJson$
|
|
11961
|
+
normalized[key] = canonicalJson$4(stored) === canonicalJson$4(desired[key]) ? maskedDesired[key] : PREVIOUS_NOECHO_VALUE;
|
|
11962
11962
|
}
|
|
11963
11963
|
return {
|
|
11964
11964
|
current: normalized,
|
|
@@ -12557,6 +12557,43 @@ function lambdaFunctionNameForMask(value) {
|
|
|
12557
12557
|
|
|
12558
12558
|
//#endregion
|
|
12559
12559
|
//#region src/analyzer/replacement-rules.ts
|
|
12560
|
+
function vpcInstanceTenancyChangeReplaces(oldValue, newValue) {
|
|
12561
|
+
const tenancyOf = (v) => v == null ? "default" : String(v);
|
|
12562
|
+
return tenancyOf(newValue) !== "default" && tenancyOf(newValue) !== tenancyOf(oldValue);
|
|
12563
|
+
}
|
|
12564
|
+
function instanceSecurityGroupIdsChangeReplaces(oldValue, newValue, siblings) {
|
|
12565
|
+
if (siblings === void 0) return false;
|
|
12566
|
+
if (Array.isArray(oldValue) && Array.isArray(newValue)) {
|
|
12567
|
+
const before = new Set(oldValue.map(String));
|
|
12568
|
+
const after = new Set(newValue.map(String));
|
|
12569
|
+
if (before.size === after.size && [...before].every((g) => after.has(g))) return false;
|
|
12570
|
+
}
|
|
12571
|
+
return siblings.newProperties["SubnetId"] == null;
|
|
12572
|
+
}
|
|
12573
|
+
function instanceBlockDeviceMappingsChangeReplaces(oldValue, newValue) {
|
|
12574
|
+
return !blockDeviceMappingsDifferOnlyInDeleteOnTermination(oldValue, newValue);
|
|
12575
|
+
}
|
|
12576
|
+
function blockDeviceMappingsDifferOnlyInDeleteOnTermination(oldValue, newValue) {
|
|
12577
|
+
if (!Array.isArray(oldValue) || !Array.isArray(newValue)) return false;
|
|
12578
|
+
if (oldValue.length !== newValue.length) return false;
|
|
12579
|
+
const strip = (m) => {
|
|
12580
|
+
if (m === null || typeof m !== "object" || Array.isArray(m)) return m;
|
|
12581
|
+
const out = { ...m };
|
|
12582
|
+
const ebs = out["Ebs"];
|
|
12583
|
+
if (ebs !== null && typeof ebs === "object" && !Array.isArray(ebs)) {
|
|
12584
|
+
const rest = { ...ebs };
|
|
12585
|
+
delete rest["DeleteOnTermination"];
|
|
12586
|
+
out["Ebs"] = rest;
|
|
12587
|
+
}
|
|
12588
|
+
return out;
|
|
12589
|
+
};
|
|
12590
|
+
return oldValue.every((m, i) => isDeepStrictEqual(scalarsAsStrings(strip(m)), scalarsAsStrings(strip(newValue[i]))));
|
|
12591
|
+
}
|
|
12592
|
+
function scalarsAsStrings(value) {
|
|
12593
|
+
if (Array.isArray(value)) return value.map(scalarsAsStrings);
|
|
12594
|
+
if (value !== null && typeof value === "object") return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== void 0).map(([k, v]) => [k, scalarsAsStrings(v)]));
|
|
12595
|
+
return typeof value === "number" || typeof value === "boolean" ? String(value) : value;
|
|
12596
|
+
}
|
|
12560
12597
|
function durableConfigPresenceToggled(oldValue, newValue) {
|
|
12561
12598
|
return oldValue == null !== (newValue == null);
|
|
12562
12599
|
}
|
|
@@ -12617,13 +12654,43 @@ function glueTableNameChanged(oldValue, newValue) {
|
|
|
12617
12654
|
function natZoneAddressesAddedToAutomaticGateway(oldValue, newValue) {
|
|
12618
12655
|
return oldValue == null && newValue != null;
|
|
12619
12656
|
}
|
|
12657
|
+
function ecsServiceLaunchTypeSetOrChanged(oldValue, newValue) {
|
|
12658
|
+
return newValue != null && !isDeepStrictEqual(oldValue, newValue);
|
|
12659
|
+
}
|
|
12660
|
+
const EMR_INSTANCES_IN_PLACE_MEMBERS = ["TerminationProtected", "UnhealthyNodeReplacement"];
|
|
12661
|
+
const EMR_GROUP_IN_PLACE_MEMBERS = ["InstanceCount", "AutoScalingPolicy"];
|
|
12662
|
+
const EMR_FLEET_IN_PLACE_MEMBERS = ["TargetOnDemandCapacity", "TargetSpotCapacity"];
|
|
12663
|
+
function withoutKeys(value, keys) {
|
|
12664
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
|
|
12665
|
+
const copy = { ...value };
|
|
12666
|
+
for (const key of keys) delete copy[key];
|
|
12667
|
+
return copy;
|
|
12668
|
+
}
|
|
12669
|
+
function emrInstancesReplacingPart(value) {
|
|
12670
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
|
|
12671
|
+
const instances = withoutKeys(value, EMR_INSTANCES_IN_PLACE_MEMBERS);
|
|
12672
|
+
const strip = (key, keys) => {
|
|
12673
|
+
if (!(key in instances)) return;
|
|
12674
|
+
const member = instances[key];
|
|
12675
|
+
instances[key] = Array.isArray(member) ? member.map((entry) => withoutKeys(entry, keys)) : withoutKeys(member, keys);
|
|
12676
|
+
};
|
|
12677
|
+
strip("CoreInstanceGroup", EMR_GROUP_IN_PLACE_MEMBERS);
|
|
12678
|
+
strip("TaskInstanceGroups", EMR_GROUP_IN_PLACE_MEMBERS);
|
|
12679
|
+
strip("CoreInstanceFleet", EMR_FLEET_IN_PLACE_MEMBERS);
|
|
12680
|
+
strip("TaskInstanceFleets", EMR_FLEET_IN_PLACE_MEMBERS);
|
|
12681
|
+
return instances;
|
|
12682
|
+
}
|
|
12683
|
+
function emrClusterInstancesReplaced(oldValue, newValue) {
|
|
12684
|
+
if (oldValue === void 0 && newValue === void 0) return true;
|
|
12685
|
+
return !isDeepStrictEqual(emrInstancesReplacingPart(oldValue), emrInstancesReplacingPart(newValue));
|
|
12686
|
+
}
|
|
12620
12687
|
var ReplacementRulesRegistry = class {
|
|
12621
12688
|
logger = getLogger().child("ReplacementRulesRegistry");
|
|
12622
12689
|
rules = /* @__PURE__ */ new Map();
|
|
12623
12690
|
constructor() {
|
|
12624
12691
|
this.initializeRules();
|
|
12625
12692
|
}
|
|
12626
|
-
requiresReplacement(resourceType, propertyPath, oldValue, newValue) {
|
|
12693
|
+
requiresReplacement(resourceType, propertyPath, oldValue, newValue, siblings) {
|
|
12627
12694
|
const rule = this.rules.get(resourceType);
|
|
12628
12695
|
if (!rule) {
|
|
12629
12696
|
this.logger.debug(`No replacement rule for ${resourceType}, conservatively assuming replacement may be required for ${propertyPath}`);
|
|
@@ -12637,16 +12704,16 @@ var ReplacementRulesRegistry = class {
|
|
|
12637
12704
|
if (rule.conditionalReplacements?.has(propertyPath)) {
|
|
12638
12705
|
const condition = rule.conditionalReplacements.get(propertyPath);
|
|
12639
12706
|
if (condition) {
|
|
12640
|
-
const requires = condition(oldValue, newValue);
|
|
12707
|
+
const requires = condition(oldValue, newValue, siblings);
|
|
12641
12708
|
this.logger.debug(`Conditional replacement for ${propertyPath} of ${resourceType}: ${requires}`);
|
|
12642
12709
|
return requires;
|
|
12643
12710
|
}
|
|
12644
12711
|
}
|
|
12645
12712
|
return false;
|
|
12646
12713
|
}
|
|
12647
|
-
conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue) {
|
|
12714
|
+
conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue, siblings) {
|
|
12648
12715
|
const condition = this.rules.get(resourceType)?.conditionalReplacements?.get(propertyPath);
|
|
12649
|
-
return condition === void 0 ? void 0 : condition(oldValue, newValue);
|
|
12716
|
+
return condition === void 0 ? void 0 : condition(oldValue, newValue, siblings);
|
|
12650
12717
|
}
|
|
12651
12718
|
isClassified(resourceType, propertyPath) {
|
|
12652
12719
|
const rule = this.rules.get(resourceType);
|
|
@@ -12925,6 +12992,15 @@ var ReplacementRulesRegistry = class {
|
|
|
12925
12992
|
"TargetRole"
|
|
12926
12993
|
]) });
|
|
12927
12994
|
this.rules.set("AWS::RDS::DBProxyTargetGroup", { replacementProperties: /* @__PURE__ */ new Set(["DBProxyName", "TargetGroupName"]) });
|
|
12995
|
+
this.rules.set("AWS::EC2::VPC", {
|
|
12996
|
+
replacementProperties: /* @__PURE__ */ new Set([
|
|
12997
|
+
"CidrBlock",
|
|
12998
|
+
"Ipv4IpamPoolId",
|
|
12999
|
+
"Ipv4NetmaskLength",
|
|
13000
|
+
"VpcEncryptionControl"
|
|
13001
|
+
]),
|
|
13002
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["InstanceTenancy", vpcInstanceTenancyChangeReplaces]])
|
|
13003
|
+
});
|
|
12928
13004
|
this.rules.set("AWS::EC2::Subnet", {
|
|
12929
13005
|
replacementProperties: /* @__PURE__ */ new Set([
|
|
12930
13006
|
"VpcId",
|
|
@@ -12933,14 +13009,17 @@ var ReplacementRulesRegistry = class {
|
|
|
12933
13009
|
]),
|
|
12934
13010
|
updateableProperties: /* @__PURE__ */ new Set(["MapPublicIpOnLaunch", "Tags"])
|
|
12935
13011
|
});
|
|
12936
|
-
this.rules.set("AWS::EC2::Instance", {
|
|
12937
|
-
|
|
12938
|
-
|
|
12939
|
-
|
|
12940
|
-
|
|
12941
|
-
|
|
12942
|
-
|
|
12943
|
-
|
|
13012
|
+
this.rules.set("AWS::EC2::Instance", {
|
|
13013
|
+
replacementProperties: /* @__PURE__ */ new Set([
|
|
13014
|
+
"EbsOptimized",
|
|
13015
|
+
"AvailabilityZone",
|
|
13016
|
+
"ImageId",
|
|
13017
|
+
"SubnetId",
|
|
13018
|
+
"KeyName",
|
|
13019
|
+
"NetworkInterfaces"
|
|
13020
|
+
]),
|
|
13021
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["SecurityGroupIds", instanceSecurityGroupIdsChangeReplaces], ["BlockDeviceMappings", instanceBlockDeviceMappingsChangeReplaces]])
|
|
13022
|
+
});
|
|
12944
13023
|
this.rules.set("AWS::EC2::NatGateway", {
|
|
12945
13024
|
replacementProperties: /* @__PURE__ */ new Set(),
|
|
12946
13025
|
conditionalReplacements: /* @__PURE__ */ new Map([["AvailabilityZoneAddresses", natZoneAddressesAddedToAutomaticGateway]])
|
|
@@ -12974,6 +13053,14 @@ var ReplacementRulesRegistry = class {
|
|
|
12974
13053
|
"TaskRoleArn",
|
|
12975
13054
|
"Volumes"
|
|
12976
13055
|
]) });
|
|
13056
|
+
this.rules.set("AWS::ECS::Service", {
|
|
13057
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13058
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["LaunchType", ecsServiceLaunchTypeSetOrChanged]])
|
|
13059
|
+
});
|
|
13060
|
+
this.rules.set("AWS::EMR::Cluster", {
|
|
13061
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13062
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["Instances", emrClusterInstancesReplaced]])
|
|
13063
|
+
});
|
|
12977
13064
|
this.rules.set("AWS::ElasticLoadBalancingV2::ListenerRule", { replacementProperties: /* @__PURE__ */ new Set(["ListenerArn"]) });
|
|
12978
13065
|
this.logger.debug(`Initialized replacement rules for ${this.rules.size} resource types`);
|
|
12979
13066
|
}
|
|
@@ -14853,7 +14940,7 @@ function probeFoundSameId(resourceType, a, b) {
|
|
|
14853
14940
|
//#region src/provisioning/config-shape.ts
|
|
14854
14941
|
function readConfigString(container, key, fallback, containerPath, options) {
|
|
14855
14942
|
if (container === void 0 || container === null) return fallback;
|
|
14856
|
-
if (!isPlainObject$
|
|
14943
|
+
if (!isPlainObject$8(container) || isUnresolvedIntrinsicContainer(container)) {
|
|
14857
14944
|
const detail = malformedShapeDetail(container);
|
|
14858
14945
|
if (options?.onUnusable) {
|
|
14859
14946
|
const named = fallback === "" ? "" : ` (${fallback})`;
|
|
@@ -14893,7 +14980,7 @@ function requireConfigArray(value, path, options) {
|
|
|
14893
14980
|
return value;
|
|
14894
14981
|
}
|
|
14895
14982
|
function requireConfigObject(value, path, options) {
|
|
14896
|
-
if (!isPlainObject$
|
|
14983
|
+
if (!isPlainObject$8(value) || isUnresolvedIntrinsicContainer(value)) {
|
|
14897
14984
|
const detail = malformedShapeDetail(value);
|
|
14898
14985
|
if (options?.onUnusable) {
|
|
14899
14986
|
options.onUnusable(`${path} must be an object ${detail}. Leaving this configuration unapplied here; the same value is REFUSED on a template-path create.`);
|
|
@@ -14905,7 +14992,7 @@ function requireConfigObject(value, path, options) {
|
|
|
14905
14992
|
}
|
|
14906
14993
|
function configStringRefusal(container, key, fallback, containerPath, options) {
|
|
14907
14994
|
if (container === void 0 || container === null) return void 0;
|
|
14908
|
-
if (!isPlainObject$
|
|
14995
|
+
if (!isPlainObject$8(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
14909
14996
|
return configValueRefusal(container[key], fallback, `${containerPath}.${key}`, options);
|
|
14910
14997
|
}
|
|
14911
14998
|
function coerceCfnBoolean(value) {
|
|
@@ -14918,7 +15005,7 @@ function coerceCfnBoolean(value) {
|
|
|
14918
15005
|
}
|
|
14919
15006
|
function configBooleanRefusal(container, key, containerPath) {
|
|
14920
15007
|
if (container === void 0 || container === null) return void 0;
|
|
14921
|
-
if (!isPlainObject$
|
|
15008
|
+
if (!isPlainObject$8(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
14922
15009
|
const value = container[key];
|
|
14923
15010
|
if (value === void 0) return void 0;
|
|
14924
15011
|
if (coerceCfnBoolean(value) !== void 0) return void 0;
|
|
@@ -14932,7 +15019,7 @@ function coerceCfnInteger(value) {
|
|
|
14932
15019
|
}
|
|
14933
15020
|
function configIntegerRefusal(container, key, containerPath, min, max) {
|
|
14934
15021
|
if (container === void 0 || container === null) return void 0;
|
|
14935
|
-
if (!isPlainObject$
|
|
15022
|
+
if (!isPlainObject$8(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
14936
15023
|
const value = container[key];
|
|
14937
15024
|
if (value === void 0) return void 0;
|
|
14938
15025
|
const n = coerceCfnInteger(value);
|
|
@@ -14946,10 +15033,10 @@ function configValueRefusal(value, fallback, path, options) {
|
|
|
14946
15033
|
if (typeof value !== "string" || value.trim() === "") return `${path} must be a non-empty string ${malformedShapeDetail(value)}`;
|
|
14947
15034
|
}
|
|
14948
15035
|
function malformedShapeDetail(value) {
|
|
14949
|
-
if (isPlainObject$
|
|
15036
|
+
if (isPlainObject$8(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
|
|
14950
15037
|
return `(got ${describe(value)}) — check for an unresolved intrinsic or a mis-nested template value`;
|
|
14951
15038
|
}
|
|
14952
|
-
function isPlainObject$
|
|
15039
|
+
function isPlainObject$8(value) {
|
|
14953
15040
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14954
15041
|
}
|
|
14955
15042
|
const NAMEABLE_INTRINSIC_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -14976,7 +15063,7 @@ function describe(value) {
|
|
|
14976
15063
|
if (value === null) return "null";
|
|
14977
15064
|
if (Array.isArray(value)) return "an array";
|
|
14978
15065
|
if (typeof value === "string") return value.trim() === "" ? "a blank string" : "a string";
|
|
14979
|
-
if (isPlainObject$
|
|
15066
|
+
if (isPlainObject$8(value) && isUnresolvedIntrinsicContainer(value)) {
|
|
14980
15067
|
const key = Object.keys(value)[0];
|
|
14981
15068
|
return NAMEABLE_INTRINSIC_KEYS.has(key) ? `an unresolved ${key} intrinsic` : "an unresolved intrinsic";
|
|
14982
15069
|
}
|
|
@@ -15153,6 +15240,7 @@ const STATEFUL_TYPES = /* @__PURE__ */ new Set([
|
|
|
15153
15240
|
"AWS::AppConfig::ConfigurationProfile",
|
|
15154
15241
|
"AWS::AIOps::InvestigationGroup",
|
|
15155
15242
|
"AWS::IoTSiteWise::Workspace",
|
|
15243
|
+
"AWS::CloudWatch::Space",
|
|
15156
15244
|
"AWS::Rbin::Rule",
|
|
15157
15245
|
"AWS::SMSVOICE::PhoneNumber",
|
|
15158
15246
|
"AWS::SMSVOICE::SenderId"
|
|
@@ -15265,8 +15353,8 @@ async function findReplacedReadersOfRecreateTargets(input) {
|
|
|
15265
15353
|
}
|
|
15266
15354
|
return pending;
|
|
15267
15355
|
};
|
|
15268
|
-
const isCreateOnly = async (type, key, plainReference) => {
|
|
15269
|
-
if (rules.requiresReplacement(type, key, void 0, void 0)) return true;
|
|
15356
|
+
const isCreateOnly = async (type, key, plainReference, siblings) => {
|
|
15357
|
+
if (rules.requiresReplacement(type, key, void 0, void 0, siblings)) return true;
|
|
15270
15358
|
if (rules.isClassified(type, key)) return false;
|
|
15271
15359
|
const keys = await wholeCreateOnlyKeys(type);
|
|
15272
15360
|
return plainReference ? keys.whole.has(key) : keys.confirmable.has(key);
|
|
@@ -15285,7 +15373,11 @@ async function findReplacedReadersOfRecreateTargets(input) {
|
|
|
15285
15373
|
for (const key of keys) {
|
|
15286
15374
|
if (stableTargets.has(replacedId) && idOnly.get(replacedId)?.get(readerId)?.has(key)) continue;
|
|
15287
15375
|
const plain = isPlainReferenceTo(resource.Properties?.[key], replacedId, resources[replacedId]?.Type);
|
|
15288
|
-
|
|
15376
|
+
const siblings = {
|
|
15377
|
+
oldProperties: record.properties ?? {},
|
|
15378
|
+
newProperties: resource.Properties ?? {}
|
|
15379
|
+
};
|
|
15380
|
+
if (await isCreateOnly(resource.Type, key, plain, siblings)) properties.push(key);
|
|
15289
15381
|
}
|
|
15290
15382
|
if (properties.length === 0) continue;
|
|
15291
15383
|
replaced.add(readerId);
|
|
@@ -17013,19 +17105,14 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
17013
17105
|
["AWS::EFS::MountTarget", {
|
|
17014
17106
|
handled: /* @__PURE__ */ new Set([
|
|
17015
17107
|
"FileSystemId",
|
|
17016
|
-
"SecurityGroups",
|
|
17017
|
-
"SubnetId"
|
|
17018
|
-
]),
|
|
17019
|
-
silentDrop: /* @__PURE__ */ new Map([
|
|
17020
|
-
["IpAddress", "not yet implemented by cdkd"],
|
|
17021
|
-
["IpAddressType", "not yet implemented by cdkd"],
|
|
17022
|
-
["Ipv6Address", "not yet implemented by cdkd"]
|
|
17023
|
-
]),
|
|
17024
|
-
createOnlyDrops: /* @__PURE__ */ new Set([
|
|
17025
17108
|
"IpAddress",
|
|
17026
17109
|
"IpAddressType",
|
|
17027
|
-
"Ipv6Address"
|
|
17110
|
+
"Ipv6Address",
|
|
17111
|
+
"SecurityGroups",
|
|
17112
|
+
"SubnetId"
|
|
17028
17113
|
]),
|
|
17114
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
17115
|
+
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
17029
17116
|
readOnly: /* @__PURE__ */ new Set(["Id"]),
|
|
17030
17117
|
ccRouteUnavailable: false
|
|
17031
17118
|
}],
|
|
@@ -18249,6 +18336,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18249
18336
|
}],
|
|
18250
18337
|
["AWS::Route53::HostedZone", {
|
|
18251
18338
|
handled: /* @__PURE__ */ new Set([
|
|
18339
|
+
"DelegationSetId",
|
|
18252
18340
|
"HostedZoneConfig",
|
|
18253
18341
|
"HostedZoneFeatures",
|
|
18254
18342
|
"HostedZoneTags",
|
|
@@ -18256,8 +18344,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
18256
18344
|
"QueryLoggingConfig",
|
|
18257
18345
|
"VPCs"
|
|
18258
18346
|
]),
|
|
18259
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
18260
|
-
createOnlyDrops: /* @__PURE__ */ new Set(
|
|
18347
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
18348
|
+
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
18261
18349
|
readOnly: /* @__PURE__ */ new Set(["Id", "NameServers"]),
|
|
18262
18350
|
ccRouteUnavailable: false
|
|
18263
18351
|
}],
|
|
@@ -19981,12 +20069,12 @@ function declaresNoEcho(definition) {
|
|
|
19981
20069
|
//#region src/deployment/masked-property-fingerprints.ts
|
|
19982
20070
|
const FINGERPRINT_LAYOUT$1 = 1;
|
|
19983
20071
|
const INPUT_FINGERPRINT_LAYOUT = 2;
|
|
19984
|
-
function canonicalJson$
|
|
20072
|
+
function canonicalJson$3(value) {
|
|
19985
20073
|
if (value === void 0) return "null";
|
|
19986
|
-
if (Array.isArray(value)) return `[${value.map(canonicalJson$
|
|
20074
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson$3).join(",")}]`;
|
|
19987
20075
|
if (value !== null && typeof value === "object") {
|
|
19988
20076
|
const record = value;
|
|
19989
|
-
return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$
|
|
20077
|
+
return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$3(record[key])}`).join(",")}}`;
|
|
19990
20078
|
}
|
|
19991
20079
|
return JSON.stringify(value) ?? "null";
|
|
19992
20080
|
}
|
|
@@ -20007,7 +20095,7 @@ function splitInputFingerprint(entry) {
|
|
|
20007
20095
|
};
|
|
20008
20096
|
}
|
|
20009
20097
|
function templateCarriesNeedle(templateValue, secrets) {
|
|
20010
|
-
const text = canonicalJson$
|
|
20098
|
+
const text = canonicalJson$3(templateValue);
|
|
20011
20099
|
for (const needle of printingCorpusOf(secrets).keys()) {
|
|
20012
20100
|
if (needle.length < 4) continue;
|
|
20013
20101
|
if (text.includes(needle) || text.includes(JSON.stringify(needle).slice(1, -1))) return true;
|
|
@@ -20015,14 +20103,14 @@ function templateCarriesNeedle(templateValue, secrets) {
|
|
|
20015
20103
|
return false;
|
|
20016
20104
|
}
|
|
20017
20105
|
function maskedPropertyFingerprint(templateValue) {
|
|
20018
|
-
const digest = createHash("sha256").update(canonicalJson$
|
|
20106
|
+
const digest = createHash("sha256").update(canonicalJson$3({
|
|
20019
20107
|
layout: FINGERPRINT_LAYOUT$1,
|
|
20020
20108
|
value: templateValue
|
|
20021
20109
|
})).digest("hex");
|
|
20022
20110
|
return `${FINGERPRINT_PREFIX}${digest}`;
|
|
20023
20111
|
}
|
|
20024
20112
|
var UnknownInput = class extends Error {};
|
|
20025
|
-
function isPlainObject$
|
|
20113
|
+
function isPlainObject$7(value) {
|
|
20026
20114
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
20027
20115
|
}
|
|
20028
20116
|
const DYNAMIC_REFERENCE_OPEN = "{{resolve:";
|
|
@@ -20030,7 +20118,7 @@ const NESTED_STACK_TYPE$4 = "AWS::CloudFormation::Stack";
|
|
|
20030
20118
|
const NESTED_OUTPUT_PREFIX = "Outputs.";
|
|
20031
20119
|
function carriesSecretValue(value, corpora) {
|
|
20032
20120
|
if (carriesSecretMask(value)) return true;
|
|
20033
|
-
const text = canonicalJson$
|
|
20121
|
+
const text = canonicalJson$3(value);
|
|
20034
20122
|
if (text.includes(DYNAMIC_REFERENCE_OPEN)) return true;
|
|
20035
20123
|
for (const corpus of corpora) {
|
|
20036
20124
|
if (corpus === void 0) continue;
|
|
@@ -20042,7 +20130,7 @@ function carriesSecretValue(value, corpora) {
|
|
|
20042
20130
|
return false;
|
|
20043
20131
|
}
|
|
20044
20132
|
function parameterInputsFor(args) {
|
|
20045
|
-
const declared = isPlainObject$
|
|
20133
|
+
const declared = isPlainObject$7(args.template.Parameters) ? args.template.Parameters : {};
|
|
20046
20134
|
const values = args.values ?? {};
|
|
20047
20135
|
const inputs = /* @__PURE__ */ new Map();
|
|
20048
20136
|
const bound = {};
|
|
@@ -20053,7 +20141,7 @@ function parameterInputsFor(args) {
|
|
|
20053
20141
|
continue;
|
|
20054
20142
|
}
|
|
20055
20143
|
const value = values[name];
|
|
20056
|
-
let secret = isPlainObject$
|
|
20144
|
+
let secret = isPlainObject$7(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
|
|
20057
20145
|
if (!secret && args.nestedChild === true && args.supplied !== void 0) {
|
|
20058
20146
|
if (Object.hasOwn(args.supplied, name)) {
|
|
20059
20147
|
const passed = args.passedClasses?.get(name);
|
|
@@ -20104,7 +20192,7 @@ function intrinsicKey(value) {
|
|
|
20104
20192
|
const OPAQUE_ATTRIBUTE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", NESTED_STACK_TYPE$4]);
|
|
20105
20193
|
function hasOpaqueAttributes(logicalId, walk) {
|
|
20106
20194
|
const definition = walk.resources[logicalId];
|
|
20107
|
-
const type = isPlainObject$
|
|
20195
|
+
const type = isPlainObject$7(definition) ? definition["Type"] : void 0;
|
|
20108
20196
|
return typeof type === "string" && (type.startsWith("Custom::") || OPAQUE_ATTRIBUTE_TYPES.has(type));
|
|
20109
20197
|
}
|
|
20110
20198
|
function getAttTarget(operand) {
|
|
@@ -20129,7 +20217,7 @@ function taintOf(logicalId, walk) {
|
|
|
20129
20217
|
const visit = (value) => {
|
|
20130
20218
|
if (typeof value === "string") return value.includes(DYNAMIC_REFERENCE_OPEN);
|
|
20131
20219
|
if (Array.isArray(value)) return value.some(visit);
|
|
20132
|
-
if (!isPlainObject$
|
|
20220
|
+
if (!isPlainObject$7(value)) return false;
|
|
20133
20221
|
const key = intrinsicKey(value);
|
|
20134
20222
|
const operand = key === void 0 ? void 0 : value[key];
|
|
20135
20223
|
let verdict = "clean";
|
|
@@ -20141,7 +20229,7 @@ function taintOf(logicalId, walk) {
|
|
|
20141
20229
|
else if (key === "Fn::FindInMap" && mapReadClass(operand, walk.sources.template) !== "clean") verdict = "tainted";
|
|
20142
20230
|
else if (key === "Fn::Sub") {
|
|
20143
20231
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20144
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20232
|
+
const vars = Array.isArray(operand) && isPlainObject$7(operand[1]) ? operand[1] : {};
|
|
20145
20233
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
20146
20234
|
if (Object.hasOwn(vars, name)) continue;
|
|
20147
20235
|
const owner = name.includes(".") ? name.split(".")[0] : name;
|
|
@@ -20155,7 +20243,7 @@ function taintOf(logicalId, walk) {
|
|
|
20155
20243
|
return Object.values(value).some(visit);
|
|
20156
20244
|
};
|
|
20157
20245
|
const definition = walk.resources[logicalId];
|
|
20158
|
-
const result = visit(isPlainObject$
|
|
20246
|
+
const result = visit(isPlainObject$7(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
|
|
20159
20247
|
walk.inProgress.delete(logicalId);
|
|
20160
20248
|
walk.taint.set(logicalId, result);
|
|
20161
20249
|
return result;
|
|
@@ -20171,7 +20259,7 @@ function conditionInput(name, walk) {
|
|
|
20171
20259
|
return typeof verdict === "boolean" ? verdict : "unknown";
|
|
20172
20260
|
}
|
|
20173
20261
|
function conditionClosure(name, walk) {
|
|
20174
|
-
const definitions = isPlainObject$
|
|
20262
|
+
const definitions = isPlainObject$7(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
|
|
20175
20263
|
let secret = false;
|
|
20176
20264
|
let unknown = false;
|
|
20177
20265
|
let unread = false;
|
|
@@ -20186,7 +20274,7 @@ function conditionClosure(name, walk) {
|
|
|
20186
20274
|
value.forEach(visit);
|
|
20187
20275
|
return;
|
|
20188
20276
|
}
|
|
20189
|
-
if (!isPlainObject$
|
|
20277
|
+
if (!isPlainObject$7(value)) return;
|
|
20190
20278
|
const keys = Object.keys(value);
|
|
20191
20279
|
if (keys.length === 1 && keys[0] === "Condition" && typeof value["Condition"] === "string") {
|
|
20192
20280
|
pending.push(value["Condition"]);
|
|
@@ -20219,7 +20307,7 @@ function conditionClosure(name, walk) {
|
|
|
20219
20307
|
if (key === "Fn::Sub") {
|
|
20220
20308
|
const operand = value["Fn::Sub"];
|
|
20221
20309
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20222
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20310
|
+
const vars = Array.isArray(operand) && isPlainObject$7(operand[1]) ? operand[1] : {};
|
|
20223
20311
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
20224
20312
|
if (Object.hasOwn(vars, name)) continue;
|
|
20225
20313
|
if (name.includes(".") && !name.startsWith("AWS::")) secret = true;
|
|
@@ -20248,8 +20336,8 @@ function mapReadClass(operand, template) {
|
|
|
20248
20336
|
const mapName = Array.isArray(operand) ? operand[0] : void 0;
|
|
20249
20337
|
if (typeof mapName !== "string") return "unknown";
|
|
20250
20338
|
const mappings = template.Mappings;
|
|
20251
|
-
const map = isPlainObject$
|
|
20252
|
-
if (!isPlainObject$
|
|
20339
|
+
const map = isPlainObject$7(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
|
|
20340
|
+
if (!isPlainObject$7(map)) return "unknown";
|
|
20253
20341
|
return carriesSecretValue(map, []) ? "secret" : "clean";
|
|
20254
20342
|
}
|
|
20255
20343
|
async function resolvedInput(node, walk) {
|
|
@@ -20317,7 +20405,7 @@ async function inputForm(value, walk) {
|
|
|
20317
20405
|
concrete: parts.every((p) => p.concrete)
|
|
20318
20406
|
};
|
|
20319
20407
|
}
|
|
20320
|
-
if (!isPlainObject$
|
|
20408
|
+
if (!isPlainObject$7(value)) return {
|
|
20321
20409
|
form: value,
|
|
20322
20410
|
concrete: true
|
|
20323
20411
|
};
|
|
@@ -20380,7 +20468,7 @@ async function inputForm(value, walk) {
|
|
|
20380
20468
|
concrete: false
|
|
20381
20469
|
};
|
|
20382
20470
|
}
|
|
20383
|
-
const explicit = Array.isArray(operand) && isPlainObject$
|
|
20471
|
+
const explicit = Array.isArray(operand) && isPlainObject$7(operand[1]) ? operand[1] : {};
|
|
20384
20472
|
const vars = await inputForm(explicit, walk);
|
|
20385
20473
|
const placeholders = [];
|
|
20386
20474
|
let concrete = vars.concrete && !text.includes(DYNAMIC_REFERENCE_OPEN);
|
|
@@ -20433,8 +20521,8 @@ function newWalk(sources, nested = {
|
|
|
20433
20521
|
}) {
|
|
20434
20522
|
return {
|
|
20435
20523
|
sources,
|
|
20436
|
-
resources: isPlainObject$
|
|
20437
|
-
parameters: isPlainObject$
|
|
20524
|
+
resources: isPlainObject$7(sources.template.Resources) ? sources.template.Resources : {},
|
|
20525
|
+
parameters: isPlainObject$7(sources.template.Parameters) ? sources.template.Parameters : {},
|
|
20438
20526
|
taint: /* @__PURE__ */ new Map(),
|
|
20439
20527
|
inProgress: /* @__PURE__ */ new Set(),
|
|
20440
20528
|
stackChain: nested.stackChain,
|
|
@@ -20458,34 +20546,34 @@ function passedKey(passed) {
|
|
|
20458
20546
|
function isNestedStackRow(logicalId, walk) {
|
|
20459
20547
|
if (!Object.hasOwn(walk.resources, logicalId)) return false;
|
|
20460
20548
|
const definition = walk.resources[logicalId];
|
|
20461
|
-
return isPlainObject$
|
|
20549
|
+
return isPlainObject$7(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
|
|
20462
20550
|
}
|
|
20463
20551
|
function getAttAttribute(operand, target) {
|
|
20464
20552
|
if (Array.isArray(operand)) return operand.length === 2 && typeof operand[1] === "string" ? operand[1] : void 0;
|
|
20465
20553
|
return typeof operand === "string" ? operand.slice(target.length + 1) : void 0;
|
|
20466
20554
|
}
|
|
20467
20555
|
function rowParameters(definition) {
|
|
20468
|
-
const properties = isPlainObject$
|
|
20556
|
+
const properties = isPlainObject$7(definition) ? definition["Properties"] : void 0;
|
|
20469
20557
|
if (properties === void 0) return {};
|
|
20470
|
-
if (!isPlainObject$
|
|
20558
|
+
if (!isPlainObject$7(properties)) return "unknown";
|
|
20471
20559
|
const parameters = properties["Parameters"];
|
|
20472
20560
|
if (parameters === void 0) return {};
|
|
20473
|
-
if (!isPlainObject$
|
|
20561
|
+
if (!isPlainObject$7(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
|
|
20474
20562
|
return parameters;
|
|
20475
20563
|
}
|
|
20476
20564
|
function childParameterInputs(template, passed) {
|
|
20477
|
-
const declared = isPlainObject$
|
|
20565
|
+
const declared = isPlainObject$7(template.Parameters) ? template.Parameters : {};
|
|
20478
20566
|
const inputs = /* @__PURE__ */ new Map();
|
|
20479
20567
|
for (const name of Object.keys(declared)) {
|
|
20480
20568
|
const definition = declared[name];
|
|
20481
|
-
if (isPlainObject$
|
|
20569
|
+
if (isPlainObject$7(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
|
|
20482
20570
|
else if (passed.has(name)) {
|
|
20483
20571
|
const passedClass = passed.get(name);
|
|
20484
20572
|
inputs.set(name, passedClass === "clean" ? {
|
|
20485
20573
|
kind: "value",
|
|
20486
20574
|
value: void 0
|
|
20487
20575
|
} : passedClass === "unknown" ? { kind: "unknown" } : { kind: "secret" });
|
|
20488
|
-
} else if (isPlainObject$
|
|
20576
|
+
} else if (isPlainObject$7(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
|
|
20489
20577
|
kind: "value",
|
|
20490
20578
|
value: definition["Default"]
|
|
20491
20579
|
});
|
|
@@ -20502,7 +20590,7 @@ function closureClass(closure) {
|
|
|
20502
20590
|
return closure.unread ? "unread" : "clean";
|
|
20503
20591
|
}
|
|
20504
20592
|
async function childOutputClass(loaded, outputName, passed, chain, shared) {
|
|
20505
|
-
if (loaded === void 0 || !isPlainObject$
|
|
20593
|
+
if (loaded === void 0 || !isPlainObject$7(loaded.template)) return "unknown";
|
|
20506
20594
|
const scopeKey = JSON.stringify([loaded.identity, passedKey(passed)]);
|
|
20507
20595
|
const memoKey = JSON.stringify([scopeKey, outputName]);
|
|
20508
20596
|
const memo = shared.outputs.get(memoKey);
|
|
@@ -20515,8 +20603,8 @@ async function classifyChildOutput(loaded, outputName, passed, chain, shared, sc
|
|
|
20515
20603
|
if (++shared.steps > MAX_NESTED_OUTPUT_STEPS) return "unknown";
|
|
20516
20604
|
if (chain.includes(loaded.identity) || chain.length >= MAX_NESTED_OUTPUT_DEPTH) return "unknown";
|
|
20517
20605
|
const template = loaded.template;
|
|
20518
|
-
const output = (isPlainObject$
|
|
20519
|
-
if (!isPlainObject$
|
|
20606
|
+
const output = (isPlainObject$7(template.Outputs) ? template.Outputs : {})[outputName];
|
|
20607
|
+
if (!isPlainObject$7(output) || !Object.hasOwn(output, "Value")) return "unknown";
|
|
20520
20608
|
const scope = {
|
|
20521
20609
|
walk: newWalk({
|
|
20522
20610
|
template,
|
|
@@ -20588,7 +20676,7 @@ async function expressionClass(value, scope) {
|
|
|
20588
20676
|
return result;
|
|
20589
20677
|
};
|
|
20590
20678
|
if (Array.isArray(value)) return all(value);
|
|
20591
|
-
if (!isPlainObject$
|
|
20679
|
+
if (!isPlainObject$7(value)) return "clean";
|
|
20592
20680
|
const key = intrinsicKey(value);
|
|
20593
20681
|
if (key === void 0) return all(Object.values(value));
|
|
20594
20682
|
const operand = value[key];
|
|
@@ -20603,7 +20691,7 @@ async function expressionClass(value, scope) {
|
|
|
20603
20691
|
case "Fn::Sub": {
|
|
20604
20692
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20605
20693
|
if (typeof text !== "string") return worseOf("unknown", await expressionClass(operand, scope));
|
|
20606
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20694
|
+
const vars = Array.isArray(operand) && isPlainObject$7(operand[1]) ? operand[1] : {};
|
|
20607
20695
|
let result = text.includes(DYNAMIC_REFERENCE_OPEN) ? "secret" : "clean";
|
|
20608
20696
|
result = worseOf(result, await all(Object.values(vars)));
|
|
20609
20697
|
for (const name of subPlaceholders(text)) {
|
|
@@ -20667,7 +20755,7 @@ async function maskedInputFingerprint(templateValue, sources) {
|
|
|
20667
20755
|
if (error instanceof UnknownInput) return void 0;
|
|
20668
20756
|
throw error;
|
|
20669
20757
|
}
|
|
20670
|
-
const digest = createHash("sha256").update(canonicalJson$
|
|
20758
|
+
const digest = createHash("sha256").update(canonicalJson$3({
|
|
20671
20759
|
layout: INPUT_FINGERPRINT_LAYOUT,
|
|
20672
20760
|
value: form
|
|
20673
20761
|
})).digest("hex");
|
|
@@ -20681,7 +20769,7 @@ async function classifyPassedParameters(parameters, sources) {
|
|
|
20681
20769
|
}
|
|
20682
20770
|
async function classifyPassed(parameters, sources, nested) {
|
|
20683
20771
|
const classes = /* @__PURE__ */ new Map();
|
|
20684
|
-
if (!isPlainObject$
|
|
20772
|
+
if (!isPlainObject$7(parameters)) return classes;
|
|
20685
20773
|
for (const [name, expression] of Object.entries(parameters)) {
|
|
20686
20774
|
let passedClass;
|
|
20687
20775
|
try {
|
|
@@ -20722,13 +20810,13 @@ function possiblyMaskedKeys(resolvedProps, corpora) {
|
|
|
20722
20810
|
const wholeShortLeaf = (value) => {
|
|
20723
20811
|
if (typeof value === "string") return short.includes(value);
|
|
20724
20812
|
if (Array.isArray(value)) return value.some(wholeShortLeaf);
|
|
20725
|
-
if (isPlainObject$
|
|
20813
|
+
if (isPlainObject$7(value)) return Object.values(value).some(wholeShortLeaf);
|
|
20726
20814
|
return false;
|
|
20727
20815
|
};
|
|
20728
20816
|
return Object.keys(resolvedProps).filter((key) => {
|
|
20729
20817
|
const value = resolvedProps[key];
|
|
20730
20818
|
if (carriesSecretMask(value) || wholeShortLeaf(value)) return true;
|
|
20731
|
-
const text = canonicalJson$
|
|
20819
|
+
const text = canonicalJson$3(value);
|
|
20732
20820
|
return long.some((needle) => text.includes(needle) || text.includes(JSON.stringify(needle).slice(1, -1)));
|
|
20733
20821
|
});
|
|
20734
20822
|
}
|
|
@@ -20753,7 +20841,7 @@ function maskedPropertyFingerprintsOf(record) {
|
|
|
20753
20841
|
const read = /* @__PURE__ */ new Map();
|
|
20754
20842
|
if (record === null || typeof record !== "object") return read;
|
|
20755
20843
|
const field = record.maskedPropertyFingerprints;
|
|
20756
|
-
if (!isPlainObject$
|
|
20844
|
+
if (!isPlainObject$7(field)) return read;
|
|
20757
20845
|
for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
|
|
20758
20846
|
return read;
|
|
20759
20847
|
}
|
|
@@ -20761,7 +20849,7 @@ function maskedPropertyInputFingerprintsOf(record) {
|
|
|
20761
20849
|
const read = /* @__PURE__ */ new Map();
|
|
20762
20850
|
if (record === null || typeof record !== "object") return read;
|
|
20763
20851
|
const field = record.maskedPropertyInputFingerprints;
|
|
20764
|
-
if (!isPlainObject$
|
|
20852
|
+
if (!isPlainObject$7(field)) return read;
|
|
20765
20853
|
const text = maskedPropertyFingerprintsOf(record);
|
|
20766
20854
|
for (const [key, value] of Object.entries(field)) {
|
|
20767
20855
|
if (typeof value !== "string" || !value.startsWith(INPUT_FINGERPRINT_PREFIX)) continue;
|
|
@@ -20808,7 +20896,7 @@ async function movedMaskedProperties(record, templateProps, fingerprinter, onReb
|
|
|
20808
20896
|
function withRebaselinedFingerprints(record, fingerprints) {
|
|
20809
20897
|
const text = maskedPropertyFingerprintsOf(record);
|
|
20810
20898
|
const field = record.maskedPropertyInputFingerprints;
|
|
20811
|
-
const next = isPlainObject$
|
|
20899
|
+
const next = isPlainObject$7(field) ? Object.entries(field) : [];
|
|
20812
20900
|
let changed = false;
|
|
20813
20901
|
for (const [key, value] of Object.entries(fingerprints)) {
|
|
20814
20902
|
if (text.get(key) !== splitInputFingerprint(value).text) continue;
|
|
@@ -20841,10 +20929,10 @@ function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, sec
|
|
|
20841
20929
|
fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
|
|
20842
20930
|
inputs = boundInputFingerprints(fingerprints, inputFingerprints);
|
|
20843
20931
|
} else {
|
|
20844
|
-
if (!isPlainObject$
|
|
20932
|
+
if (!isPlainObject$7(previous)) return scrubbed;
|
|
20845
20933
|
if (corpora.length === 0) return scrubbed;
|
|
20846
20934
|
fingerprints = { ...previous };
|
|
20847
|
-
inputs = isPlainObject$
|
|
20935
|
+
inputs = isPlainObject$7(previousInputs) ? { ...previousInputs } : void 0;
|
|
20848
20936
|
}
|
|
20849
20937
|
if (fingerprints !== void 0 && corpora.length > 0) {
|
|
20850
20938
|
const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
|
|
@@ -22185,11 +22273,11 @@ function validReferenceRegion(region) {
|
|
|
22185
22273
|
if (typeof region !== "string") return void 0;
|
|
22186
22274
|
return canonicalizeRegion(region) === region && isClientSafeRegion(region) ? region : void 0;
|
|
22187
22275
|
}
|
|
22188
|
-
function isPlainObject$
|
|
22276
|
+
function isPlainObject$6(value) {
|
|
22189
22277
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
22190
22278
|
}
|
|
22191
22279
|
function validateReferenceProvenance(token, raw) {
|
|
22192
|
-
if (!isSingleDynamicReferenceToken(token) || !isPlainObject$
|
|
22280
|
+
if (!isSingleDynamicReferenceToken(token) || !isPlainObject$6(raw)) return void 0;
|
|
22193
22281
|
const versionsRaw = Object.hasOwn(raw, "versions") ? raw["versions"] : void 0;
|
|
22194
22282
|
const readRaw = Object.hasOwn(raw, "readVersions") ? raw["readVersions"] : void 0;
|
|
22195
22283
|
if (readRaw !== void 0) {
|
|
@@ -22207,11 +22295,11 @@ function validateReferenceProvenance(token, raw) {
|
|
|
22207
22295
|
return out;
|
|
22208
22296
|
}
|
|
22209
22297
|
function referenceProvenanceOf(record) {
|
|
22210
|
-
if (!isPlainObject$
|
|
22298
|
+
if (!isPlainObject$6(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
22211
22299
|
return validatedBag(record["referenceProvenance"]);
|
|
22212
22300
|
}
|
|
22213
22301
|
function validatedBag(field) {
|
|
22214
|
-
if (!isPlainObject$
|
|
22302
|
+
if (!isPlainObject$6(field)) return void 0;
|
|
22215
22303
|
const out = Object.create(null);
|
|
22216
22304
|
for (const [token, raw] of Object.entries(field)) {
|
|
22217
22305
|
const entry = validateReferenceProvenance(token, raw);
|
|
@@ -22220,9 +22308,9 @@ function validatedBag(field) {
|
|
|
22220
22308
|
return { ...out };
|
|
22221
22309
|
}
|
|
22222
22310
|
function recordedProvenanceOf(record, token) {
|
|
22223
|
-
if (!isPlainObject$
|
|
22311
|
+
if (!isPlainObject$6(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
22224
22312
|
const field = record["referenceProvenance"];
|
|
22225
|
-
if (!isPlainObject$
|
|
22313
|
+
if (!isPlainObject$6(field) || !Object.hasOwn(field, token)) return void 0;
|
|
22226
22314
|
return validateReferenceProvenance(token, field[token]);
|
|
22227
22315
|
}
|
|
22228
22316
|
function recordedReferenceRegions(record) {
|
|
@@ -22244,7 +22332,7 @@ function regionsOf(field) {
|
|
|
22244
22332
|
function keepHeldTokenProvenance(record) {
|
|
22245
22333
|
if (!hasReferenceProvenanceField(record)) return record;
|
|
22246
22334
|
const field = record.referenceProvenance;
|
|
22247
|
-
if (!isPlainObject$
|
|
22335
|
+
if (!isPlainObject$6(field)) return record;
|
|
22248
22336
|
const held = recordReferenceTokens(record);
|
|
22249
22337
|
const keys = Object.keys(field);
|
|
22250
22338
|
if (keys.every((token) => held.has(token))) return record;
|
|
@@ -22256,12 +22344,12 @@ function keepHeldTokenProvenance(record) {
|
|
|
22256
22344
|
};
|
|
22257
22345
|
}
|
|
22258
22346
|
function hasReferenceProvenanceField(record) {
|
|
22259
|
-
return isPlainObject$
|
|
22347
|
+
return isPlainObject$6(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
|
|
22260
22348
|
}
|
|
22261
22349
|
function outputReferenceProvenanceOf(state, outputKey) {
|
|
22262
|
-
if (!isPlainObject$
|
|
22350
|
+
if (!isPlainObject$6(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
|
|
22263
22351
|
const field = state["outputReferenceProvenance"];
|
|
22264
|
-
if (!isPlainObject$
|
|
22352
|
+
if (!isPlainObject$6(field) || !Object.hasOwn(field, outputKey)) return void 0;
|
|
22265
22353
|
return validatedBag(field[outputKey]);
|
|
22266
22354
|
}
|
|
22267
22355
|
function persistable(token, entry) {
|
|
@@ -22279,7 +22367,7 @@ function tokensUnderPaths(properties, paths) {
|
|
|
22279
22367
|
for (const item of value) descend(item, path, next);
|
|
22280
22368
|
return;
|
|
22281
22369
|
}
|
|
22282
|
-
if (isPlainObject$
|
|
22370
|
+
if (isPlainObject$6(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
|
|
22283
22371
|
};
|
|
22284
22372
|
for (const path of paths) descend(properties, path, 0);
|
|
22285
22373
|
return out;
|
|
@@ -22322,7 +22410,7 @@ function unionWithPrevious(pass, before) {
|
|
|
22322
22410
|
}
|
|
22323
22411
|
function outputProvenanceForPersist(args) {
|
|
22324
22412
|
const { outputs, resolvedThisRun, carriedFrom, sinkOf } = args;
|
|
22325
|
-
if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$
|
|
22413
|
+
if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$6(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
|
|
22326
22414
|
let out;
|
|
22327
22415
|
for (const [outputKey, value] of Object.entries(outputs)) {
|
|
22328
22416
|
const sink = sinkOf(outputKey);
|
|
@@ -25844,17 +25932,17 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
25844
25932
|
|
|
25845
25933
|
//#endregion
|
|
25846
25934
|
//#region src/analyzer/read-provenance-promotion.ts
|
|
25847
|
-
function isPlainObject$
|
|
25935
|
+
function isPlainObject$5(value) {
|
|
25848
25936
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
25849
25937
|
}
|
|
25850
25938
|
function readsAcrossStacks(value) {
|
|
25851
25939
|
if (Array.isArray(value)) return value.some(readsAcrossStacks);
|
|
25852
|
-
if (!isPlainObject$
|
|
25940
|
+
if (!isPlainObject$5(value)) return false;
|
|
25853
25941
|
if (Object.hasOwn(value, "Fn::ImportValue") || Object.hasOwn(value, "Fn::GetStackOutput")) return true;
|
|
25854
25942
|
return Object.values(value).some(readsAcrossStacks);
|
|
25855
25943
|
}
|
|
25856
25944
|
function recordedReadVersions(record) {
|
|
25857
|
-
if (!isPlainObject$
|
|
25945
|
+
if (!isPlainObject$5(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
25858
25946
|
const field = referenceProvenanceOf(record);
|
|
25859
25947
|
if (field === void 0) return void 0;
|
|
25860
25948
|
let out;
|
|
@@ -25865,7 +25953,7 @@ async function readProvenancePromotions(args) {
|
|
|
25865
25953
|
const { currentState, desiredTemplate, sources } = args;
|
|
25866
25954
|
const parser = args.parser ?? new TemplateParser();
|
|
25867
25955
|
const records = currentState.resources;
|
|
25868
|
-
const parameters = isPlainObject$
|
|
25956
|
+
const parameters = isPlainObject$5(desiredTemplate.Parameters) ? desiredTemplate.Parameters : void 0;
|
|
25869
25957
|
const out = [];
|
|
25870
25958
|
for (const { logicalId, changeType } of args.rows) {
|
|
25871
25959
|
if (changeType !== "NO_CHANGE" && changeType !== "UPDATE") continue;
|
|
@@ -25873,7 +25961,7 @@ async function readProvenancePromotions(args) {
|
|
|
25873
25961
|
const readVersions = recordedReadVersions(record);
|
|
25874
25962
|
if (readVersions === void 0) continue;
|
|
25875
25963
|
const resource = Object.hasOwn(desiredTemplate.Resources, logicalId) ? desiredTemplate.Resources[logicalId] : void 0;
|
|
25876
|
-
const properties = isPlainObject$
|
|
25964
|
+
const properties = isPlainObject$5(resource?.Properties) ? resource.Properties : {};
|
|
25877
25965
|
const reads = [];
|
|
25878
25966
|
for (const [key, value] of Object.entries(properties)) {
|
|
25879
25967
|
const referenced = [...parser.extractReferences(value)].filter((id) => id !== logicalId);
|
|
@@ -25916,7 +26004,7 @@ async function readProvenancePromotions(args) {
|
|
|
25916
26004
|
if (recorded.some((version) => !domain.has(version))) moved.push(token);
|
|
25917
26005
|
}
|
|
25918
26006
|
if (moved.length === 0) continue;
|
|
25919
|
-
const recordProperties = isPlainObject$
|
|
26007
|
+
const recordProperties = isPlainObject$5(record?.properties) ? record.properties : {};
|
|
25920
26008
|
const keys = [];
|
|
25921
26009
|
for (const r of reads) {
|
|
25922
26010
|
if (!Object.hasOwn(recordProperties, r.key)) continue;
|
|
@@ -25956,7 +26044,10 @@ const INTRINSIC_KEYS = /* @__PURE__ */ new Set([
|
|
|
25956
26044
|
"Fn::Or",
|
|
25957
26045
|
"Fn::Not"
|
|
25958
26046
|
]);
|
|
25959
|
-
const IN_PLACE_UPDATE_DERIVED_ATTRS = Object.freeze({
|
|
26047
|
+
const IN_PLACE_UPDATE_DERIVED_ATTRS = Object.freeze({
|
|
26048
|
+
"AWS::EC2::LaunchTemplate": /* @__PURE__ */ new Set(["LatestVersionNumber", "DefaultVersionNumber"]),
|
|
26049
|
+
"AWS::EC2::Instance": /* @__PURE__ */ new Set(["PublicIp", "PublicDnsName"])
|
|
26050
|
+
});
|
|
25960
26051
|
const IN_PLACE_UPDATE_DERIVED_ATTR_PREFIXES = Object.freeze({ "AWS::CloudFormation::Stack": Object.freeze(["Outputs."]) });
|
|
25961
26052
|
const REF_READ = "<Ref>";
|
|
25962
26053
|
function containsIntrinsic(value, seen = /* @__PURE__ */ new Set()) {
|
|
@@ -25974,12 +26065,19 @@ function replacementSidesForLog(oldValue, newValue, mask) {
|
|
|
25974
26065
|
if (newText !== maskedJsonForLog(newValue, (text) => text)) return ["***", newText];
|
|
25975
26066
|
return [maskedJsonForLog(oldValue, mask), newText];
|
|
25976
26067
|
}
|
|
26068
|
+
function siblingsOf(change) {
|
|
26069
|
+
if (change.currentProperties === void 0 || change.desiredProperties === void 0) return;
|
|
26070
|
+
return {
|
|
26071
|
+
oldProperties: change.currentProperties,
|
|
26072
|
+
newProperties: change.desiredProperties
|
|
26073
|
+
};
|
|
26074
|
+
}
|
|
25977
26075
|
var DiffCalculator = class DiffCalculator {
|
|
25978
26076
|
logger = getLogger().child("DiffCalculator");
|
|
25979
26077
|
replacementRules = new ReplacementRulesRegistry();
|
|
25980
26078
|
parser = new TemplateParser();
|
|
25981
|
-
conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue) {
|
|
25982
|
-
return this.replacementRules.conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue);
|
|
26079
|
+
conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue, siblings) {
|
|
26080
|
+
return this.replacementRules.conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue, siblings);
|
|
25983
26081
|
}
|
|
25984
26082
|
async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs, refusalRecovery, noEchoCompare, readProvenance) {
|
|
25985
26083
|
const changes = /* @__PURE__ */ new Map();
|
|
@@ -26068,7 +26166,10 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26068
26166
|
path: key,
|
|
26069
26167
|
oldValue,
|
|
26070
26168
|
newValue,
|
|
26071
|
-
requiresReplacement: await this.maskedEditRequiresReplacement(desiredResource.Type, key, oldValue, newValue
|
|
26169
|
+
requiresReplacement: await this.maskedEditRequiresReplacement(desiredResource.Type, key, oldValue, newValue, {
|
|
26170
|
+
oldProperties: currentCompared,
|
|
26171
|
+
newProperties: desiredCompared
|
|
26172
|
+
}),
|
|
26072
26173
|
maskedExpressionChanged: true
|
|
26073
26174
|
});
|
|
26074
26175
|
this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed`);
|
|
@@ -26115,7 +26216,7 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26115
26216
|
const syntheticCreateOnlyPaths = await this.loadSyntheticCreateOnlyPaths(changes, desiredTemplate, rawGetAttRefs, freshParameters, forcedReplacements);
|
|
26116
26217
|
for (const { change, pc, upstreams } of provenanceChanges) {
|
|
26117
26218
|
const templateValue = desiredTemplate.Resources[change.logicalId]?.Properties?.[pc.path];
|
|
26118
|
-
pc.requiresReplacement = this.syntheticRequiresReplacement(change.resourceType, pc.path, syntheticCreateOnlyPaths, upstreams.some((id) => isPlainReferenceTo(templateValue, id, desiredTemplate.Resources[id]?.Type)));
|
|
26219
|
+
pc.requiresReplacement = this.syntheticRequiresReplacement(change.resourceType, pc.path, syntheticCreateOnlyPaths, upstreams.some((id) => isPlainReferenceTo(templateValue, id, desiredTemplate.Resources[id]?.Type)), siblingsOf(change));
|
|
26119
26220
|
}
|
|
26120
26221
|
do
|
|
26121
26222
|
this.promoteReplacementDependents(changes, desiredTemplate, syntheticCreateOnlyPaths, forcedReplacements);
|
|
@@ -26233,8 +26334,8 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26233
26334
|
}));
|
|
26234
26335
|
return loaded;
|
|
26235
26336
|
}
|
|
26236
|
-
syntheticRequiresReplacement(resourceType, propKey, syntheticCreateOnlyPaths, plainReference) {
|
|
26237
|
-
if (this.replacementRules.requiresReplacement(resourceType, propKey, void 0, void 0)) return true;
|
|
26337
|
+
syntheticRequiresReplacement(resourceType, propKey, syntheticCreateOnlyPaths, plainReference, siblings) {
|
|
26338
|
+
if (this.replacementRules.requiresReplacement(resourceType, propKey, void 0, void 0, siblings)) return true;
|
|
26238
26339
|
if (this.replacementRules.isClassified(resourceType, propKey)) return false;
|
|
26239
26340
|
const createOnly = syntheticCreateOnlyPaths.get(resourceType);
|
|
26240
26341
|
if (createOnly === void 0 || !createOnly.whole.has(propKey)) return false;
|
|
@@ -26283,7 +26384,7 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26283
26384
|
oldValue,
|
|
26284
26385
|
newValue,
|
|
26285
26386
|
replacementPropagated: true,
|
|
26286
|
-
requiresReplacement: this.syntheticRequiresReplacement(change.resourceType, propKey, syntheticCreateOnlyPaths, isPlainReferenceTo(desiredTemplate.Resources[dependentId]?.Properties?.[propKey], replacedId, desiredTemplate.Resources[replacedId]?.Type)) || namesRecreatedParent(change.resourceType, propKey, changes.get(replacedId)?.resourceType)
|
|
26387
|
+
requiresReplacement: this.syntheticRequiresReplacement(change.resourceType, propKey, syntheticCreateOnlyPaths, isPlainReferenceTo(desiredTemplate.Resources[dependentId]?.Properties?.[propKey], replacedId, desiredTemplate.Resources[replacedId]?.Type), siblingsOf(change)) || namesRecreatedParent(change.resourceType, propKey, changes.get(replacedId)?.resourceType)
|
|
26287
26388
|
});
|
|
26288
26389
|
}
|
|
26289
26390
|
if (syntheticChanges.length === 0) continue;
|
|
@@ -26358,7 +26459,7 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26358
26459
|
path: propKey,
|
|
26359
26460
|
oldValue: change.currentProperties?.[propKey],
|
|
26360
26461
|
newValue: change.desiredProperties?.[propKey],
|
|
26361
|
-
requiresReplacement: this.syntheticRequiresReplacement(change.resourceType, propKey, syntheticCreateOnlyPaths, false),
|
|
26462
|
+
requiresReplacement: this.syntheticRequiresReplacement(change.resourceType, propKey, syntheticCreateOnlyPaths, false, siblingsOf(change)),
|
|
26362
26463
|
inPlacePropagated: true,
|
|
26363
26464
|
...noEchoPromoted && { noEchoPromoted: true }
|
|
26364
26465
|
});
|
|
@@ -26474,7 +26575,10 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26474
26575
|
const oldValue = currentProperties[key];
|
|
26475
26576
|
const newValue = desiredProperties[key];
|
|
26476
26577
|
if (!this.valuesEqual(oldValue, newValue)) {
|
|
26477
|
-
let requiresReplacement = this.replacementRules.requiresReplacement(resourceType, key, oldValue, newValue
|
|
26578
|
+
let requiresReplacement = this.replacementRules.requiresReplacement(resourceType, key, oldValue, newValue, {
|
|
26579
|
+
oldProperties: currentProperties,
|
|
26580
|
+
newProperties: desiredProperties
|
|
26581
|
+
});
|
|
26478
26582
|
if (!requiresReplacement && !this.replacementRules.isClassified(resourceType, key)) {
|
|
26479
26583
|
if (createOnlyPaths === void 0) createOnlyPaths = await getCreateOnlyPropertyPaths(resourceType);
|
|
26480
26584
|
if (createOnlyChangeRequiresReplacement(createOnlyPaths, key, oldValue, newValue, (a, b) => this.valuesEqual(a, b))) {
|
|
@@ -26497,9 +26601,9 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26497
26601
|
}
|
|
26498
26602
|
return changes;
|
|
26499
26603
|
}
|
|
26500
|
-
async maskedEditRequiresReplacement(resourceType, key, oldValue, newValue) {
|
|
26501
|
-
if (this.replacementRules.requiresReplacement(resourceType, key, oldValue, newValue)) return true;
|
|
26502
|
-
if (this.replacementRules.isClassified(resourceType, key) && this.replacementRules.conditionalReplacementVerdict(resourceType, key, oldValue, newValue) === void 0) return false;
|
|
26604
|
+
async maskedEditRequiresReplacement(resourceType, key, oldValue, newValue, siblings) {
|
|
26605
|
+
if (this.replacementRules.requiresReplacement(resourceType, key, oldValue, newValue, siblings)) return true;
|
|
26606
|
+
if (this.replacementRules.isClassified(resourceType, key) && this.replacementRules.conditionalReplacementVerdict(resourceType, key, oldValue, newValue, siblings) === void 0) return false;
|
|
26503
26607
|
return (await getCreateOnlyPropertyPaths(resourceType)).some((path) => path.length === 1 && path[0] === key);
|
|
26504
26608
|
}
|
|
26505
26609
|
static INTRINSIC_KEYS = INTRINSIC_KEYS;
|
|
@@ -27489,8 +27593,8 @@ function compare(desired, previous, mask) {
|
|
|
27489
27593
|
if (!Array.isArray(desired) || desired.length !== previous.length) return "differs";
|
|
27490
27594
|
return combine(previous.map((item, i) => compare(desired[i], item, mask)));
|
|
27491
27595
|
}
|
|
27492
|
-
if (isPlainObject$
|
|
27493
|
-
if (!isPlainObject$
|
|
27596
|
+
if (isPlainObject$4(previous)) {
|
|
27597
|
+
if (!isPlainObject$4(desired)) return "differs";
|
|
27494
27598
|
if (!Object.keys(desired).every((k) => Object.prototype.hasOwnProperty.call(previous, k))) return "differs";
|
|
27495
27599
|
return combine(Object.keys(previous).map((k) => compare(desired[k], previous[k], mask)));
|
|
27496
27600
|
}
|
|
@@ -27516,7 +27620,7 @@ function resolvesReference(desired, previous, mask) {
|
|
|
27516
27620
|
const pattern = literals.map(escapeRegExp$1).join("[\\s\\S]*");
|
|
27517
27621
|
return new RegExp(`^${pattern}$`).test(desired);
|
|
27518
27622
|
}
|
|
27519
|
-
function isPlainObject$
|
|
27623
|
+
function isPlainObject$4(value) {
|
|
27520
27624
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27521
27625
|
}
|
|
27522
27626
|
function escapeRegExp$1(text) {
|
|
@@ -27908,6 +28012,7 @@ const SLOW_CC_OPERATION_TIMEOUTS = {
|
|
|
27908
28012
|
},
|
|
27909
28013
|
"AWS::ElastiCache::CacheCluster": {
|
|
27910
28014
|
create: 60 * MINUTE_MS,
|
|
28015
|
+
update: 60 * MINUTE_MS,
|
|
27911
28016
|
delete: 60 * MINUTE_MS
|
|
27912
28017
|
},
|
|
27913
28018
|
"AWS::RDS::DBInstance": {
|
|
@@ -27918,6 +28023,8 @@ const SLOW_CC_OPERATION_TIMEOUTS = {
|
|
|
27918
28023
|
create: 60 * MINUTE_MS,
|
|
27919
28024
|
delete: 60 * MINUTE_MS
|
|
27920
28025
|
},
|
|
28026
|
+
"AWS::DynamoDB::Table": { update: 75 * MINUTE_MS },
|
|
28027
|
+
"AWS::DynamoDB::GlobalTable": { update: 75 * MINUTE_MS },
|
|
27921
28028
|
"AWS::EKS::Cluster": {
|
|
27922
28029
|
create: 30 * MINUTE_MS,
|
|
27923
28030
|
delete: 30 * MINUTE_MS
|
|
@@ -28466,7 +28573,7 @@ var CloudControlProvider = class {
|
|
|
28466
28573
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
28467
28574
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
28468
28575
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
28469
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
28576
|
+
const { ASGProvider } = await import("./asg-provider-B7pAjRIc.js");
|
|
28470
28577
|
const delegateRegion = ambientRegion();
|
|
28471
28578
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
28472
28579
|
if (asgProvider === void 0) {
|
|
@@ -28575,7 +28682,7 @@ var CloudControlProvider = class {
|
|
|
28575
28682
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
28576
28683
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
28577
28684
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
28578
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
28685
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-CZhBLQgJ.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-Y3Ii8oYI.js"))).NeptuneProvider({ region: ccRegion });
|
|
28579
28686
|
this.sdkDeleteDelegates.set(family, {
|
|
28580
28687
|
region: ccRegion,
|
|
28581
28688
|
provider
|
|
@@ -29731,11 +29838,11 @@ function applyNoEchoDeleteValues(properties, recordedLeaves, values) {
|
|
|
29731
29838
|
payload: properties,
|
|
29732
29839
|
unresolved: []
|
|
29733
29840
|
};
|
|
29734
|
-
const byKey = new Map((values?.leaves ?? []).map((leaf) => [canonicalJson$
|
|
29841
|
+
const byKey = new Map((values?.leaves ?? []).map((leaf) => [canonicalJson$4(leaf.coordinate), leaf]));
|
|
29735
29842
|
const entries = [];
|
|
29736
29843
|
const unresolved = [];
|
|
29737
29844
|
for (const coordinate of masked) {
|
|
29738
|
-
const leaf = byKey.get(canonicalJson$
|
|
29845
|
+
const leaf = byKey.get(canonicalJson$4(coordinate));
|
|
29739
29846
|
if (leaf === void 0) unresolved.push(coordinate);
|
|
29740
29847
|
else entries.push({
|
|
29741
29848
|
coordinate,
|
|
@@ -29786,7 +29893,7 @@ async function noEchoDeleteValuesFromResolved(options) {
|
|
|
29786
29893
|
const fingerprinter = options.inputSources === void 0 ? void 0 : inputFingerprinter(templateProps, options.inputSources);
|
|
29787
29894
|
const leaves = [];
|
|
29788
29895
|
for (const coordinate of masked) {
|
|
29789
|
-
if (!nodes.has(canonicalJson$
|
|
29896
|
+
if (!nodes.has(canonicalJson$4(coordinate))) continue;
|
|
29790
29897
|
if (!await fingerprintsUnchanged(record, templateProps, coordinate, fingerprinter)) continue;
|
|
29791
29898
|
const value = valueAtCoordinate(resolvedProperties, coordinate);
|
|
29792
29899
|
if (value === void 0 || carriesSecretMask(value)) continue;
|
|
@@ -29965,7 +30072,7 @@ var TemplateNoEchoReresolver = class TemplateNoEchoReresolver {
|
|
|
29965
30072
|
const bag = await this.noEchoNeedles();
|
|
29966
30073
|
const leaves = [];
|
|
29967
30074
|
for (const coordinate of masked) {
|
|
29968
|
-
const key = canonicalJson$
|
|
30075
|
+
const key = canonicalJson$4(coordinate);
|
|
29969
30076
|
if (!nodes.has(key)) continue;
|
|
29970
30077
|
const node = nodes.get(key)?.node;
|
|
29971
30078
|
if (!readsParametersOnly(node, declared, refused)) continue;
|
|
@@ -37056,7 +37163,7 @@ const DEFAULT_RESOURCE_TIMEOUT_MS = 18e5;
|
|
|
37056
37163
|
|
|
37057
37164
|
//#endregion
|
|
37058
37165
|
//#region src/analyzer/skipped-outputs.ts
|
|
37059
|
-
function canonicalJson$
|
|
37166
|
+
function canonicalJson$2(value) {
|
|
37060
37167
|
return JSON.stringify(value, (_key, v) => {
|
|
37061
37168
|
if (v !== null && typeof v === "object" && !Array.isArray(v)) {
|
|
37062
37169
|
const sorted = Object.create(null);
|
|
@@ -37086,7 +37193,7 @@ function skippedOutputDigest(template, outputKey) {
|
|
|
37086
37193
|
sections[section] = section === "Parameters" ? withNoEchoDefaultsMasked(body) : body;
|
|
37087
37194
|
}
|
|
37088
37195
|
const entry = template.Outputs?.[outputKey];
|
|
37089
|
-
return createHash("sha256").update(canonicalJson$
|
|
37196
|
+
return createHash("sha256").update(canonicalJson$2({
|
|
37090
37197
|
output: entry,
|
|
37091
37198
|
template: sections
|
|
37092
37199
|
})).digest("hex");
|
|
@@ -38959,7 +39066,7 @@ function maskRestoredNoEchoRecord(record, baseline, substituted = []) {
|
|
|
38959
39066
|
const marked = noEchoLeavesOf(baseline) ?? [];
|
|
38960
39067
|
const names = declaredNoEchoAttributeNames(baseline);
|
|
38961
39068
|
if (marked.length === 0 && names.length === 0 && substituted.length === 0) return record;
|
|
38962
|
-
const echoes = (name, value) => value !== record.physicalId && substituted.some((leaf) => leaf.coordinate[0] === name && canonicalJson$
|
|
39069
|
+
const echoes = (name, value) => value !== record.physicalId && substituted.some((leaf) => leaf.coordinate[0] === name && canonicalJson$4(leaf.value) === canonicalJson$4(value));
|
|
38963
39070
|
let attributes = record.attributes;
|
|
38964
39071
|
if (attributes !== void 0 && attributes !== null && typeof attributes === "object") for (const [name, value] of Object.entries(attributes)) {
|
|
38965
39072
|
if (!names.includes(name) && !echoes(name, value)) continue;
|
|
@@ -38970,7 +39077,7 @@ function maskRestoredNoEchoRecord(record, baseline, substituted = []) {
|
|
|
38970
39077
|
const list = coordinate.findIndex((segment) => typeof segment === "number");
|
|
38971
39078
|
if (list < 0) return false;
|
|
38972
39079
|
const path = coordinate.slice(0, list);
|
|
38973
|
-
return canonicalJson$
|
|
39080
|
+
return canonicalJson$4(valueAtCoordinate(byIndex, path)) !== canonicalJson$4(valueAtCoordinate(baseline.properties, path));
|
|
38974
39081
|
});
|
|
38975
39082
|
const properties = reshaped.length === 0 ? byIndex : maskReadbackAtCoordinates(byIndex, baseline.properties, reshaped);
|
|
38976
39083
|
const widened = reshaped.map((coordinate) => readbackPathFor(byIndex, baseline.properties, coordinate)).filter((path, i) => path !== void 0 && path.length < reshaped[i].length);
|
|
@@ -44819,18 +44926,18 @@ function conditionInputsFrom(args) {
|
|
|
44819
44926
|
};
|
|
44820
44927
|
}
|
|
44821
44928
|
const FINGERPRINT_LAYOUT = 1;
|
|
44822
|
-
function isPlainObject$
|
|
44929
|
+
function isPlainObject$3(value) {
|
|
44823
44930
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
44824
44931
|
}
|
|
44825
|
-
function canonicalJson(value) {
|
|
44826
|
-
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
|
|
44827
|
-
if (isPlainObject$
|
|
44932
|
+
function canonicalJson$1(value) {
|
|
44933
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson$1).join(",")}]`;
|
|
44934
|
+
if (isPlainObject$3(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$1(value[key])}`).join(",")}}`;
|
|
44828
44935
|
const encoded = JSON.stringify(value);
|
|
44829
44936
|
return encoded === void 0 ? "undefined" : encoded;
|
|
44830
44937
|
}
|
|
44831
44938
|
function walkModelledDefinition(value, declaredParameters, parameters, conditions) {
|
|
44832
44939
|
if (typeof value === "string") return !carriesDynamicReference(value);
|
|
44833
|
-
if (!isPlainObject$
|
|
44940
|
+
if (!isPlainObject$3(value)) return false;
|
|
44834
44941
|
const keys = Object.keys(value);
|
|
44835
44942
|
if (keys.length !== 1) return false;
|
|
44836
44943
|
const [key] = keys;
|
|
@@ -44853,8 +44960,8 @@ function walkModelledDefinition(value, declaredParameters, parameters, condition
|
|
|
44853
44960
|
}
|
|
44854
44961
|
function conditionFingerprint(template, name, inputOf) {
|
|
44855
44962
|
const definitions = template.Conditions;
|
|
44856
|
-
if (!isPlainObject$
|
|
44857
|
-
const declared = isPlainObject$
|
|
44963
|
+
if (!isPlainObject$3(definitions)) return void 0;
|
|
44964
|
+
const declared = isPlainObject$3(template.Parameters) ? template.Parameters : {};
|
|
44858
44965
|
const declaredNames = new Set(Object.keys(declared));
|
|
44859
44966
|
const closure = nullPrototypeRecord();
|
|
44860
44967
|
const parameters = /* @__PURE__ */ new Set();
|
|
@@ -44876,7 +44983,7 @@ function conditionFingerprint(template, name, inputOf) {
|
|
|
44876
44983
|
let hasToken = false;
|
|
44877
44984
|
for (const parameter of parameters) {
|
|
44878
44985
|
const definition = declared[parameter];
|
|
44879
|
-
const type = isPlainObject$
|
|
44986
|
+
const type = isPlainObject$3(definition) ? definition["Type"] : void 0;
|
|
44880
44987
|
if (typeof type !== "string") return void 0;
|
|
44881
44988
|
const input = inputOf(parameter);
|
|
44882
44989
|
if (input === void 0) return void 0;
|
|
@@ -44894,7 +45001,7 @@ function conditionFingerprint(template, name, inputOf) {
|
|
|
44894
45001
|
}
|
|
44895
45002
|
}
|
|
44896
45003
|
return {
|
|
44897
|
-
fingerprint: `sha256:${createHash("sha256").update(canonicalJson({
|
|
45004
|
+
fingerprint: `sha256:${createHash("sha256").update(canonicalJson$1({
|
|
44898
45005
|
layout: FINGERPRINT_LAYOUT,
|
|
44899
45006
|
conditions: closure,
|
|
44900
45007
|
parameters: inputs
|
|
@@ -44907,7 +45014,7 @@ function collectIfConditionNames(value, names, conditions) {
|
|
|
44907
45014
|
for (const element of value) collectIfConditionNames(element, names, conditions);
|
|
44908
45015
|
return;
|
|
44909
45016
|
}
|
|
44910
|
-
if (!isPlainObject$
|
|
45017
|
+
if (!isPlainObject$3(value)) return;
|
|
44911
45018
|
const ifArgs = value["Fn::If"];
|
|
44912
45019
|
if (Array.isArray(ifArgs) && typeof ifArgs[0] === "string") {
|
|
44913
45020
|
names.add(ifArgs[0]);
|
|
@@ -44921,9 +45028,9 @@ function collectIfConditionNames(value, names, conditions) {
|
|
|
44921
45028
|
function conditionsReadByDiff(template, conditions) {
|
|
44922
45029
|
const names = /* @__PURE__ */ new Set();
|
|
44923
45030
|
for (const section of [template.Resources, template.Outputs]) {
|
|
44924
|
-
if (!isPlainObject$
|
|
45031
|
+
if (!isPlainObject$3(section)) continue;
|
|
44925
45032
|
for (const entry of Object.values(section)) {
|
|
44926
|
-
if (!isPlainObject$
|
|
45033
|
+
if (!isPlainObject$3(entry)) continue;
|
|
44927
45034
|
const gate = entry["Condition"];
|
|
44928
45035
|
if (typeof gate === "string") {
|
|
44929
45036
|
names.add(gate);
|
|
@@ -44955,10 +45062,10 @@ function buildConditionVerdictRecord(template, conditions, inputOf) {
|
|
|
44955
45062
|
function readRecordedConditionVerdicts(state) {
|
|
44956
45063
|
const read = nullPrototypeRecord();
|
|
44957
45064
|
const field = state?.conditionVerdicts;
|
|
44958
|
-
if (!isPlainObject$
|
|
45065
|
+
if (!isPlainObject$3(field)) return read;
|
|
44959
45066
|
for (const name of Object.keys(field)) {
|
|
44960
45067
|
const entry = field[name];
|
|
44961
|
-
if (isPlainObject$
|
|
45068
|
+
if (isPlainObject$3(entry) && typeof entry["verdict"] === "boolean" && typeof entry["fingerprint"] === "string") read[name] = {
|
|
44962
45069
|
verdict: entry["verdict"],
|
|
44963
45070
|
fingerprint: entry["fingerprint"]
|
|
44964
45071
|
};
|
|
@@ -45004,11 +45111,11 @@ function deployConditionInputs(parameterValues, inheritedSecrets, shadowedBy = /
|
|
|
45004
45111
|
function parentSuppliedValues(template, supplied, tokens) {
|
|
45005
45112
|
const names = /* @__PURE__ */ new Set();
|
|
45006
45113
|
if (supplied === void 0) return names;
|
|
45007
|
-
const declared = isPlainObject$
|
|
45114
|
+
const declared = isPlainObject$3(template.Parameters) ? template.Parameters : {};
|
|
45008
45115
|
for (const [name, value] of Object.entries(supplied)) {
|
|
45009
45116
|
if (tokens.has(name)) continue;
|
|
45010
45117
|
const definition = declared[name];
|
|
45011
|
-
const fallback = isPlainObject$
|
|
45118
|
+
const fallback = isPlainObject$3(definition) ? definition["Default"] : void 0;
|
|
45012
45119
|
if (fallback === void 0 || String(fallback) !== String(value)) names.add(name);
|
|
45013
45120
|
}
|
|
45014
45121
|
return names;
|
|
@@ -45343,7 +45450,7 @@ function deferredServiceTokenWarning(row) {
|
|
|
45343
45450
|
|
|
45344
45451
|
//#endregion
|
|
45345
45452
|
//#region src/deployment/read-provenance-sources.ts
|
|
45346
|
-
function isPlainObject(value) {
|
|
45453
|
+
function isPlainObject$2(value) {
|
|
45347
45454
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
45348
45455
|
}
|
|
45349
45456
|
function crossStackNodes(value, into = []) {
|
|
@@ -45351,7 +45458,7 @@ function crossStackNodes(value, into = []) {
|
|
|
45351
45458
|
for (const item of value) crossStackNodes(item, into);
|
|
45352
45459
|
return into;
|
|
45353
45460
|
}
|
|
45354
|
-
if (!isPlainObject(value)) return into;
|
|
45461
|
+
if (!isPlainObject$2(value)) return into;
|
|
45355
45462
|
const keys = Object.keys(value);
|
|
45356
45463
|
if (keys.length === 1 && (keys[0] === "Fn::ImportValue" || keys[0] === "Fn::GetStackOutput")) into.push(value);
|
|
45357
45464
|
for (const item of Object.values(value)) crossStackNodes(item, into);
|
|
@@ -45375,11 +45482,11 @@ function crossStackOutputProvenanceSource(reads, scope, stateBackend) {
|
|
|
45375
45482
|
function inheritedProvenanceForChildDiff(args) {
|
|
45376
45483
|
const { row, rowRecord, parentRecords, parentTemplate } = args;
|
|
45377
45484
|
if (!args.rowProvisioned || rowRecord === void 0) return void 0;
|
|
45378
|
-
const recordedParameters = isPlainObject(rowRecord.properties) ? rowRecord.properties["Parameters"] : void 0;
|
|
45485
|
+
const recordedParameters = isPlainObject$2(rowRecord.properties) ? rowRecord.properties["Parameters"] : void 0;
|
|
45379
45486
|
const tokens = referenceTokensIn(recordedParameters);
|
|
45380
45487
|
if (tokens.size === 0) return void 0;
|
|
45381
45488
|
const own = referenceProvenanceOf(rowRecord);
|
|
45382
|
-
const upstreams = [...new TemplateParser().extractReferences(isPlainObject(row.Properties) ? row.Properties["Parameters"] : void 0)].filter((id) => Object.hasOwn(parentTemplate.Resources, id) && Object.hasOwn(parentRecords, id));
|
|
45489
|
+
const upstreams = [...new TemplateParser().extractReferences(isPlainObject$2(row.Properties) ? row.Properties["Parameters"] : void 0)].filter((id) => Object.hasOwn(parentTemplate.Resources, id) && Object.hasOwn(parentRecords, id));
|
|
45383
45490
|
const out = /* @__PURE__ */ new Map();
|
|
45384
45491
|
for (const token of tokens) {
|
|
45385
45492
|
const versions = /* @__PURE__ */ new Set();
|
|
@@ -46210,6 +46317,73 @@ function isTruthyCfnBoolean(value) {
|
|
|
46210
46317
|
return value === true || value === "true";
|
|
46211
46318
|
}
|
|
46212
46319
|
|
|
46320
|
+
//#endregion
|
|
46321
|
+
//#region src/provisioning/dynamodb-ttl.ts
|
|
46322
|
+
function readTtlSpec(spec) {
|
|
46323
|
+
if (spec === void 0 || spec === null) return {
|
|
46324
|
+
enabled: false,
|
|
46325
|
+
attributeName: void 0
|
|
46326
|
+
};
|
|
46327
|
+
const s = spec;
|
|
46328
|
+
const rawName = s["AttributeName"];
|
|
46329
|
+
const attributeName = typeof rawName === "string" && rawName !== "" ? rawName : void 0;
|
|
46330
|
+
const rawEnabled = s["Enabled"];
|
|
46331
|
+
return {
|
|
46332
|
+
enabled: rawEnabled === void 0 ? true : typeof rawEnabled === "string" ? rawEnabled.toLowerCase() === "true" : Boolean(rawEnabled),
|
|
46333
|
+
attributeName
|
|
46334
|
+
};
|
|
46335
|
+
}
|
|
46336
|
+
function planTimeToLive(spec, previousSpec, mode) {
|
|
46337
|
+
const desired = readTtlSpec(spec);
|
|
46338
|
+
if (spec !== void 0 && spec !== null && desired.enabled) return desired.attributeName ? {
|
|
46339
|
+
kind: "enable",
|
|
46340
|
+
attributeName: desired.attributeName
|
|
46341
|
+
} : { kind: "none" };
|
|
46342
|
+
if (mode === "create") return { kind: "none" };
|
|
46343
|
+
const previousPresent = previousSpec !== void 0 && previousSpec !== null;
|
|
46344
|
+
const previous = readTtlSpec(previousSpec);
|
|
46345
|
+
if (previousPresent && previous.enabled && previous.attributeName) return {
|
|
46346
|
+
kind: "disable",
|
|
46347
|
+
attributeName: previous.attributeName
|
|
46348
|
+
};
|
|
46349
|
+
return { kind: "disable-live" };
|
|
46350
|
+
}
|
|
46351
|
+
function isTtlAlreadyDisabled(awsDetail) {
|
|
46352
|
+
return /TimeToLive is already disabled/i.test(awsDetail);
|
|
46353
|
+
}
|
|
46354
|
+
function isTtlRateLimited(awsDetail) {
|
|
46355
|
+
return /Time to live has been modified multiple times/i.test(awsDetail);
|
|
46356
|
+
}
|
|
46357
|
+
const TTL_RATE_LIMIT_RETRY_MS = 6e4;
|
|
46358
|
+
const TTL_RATE_LIMIT_SLICE_MS = 1e3;
|
|
46359
|
+
async function sendTtlWaitingOutRateLimit(send, options) {
|
|
46360
|
+
const retryMs = options.retryMs ?? 6e4;
|
|
46361
|
+
const watch = startInterruptWatch(options.what);
|
|
46362
|
+
let announced = false;
|
|
46363
|
+
try {
|
|
46364
|
+
for (;;) try {
|
|
46365
|
+
await send();
|
|
46366
|
+
return;
|
|
46367
|
+
} catch (error) {
|
|
46368
|
+
if (!isTtlRateLimited(describeAwsFailure(error).detail)) throw error;
|
|
46369
|
+
if (enclosingDeadlineRemainingMs() <= 0) throw error;
|
|
46370
|
+
if (!announced) {
|
|
46371
|
+
options.announce();
|
|
46372
|
+
announced = true;
|
|
46373
|
+
}
|
|
46374
|
+
const until = Date.now() + Math.min(retryMs, enclosingDeadlineRemainingMs());
|
|
46375
|
+
while (Date.now() < until) {
|
|
46376
|
+
if (watch.isInterrupted()) throw watch.onInterrupted();
|
|
46377
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(TTL_RATE_LIMIT_SLICE_MS, until - Date.now())));
|
|
46378
|
+
}
|
|
46379
|
+
if (watch.isInterrupted()) throw watch.onInterrupted();
|
|
46380
|
+
if (enclosingDeadlineRemainingMs() <= 0) throw error;
|
|
46381
|
+
}
|
|
46382
|
+
} finally {
|
|
46383
|
+
watch.dispose();
|
|
46384
|
+
}
|
|
46385
|
+
}
|
|
46386
|
+
|
|
46213
46387
|
//#endregion
|
|
46214
46388
|
//#region src/provisioning/dynamodb-index-busy-delete.ts
|
|
46215
46389
|
function maskedLogger(logger, maskSecrets, name) {
|
|
@@ -46428,6 +46602,718 @@ function isResourceNotFoundError(error) {
|
|
|
46428
46602
|
return typeof error === "object" && error !== null && error.name === "ResourceNotFoundException";
|
|
46429
46603
|
}
|
|
46430
46604
|
|
|
46605
|
+
//#endregion
|
|
46606
|
+
//#region src/provisioning/dynamodb-contributor-insights.ts
|
|
46607
|
+
const CONTRIBUTOR_INSIGHTS_KEY = "ContributorInsightsSpecification";
|
|
46608
|
+
function readContributorInsightsSpec(value, path) {
|
|
46609
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
46610
|
+
const refusal = configBooleanRefusal(value, "Enabled", path) ?? configStringRefusal(value, "Mode", "", path);
|
|
46611
|
+
if (refusal !== void 0) return {
|
|
46612
|
+
kind: "unusable",
|
|
46613
|
+
reason: refusal
|
|
46614
|
+
};
|
|
46615
|
+
const block = value;
|
|
46616
|
+
const enabled = coerceCfnBoolean(block["Enabled"]) ?? false;
|
|
46617
|
+
const mode = block["Mode"];
|
|
46618
|
+
return typeof mode === "string" && mode.length > 0 ? {
|
|
46619
|
+
kind: "usable",
|
|
46620
|
+
enabled,
|
|
46621
|
+
mode
|
|
46622
|
+
} : {
|
|
46623
|
+
kind: "usable",
|
|
46624
|
+
enabled
|
|
46625
|
+
};
|
|
46626
|
+
}
|
|
46627
|
+
function planContributorInsightsOp(desired, previous, onUnusable) {
|
|
46628
|
+
if (desired.kind === "unusable") {
|
|
46629
|
+
onUnusable(desired.reason);
|
|
46630
|
+
return;
|
|
46631
|
+
}
|
|
46632
|
+
if (desired.kind === "absent") return previous.kind === "absent" ? void 0 : { action: "DISABLE" };
|
|
46633
|
+
if (previous.kind === "usable" && previous.enabled === desired.enabled && (!desired.enabled || previous.mode === desired.mode)) return;
|
|
46634
|
+
if (!desired.enabled) return { action: "DISABLE" };
|
|
46635
|
+
return desired.mode === void 0 ? { action: "ENABLE" } : {
|
|
46636
|
+
action: "ENABLE",
|
|
46637
|
+
mode: desired.mode
|
|
46638
|
+
};
|
|
46639
|
+
}
|
|
46640
|
+
const INDEX_CONTRIBUTOR_INSIGHTS_PATH = `GlobalSecondaryIndexes[].${CONTRIBUTOR_INSIGHTS_KEY}`;
|
|
46641
|
+
function indexEntriesByName(value) {
|
|
46642
|
+
const byName = /* @__PURE__ */ new Map();
|
|
46643
|
+
if (!Array.isArray(value)) return byName;
|
|
46644
|
+
for (const entry of value) {
|
|
46645
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) continue;
|
|
46646
|
+
const name = entry["IndexName"];
|
|
46647
|
+
if (typeof name === "string") byName.set(name, entry);
|
|
46648
|
+
}
|
|
46649
|
+
return byName;
|
|
46650
|
+
}
|
|
46651
|
+
function planIndexContributorInsightsOps(desiredIndexes, previousIndexes, onUnusable) {
|
|
46652
|
+
const previousByName = indexEntriesByName(previousIndexes);
|
|
46653
|
+
const ops = [];
|
|
46654
|
+
for (const [indexName, entry] of indexEntriesByName(desiredIndexes)) {
|
|
46655
|
+
const path = INDEX_CONTRIBUTOR_INSIGHTS_PATH;
|
|
46656
|
+
const op = planContributorInsightsOp(readContributorInsightsSpec(entry[CONTRIBUTOR_INSIGHTS_KEY], path), readContributorInsightsSpec(previousByName.get(indexName)?.[CONTRIBUTOR_INSIGHTS_KEY], path), (reason) => onUnusable(indexName, reason));
|
|
46657
|
+
if (op !== void 0) ops.push({
|
|
46658
|
+
indexName,
|
|
46659
|
+
...op
|
|
46660
|
+
});
|
|
46661
|
+
}
|
|
46662
|
+
return ops;
|
|
46663
|
+
}
|
|
46664
|
+
function contributorInsightsRefusals(tableBlock, indexes) {
|
|
46665
|
+
const refusals = [];
|
|
46666
|
+
const table = readContributorInsightsSpec(tableBlock, CONTRIBUTOR_INSIGHTS_KEY);
|
|
46667
|
+
if (table.kind === "unusable") refusals.push(table.reason);
|
|
46668
|
+
if (!Array.isArray(indexes)) return refusals;
|
|
46669
|
+
indexes.forEach((entry, position) => {
|
|
46670
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) return;
|
|
46671
|
+
const read = readContributorInsightsSpec(entry[CONTRIBUTOR_INSIGHTS_KEY], `GlobalSecondaryIndexes[${position}].${CONTRIBUTOR_INSIGHTS_KEY}`);
|
|
46672
|
+
if (read.kind === "unusable") refusals.push(read.reason);
|
|
46673
|
+
});
|
|
46674
|
+
return refusals;
|
|
46675
|
+
}
|
|
46676
|
+
function stripIndexContributorInsights(entry) {
|
|
46677
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) return entry;
|
|
46678
|
+
if (!("ContributorInsightsSpecification" in entry)) return entry;
|
|
46679
|
+
const { [CONTRIBUTOR_INSIGHTS_KEY]: _stripped, ...rest } = entry;
|
|
46680
|
+
return rest;
|
|
46681
|
+
}
|
|
46682
|
+
function indexDeclaresContributorInsights(desiredEntry) {
|
|
46683
|
+
return readContributorInsightsSpec(desiredEntry?.[CONTRIBUTOR_INSIGHTS_KEY], "").kind === "usable";
|
|
46684
|
+
}
|
|
46685
|
+
function enabledForStatus(status, transientAsTarget) {
|
|
46686
|
+
if (status === "ENABLED" || transientAsTarget && status === "ENABLING") return true;
|
|
46687
|
+
if (status === "DISABLED" || transientAsTarget && status === "DISABLING") return false;
|
|
46688
|
+
}
|
|
46689
|
+
function reverseMapTableContributorInsights(status, mode) {
|
|
46690
|
+
const enabled = enabledForStatus(status, false);
|
|
46691
|
+
if (enabled === void 0) return void 0;
|
|
46692
|
+
const block = { Enabled: enabled };
|
|
46693
|
+
if (enabled && mode !== void 0) block["Mode"] = mode;
|
|
46694
|
+
return block;
|
|
46695
|
+
}
|
|
46696
|
+
function reverseMapIndexContributorInsights(status, mode, declaredBlock) {
|
|
46697
|
+
const declared = readContributorInsightsSpec(declaredBlock, INDEX_CONTRIBUTOR_INSIGHTS_PATH);
|
|
46698
|
+
if (declared.kind !== "usable") return void 0;
|
|
46699
|
+
const enabled = enabledForStatus(status, true);
|
|
46700
|
+
if (enabled === void 0) return void 0;
|
|
46701
|
+
const declaredEnabled = declaredBlock["Enabled"];
|
|
46702
|
+
const block = { Enabled: typeof declaredEnabled !== "string" ? enabled : declared.enabled === enabled ? declaredEnabled : String(enabled) };
|
|
46703
|
+
if (enabled && declared.mode !== void 0) {
|
|
46704
|
+
const liveMode = mode ?? (status === "ENABLING" ? declared.mode : void 0);
|
|
46705
|
+
if (liveMode !== void 0) block["Mode"] = liveMode;
|
|
46706
|
+
}
|
|
46707
|
+
return block;
|
|
46708
|
+
}
|
|
46709
|
+
|
|
46710
|
+
//#endregion
|
|
46711
|
+
//#region src/provisioning/dynamodb-replica-settings.ts
|
|
46712
|
+
const PITR_KEY = "PointInTimeRecoverySpecification";
|
|
46713
|
+
const KINESIS_KEY = "KinesisStreamSpecification";
|
|
46714
|
+
const TABLE_POLICY_KEY = "ResourcePolicy";
|
|
46715
|
+
const REPLICA_STREAM_KEY = "ReplicaStreamSpecification";
|
|
46716
|
+
const DEFAULT_RECOVERY_PERIOD_DAYS = 35;
|
|
46717
|
+
const DEFAULT_KINESIS_PRECISION = "MILLISECOND";
|
|
46718
|
+
const PITR_PATH = `Replicas[].${PITR_KEY}`;
|
|
46719
|
+
const CI_PATH = `Replicas[].${CONTRIBUTOR_INSIGHTS_KEY}`;
|
|
46720
|
+
const KINESIS_PATH = `Replicas[].${KINESIS_KEY}`;
|
|
46721
|
+
const TABLE_POLICY_PATH = `Replicas[].${TABLE_POLICY_KEY}`;
|
|
46722
|
+
const STREAM_POLICY_PATH = `Replicas[].${REPLICA_STREAM_KEY}.ResourcePolicy`;
|
|
46723
|
+
function isPlainObject$1(value) {
|
|
46724
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
46725
|
+
}
|
|
46726
|
+
function readPitrSpec(value) {
|
|
46727
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
46728
|
+
const refusal = configBooleanRefusal(value, "PointInTimeRecoveryEnabled", PITR_PATH) ?? configIntegerRefusal(value, "RecoveryPeriodInDays", PITR_PATH, 1, 35);
|
|
46729
|
+
if (refusal !== void 0) return {
|
|
46730
|
+
kind: "unusable",
|
|
46731
|
+
reason: refusal
|
|
46732
|
+
};
|
|
46733
|
+
const block = value;
|
|
46734
|
+
const enabled = coerceCfnBoolean(block["PointInTimeRecoveryEnabled"]) ?? false;
|
|
46735
|
+
const period = enabled ? coerceCfnInteger(block["RecoveryPeriodInDays"]) : void 0;
|
|
46736
|
+
return period === void 0 ? {
|
|
46737
|
+
kind: "usable",
|
|
46738
|
+
enabled
|
|
46739
|
+
} : {
|
|
46740
|
+
kind: "usable",
|
|
46741
|
+
enabled,
|
|
46742
|
+
recoveryPeriodInDays: period
|
|
46743
|
+
};
|
|
46744
|
+
}
|
|
46745
|
+
function readKinesisSpec(value) {
|
|
46746
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
46747
|
+
const refusal = configStringRefusal(value, "StreamArn", "required", KINESIS_PATH) ?? configStringRefusal(value, "ApproximateCreationDateTimePrecision", "", KINESIS_PATH);
|
|
46748
|
+
if (refusal !== void 0) return {
|
|
46749
|
+
kind: "unusable",
|
|
46750
|
+
reason: refusal
|
|
46751
|
+
};
|
|
46752
|
+
const block = value;
|
|
46753
|
+
const streamArn = block["StreamArn"];
|
|
46754
|
+
if (typeof streamArn !== "string") return {
|
|
46755
|
+
kind: "unusable",
|
|
46756
|
+
reason: `${KINESIS_PATH}.StreamArn is required`
|
|
46757
|
+
};
|
|
46758
|
+
const precision = block["ApproximateCreationDateTimePrecision"];
|
|
46759
|
+
return typeof precision === "string" && precision.length > 0 ? {
|
|
46760
|
+
kind: "usable",
|
|
46761
|
+
streamArn,
|
|
46762
|
+
precision
|
|
46763
|
+
} : {
|
|
46764
|
+
kind: "usable",
|
|
46765
|
+
streamArn
|
|
46766
|
+
};
|
|
46767
|
+
}
|
|
46768
|
+
function readPolicyBlock(value, path) {
|
|
46769
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
46770
|
+
if (!isPlainObject$1(value)) return {
|
|
46771
|
+
kind: "unusable",
|
|
46772
|
+
reason: `${path} must be an object with a PolicyDocument`
|
|
46773
|
+
};
|
|
46774
|
+
const document = value["PolicyDocument"];
|
|
46775
|
+
if (typeof document === "string") return document.trim() === "" ? {
|
|
46776
|
+
kind: "unusable",
|
|
46777
|
+
reason: `${path}.PolicyDocument must not be a blank string`
|
|
46778
|
+
} : {
|
|
46779
|
+
kind: "usable",
|
|
46780
|
+
document
|
|
46781
|
+
};
|
|
46782
|
+
if (!isPlainObject$1(document)) return {
|
|
46783
|
+
kind: "unusable",
|
|
46784
|
+
reason: `${path}.PolicyDocument must be a policy object or a JSON string`
|
|
46785
|
+
};
|
|
46786
|
+
const keys = Object.keys(document);
|
|
46787
|
+
if (keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"))) return {
|
|
46788
|
+
kind: "unusable",
|
|
46789
|
+
reason: `${path}.PolicyDocument is an unresolved intrinsic`
|
|
46790
|
+
};
|
|
46791
|
+
return {
|
|
46792
|
+
kind: "usable",
|
|
46793
|
+
document: JSON.stringify(document)
|
|
46794
|
+
};
|
|
46795
|
+
}
|
|
46796
|
+
function readTablePolicy(replica) {
|
|
46797
|
+
return readPolicyBlock(replica?.[TABLE_POLICY_KEY], TABLE_POLICY_PATH);
|
|
46798
|
+
}
|
|
46799
|
+
function readStreamPolicy$1(replica) {
|
|
46800
|
+
const stream = replica?.[REPLICA_STREAM_KEY];
|
|
46801
|
+
if (stream === void 0 || stream === null) return { kind: "absent" };
|
|
46802
|
+
if (!isPlainObject$1(stream)) return {
|
|
46803
|
+
kind: "unusable",
|
|
46804
|
+
reason: `Replicas[].${REPLICA_STREAM_KEY} must be an object`
|
|
46805
|
+
};
|
|
46806
|
+
return readPolicyBlock(stream["ResourcePolicy"], STREAM_POLICY_PATH);
|
|
46807
|
+
}
|
|
46808
|
+
function replicaSettingRefusals(replica) {
|
|
46809
|
+
return [
|
|
46810
|
+
readPitrSpec(replica?.[PITR_KEY]),
|
|
46811
|
+
readContributorInsightsSpec(replica?.[CONTRIBUTOR_INSIGHTS_KEY], CI_PATH),
|
|
46812
|
+
readKinesisSpec(replica?.[KINESIS_KEY]),
|
|
46813
|
+
readTablePolicy(replica),
|
|
46814
|
+
readStreamPolicy$1(replica)
|
|
46815
|
+
].flatMap((read) => read.kind === "unusable" ? [read.reason] : []);
|
|
46816
|
+
}
|
|
46817
|
+
function settingOf(op) {
|
|
46818
|
+
switch (op.kind) {
|
|
46819
|
+
case "pitr": return "pitr";
|
|
46820
|
+
case "contributorInsights": return "contributorInsights";
|
|
46821
|
+
case "kinesisDisable":
|
|
46822
|
+
case "kinesisEnable":
|
|
46823
|
+
case "kinesisPrecision": return "kinesis";
|
|
46824
|
+
case "deleteTablePolicy":
|
|
46825
|
+
case "putTablePolicy": return "tablePolicy";
|
|
46826
|
+
case "deleteStreamPolicy":
|
|
46827
|
+
case "putStreamPolicy": return "streamPolicy";
|
|
46828
|
+
}
|
|
46829
|
+
}
|
|
46830
|
+
const SETTING_MEMBER = {
|
|
46831
|
+
pitr: PITR_KEY,
|
|
46832
|
+
contributorInsights: CONTRIBUTOR_INSIGHTS_KEY,
|
|
46833
|
+
kinesis: KINESIS_KEY,
|
|
46834
|
+
tablePolicy: TABLE_POLICY_KEY,
|
|
46835
|
+
streamPolicy: `${REPLICA_STREAM_KEY}.ResourcePolicy`
|
|
46836
|
+
};
|
|
46837
|
+
function samePolicyDocument$1(left, right) {
|
|
46838
|
+
if (left === right) return true;
|
|
46839
|
+
try {
|
|
46840
|
+
return JSON.stringify(JSON.parse(left)) === JSON.stringify(JSON.parse(right));
|
|
46841
|
+
} catch {
|
|
46842
|
+
return false;
|
|
46843
|
+
}
|
|
46844
|
+
}
|
|
46845
|
+
function planReplicaSettingOps(desired, previous, options, onUnusable) {
|
|
46846
|
+
const prev = options.fresh ? void 0 : previous;
|
|
46847
|
+
const ops = [];
|
|
46848
|
+
const removes = (setting) => options.keepOnRemoval?.has(setting) !== true;
|
|
46849
|
+
const pitr = readPitrSpec(desired?.[PITR_KEY]);
|
|
46850
|
+
const prevPitr = readPitrSpec(prev?.[PITR_KEY]);
|
|
46851
|
+
if (pitr.kind === "unusable") onUnusable(pitr.reason);
|
|
46852
|
+
else if (pitr.kind === "absent") {
|
|
46853
|
+
if (prevPitr.kind !== "absent" && removes("pitr")) ops.push({
|
|
46854
|
+
kind: "pitr",
|
|
46855
|
+
enabled: false
|
|
46856
|
+
});
|
|
46857
|
+
} else {
|
|
46858
|
+
const unchanged = prevPitr.kind === "usable" && prevPitr.enabled === pitr.enabled && prevPitr.recoveryPeriodInDays === pitr.recoveryPeriodInDays;
|
|
46859
|
+
const noop = options.fresh && !pitr.enabled;
|
|
46860
|
+
if (!unchanged && !noop) ops.push(pitr.recoveryPeriodInDays === void 0 ? {
|
|
46861
|
+
kind: "pitr",
|
|
46862
|
+
enabled: pitr.enabled
|
|
46863
|
+
} : {
|
|
46864
|
+
kind: "pitr",
|
|
46865
|
+
enabled: pitr.enabled,
|
|
46866
|
+
recoveryPeriodInDays: pitr.recoveryPeriodInDays
|
|
46867
|
+
});
|
|
46868
|
+
}
|
|
46869
|
+
const desiredCi = readContributorInsightsSpec(desired?.[CONTRIBUTOR_INSIGHTS_KEY], CI_PATH);
|
|
46870
|
+
const ci = planContributorInsightsOp(desiredCi, readContributorInsightsSpec(prev?.[CONTRIBUTOR_INSIGHTS_KEY], CI_PATH), onUnusable);
|
|
46871
|
+
if (ci !== void 0 && !(options.fresh && ci.action === "DISABLE") && !(desiredCi.kind === "absent" && !removes("contributorInsights"))) ops.push(ci.mode === void 0 ? {
|
|
46872
|
+
kind: "contributorInsights",
|
|
46873
|
+
action: ci.action
|
|
46874
|
+
} : {
|
|
46875
|
+
kind: "contributorInsights",
|
|
46876
|
+
action: ci.action,
|
|
46877
|
+
mode: ci.mode
|
|
46878
|
+
});
|
|
46879
|
+
const kinesis = readKinesisSpec(desired?.[KINESIS_KEY]);
|
|
46880
|
+
const prevKinesis = readKinesisSpec(prev?.[KINESIS_KEY]);
|
|
46881
|
+
if (kinesis.kind === "unusable") onUnusable(kinesis.reason);
|
|
46882
|
+
else if (kinesis.kind === "absent") {
|
|
46883
|
+
if (prevKinesis.kind === "usable" && removes("kinesis")) ops.push({
|
|
46884
|
+
kind: "kinesisDisable",
|
|
46885
|
+
streamArn: prevKinesis.streamArn
|
|
46886
|
+
});
|
|
46887
|
+
} else if (prevKinesis.kind === "usable" && prevKinesis.streamArn === kinesis.streamArn) {
|
|
46888
|
+
if (kinesis.precision !== void 0 && kinesis.precision !== prevKinesis.precision) ops.push({
|
|
46889
|
+
kind: "kinesisPrecision",
|
|
46890
|
+
streamArn: kinesis.streamArn,
|
|
46891
|
+
precision: kinesis.precision
|
|
46892
|
+
});
|
|
46893
|
+
else if (kinesis.precision === void 0 && prevKinesis.precision !== void 0 && prevKinesis.precision !== DEFAULT_KINESIS_PRECISION && removes("kinesis")) ops.push({
|
|
46894
|
+
kind: "kinesisPrecision",
|
|
46895
|
+
streamArn: kinesis.streamArn,
|
|
46896
|
+
precision: DEFAULT_KINESIS_PRECISION
|
|
46897
|
+
});
|
|
46898
|
+
} else {
|
|
46899
|
+
if (prevKinesis.kind === "usable") ops.push({
|
|
46900
|
+
kind: "kinesisDisable",
|
|
46901
|
+
streamArn: prevKinesis.streamArn
|
|
46902
|
+
});
|
|
46903
|
+
ops.push(kinesis.precision === void 0 ? {
|
|
46904
|
+
kind: "kinesisEnable",
|
|
46905
|
+
streamArn: kinesis.streamArn
|
|
46906
|
+
} : {
|
|
46907
|
+
kind: "kinesisEnable",
|
|
46908
|
+
streamArn: kinesis.streamArn,
|
|
46909
|
+
precision: kinesis.precision
|
|
46910
|
+
});
|
|
46911
|
+
}
|
|
46912
|
+
const policyOps = (want, had, replaced, put, del, setting) => {
|
|
46913
|
+
if (want.kind === "unusable") {
|
|
46914
|
+
onUnusable(want.reason);
|
|
46915
|
+
return;
|
|
46916
|
+
}
|
|
46917
|
+
if (want.kind === "absent") {
|
|
46918
|
+
if (had.kind !== "absent" && removes(setting)) ops.push(del);
|
|
46919
|
+
return;
|
|
46920
|
+
}
|
|
46921
|
+
if (!replaced && had.kind === "usable" && samePolicyDocument$1(had.document, want.document)) return;
|
|
46922
|
+
ops.push(put(want.document));
|
|
46923
|
+
};
|
|
46924
|
+
policyOps(readTablePolicy(desired), readTablePolicy(prev), false, (document) => ({
|
|
46925
|
+
kind: "putTablePolicy",
|
|
46926
|
+
document
|
|
46927
|
+
}), { kind: "deleteTablePolicy" }, "tablePolicy");
|
|
46928
|
+
policyOps(readStreamPolicy$1(desired), readStreamPolicy$1(prev), options.streamReplaced === true, (document) => ({
|
|
46929
|
+
kind: "putStreamPolicy",
|
|
46930
|
+
document
|
|
46931
|
+
}), { kind: "deleteStreamPolicy" }, "streamPolicy");
|
|
46932
|
+
return ops;
|
|
46933
|
+
}
|
|
46934
|
+
function planReplicaSettingCorrections(desired, live, only) {
|
|
46935
|
+
const ops = [];
|
|
46936
|
+
const pitr = readPitrSpec(desired?.[PITR_KEY]);
|
|
46937
|
+
if (only.has("pitr") && pitr.kind === "usable" && live.pitr !== void 0) {
|
|
46938
|
+
if (pitr.enabled && !live.pitr.enabled) ops.push(pitr.recoveryPeriodInDays === void 0 ? {
|
|
46939
|
+
kind: "pitr",
|
|
46940
|
+
enabled: pitr.enabled
|
|
46941
|
+
} : {
|
|
46942
|
+
kind: "pitr",
|
|
46943
|
+
enabled: pitr.enabled,
|
|
46944
|
+
recoveryPeriodInDays: pitr.recoveryPeriodInDays
|
|
46945
|
+
});
|
|
46946
|
+
}
|
|
46947
|
+
const ci = readContributorInsightsSpec(desired?.[CONTRIBUTOR_INSIGHTS_KEY], CI_PATH);
|
|
46948
|
+
if (only.has("contributorInsights") && ci.kind === "usable" && live.contributorInsightsEnabled !== void 0 && live.contributorInsightsEnabled !== ci.enabled) ops.push(!ci.enabled ? {
|
|
46949
|
+
kind: "contributorInsights",
|
|
46950
|
+
action: "DISABLE"
|
|
46951
|
+
} : ci.mode === void 0 ? {
|
|
46952
|
+
kind: "contributorInsights",
|
|
46953
|
+
action: "ENABLE"
|
|
46954
|
+
} : {
|
|
46955
|
+
kind: "contributorInsights",
|
|
46956
|
+
action: "ENABLE",
|
|
46957
|
+
mode: ci.mode
|
|
46958
|
+
});
|
|
46959
|
+
const kinesis = readKinesisSpec(desired?.[KINESIS_KEY]);
|
|
46960
|
+
if (only.has("kinesis") && kinesis.kind === "usable" && live.kinesisStreamArns !== void 0 && !live.kinesisStreamArns.has(kinesis.streamArn)) ops.push(kinesis.precision === void 0 ? {
|
|
46961
|
+
kind: "kinesisEnable",
|
|
46962
|
+
streamArn: kinesis.streamArn
|
|
46963
|
+
} : {
|
|
46964
|
+
kind: "kinesisEnable",
|
|
46965
|
+
streamArn: kinesis.streamArn,
|
|
46966
|
+
precision: kinesis.precision
|
|
46967
|
+
});
|
|
46968
|
+
const tablePolicy = readTablePolicy(desired);
|
|
46969
|
+
if (only.has("tablePolicy") && tablePolicy.kind === "usable" && live.hasTablePolicy === false) ops.push({
|
|
46970
|
+
kind: "putTablePolicy",
|
|
46971
|
+
document: tablePolicy.document
|
|
46972
|
+
});
|
|
46973
|
+
const streamPolicy = readStreamPolicy$1(desired);
|
|
46974
|
+
if (only.has("streamPolicy") && streamPolicy.kind === "usable" && live.hasStreamPolicy === false) ops.push({
|
|
46975
|
+
kind: "putStreamPolicy",
|
|
46976
|
+
document: streamPolicy.document
|
|
46977
|
+
});
|
|
46978
|
+
return ops;
|
|
46979
|
+
}
|
|
46980
|
+
function declaredReplicaSettings(desired) {
|
|
46981
|
+
const declared = /* @__PURE__ */ new Set();
|
|
46982
|
+
if (readPitrSpec(desired?.["PointInTimeRecoverySpecification"]).kind === "usable") declared.add("pitr");
|
|
46983
|
+
if (readContributorInsightsSpec(desired?.["ContributorInsightsSpecification"], CI_PATH).kind === "usable") declared.add("contributorInsights");
|
|
46984
|
+
if (readKinesisSpec(desired?.["KinesisStreamSpecification"]).kind === "usable") declared.add("kinesis");
|
|
46985
|
+
if (readTablePolicy(desired).kind === "usable") declared.add("tablePolicy");
|
|
46986
|
+
if (readStreamPolicy$1(desired).kind === "usable") declared.add("streamPolicy");
|
|
46987
|
+
return declared;
|
|
46988
|
+
}
|
|
46989
|
+
function enabledForReadStatus(status) {
|
|
46990
|
+
if (status === "ENABLED" || status === "ENABLING") return true;
|
|
46991
|
+
if (status === "DISABLED" || status === "DISABLING") return false;
|
|
46992
|
+
}
|
|
46993
|
+
function reverseMapReplicaPitr(status, recoveryPeriodInDays, declaredBlock) {
|
|
46994
|
+
const enabled = enabledForReadStatus(status);
|
|
46995
|
+
if (enabled === void 0) return void 0;
|
|
46996
|
+
const block = { PointInTimeRecoveryEnabled: enabled };
|
|
46997
|
+
if (!enabled) return block;
|
|
46998
|
+
const declared = readPitrSpec(declaredBlock);
|
|
46999
|
+
const period = recoveryPeriodInDays ?? (status === "ENABLING" ? (declared.kind === "usable" ? declared.recoveryPeriodInDays : void 0) ?? DEFAULT_RECOVERY_PERIOD_DAYS : void 0);
|
|
47000
|
+
if (period !== void 0) block["RecoveryPeriodInDays"] = period;
|
|
47001
|
+
return block;
|
|
47002
|
+
}
|
|
47003
|
+
function reverseMapReplicaContributorInsights(status, mode, declaredBlock) {
|
|
47004
|
+
const enabled = enabledForReadStatus(status);
|
|
47005
|
+
if (enabled === void 0) return void 0;
|
|
47006
|
+
const block = { Enabled: enabled };
|
|
47007
|
+
const declared = readContributorInsightsSpec(declaredBlock, CI_PATH);
|
|
47008
|
+
if (enabled && declared.kind === "usable" && declared.mode !== void 0) {
|
|
47009
|
+
const liveMode = mode ?? (status === "ENABLING" ? declared.mode : void 0);
|
|
47010
|
+
if (liveMode !== void 0) block["Mode"] = liveMode;
|
|
47011
|
+
}
|
|
47012
|
+
return block;
|
|
47013
|
+
}
|
|
47014
|
+
const READBACK_5381_MEMBERS = [
|
|
47015
|
+
"SSESpecification",
|
|
47016
|
+
"TableClass",
|
|
47017
|
+
"DeletionProtectionEnabled",
|
|
47018
|
+
TABLE_POLICY_KEY,
|
|
47019
|
+
REPLICA_STREAM_KEY
|
|
47020
|
+
];
|
|
47021
|
+
const READBACK_5381_NESTED = [[
|
|
47022
|
+
PITR_KEY,
|
|
47023
|
+
"RecoveryPeriodInDays",
|
|
47024
|
+
"PointInTimeRecoveryEnabled"
|
|
47025
|
+
], [
|
|
47026
|
+
CONTRIBUTOR_INSIGHTS_KEY,
|
|
47027
|
+
"Mode",
|
|
47028
|
+
"Enabled"
|
|
47029
|
+
]];
|
|
47030
|
+
function isPre5381ReplicaBaseline(baseline) {
|
|
47031
|
+
if ("TableClass" in baseline || "DeletionProtectionEnabled" in baseline) return true;
|
|
47032
|
+
const replicas = baseline["Replicas"];
|
|
47033
|
+
return Array.isArray(replicas) && replicas.some((r) => isPlainObject$1(r) && "KMSMasterKeyId" in r);
|
|
47034
|
+
}
|
|
47035
|
+
function canonicalizePre5381ReplicaBaseline(baseline, aws, localRegion, localFromReadback = false) {
|
|
47036
|
+
if (!isPre5381ReplicaBaseline(baseline)) return baseline;
|
|
47037
|
+
const result = { ...baseline };
|
|
47038
|
+
const topLevel = {};
|
|
47039
|
+
for (const key of ["TableClass", "DeletionProtectionEnabled"]) if (key in result) {
|
|
47040
|
+
topLevel[key] = result[key];
|
|
47041
|
+
delete result[key];
|
|
47042
|
+
}
|
|
47043
|
+
const replicas = result["Replicas"];
|
|
47044
|
+
if (!Array.isArray(replicas)) return result;
|
|
47045
|
+
const awsReplicas = Array.isArray(aws["Replicas"]) ? aws["Replicas"] : [];
|
|
47046
|
+
result["Replicas"] = replicas.map((element) => {
|
|
47047
|
+
if (!isPlainObject$1(element)) return element;
|
|
47048
|
+
const region = element["Region"];
|
|
47049
|
+
const entry = { ...element };
|
|
47050
|
+
if (region === localRegion && localRegion !== "") {
|
|
47051
|
+
for (const [key, value] of Object.entries(topLevel)) if (localFromReadback || !(key in entry)) entry[key] = value;
|
|
47052
|
+
}
|
|
47053
|
+
if ("KMSMasterKeyId" in entry) {
|
|
47054
|
+
const key = entry["KMSMasterKeyId"];
|
|
47055
|
+
delete entry["KMSMasterKeyId"];
|
|
47056
|
+
if (!("SSESpecification" in entry)) entry["SSESpecification"] = { KMSMasterKeyId: key };
|
|
47057
|
+
}
|
|
47058
|
+
const live = awsReplicas.find((r) => isPlainObject$1(r) && r["Region"] === region);
|
|
47059
|
+
if (live !== void 0) {
|
|
47060
|
+
for (const member of READBACK_5381_MEMBERS) if (!(member in entry) && member in live) entry[member] = structuredClone(live[member]);
|
|
47061
|
+
for (const [block, member, flag] of READBACK_5381_NESTED) {
|
|
47062
|
+
const mine = entry[block];
|
|
47063
|
+
const theirs = live[block];
|
|
47064
|
+
if (isPlainObject$1(mine) && isPlainObject$1(theirs) && !(member in mine) && member in theirs && mine[flag] === theirs[flag]) entry[block] = {
|
|
47065
|
+
...mine,
|
|
47066
|
+
[member]: theirs[member]
|
|
47067
|
+
};
|
|
47068
|
+
}
|
|
47069
|
+
}
|
|
47070
|
+
return entry;
|
|
47071
|
+
});
|
|
47072
|
+
return result;
|
|
47073
|
+
}
|
|
47074
|
+
const UNREAD_REPLICA_MEMBERS = [
|
|
47075
|
+
"TableClass",
|
|
47076
|
+
"DeletionProtectionEnabled",
|
|
47077
|
+
"SSESpecification"
|
|
47078
|
+
];
|
|
47079
|
+
function keepUnreadReplicaMembers(desired, previous) {
|
|
47080
|
+
const replicas = desired["Replicas"];
|
|
47081
|
+
const prevReplicas = previous["Replicas"];
|
|
47082
|
+
if (!Array.isArray(replicas) || !Array.isArray(prevReplicas)) return desired;
|
|
47083
|
+
const sse = desired["SSESpecification"];
|
|
47084
|
+
const sseOn = isPlainObject$1(sse) && coerceCfnBoolean(sse["SSEEnabled"]) !== false;
|
|
47085
|
+
let changed = false;
|
|
47086
|
+
const completed = replicas.map((element) => {
|
|
47087
|
+
if (!isPlainObject$1(element)) return element;
|
|
47088
|
+
const live = prevReplicas.find((r) => isPlainObject$1(r) && r["Region"] === element["Region"]);
|
|
47089
|
+
if (live === void 0) return element;
|
|
47090
|
+
const entry = { ...element };
|
|
47091
|
+
let touched = false;
|
|
47092
|
+
for (const member of UNREAD_REPLICA_MEMBERS) {
|
|
47093
|
+
if (member === "SSESpecification" && !sseOn) continue;
|
|
47094
|
+
if (!(member in entry) && member in live) {
|
|
47095
|
+
entry[member] = structuredClone(live[member]);
|
|
47096
|
+
touched = true;
|
|
47097
|
+
}
|
|
47098
|
+
}
|
|
47099
|
+
const pitr = entry[PITR_KEY];
|
|
47100
|
+
const wantPitr = readPitrSpec(pitr);
|
|
47101
|
+
const livePitr = readPitrSpec(live[PITR_KEY]);
|
|
47102
|
+
if (isPlainObject$1(pitr) && wantPitr.kind === "usable" && wantPitr.enabled && wantPitr.recoveryPeriodInDays === void 0 && livePitr.kind === "usable" && livePitr.enabled && livePitr.recoveryPeriodInDays !== void 0) {
|
|
47103
|
+
entry[PITR_KEY] = {
|
|
47104
|
+
...pitr,
|
|
47105
|
+
RecoveryPeriodInDays: livePitr.recoveryPeriodInDays
|
|
47106
|
+
};
|
|
47107
|
+
touched = true;
|
|
47108
|
+
}
|
|
47109
|
+
if (!touched) return element;
|
|
47110
|
+
changed = true;
|
|
47111
|
+
return entry;
|
|
47112
|
+
});
|
|
47113
|
+
return changed ? {
|
|
47114
|
+
...desired,
|
|
47115
|
+
Replicas: completed
|
|
47116
|
+
} : desired;
|
|
47117
|
+
}
|
|
47118
|
+
|
|
47119
|
+
//#endregion
|
|
47120
|
+
//#region src/provisioning/dynamodb-stream-members.ts
|
|
47121
|
+
const STREAM_SPECIFICATION_KEY$1 = "StreamSpecification";
|
|
47122
|
+
const STREAM_POLICY_KEY = "ResourcePolicy";
|
|
47123
|
+
const STREAM_TAGS_KEY = "Tags";
|
|
47124
|
+
const POLICY_PATH = `${STREAM_SPECIFICATION_KEY$1}.${STREAM_POLICY_KEY}`;
|
|
47125
|
+
const TAGS_PATH = `${STREAM_SPECIFICATION_KEY$1}.${STREAM_TAGS_KEY}`;
|
|
47126
|
+
function isPlainObject(value) {
|
|
47127
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
47128
|
+
}
|
|
47129
|
+
function refusalOf(guard) {
|
|
47130
|
+
try {
|
|
47131
|
+
guard();
|
|
47132
|
+
return;
|
|
47133
|
+
} catch (error) {
|
|
47134
|
+
return describeAwsFailure(error).detail;
|
|
47135
|
+
}
|
|
47136
|
+
}
|
|
47137
|
+
function blockMembers(block) {
|
|
47138
|
+
return isPlainObject(block) ? block : {};
|
|
47139
|
+
}
|
|
47140
|
+
function readStreamPolicy(block) {
|
|
47141
|
+
const value = blockMembers(block)[STREAM_POLICY_KEY];
|
|
47142
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
47143
|
+
const containerRefusal = refusalOf(() => requireConfigObject(value, POLICY_PATH));
|
|
47144
|
+
if (containerRefusal !== void 0) return {
|
|
47145
|
+
kind: "unusable",
|
|
47146
|
+
reason: containerRefusal
|
|
47147
|
+
};
|
|
47148
|
+
const documentPath = `${POLICY_PATH}.PolicyDocument`;
|
|
47149
|
+
const document = value["PolicyDocument"];
|
|
47150
|
+
if (typeof document === "string") return document.trim() === "" ? {
|
|
47151
|
+
kind: "unusable",
|
|
47152
|
+
reason: `${documentPath} must not be a blank string`
|
|
47153
|
+
} : {
|
|
47154
|
+
kind: "usable",
|
|
47155
|
+
document
|
|
47156
|
+
};
|
|
47157
|
+
if (document === void 0 || document === null) return {
|
|
47158
|
+
kind: "unusable",
|
|
47159
|
+
reason: `${documentPath} is required when ${POLICY_PATH} is declared`
|
|
47160
|
+
};
|
|
47161
|
+
const documentRefusal = refusalOf(() => requireConfigObject(document, documentPath));
|
|
47162
|
+
if (documentRefusal !== void 0) return {
|
|
47163
|
+
kind: "unusable",
|
|
47164
|
+
reason: documentRefusal
|
|
47165
|
+
};
|
|
47166
|
+
return {
|
|
47167
|
+
kind: "usable",
|
|
47168
|
+
document: JSON.stringify(document)
|
|
47169
|
+
};
|
|
47170
|
+
}
|
|
47171
|
+
function readStreamTags(block) {
|
|
47172
|
+
const value = blockMembers(block)[STREAM_TAGS_KEY];
|
|
47173
|
+
if (value === void 0 || value === null) return { kind: "absent" };
|
|
47174
|
+
if (!Array.isArray(value)) return {
|
|
47175
|
+
kind: "unusable",
|
|
47176
|
+
reason: `${TAGS_PATH} must be an array of {Key, Value} entries`
|
|
47177
|
+
};
|
|
47178
|
+
const tags = /* @__PURE__ */ new Map();
|
|
47179
|
+
for (const [position, entry] of value.entries()) {
|
|
47180
|
+
const entryPath = `${TAGS_PATH}[${position}]`;
|
|
47181
|
+
const refusal = refusalOf(() => requireConfigObject(entry, entryPath)) ?? configStringRefusal(entry, "Key", "required", entryPath) ?? configStringRefusal(entry, "Value", "", entryPath);
|
|
47182
|
+
if (refusal !== void 0) return {
|
|
47183
|
+
kind: "unusable",
|
|
47184
|
+
reason: refusal
|
|
47185
|
+
};
|
|
47186
|
+
const { Key: key, Value: tagValue } = entry;
|
|
47187
|
+
if (typeof key !== "string") return {
|
|
47188
|
+
kind: "unusable",
|
|
47189
|
+
reason: `${entryPath}.Key is required`
|
|
47190
|
+
};
|
|
47191
|
+
tags.set(key, typeof tagValue === "string" ? tagValue : "");
|
|
47192
|
+
}
|
|
47193
|
+
return {
|
|
47194
|
+
kind: "usable",
|
|
47195
|
+
tags
|
|
47196
|
+
};
|
|
47197
|
+
}
|
|
47198
|
+
function streamMemberRefusals(block) {
|
|
47199
|
+
const refusals = [];
|
|
47200
|
+
const policy = readStreamPolicy(block);
|
|
47201
|
+
if (policy.kind === "unusable") refusals.push(policy.reason);
|
|
47202
|
+
const tags = readStreamTags(block);
|
|
47203
|
+
if (tags.kind === "unusable") refusals.push(tags.reason);
|
|
47204
|
+
return refusals;
|
|
47205
|
+
}
|
|
47206
|
+
function planStreamMemberOps(desiredBlock, previousBlock, options, onUnusable) {
|
|
47207
|
+
let desiredPolicy = readStreamPolicy(desiredBlock);
|
|
47208
|
+
let desiredTags = readStreamTags(desiredBlock);
|
|
47209
|
+
if (desiredPolicy.kind === "unusable") onUnusable(desiredPolicy.reason);
|
|
47210
|
+
if (desiredTags.kind === "unusable") onUnusable(desiredTags.reason);
|
|
47211
|
+
let previousPolicy = readStreamPolicy(previousBlock);
|
|
47212
|
+
let previousTags = readStreamTags(previousBlock);
|
|
47213
|
+
if (options.freshStream) {
|
|
47214
|
+
if (desiredPolicy.kind === "unusable" && previousPolicy.kind === "usable") desiredPolicy = previousPolicy;
|
|
47215
|
+
if (desiredTags.kind === "unusable" && previousTags.kind === "usable") desiredTags = previousTags;
|
|
47216
|
+
previousPolicy = { kind: "absent" };
|
|
47217
|
+
previousTags = { kind: "absent" };
|
|
47218
|
+
} else if (options.contentsUnknown === true) {
|
|
47219
|
+
previousPolicy = {
|
|
47220
|
+
kind: "unusable",
|
|
47221
|
+
reason: ""
|
|
47222
|
+
};
|
|
47223
|
+
previousTags = { kind: "absent" };
|
|
47224
|
+
}
|
|
47225
|
+
const tagOps = [];
|
|
47226
|
+
if (desiredTags.kind !== "unusable") {
|
|
47227
|
+
const desired = desiredTags.kind === "usable" ? desiredTags.tags : /* @__PURE__ */ new Map();
|
|
47228
|
+
const previous = previousTags.kind === "usable" ? previousTags.tags : /* @__PURE__ */ new Map();
|
|
47229
|
+
const keysToRemove = [...previous.keys()].filter((key) => !desired.has(key));
|
|
47230
|
+
if (keysToRemove.length > 0) tagOps.push({
|
|
47231
|
+
kind: "untag",
|
|
47232
|
+
keys: keysToRemove
|
|
47233
|
+
});
|
|
47234
|
+
const tagsToSet = [...desired].filter(([key, value]) => previous.get(key) !== value).map(([Key, Value]) => ({
|
|
47235
|
+
Key,
|
|
47236
|
+
Value
|
|
47237
|
+
}));
|
|
47238
|
+
if (tagsToSet.length > 0) tagOps.push({
|
|
47239
|
+
kind: "tag",
|
|
47240
|
+
tags: tagsToSet
|
|
47241
|
+
});
|
|
47242
|
+
}
|
|
47243
|
+
const policyPut = desiredPolicy.kind === "usable" && !(previousPolicy.kind === "usable" && samePolicyDocument(previousPolicy.document, desiredPolicy.document));
|
|
47244
|
+
const policyDelete = previousPolicy.kind !== "absent" && (desiredPolicy.kind === "absent" || policyPut && tagOps.length > 0);
|
|
47245
|
+
const ops = [];
|
|
47246
|
+
if (policyDelete) ops.push({ kind: "deletePolicy" });
|
|
47247
|
+
ops.push(...tagOps);
|
|
47248
|
+
if (policyPut && desiredPolicy.kind === "usable") ops.push({
|
|
47249
|
+
kind: "putPolicy",
|
|
47250
|
+
document: desiredPolicy.document
|
|
47251
|
+
});
|
|
47252
|
+
return ops;
|
|
47253
|
+
}
|
|
47254
|
+
function samePolicyDocument(left, right) {
|
|
47255
|
+
if (left === right) return true;
|
|
47256
|
+
try {
|
|
47257
|
+
return canonicalJson(JSON.parse(left)) === canonicalJson(JSON.parse(right));
|
|
47258
|
+
} catch {
|
|
47259
|
+
return false;
|
|
47260
|
+
}
|
|
47261
|
+
}
|
|
47262
|
+
function streamDeclaresPolicy(desiredBlock) {
|
|
47263
|
+
return readStreamPolicy(desiredBlock).kind === "usable";
|
|
47264
|
+
}
|
|
47265
|
+
function streamDeclaresTags(desiredBlock) {
|
|
47266
|
+
return readStreamTags(desiredBlock).kind === "usable";
|
|
47267
|
+
}
|
|
47268
|
+
function reverseMapStreamPolicy(livePolicy, desiredBlock) {
|
|
47269
|
+
if (livePolicy === void 0 || livePolicy === "") return void 0;
|
|
47270
|
+
const declared = blockMembers(blockMembers(desiredBlock)[STREAM_POLICY_KEY])["PolicyDocument"];
|
|
47271
|
+
let parsed;
|
|
47272
|
+
try {
|
|
47273
|
+
parsed = JSON.parse(livePolicy);
|
|
47274
|
+
} catch {
|
|
47275
|
+
return { PolicyDocument: livePolicy };
|
|
47276
|
+
}
|
|
47277
|
+
if (typeof declared !== "string") return { PolicyDocument: parsed };
|
|
47278
|
+
let declaredParsed;
|
|
47279
|
+
try {
|
|
47280
|
+
declaredParsed = JSON.parse(declared);
|
|
47281
|
+
} catch {
|
|
47282
|
+
return { PolicyDocument: livePolicy };
|
|
47283
|
+
}
|
|
47284
|
+
return { PolicyDocument: canonicalJson(declaredParsed) === canonicalJson(parsed) ? declared : livePolicy };
|
|
47285
|
+
}
|
|
47286
|
+
function streamPolicyMatchesDeclared(livePolicy, desiredBlock) {
|
|
47287
|
+
const declared = readStreamPolicy(desiredBlock);
|
|
47288
|
+
if (declared.kind !== "usable" || livePolicy === void 0) return false;
|
|
47289
|
+
try {
|
|
47290
|
+
return canonicalJson(JSON.parse(livePolicy)) === canonicalJson(JSON.parse(declared.document));
|
|
47291
|
+
} catch {
|
|
47292
|
+
return false;
|
|
47293
|
+
}
|
|
47294
|
+
}
|
|
47295
|
+
function declaredStreamPolicyMember(desiredBlock) {
|
|
47296
|
+
const declared = readStreamPolicy(desiredBlock);
|
|
47297
|
+
return declared.kind === "usable" ? reverseMapStreamPolicy(declared.document, desiredBlock) : void 0;
|
|
47298
|
+
}
|
|
47299
|
+
function declaredStreamTagsMember(desiredBlock) {
|
|
47300
|
+
const declared = readStreamTags(desiredBlock);
|
|
47301
|
+
return declared.kind === "usable" ? [...declared.tags].map(([Key, Value]) => ({
|
|
47302
|
+
Key,
|
|
47303
|
+
Value
|
|
47304
|
+
})) : void 0;
|
|
47305
|
+
}
|
|
47306
|
+
function streamTagsMatchDeclared(liveTags, desiredBlock) {
|
|
47307
|
+
const declared = readStreamTags(desiredBlock);
|
|
47308
|
+
if (declared.kind !== "usable" || liveTags.length !== declared.tags.size) return false;
|
|
47309
|
+
return liveTags.every((tag) => declared.tags.get(tag.Key) === tag.Value);
|
|
47310
|
+
}
|
|
47311
|
+
function canonicalJson(value) {
|
|
47312
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
|
|
47313
|
+
if (isPlainObject(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
|
|
47314
|
+
return JSON.stringify(value) ?? "null";
|
|
47315
|
+
}
|
|
47316
|
+
|
|
46431
47317
|
//#endregion
|
|
46432
47318
|
//#region src/provisioning/providers/dynamodb-globaltable-provider.ts
|
|
46433
47319
|
function isTableName(id) {
|
|
@@ -46531,7 +47417,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46531
47417
|
if (!failure.redacted) return wrapMaskedAwsError(log.mask, error, build);
|
|
46532
47418
|
log.debug(build(log.mask(failure.detail)).message);
|
|
46533
47419
|
const relay = isAuxiliaryFailure(error) ? "" : relayedNameCollision(failure.detail);
|
|
46534
|
-
const wrapped = build(`${log.mask(failure.summary)}${relay}${relayedIndexBusyDelete(failure.detail)}`);
|
|
47420
|
+
const wrapped = build(`${log.mask(failure.summary)}${relay}${relayedIndexBusyDelete(failure.detail)}` + relayedEncryptionChangeLimit(failure.detail));
|
|
46535
47421
|
return error instanceof Error ? markRedactedCause(wrapped) : wrapped;
|
|
46536
47422
|
}
|
|
46537
47423
|
cleanupFailureText(log, head, error) {
|
|
@@ -46668,6 +47554,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46668
47554
|
if (!onReplay) throw new ProvisioningError(log.mask(`AWS::DynamoDB::GlobalTable ${logicalId}: ${sseEnabledRefusal}. Nothing was created; fix the template value`), resourceType, logicalId);
|
|
46669
47555
|
onReplay(`${sseEnabledRefusal}. Encryption is enabled, the block's default.`);
|
|
46670
47556
|
}
|
|
47557
|
+
const replicaSettingRefusal = replicaSettingsRefusal(properties, void 0, currentRegion);
|
|
47558
|
+
if (replicaSettingRefusal !== void 0 && !replayWarn(log, context).onUnusable) throw new ProvisioningError(log.mask(`AWS::DynamoDB::GlobalTable ${logicalId}: ${replicaSettingRefusal}. Nothing was created; fix the template value`), resourceType, logicalId);
|
|
46671
47559
|
if (properties["SSESpecification"]) createParams.SSESpecification = toSdkTableSseSpecification(properties["SSESpecification"], readReplicaKmsMasterKeyId(localReplicaEntry(properties, currentRegion)));
|
|
46672
47560
|
const dpeResolved = extractLocalDeletionProtection(properties, currentRegion);
|
|
46673
47561
|
if (dpeResolved !== void 0) createParams.DeletionProtectionEnabled = dpeResolved;
|
|
@@ -46715,18 +47603,15 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46715
47603
|
if (!replicaTags || replicaTags.length === 0) continue;
|
|
46716
47604
|
await this.applyCrossRegionReplicaTagsDiff(tableInfo.tableArn, region, void 0, replicaTags, resourceType, logicalId, tableName, maskSecrets);
|
|
46717
47605
|
}
|
|
46718
|
-
|
|
46719
|
-
|
|
46720
|
-
|
|
46721
|
-
|
|
46722
|
-
|
|
46723
|
-
|
|
46724
|
-
|
|
46725
|
-
|
|
46726
|
-
|
|
46727
|
-
}
|
|
46728
|
-
}));
|
|
46729
|
-
}
|
|
47606
|
+
await this.applyReplicaSettings(tableName, logicalId, currentRegion, wiringProperties, void 0, /* @__PURE__ */ new Set(), false, replayWarn(log, context).onUnusable !== void 0, /* @__PURE__ */ new Set(), void 0, warn, maskSecrets);
|
|
47607
|
+
const createTtl = planTimeToLive(properties["TimeToLiveSpecification"], void 0, "create");
|
|
47608
|
+
if (createTtl.kind === "enable") await this.dynamoDBClient.send(new UpdateTimeToLiveCommand({
|
|
47609
|
+
TableName: tableName,
|
|
47610
|
+
TimeToLiveSpecification: {
|
|
47611
|
+
Enabled: true,
|
|
47612
|
+
AttributeName: createTtl.attributeName
|
|
47613
|
+
}
|
|
47614
|
+
}));
|
|
46730
47615
|
if (billingMode === "PROVISIONED") try {
|
|
46731
47616
|
await this.reconcileAutoScalingTargets(tableName, [], collectAutoScalingTargets(wiringProperties, currentRegion), currentRegion, void 0, maskSecrets);
|
|
46732
47617
|
} catch (autoScalingErr) {
|
|
@@ -46859,7 +47744,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46859
47744
|
}
|
|
46860
47745
|
throw new ProvisioningError(maskSecrets(`DeletionProtectionEnabled=${enabled} on the ${region} replica of ${tableName} did not settle within ${wait.pollsRun} polls${wait.note()}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
|
|
46861
47746
|
}
|
|
46862
|
-
async convergeReplicaDeletionProtection(tableName, logicalId, currentRegion, previousProperties, properties, addedRegions, warn, maskSecrets) {
|
|
47747
|
+
async convergeReplicaDeletionProtection(tableName, logicalId, currentRegion, previousProperties, properties, addedRegions, desiredFromReadback, warn, maskSecrets) {
|
|
46863
47748
|
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
46864
47749
|
for (const entry of desired) {
|
|
46865
47750
|
const replica = asRecord(entry);
|
|
@@ -46867,6 +47752,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46867
47752
|
if (typeof region !== "string" || region === currentRegion || addedRegions.has(region)) continue;
|
|
46868
47753
|
const declared = readReplicaDeletionProtection(replica, region, warn);
|
|
46869
47754
|
if (declared === UNUSABLE) continue;
|
|
47755
|
+
if (declared === void 0 && desiredFromReadback) continue;
|
|
46870
47756
|
const previous = readReplicaDeletionProtection(localReplicaEntry(previousProperties, region), region);
|
|
46871
47757
|
const newDpe = declared ?? false;
|
|
46872
47758
|
const oldDpe = previous === UNUSABLE ? void 0 : previous ?? false;
|
|
@@ -46997,6 +47883,252 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
46997
47883
|
ReplicaUpdates: entries
|
|
46998
47884
|
};
|
|
46999
47885
|
}
|
|
47886
|
+
async applyReplicaSettings(tableName, logicalId, currentRegion, properties, previousProperties, freshRegions, streamReplaced, replaying, keepOnRemoval, previousLocalStreamArn, warn, maskSecrets) {
|
|
47887
|
+
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
47888
|
+
for (const entry of desired) {
|
|
47889
|
+
const replica = asRecord(entry);
|
|
47890
|
+
const region = replica?.["Region"];
|
|
47891
|
+
if (typeof region !== "string" || region === "") continue;
|
|
47892
|
+
const fresh = previousProperties === void 0 || freshRegions.has(region);
|
|
47893
|
+
const previous = previousProperties === void 0 ? void 0 : localReplicaEntry(previousProperties, region);
|
|
47894
|
+
const ops = planReplicaSettingOps(replica, previous, {
|
|
47895
|
+
fresh,
|
|
47896
|
+
streamReplaced,
|
|
47897
|
+
keepOnRemoval
|
|
47898
|
+
}, (reason) => warn(`The ${region} replica of ${tableName}: ${reason}, so that setting was left as it is. ` + (replaying ? `The value came from a recorded state, which a template edit cannot reach.` : `Fix the template value and re-deploy.`)));
|
|
47899
|
+
if (!fresh && keepOnRemoval.has("pitr") && replica?.["PointInTimeRecoverySpecification"] == null && (() => {
|
|
47900
|
+
const prior = readPitrSpec(previous?.["PointInTimeRecoverySpecification"]);
|
|
47901
|
+
return prior.kind === "usable" && prior.enabled;
|
|
47902
|
+
})()) warn(`The ${region} replica of ${tableName}: point-in-time recovery was not turned off, although the properties being applied (a rollback's recorded state, or a drift --revert read-back) declare none — turning it off would delete every recovery point. Turn it off by hand if that is intended.`);
|
|
47903
|
+
const unchanged = fresh ? /* @__PURE__ */ new Set() : declaredReplicaSettings(replica);
|
|
47904
|
+
for (const op of ops) unchanged.delete(settingOf(op));
|
|
47905
|
+
if (ops.length === 0 && unchanged.size === 0) continue;
|
|
47906
|
+
const client = region === currentRegion ? this.dynamoDBClient : this.getRegionalClient(region);
|
|
47907
|
+
await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, { ...region !== currentRegion && { region } });
|
|
47908
|
+
let arns;
|
|
47909
|
+
const describe = async () => {
|
|
47910
|
+
if (arns === void 0) {
|
|
47911
|
+
const described = await client.send(new DescribeTableCommand({ TableName: tableName }));
|
|
47912
|
+
arns = {
|
|
47913
|
+
...described.Table?.TableArn !== void 0 && { tableArn: described.Table.TableArn },
|
|
47914
|
+
...described.Table?.LatestStreamArn !== void 0 && { streamArn: described.Table.LatestStreamArn }
|
|
47915
|
+
};
|
|
47916
|
+
}
|
|
47917
|
+
return arns;
|
|
47918
|
+
};
|
|
47919
|
+
for (const op of ops) try {
|
|
47920
|
+
await this.sendReplicaSettingOp(client, tableName, region, logicalId, op, describe, maskSecrets);
|
|
47921
|
+
} catch (error) {
|
|
47922
|
+
if (!replaying || !fresh || op.kind !== "putTablePolicy" || isInterruptedWaitError(error)) throw error;
|
|
47923
|
+
warn(`The ${region} replica of ${tableName} was created without its ResourcePolicy: ${describeAwsFailure(error).summary}. The next deploy that updates this table puts it.`);
|
|
47924
|
+
}
|
|
47925
|
+
const priorStreamPolicy = readStreamPolicy$1(previous);
|
|
47926
|
+
const desiredStreamPolicy = readStreamPolicy$1(replica);
|
|
47927
|
+
const streamPolicyChanged = priorStreamPolicy.kind !== "absent" && desiredStreamPolicy.kind !== "unusable" && !(desiredStreamPolicy.kind === "absent" && keepOnRemoval.has("streamPolicy")) && !(priorStreamPolicy.kind === "usable" && desiredStreamPolicy.kind === "usable" && samePolicyDocument$1(priorStreamPolicy.document, desiredStreamPolicy.document));
|
|
47928
|
+
if (region === currentRegion && streamReplaced && previousLocalStreamArn !== void 0 && streamPolicyChanged && (await describe()).streamArn !== previousLocalStreamArn) await this.deleteOldStreamPolicy(client, previousLocalStreamArn, tableName, warn, maskSecrets);
|
|
47929
|
+
if (unchanged.size === 0) continue;
|
|
47930
|
+
const live = await this.readLiveReplicaSettings(client, tableName, region, unchanged, describe, maskSecrets);
|
|
47931
|
+
for (const op of planReplicaSettingCorrections(replica, live, unchanged)) {
|
|
47932
|
+
const member = SETTING_MEMBER[settingOf(op)];
|
|
47933
|
+
this.logger.debug(maskSecrets(`Bringing the ${region} replica of ${tableName} to its declared ${member}`));
|
|
47934
|
+
try {
|
|
47935
|
+
await this.sendReplicaSettingOp(client, tableName, region, logicalId, op, describe, maskSecrets);
|
|
47936
|
+
} catch (convergeError) {
|
|
47937
|
+
if (isInterruptedWaitError(convergeError)) throw convergeError;
|
|
47938
|
+
this.logger.debug(maskSecrets(`Could not bring the ${region} replica of ${tableName} to its declared ${member}: ` + describeAwsFailure(convergeError).detail));
|
|
47939
|
+
this.logger.warn(maskSecrets(`The ${region} replica of ${tableName} does not hold its declared ${member}, and setting it failed (${describeAwsFailure(convergeError).summary}). The next deploy that updates this table tries again.`));
|
|
47940
|
+
}
|
|
47941
|
+
}
|
|
47942
|
+
}
|
|
47943
|
+
}
|
|
47944
|
+
async readLiveReplicaSettings(client, tableName, region, wanted, describe, maskSecrets) {
|
|
47945
|
+
const live = {};
|
|
47946
|
+
const attempt = async (what, read) => {
|
|
47947
|
+
try {
|
|
47948
|
+
await read();
|
|
47949
|
+
} catch (readError) {
|
|
47950
|
+
this.logger.debug(maskSecrets(`Could not read ${what} of the ${region} replica of ${tableName}: ` + describeAwsFailure(readError).detail));
|
|
47951
|
+
}
|
|
47952
|
+
};
|
|
47953
|
+
if (wanted.has("pitr")) await attempt("point-in-time recovery", async () => {
|
|
47954
|
+
const pitr = (await client.send(new DescribeContinuousBackupsCommand({ TableName: tableName }))).ContinuousBackupsDescription?.PointInTimeRecoveryDescription;
|
|
47955
|
+
const status = pitr?.PointInTimeRecoveryStatus;
|
|
47956
|
+
if (status === "ENABLED" || status === "DISABLED") live.pitr = {
|
|
47957
|
+
enabled: status === "ENABLED",
|
|
47958
|
+
...pitr?.RecoveryPeriodInDays !== void 0 && { recoveryPeriodInDays: pitr.RecoveryPeriodInDays }
|
|
47959
|
+
};
|
|
47960
|
+
});
|
|
47961
|
+
if (wanted.has("contributorInsights")) await attempt("Contributor Insights", async () => {
|
|
47962
|
+
const status = (await client.send(new DescribeContributorInsightsCommand({ TableName: tableName }))).ContributorInsightsStatus;
|
|
47963
|
+
if (status === "ENABLED" || status === "ENABLING") live.contributorInsightsEnabled = true;
|
|
47964
|
+
else if (status === "DISABLED" || status === "DISABLING") live.contributorInsightsEnabled = false;
|
|
47965
|
+
});
|
|
47966
|
+
if (wanted.has("kinesis")) await attempt("the Kinesis streaming destination", async () => {
|
|
47967
|
+
live.kinesisStreamArns = await this.activeKinesisStreamArns(client, tableName);
|
|
47968
|
+
});
|
|
47969
|
+
const hasPolicy = async (arn) => {
|
|
47970
|
+
if (arn === void 0) return void 0;
|
|
47971
|
+
try {
|
|
47972
|
+
await client.send(new GetResourcePolicyCommand({ ResourceArn: arn }));
|
|
47973
|
+
return true;
|
|
47974
|
+
} catch (error) {
|
|
47975
|
+
if (error instanceof PolicyNotFoundException) return false;
|
|
47976
|
+
throw error;
|
|
47977
|
+
}
|
|
47978
|
+
};
|
|
47979
|
+
if (wanted.has("tablePolicy")) await attempt("the resource policy", async () => {
|
|
47980
|
+
const answer = await hasPolicy((await describe()).tableArn);
|
|
47981
|
+
if (answer !== void 0) live.hasTablePolicy = answer;
|
|
47982
|
+
});
|
|
47983
|
+
if (wanted.has("streamPolicy")) await attempt("the stream resource policy", async () => {
|
|
47984
|
+
const answer = await hasPolicy((await describe()).streamArn);
|
|
47985
|
+
if (answer !== void 0) live.hasStreamPolicy = answer;
|
|
47986
|
+
});
|
|
47987
|
+
return live;
|
|
47988
|
+
}
|
|
47989
|
+
async deleteOldStreamPolicy(client, streamArn, tableName, warn, maskSecrets) {
|
|
47990
|
+
try {
|
|
47991
|
+
await this.retrySettlingRefusal(() => client.send(new DeleteResourcePolicyCommand({ ResourceArn: streamArn })), `delete the policy of the retired stream of ${tableName}`, maskSecrets);
|
|
47992
|
+
} catch (error) {
|
|
47993
|
+
if (isInterruptedWaitError(error)) throw error;
|
|
47994
|
+
if (error instanceof PolicyNotFoundException || error instanceof ResourceNotFoundException$1) return;
|
|
47995
|
+
warn(`The previous stream of ${tableName} (retired by the StreamViewType change) keeps its old resource policy until it expires: deleting it failed (${describeAwsFailure(error).summary}).`);
|
|
47996
|
+
}
|
|
47997
|
+
}
|
|
47998
|
+
async kinesisStreaming(client, tableName, streamArn, refusal) {
|
|
47999
|
+
if (isInterruptedWaitError(refusal)) throw refusal;
|
|
48000
|
+
try {
|
|
48001
|
+
return (await this.activeKinesisStreamArns(client, tableName)).has(streamArn);
|
|
48002
|
+
} catch {
|
|
48003
|
+
throw refusal;
|
|
48004
|
+
}
|
|
48005
|
+
}
|
|
48006
|
+
kinesisDisableSettleDelaysMs = Array(30).fill(2e3);
|
|
48007
|
+
async waitForKinesisDisableSettled(client, tableName, streamArn, scope, maskSecrets) {
|
|
48008
|
+
const watch = startInterruptWatch(maskSecrets(`Kinesis streaming disable on ${scope}`));
|
|
48009
|
+
let last = "none read";
|
|
48010
|
+
try {
|
|
48011
|
+
for (const delayMs of [0, ...this.kinesisDisableSettleDelaysMs]) {
|
|
48012
|
+
if (enclosingDeadlineRemainingMs() <= 0) break;
|
|
48013
|
+
if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, Math.max(0, Math.min(delayMs, enclosingDeadlineRemainingMs()))));
|
|
48014
|
+
if (watch.isInterrupted()) throw watch.onInterrupted();
|
|
48015
|
+
let unsettled;
|
|
48016
|
+
try {
|
|
48017
|
+
unsettled = ((await client.send(new DescribeKinesisStreamingDestinationCommand({ TableName: tableName }))).KinesisDataStreamDestinations ?? []).find((d) => d.StreamArn === streamArn && KINESIS_DISABLE_UNSETTLED.has(d.DestinationStatus ?? ""))?.DestinationStatus;
|
|
48018
|
+
} catch (error) {
|
|
48019
|
+
this.logger.debug(maskSecrets(`Could not confirm the Kinesis streaming disable on ${scope}: ` + describeAwsFailure(error).detail));
|
|
48020
|
+
return;
|
|
48021
|
+
}
|
|
48022
|
+
if (unsettled === void 0) return;
|
|
48023
|
+
last = unsettled;
|
|
48024
|
+
}
|
|
48025
|
+
this.logger.warn(maskSecrets(`The Kinesis streaming destination on ${scope} had not settled (last status: ${last}); 'cdkd drift' may report it on this replica until it does`));
|
|
48026
|
+
} finally {
|
|
48027
|
+
watch.dispose();
|
|
48028
|
+
}
|
|
48029
|
+
}
|
|
48030
|
+
async activeKinesisStreamArns(client, tableName) {
|
|
48031
|
+
const out = await client.send(new DescribeKinesisStreamingDestinationCommand({ TableName: tableName }));
|
|
48032
|
+
return new Set((out.KinesisDataStreamDestinations ?? []).filter((d) => d.DestinationStatus === "ACTIVE" || d.DestinationStatus === "ENABLING").flatMap((d) => d.StreamArn !== void 0 ? [d.StreamArn] : []));
|
|
48033
|
+
}
|
|
48034
|
+
async sendReplicaSettingOp(client, tableName, region, logicalId, op, describe, maskSecrets) {
|
|
48035
|
+
const scope = `the ${region} replica of ${tableName}`;
|
|
48036
|
+
const arnFor = async (which) => {
|
|
48037
|
+
const arn = (await describe())[which];
|
|
48038
|
+
if (arn === void 0 || arn === "") throw new ProvisioningError(maskSecrets(`Cannot apply ${SETTING_MEMBER[settingOf(op)]} to ${scope}: DescribeTable returned no ${which === "tableArn" ? "TableArn" : "LatestStreamArn (the table has no stream)"}`), "AWS::DynamoDB::GlobalTable", logicalId, tableName);
|
|
48039
|
+
return arn;
|
|
48040
|
+
};
|
|
48041
|
+
const send = (call) => this.retrySettlingRefusal(call, `${op.kind} on ${scope}`, maskSecrets);
|
|
48042
|
+
switch (op.kind) {
|
|
48043
|
+
case "pitr":
|
|
48044
|
+
await send(() => client.send(new UpdateContinuousBackupsCommand({
|
|
48045
|
+
TableName: tableName,
|
|
48046
|
+
PointInTimeRecoverySpecification: {
|
|
48047
|
+
PointInTimeRecoveryEnabled: op.enabled,
|
|
48048
|
+
...op.recoveryPeriodInDays !== void 0 && { RecoveryPeriodInDays: op.recoveryPeriodInDays }
|
|
48049
|
+
}
|
|
48050
|
+
})));
|
|
48051
|
+
break;
|
|
48052
|
+
case "contributorInsights":
|
|
48053
|
+
await send(() => client.send(new UpdateContributorInsightsCommand({
|
|
48054
|
+
TableName: tableName,
|
|
48055
|
+
ContributorInsightsAction: op.action,
|
|
48056
|
+
...op.mode !== void 0 && { ContributorInsightsMode: op.mode }
|
|
48057
|
+
})));
|
|
48058
|
+
break;
|
|
48059
|
+
case "kinesisEnable":
|
|
48060
|
+
if (await this.activeKinesisStreamArns(client, tableName).then((arns) => arns.has(op.streamArn), () => false)) break;
|
|
48061
|
+
try {
|
|
48062
|
+
await send(() => client.send(new EnableKinesisStreamingDestinationCommand({
|
|
48063
|
+
TableName: tableName,
|
|
48064
|
+
StreamArn: op.streamArn,
|
|
48065
|
+
...op.precision !== void 0 && { EnableKinesisStreamingConfiguration: { ApproximateCreationDateTimePrecision: op.precision } }
|
|
48066
|
+
})));
|
|
48067
|
+
} catch (error) {
|
|
48068
|
+
if (!await this.kinesisStreaming(client, tableName, op.streamArn, error)) throw error;
|
|
48069
|
+
}
|
|
48070
|
+
break;
|
|
48071
|
+
case "kinesisDisable":
|
|
48072
|
+
try {
|
|
48073
|
+
await send(() => client.send(new DisableKinesisStreamingDestinationCommand({
|
|
48074
|
+
TableName: tableName,
|
|
48075
|
+
StreamArn: op.streamArn
|
|
48076
|
+
})));
|
|
48077
|
+
} catch (error) {
|
|
48078
|
+
if (await this.kinesisStreaming(client, tableName, op.streamArn, error)) throw error;
|
|
48079
|
+
}
|
|
48080
|
+
await this.waitForKinesisDisableSettled(client, tableName, op.streamArn, scope, maskSecrets);
|
|
48081
|
+
break;
|
|
48082
|
+
case "kinesisPrecision":
|
|
48083
|
+
await send(() => client.send(new UpdateKinesisStreamingDestinationCommand({
|
|
48084
|
+
TableName: tableName,
|
|
48085
|
+
StreamArn: op.streamArn,
|
|
48086
|
+
UpdateKinesisStreamingConfiguration: { ApproximateCreationDateTimePrecision: op.precision }
|
|
48087
|
+
})));
|
|
48088
|
+
break;
|
|
48089
|
+
case "putTablePolicy":
|
|
48090
|
+
case "putStreamPolicy": {
|
|
48091
|
+
const arn = await arnFor(op.kind === "putTablePolicy" ? "tableArn" : "streamArn");
|
|
48092
|
+
await send(() => client.send(new PutResourcePolicyCommand({
|
|
48093
|
+
ResourceArn: arn,
|
|
48094
|
+
Policy: op.document
|
|
48095
|
+
})));
|
|
48096
|
+
break;
|
|
48097
|
+
}
|
|
48098
|
+
case "deleteTablePolicy":
|
|
48099
|
+
case "deleteStreamPolicy": {
|
|
48100
|
+
if (op.kind === "deleteStreamPolicy" && (await describe()).streamArn === void 0) break;
|
|
48101
|
+
const arn = await arnFor(op.kind === "deleteTablePolicy" ? "tableArn" : "streamArn");
|
|
48102
|
+
try {
|
|
48103
|
+
await send(() => client.send(new DeleteResourcePolicyCommand({ ResourceArn: arn })));
|
|
48104
|
+
} catch (error) {
|
|
48105
|
+
if (!(error instanceof PolicyNotFoundException)) throw error;
|
|
48106
|
+
}
|
|
48107
|
+
break;
|
|
48108
|
+
}
|
|
48109
|
+
}
|
|
48110
|
+
this.logger.debug(maskSecrets(`Applied ${op.kind} to ${scope}`));
|
|
48111
|
+
}
|
|
48112
|
+
async retrySettlingRefusal(call, label, maskSecrets) {
|
|
48113
|
+
const watch = startInterruptWatch(maskSecrets(`DynamoDB ${label}`));
|
|
48114
|
+
try {
|
|
48115
|
+
let delayMs = SETTLING_RETRY_INITIAL_MS;
|
|
48116
|
+
for (let attempt = 1;; attempt++) try {
|
|
48117
|
+
await call();
|
|
48118
|
+
return;
|
|
48119
|
+
} catch (error) {
|
|
48120
|
+
const detail = describeAwsFailure(error).detail;
|
|
48121
|
+
const name = error instanceof Error ? error.name : "";
|
|
48122
|
+
if (!(/being enabled|being updated|please retry later|backups are being/i.test(detail) || name === "ResourceInUseException" || name === "LimitExceededException") || attempt >= 8) throw error;
|
|
48123
|
+
this.logger.debug(maskSecrets(`Transient refusal of ${label} (attempt ${attempt}/${8}): ${detail} - retrying in ${delayMs}ms`));
|
|
48124
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
48125
|
+
if (watch.isInterrupted()) throw watch.onInterrupted();
|
|
48126
|
+
delayMs = Math.min(delayMs * 2, 3e4);
|
|
48127
|
+
}
|
|
48128
|
+
} finally {
|
|
48129
|
+
watch.dispose();
|
|
48130
|
+
}
|
|
48131
|
+
}
|
|
47000
48132
|
async sendLocalSettingUpdate(input, fromTemplate, what, tableName, logicalId, maskSecrets) {
|
|
47001
48133
|
try {
|
|
47002
48134
|
await this.dynamoDBClient.send(new UpdateTableCommand(input));
|
|
@@ -47004,7 +48136,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47004
48136
|
} catch (error) {
|
|
47005
48137
|
if (fromTemplate || isInterruptedWaitError(error)) throw error;
|
|
47006
48138
|
this.logger.debug(maskSecrets(`Could not bring the ${what} of ${tableName} to the declared one: ` + describeAwsFailure(error).detail));
|
|
47007
|
-
this.logger.warn(maskSecrets(`${tableName} does not hold its declared ${what}, and setting it failed (${describeAwsFailure(error).summary}). The next deploy that updates this table tries again.`));
|
|
48139
|
+
this.logger.warn(maskSecrets(`${tableName} does not hold its declared ${what}, and setting it failed (${describeAwsFailure(error).summary}).` + relayedEncryptionChangeLimit(describeAwsFailure(error).detail) + ` The next deploy that updates this table tries again.`));
|
|
47008
48140
|
}
|
|
47009
48141
|
}
|
|
47010
48142
|
async waitForGlobalTableSettled(tableName, logicalId, maskSecrets, opts = {}) {
|
|
@@ -47105,6 +48237,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47105
48237
|
}
|
|
47106
48238
|
}
|
|
47107
48239
|
async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
48240
|
+
if (context?.desiredFromAwsReadback === true) properties = keepUnreadReplicaMembers(properties, previousProperties);
|
|
47108
48241
|
const log = this.operationSinks(context, [[properties["TableName"], physicalId], [previousProperties["TableName"], physicalId]]);
|
|
47109
48242
|
const maskSecrets = log.mask;
|
|
47110
48243
|
const warn = log.warn;
|
|
@@ -47170,6 +48303,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47170
48303
|
if (refusal === void 0 && !deepEqual(properties["StreamSpecification"], previousProperties["StreamSpecification"])) refusal = configStringRefusal(properties["StreamSpecification"], "StreamViewType", "NEW_AND_OLD_IMAGES", "AWS::DynamoDB::GlobalTable StreamSpecification");
|
|
47171
48304
|
if (refusal === void 0 && (changed("SSESpecification") || !deepEqual(replicaKeyBlocks(properties), replicaKeyBlocks(previousProperties)))) refusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
|
|
47172
48305
|
if (refusal === void 0 && changed("GlobalSecondaryIndexes")) refusal = globalSecondaryIndexesShapeDetail(properties["GlobalSecondaryIndexes"], maskSecrets);
|
|
48306
|
+
if (refusal === void 0) refusal = replicaSettingsRefusal(properties, previousProperties);
|
|
47173
48307
|
if (refusal !== void 0) refuse(refusal);
|
|
47174
48308
|
} else {
|
|
47175
48309
|
const sseEnabledRefusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
|
|
@@ -47484,9 +48618,16 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47484
48618
|
await this.waitForReplicaActive(physicalId, region, logicalId, void 0, maskSecrets);
|
|
47485
48619
|
}
|
|
47486
48620
|
const addedReplicaRegions = new Set(replicaDiff.added.map((r) => r["Region"]));
|
|
47487
|
-
await this.convergeReplicaDeletionProtection(physicalId, logicalId, currentRegion, previousProperties, properties, addedReplicaRegions, warn, maskSecrets);
|
|
48621
|
+
await this.convergeReplicaDeletionProtection(physicalId, logicalId, currentRegion, previousProperties, properties, addedReplicaRegions, context?.desiredFromAwsReadback === true, warn, maskSecrets);
|
|
47488
48622
|
await this.convergeReplicaSettings(physicalId, logicalId, currentRegion, properties, addedReplicaRegions, maskSecrets);
|
|
47489
48623
|
await this.applyReplicaKeys(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, deferredSseUpdate, deferredSseFromTemplate, keylessSseFromTemplate, maskSecrets);
|
|
48624
|
+
await this.applyReplicaSettings(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, !deepEqual(asRecord(properties["StreamSpecification"])?.["StreamViewType"], asRecord(previousProperties["StreamSpecification"])?.["StreamViewType"]), context?.replayingState === true || context?.desiredFromAwsReadback === true, new Set(context?.desiredFromAwsReadback === true ? [
|
|
48625
|
+
"pitr",
|
|
48626
|
+
"contributorInsights",
|
|
48627
|
+
"kinesis",
|
|
48628
|
+
"tablePolicy",
|
|
48629
|
+
"streamPolicy"
|
|
48630
|
+
] : context?.replayingState === true ? ["pitr"] : []), describeResp.Table?.LatestStreamArn, warn, maskSecrets);
|
|
47490
48631
|
const previousTranslatedIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling, "min", void 0, onUnusablePreviousGsiBlock, maskSecrets);
|
|
47491
48632
|
const previousSdkIndexes = previousGsiUnusable ? buildLiveRecoveryGsiBaseline(desiredSdkIndexes, describeResp.Table?.GlobalSecondaryIndexes, {
|
|
47492
48633
|
carryLiveValues: oldBilling === newBilling && liveBillingMode === newBilling,
|
|
@@ -47582,30 +48723,44 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47582
48723
|
if (!deepEqual(properties["TimeToLiveSpecification"], previousProperties["TimeToLiveSpecification"])) {
|
|
47583
48724
|
const sendTtl = async (cmd) => {
|
|
47584
48725
|
try {
|
|
47585
|
-
await this.dynamoDBClient.send(cmd)
|
|
48726
|
+
await sendTtlWaitingOutRateLimit(() => this.dynamoDBClient.send(cmd), {
|
|
48727
|
+
what: maskSecrets(`DynamoDB TimeToLive rate-limit wait on ${physicalId}`),
|
|
48728
|
+
announce: () => this.logger.info(maskSecrets(`DynamoDB global table ${logicalId}: TimeToLive was changed recently, and AWS refuses another change until its rate-limit interval passes (up to about an hour). Retrying every minute, like CloudFormation, within the resource timeout.`))
|
|
48729
|
+
});
|
|
47586
48730
|
} catch (ttlErr) {
|
|
47587
|
-
|
|
48731
|
+
const msg = describeAwsFailure(ttlErr).detail;
|
|
48732
|
+
if (cmd.input.TimeToLiveSpecification?.Enabled === false && isTtlAlreadyDisabled(msg)) {
|
|
48733
|
+
this.logger.debug(maskSecrets(`TimeToLive already disabled on ${physicalId}`));
|
|
48734
|
+
return;
|
|
48735
|
+
}
|
|
48736
|
+
if (isTtlRateLimited(msg)) throw this.wrapMaskedError(log, ttlErr, (text) => new ProvisioningError(`AWS rejected TimeToLive update on ${log.value(physicalId)}: ${sentence(text)} AWS rate-limits TTL changes per table, and kept refusing until the resource timeout ran out; redeploy once the interval has passed (up to about an hour), or raise --resource-timeout.`, resourceType, logicalId, physicalId, ttlErr instanceof Error ? ttlErr : void 0));
|
|
47588
48737
|
throw ttlErr;
|
|
47589
48738
|
}
|
|
47590
48739
|
};
|
|
47591
|
-
const
|
|
47592
|
-
|
|
48740
|
+
const ttlPlan = planTimeToLive(properties["TimeToLiveSpecification"], previousProperties["TimeToLiveSpecification"], "update");
|
|
48741
|
+
let ttlTarget;
|
|
48742
|
+
if (ttlPlan.kind === "enable" || ttlPlan.kind === "disable") ttlTarget = {
|
|
48743
|
+
enabled: ttlPlan.kind === "enable",
|
|
48744
|
+
attributeName: ttlPlan.attributeName
|
|
48745
|
+
};
|
|
48746
|
+
else if (ttlPlan.kind === "disable-live") {
|
|
48747
|
+
let live;
|
|
48748
|
+
await this.retrySettlingRefusal(async () => {
|
|
48749
|
+
live = (await this.dynamoDBClient.send(new DescribeTimeToLiveCommand({ TableName: physicalId }))).TimeToLiveDescription;
|
|
48750
|
+
}, `TimeToLive read on ${physicalId}`, maskSecrets);
|
|
48751
|
+
const status = live?.TimeToLiveStatus;
|
|
48752
|
+
if ((status === "ENABLED" || status === "ENABLING") && live?.AttributeName) ttlTarget = {
|
|
48753
|
+
enabled: false,
|
|
48754
|
+
attributeName: live.AttributeName
|
|
48755
|
+
};
|
|
48756
|
+
}
|
|
48757
|
+
if (ttlTarget) await sendTtl(new UpdateTimeToLiveCommand({
|
|
47593
48758
|
TableName: physicalId,
|
|
47594
48759
|
TimeToLiveSpecification: {
|
|
47595
|
-
Enabled:
|
|
47596
|
-
AttributeName:
|
|
48760
|
+
Enabled: ttlTarget.enabled,
|
|
48761
|
+
AttributeName: ttlTarget.attributeName
|
|
47597
48762
|
}
|
|
47598
48763
|
}));
|
|
47599
|
-
else if (previousProperties["TimeToLiveSpecification"]) {
|
|
47600
|
-
const prevTtl = previousProperties["TimeToLiveSpecification"];
|
|
47601
|
-
if (prevTtl["AttributeName"]) await sendTtl(new UpdateTimeToLiveCommand({
|
|
47602
|
-
TableName: physicalId,
|
|
47603
|
-
TimeToLiveSpecification: {
|
|
47604
|
-
Enabled: false,
|
|
47605
|
-
AttributeName: prevTtl["AttributeName"]
|
|
47606
|
-
}
|
|
47607
|
-
}));
|
|
47608
|
-
}
|
|
47609
48764
|
}
|
|
47610
48765
|
const finalDescribe = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: physicalId }));
|
|
47611
48766
|
const impliedStream = replicationImpliedStreamSpecification(properties);
|
|
@@ -48088,7 +49243,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48088
49243
|
throw err;
|
|
48089
49244
|
}
|
|
48090
49245
|
}
|
|
48091
|
-
async readCurrentState(physicalId, _logicalId, _resourceType) {
|
|
49246
|
+
async readCurrentState(physicalId, _logicalId, _resourceType, properties, context) {
|
|
49247
|
+
const afterOwnWrite = context?.afterOwnWrite === true;
|
|
48092
49248
|
try {
|
|
48093
49249
|
const table = (await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: physicalId }))).Table;
|
|
48094
49250
|
if (!table) return void 0;
|
|
@@ -48108,21 +49264,37 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48108
49264
|
if (table.SSEDescription.SSEType !== void 0) sse["SSEType"] = table.SSEDescription.SSEType;
|
|
48109
49265
|
result["SSESpecification"] = sse;
|
|
48110
49266
|
}
|
|
48111
|
-
if (table.TableClassSummary?.TableClass) result["TableClass"] = table.TableClassSummary.TableClass;
|
|
48112
|
-
if (table.DeletionProtectionEnabled !== void 0) result["DeletionProtectionEnabled"] = table.DeletionProtectionEnabled;
|
|
48113
49267
|
const currentRegion = await this.dynamoDBClient.config.region() ?? "";
|
|
48114
49268
|
const tableNameForSubs = table.TableName ?? physicalId;
|
|
48115
49269
|
const sdkReplicas = table.Replicas && table.Replicas.length > 0 ? currentRegion && !table.Replicas.some((r) => r.RegionName === currentRegion) ? [...table.Replicas, { RegionName: currentRegion }] : table.Replicas : [{ RegionName: currentRegion }];
|
|
48116
49270
|
const replicas = await Promise.all(sdkReplicas.map(async (r) => {
|
|
48117
49271
|
const entry = { Region: r.RegionName };
|
|
48118
|
-
if (r.KMSMasterKeyId !== void 0) entry["KMSMasterKeyId"] = r.KMSMasterKeyId;
|
|
48119
49272
|
if (!r.RegionName) return entry;
|
|
48120
49273
|
const isLocal = r.RegionName === currentRegion;
|
|
49274
|
+
const kmsKey = isLocal ? table.SSEDescription?.Status === "ENABLED" ? table.SSEDescription.KMSMasterKeyArn : void 0 : r.KMSMasterKeyId;
|
|
49275
|
+
if (kmsKey !== void 0 && kmsKey !== "") entry["SSESpecification"] = { KMSMasterKeyId: kmsKey };
|
|
49276
|
+
entry["TableClass"] = (isLocal ? void 0 : r.ReplicaTableClassSummary?.TableClass) ?? table.TableClassSummary?.TableClass ?? "STANDARD";
|
|
49277
|
+
const declaredReplica = properties ? localReplicaEntry(properties, r.RegionName) : void 0;
|
|
48121
49278
|
const client = isLocal ? this.dynamoDBClient : this.getRegionalClient(r.RegionName);
|
|
48122
49279
|
const regionLabel = r.RegionName;
|
|
48123
49280
|
const replicaArn = isLocal ? table.TableArn : table.TableArn ? this.replicaArnForRegion(table.TableArn, r.RegionName) : void 0;
|
|
48124
|
-
const subs = await this.readReplicaSubSpecs(client, tableNameForSubs, regionLabel);
|
|
49281
|
+
const subs = await this.readReplicaSubSpecs(client, tableNameForSubs, regionLabel, declaredReplica);
|
|
48125
49282
|
Object.assign(entry, subs);
|
|
49283
|
+
let protection;
|
|
49284
|
+
let streamArn;
|
|
49285
|
+
if (isLocal) {
|
|
49286
|
+
protection = table.DeletionProtectionEnabled;
|
|
49287
|
+
streamArn = table.LatestStreamArn;
|
|
49288
|
+
} else try {
|
|
49289
|
+
const regional = await client.send(new DescribeTableCommand({ TableName: tableNameForSubs }));
|
|
49290
|
+
protection = regional.Table?.DeletionProtectionEnabled;
|
|
49291
|
+
streamArn = regional.Table?.LatestStreamArn;
|
|
49292
|
+
} catch (err) {
|
|
49293
|
+
if (err instanceof ResourceNotFoundException$1) this.logger.debug(safeMsg`Cross-region replica ${regionLabel} returned RNF on DescribeTable; omitting its protection and stream policy`);
|
|
49294
|
+
else this.logger.debug(safeMsg`Could not read the ${regionLabel} replica of ${tableNameForSubs}: ${describeAwsFailure(err).detail}`);
|
|
49295
|
+
}
|
|
49296
|
+
if (typeof protection === "boolean") entry["DeletionProtectionEnabled"] = protection;
|
|
49297
|
+
await this.readReplicaPolicies(client, tableNameForSubs, regionLabel, replicaArn, streamArn, declaredReplica, afterOwnWrite, entry);
|
|
48126
49298
|
if (replicaArn) try {
|
|
48127
49299
|
const tagsResp = await client.send(new ListTagsOfResourceCommand({ ResourceArn: replicaArn }));
|
|
48128
49300
|
entry["Tags"] = normalizeAwsTagsToCfn(tagsResp.Tags);
|
|
@@ -48207,17 +49379,19 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48207
49379
|
throw err;
|
|
48208
49380
|
}
|
|
48209
49381
|
}
|
|
48210
|
-
async readReplicaSubSpecs(client, tableName, regionLabel) {
|
|
49382
|
+
async readReplicaSubSpecs(client, tableName, regionLabel, declaredReplica) {
|
|
48211
49383
|
const out = {};
|
|
48212
49384
|
try {
|
|
48213
49385
|
const ci = await client.send(new DescribeContributorInsightsCommand({ TableName: tableName }));
|
|
48214
|
-
|
|
49386
|
+
const block = reverseMapReplicaContributorInsights(ci.ContributorInsightsStatus, ci.ContributorInsightsMode, declaredReplica?.["ContributorInsightsSpecification"]);
|
|
49387
|
+
if (block !== void 0) out["ContributorInsightsSpecification"] = block;
|
|
48215
49388
|
} catch (err) {
|
|
48216
49389
|
this.logger.debug(`Could not read ContributorInsights for ${tableName} in ${regionLabel}: ${describeAwsFailure(err).detail}`);
|
|
48217
49390
|
}
|
|
48218
49391
|
try {
|
|
48219
|
-
const
|
|
48220
|
-
|
|
49392
|
+
const description = (await client.send(new DescribeContinuousBackupsCommand({ TableName: tableName }))).ContinuousBackupsDescription?.PointInTimeRecoveryDescription;
|
|
49393
|
+
const block = reverseMapReplicaPitr(description?.PointInTimeRecoveryStatus, description?.RecoveryPeriodInDays, declaredReplica?.["PointInTimeRecoverySpecification"]);
|
|
49394
|
+
if (block !== void 0) out["PointInTimeRecoverySpecification"] = block;
|
|
48221
49395
|
} catch (err) {
|
|
48222
49396
|
this.logger.debug(`Could not read PointInTimeRecovery for ${tableName} in ${regionLabel}: ${describeAwsFailure(err).detail}`);
|
|
48223
49397
|
}
|
|
@@ -48233,6 +49407,54 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48233
49407
|
}
|
|
48234
49408
|
return out;
|
|
48235
49409
|
}
|
|
49410
|
+
policyRereadDelaysMs = [
|
|
49411
|
+
500,
|
|
49412
|
+
1e3,
|
|
49413
|
+
2e3
|
|
49414
|
+
];
|
|
49415
|
+
async readReplicaPolicies(client, tableName, regionLabel, tableArn, streamArn, declaredReplica, afterOwnWrite, entry) {
|
|
49416
|
+
if (declaredReplica === void 0) return;
|
|
49417
|
+
const readOne = async (what, arn, container) => {
|
|
49418
|
+
if (arn === void 0 || arn === "") return void 0;
|
|
49419
|
+
const declaredMember = () => declaredStreamPolicyMember(container);
|
|
49420
|
+
let last;
|
|
49421
|
+
const read = async () => {
|
|
49422
|
+
try {
|
|
49423
|
+
last = (await client.send(new GetResourcePolicyCommand({ ResourceArn: arn }))).Policy;
|
|
49424
|
+
} catch (err) {
|
|
49425
|
+
if (!(err instanceof PolicyNotFoundException)) throw err;
|
|
49426
|
+
last = void 0;
|
|
49427
|
+
}
|
|
49428
|
+
return last;
|
|
49429
|
+
};
|
|
49430
|
+
try {
|
|
49431
|
+
let live = await read();
|
|
49432
|
+
for (const delayMs of afterOwnWrite ? this.policyRereadDelaysMs : []) {
|
|
49433
|
+
if (streamPolicyMatchesDeclared(live, container)) break;
|
|
49434
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
49435
|
+
live = await read();
|
|
49436
|
+
}
|
|
49437
|
+
if (afterOwnWrite && (live === void 0 || live === "")) {
|
|
49438
|
+
this.logger.debug(safeMsg`Kept the declared ${what} of the ${regionLabel} replica of ${tableName} in the baseline captured after its write: the read still found no policy`);
|
|
49439
|
+
return declaredMember();
|
|
49440
|
+
}
|
|
49441
|
+
return reverseMapStreamPolicy(live, container);
|
|
49442
|
+
} catch (err) {
|
|
49443
|
+
this.logger.debug(safeMsg`Could not read the ${what} of the ${regionLabel} replica of ${tableName}: ${describeAwsFailure(err).detail}`);
|
|
49444
|
+
if (afterOwnWrite && last !== void 0 && last !== "") return reverseMapStreamPolicy(last, container);
|
|
49445
|
+
if (afterOwnWrite && (isThrottlingError(err) || isTransientServerError(err) || isAmbiguousOutcomeError(err) || err instanceof ResourceNotFoundException$1)) return declaredMember();
|
|
49446
|
+
return;
|
|
49447
|
+
}
|
|
49448
|
+
};
|
|
49449
|
+
if (readTablePolicy(declaredReplica).kind === "usable") {
|
|
49450
|
+
const member = await readOne("ResourcePolicy", tableArn, declaredReplica);
|
|
49451
|
+
if (member !== void 0) entry["ResourcePolicy"] = member;
|
|
49452
|
+
}
|
|
49453
|
+
if (readStreamPolicy$1(declaredReplica).kind === "usable") {
|
|
49454
|
+
const member = await readOne("stream ResourcePolicy", streamArn, declaredReplica["ReplicaStreamSpecification"]);
|
|
49455
|
+
if (member !== void 0) entry["ReplicaStreamSpecification"] = { ResourcePolicy: member };
|
|
49456
|
+
}
|
|
49457
|
+
}
|
|
48236
49458
|
async readAutoScalingSettings(tableName, scalableDimension, client, indexName) {
|
|
48237
49459
|
const resourceId = autoScalingResourceId(tableName, indexName);
|
|
48238
49460
|
try {
|
|
@@ -48312,36 +49534,23 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48312
49534
|
baseline,
|
|
48313
49535
|
aws
|
|
48314
49536
|
};
|
|
48315
|
-
const key = "Replicas";
|
|
48316
|
-
const baselineReplicas = baseline[key];
|
|
48317
|
-
const awsReplicas = aws[key];
|
|
48318
|
-
if (!Array.isArray(baselineReplicas) || !Array.isArray(awsReplicas)) return {
|
|
48319
|
-
baseline,
|
|
48320
|
-
aws
|
|
48321
|
-
};
|
|
48322
49537
|
const localRegion = await this.dynamoDBClient.config.region() ?? "";
|
|
48323
|
-
|
|
49538
|
+
const completed = completeLegacyLocalReplica(baseline, aws, localRegion);
|
|
49539
|
+
const converted = canonicalizePre5381ReplicaBaseline(completed, aws, localRegion, completed !== baseline);
|
|
49540
|
+
return converted === baseline ? {
|
|
48324
49541
|
baseline,
|
|
48325
49542
|
aws
|
|
48326
|
-
}
|
|
48327
|
-
|
|
48328
|
-
if (baselineReplicas.some(isLocal)) return {
|
|
48329
|
-
baseline,
|
|
48330
|
-
aws
|
|
48331
|
-
};
|
|
48332
|
-
const liveLocal = awsReplicas.find(isLocal);
|
|
48333
|
-
if (liveLocal === void 0) return {
|
|
48334
|
-
baseline,
|
|
48335
|
-
aws
|
|
48336
|
-
};
|
|
48337
|
-
return {
|
|
48338
|
-
baseline: {
|
|
48339
|
-
...baseline,
|
|
48340
|
-
[key]: [...baselineReplicas, structuredClone(liveLocal)]
|
|
48341
|
-
},
|
|
49543
|
+
} : {
|
|
49544
|
+
baseline: converted,
|
|
48342
49545
|
aws
|
|
48343
49546
|
};
|
|
48344
49547
|
}
|
|
49548
|
+
getDriftAbsentMeansDefaultKeys(resourceType, properties) {
|
|
49549
|
+
if (resourceType !== "AWS::DynamoDB::GlobalTable") return [];
|
|
49550
|
+
const declared = properties["SSESpecification"];
|
|
49551
|
+
if (declared === void 0) return ["SSESpecification"];
|
|
49552
|
+
return coerceCfnBoolean(asRecord(declared)?.["SSEEnabled"]) === false ? ["SSESpecification"] : [];
|
|
49553
|
+
}
|
|
48345
49554
|
async import(input) {
|
|
48346
49555
|
const explicit = resolveExplicitPhysicalId(input, "TableName");
|
|
48347
49556
|
if (explicit) try {
|
|
@@ -48473,11 +49682,50 @@ function refuseMalformedReplicaTags(properties, resourceType, logicalId, physica
|
|
|
48473
49682
|
});
|
|
48474
49683
|
return tagsByReplica;
|
|
48475
49684
|
}
|
|
49685
|
+
function completeLegacyLocalReplica(baseline, aws, localRegion) {
|
|
49686
|
+
const key = "Replicas";
|
|
49687
|
+
const baselineReplicas = baseline[key];
|
|
49688
|
+
const awsReplicas = aws[key];
|
|
49689
|
+
if (!Array.isArray(baselineReplicas) || !Array.isArray(awsReplicas)) return baseline;
|
|
49690
|
+
if (!localRegion) return baseline;
|
|
49691
|
+
const isLocal = (element) => asRecord(element)?.["Region"] === localRegion;
|
|
49692
|
+
if (baselineReplicas.some(isLocal)) return baseline;
|
|
49693
|
+
const liveLocal = awsReplicas.find(isLocal);
|
|
49694
|
+
if (liveLocal === void 0) return baseline;
|
|
49695
|
+
return {
|
|
49696
|
+
...baseline,
|
|
49697
|
+
[key]: [...baselineReplicas, structuredClone(liveLocal)]
|
|
49698
|
+
};
|
|
49699
|
+
}
|
|
48476
49700
|
function localReplicaEntry(props, region) {
|
|
48477
49701
|
const raw = props["Replicas"];
|
|
48478
49702
|
if (!Array.isArray(raw)) return void 0;
|
|
48479
49703
|
return raw.find((r) => r?.["Region"] === region);
|
|
48480
49704
|
}
|
|
49705
|
+
const REPLICA_SETTING_MEMBERS = [
|
|
49706
|
+
"PointInTimeRecoverySpecification",
|
|
49707
|
+
"ContributorInsightsSpecification",
|
|
49708
|
+
"KinesisStreamSpecification",
|
|
49709
|
+
"ResourcePolicy",
|
|
49710
|
+
"ReplicaStreamSpecification"
|
|
49711
|
+
];
|
|
49712
|
+
function replicaSettingsRefusal(properties, previousProperties, currentRegion) {
|
|
49713
|
+
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
49714
|
+
const crossRegionCreate = previousProperties === void 0 && desired.some((entry) => {
|
|
49715
|
+
const region = asRecord(entry)?.["Region"];
|
|
49716
|
+
return typeof region === "string" && region !== currentRegion;
|
|
49717
|
+
});
|
|
49718
|
+
for (const entry of desired) {
|
|
49719
|
+
const replica = asRecord(entry);
|
|
49720
|
+
const region = replica?.["Region"];
|
|
49721
|
+
if (typeof region !== "string") continue;
|
|
49722
|
+
const previous = previousProperties === void 0 ? void 0 : localReplicaEntry(previousProperties, region);
|
|
49723
|
+
if (!(previous === void 0 || REPLICA_SETTING_MEMBERS.some((member) => !deepEqual(replica?.[member], previous[member])))) continue;
|
|
49724
|
+
const [refusal] = replicaSettingRefusals(replica);
|
|
49725
|
+
if (refusal !== void 0) return `The ${region} replica: ${refusal}`;
|
|
49726
|
+
if ((previousProperties === void 0 ? crossRegionCreate : previous === void 0) && replica?.["ResourcePolicy"] !== void 0 && replica["ResourcePolicy"] !== null) return `The ${region} replica: Replicas[].ResourcePolicy cannot be set in the deploy that creates the replica — CloudFormation refuses it ("A replica cannot be created in the same stack update as putting a resource-based policy on that new replica"). ` + (previousProperties === void 0 ? `Deploy the table and its replicas without it` : `Deploy the replica without it`) + `, then add the policy in a later deploy`;
|
|
49727
|
+
}
|
|
49728
|
+
}
|
|
48481
49729
|
function extractLocalDeletionProtection(props, region) {
|
|
48482
49730
|
const local = localReplicaEntry(props, region);
|
|
48483
49731
|
const perReplica = coerceCfnBoolean(local?.["DeletionProtectionEnabled"]);
|
|
@@ -48608,8 +49856,19 @@ function collectAutoScalingTargets(properties, localRegion) {
|
|
|
48608
49856
|
const REPLICA_COPY_RELEASE_POLLS = 180;
|
|
48609
49857
|
const REPLICA_COPY_RELEASE_POLL_MS = 5e3;
|
|
48610
49858
|
const DELETION_PROTECTION_REFLIP_MS = 16e3;
|
|
49859
|
+
function relayedEncryptionChangeLimit(withheldText) {
|
|
49860
|
+
return /Encryption mode changes are limited/i.test(withheldText) ? " AWS limits a table to 4 encryption changes in 24 hours, then one every 6 hours; retry the change later (--verbose shows when AWS allows the next one)." : "";
|
|
49861
|
+
}
|
|
49862
|
+
const KINESIS_DISABLE_UNSETTLED = /* @__PURE__ */ new Set([
|
|
49863
|
+
"ACTIVE",
|
|
49864
|
+
"ENABLING",
|
|
49865
|
+
"UPDATING",
|
|
49866
|
+
"DISABLING"
|
|
49867
|
+
]);
|
|
48611
49868
|
const REPLICA_PROTECTION_SETTLE_POLLS = 60;
|
|
48612
49869
|
const REPLICA_PROTECTION_SETTLE_POLL_MS = 5e3;
|
|
49870
|
+
const SETTLING_RETRY_ATTEMPTS = 8;
|
|
49871
|
+
const SETTLING_RETRY_INITIAL_MS = 2e3;
|
|
48613
49872
|
const REPLICA_COPY_RELEASE_ATTEMPTS = 3;
|
|
48614
49873
|
function isReplicaCopyExistsRefusal(error) {
|
|
48615
49874
|
return error instanceof Error && /one or more replicas already existed as tables/i.test(error.message);
|
|
@@ -50457,7 +51716,10 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
50457
51716
|
continue;
|
|
50458
51717
|
}
|
|
50459
51718
|
const moved = movedAsWritten(pc.path);
|
|
50460
|
-
const conditionalVerdict = moved && !typeChanged && isReplacementCeiling(pc) ? engine.diffCalculator.conditionalReplacementVerdict?.(resourceType, pc.path, currentPropsAsWritten[pc.path], desiredForSkipCheckAsWritten[pc.path]
|
|
51719
|
+
const conditionalVerdict = moved && !typeChanged && isReplacementCeiling(pc) ? engine.diffCalculator.conditionalReplacementVerdict?.(resourceType, pc.path, currentPropsAsWritten[pc.path], desiredForSkipCheckAsWritten[pc.path], {
|
|
51720
|
+
oldProperties: currentPropsAsWritten,
|
|
51721
|
+
newProperties: desiredForSkipCheckAsWritten
|
|
51722
|
+
}) : void 0;
|
|
50461
51723
|
if (moved && conditionalVerdict !== false) {
|
|
50462
51724
|
warnWitnessReplacement(pc.path);
|
|
50463
51725
|
lowered.push(pc);
|
|
@@ -52517,5 +53779,5 @@ function sameGenerationClaimsOf(record) {
|
|
|
52517
53779
|
}
|
|
52518
53780
|
|
|
52519
53781
|
//#endregion
|
|
52520
|
-
export { planOrphanAdoption as $, malformedLocalOutputsWarning as $a, hasReadableExportSet as $c, refuseUnreadableCdkCrossAccountRefs as $i, getDefaultStateBucketName as $l, awaitInFlightSibling as $n, withoutSilentDropProperties as $o, isRefusedByName as $r, hasMaskableValues as $s, resolveReplacementOldType as $t, inheritedProvenanceForChildDiff as A, lacksRecordedTableArn as Aa, recordMaskOnlyValuesIn as Ac, deleteLeftInPlace as Ai, buildDenyExternalAccessPolicy as Al, exportNameSecretExposure as An, refuseMalformedResourceEntriesForImportSave as Ao, secretNamePrintingBag as Ar, DagBuilder as As, readRefactorMarker as At, hasOwnKey as Au, conditionFingerprint as B, UNREADABLE_ORPHANS_CONTAINER_ROW as Ba, rebuildClientForBucketRegion as Bc, reEnableInstanceApiTermination as Bi, isDockerClientEnvKey as Bl, constructPathOf as Bn, repairMalformedOrphanRecordsForReadOnly as Bo, createPreDeleteFinalSnapshot as Br, noEchoOutputsComparison as Bs, refusePendingMovesOut as Bt, injectedAwsRegionValue as Bu, hasCdkAutoDeleteTag as C, carriesDynamicReference as Ca, physicalNameCopiesOf as Cc, customResourceResponseExpirationWarning as Ci, ensureAssetStorage as Cl, displayTextOrWithheld as Cn, refuseMalformedOutputs as Co, noEchoParameterNamesOf as Cr, prefetchCreateOnlyPropertyPaths as Cs, makeForeignHolderScan as Ct, AssemblyReader as Cu, IMPLICIT_DELETE_DEPENDENCIES as D, AWS_NO_VALUE as Da, carriesSecretMask as Dc, RollbackInlinePolicyWriters as Di, readBootstrapMarkerBody as Dl, secretSafeKeyDisplay as Dn, refuseMalformedResourceEntriesForDeploy as Do, maskEventTextWithBoundBags as Dr, canonicalLambdaFunctionName as Ds, isAccessDeniedError as Dt, parseFailureDebugDetail as Du, markRefusedBeforeApplying as E, keepsSecretReferenceToken as Ea, splitGetAttStringForm as Ec, unchangedBehindSecretReference as Ei, parseBootstrapMarker as El, secretBearingStateKeyWarning as En, refuseMalformedResourceEntries as Eo, journaledOrphanPrintingBag as Er, withRetry as Es, chunks as Et, describeJsonParseFailure as Eu, findNestedTemplateTreeDefect as F, passedParameterClassesOf as Fa, WHOLE_DYNAMIC_REFERENCE_PATTERN as Fc, disableInstanceApiTermination as Fi, describeDockerFailure as Fl, isExportAliasCollision as Fn, refuseMalformedResourcePropertiesForOrphan as Fo, storedSecretNameNeedles as Fr, maskReadbackAtCoordinates as Fs, sameMove as Ft, describeFileReadFailure as Fu, enclosingDeadlineRemainingMs as G, hasReadableOrphans as Ga, isAccessDenied$1 as Gc, isSettledInstanceState as Gi, redactedDockerCause as Gl, movedToHint as Gn, repairMalformedResourcesForReadOnly as Go, earliestDefined as Gr, valueAtCoordinate as Gs, demoteSupersededOrphans as Gt, parentSuppliedValues as H, accountArgs as Ha, CrossPrefixScanCache as Hc, INTRINSIC_KEYS as Hi, partitionSensitiveEnv as Hl, formatDestructiveChange as Hn, repairMalformedOutputsForReadOnly as Ho, isFinalSnapshotError as Hr, readbackPathFor as Hs, replayRollback as Ht, resolveBucketRegion as Hu, isAbsoluteAssetPath as I, declaresNoEcho as Ia, isSingleDynamicReferenceToken as Ic, ec2InstanceProtectionSite as Ii, dockerSpawnEnvWithSensitive as Il, bindingSkippedOutputs as In, refuseMalformedResourcesForDeploy as Io, ATOMIC_FINAL_SNAPSHOT_TYPES as Ir, maskWholeValue as Is, updateRefactorMarker as It, displayAssemblyPath as Iu, isSecretBearingReferenceString as J, isReadableOrphanRecord as Ja, withStackInstanceIdWithheld as Jc, s3BucketDualStackDomainName as Ji, warnFinchArgvExposure as Jl, isPairableType as Jn, unreadableResourceEntries as Jo, withCreateTokenLedger as Jr, redactForState as Js, planFailedOps as Jt, withResourceDeadline as K, hasReadableOutputs as Ka, isNotImplemented as Kc, s3BucketArn as Ki, runDockerForeground as Kl, rollbackOrphanIds as Kn, unpreviewableOrphanRecords as Ko, ledgerForStack as Kr, liveMatchesUnresolvedTokenFrame as Ks, isJournaledOrphan as Kt, listNestedTemplateRows as L, JSON_LISTING_HOLE_VALUE as La, LockManager as Lc, isTerminationProtectionPropagationError as Li, finchSecretArgvRefusal as Ll, DEFAULT_RESOURCE_TIMEOUT_MS as Ln, refuseMalformedResourcesForDestroy as Lo, PRE_DELETE_SNAPSHOT_TYPES as Lr, maskedLeafCoordinatesOf as Ls, hasPendingMovesOut as Lt, renderAssemblyPathEscape as Lu, findServiceTokenRefusals as M, parseWebACLArn as Ma, recordNoEchoParameterFreshValue as Mc, withIndeterminateGuard as Mi, resolveDockerContextDirectory as Ml, noEchoParameterValueSeed as Mn, refuseMalformedResourcePropertiesForDestroy as Mo, secretNamedAttributeNamesOf as Mr, canonicalCoordinates as Ms, refactorMarkerMovesOf as Mt, nullPrototypeRecord as Mu, serviceTokenBlockingReason as N, withSharedDrainBudget as Na, recordProvenPublicExpression as Nc, isWaitAbandonedError as Ni, describeDockerCapturedOutput as Nl, collectDeclaredOutputNames as Nn, refuseMalformedResourcePropertiesForDrift as No, secretNamedRecordNeedles as Nr, isMarkedCoordinate as Ns, refactorMarkerRefusalMessage as Nt, ownValue as Nu, computeImplicitDeleteEdges as O, cfnRefValueFromPhysicalId as Oa, provenPublicValue as Oc, UNSPECIFIED_SKIP_REASON as Oi, validateAssetBucketName as Ol, carriedExportAliasExposure as On, refuseMalformedResourceEntriesForDestroy as Oo, namingSecretsWithRecordedNoEcho as Or, lambdaFunctionNameForMask as Os, lookupEachName as Ot, utf8ByteLength as Ou, childTemplateLoader as P, parameterInputsFor as Pa, wholeStringLeavesOf as Pc, markWaitAbandoned as Pi, describeDockerExecFailure as Pl, collectPublishedOutputNames as Pn, refuseMalformedResourcePropertiesForExport as Po, stateSecretNameNeedles as Pr, maskAtCoordinates as Ps, refuseRefactorMarker as Pt, absoluteAssemblyPathEscape as Pu, makeSiblingClaimReader as Q, malformedExportSourceWarning as Qa, exportNamesCarriedFrom as Qc, producerLookupOver as Qi, synthesisStatusMessage as Ql, proposeRenames as Qn, unwrittenCreateOnlyReplacement as Qo, extractDeploymentEventError as Qr, createUnionSecretMasker as Qs, replacementNeverSwapped as Qt, renderNestedTemplateTreeDefect as R, STATE_REGION_DIVERGED as Ra, isLockInfoExpired as Rc, observeThenDisableInstanceApiTermination as Ri, formatDockerLoginError as Rl, DEFAULT_RESOURCE_WARN_AFTER_MS as Rn, refuseMalformedResourcesForExport as Ro, buildFinalSnapshotIdentifier as Rr, noEchoCoordinatesOf as Rs, pendingMovesOutOf as Rt, resolveAssemblyPath as Ru, S3_AUTO_DELETE_OBJECTS_TAG as S, isImpossibleEmptyStoredAttribute as Sa, recoverMaskedOutput as Sc, applyCustomResourceResponseExpiration as Si, assertAssetBucketRegion as Sl, WITHHELD_NAME_DISPLAY as Sn, refuseMalformedOrphansForOrphan as So, noEchoExactEchoLeavesOf as Sr, requireConfigString as Ss, loadJournaledOrphans as St, derivePartitionAndUrlSuffix as Su, getPriorAttempts as T, isNamelessDynamicReferenceError as Ta, recordPhysicalNameCopy as Tc, slowCcOperationTimeoutMs as Ti, isCrossRegionRedirect as Tl, secretBearing as Tn, refuseMalformedResourceAttributesForOrphan as To, completedReplayEntries as Tr, describeTypeWithThrottleRetry as Ts, formatResourceLine as Tt, processStackMessages as Tu, readRecordedConditionVerdicts as U, deployRefusesOrphanRowsReason as Ua, applyCrossPrefixScan as Uc, IntrinsicFunctionResolver as Ui, redactDockerArgvValues as Ul, findRefactorHints as Un, repairMalformedResourceEntriesForReadOnly as Uo, refusesFinalSnapshot as Ur, readsNoEchoSource as Us, removeProtectionTypeList as Ut, conditionInputsFrom as V, UNREADABLE_RESOURCES_MAP_ROW as Va, CrossPrefixReadError as Vc, DiffCalculator as Vi, isMalformedEnvKey as Vl, findDestructiveChanges as Vn, repairMalformedOrphansForReadOnly as Vo, effectiveDeletionPolicy as Vr, passedNoEchoParametersOf as Vs, replayFailedOperations as Vt, clearBucketRegionCache as Vu, enclosingDeadlineExpired as W, displayLogicalId as Wa, crossPrefixDeniedWarning as Wc, poisonRenderedSpellingsCollidingIn as Wi, redactedCause as Wl, hintSidesOf as Wn, repairMalformedResourcePropertiesForReadOnly as Wo, unsupportedFinalSnapshotError as Wr, recordedNoEchoValuesOf as Ws, recordAfterRollbackUpdate as Wt, mergeNoChangeOutputs as X, malformedDriftResourcePropertiesWarning as Xa, acceptedCreateOnlyDropsOf as Xc, s3BucketWebsiteUrl as Xi, getDockerImageBySourceHash as Xl, mappingPairs as Xn, findActionableSilentDrops as Xo, DeploymentEventsReader as Xr, snapshotPassProvenance as Xs, recheckFailedPlan as Xt, keptWholeReasonText as Y, isReadableResourceEntry as Ya, splitImportedOps as Yc, s3BucketRegionalDomainName as Yi, AssetManifestLoader as Yl, looselyEqual as Yn, withheldAccountClause as Yo, acquireIdempotencyToken as Yr, recordReferenceProvenanceEntry as Ys, planRollback as Yt, makeCanonicalizePropertiesFn as Z, malformedExportNamesWarning as Za, describeRegionValueKind as Zc, resolveDynamicReferences as Zi, Synthesizer as Zl, parseMappingFile as Zn, findSilentDropProperties as Zo, DeploymentEventsStore as Zr, carryLogOnlyValues as Zs, recordUnderIdIsNotOwn as Zt, deleteTableWithIndexBusyRetry as _, regionLessSecretName as _a, pathCrossesDottedKey as _c, readsNoEchoDeleteValues as _i, createAssetRedirectResolver as _l, withNameGenerationReached as _n, refuseMalformedNestedChildOutputs as _o, supersededHolderOf as _r, configStringRefusal as _s, deleteJournaledOrphans as _t, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as _u, isProtectionValueActive as a, assertFlagRoleArn as aa, shareLogOnlyValues as ac, refuseMalformedDesiredTags as ai, orphansAfterRollback as al, REDACTED_DELETE_ADDRESS_SKIP_REASON as an, malformedOrphansRefusalMessage as ao, cyan as ar, isStatefulRecreateTargetForReplace as as, displacedOpClause as at, resolveSkipPrefix as au, waitForIndexesSettled as b, parameterTypeMayLoseSecretIdentity as ba, inheritNestedStackParameterAssociations as bc, withPrintingSecrets as bi, AssetModeResolver as bl, reachableDivergentParameters as bn, refuseMalformedOrphans as bo, noEchoAttributeNamesOf as br, requireConfigArray as bs, isHandledOrphan as bt, PARTITION_TABLE as bu, DynamoDBGlobalTableProvider as c, isIamRoleArn as ca, errorCauseChain as cc, definedAttributes as ci, stackInstanceIdCarriedFrom as cl, redactedDeleteAddressSkip as cn, malformedOutputsWarning as co, red as cr, WARM_THROUGHPUT_MEMBERS as cs, getNestedRevertRun as ct, resolveUseCdkBootstrapAssets as cu, compensateRemovedDeletionProtection as d, applyCallerIdentityCredentials as da, scrubResourceRecord as dc, ProviderRegistry as di, timePhase as dl, nameGenerationCarriedFrom as dn, malformedResourcePropertiesWarning as do, deleteSupersededEntry as dr, toCfnInteger as ds, revertNestedChildFromJournal as dt, ssmResolvedValueType as du, keepHeldTokenProvenance as ea, literalSplitDelimitersOf as ec, markDeleteStarted as ei, hasReasonlessBaselineRefusal as el, seedsDeleteFirstGuard as en, malformedLocalResourceEntriesWarning as eo, destroyStackRecordsView as er, NO_CC_HANDLERS_REASON as es, pendingRequestCount as et, getLegacyStateBucketName as eu, deleteBudgetKey as f, callerEnvCredentials as fa, withPhysicalNameCopies as fc, ccBrokenReason as fi, AssetPublisher as fl, nameGenerationHighWaterOf as fn, malformedResourcesWarning as fo, holdsSupersededResources as fr, toFiniteNumber as fs, revertedNestedRowIds as ft, CFN_TEMPLATE_BODY_LIMIT as fu, INDEX_SETTLE_POLL_INTERVAL_MS as g, producerRegionsFromState as ga, isUncertifiedBaselineMaskPosition as gc, TemplateNoEchoReresolver as gi, buildAssetRedirectMap as gl, retiredNameGenerationsLeaving as gn, refuseDivergentRecordRegionForDestroy as go, supersededHeldByOtherTypeWarning as gr, configIntegerRefusal as gs, withNestedStackContext as gt, uploadCfnTemplate as gu, DELETE_INDEX_WAIT_PROCEED_NOTE as h, classifyReplaySecretRegion as ha, dynamicReferenceTokens as hc, waitForLambdaFunctionActive as hi, WorkGraph as hl, retiredNameGenerationsAfter as hn, previewableOrphanRecords as ho, supersededAfterRollback as hr, configBooleanRefusal as hs, getCurrentNestedStackContext as ht, findLargeInlineResources as hu, PROTECTION_PROPERTY_BY_TYPE as i, applyRoleArnIfSet as ia, recordLogOnlyValue as ic, readTagList as ii, isReadableBag as il, inheritProducerRegions as in, malformedOrphanRowsKeptWarning as io, bold as ir, MULTI_REGION_RECREATE_BLOCKED_TYPES as is, NESTED_PENDING_PARENT_REASON as it, resolveCaptureObservedState as iu, deferredServiceTokenWarning as j, refStateLookupFromResource as ja, recordNoEchoAttributeValues as jc, deleteSkipReason as ji, buildDockerImage as jl, isWholeDynamicReferenceValue as jn, refuseMalformedResourceEntriesForOrphan as jo, secretNamePrintingBags as jr, TemplateParser as js, readRefactorMarkerOnce as jt, hasPlainPrototype$1 as ju, crossStackOutputProvenanceSource as k, isStalePlaceholderArnAttribute as ka, recordMaskOnlyValue as kc, deleteIndeterminateGuards as ki, validateContainerRepoName as kl, exportNameNoEchoParameters as kn, refuseMalformedResourceEntriesForImport as ko, orphanRecordsPrintingBag as kr, sameLambdaFunctionAddress as ks, withApiLimit as kt, defineOwnKey as ku, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as l, sendableAssumeRoleCommand as la, maskSecretsInError as lc, stringifyIfAssigned as li, PhaseClock as ll, updatePartialMessage as ln, malformedRenderedContainersWarning as lo, yellow as lr, coerceWarmThroughput as ls, nestedChildStackName as lt, stateBucketExistenceConfirmed as lu, resolveDynamoDbDeleteBudgetMs as m, classifyRecordedSecretRegion as ma, DYNAMIC_REFERENCE_TOKEN_SCAN as mc, wouldReturnToSdkProvider as mi, stringifyValue as ml, retiredAfterRollback as mn, malformedStateRefusalMessage as mo, removeSuperseded as mr, coerceCfnInteger as ms, collectNestedChildUnaddressed as mt, MIGRATE_TMP_PREFIX as mu, recordedProtectionEvidence as n, recordedOutputReferenceRegions as na, printingCorpusOf as nc, DBPROXY_TAG_OPTIONS as ni, importableOutputKeys as nl, findNestedStackTypeChanges as nn, malformedOrphanRecordsRefusalMessage as no, withStackRecords as nr, findReplacedReadersOfRecreateTargets as ns, keptForRetainedRecord as nt, resolveApp as nu, perType as o, assertSendableRoleArn as oa, unionOfSecretBags as oc, tagMapAsList as oi, orphansCarriedFrom as ol, isRedactedRecordedValue as on, malformedOrphansWarning as oo, gray as or, isStatefulRecreateTargetSync as os, displacedPhysicalIdShown as ot, resolveStateBucketWithDefault as ou, resolveDynamoDbDeleteBudgetClock as p, envCredentialsAreAssumedRole as pa, withoutPhysicalNameCopies as pc, isCustomResource as pi, isSensitiveAttributeName as pl, nameScopeOf as pn, malformedScrubResourceEntriesRefusalMessage as po, isSupersededResourceRecord as pr, coerceCfnBoolean as ps, withNestedRevertRun as pt, CFN_TEMPLATE_URL_LIMIT as pu, diffSecurity as q, hasReadableResources as qa, stackInstanceIdOf as qc, s3BucketDomainName as qi, runDockerStreaming as ql, withMovedTo as qn, unreadableOrphanRecords as qo, reserveStackCreateToken as qr, markSameGenerationBag as qs, isReplacementOrphan as qt, recordedProtectionNote as r, recordedReferenceRegions as ra, recordLogOnlyParameterValue as rc, planTagDiff as ri, importableOutputs as rl, getCurrentProducerRegions as rn, malformedOrphanRecordsWarning as ro, replacedDeleteFailureVerdict as rr, shownType as rs, recordRetainedForReadoption as rt, resolveAutoAssetStorage as ru, readProtection as s, explicitRoleArnOrThrow as sa, createSecretMasker as sc, tagPlanWarning as si, shouldRetainResource as sl, redactedDeleteAddressFields as sn, malformedOutputsRefusalMessage as so, green as sr, renderStatefulReason as ss, dropSettledNestedJournals as st, resolveStateBucketWithDefaultAndSource as su, DeployEngine as t, outputReferenceProvenanceOf as ta, logOnlyValueCount as tc, DBPROXY_TAGS_WHAT as ti, hasUnverifiableParameterRefusal as tl, orphanNeedsIdentity as tn, malformedLocalResourcesWarning as to, getStackRecords as tr, hasNoCloudControlHandlers as ts, resolvePendingCloudControlRequests as tt, loadCdkJson as tu, beginDeleteWait as u, AWS_CREDENTIAL_ENV_KEYS as ua, maskSecretsInText as uc, CC_BROKEN_REASON as ui, renderPhaseTimings as ul, updatePartialReason as un, malformedResourceEntriesWarning as uo, addSuperseded as ur, isWarmThroughputDecrease as us, recordDisplacedSkips as ut, warnDeprecatedNoPrefixCliFlag as uu, maskedLogger as v, coerceParameterTypedValue as va, spelledKeysOf as vc, isCustomResourceType as vi, loadPublishableAssetManifest as vl, computeParameterTaint as vn, refuseMalformedOrphanRecords as vo, supersededResourcesOf as vr, readConfigString as vs, dropFailedCommands as vt, decodeListingKey as vu, isTruthyCfnBoolean as w, carriesFetchableDynamicReference as wa, recordAttributeIdCopy as wc, CloudControlProvider as wi, getBootstrapMarkerKey as wl, exportAliasCollisionScrubWarning as wn, refuseMalformedOutputsForDestroy as wo, createReadOnlyAttributeHealerFactory as wr, templateResourceTypes as ws, sameJournaledOrphans as wt, StageLoadError as wu, ECR_AUTO_DELETE_IMAGES_TAG as x, getAccountInfo as xa, recordNestedStackParameterExpressions as xc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as xi, BOOTSTRAP_MARKER_PREFIX as xl, resourcesNamingDeclaredParameter as xn, refuseMalformedOrphansForDestroy as xo, noEchoComparisonForTemplate as xr, requireConfigObject as xs, journaledOrphanLines as xt, canonicalizeRegion as xu, relayedIndexBusyDelete as y, isUnboundTemplateParameter as ya, identityKeyFor as yc, getCurrentResourceSecrets as yi, rewriteTemplateAssetReferences as yl, namesAnyDeclaredParameter as yn, refuseMalformedOrphanRecordsForDestroy as yo, withoutSuperseded as yr, replayWarn as ys, dropFailedHint as yt, expectedOwnerParam as yu, templateIdentity as z, STATE_RESOURCES_MALFORMED as za, S3StateBackend as zc, reDisableInstanceApiTermination as zi, getDockerCmd as zl, maskingRetryLogger as zn, refuseMalformedState as zo, ccRoutedFinalSnapshotError as zr, noEchoLeavesOf as zs, pendingMovesRefusalMessage as zt, injectAwsRegion as zu };
|
|
52521
|
-
//# sourceMappingURL=deploy-engine-
|
|
53782
|
+
export { computeImplicitDeleteEdges as $, AWS_NO_VALUE as $a, recordAttributeIdCopy as $c, RollbackInlinePolicyWriters as $i, getBootstrapMarkerKey as $l, carriedExportAliasExposure as $n, refuseMalformedResourceEntriesForDeploy as $o, namingSecretsWithRecordedNoEcho as $r, blockDeviceMappingsDifferOnlyInDeleteOnTermination as $s, lookupEachName as $t, StageLoadError as $u, beginDeleteWait as A, applyRoleArnIfSet as Aa, logOnlyValueCount as Ac, refuseMalformedDesiredTags as Ai, hasUnverifiableParameterRefusal as Al, REDACTED_DELETE_ADDRESS_SKIP_REASON as An, malformedOrphanRowsKeptWarning as Ao, cyan as Ar, MULTI_REGION_RECREATE_BLOCKED_TYPES as As, displacedOpClause as At, loadCdkJson as Au, waitForIndexesSettled as B, classifyRecordedSecretRegion as Ba, scrubResourceRecord as Bc, waitForLambdaFunctionActive as Bi, timePhase as Bl, retiredNameGenerationsAfter as Bn, malformedStateRefusalMessage as Bo, supersededAfterRollback as Br, coerceCfnInteger as Bs, getCurrentNestedStackContext as Bt, ssmResolvedValueType as Bu, planContributorInsightsOp as C, resolveDynamicReferences as Ca, redactForState as Cc, extractDeploymentEventError as Ci, withStackInstanceIdWithheld as Cl, replacementNeverSwapped as Cn, malformedExportNamesWarning as Co, proposeRenames as Cr, findSilentDropProperties as Cs, makeSiblingClaimReader as Ct, warnFinchArgvExposure as Cu, reverseMapTableContributorInsights as D, outputReferenceProvenanceOf as Da, createUnionSecretMasker as Dc, DBPROXY_TAG_OPTIONS as Di, exportNamesCarriedFrom as Dl, findNestedStackTypeChanges as Dn, malformedLocalResourcesWarning as Do, withStackRecords as Dr, hasNoCloudControlHandlers as Ds, keptForRetainedRecord as Dt, synthesisStatusMessage as Du, reverseMapIndexContributorInsights as E, keepHeldTokenProvenance as Ea, carryLogOnlyValues as Ec, DBPROXY_TAGS_WHAT as Ei, describeRegionValueKind as El, orphanNeedsIdentity as En, malformedLocalResourceEntriesWarning as Eo, getStackRecords as Er, NO_CC_HANDLERS_REASON as Es, resolvePendingCloudControlRequests as Et, Synthesizer as Eu, DELETE_INDEX_WAIT_PROCEED_NOTE as F, sendableAssumeRoleCommand as Fa, unionOfSecretBags as Fc, CC_BROKEN_REASON as Fi, orphansCarriedFrom as Fl, updatePartialReason as Fn, malformedRenderedContainersWarning as Fo, addSuperseded as Fr, coerceWarmThroughput as Fs, recordDisplacedSkips as Ft, resolveStateBucketWithDefault as Fu, sendTtlWaitingOutRateLimit as G, isUnboundTemplateParameter as Ga, isUncertifiedBaselineMaskPosition as Gc, withPrintingSecrets as Gi, buildAssetRedirectMap as Gl, reachableDivergentParameters as Gn, refuseMalformedOrphanRecordsForDestroy as Go, noEchoAttributeNamesOf as Gr, replayWarn as Gs, isHandledOrphan as Gt, uploadCfnTemplate as Gu, isTtlRateLimited as H, producerRegionsFromState as Ha, withoutPhysicalNameCopies as Hc, readsNoEchoDeleteValues as Hi, isSensitiveAttributeName as Hl, withNameGenerationReached as Hn, refuseDivergentRecordRegionForDestroy as Ho, supersededHolderOf as Hr, configIntegerRefusal as Hs, deleteJournaledOrphans as Ht, CFN_TEMPLATE_URL_LIMIT as Hu, INDEX_SETTLE_POLL_INTERVAL_MS as I, AWS_CREDENTIAL_ENV_KEYS as Ia, createSecretMasker as Ic, ProviderRegistry as Ii, shouldRetainResource as Il, nameGenerationCarriedFrom as In, malformedResourceEntriesWarning as Io, deleteSupersededEntry as Ir, isWarmThroughputDecrease as Is, revertNestedChildFromJournal as It, resolveStateBucketWithDefaultAndSource as Iu, hasCdkAutoDeleteTag as J, isImpossibleEmptyStoredAttribute as Ja, identityKeyFor as Jc, customResourceResponseExpirationWarning as Ji, rewriteTemplateAssetReferences as Jl, displayTextOrWithheld as Jn, refuseMalformedOrphansForOrphan as Jo, noEchoParameterNamesOf as Jr, requireConfigString as Js, makeForeignHolderScan as Jt, expectedOwnerParam as Ju, ECR_AUTO_DELETE_IMAGES_TAG as K, parameterTypeMayLoseSecretIdentity as Ka, pathCrossesDottedKey as Kc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Ki, createAssetRedirectResolver as Kl, resourcesNamingDeclaredParameter as Kn, refuseMalformedOrphans as Ko, noEchoComparisonForTemplate as Kr, requireConfigArray as Ks, journaledOrphanLines as Kt, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Ku, deleteTableWithIndexBusyRetry as L, applyCallerIdentityCredentials as La, errorCauseChain as Lc, ccBrokenReason as Li, stackInstanceIdCarriedFrom as Ll, nameGenerationHighWaterOf as Ln, malformedResourcePropertiesWarning as Lo, holdsSupersededResources as Lr, toCfnInteger as Ls, revertedNestedRowIds as Lt, resolveUseCdkBootstrapAssets as Lu, deleteBudgetKey as M, assertSendableRoleArn as Ma, recordLogOnlyParameterValue as Mc, tagPlanWarning as Mi, importableOutputs as Ml, redactedDeleteAddressFields as Mn, malformedOrphansWarning as Mo, green as Mr, isStatefulRecreateTargetSync as Ms, dropSettledNestedJournals as Mt, resolveAutoAssetStorage as Mu, resolveDynamoDbDeleteBudgetClock as N, explicitRoleArnOrThrow as Na, recordLogOnlyValue as Nc, definedAttributes as Ni, isReadableBag as Nl, redactedDeleteAddressSkip as Nn, malformedOutputsRefusalMessage as No, red as Nr, renderStatefulReason as Ns, getNestedRevertRun as Nt, resolveCaptureObservedState as Nu, stripIndexContributorInsights as O, recordedOutputReferenceRegions as Oa, hasMaskableValues as Oc, planTagDiff as Oi, hasReadableExportSet as Ol, getCurrentProducerRegions as On, malformedOrphanRecordsRefusalMessage as Oo, replacedDeleteFailureVerdict as Or, findReplacedReadersOfRecreateTargets as Os, recordRetainedForReadoption as Ot, getDefaultStateBucketName as Ou, resolveDynamoDbDeleteBudgetMs as P, isIamRoleArn as Pa, shareLogOnlyValues as Pc, stringifyIfAssigned as Pi, orphansAfterRollback as Pl, updatePartialMessage as Pn, malformedOutputsWarning as Po, yellow as Pr, WARM_THROUGHPUT_MEMBERS as Ps, nestedChildStackName as Pt, resolveSkipPrefix as Pu, IMPLICIT_DELETE_DEPENDENCIES as Q, keepsSecretReferenceToken as Qa, physicalNameCopiesOf as Qc, unchangedBehindSecretReference as Qi, ensureAssetStorage as Ql, secretSafeKeyDisplay as Qn, refuseMalformedResourceEntries as Qo, maskEventTextWithBoundBags as Qr, withRetry as Qs, isAccessDeniedError as Qt, AssemblyReader as Qu, maskedLogger as R, callerEnvCredentials as Ra, maskSecretsInError as Rc, isCustomResource as Ri, PhaseClock as Rl, nameScopeOf as Rn, malformedResourcesWarning as Ro, isSupersededResourceRecord as Rr, toFiniteNumber as Rs, withNestedRevertRun as Rt, stateBucketExistenceConfirmed as Ru, indexDeclaresContributorInsights as S, s3BucketWebsiteUrl as Sa, markSameGenerationBag as Sc, DeploymentEventsStore as Si, stackInstanceIdOf as Sl, recordUnderIdIsNotOwn as Sn, malformedDriftResourcePropertiesWarning as So, parseMappingFile as Sr, findActionableSilentDrops as Ss, makeCanonicalizePropertiesFn as St, runDockerStreaming as Su, readContributorInsightsSpec as T, refuseUnreadableCdkCrossAccountRefs as Ta, snapshotPassProvenance as Tc, markDeleteStarted as Ti, acceptedCreateOnlyDropsOf as Tl, seedsDeleteFirstGuard as Tn, malformedLocalOutputsWarning as To, destroyStackRecordsView as Tr, withoutSilentDropProperties as Ts, pendingRequestCount as Tt, getDockerImageBySourceHash as Tu, planTimeToLive as U, regionLessSecretName as Ua, DYNAMIC_REFERENCE_TOKEN_SCAN as Uc, isCustomResourceType as Ui, stringifyValue as Ul, computeParameterTaint as Un, refuseMalformedNestedChildOutputs as Uo, supersededResourcesOf as Ur, configStringRefusal as Us, dropFailedCommands as Ut, MIGRATE_TMP_PREFIX as Uu, isTtlAlreadyDisabled as V, classifyReplaySecretRegion as Va, withPhysicalNameCopies as Vc, TemplateNoEchoReresolver as Vi, AssetPublisher as Vl, retiredNameGenerationsLeaving as Vn, previewableOrphanRecords as Vo, supersededHeldByOtherTypeWarning as Vr, configBooleanRefusal as Vs, withNestedStackContext as Vt, CFN_TEMPLATE_BODY_LIMIT as Vu, readTtlSpec as W, coerceParameterTypedValue as Wa, dynamicReferenceTokens as Wc, getCurrentResourceSecrets as Wi, WorkGraph as Wl, namesAnyDeclaredParameter as Wn, refuseMalformedOrphanRecords as Wo, withoutSuperseded as Wr, readConfigString as Ws, dropFailedHint as Wt, findLargeInlineResources as Wu, getPriorAttempts as X, carriesFetchableDynamicReference as Xa, recordNestedStackParameterExpressions as Xc, slowCcOperationTimeoutMs as Xi, BOOTSTRAP_MARKER_PREFIX as Xl, secretBearing as Xn, refuseMalformedOutputsForDestroy as Xo, completedReplayEntries as Xr, templateResourceTypes as Xs, formatResourceLine as Xt, canonicalizeRegion as Xu, isTruthyCfnBoolean as Y, carriesDynamicReference as Ya, inheritNestedStackParameterAssociations as Yc, CloudControlProvider as Yi, AssetModeResolver as Yl, exportAliasCollisionScrubWarning as Yn, refuseMalformedOutputs as Yo, createReadOnlyAttributeHealerFactory as Yr, prefetchCreateOnlyPropertyPaths as Ys, sameJournaledOrphans as Yt, PARTITION_TABLE as Yu, markRefusedBeforeApplying as Z, isNamelessDynamicReferenceError as Za, recoverMaskedOutput as Zc, onlySecretReferencesDiffer as Zi, assertAssetBucketRegion as Zl, secretBearingStateKeyWarning as Zn, refuseMalformedResourceAttributesForOrphan as Zo, journaledOrphanPrintingBag as Zr, describeTypeWithThrottleRetry as Zs, chunks as Zt, derivePartitionAndUrlSuffix as Zu, streamMemberRefusals as _, isSettledInstanceState as _a, readbackPathFor as _c, resolveBucketRegion as _d, ledgerForStack as _i, CrossPrefixScanCache as _l, isJournaledOrphan as _n, hasReadableOrphans as _o, rollbackOrphanIds as _r, repairMalformedResourcesForReadOnly as _s, withResourceDeadline as _t, partitionSensitiveEnv as _u, isProtectionValueActive as a, isWaitAbandonedError as aa, DagBuilder as ac, hasOwnKey as ad, stateSecretNameNeedles as ai, recordMaskOnlyValuesIn as al, refuseRefactorMarker as an, withSharedDrainBudget as ao, collectPublishedOutputNames as ar, refuseMalformedResourcePropertiesForDrift as as, childTemplateLoader as at, buildDenyExternalAccessPolicy as au, CONTRIBUTOR_INSIGHTS_KEY as b, s3BucketDualStackDomainName as ba, valueAtCoordinate as bc, acquireIdempotencyToken as bi, isAccessDenied$1 as bl, planRollback as bn, isReadableOrphanRecord as bo, looselyEqual as br, unreadableResourceEntries as bs, keptWholeReasonText as bt, redactedDockerCause as bu, DynamoDBGlobalTableProvider as c, ec2InstanceProtectionSite as ca, isMarkedCoordinate as cc, ownValue as cd, PRE_DELETE_SNAPSHOT_TYPES as ci, recordProvenPublicExpression as cl, hasPendingMovesOut as cn, declaresNoEcho as co, DEFAULT_RESOURCE_TIMEOUT_MS as cr, refuseMalformedResourcesForDeploy as cs, listNestedTemplateRows as ct, describeDockerCapturedOutput as cu, declaredStreamPolicyMember as d, reDisableInstanceApiTermination as da, maskWholeValue as dc, displayAssemblyPath as dd, createPreDeleteFinalSnapshot as di, isSingleDynamicReferenceToken as dl, refusePendingMovesOut as dn, STATE_RESOURCES_MALFORMED as do, constructPathOf as dr, refuseMalformedState as ds, conditionFingerprint as dt, dockerSpawnEnvWithSensitive as du, UNSPECIFIED_SKIP_REASON as ea, ecsServiceLaunchTypeSetOrChanged as ec, processStackMessages as ed, orphanRecordsPrintingBag as ei, recordPhysicalNameCopy as el, withApiLimit as en, cfnRefValueFromPhysicalId as eo, exportNameNoEchoParameters as er, refuseMalformedResourceEntriesForDestroy as es, crossStackOutputProvenanceSource as et, isCrossRegionRedirect as eu, declaredStreamTagsMember as f, reEnableInstanceApiTermination as fa, maskedLeafCoordinatesOf as fc, renderAssemblyPathEscape as fd, effectiveDeletionPolicy as fi, LockManager as fl, replayFailedOperations as fn, UNREADABLE_ORPHANS_CONTAINER_ROW as fo, findDestructiveChanges as fr, repairMalformedOrphanRecordsForReadOnly as fs, conditionInputsFrom as ft, finchSecretArgvRefusal as fu, streamDeclaresTags as g, poisonRenderedSpellingsCollidingIn as ga, passedNoEchoParametersOf as gc, clearBucketRegionCache as gd, earliestDefined as gi, CrossPrefixReadError as gl, demoteSupersededOrphans as gn, displayLogicalId as go, movedToHint as gr, repairMalformedResourcePropertiesForReadOnly as gs, enclosingDeadlineRemainingMs as gt, isMalformedEnvKey as gu, streamDeclaresPolicy as h, IntrinsicFunctionResolver as ha, noEchoOutputsComparison as hc, injectedAwsRegionValue as hd, unsupportedFinalSnapshotError as hi, rebuildClientForBucketRegion as hl, recordAfterRollbackUpdate as hn, deployRefusesOrphanRowsReason as ho, hintSidesOf as hr, repairMalformedResourceEntriesForReadOnly as hs, enclosingDeadlineExpired as ht, isDockerClientEnvKey as hu, PROTECTION_PROPERTY_BY_TYPE as i, withIndeterminateGuard as ia, sameLambdaFunctionAddress as ic, defineOwnKey as id, secretNamedRecordNeedles as ii, recordMaskOnlyValue as il, refactorMarkerRefusalMessage as in, parseWebACLArn as io, collectDeclaredOutputNames as ir, refuseMalformedResourcePropertiesForDestroy as is, serviceTokenBlockingReason as it, validateContainerRepoName as iu, compensateRemovedDeletionProtection as j, assertFlagRoleArn as ja, printingCorpusOf as jc, tagMapAsList as ji, importableOutputKeys as jl, isRedactedRecordedValue as jn, malformedOrphansRefusalMessage as jo, gray as jr, isStatefulRecreateTargetForReplace as js, displacedPhysicalIdShown as jt, resolveApp as ju, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as k, recordedReferenceRegions as ka, literalSplitDelimitersOf as kc, readTagList as ki, hasReasonlessBaselineRefusal as kl, inheritProducerRegions as kn, malformedOrphanRecordsWarning as ko, bold as kr, shownType as ks, NESTED_PENDING_PARENT_REASON as kt, getLegacyStateBucketName as ku, STREAM_POLICY_KEY as l, isTerminationProtectionPropagationError as la, maskAtCoordinates as lc, absoluteAssemblyPathEscape as ld, buildFinalSnapshotIdentifier as li, wholeStringLeavesOf as ll, pendingMovesOutOf as ln, JSON_LISTING_HOLE_VALUE as lo, DEFAULT_RESOURCE_WARN_AFTER_MS as lr, refuseMalformedResourcesForDestroy as ls, renderNestedTemplateTreeDefect as lt, describeDockerExecFailure as lu, reverseMapStreamPolicy as m, INTRINSIC_KEYS as ma, noEchoLeavesOf as mc, injectAwsRegion as md, refusesFinalSnapshot as mi, S3StateBackend as ml, removeProtectionTypeList as mn, accountArgs as mo, findRefactorHints as mr, repairMalformedOutputsForReadOnly as ms, readRecordedConditionVerdicts as mt, getDockerCmd as mu, recordedProtectionEvidence as n, deleteLeftInPlace as na, canonicalLambdaFunctionName as nc, parseFailureDebugDetail as nd, secretNamePrintingBags as ni, carriesSecretMask as nl, readRefactorMarkerOnce as nn, lacksRecordedTableArn as no, isWholeDynamicReferenceValue as nr, refuseMalformedResourceEntriesForImportSave as ns, deferredServiceTokenWarning as nt, readBootstrapMarkerBody as nu, perType as o, markWaitAbandoned as oa, TemplateParser as oc, hasPlainPrototype$1 as od, storedSecretNameNeedles as oi, recordNoEchoAttributeValues as ol, sameMove as on, parameterInputsFor as oo, isExportAliasCollision as or, refuseMalformedResourcePropertiesForExport as os, findNestedTemplateTreeDefect as ot, buildDockerImage as ou, planStreamMemberOps as p, DiffCalculator as pa, noEchoCoordinatesOf as pc, resolveAssemblyPath as pd, isFinalSnapshotError as pi, isLockInfoExpired as pl, replayRollback as pn, UNREADABLE_RESOURCES_MAP_ROW as po, formatDestructiveChange as pr, repairMalformedOrphansForReadOnly as ps, parentSuppliedValues as pt, formatDockerLoginError as pu, S3_AUTO_DELETE_OBJECTS_TAG as q, getAccountInfo as qa, spelledKeysOf as qc, applyCustomResourceResponseExpiration as qi, loadPublishableAssetManifest as ql, WITHHELD_NAME_DISPLAY as qn, refuseMalformedOrphansForDestroy as qo, noEchoExactEchoLeavesOf as qr, requireConfigObject as qs, loadJournaledOrphans as qt, decodeListingKey as qu, recordedProtectionNote as r, deleteSkipReason as ra, lambdaFunctionNameForMask as rc, utf8ByteLength as rd, secretNamedAttributeNamesOf as ri, provenPublicValue as rl, refactorMarkerMovesOf as rn, refStateLookupFromResource as ro, noEchoParameterValueSeed as rr, refuseMalformedResourceEntriesForOrphan as rs, findServiceTokenRefusals as rt, validateAssetBucketName as ru, readProtection as s, disableInstanceApiTermination as sa, canonicalCoordinates as sc, nullPrototypeRecord as sd, ATOMIC_FINAL_SNAPSHOT_TYPES as si, recordNoEchoParameterFreshValue as sl, updateRefactorMarker as sn, passedParameterClassesOf as so, bindingSkippedOutputs as sr, refuseMalformedResourcePropertiesForOrphan as ss, isAbsoluteAssetPath as st, resolveDockerContextDirectory as su, DeployEngine as t, deleteIndeterminateGuards as ta, emrClusterInstancesReplaced as tc, describeJsonParseFailure as td, secretNamePrintingBag as ti, splitGetAttStringForm as tl, readRefactorMarker as tn, isStalePlaceholderArnAttribute as to, exportNameSecretExposure as tr, refuseMalformedResourceEntriesForImport as ts, inheritedProvenanceForChildDiff as tt, parseBootstrapMarker as tu, STREAM_TAGS_KEY as u, observeThenDisableInstanceApiTermination as ua, maskReadbackAtCoordinates as uc, describeFileReadFailure as ud, ccRoutedFinalSnapshotError as ui, WHOLE_DYNAMIC_REFERENCE_PATTERN as ul, pendingMovesRefusalMessage as un, STATE_REGION_DIVERGED as uo, maskingRetryLogger as ur, refuseMalformedResourcesForExport as us, templateIdentity as ut, describeDockerFailure as uu, streamPolicyMatchesDeclared as v, s3BucketArn as va, readsNoEchoSource as vc, reserveStackCreateToken as vi, applyCrossPrefixScan as vl, isReplacementOrphan as vn, hasReadableOutputs as vo, withMovedTo as vr, unpreviewableOrphanRecords as vs, diffSecurity as vt, redactDockerArgvValues as vu, planIndexContributorInsightsOps as w, producerLookupOver as wa, recordReferenceProvenanceEntry as wc, isRefusedByName as wi, splitImportedOps as wl, resolveReplacementOldType as wn, malformedExportSourceWarning as wo, awaitInFlightSibling as wr, unwrittenCreateOnlyReplacement as ws, planOrphanAdoption as wt, AssetManifestLoader as wu, contributorInsightsRefusals as x, s3BucketRegionalDomainName as xa, liveMatchesUnresolvedTokenFrame as xc, DeploymentEventsReader as xi, isNotImplemented as xl, recheckFailedPlan as xn, isReadableResourceEntry as xo, mappingPairs as xr, withheldAccountClause as xs, mergeNoChangeOutputs as xt, runDockerForeground as xu, streamTagsMatchDeclared as y, s3BucketDomainName as ya, recordedNoEchoValuesOf as yc, withCreateTokenLedger as yi, crossPrefixDeniedWarning as yl, planFailedOps as yn, hasReadableResources as yo, isPairableType as yr, unreadableOrphanRecords as ys, isSecretBearingReferenceString as yt, redactedCause as yu, relayedIndexBusyDelete as z, envCredentialsAreAssumedRole as za, maskSecretsInText as zc, wouldReturnToSdkProvider as zi, renderPhaseTimings as zl, retiredAfterRollback as zn, malformedScrubResourceEntriesRefusalMessage as zo, removeSuperseded as zr, coerceCfnBoolean as zs, collectNestedChildUnaddressed as zt, warnDeprecatedNoPrefixCliFlag as zu };
|
|
53783
|
+
//# sourceMappingURL=deploy-engine-CDjAtIrn.js.map
|