@go-to-k/cdkd 0.308.1 → 0.310.0
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-B7pAjRIc.js → asg-provider-I1bFHVsO.js} +2 -2
- package/dist/{asg-provider-B7pAjRIc.js.map → asg-provider-I1bFHVsO.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-CDjAtIrn.js → deploy-engine-DZO2SOQJ.js} +1238 -248
- package/dist/deploy-engine-DZO2SOQJ.js.map +1 -0
- package/dist/iam-policy-targets-D94wh05t.js.map +1 -1
- package/dist/{iam-role-provider-DbtvFel_.js → iam-role-provider-BWw7I-SZ.js} +2 -2
- package/dist/{iam-role-provider-DbtvFel_.js.map → iam-role-provider-BWw7I-SZ.js.map} +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/{neptune-provider-Y3Ii8oYI.js → neptune-provider-8kjFmR1l.js} +2 -2
- package/dist/{neptune-provider-Y3Ii8oYI.js.map → neptune-provider-8kjFmR1l.js.map} +1 -1
- package/dist/{program-Ymf7svYk.js → program-CS420Kx9.js} +101 -257
- package/dist/program-CS420Kx9.js.map +1 -0
- package/dist/{provider-classes-BxfIHcea.js → provider-classes-KsrvwO_r.js} +942 -166
- package/dist/provider-classes-KsrvwO_r.js.map +1 -0
- package/dist/{rds-provider-CZhBLQgJ.js → rds-provider-BqwTQeS-.js} +27 -13
- package/dist/rds-provider-BqwTQeS-.js.map +1 -0
- package/dist/{version-BWqrjGBS.js → version-QOtLxcEo.js} +2 -2
- package/dist/{version-BWqrjGBS.js.map → version-QOtLxcEo.js.map} +1 -1
- package/package.json +9 -10
- package/dist/deploy-engine-CDjAtIrn.js.map +0 -1
- package/dist/program-Ymf7svYk.js.map +0 -1
- package/dist/provider-classes-BxfIHcea.js.map +0 -1
- package/dist/rds-provider-CZhBLQgJ.js.map +0 -1
|
@@ -2,7 +2,7 @@ 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
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-QOtLxcEo.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";
|
|
@@ -4986,7 +4986,8 @@ const STATE_SCHEMA_VERSIONS_READABLE = [
|
|
|
4986
4986
|
10,
|
|
4987
4987
|
11,
|
|
4988
4988
|
12,
|
|
4989
|
-
13
|
|
4989
|
+
13,
|
|
4990
|
+
14
|
|
4990
4991
|
];
|
|
4991
4992
|
function hasUnverifiableParameterRefusal(record) {
|
|
4992
4993
|
return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
|
|
@@ -6046,7 +6047,7 @@ var S3StateBackend = class S3StateBackend {
|
|
|
6046
6047
|
const body = {
|
|
6047
6048
|
...state,
|
|
6048
6049
|
...stackInstanceIdCarriedFrom(state),
|
|
6049
|
-
version:
|
|
6050
|
+
version: 14,
|
|
6050
6051
|
stackName,
|
|
6051
6052
|
region
|
|
6052
6053
|
};
|
|
@@ -7845,7 +7846,7 @@ const WHOLE_DYNAMIC_REFERENCE_PATTERN = new RegExp(`^\\{\\{resolve:${DYNAMIC_REF
|
|
|
7845
7846
|
function isSingleDynamicReferenceToken(value) {
|
|
7846
7847
|
return WHOLE_DYNAMIC_REFERENCE_PATTERN.test(value);
|
|
7847
7848
|
}
|
|
7848
|
-
function isPlainObject$
|
|
7849
|
+
function isPlainObject$11(value) {
|
|
7849
7850
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7850
7851
|
}
|
|
7851
7852
|
|
|
@@ -8101,7 +8102,7 @@ function crossStackSourceKey(source) {
|
|
|
8101
8102
|
}
|
|
8102
8103
|
if (key === "Fn::GetStackOutput") {
|
|
8103
8104
|
const args = source[key];
|
|
8104
|
-
if (!isPlainObject$
|
|
8105
|
+
if (!isPlainObject$11(args)) return void 0;
|
|
8105
8106
|
const stackName = Object.hasOwn(args, "StackName") ? literalStringOrUndefined(args["StackName"]) : void 0;
|
|
8106
8107
|
const outputName = Object.hasOwn(args, "OutputName") ? literalStringOrUndefined(args["OutputName"]) : void 0;
|
|
8107
8108
|
if (stackName === void 0 || outputName === void 0) return void 0;
|
|
@@ -8147,7 +8148,7 @@ function crossStackSourceKey(source) {
|
|
|
8147
8148
|
let template;
|
|
8148
8149
|
let variables;
|
|
8149
8150
|
if (typeof raw === "string") template = raw;
|
|
8150
|
-
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$
|
|
8151
|
+
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$11(raw[1])) {
|
|
8151
8152
|
if (typeof raw[0] !== "string") return void 0;
|
|
8152
8153
|
template = raw[0];
|
|
8153
8154
|
variables = raw[1];
|
|
@@ -8441,12 +8442,12 @@ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
|
|
|
8441
8442
|
function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, provenance = "template-derived") {
|
|
8442
8443
|
if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
|
|
8443
8444
|
if (secrets.size === 0) return;
|
|
8444
|
-
if (!isPlainObject$
|
|
8445
|
+
if (!isPlainObject$11(resolvedProperties) || !isPlainObject$11(sourceProperties)) return;
|
|
8445
8446
|
if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
|
|
8446
8447
|
if (!Object.hasOwn(sourceProperties, "Parameters")) return;
|
|
8447
8448
|
const resolvedParameters = resolvedProperties["Parameters"];
|
|
8448
8449
|
const sourceParameters = sourceProperties["Parameters"];
|
|
8449
|
-
if (!isPlainObject$
|
|
8450
|
+
if (!isPlainObject$11(resolvedParameters) || !isPlainObject$11(sourceParameters)) return;
|
|
8450
8451
|
const positioned = redactAtProvenance({ ...resolvedParameters }, secrets, sourceParameters, provenance, true);
|
|
8451
8452
|
let table = nestedStackParameterExpressions.get(secrets);
|
|
8452
8453
|
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
@@ -8495,7 +8496,7 @@ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedPr
|
|
|
8495
8496
|
if (typeof resolvedValue !== "string") return void 0;
|
|
8496
8497
|
const sourceLeaf = sourceParameters[name];
|
|
8497
8498
|
if (typeof sourceLeaf === "string") return sourceLeaf;
|
|
8498
|
-
if (!isPlainObject$
|
|
8499
|
+
if (!isPlainObject$11(sourceLeaf)) return void 0;
|
|
8499
8500
|
const written = positioned[name];
|
|
8500
8501
|
if (typeof written !== "string") return void 0;
|
|
8501
8502
|
const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
|
|
@@ -8832,7 +8833,7 @@ function evaluatePureRead(node, bind, pseudo, split, choose, depth = 0) {
|
|
|
8832
8833
|
}
|
|
8833
8834
|
return { value: out };
|
|
8834
8835
|
}
|
|
8835
|
-
if (!isPlainObject$
|
|
8836
|
+
if (!isPlainObject$11(node)) return void 0;
|
|
8836
8837
|
const keys = Object.keys(node);
|
|
8837
8838
|
if (keys.length !== 1) return void 0;
|
|
8838
8839
|
const key = keys[0];
|
|
@@ -8873,7 +8874,7 @@ function evaluatePureRead(node, bind, pseudo, split, choose, depth = 0) {
|
|
|
8873
8874
|
}
|
|
8874
8875
|
function evaluatePureSub(args, bind, pseudo, evaluate) {
|
|
8875
8876
|
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$
|
|
8877
|
+
if (typeof text !== "string" || text.includes("{{resolve:") || !isPlainObject$11(variables)) return;
|
|
8877
8878
|
const bound = /* @__PURE__ */ new Map();
|
|
8878
8879
|
for (const [name, variable] of Object.entries(variables)) {
|
|
8879
8880
|
const evaluated = evaluate(variable);
|
|
@@ -8906,7 +8907,7 @@ function bindReadName(name, bind, pseudo) {
|
|
|
8906
8907
|
function collectRereadConditions(node, names, depth = 0) {
|
|
8907
8908
|
if (depth > MAX_REREAD_DEPTH) return false;
|
|
8908
8909
|
if (Array.isArray(node)) return node.every((element) => collectRereadConditions(element, names, depth + 1));
|
|
8909
|
-
if (!isPlainObject$
|
|
8910
|
+
if (!isPlainObject$11(node)) return true;
|
|
8910
8911
|
if (Object.hasOwn(node, "Fn::If")) {
|
|
8911
8912
|
const args = node["Fn::If"];
|
|
8912
8913
|
if (!Array.isArray(args) || typeof args[0] !== "string") return false;
|
|
@@ -8917,7 +8918,7 @@ function collectRereadConditions(node, names, depth = 0) {
|
|
|
8917
8918
|
function holdsRereadTrigger(node, depth = 0) {
|
|
8918
8919
|
if (depth > MAX_REREAD_DEPTH) return false;
|
|
8919
8920
|
if (Array.isArray(node)) return node.some((element) => holdsRereadTrigger(element, depth + 1));
|
|
8920
|
-
if (!isPlainObject$
|
|
8921
|
+
if (!isPlainObject$11(node)) return false;
|
|
8921
8922
|
return Object.entries(node).some(([key, child]) => REREAD_TRIGGERS.has(key) || holdsRereadTrigger(child, depth + 1));
|
|
8922
8923
|
}
|
|
8923
8924
|
function rendersReadTo(spelling, parentSecrets, value) {
|
|
@@ -8960,7 +8961,7 @@ function namesParameterOnBranches(node, choose, isParameter, depth = 0) {
|
|
|
8960
8961
|
if (depth > MAX_REREAD_DEPTH) return true;
|
|
8961
8962
|
if (typeof node === "string") return node.includes("{{resolve:");
|
|
8962
8963
|
if (Array.isArray(node)) return node.some((element) => namesParameterOnBranches(element, choose, isParameter, depth + 1));
|
|
8963
|
-
if (!isPlainObject$
|
|
8964
|
+
if (!isPlainObject$11(node)) return false;
|
|
8964
8965
|
if (Object.hasOwn(node, "Fn::If")) {
|
|
8965
8966
|
const args = node["Fn::If"];
|
|
8966
8967
|
if (Object.keys(node).length !== 1) return true;
|
|
@@ -9073,7 +9074,7 @@ function appendValuePlaceholderParts(value, out, budget, depth) {
|
|
|
9073
9074
|
if (budget.exhausted) return;
|
|
9074
9075
|
const literal = joinPartLiteralText(value);
|
|
9075
9076
|
if (literal !== void 0) return pushPlaceholderPart(out, literal, budget);
|
|
9076
|
-
if (isPlainObject$
|
|
9077
|
+
if (isPlainObject$11(value) && Object.keys(value).length === 1) {
|
|
9077
9078
|
const ref = value["Ref"];
|
|
9078
9079
|
if (typeof ref === "string" && ref !== "") return pushPlaceholderPart(out, keyedPart({ Ref: ref }), budget);
|
|
9079
9080
|
if (depth >= MAX_PLACEHOLDER_DEPTH) {
|
|
@@ -9105,7 +9106,7 @@ function appendParameterPlaceholderParts(source, out, budget, depth) {
|
|
|
9105
9106
|
let template;
|
|
9106
9107
|
let variables = {};
|
|
9107
9108
|
if (typeof args === "string") template = args;
|
|
9108
|
-
else if (Array.isArray(args) && args.length === 2 && isPlainObject$
|
|
9109
|
+
else if (Array.isArray(args) && args.length === 2 && isPlainObject$11(args[1])) {
|
|
9109
9110
|
template = args[0];
|
|
9110
9111
|
variables = args[1];
|
|
9111
9112
|
} else return false;
|
|
@@ -9268,7 +9269,7 @@ function isUniquelyKeyedBy(items, key) {
|
|
|
9268
9269
|
if (items.length === 0) return false;
|
|
9269
9270
|
const seen = /* @__PURE__ */ new Set();
|
|
9270
9271
|
for (const item of items) {
|
|
9271
|
-
if (!isPlainObject$
|
|
9272
|
+
if (!isPlainObject$11(item) || !Object.hasOwn(item, key)) return false;
|
|
9272
9273
|
const id = item[key];
|
|
9273
9274
|
if (typeof id !== "string" || id === "") return false;
|
|
9274
9275
|
if (seen.has(id)) return false;
|
|
@@ -9296,7 +9297,7 @@ const NEVER_DROPPING_INTRINSICS = /* @__PURE__ */ new Set([
|
|
|
9296
9297
|
]);
|
|
9297
9298
|
function arrayElementDrop(element, depth = 0) {
|
|
9298
9299
|
if (depth > 16) return "unknown";
|
|
9299
|
-
if (!isPlainObject$
|
|
9300
|
+
if (!isPlainObject$11(element)) return "never";
|
|
9300
9301
|
if (Object.hasOwn(element, "Ref")) return element["Ref"] === "AWS::NoValue" ? "always" : "never";
|
|
9301
9302
|
const keys = Object.keys(element);
|
|
9302
9303
|
if (keys.filter((key) => key.startsWith("Fn::") || key === "Condition").length === 0) return "never";
|
|
@@ -9332,7 +9333,7 @@ function keptLiteralsCorroborate(kept, bag, secrets) {
|
|
|
9332
9333
|
return kept.every((element, i) => keptElementCorroborates(element, bag[i], secrets));
|
|
9333
9334
|
}
|
|
9334
9335
|
function isIntrinsicNode(value) {
|
|
9335
|
-
if (!isPlainObject$
|
|
9336
|
+
if (!isPlainObject$11(value)) return false;
|
|
9336
9337
|
const keys = Object.keys(value);
|
|
9337
9338
|
return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
|
|
9338
9339
|
}
|
|
@@ -9345,7 +9346,7 @@ function keptElementCorroborates(source, bag, secrets, depth = 0) {
|
|
|
9345
9346
|
if (source === null || typeof source !== "object") return source === bag;
|
|
9346
9347
|
if (isIntrinsicNode(source)) return true;
|
|
9347
9348
|
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$
|
|
9349
|
+
if (!isPlainObject$11(source) || !isPlainObject$11(bag)) return false;
|
|
9349
9350
|
if (Object.keys(bag).some((key) => !Object.hasOwn(source, key))) return false;
|
|
9350
9351
|
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
9352
|
}
|
|
@@ -9355,12 +9356,12 @@ function corroboratesWhateverResolves(source, depth = 0) {
|
|
|
9355
9356
|
if (source === null || typeof source !== "object") return true;
|
|
9356
9357
|
if (isIntrinsicNode(source)) return true;
|
|
9357
9358
|
if (Array.isArray(source)) return source.every((element) => arrayElementDrop(element) === "never" && corroboratesWhateverResolves(element, depth + 1));
|
|
9358
|
-
if (!isPlainObject$
|
|
9359
|
+
if (!isPlainObject$11(source)) return false;
|
|
9359
9360
|
if (Object.keys(source).some((key) => key === "Ref" || key.startsWith("Fn::"))) return false;
|
|
9360
9361
|
return Object.values(source).every((value) => arrayElementDrop(value) !== "unknown" && corroboratesWhateverResolves(value, depth + 1));
|
|
9361
9362
|
}
|
|
9362
9363
|
function arrayPairsWhateverDrops(source) {
|
|
9363
|
-
if (!source.some((element) => isPlainObject$
|
|
9364
|
+
if (!source.some((element) => isPlainObject$11(element) && (Object.hasOwn(element, "Fn::If") || element["Ref"] === "AWS::NoValue" || Array.isArray(element["Fn::FindInMap"]) && element["Fn::FindInMap"].length > 3))) return true;
|
|
9364
9365
|
return source.every((element) => corroboratesWhateverResolves(element));
|
|
9365
9366
|
}
|
|
9366
9367
|
function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
|
|
@@ -9377,13 +9378,13 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9377
9378
|
}
|
|
9378
9379
|
return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
|
|
9379
9380
|
}
|
|
9380
|
-
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$
|
|
9381
|
+
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$11(source)) {
|
|
9381
9382
|
const inherited = positionByInheritedParameter(bag, source, secrets);
|
|
9382
9383
|
if (inherited !== void 0) return inherited;
|
|
9383
9384
|
const reread = positionByParameterReread(bag, source, secrets);
|
|
9384
9385
|
if (reread !== void 0) return reread;
|
|
9385
9386
|
}
|
|
9386
|
-
if (typeof bag === "string" && isPlainObject$
|
|
9387
|
+
if (typeof bag === "string" && isPlainObject$11(source)) {
|
|
9387
9388
|
const certified = positionByCrossStackSource(bag, source, secrets);
|
|
9388
9389
|
if (certified !== void 0) return certified;
|
|
9389
9390
|
const placeheld = positionByParameterPlaceholders(bag, source, secrets);
|
|
@@ -9393,7 +9394,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9393
9394
|
const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
|
|
9394
9395
|
if (framed !== void 0) return framed;
|
|
9395
9396
|
}
|
|
9396
|
-
if (Array.isArray(bag) && isPlainObject$
|
|
9397
|
+
if (Array.isArray(bag) && isPlainObject$11(source)) {
|
|
9397
9398
|
const positionedList = positionListByCrossStackSource(bag, source, secrets);
|
|
9398
9399
|
if (positionedList !== void 0) return positionedList;
|
|
9399
9400
|
}
|
|
@@ -9428,7 +9429,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
9428
9429
|
if (kept !== void 0 && keptLiteralsCorroborate(kept, bag, secrets)) return bag.map((item, i) => redactByPath(item, kept[i], secrets, rules, secretExpressions, bagIsSameGeneration));
|
|
9429
9430
|
}
|
|
9430
9431
|
}
|
|
9431
|
-
if (isPlainObject$
|
|
9432
|
+
if (isPlainObject$11(bag) && hasPlainPrototype(bag) && isPlainObject$11(source)) {
|
|
9432
9433
|
const out = Object.create(null);
|
|
9433
9434
|
for (const [k, v] of Object.entries(bag)) {
|
|
9434
9435
|
out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactForState(v, {
|
|
@@ -9450,7 +9451,7 @@ function isReadbackProjectedFromState(rules) {
|
|
|
9450
9451
|
function subtreeHasDynamicReference(value) {
|
|
9451
9452
|
if (isDynamicReferenceString(value)) return true;
|
|
9452
9453
|
if (Array.isArray(value)) return value.some(subtreeHasDynamicReference);
|
|
9453
|
-
if (isPlainObject$
|
|
9454
|
+
if (isPlainObject$11(value)) return Object.values(value).some(subtreeHasDynamicReference);
|
|
9454
9455
|
return false;
|
|
9455
9456
|
}
|
|
9456
9457
|
function pathCrossesDottedKey(bag, path) {
|
|
@@ -9487,7 +9488,7 @@ function nameScalarSecrets(value, secrets) {
|
|
|
9487
9488
|
return secrets.has(String(node)) || byValue.has(node) ? "***" : node;
|
|
9488
9489
|
}
|
|
9489
9490
|
if (Array.isArray(node)) return node.map(walk);
|
|
9490
|
-
if (isPlainObject$
|
|
9491
|
+
if (isPlainObject$11(node) && hasPlainPrototype(node)) {
|
|
9491
9492
|
const out = Object.create(null);
|
|
9492
9493
|
for (const [k, v] of Object.entries(node)) out[k] = walk(v);
|
|
9493
9494
|
return out;
|
|
@@ -9504,13 +9505,13 @@ function substitutionIsSecret(value) {
|
|
|
9504
9505
|
function sentinelDefinitionOf(source) {
|
|
9505
9506
|
const subs = source["DefinitionSubstitutions"];
|
|
9506
9507
|
const values = /* @__PURE__ */ new Map();
|
|
9507
|
-
if (isPlainObject$
|
|
9508
|
+
if (isPlainObject$11(subs)) {
|
|
9508
9509
|
for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") values.set(name, String(value));
|
|
9509
9510
|
}
|
|
9510
9511
|
for (const key of ["DefinitionString", "Definition"]) {
|
|
9511
9512
|
if (!Object.hasOwn(source, key)) continue;
|
|
9512
9513
|
const raw = source[key];
|
|
9513
|
-
const body = typeof raw === "string" ? raw : isPlainObject$
|
|
9514
|
+
const body = typeof raw === "string" ? raw : isPlainObject$11(raw) ? JSON.stringify(raw) : void 0;
|
|
9514
9515
|
if (body === void 0) continue;
|
|
9515
9516
|
if (body.includes(SENTINEL_IN_STRING) || body.includes(SENTINEL_OUT_OF_STRING) || /\\u[eE]00[01]/.test(body)) continue;
|
|
9516
9517
|
const names = [];
|
|
@@ -9581,7 +9582,7 @@ function sentinelDefinitionOf(source) {
|
|
|
9581
9582
|
node.forEach((item, i) => walk(item, [...path, i], [...shapes, node.length]));
|
|
9582
9583
|
return;
|
|
9583
9584
|
}
|
|
9584
|
-
if (isPlainObject$
|
|
9585
|
+
if (isPlainObject$11(node)) {
|
|
9585
9586
|
const own = new Set(Object.keys(node).map(written));
|
|
9586
9587
|
for (const [k, v] of Object.entries(node)) {
|
|
9587
9588
|
if (!marked(k)) keys.add(k);
|
|
@@ -9609,7 +9610,7 @@ function alignedSecretLeaf(root, leaf) {
|
|
|
9609
9610
|
if (!Array.isArray(cursor) || cursor.length !== shape) return void 0;
|
|
9610
9611
|
cursor = cursor[segment];
|
|
9611
9612
|
} else {
|
|
9612
|
-
if (!isPlainObject$
|
|
9613
|
+
if (!isPlainObject$11(cursor)) return void 0;
|
|
9613
9614
|
const own = Object.keys(cursor);
|
|
9614
9615
|
if (own.length !== shape.size || own.some((k) => !shape.has(k))) return void 0;
|
|
9615
9616
|
if (!Object.hasOwn(cursor, segment)) return void 0;
|
|
@@ -9620,7 +9621,7 @@ function alignedSecretLeaf(root, leaf) {
|
|
|
9620
9621
|
}
|
|
9621
9622
|
function collectObjectKeys(value, into) {
|
|
9622
9623
|
if (Array.isArray(value)) for (const item of value) collectObjectKeys(item, into);
|
|
9623
|
-
else if (isPlainObject$
|
|
9624
|
+
else if (isPlainObject$11(value)) for (const [k, v] of Object.entries(value)) {
|
|
9624
9625
|
into.add(k);
|
|
9625
9626
|
collectObjectKeys(v, into);
|
|
9626
9627
|
}
|
|
@@ -9633,7 +9634,7 @@ function spelledKeysOf(properties) {
|
|
|
9633
9634
|
}
|
|
9634
9635
|
function someKeyIsUnspelled(value, spelled) {
|
|
9635
9636
|
if (Array.isArray(value)) return value.some((item) => someKeyIsUnspelled(item, spelled));
|
|
9636
|
-
if (isPlainObject$
|
|
9637
|
+
if (isPlainObject$11(value)) return Object.entries(value).some(([k, v]) => !spelled(k) || someKeyIsUnspelled(v, spelled));
|
|
9637
9638
|
return false;
|
|
9638
9639
|
}
|
|
9639
9640
|
function nameDefinitionSecrets(value, source, secrets) {
|
|
@@ -9728,8 +9729,8 @@ function deepEqualJsonValue(a, b) {
|
|
|
9728
9729
|
if (!Array.isArray(b) || a.length !== b.length) return false;
|
|
9729
9730
|
return a.every((item, i) => deepEqualJsonValue(item, b[i]));
|
|
9730
9731
|
}
|
|
9731
|
-
if (isPlainObject$
|
|
9732
|
-
if (!isPlainObject$
|
|
9732
|
+
if (isPlainObject$11(a)) {
|
|
9733
|
+
if (!isPlainObject$11(b)) return false;
|
|
9733
9734
|
if (!hasPlainPrototype(a) || !hasPlainPrototype(b)) return false;
|
|
9734
9735
|
const keys = Object.keys(a);
|
|
9735
9736
|
if (keys.length !== Object.keys(b).length) return false;
|
|
@@ -9746,7 +9747,7 @@ function renderedDefinitionLiterals(source) {
|
|
|
9746
9747
|
const keyKeep = /* @__PURE__ */ new Set();
|
|
9747
9748
|
const subs = source["DefinitionSubstitutions"];
|
|
9748
9749
|
const scalars = [];
|
|
9749
|
-
if (isPlainObject$
|
|
9750
|
+
if (isPlainObject$11(subs)) {
|
|
9750
9751
|
for (const [name, value] of Object.entries(subs)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
9751
9752
|
scalars.push([name, String(value)]);
|
|
9752
9753
|
if (typeof value === "string") keep.add(value);
|
|
@@ -9758,7 +9759,7 @@ function renderedDefinitionLiterals(source) {
|
|
|
9758
9759
|
if (!Object.hasOwn(source, key)) continue;
|
|
9759
9760
|
const body = source[key];
|
|
9760
9761
|
if (typeof body === "string") bodies.push(body);
|
|
9761
|
-
else if (isPlainObject$
|
|
9762
|
+
else if (isPlainObject$11(body)) bodies.push(JSON.stringify(body));
|
|
9762
9763
|
}
|
|
9763
9764
|
for (const body of bodies) {
|
|
9764
9765
|
let rendered = body;
|
|
@@ -9809,7 +9810,7 @@ function collectScalarLeaves(value, into) {
|
|
|
9809
9810
|
return;
|
|
9810
9811
|
}
|
|
9811
9812
|
if (Array.isArray(value)) for (const item of value) collectScalarLeaves(item, into);
|
|
9812
|
-
else if (isPlainObject$
|
|
9813
|
+
else if (isPlainObject$11(value)) for (const item of Object.values(value)) collectScalarLeaves(item, into);
|
|
9813
9814
|
}
|
|
9814
9815
|
function refuseUncertifiedSubtree(value, sourceLiterals, mark, scalarLiterals, seen = /* @__PURE__ */ new Map()) {
|
|
9815
9816
|
if (scalarLiterals !== void 0 && (typeof value === "number" || typeof value === "boolean") && !scalarLiterals.has(value)) return mark ? POSITION_UNCERTIFIED : "***";
|
|
@@ -9827,7 +9828,7 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, scalarLiterals, s
|
|
|
9827
9828
|
for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, scalarLiterals, seen));
|
|
9828
9829
|
return out;
|
|
9829
9830
|
}
|
|
9830
|
-
if (isPlainObject$
|
|
9831
|
+
if (isPlainObject$11(value) && hasPlainPrototype(value)) {
|
|
9831
9832
|
const out = Object.create(null);
|
|
9832
9833
|
seen.set(value, out);
|
|
9833
9834
|
for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, scalarLiterals, seen);
|
|
@@ -9854,7 +9855,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9854
9855
|
if (learn) learnMixedLeafNeedle(learn, bag, source);
|
|
9855
9856
|
return mark ? POSITION_DECIDED : source;
|
|
9856
9857
|
}
|
|
9857
|
-
if (failClosed === true && isPlainObject$
|
|
9858
|
+
if (failClosed === true && isPlainObject$11(bag) && hasPlainPrototype(bag) && isPlainObject$11(source) && Object.keys(bag).some((k) => RENDERED_DEFINITION_KEYS.has(k)) && definitionSourceCarriesSecret(source)) {
|
|
9858
9859
|
const keep = renderedDefinitionLiterals(source);
|
|
9859
9860
|
const out = Object.create(null);
|
|
9860
9861
|
const rest = Object.create(null);
|
|
@@ -9888,7 +9889,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9888
9889
|
return out;
|
|
9889
9890
|
}
|
|
9890
9891
|
if (!subtreeHasDynamicReference(source)) return bag;
|
|
9891
|
-
if (isPlainObject$
|
|
9892
|
+
if (isPlainObject$11(bag) && hasPlainPrototype(bag) && isPlainObject$11(source)) {
|
|
9892
9893
|
const out = Object.create(null);
|
|
9893
9894
|
for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
|
|
9894
9895
|
return out;
|
|
@@ -9915,14 +9916,14 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
9915
9916
|
function isDistinguishingAnchor(value) {
|
|
9916
9917
|
if (typeof value === "string") return value !== "";
|
|
9917
9918
|
if (Array.isArray(value)) return value.some(isDistinguishingAnchor);
|
|
9918
|
-
if (isPlainObject$
|
|
9919
|
+
if (isPlainObject$11(value)) return Object.values(value).some(isDistinguishingAnchor);
|
|
9919
9920
|
return false;
|
|
9920
9921
|
}
|
|
9921
9922
|
const ANCHOR_REFERENCE_MASK = "<ref>";
|
|
9922
9923
|
function anchorSignature(source) {
|
|
9923
9924
|
if (isDynamicReferenceString(source)) return ANCHOR_REFERENCE_MASK;
|
|
9924
9925
|
if (Array.isArray(source)) return `[${source.map(anchorSignature).sort().join(",")}]`;
|
|
9925
|
-
if (isPlainObject$
|
|
9926
|
+
if (isPlainObject$11(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
|
|
9926
9927
|
return JSON.stringify(source) ?? "undefined";
|
|
9927
9928
|
}
|
|
9928
9929
|
function anchorsCorroboratePairing(bag, source, anchors) {
|
|
@@ -9932,8 +9933,8 @@ function anchorsCorroboratePairing(bag, source, anchors) {
|
|
|
9932
9933
|
return true;
|
|
9933
9934
|
}
|
|
9934
9935
|
if (isDynamicReferenceString(source)) return typeof bag === "string";
|
|
9935
|
-
if (isPlainObject$
|
|
9936
|
-
if (!isPlainObject$
|
|
9936
|
+
if (isPlainObject$11(source)) {
|
|
9937
|
+
if (!isPlainObject$11(bag)) return false;
|
|
9937
9938
|
return Object.keys(source).every((k) => Object.hasOwn(bag, k) && anchorsCorroboratePairing(bag[k], source[k], anchors));
|
|
9938
9939
|
}
|
|
9939
9940
|
if (Array.isArray(source)) {
|
|
@@ -10024,13 +10025,13 @@ function learnMixedLeafNeedle(collector, bag, source) {
|
|
|
10024
10025
|
learnNeedle(collector, plaintext, token);
|
|
10025
10026
|
}
|
|
10026
10027
|
function asChild(marks, key) {
|
|
10027
|
-
return isPlainObject$
|
|
10028
|
+
return isPlainObject$11(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
|
|
10028
10029
|
}
|
|
10029
10030
|
function asIndex(marks, index) {
|
|
10030
10031
|
return Array.isArray(marks) ? marks[index] : void 0;
|
|
10031
10032
|
}
|
|
10032
10033
|
function preferPositionDecisions(scanned, refused, bag, marks, inferred) {
|
|
10033
|
-
if (isPlainObject$
|
|
10034
|
+
if (isPlainObject$11(bag) && hasPlainPrototype(bag) && isPlainObject$11(refused) && isPlainObject$11(scanned)) {
|
|
10034
10035
|
const out = Object.create(null);
|
|
10035
10036
|
for (const [k, v] of Object.entries(refused)) out[k] = preferPositionDecisions(scanned[k], v, bag[k], asChild(marks, k), inferred);
|
|
10036
10037
|
return out;
|
|
@@ -11520,7 +11521,7 @@ function readsNoEchoSource(node, sources) {
|
|
|
11520
11521
|
if (typeof argument === "string") return subStringReadsNoEcho(argument, void 0, sources);
|
|
11521
11522
|
if (Array.isArray(argument)) {
|
|
11522
11523
|
const [text, variables] = argument;
|
|
11523
|
-
const vars = isPlainObject$
|
|
11524
|
+
const vars = isPlainObject$11(variables) ? variables : void 0;
|
|
11524
11525
|
if (typeof text === "string" && subStringReadsNoEcho(text, vars, sources)) return true;
|
|
11525
11526
|
return vars !== void 0 && Object.values(vars).some(walk);
|
|
11526
11527
|
}
|
|
@@ -11554,7 +11555,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
11554
11555
|
parameters: sources.parameters,
|
|
11555
11556
|
...sources.conditions !== void 0 && { conditions: sources.conditions }
|
|
11556
11557
|
};
|
|
11557
|
-
const isBareDeclaredGetAtt = (node) => isPlainObject$
|
|
11558
|
+
const isBareDeclaredGetAtt = (node) => isPlainObject$11(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
|
|
11558
11559
|
const walk = (source, value, path) => {
|
|
11559
11560
|
if (value === void 0) return;
|
|
11560
11561
|
if (source === null || typeof source !== "object") return;
|
|
@@ -11570,7 +11571,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
11570
11571
|
const record = source;
|
|
11571
11572
|
const intrinsic = intrinsicKeyOf(record);
|
|
11572
11573
|
if (intrinsic === void 0) {
|
|
11573
|
-
if (!isPlainObject$
|
|
11574
|
+
if (!isPlainObject$11(value)) {
|
|
11574
11575
|
if (readsNoEchoSource(record, parametersOnly)) push(path, source);
|
|
11575
11576
|
return;
|
|
11576
11577
|
}
|
|
@@ -11619,7 +11620,7 @@ function noEchoParameterNodesAt(templateProperties, shape, noEchoParameters, con
|
|
|
11619
11620
|
noEchoCoordinatesOf(templateProperties ?? {}, shape, {
|
|
11620
11621
|
parameters: noEchoParameters,
|
|
11621
11622
|
...conditions !== void 0 && { conditions }
|
|
11622
|
-
}, (coordinate, node) => nodes.set(canonicalJson$
|
|
11623
|
+
}, (coordinate, node) => nodes.set(canonicalJson$5(coordinate), {
|
|
11623
11624
|
coordinate,
|
|
11624
11625
|
node
|
|
11625
11626
|
}));
|
|
@@ -11631,7 +11632,7 @@ function recordedNoEchoValuesOf(templateProperties, record, noEchoParameterNames
|
|
|
11631
11632
|
if (properties === null || typeof properties !== "object") return bag;
|
|
11632
11633
|
const coordinates = /* @__PURE__ */ new Map();
|
|
11633
11634
|
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$
|
|
11635
|
+
for (const coordinate of noEchoLeavesOf(record ?? {}) ?? []) coordinates.set(canonicalJson$5(coordinate), coordinate);
|
|
11635
11636
|
const recordLeaf = (leaf) => {
|
|
11636
11637
|
if (typeof leaf === "string") {
|
|
11637
11638
|
if (leaf === "***" || leaf.includes("{{resolve:")) return;
|
|
@@ -11655,7 +11656,7 @@ function maskWholeValue(value) {
|
|
|
11655
11656
|
if (value === null || value === void 0) return value;
|
|
11656
11657
|
if (typeof value === "string" && isSingleDynamicReferenceToken(value)) return value;
|
|
11657
11658
|
if (Array.isArray(value)) return value.map(maskWholeValue);
|
|
11658
|
-
if (isPlainObject$
|
|
11659
|
+
if (isPlainObject$11(value)) {
|
|
11659
11660
|
const out = {};
|
|
11660
11661
|
for (const [key, child] of Object.entries(value)) Object.defineProperty(out, key, {
|
|
11661
11662
|
value: maskWholeValue(child),
|
|
@@ -11678,7 +11679,7 @@ function readAt(bag, coordinate) {
|
|
|
11678
11679
|
node = node[segment];
|
|
11679
11680
|
continue;
|
|
11680
11681
|
}
|
|
11681
|
-
if (!isPlainObject$
|
|
11682
|
+
if (!isPlainObject$11(node) || !Object.hasOwn(node, segment)) return {
|
|
11682
11683
|
found: false,
|
|
11683
11684
|
value: void 0
|
|
11684
11685
|
};
|
|
@@ -11694,7 +11695,7 @@ function valueAtCoordinate(bag, coordinate) {
|
|
|
11694
11695
|
}
|
|
11695
11696
|
function cloneContainer(node) {
|
|
11696
11697
|
if (Array.isArray(node)) return [...node];
|
|
11697
|
-
if (isPlainObject$
|
|
11698
|
+
if (isPlainObject$11(node)) return { ...node };
|
|
11698
11699
|
return node;
|
|
11699
11700
|
}
|
|
11700
11701
|
function maskAtCoordinates(bag, coordinates) {
|
|
@@ -11761,20 +11762,20 @@ function readbackPathFor(readback, properties, coordinate) {
|
|
|
11761
11762
|
if (!Array.isArray(live)) return path.length === 0 ? void 0 : path;
|
|
11762
11763
|
const key = Array.isArray(desired) ? identityKeyFor(live, desired) : void 0;
|
|
11763
11764
|
const element = Array.isArray(desired) ? desired[segment] : void 0;
|
|
11764
|
-
if (key === void 0 || !isPlainObject$
|
|
11765
|
+
if (key === void 0 || !isPlainObject$11(element)) return path;
|
|
11765
11766
|
const identity = element[key];
|
|
11766
|
-
const index = live.findIndex((item) => isPlainObject$
|
|
11767
|
+
const index = live.findIndex((item) => isPlainObject$11(item) && item[key] === identity);
|
|
11767
11768
|
if (index < 0) return path;
|
|
11768
11769
|
path.push(index);
|
|
11769
11770
|
live = live[index];
|
|
11770
11771
|
desired = element;
|
|
11771
11772
|
continue;
|
|
11772
11773
|
}
|
|
11773
|
-
if (!isPlainObject$
|
|
11774
|
+
if (!isPlainObject$11(live)) return path.length === 0 ? void 0 : path;
|
|
11774
11775
|
if (!Object.hasOwn(live, segment)) return void 0;
|
|
11775
11776
|
path.push(segment);
|
|
11776
11777
|
live = live[segment];
|
|
11777
|
-
desired = isPlainObject$
|
|
11778
|
+
desired = isPlainObject$11(desired) ? desired[segment] : void 0;
|
|
11778
11779
|
}
|
|
11779
11780
|
return path;
|
|
11780
11781
|
}
|
|
@@ -11803,7 +11804,7 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11803
11804
|
const confirmed = [];
|
|
11804
11805
|
const differing = [];
|
|
11805
11806
|
const walk = (s, t, v, path) => {
|
|
11806
|
-
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$
|
|
11807
|
+
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$11(v) ? !isPlainObject$11(s) : false)) {
|
|
11807
11808
|
if (s === void 0 || containsMask(s)) return s;
|
|
11808
11809
|
if (jsonEqual(s, t)) {
|
|
11809
11810
|
confirmed.push(path);
|
|
@@ -11832,8 +11833,8 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11832
11833
|
});
|
|
11833
11834
|
return changed ? out : s;
|
|
11834
11835
|
}
|
|
11835
|
-
if (isPlainObject$
|
|
11836
|
-
const tt = isPlainObject$
|
|
11836
|
+
if (isPlainObject$11(v) && isPlainObject$11(s)) {
|
|
11837
|
+
const tt = isPlainObject$11(t) ? t : {};
|
|
11837
11838
|
let out;
|
|
11838
11839
|
for (const key of Object.keys(v)) {
|
|
11839
11840
|
if (!Object.hasOwn(s, key)) continue;
|
|
@@ -11856,13 +11857,13 @@ function witnessNormalize(stored, today, v11) {
|
|
|
11856
11857
|
function containsMask(value) {
|
|
11857
11858
|
if (value === "***") return true;
|
|
11858
11859
|
if (Array.isArray(value)) return value.some(containsMask);
|
|
11859
|
-
if (isPlainObject$
|
|
11860
|
+
if (isPlainObject$11(value)) return Object.values(value).some(containsMask);
|
|
11860
11861
|
return false;
|
|
11861
11862
|
}
|
|
11862
11863
|
function jsonEqual(a, b) {
|
|
11863
|
-
return canonicalJson$
|
|
11864
|
+
return canonicalJson$5(a) === canonicalJson$5(b);
|
|
11864
11865
|
}
|
|
11865
|
-
function canonicalJson$
|
|
11866
|
+
function canonicalJson$5(value) {
|
|
11866
11867
|
return JSON.stringify(value, (_key, node) => {
|
|
11867
11868
|
if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
|
|
11868
11869
|
const sorted = Object.create(null);
|
|
@@ -11900,7 +11901,7 @@ function noEchoComparison(options) {
|
|
|
11900
11901
|
const out = node.map(walk);
|
|
11901
11902
|
return out.some((item, i) => item !== node[i]) ? out : node;
|
|
11902
11903
|
}
|
|
11903
|
-
if (isPlainObject$
|
|
11904
|
+
if (isPlainObject$11(node)) {
|
|
11904
11905
|
let out;
|
|
11905
11906
|
for (const [key, child] of Object.entries(node)) {
|
|
11906
11907
|
const next = walk(child);
|
|
@@ -11943,8 +11944,8 @@ function noEchoOutputsComparison(templateValues, sources) {
|
|
|
11943
11944
|
return (current, desired) => {
|
|
11944
11945
|
const coordinates = noEchoCoordinatesOf(templateValues, desired, sources);
|
|
11945
11946
|
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$
|
|
11947
|
+
const maskedValues = new Set([...maskedKeys].map((key) => canonicalJson$5(desired[key])));
|
|
11948
|
+
for (const key of Object.keys(desired)) if (!Object.hasOwn(templateValues, key) && maskedValues.has(canonicalJson$5(desired[key]))) maskedKeys.add(key);
|
|
11948
11949
|
if (maskedKeys.size === 0) return {
|
|
11949
11950
|
current,
|
|
11950
11951
|
desired,
|
|
@@ -11958,7 +11959,7 @@ function noEchoOutputsComparison(templateValues, sources) {
|
|
|
11958
11959
|
const stored = current[key];
|
|
11959
11960
|
if (containsMask(stored)) continue;
|
|
11960
11961
|
normalized = { ...normalized ?? {} };
|
|
11961
|
-
normalized[key] = canonicalJson$
|
|
11962
|
+
normalized[key] = canonicalJson$5(stored) === canonicalJson$5(desired[key]) ? maskedDesired[key] : PREVIOUS_NOECHO_VALUE;
|
|
11962
11963
|
}
|
|
11963
11964
|
return {
|
|
11964
11965
|
current: normalized,
|
|
@@ -12622,6 +12623,10 @@ function attributeTypeChangedForSharedAttribute(oldValue, newValue) {
|
|
|
12622
12623
|
}
|
|
12623
12624
|
return false;
|
|
12624
12625
|
}
|
|
12626
|
+
function globalTableLocalSecondaryIndexesRemoved(oldValue, newValue) {
|
|
12627
|
+
const declares = (value) => Array.isArray(value) && value.length > 0;
|
|
12628
|
+
return declares(oldValue) && (newValue === void 0 || newValue === null || Array.isArray(newValue) && newValue.length === 0);
|
|
12629
|
+
}
|
|
12625
12630
|
function budgetNameChanged(oldValue, newValue) {
|
|
12626
12631
|
const nameOf = (value) => {
|
|
12627
12632
|
if (value === null || typeof value !== "object") return void 0;
|
|
@@ -12680,10 +12685,43 @@ function emrInstancesReplacingPart(value) {
|
|
|
12680
12685
|
strip("TaskInstanceFleets", EMR_FLEET_IN_PLACE_MEMBERS);
|
|
12681
12686
|
return instances;
|
|
12682
12687
|
}
|
|
12688
|
+
function elastiCachePreferredAvailabilityZonesMovedToDisjoint(oldValue, newValue) {
|
|
12689
|
+
if (!Array.isArray(oldValue) || !Array.isArray(newValue)) return false;
|
|
12690
|
+
if (oldValue.length === 0 || newValue.length === 0) return false;
|
|
12691
|
+
if (![...oldValue, ...newValue].every((z) => typeof z === "string")) return false;
|
|
12692
|
+
return !newValue.some((z) => oldValue.includes(z));
|
|
12693
|
+
}
|
|
12683
12694
|
function emrClusterInstancesReplaced(oldValue, newValue) {
|
|
12684
12695
|
if (oldValue === void 0 && newValue === void 0) return true;
|
|
12685
12696
|
return !isDeepStrictEqual(emrInstancesReplacingPart(oldValue), emrInstancesReplacingPart(newValue));
|
|
12686
12697
|
}
|
|
12698
|
+
const AURORA = "aurora";
|
|
12699
|
+
const AURORA_MYSQL = "aurora-mysql";
|
|
12700
|
+
const DEPRECATED_ORACLE_SE_ENGINES = /* @__PURE__ */ new Set(["oracle-se", "oracle-se1"]);
|
|
12701
|
+
const ORACLE_SE2 = "oracle-se2";
|
|
12702
|
+
const ORACLE_CDB_CONVERSIONS = /* @__PURE__ */ new Map([["oracle-ee", "oracle-ee-cdb"], ["oracle-se2", "oracle-se2-cdb"]]);
|
|
12703
|
+
const ORACLE_CDB_ENGINES = new Set(ORACLE_CDB_CONVERSIONS.values());
|
|
12704
|
+
function enginePair(oldValue, newValue) {
|
|
12705
|
+
return typeof oldValue === "string" && typeof newValue === "string" ? [oldValue, newValue] : void 0;
|
|
12706
|
+
}
|
|
12707
|
+
function dbClusterEngineChangeReplaces(oldValue, newValue) {
|
|
12708
|
+
const pair = enginePair(oldValue, newValue);
|
|
12709
|
+
if (pair === void 0) return false;
|
|
12710
|
+
const [before, after] = pair;
|
|
12711
|
+
return !(before === after || before === AURORA && after === AURORA_MYSQL);
|
|
12712
|
+
}
|
|
12713
|
+
function dbInstanceEngineChangeIsInPlace(oldValue, newValue) {
|
|
12714
|
+
const pair = enginePair(oldValue, newValue);
|
|
12715
|
+
if (pair === void 0) return false;
|
|
12716
|
+
const [before, after] = pair;
|
|
12717
|
+
const from = before.toLowerCase();
|
|
12718
|
+
const to = after.toLowerCase();
|
|
12719
|
+
return before === after || before === AURORA && after === AURORA_MYSQL || DEPRECATED_ORACLE_SE_ENGINES.has(from) && to === ORACLE_SE2 || ORACLE_CDB_CONVERSIONS.get(from) === to || from === to && ORACLE_CDB_ENGINES.has(to);
|
|
12720
|
+
}
|
|
12721
|
+
function dbInstanceEngineChangeReplaces(oldValue, newValue) {
|
|
12722
|
+
if (enginePair(oldValue, newValue) === void 0) return false;
|
|
12723
|
+
return !dbInstanceEngineChangeIsInPlace(oldValue, newValue);
|
|
12724
|
+
}
|
|
12687
12725
|
var ReplacementRulesRegistry = class {
|
|
12688
12726
|
logger = getLogger().child("ReplacementRulesRegistry");
|
|
12689
12727
|
rules = /* @__PURE__ */ new Map();
|
|
@@ -12782,6 +12820,10 @@ var ReplacementRulesRegistry = class {
|
|
|
12782
12820
|
"DestinationConfig"
|
|
12783
12821
|
])
|
|
12784
12822
|
});
|
|
12823
|
+
this.rules.set("AWS::DynamoDB::GlobalTable", {
|
|
12824
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
12825
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["LocalSecondaryIndexes", globalTableLocalSecondaryIndexesRemoved]])
|
|
12826
|
+
});
|
|
12785
12827
|
this.rules.set("AWS::DynamoDB::Table", {
|
|
12786
12828
|
replacementProperties: /* @__PURE__ */ new Set(["TableName", "KeySchema"]),
|
|
12787
12829
|
updateableProperties: /* @__PURE__ */ new Set([
|
|
@@ -13001,6 +13043,14 @@ var ReplacementRulesRegistry = class {
|
|
|
13001
13043
|
]),
|
|
13002
13044
|
conditionalReplacements: /* @__PURE__ */ new Map([["InstanceTenancy", vpcInstanceTenancyChangeReplaces]])
|
|
13003
13045
|
});
|
|
13046
|
+
this.rules.set("AWS::RDS::DBCluster", {
|
|
13047
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13048
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["Engine", dbClusterEngineChangeReplaces]])
|
|
13049
|
+
});
|
|
13050
|
+
this.rules.set("AWS::RDS::DBInstance", {
|
|
13051
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13052
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["Engine", dbInstanceEngineChangeReplaces]])
|
|
13053
|
+
});
|
|
13004
13054
|
this.rules.set("AWS::EC2::Subnet", {
|
|
13005
13055
|
replacementProperties: /* @__PURE__ */ new Set([
|
|
13006
13056
|
"VpcId",
|
|
@@ -13057,6 +13107,10 @@ var ReplacementRulesRegistry = class {
|
|
|
13057
13107
|
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13058
13108
|
conditionalReplacements: /* @__PURE__ */ new Map([["LaunchType", ecsServiceLaunchTypeSetOrChanged]])
|
|
13059
13109
|
});
|
|
13110
|
+
this.rules.set("AWS::ElastiCache::CacheCluster", {
|
|
13111
|
+
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13112
|
+
conditionalReplacements: /* @__PURE__ */ new Map([["PreferredAvailabilityZones", elastiCachePreferredAvailabilityZonesMovedToDisjoint]])
|
|
13113
|
+
});
|
|
13060
13114
|
this.rules.set("AWS::EMR::Cluster", {
|
|
13061
13115
|
replacementProperties: /* @__PURE__ */ new Set(),
|
|
13062
13116
|
conditionalReplacements: /* @__PURE__ */ new Map([["Instances", emrClusterInstancesReplaced]])
|
|
@@ -14940,7 +14994,7 @@ function probeFoundSameId(resourceType, a, b) {
|
|
|
14940
14994
|
//#region src/provisioning/config-shape.ts
|
|
14941
14995
|
function readConfigString(container, key, fallback, containerPath, options) {
|
|
14942
14996
|
if (container === void 0 || container === null) return fallback;
|
|
14943
|
-
if (!isPlainObject$
|
|
14997
|
+
if (!isPlainObject$10(container) || isUnresolvedIntrinsicContainer(container)) {
|
|
14944
14998
|
const detail = malformedShapeDetail(container);
|
|
14945
14999
|
if (options?.onUnusable) {
|
|
14946
15000
|
const named = fallback === "" ? "" : ` (${fallback})`;
|
|
@@ -14980,7 +15034,7 @@ function requireConfigArray(value, path, options) {
|
|
|
14980
15034
|
return value;
|
|
14981
15035
|
}
|
|
14982
15036
|
function requireConfigObject(value, path, options) {
|
|
14983
|
-
if (!isPlainObject$
|
|
15037
|
+
if (!isPlainObject$10(value) || isUnresolvedIntrinsicContainer(value)) {
|
|
14984
15038
|
const detail = malformedShapeDetail(value);
|
|
14985
15039
|
if (options?.onUnusable) {
|
|
14986
15040
|
options.onUnusable(`${path} must be an object ${detail}. Leaving this configuration unapplied here; the same value is REFUSED on a template-path create.`);
|
|
@@ -14992,7 +15046,7 @@ function requireConfigObject(value, path, options) {
|
|
|
14992
15046
|
}
|
|
14993
15047
|
function configStringRefusal(container, key, fallback, containerPath, options) {
|
|
14994
15048
|
if (container === void 0 || container === null) return void 0;
|
|
14995
|
-
if (!isPlainObject$
|
|
15049
|
+
if (!isPlainObject$10(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
14996
15050
|
return configValueRefusal(container[key], fallback, `${containerPath}.${key}`, options);
|
|
14997
15051
|
}
|
|
14998
15052
|
function coerceCfnBoolean(value) {
|
|
@@ -15005,7 +15059,7 @@ function coerceCfnBoolean(value) {
|
|
|
15005
15059
|
}
|
|
15006
15060
|
function configBooleanRefusal(container, key, containerPath) {
|
|
15007
15061
|
if (container === void 0 || container === null) return void 0;
|
|
15008
|
-
if (!isPlainObject$
|
|
15062
|
+
if (!isPlainObject$10(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
15009
15063
|
const value = container[key];
|
|
15010
15064
|
if (value === void 0) return void 0;
|
|
15011
15065
|
if (coerceCfnBoolean(value) !== void 0) return void 0;
|
|
@@ -15019,7 +15073,7 @@ function coerceCfnInteger(value) {
|
|
|
15019
15073
|
}
|
|
15020
15074
|
function configIntegerRefusal(container, key, containerPath, min, max) {
|
|
15021
15075
|
if (container === void 0 || container === null) return void 0;
|
|
15022
|
-
if (!isPlainObject$
|
|
15076
|
+
if (!isPlainObject$10(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
15023
15077
|
const value = container[key];
|
|
15024
15078
|
if (value === void 0) return void 0;
|
|
15025
15079
|
const n = coerceCfnInteger(value);
|
|
@@ -15033,10 +15087,10 @@ function configValueRefusal(value, fallback, path, options) {
|
|
|
15033
15087
|
if (typeof value !== "string" || value.trim() === "") return `${path} must be a non-empty string ${malformedShapeDetail(value)}`;
|
|
15034
15088
|
}
|
|
15035
15089
|
function malformedShapeDetail(value) {
|
|
15036
|
-
if (isPlainObject$
|
|
15090
|
+
if (isPlainObject$10(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
|
|
15037
15091
|
return `(got ${describe(value)}) — check for an unresolved intrinsic or a mis-nested template value`;
|
|
15038
15092
|
}
|
|
15039
|
-
function isPlainObject$
|
|
15093
|
+
function isPlainObject$10(value) {
|
|
15040
15094
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15041
15095
|
}
|
|
15042
15096
|
const NAMEABLE_INTRINSIC_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -15063,7 +15117,7 @@ function describe(value) {
|
|
|
15063
15117
|
if (value === null) return "null";
|
|
15064
15118
|
if (Array.isArray(value)) return "an array";
|
|
15065
15119
|
if (typeof value === "string") return value.trim() === "" ? "a blank string" : "a string";
|
|
15066
|
-
if (isPlainObject$
|
|
15120
|
+
if (isPlainObject$10(value) && isUnresolvedIntrinsicContainer(value)) {
|
|
15067
15121
|
const key = Object.keys(value)[0];
|
|
15068
15122
|
return NAMEABLE_INTRINSIC_KEYS.has(key) ? `an unresolved ${key} intrinsic` : "an unresolved intrinsic";
|
|
15069
15123
|
}
|
|
@@ -16345,6 +16399,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16345
16399
|
}],
|
|
16346
16400
|
["AWS::CloudTrail::Trail", {
|
|
16347
16401
|
handled: /* @__PURE__ */ new Set([
|
|
16402
|
+
"AdvancedEventSelectors",
|
|
16403
|
+
"AggregationConfigurations",
|
|
16348
16404
|
"CloudWatchLogsLogGroupArn",
|
|
16349
16405
|
"CloudWatchLogsRoleArn",
|
|
16350
16406
|
"EnableLogFileValidation",
|
|
@@ -16361,7 +16417,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
|
|
|
16361
16417
|
"Tags",
|
|
16362
16418
|
"TrailName"
|
|
16363
16419
|
]),
|
|
16364
|
-
silentDrop: /* @__PURE__ */ new Map(
|
|
16420
|
+
silentDrop: /* @__PURE__ */ new Map(),
|
|
16365
16421
|
createOnlyDrops: /* @__PURE__ */ new Set(),
|
|
16366
16422
|
readOnly: /* @__PURE__ */ new Set(["Arn", "SnsTopicArn"]),
|
|
16367
16423
|
ccRouteUnavailable: false
|
|
@@ -20069,12 +20125,12 @@ function declaresNoEcho(definition) {
|
|
|
20069
20125
|
//#region src/deployment/masked-property-fingerprints.ts
|
|
20070
20126
|
const FINGERPRINT_LAYOUT$1 = 1;
|
|
20071
20127
|
const INPUT_FINGERPRINT_LAYOUT = 2;
|
|
20072
|
-
function canonicalJson$
|
|
20128
|
+
function canonicalJson$4(value) {
|
|
20073
20129
|
if (value === void 0) return "null";
|
|
20074
|
-
if (Array.isArray(value)) return `[${value.map(canonicalJson$
|
|
20130
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson$4).join(",")}]`;
|
|
20075
20131
|
if (value !== null && typeof value === "object") {
|
|
20076
20132
|
const record = value;
|
|
20077
|
-
return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$
|
|
20133
|
+
return `{${Object.keys(record).filter((key) => record[key] !== void 0).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$4(record[key])}`).join(",")}}`;
|
|
20078
20134
|
}
|
|
20079
20135
|
return JSON.stringify(value) ?? "null";
|
|
20080
20136
|
}
|
|
@@ -20095,7 +20151,7 @@ function splitInputFingerprint(entry) {
|
|
|
20095
20151
|
};
|
|
20096
20152
|
}
|
|
20097
20153
|
function templateCarriesNeedle(templateValue, secrets) {
|
|
20098
|
-
const text = canonicalJson$
|
|
20154
|
+
const text = canonicalJson$4(templateValue);
|
|
20099
20155
|
for (const needle of printingCorpusOf(secrets).keys()) {
|
|
20100
20156
|
if (needle.length < 4) continue;
|
|
20101
20157
|
if (text.includes(needle) || text.includes(JSON.stringify(needle).slice(1, -1))) return true;
|
|
@@ -20103,14 +20159,14 @@ function templateCarriesNeedle(templateValue, secrets) {
|
|
|
20103
20159
|
return false;
|
|
20104
20160
|
}
|
|
20105
20161
|
function maskedPropertyFingerprint(templateValue) {
|
|
20106
|
-
const digest = createHash("sha256").update(canonicalJson$
|
|
20162
|
+
const digest = createHash("sha256").update(canonicalJson$4({
|
|
20107
20163
|
layout: FINGERPRINT_LAYOUT$1,
|
|
20108
20164
|
value: templateValue
|
|
20109
20165
|
})).digest("hex");
|
|
20110
20166
|
return `${FINGERPRINT_PREFIX}${digest}`;
|
|
20111
20167
|
}
|
|
20112
20168
|
var UnknownInput = class extends Error {};
|
|
20113
|
-
function isPlainObject$
|
|
20169
|
+
function isPlainObject$9(value) {
|
|
20114
20170
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
20115
20171
|
}
|
|
20116
20172
|
const DYNAMIC_REFERENCE_OPEN = "{{resolve:";
|
|
@@ -20118,7 +20174,7 @@ const NESTED_STACK_TYPE$4 = "AWS::CloudFormation::Stack";
|
|
|
20118
20174
|
const NESTED_OUTPUT_PREFIX = "Outputs.";
|
|
20119
20175
|
function carriesSecretValue(value, corpora) {
|
|
20120
20176
|
if (carriesSecretMask(value)) return true;
|
|
20121
|
-
const text = canonicalJson$
|
|
20177
|
+
const text = canonicalJson$4(value);
|
|
20122
20178
|
if (text.includes(DYNAMIC_REFERENCE_OPEN)) return true;
|
|
20123
20179
|
for (const corpus of corpora) {
|
|
20124
20180
|
if (corpus === void 0) continue;
|
|
@@ -20130,7 +20186,7 @@ function carriesSecretValue(value, corpora) {
|
|
|
20130
20186
|
return false;
|
|
20131
20187
|
}
|
|
20132
20188
|
function parameterInputsFor(args) {
|
|
20133
|
-
const declared = isPlainObject$
|
|
20189
|
+
const declared = isPlainObject$9(args.template.Parameters) ? args.template.Parameters : {};
|
|
20134
20190
|
const values = args.values ?? {};
|
|
20135
20191
|
const inputs = /* @__PURE__ */ new Map();
|
|
20136
20192
|
const bound = {};
|
|
@@ -20141,7 +20197,7 @@ function parameterInputsFor(args) {
|
|
|
20141
20197
|
continue;
|
|
20142
20198
|
}
|
|
20143
20199
|
const value = values[name];
|
|
20144
|
-
let secret = isPlainObject$
|
|
20200
|
+
let secret = isPlainObject$9(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
|
|
20145
20201
|
if (!secret && args.nestedChild === true && args.supplied !== void 0) {
|
|
20146
20202
|
if (Object.hasOwn(args.supplied, name)) {
|
|
20147
20203
|
const passed = args.passedClasses?.get(name);
|
|
@@ -20192,7 +20248,7 @@ function intrinsicKey(value) {
|
|
|
20192
20248
|
const OPAQUE_ATTRIBUTE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", NESTED_STACK_TYPE$4]);
|
|
20193
20249
|
function hasOpaqueAttributes(logicalId, walk) {
|
|
20194
20250
|
const definition = walk.resources[logicalId];
|
|
20195
|
-
const type = isPlainObject$
|
|
20251
|
+
const type = isPlainObject$9(definition) ? definition["Type"] : void 0;
|
|
20196
20252
|
return typeof type === "string" && (type.startsWith("Custom::") || OPAQUE_ATTRIBUTE_TYPES.has(type));
|
|
20197
20253
|
}
|
|
20198
20254
|
function getAttTarget(operand) {
|
|
@@ -20217,7 +20273,7 @@ function taintOf(logicalId, walk) {
|
|
|
20217
20273
|
const visit = (value) => {
|
|
20218
20274
|
if (typeof value === "string") return value.includes(DYNAMIC_REFERENCE_OPEN);
|
|
20219
20275
|
if (Array.isArray(value)) return value.some(visit);
|
|
20220
|
-
if (!isPlainObject$
|
|
20276
|
+
if (!isPlainObject$9(value)) return false;
|
|
20221
20277
|
const key = intrinsicKey(value);
|
|
20222
20278
|
const operand = key === void 0 ? void 0 : value[key];
|
|
20223
20279
|
let verdict = "clean";
|
|
@@ -20229,7 +20285,7 @@ function taintOf(logicalId, walk) {
|
|
|
20229
20285
|
else if (key === "Fn::FindInMap" && mapReadClass(operand, walk.sources.template) !== "clean") verdict = "tainted";
|
|
20230
20286
|
else if (key === "Fn::Sub") {
|
|
20231
20287
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20232
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20288
|
+
const vars = Array.isArray(operand) && isPlainObject$9(operand[1]) ? operand[1] : {};
|
|
20233
20289
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
20234
20290
|
if (Object.hasOwn(vars, name)) continue;
|
|
20235
20291
|
const owner = name.includes(".") ? name.split(".")[0] : name;
|
|
@@ -20243,7 +20299,7 @@ function taintOf(logicalId, walk) {
|
|
|
20243
20299
|
return Object.values(value).some(visit);
|
|
20244
20300
|
};
|
|
20245
20301
|
const definition = walk.resources[logicalId];
|
|
20246
|
-
const result = visit(isPlainObject$
|
|
20302
|
+
const result = visit(isPlainObject$9(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
|
|
20247
20303
|
walk.inProgress.delete(logicalId);
|
|
20248
20304
|
walk.taint.set(logicalId, result);
|
|
20249
20305
|
return result;
|
|
@@ -20259,7 +20315,7 @@ function conditionInput(name, walk) {
|
|
|
20259
20315
|
return typeof verdict === "boolean" ? verdict : "unknown";
|
|
20260
20316
|
}
|
|
20261
20317
|
function conditionClosure(name, walk) {
|
|
20262
|
-
const definitions = isPlainObject$
|
|
20318
|
+
const definitions = isPlainObject$9(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
|
|
20263
20319
|
let secret = false;
|
|
20264
20320
|
let unknown = false;
|
|
20265
20321
|
let unread = false;
|
|
@@ -20274,7 +20330,7 @@ function conditionClosure(name, walk) {
|
|
|
20274
20330
|
value.forEach(visit);
|
|
20275
20331
|
return;
|
|
20276
20332
|
}
|
|
20277
|
-
if (!isPlainObject$
|
|
20333
|
+
if (!isPlainObject$9(value)) return;
|
|
20278
20334
|
const keys = Object.keys(value);
|
|
20279
20335
|
if (keys.length === 1 && keys[0] === "Condition" && typeof value["Condition"] === "string") {
|
|
20280
20336
|
pending.push(value["Condition"]);
|
|
@@ -20307,7 +20363,7 @@ function conditionClosure(name, walk) {
|
|
|
20307
20363
|
if (key === "Fn::Sub") {
|
|
20308
20364
|
const operand = value["Fn::Sub"];
|
|
20309
20365
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20310
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20366
|
+
const vars = Array.isArray(operand) && isPlainObject$9(operand[1]) ? operand[1] : {};
|
|
20311
20367
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
20312
20368
|
if (Object.hasOwn(vars, name)) continue;
|
|
20313
20369
|
if (name.includes(".") && !name.startsWith("AWS::")) secret = true;
|
|
@@ -20336,8 +20392,8 @@ function mapReadClass(operand, template) {
|
|
|
20336
20392
|
const mapName = Array.isArray(operand) ? operand[0] : void 0;
|
|
20337
20393
|
if (typeof mapName !== "string") return "unknown";
|
|
20338
20394
|
const mappings = template.Mappings;
|
|
20339
|
-
const map = isPlainObject$
|
|
20340
|
-
if (!isPlainObject$
|
|
20395
|
+
const map = isPlainObject$9(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
|
|
20396
|
+
if (!isPlainObject$9(map)) return "unknown";
|
|
20341
20397
|
return carriesSecretValue(map, []) ? "secret" : "clean";
|
|
20342
20398
|
}
|
|
20343
20399
|
async function resolvedInput(node, walk) {
|
|
@@ -20405,7 +20461,7 @@ async function inputForm(value, walk) {
|
|
|
20405
20461
|
concrete: parts.every((p) => p.concrete)
|
|
20406
20462
|
};
|
|
20407
20463
|
}
|
|
20408
|
-
if (!isPlainObject$
|
|
20464
|
+
if (!isPlainObject$9(value)) return {
|
|
20409
20465
|
form: value,
|
|
20410
20466
|
concrete: true
|
|
20411
20467
|
};
|
|
@@ -20468,7 +20524,7 @@ async function inputForm(value, walk) {
|
|
|
20468
20524
|
concrete: false
|
|
20469
20525
|
};
|
|
20470
20526
|
}
|
|
20471
|
-
const explicit = Array.isArray(operand) && isPlainObject$
|
|
20527
|
+
const explicit = Array.isArray(operand) && isPlainObject$9(operand[1]) ? operand[1] : {};
|
|
20472
20528
|
const vars = await inputForm(explicit, walk);
|
|
20473
20529
|
const placeholders = [];
|
|
20474
20530
|
let concrete = vars.concrete && !text.includes(DYNAMIC_REFERENCE_OPEN);
|
|
@@ -20521,8 +20577,8 @@ function newWalk(sources, nested = {
|
|
|
20521
20577
|
}) {
|
|
20522
20578
|
return {
|
|
20523
20579
|
sources,
|
|
20524
|
-
resources: isPlainObject$
|
|
20525
|
-
parameters: isPlainObject$
|
|
20580
|
+
resources: isPlainObject$9(sources.template.Resources) ? sources.template.Resources : {},
|
|
20581
|
+
parameters: isPlainObject$9(sources.template.Parameters) ? sources.template.Parameters : {},
|
|
20526
20582
|
taint: /* @__PURE__ */ new Map(),
|
|
20527
20583
|
inProgress: /* @__PURE__ */ new Set(),
|
|
20528
20584
|
stackChain: nested.stackChain,
|
|
@@ -20546,34 +20602,34 @@ function passedKey(passed) {
|
|
|
20546
20602
|
function isNestedStackRow(logicalId, walk) {
|
|
20547
20603
|
if (!Object.hasOwn(walk.resources, logicalId)) return false;
|
|
20548
20604
|
const definition = walk.resources[logicalId];
|
|
20549
|
-
return isPlainObject$
|
|
20605
|
+
return isPlainObject$9(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
|
|
20550
20606
|
}
|
|
20551
20607
|
function getAttAttribute(operand, target) {
|
|
20552
20608
|
if (Array.isArray(operand)) return operand.length === 2 && typeof operand[1] === "string" ? operand[1] : void 0;
|
|
20553
20609
|
return typeof operand === "string" ? operand.slice(target.length + 1) : void 0;
|
|
20554
20610
|
}
|
|
20555
20611
|
function rowParameters(definition) {
|
|
20556
|
-
const properties = isPlainObject$
|
|
20612
|
+
const properties = isPlainObject$9(definition) ? definition["Properties"] : void 0;
|
|
20557
20613
|
if (properties === void 0) return {};
|
|
20558
|
-
if (!isPlainObject$
|
|
20614
|
+
if (!isPlainObject$9(properties)) return "unknown";
|
|
20559
20615
|
const parameters = properties["Parameters"];
|
|
20560
20616
|
if (parameters === void 0) return {};
|
|
20561
|
-
if (!isPlainObject$
|
|
20617
|
+
if (!isPlainObject$9(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
|
|
20562
20618
|
return parameters;
|
|
20563
20619
|
}
|
|
20564
20620
|
function childParameterInputs(template, passed) {
|
|
20565
|
-
const declared = isPlainObject$
|
|
20621
|
+
const declared = isPlainObject$9(template.Parameters) ? template.Parameters : {};
|
|
20566
20622
|
const inputs = /* @__PURE__ */ new Map();
|
|
20567
20623
|
for (const name of Object.keys(declared)) {
|
|
20568
20624
|
const definition = declared[name];
|
|
20569
|
-
if (isPlainObject$
|
|
20625
|
+
if (isPlainObject$9(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
|
|
20570
20626
|
else if (passed.has(name)) {
|
|
20571
20627
|
const passedClass = passed.get(name);
|
|
20572
20628
|
inputs.set(name, passedClass === "clean" ? {
|
|
20573
20629
|
kind: "value",
|
|
20574
20630
|
value: void 0
|
|
20575
20631
|
} : passedClass === "unknown" ? { kind: "unknown" } : { kind: "secret" });
|
|
20576
|
-
} else if (isPlainObject$
|
|
20632
|
+
} else if (isPlainObject$9(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
|
|
20577
20633
|
kind: "value",
|
|
20578
20634
|
value: definition["Default"]
|
|
20579
20635
|
});
|
|
@@ -20590,7 +20646,7 @@ function closureClass(closure) {
|
|
|
20590
20646
|
return closure.unread ? "unread" : "clean";
|
|
20591
20647
|
}
|
|
20592
20648
|
async function childOutputClass(loaded, outputName, passed, chain, shared) {
|
|
20593
|
-
if (loaded === void 0 || !isPlainObject$
|
|
20649
|
+
if (loaded === void 0 || !isPlainObject$9(loaded.template)) return "unknown";
|
|
20594
20650
|
const scopeKey = JSON.stringify([loaded.identity, passedKey(passed)]);
|
|
20595
20651
|
const memoKey = JSON.stringify([scopeKey, outputName]);
|
|
20596
20652
|
const memo = shared.outputs.get(memoKey);
|
|
@@ -20603,8 +20659,8 @@ async function classifyChildOutput(loaded, outputName, passed, chain, shared, sc
|
|
|
20603
20659
|
if (++shared.steps > MAX_NESTED_OUTPUT_STEPS) return "unknown";
|
|
20604
20660
|
if (chain.includes(loaded.identity) || chain.length >= MAX_NESTED_OUTPUT_DEPTH) return "unknown";
|
|
20605
20661
|
const template = loaded.template;
|
|
20606
|
-
const output = (isPlainObject$
|
|
20607
|
-
if (!isPlainObject$
|
|
20662
|
+
const output = (isPlainObject$9(template.Outputs) ? template.Outputs : {})[outputName];
|
|
20663
|
+
if (!isPlainObject$9(output) || !Object.hasOwn(output, "Value")) return "unknown";
|
|
20608
20664
|
const scope = {
|
|
20609
20665
|
walk: newWalk({
|
|
20610
20666
|
template,
|
|
@@ -20676,7 +20732,7 @@ async function expressionClass(value, scope) {
|
|
|
20676
20732
|
return result;
|
|
20677
20733
|
};
|
|
20678
20734
|
if (Array.isArray(value)) return all(value);
|
|
20679
|
-
if (!isPlainObject$
|
|
20735
|
+
if (!isPlainObject$9(value)) return "clean";
|
|
20680
20736
|
const key = intrinsicKey(value);
|
|
20681
20737
|
if (key === void 0) return all(Object.values(value));
|
|
20682
20738
|
const operand = value[key];
|
|
@@ -20691,7 +20747,7 @@ async function expressionClass(value, scope) {
|
|
|
20691
20747
|
case "Fn::Sub": {
|
|
20692
20748
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
20693
20749
|
if (typeof text !== "string") return worseOf("unknown", await expressionClass(operand, scope));
|
|
20694
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
20750
|
+
const vars = Array.isArray(operand) && isPlainObject$9(operand[1]) ? operand[1] : {};
|
|
20695
20751
|
let result = text.includes(DYNAMIC_REFERENCE_OPEN) ? "secret" : "clean";
|
|
20696
20752
|
result = worseOf(result, await all(Object.values(vars)));
|
|
20697
20753
|
for (const name of subPlaceholders(text)) {
|
|
@@ -20755,7 +20811,7 @@ async function maskedInputFingerprint(templateValue, sources) {
|
|
|
20755
20811
|
if (error instanceof UnknownInput) return void 0;
|
|
20756
20812
|
throw error;
|
|
20757
20813
|
}
|
|
20758
|
-
const digest = createHash("sha256").update(canonicalJson$
|
|
20814
|
+
const digest = createHash("sha256").update(canonicalJson$4({
|
|
20759
20815
|
layout: INPUT_FINGERPRINT_LAYOUT,
|
|
20760
20816
|
value: form
|
|
20761
20817
|
})).digest("hex");
|
|
@@ -20769,7 +20825,7 @@ async function classifyPassedParameters(parameters, sources) {
|
|
|
20769
20825
|
}
|
|
20770
20826
|
async function classifyPassed(parameters, sources, nested) {
|
|
20771
20827
|
const classes = /* @__PURE__ */ new Map();
|
|
20772
|
-
if (!isPlainObject$
|
|
20828
|
+
if (!isPlainObject$9(parameters)) return classes;
|
|
20773
20829
|
for (const [name, expression] of Object.entries(parameters)) {
|
|
20774
20830
|
let passedClass;
|
|
20775
20831
|
try {
|
|
@@ -20810,13 +20866,13 @@ function possiblyMaskedKeys(resolvedProps, corpora) {
|
|
|
20810
20866
|
const wholeShortLeaf = (value) => {
|
|
20811
20867
|
if (typeof value === "string") return short.includes(value);
|
|
20812
20868
|
if (Array.isArray(value)) return value.some(wholeShortLeaf);
|
|
20813
|
-
if (isPlainObject$
|
|
20869
|
+
if (isPlainObject$9(value)) return Object.values(value).some(wholeShortLeaf);
|
|
20814
20870
|
return false;
|
|
20815
20871
|
};
|
|
20816
20872
|
return Object.keys(resolvedProps).filter((key) => {
|
|
20817
20873
|
const value = resolvedProps[key];
|
|
20818
20874
|
if (carriesSecretMask(value) || wholeShortLeaf(value)) return true;
|
|
20819
|
-
const text = canonicalJson$
|
|
20875
|
+
const text = canonicalJson$4(value);
|
|
20820
20876
|
return long.some((needle) => text.includes(needle) || text.includes(JSON.stringify(needle).slice(1, -1)));
|
|
20821
20877
|
});
|
|
20822
20878
|
}
|
|
@@ -20841,7 +20897,7 @@ function maskedPropertyFingerprintsOf(record) {
|
|
|
20841
20897
|
const read = /* @__PURE__ */ new Map();
|
|
20842
20898
|
if (record === null || typeof record !== "object") return read;
|
|
20843
20899
|
const field = record.maskedPropertyFingerprints;
|
|
20844
|
-
if (!isPlainObject$
|
|
20900
|
+
if (!isPlainObject$9(field)) return read;
|
|
20845
20901
|
for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
|
|
20846
20902
|
return read;
|
|
20847
20903
|
}
|
|
@@ -20849,7 +20905,7 @@ function maskedPropertyInputFingerprintsOf(record) {
|
|
|
20849
20905
|
const read = /* @__PURE__ */ new Map();
|
|
20850
20906
|
if (record === null || typeof record !== "object") return read;
|
|
20851
20907
|
const field = record.maskedPropertyInputFingerprints;
|
|
20852
|
-
if (!isPlainObject$
|
|
20908
|
+
if (!isPlainObject$9(field)) return read;
|
|
20853
20909
|
const text = maskedPropertyFingerprintsOf(record);
|
|
20854
20910
|
for (const [key, value] of Object.entries(field)) {
|
|
20855
20911
|
if (typeof value !== "string" || !value.startsWith(INPUT_FINGERPRINT_PREFIX)) continue;
|
|
@@ -20896,7 +20952,7 @@ async function movedMaskedProperties(record, templateProps, fingerprinter, onReb
|
|
|
20896
20952
|
function withRebaselinedFingerprints(record, fingerprints) {
|
|
20897
20953
|
const text = maskedPropertyFingerprintsOf(record);
|
|
20898
20954
|
const field = record.maskedPropertyInputFingerprints;
|
|
20899
|
-
const next = isPlainObject$
|
|
20955
|
+
const next = isPlainObject$9(field) ? Object.entries(field) : [];
|
|
20900
20956
|
let changed = false;
|
|
20901
20957
|
for (const [key, value] of Object.entries(fingerprints)) {
|
|
20902
20958
|
if (text.get(key) !== splitInputFingerprint(value).text) continue;
|
|
@@ -20929,10 +20985,10 @@ function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, sec
|
|
|
20929
20985
|
fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
|
|
20930
20986
|
inputs = boundInputFingerprints(fingerprints, inputFingerprints);
|
|
20931
20987
|
} else {
|
|
20932
|
-
if (!isPlainObject$
|
|
20988
|
+
if (!isPlainObject$9(previous)) return scrubbed;
|
|
20933
20989
|
if (corpora.length === 0) return scrubbed;
|
|
20934
20990
|
fingerprints = { ...previous };
|
|
20935
|
-
inputs = isPlainObject$
|
|
20991
|
+
inputs = isPlainObject$9(previousInputs) ? { ...previousInputs } : void 0;
|
|
20936
20992
|
}
|
|
20937
20993
|
if (fingerprints !== void 0 && corpora.length > 0) {
|
|
20938
20994
|
const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
|
|
@@ -22273,11 +22329,11 @@ function validReferenceRegion(region) {
|
|
|
22273
22329
|
if (typeof region !== "string") return void 0;
|
|
22274
22330
|
return canonicalizeRegion(region) === region && isClientSafeRegion(region) ? region : void 0;
|
|
22275
22331
|
}
|
|
22276
|
-
function isPlainObject$
|
|
22332
|
+
function isPlainObject$8(value) {
|
|
22277
22333
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
22278
22334
|
}
|
|
22279
22335
|
function validateReferenceProvenance(token, raw) {
|
|
22280
|
-
if (!isSingleDynamicReferenceToken(token) || !isPlainObject$
|
|
22336
|
+
if (!isSingleDynamicReferenceToken(token) || !isPlainObject$8(raw)) return void 0;
|
|
22281
22337
|
const versionsRaw = Object.hasOwn(raw, "versions") ? raw["versions"] : void 0;
|
|
22282
22338
|
const readRaw = Object.hasOwn(raw, "readVersions") ? raw["readVersions"] : void 0;
|
|
22283
22339
|
if (readRaw !== void 0) {
|
|
@@ -22295,11 +22351,11 @@ function validateReferenceProvenance(token, raw) {
|
|
|
22295
22351
|
return out;
|
|
22296
22352
|
}
|
|
22297
22353
|
function referenceProvenanceOf(record) {
|
|
22298
|
-
if (!isPlainObject$
|
|
22354
|
+
if (!isPlainObject$8(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
22299
22355
|
return validatedBag(record["referenceProvenance"]);
|
|
22300
22356
|
}
|
|
22301
22357
|
function validatedBag(field) {
|
|
22302
|
-
if (!isPlainObject$
|
|
22358
|
+
if (!isPlainObject$8(field)) return void 0;
|
|
22303
22359
|
const out = Object.create(null);
|
|
22304
22360
|
for (const [token, raw] of Object.entries(field)) {
|
|
22305
22361
|
const entry = validateReferenceProvenance(token, raw);
|
|
@@ -22308,9 +22364,9 @@ function validatedBag(field) {
|
|
|
22308
22364
|
return { ...out };
|
|
22309
22365
|
}
|
|
22310
22366
|
function recordedProvenanceOf(record, token) {
|
|
22311
|
-
if (!isPlainObject$
|
|
22367
|
+
if (!isPlainObject$8(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
22312
22368
|
const field = record["referenceProvenance"];
|
|
22313
|
-
if (!isPlainObject$
|
|
22369
|
+
if (!isPlainObject$8(field) || !Object.hasOwn(field, token)) return void 0;
|
|
22314
22370
|
return validateReferenceProvenance(token, field[token]);
|
|
22315
22371
|
}
|
|
22316
22372
|
function recordedReferenceRegions(record) {
|
|
@@ -22332,7 +22388,7 @@ function regionsOf(field) {
|
|
|
22332
22388
|
function keepHeldTokenProvenance(record) {
|
|
22333
22389
|
if (!hasReferenceProvenanceField(record)) return record;
|
|
22334
22390
|
const field = record.referenceProvenance;
|
|
22335
|
-
if (!isPlainObject$
|
|
22391
|
+
if (!isPlainObject$8(field)) return record;
|
|
22336
22392
|
const held = recordReferenceTokens(record);
|
|
22337
22393
|
const keys = Object.keys(field);
|
|
22338
22394
|
if (keys.every((token) => held.has(token))) return record;
|
|
@@ -22344,12 +22400,12 @@ function keepHeldTokenProvenance(record) {
|
|
|
22344
22400
|
};
|
|
22345
22401
|
}
|
|
22346
22402
|
function hasReferenceProvenanceField(record) {
|
|
22347
|
-
return isPlainObject$
|
|
22403
|
+
return isPlainObject$8(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
|
|
22348
22404
|
}
|
|
22349
22405
|
function outputReferenceProvenanceOf(state, outputKey) {
|
|
22350
|
-
if (!isPlainObject$
|
|
22406
|
+
if (!isPlainObject$8(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
|
|
22351
22407
|
const field = state["outputReferenceProvenance"];
|
|
22352
|
-
if (!isPlainObject$
|
|
22408
|
+
if (!isPlainObject$8(field) || !Object.hasOwn(field, outputKey)) return void 0;
|
|
22353
22409
|
return validatedBag(field[outputKey]);
|
|
22354
22410
|
}
|
|
22355
22411
|
function persistable(token, entry) {
|
|
@@ -22367,7 +22423,7 @@ function tokensUnderPaths(properties, paths) {
|
|
|
22367
22423
|
for (const item of value) descend(item, path, next);
|
|
22368
22424
|
return;
|
|
22369
22425
|
}
|
|
22370
|
-
if (isPlainObject$
|
|
22426
|
+
if (isPlainObject$8(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
|
|
22371
22427
|
};
|
|
22372
22428
|
for (const path of paths) descend(properties, path, 0);
|
|
22373
22429
|
return out;
|
|
@@ -22410,7 +22466,7 @@ function unionWithPrevious(pass, before) {
|
|
|
22410
22466
|
}
|
|
22411
22467
|
function outputProvenanceForPersist(args) {
|
|
22412
22468
|
const { outputs, resolvedThisRun, carriedFrom, sinkOf } = args;
|
|
22413
|
-
if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$
|
|
22469
|
+
if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$8(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
|
|
22414
22470
|
let out;
|
|
22415
22471
|
for (const [outputKey, value] of Object.entries(outputs)) {
|
|
22416
22472
|
const sink = sinkOf(outputKey);
|
|
@@ -25930,19 +25986,49 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
25930
25986
|
}
|
|
25931
25987
|
};
|
|
25932
25988
|
|
|
25989
|
+
//#endregion
|
|
25990
|
+
//#region src/state/unsettled-properties.ts
|
|
25991
|
+
function unsettledPropertiesOf(record) {
|
|
25992
|
+
if (record === null || typeof record !== "object") return /* @__PURE__ */ new Set();
|
|
25993
|
+
const value = record.unsettledProperties;
|
|
25994
|
+
if (!Array.isArray(value)) return /* @__PURE__ */ new Set();
|
|
25995
|
+
return new Set(value.filter((entry) => typeof entry === "string" && entry !== ""));
|
|
25996
|
+
}
|
|
25997
|
+
function withUnsettledProperties(record, names) {
|
|
25998
|
+
const merged = new Set(unsettledPropertiesOf(record));
|
|
25999
|
+
const before = merged.size;
|
|
26000
|
+
for (const name of names) if (typeof name === "string" && name !== "") merged.add(name);
|
|
26001
|
+
if (merged.size === before && Array.isArray(record.unsettledProperties)) return record;
|
|
26002
|
+
if (merged.size === 0) return withoutUnsettledProperties(record);
|
|
26003
|
+
return {
|
|
26004
|
+
...record,
|
|
26005
|
+
unsettledProperties: [...merged].sort()
|
|
26006
|
+
};
|
|
26007
|
+
}
|
|
26008
|
+
function withoutUnsettledProperties(record) {
|
|
26009
|
+
if (!Object.hasOwn(record, "unsettledProperties")) return record;
|
|
26010
|
+
const { unsettledProperties: _cleared, ...rest } = record;
|
|
26011
|
+
return rest;
|
|
26012
|
+
}
|
|
26013
|
+
function unsettledContextOf(...records) {
|
|
26014
|
+
const names = /* @__PURE__ */ new Set();
|
|
26015
|
+
for (const record of records) for (const name of unsettledPropertiesOf(record)) names.add(name);
|
|
26016
|
+
return names.size > 0 ? { unsettledProperties: names } : {};
|
|
26017
|
+
}
|
|
26018
|
+
|
|
25933
26019
|
//#endregion
|
|
25934
26020
|
//#region src/analyzer/read-provenance-promotion.ts
|
|
25935
|
-
function isPlainObject$
|
|
26021
|
+
function isPlainObject$7(value) {
|
|
25936
26022
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
25937
26023
|
}
|
|
25938
26024
|
function readsAcrossStacks(value) {
|
|
25939
26025
|
if (Array.isArray(value)) return value.some(readsAcrossStacks);
|
|
25940
|
-
if (!isPlainObject$
|
|
26026
|
+
if (!isPlainObject$7(value)) return false;
|
|
25941
26027
|
if (Object.hasOwn(value, "Fn::ImportValue") || Object.hasOwn(value, "Fn::GetStackOutput")) return true;
|
|
25942
26028
|
return Object.values(value).some(readsAcrossStacks);
|
|
25943
26029
|
}
|
|
25944
26030
|
function recordedReadVersions(record) {
|
|
25945
|
-
if (!isPlainObject$
|
|
26031
|
+
if (!isPlainObject$7(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
25946
26032
|
const field = referenceProvenanceOf(record);
|
|
25947
26033
|
if (field === void 0) return void 0;
|
|
25948
26034
|
let out;
|
|
@@ -25953,7 +26039,7 @@ async function readProvenancePromotions(args) {
|
|
|
25953
26039
|
const { currentState, desiredTemplate, sources } = args;
|
|
25954
26040
|
const parser = args.parser ?? new TemplateParser();
|
|
25955
26041
|
const records = currentState.resources;
|
|
25956
|
-
const parameters = isPlainObject$
|
|
26042
|
+
const parameters = isPlainObject$7(desiredTemplate.Parameters) ? desiredTemplate.Parameters : void 0;
|
|
25957
26043
|
const out = [];
|
|
25958
26044
|
for (const { logicalId, changeType } of args.rows) {
|
|
25959
26045
|
if (changeType !== "NO_CHANGE" && changeType !== "UPDATE") continue;
|
|
@@ -25961,7 +26047,7 @@ async function readProvenancePromotions(args) {
|
|
|
25961
26047
|
const readVersions = recordedReadVersions(record);
|
|
25962
26048
|
if (readVersions === void 0) continue;
|
|
25963
26049
|
const resource = Object.hasOwn(desiredTemplate.Resources, logicalId) ? desiredTemplate.Resources[logicalId] : void 0;
|
|
25964
|
-
const properties = isPlainObject$
|
|
26050
|
+
const properties = isPlainObject$7(resource?.Properties) ? resource.Properties : {};
|
|
25965
26051
|
const reads = [];
|
|
25966
26052
|
for (const [key, value] of Object.entries(properties)) {
|
|
25967
26053
|
const referenced = [...parser.extractReferences(value)].filter((id) => id !== logicalId);
|
|
@@ -26004,7 +26090,7 @@ async function readProvenancePromotions(args) {
|
|
|
26004
26090
|
if (recorded.some((version) => !domain.has(version))) moved.push(token);
|
|
26005
26091
|
}
|
|
26006
26092
|
if (moved.length === 0) continue;
|
|
26007
|
-
const recordProperties = isPlainObject$
|
|
26093
|
+
const recordProperties = isPlainObject$7(record?.properties) ? record.properties : {};
|
|
26008
26094
|
const keys = [];
|
|
26009
26095
|
for (const r of reads) {
|
|
26010
26096
|
if (!Object.hasOwn(recordProperties, r.key)) continue;
|
|
@@ -26174,6 +26260,18 @@ var DiffCalculator = class DiffCalculator {
|
|
|
26174
26260
|
});
|
|
26175
26261
|
this.logger.debug(safeMsg`${logicalId}: ${key} is recorded masked and its template expression or a resolved input changed`);
|
|
26176
26262
|
}
|
|
26263
|
+
const listed = new Set(propertyChanges.map((pc) => pc.path));
|
|
26264
|
+
for (const key of unsettledPropertiesOf(currentResource)) {
|
|
26265
|
+
if (listed.has(key)) continue;
|
|
26266
|
+
propertyChanges.push({
|
|
26267
|
+
path: key,
|
|
26268
|
+
oldValue: currentCompared[key],
|
|
26269
|
+
newValue: desiredCompared[key],
|
|
26270
|
+
requiresReplacement: false,
|
|
26271
|
+
unsettled: true
|
|
26272
|
+
});
|
|
26273
|
+
this.logger.debug(safeMsg`${logicalId}: ${key} is unsettled after a failed update and is sent again`);
|
|
26274
|
+
}
|
|
26177
26275
|
const attributeChanges = this.compareAttributes(currentResource, desiredResource);
|
|
26178
26276
|
if (propertyChanges.length > 0 || attributeChanges.length > 0) {
|
|
26179
26277
|
changes.set(logicalId, {
|
|
@@ -27593,8 +27691,8 @@ function compare(desired, previous, mask) {
|
|
|
27593
27691
|
if (!Array.isArray(desired) || desired.length !== previous.length) return "differs";
|
|
27594
27692
|
return combine(previous.map((item, i) => compare(desired[i], item, mask)));
|
|
27595
27693
|
}
|
|
27596
|
-
if (isPlainObject$
|
|
27597
|
-
if (!isPlainObject$
|
|
27694
|
+
if (isPlainObject$6(previous)) {
|
|
27695
|
+
if (!isPlainObject$6(desired)) return "differs";
|
|
27598
27696
|
if (!Object.keys(desired).every((k) => Object.prototype.hasOwnProperty.call(previous, k))) return "differs";
|
|
27599
27697
|
return combine(Object.keys(previous).map((k) => compare(desired[k], previous[k], mask)));
|
|
27600
27698
|
}
|
|
@@ -27620,7 +27718,7 @@ function resolvesReference(desired, previous, mask) {
|
|
|
27620
27718
|
const pattern = literals.map(escapeRegExp$1).join("[\\s\\S]*");
|
|
27621
27719
|
return new RegExp(`^${pattern}$`).test(desired);
|
|
27622
27720
|
}
|
|
27623
|
-
function isPlainObject$
|
|
27721
|
+
function isPlainObject$6(value) {
|
|
27624
27722
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27625
27723
|
}
|
|
27626
27724
|
function escapeRegExp$1(text) {
|
|
@@ -28573,7 +28671,7 @@ var CloudControlProvider = class {
|
|
|
28573
28671
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
28574
28672
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
28575
28673
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
28576
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
28674
|
+
const { ASGProvider } = await import("./asg-provider-I1bFHVsO.js");
|
|
28577
28675
|
const delegateRegion = ambientRegion();
|
|
28578
28676
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
28579
28677
|
if (asgProvider === void 0) {
|
|
@@ -28682,7 +28780,7 @@ var CloudControlProvider = class {
|
|
|
28682
28780
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
28683
28781
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
28684
28782
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
28685
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
28783
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-BqwTQeS-.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-8kjFmR1l.js"))).NeptuneProvider({ region: ccRegion });
|
|
28686
28784
|
this.sdkDeleteDelegates.set(family, {
|
|
28687
28785
|
region: ccRegion,
|
|
28688
28786
|
provider
|
|
@@ -29838,11 +29936,11 @@ function applyNoEchoDeleteValues(properties, recordedLeaves, values) {
|
|
|
29838
29936
|
payload: properties,
|
|
29839
29937
|
unresolved: []
|
|
29840
29938
|
};
|
|
29841
|
-
const byKey = new Map((values?.leaves ?? []).map((leaf) => [canonicalJson$
|
|
29939
|
+
const byKey = new Map((values?.leaves ?? []).map((leaf) => [canonicalJson$5(leaf.coordinate), leaf]));
|
|
29842
29940
|
const entries = [];
|
|
29843
29941
|
const unresolved = [];
|
|
29844
29942
|
for (const coordinate of masked) {
|
|
29845
|
-
const leaf = byKey.get(canonicalJson$
|
|
29943
|
+
const leaf = byKey.get(canonicalJson$5(coordinate));
|
|
29846
29944
|
if (leaf === void 0) unresolved.push(coordinate);
|
|
29847
29945
|
else entries.push({
|
|
29848
29946
|
coordinate,
|
|
@@ -29893,7 +29991,7 @@ async function noEchoDeleteValuesFromResolved(options) {
|
|
|
29893
29991
|
const fingerprinter = options.inputSources === void 0 ? void 0 : inputFingerprinter(templateProps, options.inputSources);
|
|
29894
29992
|
const leaves = [];
|
|
29895
29993
|
for (const coordinate of masked) {
|
|
29896
|
-
if (!nodes.has(canonicalJson$
|
|
29994
|
+
if (!nodes.has(canonicalJson$5(coordinate))) continue;
|
|
29897
29995
|
if (!await fingerprintsUnchanged(record, templateProps, coordinate, fingerprinter)) continue;
|
|
29898
29996
|
const value = valueAtCoordinate(resolvedProperties, coordinate);
|
|
29899
29997
|
if (value === void 0 || carriesSecretMask(value)) continue;
|
|
@@ -30072,7 +30170,7 @@ var TemplateNoEchoReresolver = class TemplateNoEchoReresolver {
|
|
|
30072
30170
|
const bag = await this.noEchoNeedles();
|
|
30073
30171
|
const leaves = [];
|
|
30074
30172
|
for (const coordinate of masked) {
|
|
30075
|
-
const key = canonicalJson$
|
|
30173
|
+
const key = canonicalJson$5(coordinate);
|
|
30076
30174
|
if (!nodes.has(key)) continue;
|
|
30077
30175
|
const node = nodes.get(key)?.node;
|
|
30078
30176
|
if (!readsParametersOnly(node, declared, refused)) continue;
|
|
@@ -37163,7 +37261,7 @@ const DEFAULT_RESOURCE_TIMEOUT_MS = 18e5;
|
|
|
37163
37261
|
|
|
37164
37262
|
//#endregion
|
|
37165
37263
|
//#region src/analyzer/skipped-outputs.ts
|
|
37166
|
-
function canonicalJson$
|
|
37264
|
+
function canonicalJson$3(value) {
|
|
37167
37265
|
return JSON.stringify(value, (_key, v) => {
|
|
37168
37266
|
if (v !== null && typeof v === "object" && !Array.isArray(v)) {
|
|
37169
37267
|
const sorted = Object.create(null);
|
|
@@ -37193,7 +37291,7 @@ function skippedOutputDigest(template, outputKey) {
|
|
|
37193
37291
|
sections[section] = section === "Parameters" ? withNoEchoDefaultsMasked(body) : body;
|
|
37194
37292
|
}
|
|
37195
37293
|
const entry = template.Outputs?.[outputKey];
|
|
37196
|
-
return createHash("sha256").update(canonicalJson$
|
|
37294
|
+
return createHash("sha256").update(canonicalJson$3({
|
|
37197
37295
|
output: entry,
|
|
37198
37296
|
template: sections
|
|
37199
37297
|
})).digest("hex");
|
|
@@ -38555,9 +38653,9 @@ function sameIdReversalDone(op, current) {
|
|
|
38555
38653
|
const now = current.properties ?? {};
|
|
38556
38654
|
if (forward === void 0) return "undecidable";
|
|
38557
38655
|
const own = (bag, key) => Object.hasOwn(bag, key) ? bag[key] : void 0;
|
|
38558
|
-
const changed = [.../* @__PURE__ */ new Set([...Object.keys(before), ...Object.keys(forward)])].filter((key) => !deepEqual$
|
|
38559
|
-
if (changed.length === 0) return holdsRedactedLeaf(before) ? "undecidable" : deepEqual$
|
|
38560
|
-
return changed.every((key) => deepEqual$
|
|
38656
|
+
const changed = [.../* @__PURE__ */ new Set([...Object.keys(before), ...Object.keys(forward)])].filter((key) => !deepEqual$2(own(before, key), own(forward, key)));
|
|
38657
|
+
if (changed.length === 0) return holdsRedactedLeaf(before) ? "undecidable" : deepEqual$2(now, before);
|
|
38658
|
+
return changed.every((key) => deepEqual$2(own(now, key), own(before, key)));
|
|
38561
38659
|
}
|
|
38562
38660
|
function holdsRedactedLeaf(value) {
|
|
38563
38661
|
if (typeof value === "string") return value.includes("***");
|
|
@@ -38567,14 +38665,14 @@ function holdsRedactedLeaf(value) {
|
|
|
38567
38665
|
function sameIdReversalUndecidable(op, current) {
|
|
38568
38666
|
return sameIdRecreated(op) && current !== void 0 && sameIdReversalDone(op, current) === "undecidable";
|
|
38569
38667
|
}
|
|
38570
|
-
function deepEqual$
|
|
38668
|
+
function deepEqual$2(a, b) {
|
|
38571
38669
|
if (a === b) return true;
|
|
38572
38670
|
if (a == null || b == null) return a === b;
|
|
38573
38671
|
if (typeof a !== typeof b) return false;
|
|
38574
38672
|
if (typeof a !== "object") return false;
|
|
38575
38673
|
if (Array.isArray(a) || Array.isArray(b)) {
|
|
38576
38674
|
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
38577
|
-
return a.every((v, i) => deepEqual$
|
|
38675
|
+
return a.every((v, i) => deepEqual$2(v, b[i]));
|
|
38578
38676
|
}
|
|
38579
38677
|
const ao = a;
|
|
38580
38678
|
const bo = b;
|
|
@@ -38582,7 +38680,7 @@ function deepEqual$1(a, b) {
|
|
|
38582
38680
|
if (ak.length !== Object.keys(bo).length) return false;
|
|
38583
38681
|
for (const k of ak) {
|
|
38584
38682
|
if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;
|
|
38585
|
-
if (!deepEqual$
|
|
38683
|
+
if (!deepEqual$2(ao[k], bo[k])) return false;
|
|
38586
38684
|
}
|
|
38587
38685
|
return true;
|
|
38588
38686
|
}
|
|
@@ -38621,13 +38719,13 @@ function classifyRollbackOp(op, stateResources, orphanLogicalIds) {
|
|
|
38621
38719
|
return "reverse-replacement-readopt";
|
|
38622
38720
|
}
|
|
38623
38721
|
if (op.physicalId !== void 0 && current.physicalId !== op.physicalId) {
|
|
38624
|
-
if (sameTypeAsOld && deepEqual$
|
|
38722
|
+
if (sameTypeAsOld && deepEqual$2(current.properties, op.previousState.properties)) return "skip-already-done";
|
|
38625
38723
|
return "skip-mismatch";
|
|
38626
38724
|
}
|
|
38627
38725
|
if (!resolveReplacementOldType(op).ok) return "refuse-replacement-routing";
|
|
38628
38726
|
return op.oldResourceRetained ?? op.previousState.updateReplacePolicy === "Retain" ? "reverse-replacement-readopt" : "reverse-replacement";
|
|
38629
38727
|
}
|
|
38630
|
-
if (op.previousState && deepEqual$
|
|
38728
|
+
if (op.previousState && deepEqual$2(current.properties, op.previousState.properties)) return "skip-already-done";
|
|
38631
38729
|
return "revert";
|
|
38632
38730
|
}
|
|
38633
38731
|
function classifyFailedOp(op, stateResources, siblings = []) {
|
|
@@ -38977,7 +39075,7 @@ function replaceAtCoordinate(bag, coordinate, value) {
|
|
|
38977
39075
|
});
|
|
38978
39076
|
return root;
|
|
38979
39077
|
}
|
|
38980
|
-
async function readLive(live, baseline, marked, logicalId, ctx) {
|
|
39078
|
+
async function readLive$1(live, baseline, marked, logicalId, ctx) {
|
|
38981
39079
|
let readCurrentState;
|
|
38982
39080
|
try {
|
|
38983
39081
|
const { provider } = ctx.providerRegistry.getProviderFor({
|
|
@@ -39018,7 +39116,7 @@ async function substituteMarkedNoEchoLeaves(input) {
|
|
|
39018
39116
|
...identity,
|
|
39019
39117
|
inert: pending
|
|
39020
39118
|
};
|
|
39021
|
-
const read = await readLive(live, baseline, pending, logicalId, ctx);
|
|
39119
|
+
const read = await readLive$1(live, baseline, pending, logicalId, ctx);
|
|
39022
39120
|
if ("failure" in read) throw unreadableNoEchoLeafRefusal(logicalId, pending, read.failure);
|
|
39023
39121
|
const values = [];
|
|
39024
39122
|
const unreadable = [];
|
|
@@ -39066,7 +39164,7 @@ function maskRestoredNoEchoRecord(record, baseline, substituted = []) {
|
|
|
39066
39164
|
const marked = noEchoLeavesOf(baseline) ?? [];
|
|
39067
39165
|
const names = declaredNoEchoAttributeNames(baseline);
|
|
39068
39166
|
if (marked.length === 0 && names.length === 0 && substituted.length === 0) return record;
|
|
39069
|
-
const echoes = (name, value) => value !== record.physicalId && substituted.some((leaf) => leaf.coordinate[0] === name && canonicalJson$
|
|
39167
|
+
const echoes = (name, value) => value !== record.physicalId && substituted.some((leaf) => leaf.coordinate[0] === name && canonicalJson$5(leaf.value) === canonicalJson$5(value));
|
|
39070
39168
|
let attributes = record.attributes;
|
|
39071
39169
|
if (attributes !== void 0 && attributes !== null && typeof attributes === "object") for (const [name, value] of Object.entries(attributes)) {
|
|
39072
39170
|
if (!names.includes(name) && !echoes(name, value)) continue;
|
|
@@ -39077,7 +39175,7 @@ function maskRestoredNoEchoRecord(record, baseline, substituted = []) {
|
|
|
39077
39175
|
const list = coordinate.findIndex((segment) => typeof segment === "number");
|
|
39078
39176
|
if (list < 0) return false;
|
|
39079
39177
|
const path = coordinate.slice(0, list);
|
|
39080
|
-
return canonicalJson$
|
|
39178
|
+
return canonicalJson$5(valueAtCoordinate(byIndex, path)) !== canonicalJson$5(valueAtCoordinate(baseline.properties, path));
|
|
39081
39179
|
});
|
|
39082
39180
|
const properties = reshaped.length === 0 ? byIndex : maskReadbackAtCoordinates(byIndex, baseline.properties, reshaped);
|
|
39083
39181
|
const widened = reshaped.map((coordinate) => readbackPathFor(byIndex, baseline.properties, coordinate)).filter((path, i) => path !== void 0 && path.length < reshaped[i].length);
|
|
@@ -39191,6 +39289,355 @@ function refuseMaskedReplayBaseline(props, logicalId, inert = []) {
|
|
|
39191
39289
|
throw new CdkdError(`Cannot roll ${shownLogicalId(logicalId)} back: its recorded baseline holds the redaction mask ('${"***"}'), so cdkd would write that literal to the live resource. There are five ways a baseline comes to hold it. (1) A NoEcho custom-resource value was resolved there: restore the property with 'cdkd deploy' AFTER forcing that custom resource to update (change one of its properties, e.g. a nonce), so its handler runs again and supplies the real value — an ordinary re-deploy leaves the resource unchanged, so the handler does not run and the mask stays. (2) The Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records: restore the property with a 'cdkd deploy' that changes this resource, which sends it the encoded value again — a re-deploy that leaves this resource unchanged sends it nothing. Every rollback to such a baseline refuses, so to end this, stop encoding the secret into the property (have the resource read the secret at run time instead — not by writing the secret's plaintext into the template, which cdkd would then record in state in the clear). (3) The value was SPLICED from a masked record of ANOTHER resource — by 'cdkd orphan --force', or by 'cdkd import' resolving an Fn::GetAtt or a Ref over a value the Cloud Control fallback had masked. Repair the record that HOLDS the mask ('cdkd import <stack> --resource <logicalId>=<physicalId> --force', granting cloudformation:DescribeType first if the import warned that it could not read the schema), then re-run whichever command wrote this property. (4) A NoEcho template parameter's value, which cdkd stores only as the mask: restore the property with 'cdkd deploy', which sends the parameter's value again. (5) Two secret values cdkd resolved overlap inside the value, so no single {{resolve:...}} reference renders it and cdkd stored the mask rather than part of a secret: restore the property with a 'cdkd deploy' that changes this resource, which sends it the value again. Every rollback to such a baseline refuses while the two values still overlap there, so to end this, change the property (or rotate one of the secrets) so that they no longer overlap. See https://github.com/go-to-k/cdkd/issues/2449.`, "ROLLBACK_REDACTED_BASELINE");
|
|
39192
39290
|
}
|
|
39193
39291
|
|
|
39292
|
+
//#endregion
|
|
39293
|
+
//#region src/analyzer/drift-normalize.ts
|
|
39294
|
+
function canonicalizeTagListsDeep(v) {
|
|
39295
|
+
if (Array.isArray(v)) {
|
|
39296
|
+
const mapped = v.map(canonicalizeTagListsDeep);
|
|
39297
|
+
if (mapped.length > 0 && mapped.every((t) => t && typeof t === "object" && typeof t.Key === "string")) return [...mapped].sort((a, b) => {
|
|
39298
|
+
const ka = a.Key;
|
|
39299
|
+
const kb = b.Key;
|
|
39300
|
+
if (ka !== kb) return ka < kb ? -1 : 1;
|
|
39301
|
+
return JSON.stringify(a) < JSON.stringify(b) ? -1 : 1;
|
|
39302
|
+
});
|
|
39303
|
+
return mapped;
|
|
39304
|
+
}
|
|
39305
|
+
if (v && typeof v === "object") {
|
|
39306
|
+
if (!hasPlainPrototype$1(v)) return v;
|
|
39307
|
+
const out = nullPrototypeRecord();
|
|
39308
|
+
for (const [k, val] of Object.entries(v)) out[k] = canonicalizeTagListsDeep(val);
|
|
39309
|
+
return out;
|
|
39310
|
+
}
|
|
39311
|
+
return v;
|
|
39312
|
+
}
|
|
39313
|
+
const ID_RE = /^[a-z][a-z0-9]*-[0-9a-f]{6,}$/;
|
|
39314
|
+
const isIdLike = (s) => typeof s === "string" && (s.startsWith("arn:") || ID_RE.test(s));
|
|
39315
|
+
function canonicalizeIdArraysDeep(v) {
|
|
39316
|
+
if (Array.isArray(v)) {
|
|
39317
|
+
const mapped = v.map(canonicalizeIdArraysDeep);
|
|
39318
|
+
if (mapped.length > 1 && mapped.every(isIdLike)) return [...mapped].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
39319
|
+
return mapped;
|
|
39320
|
+
}
|
|
39321
|
+
if (v && typeof v === "object") {
|
|
39322
|
+
if (!hasPlainPrototype$1(v)) return v;
|
|
39323
|
+
const out = nullPrototypeRecord();
|
|
39324
|
+
for (const [k, val] of Object.entries(v)) out[k] = canonicalizeIdArraysDeep(val);
|
|
39325
|
+
return out;
|
|
39326
|
+
}
|
|
39327
|
+
return v;
|
|
39328
|
+
}
|
|
39329
|
+
const LEAF_ONLY_PATH_SUFFIX = "[]";
|
|
39330
|
+
function matchesPathPrefix(path, entries) {
|
|
39331
|
+
for (const entry of entries) {
|
|
39332
|
+
if (entry.endsWith("[]")) {
|
|
39333
|
+
const leaf = entry.slice(0, -2);
|
|
39334
|
+
if (leaf !== "" && path === leaf) return true;
|
|
39335
|
+
continue;
|
|
39336
|
+
}
|
|
39337
|
+
if (path === entry) return true;
|
|
39338
|
+
if (path.startsWith(`${entry}.`)) return true;
|
|
39339
|
+
}
|
|
39340
|
+
return false;
|
|
39341
|
+
}
|
|
39342
|
+
function canonicalizeUnorderedArraysAtPaths(v, paths) {
|
|
39343
|
+
if (paths.length === 0) return v;
|
|
39344
|
+
return walkUnordered(v, "", paths);
|
|
39345
|
+
}
|
|
39346
|
+
function canonicalJson$2(v) {
|
|
39347
|
+
if (Array.isArray(v)) return `[${v.map(canonicalJson$2).join(",")}]`;
|
|
39348
|
+
if (v && typeof v === "object") {
|
|
39349
|
+
const bag = v;
|
|
39350
|
+
return `{${Object.keys(bag).filter((k) => bag[k] !== void 0).sort().map((k) => `${JSON.stringify(k)}:${canonicalJson$2(bag[k])}`).join(",")}}`;
|
|
39351
|
+
}
|
|
39352
|
+
return JSON.stringify(v) ?? "null";
|
|
39353
|
+
}
|
|
39354
|
+
const isPlainObjectElement = (el) => el !== null && typeof el === "object" && !Array.isArray(el);
|
|
39355
|
+
function walkUnordered(v, path, paths) {
|
|
39356
|
+
if (Array.isArray(v)) {
|
|
39357
|
+
const mapped = v.map((el) => Array.isArray(el) ? el : walkUnordered(el, path, paths));
|
|
39358
|
+
if (mapped.length > 1 && matchesPathPrefix(path, paths)) {
|
|
39359
|
+
if (mapped.every((el) => typeof el === "string")) return [...mapped].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
|
|
39360
|
+
if (mapped.every(isPlainObjectElement)) {
|
|
39361
|
+
const keyed = mapped.map((el) => ({
|
|
39362
|
+
el,
|
|
39363
|
+
key: canonicalJson$2(el)
|
|
39364
|
+
}));
|
|
39365
|
+
keyed.sort((a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0);
|
|
39366
|
+
return keyed.map((k) => k.el);
|
|
39367
|
+
}
|
|
39368
|
+
}
|
|
39369
|
+
return mapped;
|
|
39370
|
+
}
|
|
39371
|
+
if (v && typeof v === "object") {
|
|
39372
|
+
if (!hasPlainPrototype$1(v)) return v;
|
|
39373
|
+
const out = nullPrototypeRecord();
|
|
39374
|
+
for (const [k, val] of Object.entries(v)) out[k] = walkUnordered(val, path === "" ? k : `${path}.${k}`, paths);
|
|
39375
|
+
return out;
|
|
39376
|
+
}
|
|
39377
|
+
return v;
|
|
39378
|
+
}
|
|
39379
|
+
|
|
39380
|
+
//#endregion
|
|
39381
|
+
//#region src/analyzer/drift-calculator.ts
|
|
39382
|
+
function calculateResourceDrift(stateProperties, awsProperties, options) {
|
|
39383
|
+
const drifts = [];
|
|
39384
|
+
const ignore = options?.ignorePaths ?? [];
|
|
39385
|
+
const union = options?.unionWalkObjects ?? false;
|
|
39386
|
+
const unordered = options?.unorderedPaths ?? [];
|
|
39387
|
+
stateProperties = canonicalizeUnorderedArraysAtPaths(canonicalizeIdArraysDeep(canonicalizeTagListsDeep(stateProperties)), unordered);
|
|
39388
|
+
awsProperties = canonicalizeUnorderedArraysAtPaths(canonicalizeIdArraysDeep(canonicalizeTagListsDeep(awsProperties)), unordered);
|
|
39389
|
+
for (const key of Object.keys(stateProperties)) {
|
|
39390
|
+
if (isIgnoredPath(key, ignore)) continue;
|
|
39391
|
+
diffAt(key, stateProperties[key], awsProperties[key], drifts, ignore, union);
|
|
39392
|
+
}
|
|
39393
|
+
return drifts;
|
|
39394
|
+
}
|
|
39395
|
+
function undeclaredEmptyObservedKeys(observed, declared) {
|
|
39396
|
+
const keys = [];
|
|
39397
|
+
for (const key of Object.keys(observed)) {
|
|
39398
|
+
if (Object.hasOwn(declared, key)) continue;
|
|
39399
|
+
const value = observed[key];
|
|
39400
|
+
if (value === null || value === void 0 || Array.isArray(value) && value.length === 0 || isPlainObject$5(value) && Object.keys(value).length === 0) keys.push(key);
|
|
39401
|
+
}
|
|
39402
|
+
return keys;
|
|
39403
|
+
}
|
|
39404
|
+
function isIgnoredPath(path, ignorePaths) {
|
|
39405
|
+
return matchesPathPrefix(path, ignorePaths);
|
|
39406
|
+
}
|
|
39407
|
+
function diffAt(path, stateValue, awsValue, out, ignorePaths, unionWalkObjects) {
|
|
39408
|
+
const stateForm = jsonForm(stateValue);
|
|
39409
|
+
const awsForm = jsonForm(awsValue);
|
|
39410
|
+
if (deepEqual$1(stateForm, awsForm)) return;
|
|
39411
|
+
if (typeof stateValue === "string" && stateValue.includes("{{resolve:")) return;
|
|
39412
|
+
if (isPlainObject$5(stateForm) && isPlainObject$5(awsForm) && !Array.isArray(stateForm) && !Array.isArray(awsForm)) {
|
|
39413
|
+
const keys = unionWalkObjects ? /* @__PURE__ */ new Set([...Object.keys(stateForm), ...Object.keys(awsForm)]) : Object.keys(stateForm);
|
|
39414
|
+
for (const key of keys) {
|
|
39415
|
+
const childPath = `${path}.${key}`;
|
|
39416
|
+
if (isIgnoredPath(childPath, ignorePaths)) continue;
|
|
39417
|
+
diffAt(childPath, stateForm[key], awsForm[key], out, ignorePaths, unionWalkObjects);
|
|
39418
|
+
}
|
|
39419
|
+
return;
|
|
39420
|
+
}
|
|
39421
|
+
out.push({
|
|
39422
|
+
path,
|
|
39423
|
+
stateValue,
|
|
39424
|
+
awsValue
|
|
39425
|
+
});
|
|
39426
|
+
}
|
|
39427
|
+
function jsonForm(value) {
|
|
39428
|
+
if (value === null || typeof value !== "object" || hasPlainPrototype$1(value)) return value;
|
|
39429
|
+
const toJSON = value.toJSON;
|
|
39430
|
+
return typeof toJSON === "function" ? toJSON.call(value) : value;
|
|
39431
|
+
}
|
|
39432
|
+
function deepEqual$1(a, b) {
|
|
39433
|
+
a = jsonForm(a);
|
|
39434
|
+
b = jsonForm(b);
|
|
39435
|
+
if (a === b) return true;
|
|
39436
|
+
if (a === null || b === null || a === void 0 || b === void 0) return a === b;
|
|
39437
|
+
if (typeof a !== typeof b) return false;
|
|
39438
|
+
if (typeof a !== "object") return false;
|
|
39439
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
39440
|
+
if (!Array.isArray(a) || !Array.isArray(b)) return false;
|
|
39441
|
+
if (a.length !== b.length) return false;
|
|
39442
|
+
return a.every((v, i) => deepEqual$1(v, b[i]));
|
|
39443
|
+
}
|
|
39444
|
+
const aObj = a;
|
|
39445
|
+
const bObj = b;
|
|
39446
|
+
const aKeys = Object.keys(aObj);
|
|
39447
|
+
const bKeys = Object.keys(bObj);
|
|
39448
|
+
if (aKeys.length !== bKeys.length) return false;
|
|
39449
|
+
for (const key of aKeys) {
|
|
39450
|
+
if (!Object.prototype.hasOwnProperty.call(bObj, key)) return false;
|
|
39451
|
+
if (!deepEqual$1(aObj[key], bObj[key])) return false;
|
|
39452
|
+
}
|
|
39453
|
+
return true;
|
|
39454
|
+
}
|
|
39455
|
+
function equalModuloMask(state, aws, mask) {
|
|
39456
|
+
const a = jsonForm(state);
|
|
39457
|
+
const b = jsonForm(aws);
|
|
39458
|
+
if (a === mask && b !== null && b !== void 0) return true;
|
|
39459
|
+
if (a === b) return true;
|
|
39460
|
+
if (a === null || b === null || a === void 0 || b === void 0) return a === b;
|
|
39461
|
+
if (typeof a !== typeof b || typeof a !== "object") return false;
|
|
39462
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
39463
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
39464
|
+
return a.every((v, i) => equalModuloMask(v, b[i], mask));
|
|
39465
|
+
}
|
|
39466
|
+
const aObj = a;
|
|
39467
|
+
const bObj = b;
|
|
39468
|
+
const aKeys = Object.keys(aObj);
|
|
39469
|
+
if (aKeys.length !== Object.keys(bObj).length) return false;
|
|
39470
|
+
return aKeys.every((key) => Object.prototype.hasOwnProperty.call(bObj, key) && equalModuloMask(aObj[key], bObj[key], mask));
|
|
39471
|
+
}
|
|
39472
|
+
function equalModuloMarkedMask(state, aws, mask, coordinate, isMarked, isWithinMarked = isMarked) {
|
|
39473
|
+
const a = jsonForm(state);
|
|
39474
|
+
const b = jsonForm(aws);
|
|
39475
|
+
if (isMarked(coordinate) && b !== void 0 && b !== null) {
|
|
39476
|
+
if (a === mask) return true;
|
|
39477
|
+
if (isWithinMarked(coordinate) ? isWhollyMask$1(a, mask) : sameJson(a, wholeMaskOf(b, mask))) return holdsMask(a, mask);
|
|
39478
|
+
}
|
|
39479
|
+
if (a === mask && (typeof b === "string" || typeof b === "number" || typeof b === "boolean")) return true;
|
|
39480
|
+
if (a === b) return true;
|
|
39481
|
+
if (a === null || b === null || a === void 0 || b === void 0) return a === b;
|
|
39482
|
+
if (typeof a !== typeof b || typeof a !== "object") return false;
|
|
39483
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
39484
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
39485
|
+
return a.every((v, i) => equalModuloMarkedMask(v, b[i], mask, [...coordinate, i], isMarked, isWithinMarked));
|
|
39486
|
+
}
|
|
39487
|
+
const aObj = a;
|
|
39488
|
+
const bObj = b;
|
|
39489
|
+
const aKeys = Object.keys(aObj);
|
|
39490
|
+
if (aKeys.length !== Object.keys(bObj).length) return false;
|
|
39491
|
+
return aKeys.every((key) => Object.prototype.hasOwnProperty.call(bObj, key) && equalModuloMarkedMask(aObj[key], bObj[key], mask, [...coordinate, key], isMarked, isWithinMarked));
|
|
39492
|
+
}
|
|
39493
|
+
function wholeMaskOf(value, mask) {
|
|
39494
|
+
if (value === null || value === void 0) return value;
|
|
39495
|
+
if (Array.isArray(value)) return value.map((v) => wholeMaskOf(v, mask));
|
|
39496
|
+
if (isPlainObject$5(value)) return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, wholeMaskOf(v, mask)]));
|
|
39497
|
+
return mask;
|
|
39498
|
+
}
|
|
39499
|
+
function isWhollyMask$1(value, mask) {
|
|
39500
|
+
const walk = (node) => {
|
|
39501
|
+
if (node === mask || node === null) return true;
|
|
39502
|
+
if (Array.isArray(node)) return node.every(walk);
|
|
39503
|
+
if (isPlainObject$5(node)) return Object.values(node).every(walk);
|
|
39504
|
+
return false;
|
|
39505
|
+
};
|
|
39506
|
+
return walk(value) && holdsMask(value, mask);
|
|
39507
|
+
}
|
|
39508
|
+
function holdsMask(value, mask) {
|
|
39509
|
+
if (value === mask) return true;
|
|
39510
|
+
if (Array.isArray(value)) return value.some((v) => holdsMask(v, mask));
|
|
39511
|
+
if (isPlainObject$5(value)) return Object.values(value).some((v) => holdsMask(v, mask));
|
|
39512
|
+
return false;
|
|
39513
|
+
}
|
|
39514
|
+
function sameJson(a, b) {
|
|
39515
|
+
if (a === b) return true;
|
|
39516
|
+
if (a === null || b === null || typeof a !== "object" || typeof b !== "object") return false;
|
|
39517
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
39518
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
39519
|
+
return a.every((v, i) => sameJson(v, b[i]));
|
|
39520
|
+
}
|
|
39521
|
+
const aObj = a;
|
|
39522
|
+
const bObj = b;
|
|
39523
|
+
const keys = Object.keys(aObj);
|
|
39524
|
+
return keys.length === Object.keys(bObj).length && keys.every((k) => Object.prototype.hasOwnProperty.call(bObj, k) && sameJson(aObj[k], bObj[k]));
|
|
39525
|
+
}
|
|
39526
|
+
function isPlainObject$5(value) {
|
|
39527
|
+
return typeof value === "object" && value !== null;
|
|
39528
|
+
}
|
|
39529
|
+
|
|
39530
|
+
//#endregion
|
|
39531
|
+
//#region src/deployment/unsettled-convergence.ts
|
|
39532
|
+
const MERGE_SEMANTICS_KEYS = /* @__PURE__ */ new Set(["Tags"]);
|
|
39533
|
+
async function readLive(args, names) {
|
|
39534
|
+
const { provider, physicalId, logicalId, resourceType, recordedProperties } = args;
|
|
39535
|
+
let live;
|
|
39536
|
+
if (provider.readUnsettled !== void 0) live = await provider.readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, args.desired);
|
|
39537
|
+
else if (provider.readCurrentState !== void 0) live = await provider.readCurrentState(physicalId, logicalId, resourceType, recordedProperties);
|
|
39538
|
+
else return;
|
|
39539
|
+
if (typeof live !== "object" || live === null || Array.isArray(live)) return "unreadable";
|
|
39540
|
+
return live;
|
|
39541
|
+
}
|
|
39542
|
+
function refusal(args, names, why) {
|
|
39543
|
+
const list = [...names].sort().join(", ");
|
|
39544
|
+
return new ProvisioningError(`${args.logicalId} (${args.resourceType}): an earlier failed update left ${list} unsettled, and ${why} — nothing was updated. Re-run the deploy once the resource has settled` + (args.provider.readCurrentState !== void 0 ? ", or, to keep what AWS holds instead, run 'cdkd drift --accept' once it has." : "."), args.resourceType, args.logicalId, args.physicalId);
|
|
39545
|
+
}
|
|
39546
|
+
async function settleUnsettledPrevious(args) {
|
|
39547
|
+
const { names, previous, provider } = args;
|
|
39548
|
+
if (names.size === 0) return previous;
|
|
39549
|
+
if (provider.unsettledInTransition !== void 0) {
|
|
39550
|
+
const moving = await provider.unsettledInTransition(args.physicalId, args.logicalId, args.resourceType, names, args.recordedProperties);
|
|
39551
|
+
if (moving.size > 0) throw refusal(args, moving, "AWS is still changing it or cdkd could not confirm it settled");
|
|
39552
|
+
}
|
|
39553
|
+
const substituted = new Set([...names].filter((name) => !MERGE_SEMANTICS_KEYS.has(name)));
|
|
39554
|
+
if (substituted.size === 0) return previous;
|
|
39555
|
+
let live;
|
|
39556
|
+
try {
|
|
39557
|
+
live = await readLive(args, substituted);
|
|
39558
|
+
} catch (error) {
|
|
39559
|
+
if (error instanceof ProvisioningError) throw error;
|
|
39560
|
+
const wrapped = refusal(args, substituted, "the resource could not be read to converge it");
|
|
39561
|
+
if (error instanceof Error) wrapped.cause = error;
|
|
39562
|
+
throw wrapped;
|
|
39563
|
+
}
|
|
39564
|
+
if (live === void 0) return previous;
|
|
39565
|
+
if (live === "unreadable") throw refusal(args, substituted, "the resource could not be read to converge it");
|
|
39566
|
+
const out = { ...previous };
|
|
39567
|
+
for (const name of substituted) if (Object.hasOwn(live, name) && live[name] !== void 0) out[name] = live[name];
|
|
39568
|
+
else delete out[name];
|
|
39569
|
+
return out;
|
|
39570
|
+
}
|
|
39571
|
+
function tagsHeld(desired, live) {
|
|
39572
|
+
const asMap = (value) => {
|
|
39573
|
+
if (value === void 0 || value === null) return /* @__PURE__ */ new Map();
|
|
39574
|
+
if (Array.isArray(value)) {
|
|
39575
|
+
const map = /* @__PURE__ */ new Map();
|
|
39576
|
+
for (const entry of value) {
|
|
39577
|
+
if (typeof entry !== "object" || entry === null) return void 0;
|
|
39578
|
+
const { Key, Value } = entry;
|
|
39579
|
+
if (typeof Key !== "string") return void 0;
|
|
39580
|
+
map.set(Key, Value);
|
|
39581
|
+
}
|
|
39582
|
+
return map;
|
|
39583
|
+
}
|
|
39584
|
+
if (typeof value === "object") return new Map(Object.entries(value));
|
|
39585
|
+
};
|
|
39586
|
+
const want = asMap(desired);
|
|
39587
|
+
const have = asMap(live);
|
|
39588
|
+
if (want === void 0 || have === void 0) return false;
|
|
39589
|
+
for (const [key, value] of want) if (!have.has(key) || JSON.stringify(have.get(key)) !== JSON.stringify(value)) return false;
|
|
39590
|
+
return true;
|
|
39591
|
+
}
|
|
39592
|
+
async function unsettledAfterUpdate(args) {
|
|
39593
|
+
const { names, desired, provider } = args;
|
|
39594
|
+
if (names.size === 0) return [];
|
|
39595
|
+
try {
|
|
39596
|
+
const moving = provider.unsettledInTransition === void 0 ? /* @__PURE__ */ new Set() : await provider.unsettledInTransition(args.physicalId, args.logicalId, args.resourceType, names, args.recordedProperties);
|
|
39597
|
+
const live = await readLive(args, names);
|
|
39598
|
+
if (live === void 0) return [...moving].sort();
|
|
39599
|
+
if (live === "unreadable") return [...names].sort();
|
|
39600
|
+
const ignorePaths = provider.getDriftUnknownPaths?.(args.resourceType) ?? [];
|
|
39601
|
+
const unorderedPaths = provider.getDriftUnorderedPaths?.(args.resourceType) ?? [];
|
|
39602
|
+
const kept = [];
|
|
39603
|
+
for (const name of names) {
|
|
39604
|
+
if (moving.has(name)) {
|
|
39605
|
+
kept.push(name);
|
|
39606
|
+
continue;
|
|
39607
|
+
}
|
|
39608
|
+
if (MERGE_SEMANTICS_KEYS.has(name)) {
|
|
39609
|
+
if (!tagsHeld(desired[name], live[name])) kept.push(name);
|
|
39610
|
+
continue;
|
|
39611
|
+
}
|
|
39612
|
+
if (!Object.hasOwn(live, name) || desired[name] === void 0) continue;
|
|
39613
|
+
if (calculateResourceDrift({ [name]: desired[name] }, { [name]: live[name] }, {
|
|
39614
|
+
ignorePaths,
|
|
39615
|
+
unorderedPaths
|
|
39616
|
+
}).length > 0) kept.push(name);
|
|
39617
|
+
}
|
|
39618
|
+
return kept.sort();
|
|
39619
|
+
} catch {
|
|
39620
|
+
return [...names].sort();
|
|
39621
|
+
}
|
|
39622
|
+
}
|
|
39623
|
+
async function withUnprovenUnsettled(record, args, warn) {
|
|
39624
|
+
const kept = await unsettledAfterUpdate(args);
|
|
39625
|
+
if (kept.length === 0) return record;
|
|
39626
|
+
warn(safeMsg`${args.logicalId} (${args.resourceType}): the update succeeded, but AWS does not yet show the requested ${kept.join(", ")}; cdkd keeps ${kept.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
|
|
39627
|
+
return withUnsettledProperties(record, kept);
|
|
39628
|
+
}
|
|
39629
|
+
function splitUnhandledRemovals(unhandled, recordedPrevious, unsettled) {
|
|
39630
|
+
const addedByFailedUpdate = unhandled.filter((name) => unsettled.has(name) && !Object.hasOwn(recordedPrevious, name));
|
|
39631
|
+
return {
|
|
39632
|
+
removedFromTemplate: unhandled.filter((name) => !addedByFailedUpdate.includes(name)),
|
|
39633
|
+
addedByFailedUpdate
|
|
39634
|
+
};
|
|
39635
|
+
}
|
|
39636
|
+
function addedByFailedUpdateWarning(logicalId, resourceType, names) {
|
|
39637
|
+
const one = names.length === 1;
|
|
39638
|
+
return safeMsg`${logicalId} (${resourceType}): ${one ? "property" : "properties"} ${names.join(", ")} ${one ? "is" : "are"} set on the resource but in no template: an earlier failed update applied ${one ? "it" : "them"}. cdkd has no default to reset ${one ? "it" : "them"} to, so the value stays; remove it by hand if it should not be there.`;
|
|
39639
|
+
}
|
|
39640
|
+
|
|
39194
39641
|
//#endregion
|
|
39195
39642
|
//#region src/deployment/rollback-executor/replay-retry.ts
|
|
39196
39643
|
const RECREATE_RETRY_SCHEDULE = {
|
|
@@ -39199,7 +39646,17 @@ const RECREATE_RETRY_SCHEDULE = {
|
|
|
39199
39646
|
maxDelayMs: 1e4
|
|
39200
39647
|
};
|
|
39201
39648
|
async function updateWithRollbackRetry(provider, args, logicalId, logger, isInterrupted, secrets, mask) {
|
|
39202
|
-
const [, , resourceType, desired,
|
|
39649
|
+
const [, , resourceType, desired, recordedPrevious, context] = args;
|
|
39650
|
+
const previous = await settleUnsettledPrevious({
|
|
39651
|
+
provider,
|
|
39652
|
+
logicalId: args[0],
|
|
39653
|
+
physicalId: args[1],
|
|
39654
|
+
resourceType,
|
|
39655
|
+
recordedProperties: recordedPrevious,
|
|
39656
|
+
names: context?.unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
39657
|
+
previous: recordedPrevious,
|
|
39658
|
+
desired
|
|
39659
|
+
});
|
|
39203
39660
|
const removal = prepareRemovalForUpdate(provider, resourceType, desired, previous);
|
|
39204
39661
|
const revertArgs = [
|
|
39205
39662
|
args[0],
|
|
@@ -39213,7 +39670,9 @@ async function updateWithRollbackRetry(provider, args, logicalId, logger, isInte
|
|
|
39213
39670
|
}
|
|
39214
39671
|
];
|
|
39215
39672
|
const recorded = (result) => {
|
|
39216
|
-
|
|
39673
|
+
const unhandledByCause = splitUnhandledRemovals(removal.unhandled, recordedPrevious, context?.unsettledProperties ?? /* @__PURE__ */ new Set());
|
|
39674
|
+
if (unhandledByCause.removedFromTemplate.length > 0) logger.warn(mask(removalWarning(logicalId, resourceType, unhandledByCause.removedFromTemplate, "rollback")));
|
|
39675
|
+
if (unhandledByCause.addedByFailedUpdate.length > 0) logger.warn(mask(addedByFailedUpdateWarning(logicalId, resourceType, unhandledByCause.addedByFailedUpdate)));
|
|
39217
39676
|
return result === void 0 ? void 0 : withoutInjectedRemovals(result, removal.injected);
|
|
39218
39677
|
};
|
|
39219
39678
|
if (provider.disableOuterRetry) return recorded(await withCurrentResourceSecrets(secrets, () => provider.update(...revertArgs)));
|
|
@@ -39246,6 +39705,9 @@ async function createWithRollbackRetry(provider, create, logicalId, logger, isIn
|
|
|
39246
39705
|
});
|
|
39247
39706
|
}
|
|
39248
39707
|
function recordAfterRollbackUpdate(restored, result) {
|
|
39708
|
+
return withoutUnsettledProperties(recordAfterRollbackUpdateUnsettled(restored, result));
|
|
39709
|
+
}
|
|
39710
|
+
function recordAfterRollbackUpdateUnsettled(restored, result) {
|
|
39249
39711
|
if (result === void 0) return restored;
|
|
39250
39712
|
const returned = result.attributes;
|
|
39251
39713
|
const replacedId = result.wasReplaced && typeof result.physicalId === "string" && result.physicalId !== "" ? result.physicalId : void 0;
|
|
@@ -39537,12 +39999,22 @@ async function replayRevert(s) {
|
|
|
39537
39999
|
expectedRegion: ctx.region,
|
|
39538
40000
|
replayingState: true,
|
|
39539
40001
|
recordedAttributes: current.attributes,
|
|
39540
|
-
...revertClaimed && { inlinePolicyClaimed: revertClaimed }
|
|
40002
|
+
...revertClaimed && { inlinePolicyClaimed: revertClaimed },
|
|
40003
|
+
...unsettledContextOf(current, previousState)
|
|
39541
40004
|
}
|
|
39542
40005
|
], op.logicalId, logger, isInterrupted, secrets, mask));
|
|
39543
40006
|
if (revertResult) recordNoEchoAttributeValues(revertResult, secrets, desiredProps);
|
|
39544
40007
|
stateResources[op.logicalId] = maskRestoredNoEchoRecord(redactRollbackRecord(recordAfterRollbackUpdate(previousState, revertResult), secrets, previousState.properties, previousState.attributes), previousState, noEcho.substituted);
|
|
39545
|
-
|
|
40008
|
+
stateResources[op.logicalId] = await withUnprovenUnsettled(stateResources[op.logicalId], {
|
|
40009
|
+
provider,
|
|
40010
|
+
logicalId: op.logicalId,
|
|
40011
|
+
physicalId: current.physicalId,
|
|
40012
|
+
resourceType: op.resourceType,
|
|
40013
|
+
recordedProperties: current.properties ?? {},
|
|
40014
|
+
names: unsettledContextOf(current, previousState).unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
40015
|
+
desired: desiredProps ?? {}
|
|
40016
|
+
}, (message) => logger.warn(mask(message)));
|
|
40017
|
+
if (updatePartialReason(revertResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(previousState.properties?.["Policies"], current.properties?.["Policies"]), revertVia);
|
|
39546
40018
|
const rollbackPartial = updatePartialReason(revertResult);
|
|
39547
40019
|
if (rollbackPartial !== void 0) logger.warn(mask(` Rollback: ${safe(op.logicalId)} restored, ${updatePartialMessage(rollbackPartial)}`));
|
|
39548
40020
|
else logger.info(` Rollback: ${safe(op.logicalId)} restored successfully`);
|
|
@@ -40484,12 +40956,22 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
40484
40956
|
expectedRegion: ctx.region,
|
|
40485
40957
|
replayingState: true,
|
|
40486
40958
|
recordedAttributes: current.attributes,
|
|
40487
|
-
...revertFailedClaimed && { inlinePolicyClaimed: revertFailedClaimed }
|
|
40959
|
+
...revertFailedClaimed && { inlinePolicyClaimed: revertFailedClaimed },
|
|
40960
|
+
...unsettledContextOf(current, prev)
|
|
40488
40961
|
}
|
|
40489
40962
|
], op.logicalId, logger, options.isInterrupted, secrets, mask));
|
|
40490
40963
|
if (revertFailedResult) recordNoEchoAttributeValues(revertFailedResult, secrets, desiredProps);
|
|
40491
40964
|
stateResources[op.logicalId] = maskRestoredNoEchoRecord(redactRollbackRecord(withNameGenerationReached(recordAfterRollbackUpdate(prev, revertFailedResult), op.logicalId, op.nameGeneration), secrets, prev.properties, prev.attributes), prev, noEcho.substituted);
|
|
40492
|
-
|
|
40965
|
+
stateResources[op.logicalId] = await withUnprovenUnsettled(stateResources[op.logicalId], {
|
|
40966
|
+
provider,
|
|
40967
|
+
logicalId: op.logicalId,
|
|
40968
|
+
physicalId: current.physicalId,
|
|
40969
|
+
resourceType: op.resourceType,
|
|
40970
|
+
recordedProperties: current.properties ?? {},
|
|
40971
|
+
names: unsettledContextOf(current, prev).unsettledProperties ?? /* @__PURE__ */ new Set(),
|
|
40972
|
+
desired: desiredProps ?? {}
|
|
40973
|
+
}, (message) => logger.warn(mask(message)));
|
|
40974
|
+
if (updatePartialReason(revertFailedResult) === void 0) inlinePolicyWriters.record(op.logicalId, "update", stateResources[op.logicalId], !deepEqual$2(prev.properties?.["Policies"], (op.attemptedProperties ?? current.properties)?.["Policies"]), revertVia);
|
|
40493
40975
|
const revertFailedPartial = updatePartialReason(revertFailedResult);
|
|
40494
40976
|
if (revertFailedPartial !== void 0) logger.warn(mask(` Rollback: ${safe(op.logicalId)} reverted, ${updatePartialMessage(revertFailedPartial)}`));
|
|
40495
40977
|
else logger.info(` Rollback: ${safe(op.logicalId)} reverted successfully`);
|
|
@@ -42403,7 +42885,7 @@ async function revertNestedChildFromJournal(args) {
|
|
|
42403
42885
|
...carried,
|
|
42404
42886
|
...stackInstanceIdCarriedFrom(base),
|
|
42405
42887
|
...supersededAfterRollback(base, supersededHost),
|
|
42406
|
-
version:
|
|
42888
|
+
version: 14,
|
|
42407
42889
|
region,
|
|
42408
42890
|
resources: { ...stateResources },
|
|
42409
42891
|
...orphansAfterRollback(base, mintedOrphans),
|
|
@@ -44546,7 +45028,7 @@ function stdoutSupportsColor(env = process.env, argv = process.argv, isTTY = pro
|
|
|
44546
45028
|
//#endregion
|
|
44547
45029
|
//#region src/analyzer/security-diff.ts
|
|
44548
45030
|
function isSyntheticChange(pc) {
|
|
44549
|
-
return pc.replacementPropagated === true || pc.inPlacePropagated === true || pc.noEchoPromoted === true;
|
|
45031
|
+
return pc.replacementPropagated === true || pc.inPlacePropagated === true || pc.noEchoPromoted === true || pc.unsettled === true;
|
|
44550
45032
|
}
|
|
44551
45033
|
function withChanges(base, changes, side) {
|
|
44552
45034
|
const props = { ...base ?? {} };
|
|
@@ -44926,18 +45408,18 @@ function conditionInputsFrom(args) {
|
|
|
44926
45408
|
};
|
|
44927
45409
|
}
|
|
44928
45410
|
const FINGERPRINT_LAYOUT = 1;
|
|
44929
|
-
function isPlainObject$
|
|
45411
|
+
function isPlainObject$4(value) {
|
|
44930
45412
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
44931
45413
|
}
|
|
44932
45414
|
function canonicalJson$1(value) {
|
|
44933
45415
|
if (Array.isArray(value)) return `[${value.map(canonicalJson$1).join(",")}]`;
|
|
44934
|
-
if (isPlainObject$
|
|
45416
|
+
if (isPlainObject$4(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson$1(value[key])}`).join(",")}}`;
|
|
44935
45417
|
const encoded = JSON.stringify(value);
|
|
44936
45418
|
return encoded === void 0 ? "undefined" : encoded;
|
|
44937
45419
|
}
|
|
44938
45420
|
function walkModelledDefinition(value, declaredParameters, parameters, conditions) {
|
|
44939
45421
|
if (typeof value === "string") return !carriesDynamicReference(value);
|
|
44940
|
-
if (!isPlainObject$
|
|
45422
|
+
if (!isPlainObject$4(value)) return false;
|
|
44941
45423
|
const keys = Object.keys(value);
|
|
44942
45424
|
if (keys.length !== 1) return false;
|
|
44943
45425
|
const [key] = keys;
|
|
@@ -44960,8 +45442,8 @@ function walkModelledDefinition(value, declaredParameters, parameters, condition
|
|
|
44960
45442
|
}
|
|
44961
45443
|
function conditionFingerprint(template, name, inputOf) {
|
|
44962
45444
|
const definitions = template.Conditions;
|
|
44963
|
-
if (!isPlainObject$
|
|
44964
|
-
const declared = isPlainObject$
|
|
45445
|
+
if (!isPlainObject$4(definitions)) return void 0;
|
|
45446
|
+
const declared = isPlainObject$4(template.Parameters) ? template.Parameters : {};
|
|
44965
45447
|
const declaredNames = new Set(Object.keys(declared));
|
|
44966
45448
|
const closure = nullPrototypeRecord();
|
|
44967
45449
|
const parameters = /* @__PURE__ */ new Set();
|
|
@@ -44983,7 +45465,7 @@ function conditionFingerprint(template, name, inputOf) {
|
|
|
44983
45465
|
let hasToken = false;
|
|
44984
45466
|
for (const parameter of parameters) {
|
|
44985
45467
|
const definition = declared[parameter];
|
|
44986
|
-
const type = isPlainObject$
|
|
45468
|
+
const type = isPlainObject$4(definition) ? definition["Type"] : void 0;
|
|
44987
45469
|
if (typeof type !== "string") return void 0;
|
|
44988
45470
|
const input = inputOf(parameter);
|
|
44989
45471
|
if (input === void 0) return void 0;
|
|
@@ -45014,7 +45496,7 @@ function collectIfConditionNames(value, names, conditions) {
|
|
|
45014
45496
|
for (const element of value) collectIfConditionNames(element, names, conditions);
|
|
45015
45497
|
return;
|
|
45016
45498
|
}
|
|
45017
|
-
if (!isPlainObject$
|
|
45499
|
+
if (!isPlainObject$4(value)) return;
|
|
45018
45500
|
const ifArgs = value["Fn::If"];
|
|
45019
45501
|
if (Array.isArray(ifArgs) && typeof ifArgs[0] === "string") {
|
|
45020
45502
|
names.add(ifArgs[0]);
|
|
@@ -45028,9 +45510,9 @@ function collectIfConditionNames(value, names, conditions) {
|
|
|
45028
45510
|
function conditionsReadByDiff(template, conditions) {
|
|
45029
45511
|
const names = /* @__PURE__ */ new Set();
|
|
45030
45512
|
for (const section of [template.Resources, template.Outputs]) {
|
|
45031
|
-
if (!isPlainObject$
|
|
45513
|
+
if (!isPlainObject$4(section)) continue;
|
|
45032
45514
|
for (const entry of Object.values(section)) {
|
|
45033
|
-
if (!isPlainObject$
|
|
45515
|
+
if (!isPlainObject$4(entry)) continue;
|
|
45034
45516
|
const gate = entry["Condition"];
|
|
45035
45517
|
if (typeof gate === "string") {
|
|
45036
45518
|
names.add(gate);
|
|
@@ -45062,10 +45544,10 @@ function buildConditionVerdictRecord(template, conditions, inputOf) {
|
|
|
45062
45544
|
function readRecordedConditionVerdicts(state) {
|
|
45063
45545
|
const read = nullPrototypeRecord();
|
|
45064
45546
|
const field = state?.conditionVerdicts;
|
|
45065
|
-
if (!isPlainObject$
|
|
45547
|
+
if (!isPlainObject$4(field)) return read;
|
|
45066
45548
|
for (const name of Object.keys(field)) {
|
|
45067
45549
|
const entry = field[name];
|
|
45068
|
-
if (isPlainObject$
|
|
45550
|
+
if (isPlainObject$4(entry) && typeof entry["verdict"] === "boolean" && typeof entry["fingerprint"] === "string") read[name] = {
|
|
45069
45551
|
verdict: entry["verdict"],
|
|
45070
45552
|
fingerprint: entry["fingerprint"]
|
|
45071
45553
|
};
|
|
@@ -45111,11 +45593,11 @@ function deployConditionInputs(parameterValues, inheritedSecrets, shadowedBy = /
|
|
|
45111
45593
|
function parentSuppliedValues(template, supplied, tokens) {
|
|
45112
45594
|
const names = /* @__PURE__ */ new Set();
|
|
45113
45595
|
if (supplied === void 0) return names;
|
|
45114
|
-
const declared = isPlainObject$
|
|
45596
|
+
const declared = isPlainObject$4(template.Parameters) ? template.Parameters : {};
|
|
45115
45597
|
for (const [name, value] of Object.entries(supplied)) {
|
|
45116
45598
|
if (tokens.has(name)) continue;
|
|
45117
45599
|
const definition = declared[name];
|
|
45118
|
-
const fallback = isPlainObject$
|
|
45600
|
+
const fallback = isPlainObject$4(definition) ? definition["Default"] : void 0;
|
|
45119
45601
|
if (fallback === void 0 || String(fallback) !== String(value)) names.add(name);
|
|
45120
45602
|
}
|
|
45121
45603
|
return names;
|
|
@@ -45450,7 +45932,7 @@ function deferredServiceTokenWarning(row) {
|
|
|
45450
45932
|
|
|
45451
45933
|
//#endregion
|
|
45452
45934
|
//#region src/deployment/read-provenance-sources.ts
|
|
45453
|
-
function isPlainObject$
|
|
45935
|
+
function isPlainObject$3(value) {
|
|
45454
45936
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
45455
45937
|
}
|
|
45456
45938
|
function crossStackNodes(value, into = []) {
|
|
@@ -45458,7 +45940,7 @@ function crossStackNodes(value, into = []) {
|
|
|
45458
45940
|
for (const item of value) crossStackNodes(item, into);
|
|
45459
45941
|
return into;
|
|
45460
45942
|
}
|
|
45461
|
-
if (!isPlainObject$
|
|
45943
|
+
if (!isPlainObject$3(value)) return into;
|
|
45462
45944
|
const keys = Object.keys(value);
|
|
45463
45945
|
if (keys.length === 1 && (keys[0] === "Fn::ImportValue" || keys[0] === "Fn::GetStackOutput")) into.push(value);
|
|
45464
45946
|
for (const item of Object.values(value)) crossStackNodes(item, into);
|
|
@@ -45482,11 +45964,11 @@ function crossStackOutputProvenanceSource(reads, scope, stateBackend) {
|
|
|
45482
45964
|
function inheritedProvenanceForChildDiff(args) {
|
|
45483
45965
|
const { row, rowRecord, parentRecords, parentTemplate } = args;
|
|
45484
45966
|
if (!args.rowProvisioned || rowRecord === void 0) return void 0;
|
|
45485
|
-
const recordedParameters = isPlainObject$
|
|
45967
|
+
const recordedParameters = isPlainObject$3(rowRecord.properties) ? rowRecord.properties["Parameters"] : void 0;
|
|
45486
45968
|
const tokens = referenceTokensIn(recordedParameters);
|
|
45487
45969
|
if (tokens.size === 0) return void 0;
|
|
45488
45970
|
const own = referenceProvenanceOf(rowRecord);
|
|
45489
|
-
const upstreams = [...new TemplateParser().extractReferences(isPlainObject$
|
|
45971
|
+
const upstreams = [...new TemplateParser().extractReferences(isPlainObject$3(row.Properties) ? row.Properties["Parameters"] : void 0)].filter((id) => Object.hasOwn(parentTemplate.Resources, id) && Object.hasOwn(parentRecords, id));
|
|
45490
45972
|
const out = /* @__PURE__ */ new Map();
|
|
45491
45973
|
for (const token of tokens) {
|
|
45492
45974
|
const versions = /* @__PURE__ */ new Set();
|
|
@@ -46720,7 +47202,10 @@ const CI_PATH = `Replicas[].${CONTRIBUTOR_INSIGHTS_KEY}`;
|
|
|
46720
47202
|
const KINESIS_PATH = `Replicas[].${KINESIS_KEY}`;
|
|
46721
47203
|
const TABLE_POLICY_PATH = `Replicas[].${TABLE_POLICY_KEY}`;
|
|
46722
47204
|
const STREAM_POLICY_PATH = `Replicas[].${REPLICA_STREAM_KEY}.ResourcePolicy`;
|
|
46723
|
-
|
|
47205
|
+
const INDEX_CI_PATH = `Replicas[].${INDEX_CONTRIBUTOR_INSIGHTS_PATH}`;
|
|
47206
|
+
const STREAM_TAGS_PATH = `Replicas[].${REPLICA_STREAM_KEY}.Tags`;
|
|
47207
|
+
const REPLICA_INDEXES_KEY = "GlobalSecondaryIndexes";
|
|
47208
|
+
function isPlainObject$2(value) {
|
|
46724
47209
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
46725
47210
|
}
|
|
46726
47211
|
function readPitrSpec(value) {
|
|
@@ -46767,7 +47252,7 @@ function readKinesisSpec(value) {
|
|
|
46767
47252
|
}
|
|
46768
47253
|
function readPolicyBlock(value, path) {
|
|
46769
47254
|
if (value === void 0 || value === null) return { kind: "absent" };
|
|
46770
|
-
if (!isPlainObject$
|
|
47255
|
+
if (!isPlainObject$2(value)) return {
|
|
46771
47256
|
kind: "unusable",
|
|
46772
47257
|
reason: `${path} must be an object with a PolicyDocument`
|
|
46773
47258
|
};
|
|
@@ -46779,7 +47264,7 @@ function readPolicyBlock(value, path) {
|
|
|
46779
47264
|
kind: "usable",
|
|
46780
47265
|
document
|
|
46781
47266
|
};
|
|
46782
|
-
if (!isPlainObject$
|
|
47267
|
+
if (!isPlainObject$2(document)) return {
|
|
46783
47268
|
kind: "unusable",
|
|
46784
47269
|
reason: `${path}.PolicyDocument must be a policy object or a JSON string`
|
|
46785
47270
|
};
|
|
@@ -46799,20 +47284,49 @@ function readTablePolicy(replica) {
|
|
|
46799
47284
|
function readStreamPolicy$1(replica) {
|
|
46800
47285
|
const stream = replica?.[REPLICA_STREAM_KEY];
|
|
46801
47286
|
if (stream === void 0 || stream === null) return { kind: "absent" };
|
|
46802
|
-
if (!isPlainObject$
|
|
47287
|
+
if (!isPlainObject$2(stream)) return {
|
|
46803
47288
|
kind: "unusable",
|
|
46804
47289
|
reason: `Replicas[].${REPLICA_STREAM_KEY} must be an object`
|
|
46805
47290
|
};
|
|
46806
47291
|
return readPolicyBlock(stream["ResourcePolicy"], STREAM_POLICY_PATH);
|
|
46807
47292
|
}
|
|
47293
|
+
function readStreamTags$1(replica) {
|
|
47294
|
+
const stream = replica?.[REPLICA_STREAM_KEY];
|
|
47295
|
+
if (stream === void 0 || stream === null) return {
|
|
47296
|
+
kind: "tags",
|
|
47297
|
+
tags: []
|
|
47298
|
+
};
|
|
47299
|
+
if (!isPlainObject$2(stream)) return {
|
|
47300
|
+
kind: "unusable",
|
|
47301
|
+
reason: `Replicas[].${REPLICA_STREAM_KEY} must be an object`
|
|
47302
|
+
};
|
|
47303
|
+
const read = readTagList(stream["Tags"], "desired");
|
|
47304
|
+
return read.kind === "tags" ? {
|
|
47305
|
+
kind: "tags",
|
|
47306
|
+
tags: read.tags
|
|
47307
|
+
} : {
|
|
47308
|
+
kind: "unusable",
|
|
47309
|
+
reason: `${STREAM_TAGS_PATH} must be a list of tags with a non-empty string Key and a scalar Value`
|
|
47310
|
+
};
|
|
47311
|
+
}
|
|
47312
|
+
function replicaIndexInsightsRefusals(replica) {
|
|
47313
|
+
const indexes = replica?.[REPLICA_INDEXES_KEY];
|
|
47314
|
+
if (!Array.isArray(indexes)) return [];
|
|
47315
|
+
return indexes.flatMap((entry, position) => {
|
|
47316
|
+
if (!isPlainObject$2(entry)) return [];
|
|
47317
|
+
const read = readContributorInsightsSpec(entry[CONTRIBUTOR_INSIGHTS_KEY], `Replicas[].${REPLICA_INDEXES_KEY}[${position}].${CONTRIBUTOR_INSIGHTS_KEY}`);
|
|
47318
|
+
return read.kind === "unusable" ? [read.reason] : [];
|
|
47319
|
+
});
|
|
47320
|
+
}
|
|
46808
47321
|
function replicaSettingRefusals(replica) {
|
|
46809
|
-
return [
|
|
47322
|
+
return [...[
|
|
46810
47323
|
readPitrSpec(replica?.[PITR_KEY]),
|
|
46811
47324
|
readContributorInsightsSpec(replica?.[CONTRIBUTOR_INSIGHTS_KEY], CI_PATH),
|
|
46812
47325
|
readKinesisSpec(replica?.[KINESIS_KEY]),
|
|
46813
47326
|
readTablePolicy(replica),
|
|
46814
|
-
readStreamPolicy$1(replica)
|
|
46815
|
-
|
|
47327
|
+
readStreamPolicy$1(replica),
|
|
47328
|
+
readStreamTags$1(replica)
|
|
47329
|
+
].flatMap((read) => read.kind === "unusable" ? [read.reason] : []), ...replicaIndexInsightsRefusals(replica)];
|
|
46816
47330
|
}
|
|
46817
47331
|
function settingOf(op) {
|
|
46818
47332
|
switch (op.kind) {
|
|
@@ -46825,6 +47339,9 @@ function settingOf(op) {
|
|
|
46825
47339
|
case "putTablePolicy": return "tablePolicy";
|
|
46826
47340
|
case "deleteStreamPolicy":
|
|
46827
47341
|
case "putStreamPolicy": return "streamPolicy";
|
|
47342
|
+
case "indexContributorInsights": return "indexContributorInsights";
|
|
47343
|
+
case "untagStream":
|
|
47344
|
+
case "tagStream": return "streamTags";
|
|
46828
47345
|
}
|
|
46829
47346
|
}
|
|
46830
47347
|
const SETTING_MEMBER = {
|
|
@@ -46832,7 +47349,9 @@ const SETTING_MEMBER = {
|
|
|
46832
47349
|
contributorInsights: CONTRIBUTOR_INSIGHTS_KEY,
|
|
46833
47350
|
kinesis: KINESIS_KEY,
|
|
46834
47351
|
tablePolicy: TABLE_POLICY_KEY,
|
|
46835
|
-
streamPolicy: `${REPLICA_STREAM_KEY}.ResourcePolicy
|
|
47352
|
+
streamPolicy: `${REPLICA_STREAM_KEY}.ResourcePolicy`,
|
|
47353
|
+
indexContributorInsights: INDEX_CONTRIBUTOR_INSIGHTS_PATH,
|
|
47354
|
+
streamTags: `${REPLICA_STREAM_KEY}.Tags`
|
|
46836
47355
|
};
|
|
46837
47356
|
function samePolicyDocument$1(left, right) {
|
|
46838
47357
|
if (left === right) return true;
|
|
@@ -46929,6 +47448,51 @@ function planReplicaSettingOps(desired, previous, options, onUnusable) {
|
|
|
46929
47448
|
kind: "putStreamPolicy",
|
|
46930
47449
|
document
|
|
46931
47450
|
}), { kind: "deleteStreamPolicy" }, "streamPolicy");
|
|
47451
|
+
if (options.tableIndexNames !== void 0) ops.push(...planReplicaIndexInsightsOps(desired, previous, {
|
|
47452
|
+
fresh: options.fresh,
|
|
47453
|
+
tableIndexNames: options.tableIndexNames,
|
|
47454
|
+
removes
|
|
47455
|
+
}, onUnusable));
|
|
47456
|
+
const wantTags = readStreamTags$1(desired);
|
|
47457
|
+
if (wantTags.kind === "unusable") onUnusable(wantTags.reason);
|
|
47458
|
+
else {
|
|
47459
|
+
const hadTags = options.streamReplaced === true ? {
|
|
47460
|
+
kind: "tags",
|
|
47461
|
+
tags: []
|
|
47462
|
+
} : readStreamTags$1(prev);
|
|
47463
|
+
const plan = planTagDiff(hadTags.kind === "tags" ? hadTags.tags : [], wantTags.tags);
|
|
47464
|
+
if (plan.remove.length > 0 && removes("streamTags")) ops.push({
|
|
47465
|
+
kind: "untagStream",
|
|
47466
|
+
keys: plan.remove
|
|
47467
|
+
});
|
|
47468
|
+
if (plan.set.size > 0) ops.push({
|
|
47469
|
+
kind: "tagStream",
|
|
47470
|
+
tags: [...plan.set].map(([Key, Value]) => ({
|
|
47471
|
+
Key,
|
|
47472
|
+
Value
|
|
47473
|
+
}))
|
|
47474
|
+
});
|
|
47475
|
+
}
|
|
47476
|
+
return ops;
|
|
47477
|
+
}
|
|
47478
|
+
function planReplicaIndexInsightsOps(desired, previous, options, onUnusable) {
|
|
47479
|
+
const prev = options.fresh ? void 0 : previous;
|
|
47480
|
+
const ops = [];
|
|
47481
|
+
const desiredIndexes = indexEntriesByName(desired?.[REPLICA_INDEXES_KEY]);
|
|
47482
|
+
const prevIndexes = indexEntriesByName(prev?.[REPLICA_INDEXES_KEY]);
|
|
47483
|
+
for (const indexName of /* @__PURE__ */ new Set([...desiredIndexes.keys(), ...prevIndexes.keys()])) {
|
|
47484
|
+
if (!options.tableIndexNames.has(indexName)) continue;
|
|
47485
|
+
const want = readContributorInsightsSpec(desiredIndexes.get(indexName)?.[CONTRIBUTOR_INSIGHTS_KEY], INDEX_CI_PATH);
|
|
47486
|
+
const op = planContributorInsightsOp(want, readContributorInsightsSpec(prevIndexes.get(indexName)?.[CONTRIBUTOR_INSIGHTS_KEY], INDEX_CI_PATH), onUnusable);
|
|
47487
|
+
if (op === void 0) continue;
|
|
47488
|
+
if (options.fresh && op.action === "DISABLE") continue;
|
|
47489
|
+
if (want.kind === "absent" && !options.removes("indexContributorInsights")) continue;
|
|
47490
|
+
ops.push({
|
|
47491
|
+
kind: "indexContributorInsights",
|
|
47492
|
+
indexName,
|
|
47493
|
+
...op
|
|
47494
|
+
});
|
|
47495
|
+
}
|
|
46932
47496
|
return ops;
|
|
46933
47497
|
}
|
|
46934
47498
|
function planReplicaSettingCorrections(desired, live, only) {
|
|
@@ -46975,8 +47539,43 @@ function planReplicaSettingCorrections(desired, live, only) {
|
|
|
46975
47539
|
kind: "putStreamPolicy",
|
|
46976
47540
|
document: streamPolicy.document
|
|
46977
47541
|
});
|
|
47542
|
+
if (only.has("indexContributorInsights") && live.indexContributorInsightsEnabled !== void 0) for (const [indexName, entry] of declaredIndexInsights(desired)) {
|
|
47543
|
+
const enabled = live.indexContributorInsightsEnabled.get(indexName);
|
|
47544
|
+
if (enabled === void 0 || enabled === entry.enabled) continue;
|
|
47545
|
+
ops.push(!entry.enabled ? {
|
|
47546
|
+
kind: "indexContributorInsights",
|
|
47547
|
+
indexName,
|
|
47548
|
+
action: "DISABLE"
|
|
47549
|
+
} : entry.mode === void 0 ? {
|
|
47550
|
+
kind: "indexContributorInsights",
|
|
47551
|
+
indexName,
|
|
47552
|
+
action: "ENABLE"
|
|
47553
|
+
} : {
|
|
47554
|
+
kind: "indexContributorInsights",
|
|
47555
|
+
indexName,
|
|
47556
|
+
action: "ENABLE",
|
|
47557
|
+
mode: entry.mode
|
|
47558
|
+
});
|
|
47559
|
+
}
|
|
47560
|
+
const streamTags = readStreamTags$1(desired);
|
|
47561
|
+
if (only.has("streamTags") && streamTags.kind === "tags" && live.streamTags !== void 0) {
|
|
47562
|
+
const liveTags = live.streamTags;
|
|
47563
|
+
const missing = streamTags.tags.filter((t) => liveTags.get(t.Key) !== t.Value);
|
|
47564
|
+
if (missing.length > 0) ops.push({
|
|
47565
|
+
kind: "tagStream",
|
|
47566
|
+
tags: missing
|
|
47567
|
+
});
|
|
47568
|
+
}
|
|
46978
47569
|
return ops;
|
|
46979
47570
|
}
|
|
47571
|
+
function declaredIndexInsights(desired) {
|
|
47572
|
+
const out = /* @__PURE__ */ new Map();
|
|
47573
|
+
for (const [indexName, entry] of indexEntriesByName(desired?.[REPLICA_INDEXES_KEY])) {
|
|
47574
|
+
const read = readContributorInsightsSpec(entry[CONTRIBUTOR_INSIGHTS_KEY], INDEX_CI_PATH);
|
|
47575
|
+
if (read.kind === "usable") out.set(indexName, read);
|
|
47576
|
+
}
|
|
47577
|
+
return out;
|
|
47578
|
+
}
|
|
46980
47579
|
function declaredReplicaSettings(desired) {
|
|
46981
47580
|
const declared = /* @__PURE__ */ new Set();
|
|
46982
47581
|
if (readPitrSpec(desired?.["PointInTimeRecoverySpecification"]).kind === "usable") declared.add("pitr");
|
|
@@ -46984,6 +47583,9 @@ function declaredReplicaSettings(desired) {
|
|
|
46984
47583
|
if (readKinesisSpec(desired?.["KinesisStreamSpecification"]).kind === "usable") declared.add("kinesis");
|
|
46985
47584
|
if (readTablePolicy(desired).kind === "usable") declared.add("tablePolicy");
|
|
46986
47585
|
if (readStreamPolicy$1(desired).kind === "usable") declared.add("streamPolicy");
|
|
47586
|
+
if (declaredIndexInsights(desired).size > 0) declared.add("indexContributorInsights");
|
|
47587
|
+
const tags = readStreamTags$1(desired);
|
|
47588
|
+
if (tags.kind === "tags" && tags.tags.length > 0) declared.add("streamTags");
|
|
46987
47589
|
return declared;
|
|
46988
47590
|
}
|
|
46989
47591
|
function enabledForReadStatus(status) {
|
|
@@ -47030,7 +47632,7 @@ const READBACK_5381_NESTED = [[
|
|
|
47030
47632
|
function isPre5381ReplicaBaseline(baseline) {
|
|
47031
47633
|
if ("TableClass" in baseline || "DeletionProtectionEnabled" in baseline) return true;
|
|
47032
47634
|
const replicas = baseline["Replicas"];
|
|
47033
|
-
return Array.isArray(replicas) && replicas.some((r) => isPlainObject$
|
|
47635
|
+
return Array.isArray(replicas) && replicas.some((r) => isPlainObject$2(r) && "KMSMasterKeyId" in r);
|
|
47034
47636
|
}
|
|
47035
47637
|
function canonicalizePre5381ReplicaBaseline(baseline, aws, localRegion, localFromReadback = false) {
|
|
47036
47638
|
if (!isPre5381ReplicaBaseline(baseline)) return baseline;
|
|
@@ -47044,7 +47646,7 @@ function canonicalizePre5381ReplicaBaseline(baseline, aws, localRegion, localFro
|
|
|
47044
47646
|
if (!Array.isArray(replicas)) return result;
|
|
47045
47647
|
const awsReplicas = Array.isArray(aws["Replicas"]) ? aws["Replicas"] : [];
|
|
47046
47648
|
result["Replicas"] = replicas.map((element) => {
|
|
47047
|
-
if (!isPlainObject$
|
|
47649
|
+
if (!isPlainObject$2(element)) return element;
|
|
47048
47650
|
const region = element["Region"];
|
|
47049
47651
|
const entry = { ...element };
|
|
47050
47652
|
if (region === localRegion && localRegion !== "") {
|
|
@@ -47055,13 +47657,13 @@ function canonicalizePre5381ReplicaBaseline(baseline, aws, localRegion, localFro
|
|
|
47055
47657
|
delete entry["KMSMasterKeyId"];
|
|
47056
47658
|
if (!("SSESpecification" in entry)) entry["SSESpecification"] = { KMSMasterKeyId: key };
|
|
47057
47659
|
}
|
|
47058
|
-
const live = awsReplicas.find((r) => isPlainObject$
|
|
47660
|
+
const live = awsReplicas.find((r) => isPlainObject$2(r) && r["Region"] === region);
|
|
47059
47661
|
if (live !== void 0) {
|
|
47060
47662
|
for (const member of READBACK_5381_MEMBERS) if (!(member in entry) && member in live) entry[member] = structuredClone(live[member]);
|
|
47061
47663
|
for (const [block, member, flag] of READBACK_5381_NESTED) {
|
|
47062
47664
|
const mine = entry[block];
|
|
47063
47665
|
const theirs = live[block];
|
|
47064
|
-
if (isPlainObject$
|
|
47666
|
+
if (isPlainObject$2(mine) && isPlainObject$2(theirs) && !(member in mine) && member in theirs && mine[flag] === theirs[flag]) entry[block] = {
|
|
47065
47667
|
...mine,
|
|
47066
47668
|
[member]: theirs[member]
|
|
47067
47669
|
};
|
|
@@ -47074,18 +47676,19 @@ function canonicalizePre5381ReplicaBaseline(baseline, aws, localRegion, localFro
|
|
|
47074
47676
|
const UNREAD_REPLICA_MEMBERS = [
|
|
47075
47677
|
"TableClass",
|
|
47076
47678
|
"DeletionProtectionEnabled",
|
|
47077
|
-
"SSESpecification"
|
|
47679
|
+
"SSESpecification",
|
|
47680
|
+
"GlobalTableSettingsReplicationMode"
|
|
47078
47681
|
];
|
|
47079
47682
|
function keepUnreadReplicaMembers(desired, previous) {
|
|
47080
47683
|
const replicas = desired["Replicas"];
|
|
47081
47684
|
const prevReplicas = previous["Replicas"];
|
|
47082
47685
|
if (!Array.isArray(replicas) || !Array.isArray(prevReplicas)) return desired;
|
|
47083
47686
|
const sse = desired["SSESpecification"];
|
|
47084
|
-
const sseOn = isPlainObject$
|
|
47687
|
+
const sseOn = isPlainObject$2(sse) && coerceCfnBoolean(sse["SSEEnabled"]) !== false;
|
|
47085
47688
|
let changed = false;
|
|
47086
47689
|
const completed = replicas.map((element) => {
|
|
47087
|
-
if (!isPlainObject$
|
|
47088
|
-
const live = prevReplicas.find((r) => isPlainObject$
|
|
47690
|
+
if (!isPlainObject$2(element)) return element;
|
|
47691
|
+
const live = prevReplicas.find((r) => isPlainObject$2(r) && r["Region"] === element["Region"]);
|
|
47089
47692
|
if (live === void 0) return element;
|
|
47090
47693
|
const entry = { ...element };
|
|
47091
47694
|
let touched = false;
|
|
@@ -47099,7 +47702,7 @@ function keepUnreadReplicaMembers(desired, previous) {
|
|
|
47099
47702
|
const pitr = entry[PITR_KEY];
|
|
47100
47703
|
const wantPitr = readPitrSpec(pitr);
|
|
47101
47704
|
const livePitr = readPitrSpec(live[PITR_KEY]);
|
|
47102
|
-
if (isPlainObject$
|
|
47705
|
+
if (isPlainObject$2(pitr) && wantPitr.kind === "usable" && wantPitr.enabled && wantPitr.recoveryPeriodInDays === void 0 && livePitr.kind === "usable" && livePitr.enabled && livePitr.recoveryPeriodInDays !== void 0) {
|
|
47103
47706
|
entry[PITR_KEY] = {
|
|
47104
47707
|
...pitr,
|
|
47105
47708
|
RecoveryPeriodInDays: livePitr.recoveryPeriodInDays
|
|
@@ -47123,7 +47726,7 @@ const STREAM_POLICY_KEY = "ResourcePolicy";
|
|
|
47123
47726
|
const STREAM_TAGS_KEY = "Tags";
|
|
47124
47727
|
const POLICY_PATH = `${STREAM_SPECIFICATION_KEY$1}.${STREAM_POLICY_KEY}`;
|
|
47125
47728
|
const TAGS_PATH = `${STREAM_SPECIFICATION_KEY$1}.${STREAM_TAGS_KEY}`;
|
|
47126
|
-
function isPlainObject(value) {
|
|
47729
|
+
function isPlainObject$1(value) {
|
|
47127
47730
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
47128
47731
|
}
|
|
47129
47732
|
function refusalOf(guard) {
|
|
@@ -47135,7 +47738,7 @@ function refusalOf(guard) {
|
|
|
47135
47738
|
}
|
|
47136
47739
|
}
|
|
47137
47740
|
function blockMembers(block) {
|
|
47138
|
-
return isPlainObject(block) ? block : {};
|
|
47741
|
+
return isPlainObject$1(block) ? block : {};
|
|
47139
47742
|
}
|
|
47140
47743
|
function readStreamPolicy(block) {
|
|
47141
47744
|
const value = blockMembers(block)[STREAM_POLICY_KEY];
|
|
@@ -47310,7 +47913,7 @@ function streamTagsMatchDeclared(liveTags, desiredBlock) {
|
|
|
47310
47913
|
}
|
|
47311
47914
|
function canonicalJson(value) {
|
|
47312
47915
|
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(",")}}`;
|
|
47916
|
+
if (isPlainObject$1(value)) return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
|
|
47314
47917
|
return JSON.stringify(value) ?? "null";
|
|
47315
47918
|
}
|
|
47316
47919
|
|
|
@@ -47326,6 +47929,93 @@ const DRIFT_STRIPPED_INDEX_MEMBERS = [{
|
|
|
47326
47929
|
function maskLeafValue(value, maskSecrets) {
|
|
47327
47930
|
return maskDeep(value, maskSecrets);
|
|
47328
47931
|
}
|
|
47932
|
+
function isPlainObject(value) {
|
|
47933
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
47934
|
+
}
|
|
47935
|
+
const IDENTITY_KEYS = [
|
|
47936
|
+
"Region",
|
|
47937
|
+
"IndexName",
|
|
47938
|
+
"AttributeName"
|
|
47939
|
+
];
|
|
47940
|
+
function identityKeyOf(...lists) {
|
|
47941
|
+
const entries = lists.flat();
|
|
47942
|
+
if (entries.length === 0) return void 0;
|
|
47943
|
+
const key = IDENTITY_KEYS.find((candidate) => entries.every((entry) => isPlainObject(entry) && typeof entry[candidate] === "string"));
|
|
47944
|
+
if (key !== void 0) return { key };
|
|
47945
|
+
return entries.some((entry) => isPlainObject(entry) && IDENTITY_KEYS.some((candidate) => typeof entry[candidate] === "string")) ? "ambiguous" : void 0;
|
|
47946
|
+
}
|
|
47947
|
+
const POSITIONAL_LIST_KEYS = /* @__PURE__ */ new Set(["KeySchema"]);
|
|
47948
|
+
function projectNamed(live, own, wanted, path, unnamed) {
|
|
47949
|
+
if (isPlainObject(live) && (isPlainObject(own) || isPlainObject(wanted))) {
|
|
47950
|
+
const ownBag = isPlainObject(own) ? own : void 0;
|
|
47951
|
+
const wantedBag = isPlainObject(wanted) ? wanted : void 0;
|
|
47952
|
+
const out = {};
|
|
47953
|
+
for (const key of IDENTITY_KEYS) if (Object.hasOwn(live, key)) out[key] = live[key];
|
|
47954
|
+
const named = /* @__PURE__ */ new Set([...Object.keys(ownBag ?? {}), ...Object.keys(wantedBag ?? {})]);
|
|
47955
|
+
for (const key of named) {
|
|
47956
|
+
if (IDENTITY_KEYS.includes(key)) continue;
|
|
47957
|
+
if (key === "Tags") {
|
|
47958
|
+
if (ownBag !== void 0 && Object.hasOwn(ownBag, "Tags")) out["Tags"] = ownBag["Tags"];
|
|
47959
|
+
continue;
|
|
47960
|
+
}
|
|
47961
|
+
if (!Object.hasOwn(live, key) || live[key] === void 0) continue;
|
|
47962
|
+
out[key] = POSITIONAL_LIST_KEYS.has(key) ? live[key] : projectNamed(live[key], ownBag?.[key], wantedBag?.[key], `${path}.${key}`, unnamed);
|
|
47963
|
+
}
|
|
47964
|
+
return out;
|
|
47965
|
+
}
|
|
47966
|
+
if (Array.isArray(live)) {
|
|
47967
|
+
const ownList = Array.isArray(own) ? own : [];
|
|
47968
|
+
const wantedList = Array.isArray(wanted) ? wanted : [];
|
|
47969
|
+
const identity = identityKeyOf(live, ownList, wantedList);
|
|
47970
|
+
if (identity === void 0) return live;
|
|
47971
|
+
if (identity === "ambiguous") {
|
|
47972
|
+
unnamed.push({
|
|
47973
|
+
identity: "unkeyed entries",
|
|
47974
|
+
value: "some",
|
|
47975
|
+
path,
|
|
47976
|
+
ambiguous: true
|
|
47977
|
+
});
|
|
47978
|
+
return own;
|
|
47979
|
+
}
|
|
47980
|
+
const id = identity.key;
|
|
47981
|
+
const byId = (list) => new Map(list.map((entry) => [entry[id], entry]));
|
|
47982
|
+
const ownById = byId(ownList);
|
|
47983
|
+
const wantedById = byId(wantedList);
|
|
47984
|
+
return live.flatMap((entry) => {
|
|
47985
|
+
const value = entry[id];
|
|
47986
|
+
const ownEntry = ownById.get(value);
|
|
47987
|
+
const wantedEntry = wantedById.get(value);
|
|
47988
|
+
if (ownEntry === void 0 && wantedEntry === void 0) {
|
|
47989
|
+
unnamed.push({
|
|
47990
|
+
identity: id,
|
|
47991
|
+
value,
|
|
47992
|
+
path
|
|
47993
|
+
});
|
|
47994
|
+
return [];
|
|
47995
|
+
}
|
|
47996
|
+
return [projectNamed(entry, ownEntry, wantedEntry, `${path}[${value}]`, unnamed)];
|
|
47997
|
+
});
|
|
47998
|
+
}
|
|
47999
|
+
return live;
|
|
48000
|
+
}
|
|
48001
|
+
const strictReadScope = new AsyncLocalStorage();
|
|
48002
|
+
function strictFor(key) {
|
|
48003
|
+
return strictReadScope.getStore()?.has(key) === true;
|
|
48004
|
+
}
|
|
48005
|
+
function replicaStrictness(status) {
|
|
48006
|
+
const current = strictReadScope.getStore() ?? /* @__PURE__ */ new Set();
|
|
48007
|
+
if (status === void 0 || status === "ACTIVE" || status === "UPDATING") return current;
|
|
48008
|
+
return new Set([...current].filter((key) => key !== "Replicas"));
|
|
48009
|
+
}
|
|
48010
|
+
const unsettledScope = new AsyncLocalStorage();
|
|
48011
|
+
function markUnsettled(...keys) {
|
|
48012
|
+
const scope = unsettledScope.getStore();
|
|
48013
|
+
if (scope === void 0) return;
|
|
48014
|
+
for (const key of keys) scope.mark(key);
|
|
48015
|
+
}
|
|
48016
|
+
function isUnsettled(key) {
|
|
48017
|
+
return unsettledScope.getStore()?.unsettled.has(key) === true;
|
|
48018
|
+
}
|
|
47329
48019
|
function sentence(text) {
|
|
47330
48020
|
return text.endsWith(".") ? text : `${text}.`;
|
|
47331
48021
|
}
|
|
@@ -47548,6 +48238,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47548
48238
|
}
|
|
47549
48239
|
if (sdkIndexes.length > 0) createParams.GlobalSecondaryIndexes = sdkIndexes;
|
|
47550
48240
|
if (properties["LocalSecondaryIndexes"]) createParams.LocalSecondaryIndexes = properties["LocalSecondaryIndexes"];
|
|
48241
|
+
const createMode = readReplicationMode(properties);
|
|
48242
|
+
if (createMode.kind === "usable") createParams.GlobalTableSettingsReplicationMode = createMode.mode;
|
|
47551
48243
|
const sseEnabledRefusal = configBooleanRefusal(properties["SSESpecification"], "SSEEnabled", "AWS::DynamoDB::GlobalTable SSESpecification");
|
|
47552
48244
|
if (sseEnabledRefusal !== void 0) {
|
|
47553
48245
|
const onReplay = replayWarn(log, context).onUnusable;
|
|
@@ -47697,6 +48389,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47697
48389
|
if (tableClass !== void 0) create.TableClassOverride = tableClass;
|
|
47698
48390
|
const replicaUpdates = [{ Create: create }];
|
|
47699
48391
|
for (let attempt = 1;; attempt++) try {
|
|
48392
|
+
markUnsettled("Replicas");
|
|
47700
48393
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
47701
48394
|
TableName: tableName,
|
|
47702
48395
|
ReplicaUpdates: replicaUpdates
|
|
@@ -47722,6 +48415,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47722
48415
|
await this.writeReplicaDeletionProtection(tableName, region, enabled);
|
|
47723
48416
|
}
|
|
47724
48417
|
async writeReplicaDeletionProtection(tableName, region, enabled) {
|
|
48418
|
+
markUnsettled("Replicas");
|
|
47725
48419
|
await this.getRegionalClient(region).send(new UpdateTableCommand({
|
|
47726
48420
|
TableName: tableName,
|
|
47727
48421
|
DeletionProtectionEnabled: enabled
|
|
@@ -47796,6 +48490,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47796
48490
|
}
|
|
47797
48491
|
this.logger.debug(maskSecrets(`Bringing the ${region} replica of ${tableName} to its declared table class`));
|
|
47798
48492
|
try {
|
|
48493
|
+
markUnsettled("Replicas");
|
|
47799
48494
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
47800
48495
|
TableName: tableName,
|
|
47801
48496
|
ReplicaUpdates: [{ Update: {
|
|
@@ -47843,6 +48538,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47843
48538
|
request = built;
|
|
47844
48539
|
}
|
|
47845
48540
|
try {
|
|
48541
|
+
markUnsettled("SSESpecification", "Replicas");
|
|
47846
48542
|
await this.dynamoDBClient.send(new UpdateTableCommand(request));
|
|
47847
48543
|
await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
|
|
47848
48544
|
} catch (keyError) {
|
|
@@ -47885,6 +48581,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47885
48581
|
}
|
|
47886
48582
|
async applyReplicaSettings(tableName, logicalId, currentRegion, properties, previousProperties, freshRegions, streamReplaced, replaying, keepOnRemoval, previousLocalStreamArn, warn, maskSecrets) {
|
|
47887
48583
|
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
48584
|
+
const tableIndexNames = previousProperties === void 0 ? new Set(indexEntriesByName(properties["GlobalSecondaryIndexes"]).keys()) : void 0;
|
|
47888
48585
|
for (const entry of desired) {
|
|
47889
48586
|
const replica = asRecord(entry);
|
|
47890
48587
|
const region = replica?.["Region"];
|
|
@@ -47894,13 +48591,15 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47894
48591
|
const ops = planReplicaSettingOps(replica, previous, {
|
|
47895
48592
|
fresh,
|
|
47896
48593
|
streamReplaced,
|
|
47897
|
-
keepOnRemoval
|
|
48594
|
+
keepOnRemoval,
|
|
48595
|
+
...tableIndexNames !== void 0 && { tableIndexNames }
|
|
47898
48596
|
}, (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
48597
|
if (!fresh && keepOnRemoval.has("pitr") && replica?.["PointInTimeRecoverySpecification"] == null && (() => {
|
|
47900
48598
|
const prior = readPitrSpec(previous?.["PointInTimeRecoverySpecification"]);
|
|
47901
48599
|
return prior.kind === "usable" && prior.enabled;
|
|
47902
48600
|
})()) 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
48601
|
const unchanged = fresh ? /* @__PURE__ */ new Set() : declaredReplicaSettings(replica);
|
|
48602
|
+
unchanged.delete("indexContributorInsights");
|
|
47904
48603
|
for (const op of ops) unchanged.delete(settingOf(op));
|
|
47905
48604
|
if (ops.length === 0 && unchanged.size === 0) continue;
|
|
47906
48605
|
const client = region === currentRegion ? this.dynamoDBClient : this.getRegionalClient(region);
|
|
@@ -47927,7 +48626,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47927
48626
|
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
48627
|
if (region === currentRegion && streamReplaced && previousLocalStreamArn !== void 0 && streamPolicyChanged && (await describe()).streamArn !== previousLocalStreamArn) await this.deleteOldStreamPolicy(client, previousLocalStreamArn, tableName, warn, maskSecrets);
|
|
47929
48628
|
if (unchanged.size === 0) continue;
|
|
47930
|
-
const live = await this.readLiveReplicaSettings(client, tableName, region, unchanged, describe, maskSecrets);
|
|
48629
|
+
const live = await this.readLiveReplicaSettings(client, tableName, region, unchanged, describe, maskSecrets, replica);
|
|
47931
48630
|
for (const op of planReplicaSettingCorrections(replica, live, unchanged)) {
|
|
47932
48631
|
const member = SETTING_MEMBER[settingOf(op)];
|
|
47933
48632
|
this.logger.debug(maskSecrets(`Bringing the ${region} replica of ${tableName} to its declared ${member}`));
|
|
@@ -47941,7 +48640,60 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47941
48640
|
}
|
|
47942
48641
|
}
|
|
47943
48642
|
}
|
|
47944
|
-
async
|
|
48643
|
+
async sendReplicationMode(tableName, logicalId, mode, maskSecrets, fromTemplate = true) {
|
|
48644
|
+
this.logger.debug(maskSecrets(`Setting GlobalTableSettingsReplicationMode of ${tableName} to ${mode}`));
|
|
48645
|
+
await this.sendLocalSettingUpdate({
|
|
48646
|
+
TableName: tableName,
|
|
48647
|
+
GlobalTableSettingsReplicationMode: mode
|
|
48648
|
+
}, fromTemplate, "GlobalTableSettingsReplicationMode", tableName, logicalId, maskSecrets);
|
|
48649
|
+
}
|
|
48650
|
+
async applyReplicaIndexInsights(tableName, logicalId, currentRegion, properties, previousProperties, freshRegions, keepOnRemoval, replaying, warn, maskSecrets) {
|
|
48651
|
+
const tableIndexNames = new Set(indexEntriesByName(properties["GlobalSecondaryIndexes"]).keys());
|
|
48652
|
+
if (tableIndexNames.size === 0) return;
|
|
48653
|
+
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
48654
|
+
for (const entry of desired) {
|
|
48655
|
+
const replica = asRecord(entry);
|
|
48656
|
+
const region = replica?.["Region"];
|
|
48657
|
+
if (typeof region !== "string" || region === "") continue;
|
|
48658
|
+
const fresh = freshRegions.has(region);
|
|
48659
|
+
const ops = planReplicaIndexInsightsOps(replica, localReplicaEntry(previousProperties, region), {
|
|
48660
|
+
fresh,
|
|
48661
|
+
tableIndexNames,
|
|
48662
|
+
removes: (setting) => !keepOnRemoval.has(setting)
|
|
48663
|
+
}, (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.`)));
|
|
48664
|
+
const addressed = new Set(ops.flatMap((op) => op.kind === "indexContributorInsights" ? [op.indexName] : []));
|
|
48665
|
+
const declared = declaredIndexInsights(replica);
|
|
48666
|
+
const unchanged = fresh ? [] : [...declared.keys()].filter((name) => tableIndexNames.has(name) && !addressed.has(name));
|
|
48667
|
+
if (ops.length === 0 && unchanged.length === 0) continue;
|
|
48668
|
+
const client = region === currentRegion ? this.dynamoDBClient : this.getRegionalClient(region);
|
|
48669
|
+
await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets, { ...region !== currentRegion && { region } });
|
|
48670
|
+
await waitForIndexesSettled({
|
|
48671
|
+
tableName,
|
|
48672
|
+
logicalId,
|
|
48673
|
+
logger: maskedLogger(this.logger, maskSecrets, tableName),
|
|
48674
|
+
describeTable: () => client.send(new DescribeTableCommand({ TableName: tableName })),
|
|
48675
|
+
maxAttempts: 900,
|
|
48676
|
+
proceedNote: `setting the index's Contributor Insights may be refused.`
|
|
48677
|
+
});
|
|
48678
|
+
const describe = () => Promise.resolve({});
|
|
48679
|
+
for (const op of ops) await this.sendReplicaSettingOp(client, tableName, region, logicalId, op, describe, maskSecrets);
|
|
48680
|
+
if (unchanged.length === 0) continue;
|
|
48681
|
+
const replicaIndexes = indexEntriesByName(replica?.["GlobalSecondaryIndexes"]);
|
|
48682
|
+
const onlyUnchanged = {
|
|
48683
|
+
...replica,
|
|
48684
|
+
GlobalSecondaryIndexes: unchanged.map((name) => replicaIndexes.get(name))
|
|
48685
|
+
};
|
|
48686
|
+
const only = /* @__PURE__ */ new Set(["indexContributorInsights"]);
|
|
48687
|
+
const live = await this.readLiveReplicaSettings(client, tableName, region, only, describe, maskSecrets, onlyUnchanged);
|
|
48688
|
+
for (const op of planReplicaSettingCorrections(onlyUnchanged, live, only)) try {
|
|
48689
|
+
await this.sendReplicaSettingOp(client, tableName, region, logicalId, op, describe, maskSecrets);
|
|
48690
|
+
} catch (convergeError) {
|
|
48691
|
+
if (isInterruptedWaitError(convergeError)) throw convergeError;
|
|
48692
|
+
this.logger.warn(maskSecrets(`The ${region} replica of ${tableName} does not hold the declared ${SETTING_MEMBER.indexContributorInsights} of an index, and setting it failed (${describeAwsFailure(convergeError).summary}). The next deploy that updates this table tries again.`));
|
|
48693
|
+
}
|
|
48694
|
+
}
|
|
48695
|
+
}
|
|
48696
|
+
async readLiveReplicaSettings(client, tableName, region, wanted, describe, maskSecrets, declared) {
|
|
47945
48697
|
const live = {};
|
|
47946
48698
|
const attempt = async (what, read) => {
|
|
47947
48699
|
try {
|
|
@@ -47984,10 +48736,37 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
47984
48736
|
const answer = await hasPolicy((await describe()).streamArn);
|
|
47985
48737
|
if (answer !== void 0) live.hasStreamPolicy = answer;
|
|
47986
48738
|
});
|
|
48739
|
+
if (wanted.has("indexContributorInsights")) {
|
|
48740
|
+
const perIndex = /* @__PURE__ */ new Map();
|
|
48741
|
+
for (const indexName of declaredIndexInsights(declared).keys()) await attempt(`Contributor Insights of an index`, async () => {
|
|
48742
|
+
const status = (await client.send(new DescribeContributorInsightsCommand({
|
|
48743
|
+
TableName: tableName,
|
|
48744
|
+
IndexName: indexName
|
|
48745
|
+
}))).ContributorInsightsStatus;
|
|
48746
|
+
if (status === "ENABLED" || status === "DISABLED") perIndex.set(indexName, status === "ENABLED");
|
|
48747
|
+
});
|
|
48748
|
+
live.indexContributorInsightsEnabled = perIndex;
|
|
48749
|
+
}
|
|
48750
|
+
if (wanted.has("streamTags")) await attempt("the stream tags", async () => {
|
|
48751
|
+
const arn = (await describe()).streamArn;
|
|
48752
|
+
if (arn === void 0) return;
|
|
48753
|
+
const tags = /* @__PURE__ */ new Map();
|
|
48754
|
+
let nextToken;
|
|
48755
|
+
do {
|
|
48756
|
+
const out = await client.send(new ListTagsOfResourceCommand({
|
|
48757
|
+
ResourceArn: arn,
|
|
48758
|
+
NextToken: nextToken
|
|
48759
|
+
}));
|
|
48760
|
+
for (const t of out.Tags ?? []) if (t.Key !== void 0) tags.set(t.Key, t.Value ?? "");
|
|
48761
|
+
nextToken = out.NextToken;
|
|
48762
|
+
} while (nextToken !== void 0);
|
|
48763
|
+
live.streamTags = tags;
|
|
48764
|
+
});
|
|
47987
48765
|
return live;
|
|
47988
48766
|
}
|
|
47989
48767
|
async deleteOldStreamPolicy(client, streamArn, tableName, warn, maskSecrets) {
|
|
47990
48768
|
try {
|
|
48769
|
+
markUnsettled("Replicas");
|
|
47991
48770
|
await this.retrySettlingRefusal(() => client.send(new DeleteResourcePolicyCommand({ ResourceArn: streamArn })), `delete the policy of the retired stream of ${tableName}`, maskSecrets);
|
|
47992
48771
|
} catch (error) {
|
|
47993
48772
|
if (isInterruptedWaitError(error)) throw error;
|
|
@@ -48038,7 +48817,10 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48038
48817
|
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
48818
|
return arn;
|
|
48040
48819
|
};
|
|
48041
|
-
const send = (call) =>
|
|
48820
|
+
const send = (call) => {
|
|
48821
|
+
markUnsettled("Replicas");
|
|
48822
|
+
return this.retrySettlingRefusal(call, `${op.kind} on ${scope}`, maskSecrets);
|
|
48823
|
+
};
|
|
48042
48824
|
switch (op.kind) {
|
|
48043
48825
|
case "pitr":
|
|
48044
48826
|
await send(() => client.send(new UpdateContinuousBackupsCommand({
|
|
@@ -48106,6 +48888,31 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48106
48888
|
}
|
|
48107
48889
|
break;
|
|
48108
48890
|
}
|
|
48891
|
+
case "indexContributorInsights":
|
|
48892
|
+
await send(() => client.send(new UpdateContributorInsightsCommand({
|
|
48893
|
+
TableName: tableName,
|
|
48894
|
+
IndexName: op.indexName,
|
|
48895
|
+
ContributorInsightsAction: op.action,
|
|
48896
|
+
...op.mode !== void 0 && { ContributorInsightsMode: op.mode }
|
|
48897
|
+
})));
|
|
48898
|
+
break;
|
|
48899
|
+
case "untagStream": {
|
|
48900
|
+
if ((await describe()).streamArn === void 0) break;
|
|
48901
|
+
const arn = await arnFor("streamArn");
|
|
48902
|
+
await send(() => client.send(new UntagResourceCommand$2({
|
|
48903
|
+
ResourceArn: arn,
|
|
48904
|
+
TagKeys: op.keys
|
|
48905
|
+
})));
|
|
48906
|
+
break;
|
|
48907
|
+
}
|
|
48908
|
+
case "tagStream": {
|
|
48909
|
+
const arn = await arnFor("streamArn");
|
|
48910
|
+
await send(() => client.send(new TagResourceCommand$2({
|
|
48911
|
+
ResourceArn: arn,
|
|
48912
|
+
Tags: op.tags
|
|
48913
|
+
})));
|
|
48914
|
+
break;
|
|
48915
|
+
}
|
|
48109
48916
|
}
|
|
48110
48917
|
this.logger.debug(maskSecrets(`Applied ${op.kind} to ${scope}`));
|
|
48111
48918
|
}
|
|
@@ -48131,6 +48938,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48131
48938
|
}
|
|
48132
48939
|
async sendLocalSettingUpdate(input, fromTemplate, what, tableName, logicalId, maskSecrets) {
|
|
48133
48940
|
try {
|
|
48941
|
+
markUnsettled(input.SSESpecification !== void 0 ? "SSESpecification" : "Replicas");
|
|
48134
48942
|
await this.dynamoDBClient.send(new UpdateTableCommand(input));
|
|
48135
48943
|
await this.waitForGlobalTableSettled(tableName, logicalId, maskSecrets);
|
|
48136
48944
|
} catch (error) {
|
|
@@ -48237,6 +49045,12 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48237
49045
|
}
|
|
48238
49046
|
}
|
|
48239
49047
|
async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
49048
|
+
return unsettledScope.run({
|
|
49049
|
+
mark: (key) => context?.markUnsettled?.(key),
|
|
49050
|
+
unsettled: context?.unsettledProperties ?? /* @__PURE__ */ new Set()
|
|
49051
|
+
}, () => this.updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context));
|
|
49052
|
+
}
|
|
49053
|
+
async updateInScope(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
48240
49054
|
if (context?.desiredFromAwsReadback === true) properties = keepUnreadReplicaMembers(properties, previousProperties);
|
|
48241
49055
|
const log = this.operationSinks(context, [[properties["TableName"], physicalId], [previousProperties["TableName"], physicalId]]);
|
|
48242
49056
|
const maskSecrets = log.mask;
|
|
@@ -48283,7 +49097,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48283
49097
|
physicalName: physicalId
|
|
48284
49098
|
})) throw new ProvisioningError(log.mask(`TableName is immutable on AWS::DynamoDB::GlobalTable; ${await replaceRemedy()}`), resourceType, logicalId, physicalId);
|
|
48285
49099
|
if (properties["KeySchema"] !== void 0 && previousProperties["KeySchema"] !== void 0 && !deepEqual(properties["KeySchema"], previousProperties["KeySchema"])) throw new ProvisioningError(log.mask(`KeySchema is immutable on AWS::DynamoDB::GlobalTable; ${await replaceRemedy()}`), resourceType, logicalId, physicalId);
|
|
48286
|
-
if (
|
|
49100
|
+
if (!deepEqual(lsiListOrEmpty(properties["LocalSecondaryIndexes"]), lsiListOrEmpty(previousProperties["LocalSecondaryIndexes"]))) throw new ProvisioningError(log.mask(`LocalSecondaryIndexes is immutable on AWS::DynamoDB::GlobalTable; ${await replaceRemedy()}`), resourceType, logicalId, physicalId);
|
|
48287
49101
|
const oldAttrs = previousProperties["AttributeDefinitions"] ?? [];
|
|
48288
49102
|
const newAttrs = properties["AttributeDefinitions"] ?? [];
|
|
48289
49103
|
const desiredKeyAttrNames = collectDesiredKeyAttributeNames(properties);
|
|
@@ -48463,6 +49277,9 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48463
49277
|
flatChanged = true;
|
|
48464
49278
|
}
|
|
48465
49279
|
if (flatChanged) {
|
|
49280
|
+
if (flatUpdate.DeletionProtectionEnabled !== void 0) markUnsettled("Replicas");
|
|
49281
|
+
if (flatUpdate.StreamSpecification !== void 0) markUnsettled("StreamSpecification");
|
|
49282
|
+
if (flatUpdate.OnDemandThroughput !== void 0) markUnsettled("WriteOnDemandThroughputSettings");
|
|
48466
49283
|
await this.dynamoDBClient.send(new UpdateTableCommand(flatUpdate));
|
|
48467
49284
|
await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
|
|
48468
49285
|
}
|
|
@@ -48518,10 +49335,13 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48518
49335
|
}
|
|
48519
49336
|
if (indexUpdates.length > 0) billingUpdate.GlobalSecondaryIndexUpdates = indexUpdates;
|
|
48520
49337
|
}
|
|
49338
|
+
markUnsettled("BillingMode", "WriteProvisionedThroughputSettings");
|
|
49339
|
+
if (billingUpdate.GlobalSecondaryIndexUpdates !== void 0) markUnsettled("GlobalSecondaryIndexes");
|
|
48521
49340
|
await this.dynamoDBClient.send(new UpdateTableCommand(billingUpdate));
|
|
48522
49341
|
await this.waitForTableActiveAfterUpdate(physicalId, logicalId, void 0, void 0, maskSecrets);
|
|
48523
49342
|
}
|
|
48524
49343
|
if (deferCeilingsPastFlip) {
|
|
49344
|
+
markUnsettled("WriteOnDemandThroughputSettings");
|
|
48525
49345
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48526
49346
|
TableName: physicalId,
|
|
48527
49347
|
OnDemandThroughput: onDemandPayload
|
|
@@ -48539,6 +49359,8 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48539
49359
|
region: currentRegion
|
|
48540
49360
|
}));
|
|
48541
49361
|
}
|
|
49362
|
+
const modeUpdate = replicationModeUpdate(properties, previousProperties);
|
|
49363
|
+
if (modeUpdate === "DISABLED" && readReplicationMode(properties).kind === "absent") await this.sendReplicationMode(physicalId, logicalId, modeUpdate, maskSecrets);
|
|
48542
49364
|
const replicaDiff = diffReplicas(previousProperties["Replicas"] ?? [], properties["Replicas"] ?? []);
|
|
48543
49365
|
for (const replica of replicaDiff.removed) {
|
|
48544
49366
|
const region = replica["Region"];
|
|
@@ -48552,6 +49374,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48552
49374
|
region
|
|
48553
49375
|
}));
|
|
48554
49376
|
}
|
|
49377
|
+
markUnsettled("Replicas");
|
|
48555
49378
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48556
49379
|
TableName: physicalId,
|
|
48557
49380
|
ReplicaUpdates: [{ Delete: { RegionName: region } }]
|
|
@@ -48611,6 +49434,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48611
49434
|
debug(`Cross-region replica ${region} of ${maskSecrets(physicalId)}: only Tags-style changes detected; UpdateReplica skipped (AWS rejects empty Update actions). Tags propagation handled above via per-region client.`);
|
|
48612
49435
|
continue;
|
|
48613
49436
|
}
|
|
49437
|
+
markUnsettled("Replicas");
|
|
48614
49438
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48615
49439
|
TableName: physicalId,
|
|
48616
49440
|
ReplicaUpdates: [{ Update: updateAction }]
|
|
@@ -48618,16 +49442,24 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48618
49442
|
await this.waitForReplicaActive(physicalId, region, logicalId, void 0, maskSecrets);
|
|
48619
49443
|
}
|
|
48620
49444
|
const addedReplicaRegions = new Set(replicaDiff.added.map((r) => r["Region"]));
|
|
49445
|
+
if (modeUpdate !== void 0 && readReplicationMode(properties).kind === "usable") await this.sendReplicationMode(physicalId, logicalId, modeUpdate, maskSecrets);
|
|
49446
|
+
else {
|
|
49447
|
+
const correction = replicationModeCorrection(properties, previousProperties, describeResp.Table?.GlobalTableSettingsReplicationMode);
|
|
49448
|
+
if (correction !== void 0) await this.sendReplicationMode(physicalId, logicalId, correction, maskSecrets, false);
|
|
49449
|
+
}
|
|
48621
49450
|
await this.convergeReplicaDeletionProtection(physicalId, logicalId, currentRegion, previousProperties, properties, addedReplicaRegions, context?.desiredFromAwsReadback === true, warn, maskSecrets);
|
|
48622
49451
|
await this.convergeReplicaSettings(physicalId, logicalId, currentRegion, properties, addedReplicaRegions, maskSecrets);
|
|
48623
49452
|
await this.applyReplicaKeys(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, deferredSseUpdate, deferredSseFromTemplate, keylessSseFromTemplate, maskSecrets);
|
|
48624
|
-
|
|
49453
|
+
const replicaKeepOnRemoval = new Set(context?.desiredFromAwsReadback === true ? [
|
|
48625
49454
|
"pitr",
|
|
48626
49455
|
"contributorInsights",
|
|
48627
49456
|
"kinesis",
|
|
48628
49457
|
"tablePolicy",
|
|
48629
|
-
"streamPolicy"
|
|
48630
|
-
|
|
49458
|
+
"streamPolicy",
|
|
49459
|
+
"indexContributorInsights",
|
|
49460
|
+
"streamTags"
|
|
49461
|
+
] : context?.replayingState === true ? ["pitr"] : []);
|
|
49462
|
+
await this.applyReplicaSettings(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, !deepEqual(asRecord(properties["StreamSpecification"])?.["StreamViewType"], asRecord(previousProperties["StreamSpecification"])?.["StreamViewType"]), context?.replayingState === true || context?.desiredFromAwsReadback === true, replicaKeepOnRemoval, describeResp.Table?.LatestStreamArn, warn, maskSecrets);
|
|
48631
49463
|
const previousTranslatedIndexes = toSdkGlobalSecondaryIndexes(previousProperties, currentRegion, oldBilling, "min", void 0, onUnusablePreviousGsiBlock, maskSecrets);
|
|
48632
49464
|
const previousSdkIndexes = previousGsiUnusable ? buildLiveRecoveryGsiBaseline(desiredSdkIndexes, describeResp.Table?.GlobalSecondaryIndexes, {
|
|
48633
49465
|
carryLiveValues: oldBilling === newBilling && liveBillingMode === newBilling,
|
|
@@ -48650,6 +49482,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48650
49482
|
for (const gsi of gsiDiff.removed) {
|
|
48651
49483
|
if (!gsi.IndexName) continue;
|
|
48652
49484
|
const gsiUpdate = { Delete: { IndexName: gsi.IndexName } };
|
|
49485
|
+
markUnsettled("GlobalSecondaryIndexes");
|
|
48653
49486
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48654
49487
|
TableName: physicalId,
|
|
48655
49488
|
GlobalSecondaryIndexUpdates: [gsiUpdate]
|
|
@@ -48667,6 +49500,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48667
49500
|
...gsi.OnDemandThroughput && { OnDemandThroughput: gsi.OnDemandThroughput },
|
|
48668
49501
|
...addedWarmToSend && { WarmThroughput: addedWarmToSend }
|
|
48669
49502
|
} };
|
|
49503
|
+
markUnsettled("GlobalSecondaryIndexes");
|
|
48670
49504
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48671
49505
|
TableName: physicalId,
|
|
48672
49506
|
AttributeDefinitions: newAttrs,
|
|
@@ -48707,6 +49541,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48707
49541
|
continue;
|
|
48708
49542
|
}
|
|
48709
49543
|
const gsiUpdate = { Update: update };
|
|
49544
|
+
markUnsettled("GlobalSecondaryIndexes");
|
|
48710
49545
|
await this.dynamoDBClient.send(new UpdateTableCommand({
|
|
48711
49546
|
TableName: physicalId,
|
|
48712
49547
|
GlobalSecondaryIndexUpdates: [gsiUpdate]
|
|
@@ -48720,6 +49555,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48720
49555
|
if (gsiDiff.added.length > 0) await this.waitForIndexesActive(physicalId, logicalId, { maskSecrets });
|
|
48721
49556
|
await this.reconcileAutoScalingTargets(physicalId, collectAutoScalingTargets(previousProperties, currentRegion), newBilling === "PAY_PER_REQUEST" ? [] : collectAutoScalingTargets(properties, currentRegion), currentRegion, autoScalingApplied, maskSecrets);
|
|
48722
49557
|
}
|
|
49558
|
+
await this.applyReplicaIndexInsights(physicalId, logicalId, currentRegion, properties, previousProperties, addedReplicaRegions, replicaKeepOnRemoval, context?.replayingState === true || context?.desiredFromAwsReadback === true, warn, maskSecrets);
|
|
48723
49559
|
if (!deepEqual(properties["TimeToLiveSpecification"], previousProperties["TimeToLiveSpecification"])) {
|
|
48724
49560
|
const sendTtl = async (cmd) => {
|
|
48725
49561
|
try {
|
|
@@ -48754,13 +49590,16 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48754
49590
|
attributeName: live.AttributeName
|
|
48755
49591
|
};
|
|
48756
49592
|
}
|
|
48757
|
-
if (ttlTarget)
|
|
48758
|
-
|
|
48759
|
-
|
|
48760
|
-
|
|
48761
|
-
|
|
48762
|
-
|
|
48763
|
-
|
|
49593
|
+
if (ttlTarget) {
|
|
49594
|
+
markUnsettled("TimeToLiveSpecification");
|
|
49595
|
+
await sendTtl(new UpdateTimeToLiveCommand({
|
|
49596
|
+
TableName: physicalId,
|
|
49597
|
+
TimeToLiveSpecification: {
|
|
49598
|
+
Enabled: ttlTarget.enabled,
|
|
49599
|
+
AttributeName: ttlTarget.attributeName
|
|
49600
|
+
}
|
|
49601
|
+
}));
|
|
49602
|
+
}
|
|
48764
49603
|
}
|
|
48765
49604
|
const finalDescribe = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: physicalId }));
|
|
48766
49605
|
const impliedStream = replicationImpliedStreamSpecification(properties);
|
|
@@ -48791,7 +49630,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48791
49630
|
}
|
|
48792
49631
|
async applyCrossRegionReplicaTagsDiff(tableArn, region, oldTags, newTags, resourceType, logicalId, physicalIdForLogs, maskSecrets = (text) => text) {
|
|
48793
49632
|
const warn = (message) => this.logger.warn(maskSecrets(message));
|
|
48794
|
-
if (deepEqual(oldTags, newTags)) return;
|
|
49633
|
+
if (deepEqual(oldTags, newTags) && !isUnsettled("Replicas")) return;
|
|
48795
49634
|
if (!tableArn) {
|
|
48796
49635
|
warn(`Local DescribeTable returned no TableArn — cannot propagate Tags to cross-region replica ${region} of ${physicalIdForLogs}`);
|
|
48797
49636
|
return;
|
|
@@ -48812,11 +49651,12 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48812
49651
|
const plan = planTagDiff(oldTagsRaw, newTagsRaw);
|
|
48813
49652
|
const tagWarning = tagPlanWarning(plan, resourceType, id);
|
|
48814
49653
|
if (tagWarning !== void 0) this.logger.warn(maskSecrets(tagWarning));
|
|
48815
|
-
const tagsToAdd = [...plan.set].map(([k, v]) => ({
|
|
49654
|
+
const tagsToAdd = [...isUnsettled("Replicas") ? planTagDiff(void 0, newTagsRaw).set : plan.set].map(([k, v]) => ({
|
|
48816
49655
|
Key: k,
|
|
48817
49656
|
Value: v
|
|
48818
49657
|
}));
|
|
48819
49658
|
const tagsToRemove = plan.remove;
|
|
49659
|
+
if (tagsToRemove.length > 0 || tagsToAdd.length > 0) markUnsettled("Replicas");
|
|
48820
49660
|
if (tagsToRemove.length > 0) {
|
|
48821
49661
|
await client.send(new UntagResourceCommand$2({
|
|
48822
49662
|
ResourceArn: tableArn,
|
|
@@ -48833,6 +49673,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48833
49673
|
}
|
|
48834
49674
|
}
|
|
48835
49675
|
async applyAutoScalingDiff(tableName, dimension, oldSettings, newSettings, client, indexName, budget, maskSecrets = (text) => text, progress) {
|
|
49676
|
+
const autoScalingKey = indexName !== void 0 ? "GlobalSecondaryIndexes" : dimension.includes("Write") ? "WriteProvisionedThroughputSettings" : "Replicas";
|
|
48836
49677
|
const warn = (message) => this.logger.warn(maskSecrets(message));
|
|
48837
49678
|
const asMaxRetries = autoScalingRetriesWithinDeleteBudget(budget, 8);
|
|
48838
49679
|
const metricType = dimension.endsWith("WriteCapacityUnits") ? "DynamoDBWriteCapacityUtilization" : "DynamoDBReadCapacityUtilization";
|
|
@@ -48852,6 +49693,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48852
49693
|
return;
|
|
48853
49694
|
}
|
|
48854
49695
|
try {
|
|
49696
|
+
markUnsettled(autoScalingKey);
|
|
48855
49697
|
await withRetry(() => asClient.send(new RegisterScalableTargetCommand({
|
|
48856
49698
|
ServiceNamespace: "dynamodb",
|
|
48857
49699
|
ResourceId: resourceId,
|
|
@@ -48892,6 +49734,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48892
49734
|
}
|
|
48893
49735
|
if (tttCfg["DisableScaleIn"] !== void 0) targetTrackingConfig["DisableScaleIn"] = Boolean(tttCfg["DisableScaleIn"]);
|
|
48894
49736
|
try {
|
|
49737
|
+
markUnsettled(autoScalingKey);
|
|
48895
49738
|
await withRetry(() => asClient.send(new PutScalingPolicyCommand({
|
|
48896
49739
|
PolicyName: policyName,
|
|
48897
49740
|
ServiceNamespace: "dynamodb",
|
|
@@ -48920,6 +49763,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48920
49763
|
return name === "ObjectNotFoundException" || msg.includes("No scaling policy found") || msg.includes("No scalable target found");
|
|
48921
49764
|
};
|
|
48922
49765
|
try {
|
|
49766
|
+
markUnsettled(autoScalingKey);
|
|
48923
49767
|
await withRetry(() => asClient.send(new DeleteScalingPolicyCommand({
|
|
48924
49768
|
PolicyName: policyName,
|
|
48925
49769
|
ServiceNamespace: "dynamodb",
|
|
@@ -48939,6 +49783,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
48939
49783
|
if (!isObjectNotFound(err)) warn(`Could not delete auto-scaling policy on ${tableName} (${dimension}): ${describeAwsFailure(err).detail}. Run: ${pasteableAwsCommand(maskSecrets)`aws application-autoscaling delete-scaling-policy --policy-name ${policyName} --service-namespace dynamodb --resource-id ${resourceId} --scalable-dimension ${dimension}`.render()}`);
|
|
48940
49784
|
}
|
|
48941
49785
|
try {
|
|
49786
|
+
markUnsettled(autoScalingKey);
|
|
48942
49787
|
await withRetry(() => asClient.send(new DeregisterScalableTargetCommand({
|
|
48943
49788
|
ServiceNamespace: "dynamodb",
|
|
48944
49789
|
ResourceId: resourceId,
|
|
@@ -49243,6 +50088,44 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49243
50088
|
throw err;
|
|
49244
50089
|
}
|
|
49245
50090
|
}
|
|
50091
|
+
async readUnsettled(physicalId, logicalId, resourceType, names, recordedProperties, desiredProperties) {
|
|
50092
|
+
const live = await strictReadScope.run(names, () => this.readCurrentState(physicalId, logicalId, resourceType, recordedProperties));
|
|
50093
|
+
if (typeof live !== "object" || live === null) return live;
|
|
50094
|
+
const out = { ...live };
|
|
50095
|
+
if (out["BillingMode"] === "PAY_PER_REQUEST") delete out["WriteProvisionedThroughputSettings"];
|
|
50096
|
+
const unnamed = [];
|
|
50097
|
+
for (const name of names) {
|
|
50098
|
+
if (!Object.hasOwn(out, name)) continue;
|
|
50099
|
+
out[name] = projectNamed(out[name], recordedProperties?.[name], desiredProperties?.[name], name, unnamed);
|
|
50100
|
+
}
|
|
50101
|
+
for (const entry of unnamed.filter((e) => e.ambiguous === true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS has entries cdkd cannot key by an identity, so convergence keeps the recorded ${entry.path} rather than risk removing an entry neither the record nor the template declares. Check it with 'cdkd drift'.`);
|
|
50102
|
+
for (const entry of unnamed.filter((e) => e.ambiguous !== true)) this.logger.warn(safeMsg`${logicalId} (${resourceType}): ${entry.path} on AWS holds ${entry.identity} ${entry.value}, which neither the record nor the template declares, so cdkd leaves it in place. If the failed update added it and it should not be there, remove it by hand (for a replica: aws dynamodb update-table --replica-updates Delete; for an index: --global-secondary-index-updates Delete).`);
|
|
50103
|
+
return out;
|
|
50104
|
+
}
|
|
50105
|
+
async unsettledInTransition(physicalId, _logicalId, _resourceType, names) {
|
|
50106
|
+
const MOVING = /* @__PURE__ */ new Set([
|
|
50107
|
+
"CREATING",
|
|
50108
|
+
"UPDATING",
|
|
50109
|
+
"DELETING"
|
|
50110
|
+
]);
|
|
50111
|
+
try {
|
|
50112
|
+
const table = (await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: physicalId }))).Table;
|
|
50113
|
+
const moving = /* @__PURE__ */ new Set();
|
|
50114
|
+
if (table?.TableStatus !== void 0 && MOVING.has(table.TableStatus)) {
|
|
50115
|
+
for (const name of names) if (name !== "TimeToLiveSpecification") moving.add(name);
|
|
50116
|
+
}
|
|
50117
|
+
if (names.has("Replicas") && (table?.Replicas ?? []).some((replica) => replica.ReplicaStatus !== void 0 && MOVING.has(replica.ReplicaStatus))) moving.add("Replicas");
|
|
50118
|
+
if (names.has("GlobalSecondaryIndexes") && (table?.GlobalSecondaryIndexes ?? []).some((index) => index.IndexStatus !== void 0 && MOVING.has(index.IndexStatus))) moving.add("GlobalSecondaryIndexes");
|
|
50119
|
+
const sse = table?.SSEDescription?.Status;
|
|
50120
|
+
if (names.has("SSESpecification") && (sse === "ENABLING" || sse === "DISABLING" || sse === "UPDATING")) moving.add("SSESpecification");
|
|
50121
|
+
if (names.has("TimeToLiveSpecification")) {
|
|
50122
|
+
if ((await this.dynamoDBClient.send(new DescribeTimeToLiveCommand({ TableName: physicalId }))).TimeToLiveDescription?.TimeToLiveStatus === "ENABLING") moving.add("TimeToLiveSpecification");
|
|
50123
|
+
}
|
|
50124
|
+
return moving;
|
|
50125
|
+
} catch {
|
|
50126
|
+
return names;
|
|
50127
|
+
}
|
|
50128
|
+
}
|
|
49246
50129
|
async readCurrentState(physicalId, _logicalId, _resourceType, properties, context) {
|
|
49247
50130
|
const afterOwnWrite = context?.afterOwnWrite === true;
|
|
49248
50131
|
try {
|
|
@@ -49267,7 +50150,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49267
50150
|
const currentRegion = await this.dynamoDBClient.config.region() ?? "";
|
|
49268
50151
|
const tableNameForSubs = table.TableName ?? physicalId;
|
|
49269
50152
|
const sdkReplicas = table.Replicas && table.Replicas.length > 0 ? currentRegion && !table.Replicas.some((r) => r.RegionName === currentRegion) ? [...table.Replicas, { RegionName: currentRegion }] : table.Replicas : [{ RegionName: currentRegion }];
|
|
49270
|
-
const replicas = await Promise.all(sdkReplicas.map(async (r) => {
|
|
50153
|
+
const replicas = await Promise.all(sdkReplicas.map(async (r) => strictReadScope.run(replicaStrictness(r.ReplicaStatus), async () => {
|
|
49271
50154
|
const entry = { Region: r.RegionName };
|
|
49272
50155
|
if (!r.RegionName) return entry;
|
|
49273
50156
|
const isLocal = r.RegionName === currentRegion;
|
|
@@ -49290,6 +50173,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49290
50173
|
protection = regional.Table?.DeletionProtectionEnabled;
|
|
49291
50174
|
streamArn = regional.Table?.LatestStreamArn;
|
|
49292
50175
|
} catch (err) {
|
|
50176
|
+
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
49293
50177
|
if (err instanceof ResourceNotFoundException$1) this.logger.debug(safeMsg`Cross-region replica ${regionLabel} returned RNF on DescribeTable; omitting its protection and stream policy`);
|
|
49294
50178
|
else this.logger.debug(safeMsg`Could not read the ${regionLabel} replica of ${tableNameForSubs}: ${describeAwsFailure(err).detail}`);
|
|
49295
50179
|
}
|
|
@@ -49299,6 +50183,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49299
50183
|
const tagsResp = await client.send(new ListTagsOfResourceCommand({ ResourceArn: replicaArn }));
|
|
49300
50184
|
entry["Tags"] = normalizeAwsTagsToCfn(tagsResp.Tags);
|
|
49301
50185
|
} catch (tagErr) {
|
|
50186
|
+
if (strictFor("Replicas") && !(tagErr instanceof ResourceNotFoundException$1)) throw tagErr;
|
|
49302
50187
|
if (tagErr instanceof ResourceNotFoundException$1) {
|
|
49303
50188
|
if (isLocal) throw tagErr;
|
|
49304
50189
|
this.logger.debug(`Cross-region replica ${regionLabel} returned RNF on ListTagsOfResource; omitting Tags`);
|
|
@@ -49315,7 +50200,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49315
50200
|
if (readAutoScaling) entry["ReadProvisionedThroughputSettings"] = { ReadCapacityAutoScalingSettings: readAutoScaling };
|
|
49316
50201
|
}
|
|
49317
50202
|
return entry;
|
|
49318
|
-
}));
|
|
50203
|
+
})));
|
|
49319
50204
|
result["Replicas"] = replicas;
|
|
49320
50205
|
const localReplica = replicas.find((r) => r["Region"] === currentRegion);
|
|
49321
50206
|
if (table.GlobalSecondaryIndexes && table.GlobalSecondaryIndexes.length > 0) {
|
|
@@ -49371,6 +50256,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49371
50256
|
};
|
|
49372
50257
|
else if (ttlStatus === "DISABLED") {}
|
|
49373
50258
|
} catch (ttlErr) {
|
|
50259
|
+
if (strictFor("TimeToLiveSpecification")) throw ttlErr;
|
|
49374
50260
|
this.logger.debug(`Could not read TimeToLive for ${tableNameForSubs}: ${describeAwsFailure(ttlErr).detail}`);
|
|
49375
50261
|
}
|
|
49376
50262
|
return result;
|
|
@@ -49386,6 +50272,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49386
50272
|
const block = reverseMapReplicaContributorInsights(ci.ContributorInsightsStatus, ci.ContributorInsightsMode, declaredReplica?.["ContributorInsightsSpecification"]);
|
|
49387
50273
|
if (block !== void 0) out["ContributorInsightsSpecification"] = block;
|
|
49388
50274
|
} catch (err) {
|
|
50275
|
+
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
49389
50276
|
this.logger.debug(`Could not read ContributorInsights for ${tableName} in ${regionLabel}: ${describeAwsFailure(err).detail}`);
|
|
49390
50277
|
}
|
|
49391
50278
|
try {
|
|
@@ -49393,6 +50280,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49393
50280
|
const block = reverseMapReplicaPitr(description?.PointInTimeRecoveryStatus, description?.RecoveryPeriodInDays, declaredReplica?.["PointInTimeRecoverySpecification"]);
|
|
49394
50281
|
if (block !== void 0) out["PointInTimeRecoverySpecification"] = block;
|
|
49395
50282
|
} catch (err) {
|
|
50283
|
+
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
49396
50284
|
this.logger.debug(`Could not read PointInTimeRecovery for ${tableName} in ${regionLabel}: ${describeAwsFailure(err).detail}`);
|
|
49397
50285
|
}
|
|
49398
50286
|
try {
|
|
@@ -49403,6 +50291,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49403
50291
|
out["KinesisStreamSpecification"] = ksOut;
|
|
49404
50292
|
}
|
|
49405
50293
|
} catch (err) {
|
|
50294
|
+
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
49406
50295
|
this.logger.debug(`Could not read KinesisStreamingDestination for ${tableName} in ${regionLabel}: ${describeAwsFailure(err).detail}`);
|
|
49407
50296
|
}
|
|
49408
50297
|
return out;
|
|
@@ -49440,6 +50329,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49440
50329
|
}
|
|
49441
50330
|
return reverseMapStreamPolicy(live, container);
|
|
49442
50331
|
} catch (err) {
|
|
50332
|
+
if (strictFor("Replicas") && !(err instanceof ResourceNotFoundException$1)) throw err;
|
|
49443
50333
|
this.logger.debug(safeMsg`Could not read the ${what} of the ${regionLabel} replica of ${tableName}: ${describeAwsFailure(err).detail}`);
|
|
49444
50334
|
if (afterOwnWrite && last !== void 0 && last !== "") return reverseMapStreamPolicy(last, container);
|
|
49445
50335
|
if (afterOwnWrite && (isThrottlingError(err) || isTransientServerError(err) || isAmbiguousOutcomeError(err) || err instanceof ResourceNotFoundException$1)) return declaredMember();
|
|
@@ -49488,6 +50378,7 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
49488
50378
|
TargetTrackingScalingPolicyConfiguration: tttConfig
|
|
49489
50379
|
};
|
|
49490
50380
|
} catch (err) {
|
|
50381
|
+
if (strictFor(indexName !== void 0 ? "GlobalSecondaryIndexes" : scalableDimension.includes("Write") ? "WriteProvisionedThroughputSettings" : "Replicas")) throw err;
|
|
49491
50382
|
this.logger.debug(`Could not read application-autoscaling settings for ${resourceId} (${scalableDimension}): ${describeAwsFailure(err).detail}`);
|
|
49492
50383
|
return null;
|
|
49493
50384
|
}
|
|
@@ -49707,9 +50598,48 @@ const REPLICA_SETTING_MEMBERS = [
|
|
|
49707
50598
|
"ContributorInsightsSpecification",
|
|
49708
50599
|
"KinesisStreamSpecification",
|
|
49709
50600
|
"ResourcePolicy",
|
|
49710
|
-
"ReplicaStreamSpecification"
|
|
50601
|
+
"ReplicaStreamSpecification",
|
|
50602
|
+
"GlobalSecondaryIndexes"
|
|
49711
50603
|
];
|
|
50604
|
+
const REPLICATION_MODE_KEY = "GlobalTableSettingsReplicationMode";
|
|
50605
|
+
function readReplicationMode(properties) {
|
|
50606
|
+
const replicas = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
50607
|
+
const declared = replicas.map((entry) => asRecord(entry)?.[REPLICATION_MODE_KEY]).filter((value) => value !== void 0 && value !== null);
|
|
50608
|
+
if (declared.length === 0) return { kind: "absent" };
|
|
50609
|
+
const [first] = declared;
|
|
50610
|
+
if (typeof first !== "string" || first === "" || declared.some((v) => v !== first)) return {
|
|
50611
|
+
kind: "unusable",
|
|
50612
|
+
reason: `Replicas[].${REPLICATION_MODE_KEY} must be one non-empty string`
|
|
50613
|
+
};
|
|
50614
|
+
if (replicas.length !== 1) return {
|
|
50615
|
+
kind: "unusable",
|
|
50616
|
+
reason: `Replicas[].${REPLICATION_MODE_KEY} can be declared only on a table with exactly one replica, as CloudFormation refuses it ("GlobalTableSettingsReplicationMode can be specified when exactly one replica is present"); remove it, or keep one replica`
|
|
50617
|
+
};
|
|
50618
|
+
return {
|
|
50619
|
+
kind: "usable",
|
|
50620
|
+
mode: first
|
|
50621
|
+
};
|
|
50622
|
+
}
|
|
50623
|
+
function replicationModeShape(properties) {
|
|
50624
|
+
return (Array.isArray(properties["Replicas"]) ? properties["Replicas"] : []).map((entry) => asRecord(entry)?.[REPLICATION_MODE_KEY] ?? null);
|
|
50625
|
+
}
|
|
50626
|
+
function replicationModeUpdate(properties, previousProperties) {
|
|
50627
|
+
const want = readReplicationMode(properties);
|
|
50628
|
+
if (want.kind === "unusable") return void 0;
|
|
50629
|
+
const had = readReplicationMode(previousProperties);
|
|
50630
|
+
const desired = want.kind === "usable" ? want.mode : void 0;
|
|
50631
|
+
if (desired === (had.kind === "usable" ? had.mode : void 0)) return void 0;
|
|
50632
|
+
return desired ?? "DISABLED";
|
|
50633
|
+
}
|
|
50634
|
+
function replicationModeCorrection(properties, previousProperties, liveMode) {
|
|
50635
|
+
const want = readReplicationMode(properties);
|
|
50636
|
+
if (want.kind !== "usable") return void 0;
|
|
50637
|
+
if (replicationModeUpdate(properties, previousProperties) !== void 0) return void 0;
|
|
50638
|
+
return (liveMode ?? "DISABLED") === want.mode ? void 0 : want.mode;
|
|
50639
|
+
}
|
|
49712
50640
|
function replicaSettingsRefusal(properties, previousProperties, currentRegion) {
|
|
50641
|
+
const mode = readReplicationMode(properties);
|
|
50642
|
+
if (mode.kind === "unusable" && (previousProperties === void 0 || !deepEqual(replicationModeShape(properties), replicationModeShape(previousProperties)))) return mode.reason;
|
|
49713
50643
|
const desired = Array.isArray(properties["Replicas"]) ? properties["Replicas"] : [];
|
|
49714
50644
|
const crossRegionCreate = previousProperties === void 0 && desired.some((entry) => {
|
|
49715
50645
|
const region = asRecord(entry)?.["Region"];
|
|
@@ -50386,7 +51316,7 @@ function buildLiveRecoveryGsiBaseline(desiredSdkIndexes, liveIndexes, options) {
|
|
|
50386
51316
|
}
|
|
50387
51317
|
function toSdkReplicaGlobalSecondaryIndexes(replicaIndexes, billingMode, diagnostics, maskSecrets = (text) => text) {
|
|
50388
51318
|
if (!Array.isArray(replicaIndexes) || replicaIndexes.length === 0) return void 0;
|
|
50389
|
-
|
|
51319
|
+
const sendable = replicaIndexes.map((entry) => {
|
|
50390
51320
|
const cfn = asRecord(entry);
|
|
50391
51321
|
if (!cfn) return entry;
|
|
50392
51322
|
const indexName = cfn["IndexName"];
|
|
@@ -50395,7 +51325,8 @@ function toSdkReplicaGlobalSecondaryIndexes(replicaIndexes, billingMode, diagnos
|
|
|
50395
51325
|
if (overrides.ProvisionedThroughputOverride) sdk.ProvisionedThroughputOverride = overrides.ProvisionedThroughputOverride;
|
|
50396
51326
|
if (overrides.OnDemandThroughputOverride) sdk.OnDemandThroughputOverride = overrides.OnDemandThroughputOverride;
|
|
50397
51327
|
return sdk;
|
|
50398
|
-
});
|
|
51328
|
+
}).filter((sdk) => asRecord(sdk) === void 0 || sdk.ProvisionedThroughputOverride !== void 0 || sdk.OnDemandThroughputOverride !== void 0);
|
|
51329
|
+
return sendable.length > 0 ? sendable : void 0;
|
|
50399
51330
|
}
|
|
50400
51331
|
function toSdkReplicaThroughputOverrides(cfn, billingMode, diagnostics, context, maskSecrets = (text) => text) {
|
|
50401
51332
|
const explicitProvisioned = asRecord(cfn["ProvisionedThroughputOverride"]);
|
|
@@ -50513,6 +51444,10 @@ function deepEqual(a, b) {
|
|
|
50513
51444
|
return false;
|
|
50514
51445
|
}
|
|
50515
51446
|
}
|
|
51447
|
+
function lsiListOrEmpty(value) {
|
|
51448
|
+
if (value === void 0 || value === null) return [];
|
|
51449
|
+
return value;
|
|
51450
|
+
}
|
|
50516
51451
|
|
|
50517
51452
|
//#endregion
|
|
50518
51453
|
//#region src/provisioning/protection-flags.ts
|
|
@@ -50942,31 +51877,63 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
50942
51877
|
const previousForUpdate = reattached?.previous ?? previousWithSecretsDropped;
|
|
50943
51878
|
const changedForProvider = new Set(changedProperties);
|
|
50944
51879
|
for (const key of /* @__PURE__ */ new Set([...Object.keys(previousWithNoEchoHeld), ...Object.keys(previousForUpdate)])) if (keyOrderFreeJson(previousForUpdate[key]) !== keyOrderFreeJson(previousWithNoEchoHeld[key])) changedForProvider.add(key);
|
|
51880
|
+
const unsettled = unsettledPropertiesOf(currentResource);
|
|
50945
51881
|
if (changedForProvider.size === 0) for (const key of /* @__PURE__ */ new Set([...Object.keys(updateProps), ...Object.keys(previousForUpdate)])) changedForProvider.add(key);
|
|
50946
51882
|
if (reattached !== void 0) engine.logger.info(safeMsg` ${logicalId} (${resourceType}) lost its attachment to ${reattached.parents.join(", ")}, which this deploy re-created under the same name: attaching it again`);
|
|
50947
51883
|
if (droppedPrincipalKinds.length > 0) {
|
|
50948
51884
|
const kinds = droppedPrincipalKinds.join(" / ");
|
|
50949
51885
|
engine.logger.warn(safeMsg`${logicalId} (${resourceType}): the recorded ${kinds} holds a secret reference the template still spells the same way, so cdkd re-applies it to the principals this deploy resolved it to and removes it from none of them. If that secret's value changed since the last deploy, a principal only the OLD value named still has the policy or membership: remove it from that principal by hand.`);
|
|
50950
51886
|
}
|
|
50951
|
-
const
|
|
51887
|
+
const unsettledIdentity = {
|
|
51888
|
+
provider: updateProvider,
|
|
51889
|
+
logicalId,
|
|
51890
|
+
physicalId: currentResource.physicalId,
|
|
51891
|
+
resourceType,
|
|
51892
|
+
recordedProperties: currentResource.properties ?? {}
|
|
51893
|
+
};
|
|
51894
|
+
const previousSettled = await settleUnsettledPrevious({
|
|
51895
|
+
...unsettledIdentity,
|
|
51896
|
+
names: unsettled,
|
|
51897
|
+
previous: previousForUpdate,
|
|
51898
|
+
desired: updateProps
|
|
51899
|
+
});
|
|
51900
|
+
if (unsettled.has("Tags")) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): an earlier failed update left Tags unsettled. cdkd re-applies the template's tags and removes only the recorded ones the template dropped; a tag that failed update added and no template declares is left on the resource. Remove it by hand if it should not be there.`);
|
|
51901
|
+
const removal = prepareRemovalForUpdate(updateProvider, resourceType, updateProps, previousSettled);
|
|
50952
51902
|
let result;
|
|
50953
51903
|
let resultProvisionedBy = updateDecision.provisionedBy;
|
|
50954
51904
|
let captureProvider = updateProvider;
|
|
50955
51905
|
let replacedAtGeneration;
|
|
50956
51906
|
const inlinePolicyClaimed = engine.inlinePolicyClaimedFor(resourceType, logicalId, stateResources);
|
|
50957
51907
|
try {
|
|
50958
|
-
result = await engine.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => updateProvider.update(logicalId, currentResource.physicalId, resourceType, removal.properties,
|
|
51908
|
+
result = await engine.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => updateProvider.update(logicalId, currentResource.physicalId, resourceType, removal.properties, previousSettled, {
|
|
50959
51909
|
maskSecrets: createSecretMasker(updateSecrets),
|
|
50960
51910
|
expectedRegion: engine.stackRegion,
|
|
50961
51911
|
recordedAttributes: currentResource.attributes,
|
|
50962
51912
|
...inlinePolicyClaimed && { inlinePolicyClaimed },
|
|
50963
51913
|
...removal.context,
|
|
50964
|
-
changedProperties: changedForProvider
|
|
51914
|
+
changedProperties: changedForProvider,
|
|
51915
|
+
markUnsettled: (propertyName) => {
|
|
51916
|
+
if (typeof propertyName !== "string" || propertyName === "") return;
|
|
51917
|
+
if (!Object.hasOwn(resolvedProps, propertyName) && !Object.hasOwn(currentResource.properties ?? {}, propertyName)) {
|
|
51918
|
+
engine.logger.debug(safeMsg`${logicalId}: ignored an unsettled mark for ${propertyName}, which is not one of its properties`);
|
|
51919
|
+
return;
|
|
51920
|
+
}
|
|
51921
|
+
let marks = engine.unsettledMarks.get(logicalId);
|
|
51922
|
+
if (marks === void 0) {
|
|
51923
|
+
marks = /* @__PURE__ */ new Set();
|
|
51924
|
+
engine.unsettledMarks.set(logicalId, marks);
|
|
51925
|
+
}
|
|
51926
|
+
marks.add(propertyName);
|
|
51927
|
+
},
|
|
51928
|
+
...unsettled.size > 0 && { unsettledProperties: unsettled }
|
|
50965
51929
|
})), logicalId, void 0, void 0, updateProvider);
|
|
50966
51930
|
if (result.sentNothing === true) engine.replacementRun.updatesThatSentNothing.add(logicalId);
|
|
51931
|
+
engine.unsettledMarks.delete(logicalId);
|
|
50967
51932
|
if (result.wasReplaced === true && result.outcome === "partial") engine.replacementRun.replacedOldMaySurvive.set(logicalId, result.oldResourceSurvivor === "kept" ? "kept" : "unconfirmed");
|
|
50968
51933
|
result = withoutInjectedRemovals(result, removal.injected);
|
|
50969
|
-
|
|
51934
|
+
const unhandledByCause = splitUnhandledRemovals(removal.unhandled, previousForUpdate, unsettled);
|
|
51935
|
+
if (unhandledByCause.removedFromTemplate.length > 0) engine.logger.warn(removalWarning(logicalId, resourceType, unhandledByCause.removedFromTemplate));
|
|
51936
|
+
if (unhandledByCause.addedByFailedUpdate.length > 0) engine.logger.warn(addedByFailedUpdateWarning(logicalId, resourceType, unhandledByCause.addedByFailedUpdate));
|
|
50970
51937
|
} catch (updateError) {
|
|
50971
51938
|
const ccUnsupported = isUpdateUnsupportedError(updateError, logicalId);
|
|
50972
51939
|
const replaceOptIn = updateError instanceof ResourceUpdateNotSupportedError && engine.options.replace === true;
|
|
@@ -51146,6 +52113,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51146
52113
|
logicalId,
|
|
51147
52114
|
generation: fallbackGeneration
|
|
51148
52115
|
}, replaceFallback));
|
|
52116
|
+
engine.unsettledMarks.delete(logicalId);
|
|
51149
52117
|
result = fallbackOutcome.result;
|
|
51150
52118
|
resultProvisionedBy = fallbackOutcome.provisionedBy;
|
|
51151
52119
|
captureProvider = fallbackOutcome.captureProvider;
|
|
@@ -51166,6 +52134,12 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51166
52134
|
throw updateError;
|
|
51167
52135
|
}
|
|
51168
52136
|
}
|
|
52137
|
+
const stillUnsettled = result.wasReplaced ? [] : await unsettledAfterUpdate({
|
|
52138
|
+
...unsettledIdentity,
|
|
52139
|
+
names: unsettled,
|
|
52140
|
+
desired: updateProps
|
|
52141
|
+
});
|
|
52142
|
+
if (stillUnsettled.length > 0) engine.logger.warn(safeMsg`${logicalId} (${resourceType}): the update succeeded, but AWS does not yet show the template's ${stillUnsettled.join(", ")}; cdkd keeps ${stillUnsettled.length === 1 ? "it" : "them"} unsettled and converges again on the next deploy.`);
|
|
51169
52143
|
engine.replacementRun.updateWasReplaced.set(logicalId, result.wasReplaced === true);
|
|
51170
52144
|
if (result.wasReplaced !== true && (hasPassProvenance(updateSecrets) || referenceProvenanceOf(currentResource) !== void 0)) {
|
|
51171
52145
|
const cached = cachedCreateOnlyPropertyPaths(resourceType);
|
|
@@ -51202,6 +52176,7 @@ async function updateInPlace(engine, { changedProperties, conditions, counts, cu
|
|
|
51202
52176
|
...dependencies && dependencies.length > 0 && { dependencies },
|
|
51203
52177
|
...extractTemplateAttributes(template, logicalId),
|
|
51204
52178
|
provisionedBy: resultProvisionedBy,
|
|
52179
|
+
...stillUnsettled.length > 0 && { unsettledProperties: stillUnsettled },
|
|
51205
52180
|
...keepsParameterRefusal && {
|
|
51206
52181
|
observedBaselineRefused: true,
|
|
51207
52182
|
observedBaselineRefusalReason: "unverifiable-parameter"
|
|
@@ -51610,6 +52585,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
51610
52585
|
for (const path of provenanceMoved.paths) rewrittenPaths.add(path);
|
|
51611
52586
|
if (provenanceMoved.paths.size > 0) engine.logger.info(safeMsg`${logicalId} is sent: ${[...provenanceMoved.paths].sort().join(", ")} read a secret-derived value at a newer version than ${logicalId} was deployed with (its upstream changed since then)`);
|
|
51612
52587
|
const recordMatchesDesired = movedMasked.size === 0 && rewrittenPaths.size === 0 && keyOrderFreeJson(desiredForSkipCheckAsWritten) === keyOrderFreeJson(currentPropsAsWritten);
|
|
52588
|
+
const unsettledNames = unsettledPropertiesOf(currentResource);
|
|
51613
52589
|
const movedAsWritten = (key) => movedMasked.has(key) || rewrittenPaths.has(key) || keyOrderFreeJson(desiredForSkipCheckAsWritten[key]) !== keyOrderFreeJson(currentPropsAsWritten[key]);
|
|
51614
52590
|
const applyAttributeOnlyUpdate = (attributeChanges) => {
|
|
51615
52591
|
const attrSummary = attributeChanges.map((a) => `${a.attribute}: ${a.oldValue ?? "(unset)"} → ${a.newValue ?? "(unset)"}`).join(", ");
|
|
@@ -51684,7 +52660,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
51684
52660
|
const lateReplacementDeclined = /* @__PURE__ */ new Set();
|
|
51685
52661
|
const differsWhy = (key) => !lateReplacementDeclined.has(key) ? "differs; the provider is not known to report this property exactly, so the difference may be its normalization" : lateCrossPrefixRefused ? "differs; the replacement was refused: see the state-prefix warning above" : `differs; the replacement was not approved (--require-approval=${engine.options.requireApproval ?? "never"})`;
|
|
51686
52662
|
if (witnessMigrates && !typeChanged && echoCandidates.length > 0 && hasAddressablePhysicalId(currentResource)) await readOnce();
|
|
51687
|
-
if (!typeChanged && !suppliesFreshMaskOnlyValue && lostChild === void 0 && recreateDirectionFor(engine.options, stackName, logicalId) === void 0 && recordMatchesDesired) {
|
|
52663
|
+
if (!typeChanged && !suppliesFreshMaskOnlyValue && lostChild === void 0 && recreateDirectionFor(engine.options, stackName, logicalId) === void 0 && recordMatchesDesired && unsettledNames.size === 0) {
|
|
51688
52664
|
if (provenanceUnchanged.length > 0) stateResources[logicalId] = withRefreshedReadVersions(stateResources[logicalId] ?? currentResource, provenanceUnchanged);
|
|
51689
52665
|
if (change.attributeChanges && change.attributeChanges.length > 0) {
|
|
51690
52666
|
applyAttributeOnlyUpdate(change.attributeChanges);
|
|
@@ -51820,7 +52796,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
51820
52796
|
}
|
|
51821
52797
|
}
|
|
51822
52798
|
const confirmedPaths = /* @__PURE__ */ new Set([...noEchoHeldPaths, ...parameterSettledPaths]);
|
|
51823
|
-
if (confirmedPaths.size > 0 && !typeChanged && lostChild === void 0 && recreateDirectionFor(engine.options, stackName, logicalId) === void 0 && recordMatchesDesired && Object.keys(resolvedProps).every((key) => confirmedPaths.has(key) || otherFreshAt(key).length === 0 && !pendingParameterLeaves.has(key))) {
|
|
52799
|
+
if (confirmedPaths.size > 0 && !typeChanged && lostChild === void 0 && recreateDirectionFor(engine.options, stackName, logicalId) === void 0 && recordMatchesDesired && unsettledNames.size === 0 && Object.keys(resolvedProps).every((key) => confirmedPaths.has(key) || otherFreshAt(key).length === 0 && !pendingParameterLeaves.has(key))) {
|
|
51824
52800
|
engine.logger.debug(safeMsg`Skipping ${logicalId}: AWS already holds every NoEcho value it carries, and nothing else changed`);
|
|
51825
52801
|
const staleHeld = staleCoordinates.filter((coordinate) => typeof coordinate[0] === "string" && parameterHeldKeys.has(coordinate[0]));
|
|
51826
52802
|
if (staleHeld.length > 0) {
|
|
@@ -51935,8 +52911,9 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
|
|
|
51935
52911
|
const changedProperties = new Set([.../* @__PURE__ */ new Set([
|
|
51936
52912
|
...Object.keys(desiredForSkipCheckAsWritten),
|
|
51937
52913
|
...Object.keys(currentPropsAsWritten),
|
|
51938
|
-
...Object.keys(resolvedProps)
|
|
51939
|
-
|
|
52914
|
+
...Object.keys(resolvedProps),
|
|
52915
|
+
...unsettledNames
|
|
52916
|
+
])].filter((key) => unsettledNames.has(key) || movedAsWritten(key) || !confirmedPaths.has(key) && (pendingParameterLeaves.has(key) || otherFreshAt(key).length > 0)));
|
|
51940
52917
|
let previousForProvider = currentPropsAsWritten;
|
|
51941
52918
|
for (const coordinate of witness?.confirmed ?? []) {
|
|
51942
52919
|
const value = valueAtCoordinate(resolvedProps, coordinate);
|
|
@@ -52223,7 +53200,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52223
53200
|
const savedFor = savedIds.join(", ");
|
|
52224
53201
|
try {
|
|
52225
53202
|
const partialState = {
|
|
52226
|
-
version:
|
|
53203
|
+
version: 14,
|
|
52227
53204
|
region: engine.stackRegion,
|
|
52228
53205
|
stackName: currentState.stackName,
|
|
52229
53206
|
resources: newResources,
|
|
@@ -52352,6 +53329,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52352
53329
|
} catch (provisionError) {
|
|
52353
53330
|
engine.interrupted = true;
|
|
52354
53331
|
engine.interruptCause ??= "sibling-failure";
|
|
53332
|
+
if (change.changeType === "UPDATE") recordUnsettledMarks(engine, newResources, logicalId);
|
|
52355
53333
|
const refused = isRefusedBeforeApplying(provisionError, logicalId);
|
|
52356
53334
|
const attemptedGeneration = change.changeType === "UPDATE" && !refused && !isReplacementNameRefusal(provisionError, logicalId) ? engine.replacementRun.attemptedNameGeneration.get(logicalId) : void 0;
|
|
52357
53335
|
const statePhysicalId = newResources[logicalId]?.physicalId ?? previousState?.physicalId;
|
|
@@ -52518,6 +53496,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52518
53496
|
await retryCarriedSupersededResources(engine, currentState, carriedSuperseded, newResources, { waitInUse: releasedSomething });
|
|
52519
53497
|
}
|
|
52520
53498
|
} catch (error) {
|
|
53499
|
+
recordUnsettledMarks(engine, newResources);
|
|
52521
53500
|
warnUnretriedReplacedDeletes(engine.replacementRun, engine.replacementDeps(), engine.interruptCause === "user" ? "interrupted" : "failed");
|
|
52522
53501
|
const initialDeploy = currentEtag === void 0;
|
|
52523
53502
|
const written = /* @__PURE__ */ new Set([...engine.replacementRun.restoredLostChildren, ...completedOperations.map((op) => op.logicalId)]);
|
|
@@ -52574,7 +53553,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52574
53553
|
}
|
|
52575
53554
|
try {
|
|
52576
53555
|
const preRollbackState = {
|
|
52577
|
-
version:
|
|
53556
|
+
version: 14,
|
|
52578
53557
|
region: engine.stackRegion,
|
|
52579
53558
|
stackName: currentState.stackName,
|
|
52580
53559
|
resources: newResources,
|
|
@@ -52637,9 +53616,10 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52637
53616
|
rollbackSettledNested = rollbackResult.settledNested;
|
|
52638
53617
|
rollbackRemainingFailedOps = rollbackResult.remainingFailedOps;
|
|
52639
53618
|
}
|
|
53619
|
+
recordUnsettledMarks(engine, newResources);
|
|
52640
53620
|
try {
|
|
52641
53621
|
const postRollbackState = {
|
|
52642
|
-
version:
|
|
53622
|
+
version: 14,
|
|
52643
53623
|
region: engine.stackRegion,
|
|
52644
53624
|
stackName: currentState.stackName,
|
|
52645
53625
|
resources: newResources,
|
|
@@ -52660,8 +53640,9 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52660
53640
|
engine.logger.debug(safeMsg`Retrying state save after rollback (ETag mismatch): ${asIsMessage(describeAwsFailure(saveError).detail)}`);
|
|
52661
53641
|
try {
|
|
52662
53642
|
const freshEtag = (await engine.stateBackend.getState(stackName, engine.stackRegion))?.etag;
|
|
53643
|
+
recordUnsettledMarks(engine, newResources);
|
|
52663
53644
|
const postRollbackState = {
|
|
52664
|
-
version:
|
|
53645
|
+
version: 14,
|
|
52665
53646
|
region: engine.stackRegion,
|
|
52666
53647
|
stackName: currentState.stackName,
|
|
52667
53648
|
resources: newResources,
|
|
@@ -52698,7 +53679,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52698
53679
|
}
|
|
52699
53680
|
return {
|
|
52700
53681
|
state: {
|
|
52701
|
-
version:
|
|
53682
|
+
version: 14,
|
|
52702
53683
|
region: engine.stackRegion,
|
|
52703
53684
|
stackName: currentState.stackName,
|
|
52704
53685
|
resources: newResources,
|
|
@@ -52717,7 +53698,7 @@ async function executeDeployment(engine, template, currentState, changes, dag, e
|
|
|
52717
53698
|
}
|
|
52718
53699
|
async function persistStateAfterOutputFailure(engine, stackName, currentState, newResources, currentEtag, pendingMigration) {
|
|
52719
53700
|
const buildState = () => ({
|
|
52720
|
-
version:
|
|
53701
|
+
version: 14,
|
|
52721
53702
|
region: engine.stackRegion,
|
|
52722
53703
|
stackName: currentState.stackName,
|
|
52723
53704
|
resources: newResources,
|
|
@@ -52751,6 +53732,13 @@ function journaledOrphanPolicy(policy) {
|
|
|
52751
53732
|
if (policy === void 0) return void 0;
|
|
52752
53733
|
return policy === "Delete" || policy === "Retain" || policy === "Snapshot" || policy === "RetainExceptOnCreate" ? policy : "Retain";
|
|
52753
53734
|
}
|
|
53735
|
+
function recordUnsettledMarks(engine, newResources, only) {
|
|
53736
|
+
for (const [logicalId, marks] of engine.unsettledMarks) {
|
|
53737
|
+
if (only !== void 0 && logicalId !== only) continue;
|
|
53738
|
+
if (marks.size === 0 || !Object.hasOwn(newResources, logicalId)) continue;
|
|
53739
|
+
newResources[logicalId] = withUnsettledProperties(newResources[logicalId], marks);
|
|
53740
|
+
}
|
|
53741
|
+
}
|
|
52754
53742
|
|
|
52755
53743
|
//#endregion
|
|
52756
53744
|
//#region src/deployment/deploy-engine/deploy-flow.ts
|
|
@@ -52792,7 +53780,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
|
|
|
52792
53780
|
clock.lap("state load");
|
|
52793
53781
|
noteDeployStateRecord(currentStateData?.state !== void 0);
|
|
52794
53782
|
const currentState = currentStateData?.state ?? {
|
|
52795
|
-
version:
|
|
53783
|
+
version: 14,
|
|
52796
53784
|
region: engine.stackRegion,
|
|
52797
53785
|
stackName,
|
|
52798
53786
|
resources: {},
|
|
@@ -53095,7 +54083,7 @@ async function doDeployWithPrefetch(engine, stackName, template, createOnlyPrefe
|
|
|
53095
54083
|
await resolveStackInstanceId();
|
|
53096
54084
|
try {
|
|
53097
54085
|
const refreshedState = {
|
|
53098
|
-
version:
|
|
54086
|
+
version: 14,
|
|
53099
54087
|
region: engine.stackRegion,
|
|
53100
54088
|
stackName: currentState.stackName,
|
|
53101
54089
|
resources: currentState.resources,
|
|
@@ -53383,6 +54371,7 @@ var DeployEngine = class {
|
|
|
53383
54371
|
replacementRun = new ReplacementRunState();
|
|
53384
54372
|
outputsRun = new OutputsRunState();
|
|
53385
54373
|
attemptedResolvedProps = /* @__PURE__ */ new Map();
|
|
54374
|
+
unsettledMarks = /* @__PURE__ */ new Map();
|
|
53386
54375
|
resumedCreates = /* @__PURE__ */ new Map();
|
|
53387
54376
|
generatedNameGuard;
|
|
53388
54377
|
liveTaskLabels = /* @__PURE__ */ new Map();
|
|
@@ -53575,6 +54564,7 @@ var DeployEngine = class {
|
|
|
53575
54564
|
this.noEchoRun = new NoEchoRunState();
|
|
53576
54565
|
this.replacementRun = new ReplacementRunState();
|
|
53577
54566
|
this.attemptedResolvedProps = /* @__PURE__ */ new Map();
|
|
54567
|
+
this.unsettledMarks = /* @__PURE__ */ new Map();
|
|
53578
54568
|
this.resumedCreates = /* @__PURE__ */ new Map();
|
|
53579
54569
|
this.generatedNameGuard = void 0;
|
|
53580
54570
|
this.liveTaskLabels = /* @__PURE__ */ new Map();
|
|
@@ -53779,5 +54769,5 @@ function sameGenerationClaimsOf(record) {
|
|
|
53779
54769
|
}
|
|
53780
54770
|
|
|
53781
54771
|
//#endregion
|
|
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-
|
|
54772
|
+
export { computeImplicitDeleteEdges as $, coerceParameterTypedValue as $a, DYNAMIC_REFERENCE_TOKEN_SCAN as $c, applyCustomResourceResponseExpiration as $i, stringifyValue as $l, WITHHELD_NAME_DISPLAY as $n, refuseMalformedOrphanRecords as $o, noEchoExactEchoLeavesOf as $r, readConfigString as $s, lookupEachName as $t, MIGRATE_TMP_PREFIX as $u, beginDeleteWait as A, s3BucketRegionalDomainName as Aa, valueAtCoordinate as Ac, isRefusedByName as Ai, isAccessDenied$1 as Al, resolveReplacementOldType as An, isReadableResourceEntry as Ao, awaitInFlightSibling as Ar, withheldAccountClause as As, displacedOpClause as At, redactedDockerCause as Au, waitForIndexesSettled as B, assertFlagRoleArn as Ba, logOnlyValueCount as Bc, stringifyIfAssigned as Bi, hasUnverifiableParameterRefusal as Bl, updatePartialMessage as Bn, malformedOrphansRefusalMessage as Bo, yellow as Br, isStatefulRecreateTargetForReplace as Bs, getCurrentNestedStackContext as Bt, loadCdkJson as Bu, planContributorInsightsOp as C, withoutUnsettledProperties as Ca, noEchoCoordinatesOf as Cc, resolveAssemblyPath as Cd, ledgerForStack as Ci, isLockInfoExpired as Cl, isJournaledOrphan as Cn, accountArgs as Co, rollbackOrphanIds as Cr, repairMalformedOutputsForReadOnly as Cs, makeSiblingClaimReader as Ct, formatDockerLoginError as Cu, reverseMapTableContributorInsights as D, s3BucketArn as Da, readbackPathFor as Dc, resolveBucketRegion as Dd, DeploymentEventsReader as Di, CrossPrefixScanCache as Dl, recheckFailedPlan as Dn, hasReadableOutputs as Do, mappingPairs as Dr, unpreviewableOrphanRecords as Ds, keptForRetainedRecord as Dt, partitionSensitiveEnv as Du, reverseMapIndexContributorInsights as E, isSettledInstanceState as Ea, passedNoEchoParametersOf as Ec, clearBucketRegionCache as Ed, acquireIdempotencyToken as Ei, CrossPrefixReadError as El, planRollback as En, hasReadableOrphans as Eo, looselyEqual as Er, repairMalformedResourcesForReadOnly as Es, resolvePendingCloudControlRequests as Et, isMalformedEnvKey as Eu, DELETE_INDEX_WAIT_PROCEED_NOTE as F, keepHeldTokenProvenance as Fa, snapshotPassProvenance as Fc, readTagList as Fi, acceptedCreateOnlyDropsOf as Fl, inheritProducerRegions as Fn, malformedLocalResourceEntriesWarning as Fo, bold as Fr, NO_CC_HANDLERS_REASON as Fs, recordDisplacedSkips as Ft, getDockerImageBySourceHash as Fu, sendTtlWaitingOutRateLimit as G, AWS_CREDENTIAL_ENV_KEYS as Ga, unionOfSecretBags as Gc, wouldReturnToSdkProvider as Gi, orphansCarriedFrom as Gl, retiredAfterRollback as Gn, malformedResourceEntriesWarning as Go, removeSuperseded as Gr, isWarmThroughputDecrease as Gs, isHandledOrphan as Gt, resolveStateBucketWithDefault as Gu, isTtlRateLimited as H, explicitRoleArnOrThrow as Ha, recordLogOnlyParameterValue as Hc, ProviderRegistry as Hi, importableOutputs as Hl, nameGenerationCarriedFrom as Hn, malformedOutputsRefusalMessage as Ho, deleteSupersededEntry as Hr, renderStatefulReason as Hs, deleteJournaledOrphans as Ht, resolveAutoAssetStorage as Hu, INDEX_SETTLE_POLL_INTERVAL_MS as I, outputReferenceProvenanceOf as Ia, carryLogOnlyValues as Ic, refuseMalformedDesiredTags as Ii, describeRegionValueKind as Il, REDACTED_DELETE_ADDRESS_SKIP_REASON as In, malformedLocalResourcesWarning as Io, cyan as Ir, hasNoCloudControlHandlers as Is, revertNestedChildFromJournal as It, Synthesizer as Iu, hasCdkAutoDeleteTag as J, envCredentialsAreAssumedRole as Ja, maskSecretsInError as Jc, readsNoEchoDeleteValues as Ji, PhaseClock as Jl, withNameGenerationReached as Jn, malformedScrubResourceEntriesRefusalMessage as Jo, supersededHolderOf as Jr, coerceCfnBoolean as Js, makeForeignHolderScan as Jt, stateBucketExistenceConfirmed as Ju, ECR_AUTO_DELETE_IMAGES_TAG as K, applyCallerIdentityCredentials as Ka, createSecretMasker as Kc, waitForLambdaFunctionActive as Ki, shouldRetainResource as Kl, retiredNameGenerationsAfter as Kn, malformedResourcePropertiesWarning as Ko, supersededAfterRollback as Kr, toCfnInteger as Ks, journaledOrphanLines as Kt, resolveStateBucketWithDefaultAndSource as Ku, deleteTableWithIndexBusyRetry as L, recordedOutputReferenceRegions as La, createUnionSecretMasker as Lc, tagMapAsList as Li, exportNamesCarriedFrom as Ll, isRedactedRecordedValue as Ln, malformedOrphanRecordsRefusalMessage as Lo, gray as Lr, findReplacedReadersOfRecreateTargets as Ls, revertedNestedRowIds as Lt, synthesisStatusMessage as Lu, deleteBudgetKey as M, resolveDynamicReferences as Ma, markSameGenerationBag as Mc, DBPROXY_TAGS_WHAT as Mi, stackInstanceIdOf as Ml, orphanNeedsIdentity as Mn, malformedExportNamesWarning as Mo, getStackRecords as Mr, findSilentDropProperties as Ms, dropSettledNestedJournals as Mt, runDockerStreaming as Mu, resolveDynamoDbDeleteBudgetClock as N, producerLookupOver as Na, redactForState as Nc, DBPROXY_TAG_OPTIONS as Ni, withStackInstanceIdWithheld as Nl, findNestedStackTypeChanges as Nn, malformedExportSourceWarning as No, withStackRecords as Nr, unwrittenCreateOnlyReplacement as Ns, getNestedRevertRun as Nt, warnFinchArgvExposure as Nu, stripIndexContributorInsights as O, s3BucketDomainName as Oa, readsNoEchoSource as Oc, DeploymentEventsStore as Oi, applyCrossPrefixScan as Ol, recordUnderIdIsNotOwn as On, hasReadableResources as Oo, parseMappingFile as Or, unreadableOrphanRecords as Os, recordRetainedForReadoption as Ot, redactDockerArgvValues as Ou, resolveDynamoDbDeleteBudgetMs as P, refuseUnreadableCdkCrossAccountRefs as Pa, recordReferenceProvenanceEntry as Pc, planTagDiff as Pi, splitImportedOps as Pl, getCurrentProducerRegions as Pn, malformedLocalOutputsWarning as Po, replacedDeleteFailureVerdict as Pr, withoutSilentDropProperties as Ps, nestedChildStackName as Pt, AssetManifestLoader as Pu, IMPLICIT_DELETE_DEPENDENCIES as Q, regionLessSecretName as Qa, withoutPhysicalNameCopies as Qc, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Qi, isSensitiveAttributeName as Ql, resourcesNamingDeclaredParameter as Qn, refuseMalformedNestedChildOutputs as Qo, noEchoComparisonForTemplate as Qr, configStringRefusal as Qs, isAccessDeniedError as Qt, CFN_TEMPLATE_URL_LIMIT as Qu, maskedLogger as R, recordedReferenceRegions as Ra, hasMaskableValues as Rc, tagPlanWarning as Ri, hasReadableExportSet as Rl, redactedDeleteAddressFields as Rn, malformedOrphanRecordsWarning as Ro, green as Rr, shownType as Rs, withNestedRevertRun as Rt, getDefaultStateBucketName as Ru, indexDeclaresContributorInsights as S, withUnsettledProperties as Sa, maskedLeafCoordinatesOf as Sc, renderAssemblyPathEscape as Sd, earliestDefined as Si, LockManager as Sl, demoteSupersededOrphans as Sn, UNREADABLE_RESOURCES_MAP_ROW as So, movedToHint as Sr, repairMalformedOrphansForReadOnly as Ss, makeCanonicalizePropertiesFn as St, finchSecretArgvRefusal as Su, readContributorInsightsSpec as T, poisonRenderedSpellingsCollidingIn as Ta, noEchoOutputsComparison as Tc, injectedAwsRegionValue as Td, withCreateTokenLedger as Ti, rebuildClientForBucketRegion as Tl, planFailedOps as Tn, displayLogicalId as To, isPairableType as Tr, repairMalformedResourcePropertiesForReadOnly as Ts, pendingRequestCount as Tt, isDockerClientEnvKey as Tu, planTimeToLive as U, isIamRoleArn as Ua, recordLogOnlyValue as Uc, ccBrokenReason as Ui, isReadableBag as Ul, nameGenerationHighWaterOf as Un, malformedOutputsWarning as Uo, holdsSupersededResources as Ur, WARM_THROUGHPUT_MEMBERS as Us, dropFailedCommands as Ut, resolveCaptureObservedState as Uu, isTtlAlreadyDisabled as V, assertSendableRoleArn as Va, printingCorpusOf as Vc, CC_BROKEN_REASON as Vi, importableOutputKeys as Vl, updatePartialReason as Vn, malformedOrphansWarning as Vo, addSuperseded as Vr, isStatefulRecreateTargetSync as Vs, withNestedStackContext as Vt, resolveApp as Vu, readTtlSpec as W, sendableAssumeRoleCommand as Wa, shareLogOnlyValues as Wc, isCustomResource as Wi, orphansAfterRollback as Wl, nameScopeOf as Wn, malformedRenderedContainersWarning as Wo, isSupersededResourceRecord as Wr, coerceWarmThroughput as Ws, dropFailedHint as Wt, resolveSkipPrefix as Wu, getPriorAttempts as X, classifyReplaySecretRegion as Xa, scrubResourceRecord as Xc, getCurrentResourceSecrets as Xi, timePhase as Xl, namesAnyDeclaredParameter as Xn, previewableOrphanRecords as Xo, withoutSuperseded as Xr, configBooleanRefusal as Xs, formatResourceLine as Xt, ssmResolvedValueType as Xu, isTruthyCfnBoolean as Y, classifyRecordedSecretRegion as Ya, maskSecretsInText as Yc, isCustomResourceType as Yi, renderPhaseTimings as Yl, computeParameterTaint as Yn, malformedStateRefusalMessage as Yo, supersededResourcesOf as Yr, coerceCfnInteger as Ys, sameJournaledOrphans as Yt, warnDeprecatedNoPrefixCliFlag as Yu, markRefusedBeforeApplying as Z, producerRegionsFromState as Za, withPhysicalNameCopies as Zc, withPrintingSecrets as Zi, AssetPublisher as Zl, reachableDivergentParameters as Zn, refuseDivergentRecordRegionForDestroy as Zo, noEchoAttributeNamesOf as Zr, configIntegerRefusal as Zs, chunks as Zt, CFN_TEMPLATE_BODY_LIMIT as Zu, streamMemberRefusals as _, reDisableInstanceApiTermination as _a, canonicalCoordinates as _c, nullPrototypeRecord as _d, createPreDeleteFinalSnapshot as _i, recordNoEchoParameterFreshValue as _l, withUnprovenUnsettled as _n, declaresNoEcho as _o, constructPathOf as _r, refuseMalformedResourcesForDeploy as _s, withResourceDeadline as _t, resolveDockerContextDirectory as _u, isProtectionValueActive as a, RollbackInlinePolicyWriters as aa, templateResourceTypes as ac, PARTITION_TABLE as ad, namingSecretsWithRecordedNoEcho as ai, inheritNestedStackParameterAssociations as al, refuseRefactorMarker as an, carriesFetchableDynamicReference as ao, carriedExportAliasExposure as ar, refuseMalformedOutputsForDestroy as as, childTemplateLoader as at, AssetModeResolver as au, CONTRIBUTOR_INSIGHTS_KEY as b, INTRINSIC_KEYS as ba, maskReadbackAtCoordinates as bc, describeFileReadFailure as bd, refusesFinalSnapshot as bi, WHOLE_DYNAMIC_REFERENCE_PATTERN as bl, equalModuloMask as bn, STATE_RESOURCES_MALFORMED as bo, findRefactorHints as br, refuseMalformedState as bs, keptWholeReasonText as bt, describeDockerFailure as bu, DynamoDBGlobalTableProvider as c, deleteLeftInPlace as ca, blockDeviceMappingsDifferOnlyInDeleteOnTermination as cc, AssemblyReader as cd, secretNamePrintingBags as ci, physicalNameCopiesOf as cl, hasPendingMovesOut as cn, AWS_NO_VALUE as co, isWholeDynamicReferenceValue as cr, refuseMalformedResourceEntriesForDeploy as cs, listNestedTemplateRows as ct, ensureAssetStorage as cu, declaredStreamPolicyMember as d, isWaitAbandonedError as da, emrClusterInstancesReplaced as dc, describeJsonParseFailure as dd, stateSecretNameNeedles as di, splitGetAttStringForm as dl, refusePendingMovesOut as dn, lacksRecordedTableArn as do, collectPublishedOutputNames as dr, refuseMalformedResourceEntriesForImportSave as ds, conditionFingerprint as dt, parseBootstrapMarker as du, customResourceResponseExpirationWarning as ea, replayWarn as ec, findLargeInlineResources as ed, noEchoParameterNamesOf as ei, dynamicReferenceTokens as el, withApiLimit as en, isUnboundTemplateParameter as eo, displayTextOrWithheld as er, refuseMalformedOrphanRecordsForDestroy as es, crossStackOutputProvenanceSource as et, WorkGraph as eu, declaredStreamTagsMember as f, markWaitAbandoned as fa, canonicalLambdaFunctionName as fc, parseFailureDebugDetail as fd, storedSecretNameNeedles as fi, carriesSecretMask as fl, replayFailedOperations as fn, refStateLookupFromResource as fo, isExportAliasCollision as fr, refuseMalformedResourceEntriesForOrphan as fs, conditionInputsFrom as ft, readBootstrapMarkerBody as fu, streamDeclaresTags as g, observeThenDisableInstanceApiTermination as ga, TemplateParser as gc, hasPlainPrototype$1 as gd, ccRoutedFinalSnapshotError as gi, recordNoEchoAttributeValues as gl, settleUnsettledPrevious as gn, passedParameterClassesOf as go, maskingRetryLogger as gr, refuseMalformedResourcePropertiesForOrphan as gs, enclosingDeadlineRemainingMs as gt, buildDockerImage as gu, streamDeclaresPolicy as h, isTerminationProtectionPropagationError as ha, DagBuilder as hc, hasOwnKey as hd, buildFinalSnapshotIdentifier as hi, recordMaskOnlyValuesIn as hl, recordAfterRollbackUpdate as hn, parameterInputsFor as ho, DEFAULT_RESOURCE_WARN_AFTER_MS as hr, refuseMalformedResourcePropertiesForExport as hs, enclosingDeadlineExpired as ht, buildDenyExternalAccessPolicy as hu, PROTECTION_PROPERTY_BY_TYPE as i, unchangedBehindSecretReference as ia, prefetchCreateOnlyPropertyPaths as ic, expectedOwnerParam as id, maskEventTextWithBoundBags as ii, identityKeyFor as il, refactorMarkerRefusalMessage as in, carriesDynamicReference as io, secretSafeKeyDisplay as ir, refuseMalformedOutputs as is, serviceTokenBlockingReason as it, rewriteTemplateAssetReferences as iu, compensateRemovedDeletionProtection as j, s3BucketWebsiteUrl as ja, liveMatchesUnresolvedTokenFrame as jc, markDeleteStarted as ji, isNotImplemented as jl, seedsDeleteFirstGuard as jn, malformedDriftResourcePropertiesWarning as jo, destroyStackRecordsView as jr, findActionableSilentDrops as js, displacedPhysicalIdShown as jt, runDockerForeground as ju, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as k, s3BucketDualStackDomainName as ka, recordedNoEchoValuesOf as kc, extractDeploymentEventError as ki, crossPrefixDeniedWarning as kl, replacementNeverSwapped as kn, isReadableOrphanRecord as ko, proposeRenames as kr, unreadableResourceEntries as ks, NESTED_PENDING_PARENT_REASON as kt, redactedCause as ku, STREAM_POLICY_KEY as l, deleteSkipReason as la, dbInstanceEngineChangeIsInPlace as lc, StageLoadError as ld, secretNamedAttributeNamesOf as li, recordAttributeIdCopy as ll, pendingMovesOutOf as ln, cfnRefValueFromPhysicalId as lo, noEchoParameterValueSeed as lr, refuseMalformedResourceEntriesForDestroy as ls, renderNestedTemplateTreeDefect as lt, getBootstrapMarkerKey as lu, reverseMapStreamPolicy as m, ec2InstanceProtectionSite as ma, sameLambdaFunctionAddress as mc, defineOwnKey as md, PRE_DELETE_SNAPSHOT_TYPES as mi, recordMaskOnlyValue as ml, removeProtectionTypeList as mn, withSharedDrainBudget as mo, DEFAULT_RESOURCE_TIMEOUT_MS as mr, refuseMalformedResourcePropertiesForDrift as ms, readRecordedConditionVerdicts as mt, validateContainerRepoName as mu, recordedProtectionEvidence as n, slowCcOperationTimeoutMs as na, requireConfigObject as nc, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as nd, completedReplayEntries as ni, pathCrossesDottedKey as nl, readRefactorMarkerOnce as nn, getAccountInfo as no, secretBearing as nr, refuseMalformedOrphansForDestroy as ns, deferredServiceTokenWarning as nt, createAssetRedirectResolver as nu, perType as o, UNSPECIFIED_SKIP_REASON as oa, describeTypeWithThrottleRetry as oc, canonicalizeRegion as od, orphanRecordsPrintingBag as oi, recordNestedStackParameterExpressions as ol, sameMove as on, isNamelessDynamicReferenceError as oo, exportNameNoEchoParameters as or, refuseMalformedResourceAttributesForOrphan as os, findNestedTemplateTreeDefect as ot, BOOTSTRAP_MARKER_PREFIX as ou, planStreamMemberOps as p, disableInstanceApiTermination as pa, lambdaFunctionNameForMask as pc, utf8ByteLength as pd, ATOMIC_FINAL_SNAPSHOT_TYPES as pi, provenPublicValue as pl, replayRollback as pn, parseWebACLArn as po, bindingSkippedOutputs as pr, refuseMalformedResourcePropertiesForDestroy as ps, parentSuppliedValues as pt, validateAssetBucketName as pu, S3_AUTO_DELETE_OBJECTS_TAG as q, callerEnvCredentials as qa, errorCauseChain as qc, TemplateNoEchoReresolver as qi, stackInstanceIdCarriedFrom as ql, retiredNameGenerationsLeaving as qn, malformedResourcesWarning as qo, supersededHeldByOtherTypeWarning as qr, toFiniteNumber as qs, loadJournaledOrphans as qt, resolveUseCdkBootstrapAssets as qu, recordedProtectionNote as r, onlySecretReferencesDiffer as ra, requireConfigString as rc, decodeListingKey as rd, journaledOrphanPrintingBag as ri, spelledKeysOf as rl, refactorMarkerMovesOf as rn, isImpossibleEmptyStoredAttribute as ro, secretBearingStateKeyWarning as rr, refuseMalformedOrphansForOrphan as rs, findServiceTokenRefusals as rt, loadPublishableAssetManifest as ru, readProtection as s, deleteIndeterminateGuards as sa, withRetry as sc, derivePartitionAndUrlSuffix as sd, secretNamePrintingBag as si, recoverMaskedOutput as sl, updateRefactorMarker as sn, keepsSecretReferenceToken as so, exportNameSecretExposure as sr, refuseMalformedResourceEntries as ss, isAbsoluteAssetPath as st, assertAssetBucketRegion as su, DeployEngine as t, CloudControlProvider as ta, requireConfigArray as tc, uploadCfnTemplate as td, createReadOnlyAttributeHealerFactory as ti, isUncertifiedBaselineMaskPosition as tl, readRefactorMarker as tn, parameterTypeMayLoseSecretIdentity as to, exportAliasCollisionScrubWarning as tr, refuseMalformedOrphans as ts, inheritedProvenanceForChildDiff as tt, buildAssetRedirectMap as tu, STREAM_TAGS_KEY as u, withIndeterminateGuard as ua, ecsServiceLaunchTypeSetOrChanged as uc, processStackMessages as ud, secretNamedRecordNeedles as ui, recordPhysicalNameCopy as ul, pendingMovesRefusalMessage as un, isStalePlaceholderArnAttribute as uo, collectDeclaredOutputNames as ur, refuseMalformedResourceEntriesForImport as us, templateIdentity as ut, isCrossRegionRedirect as uu, streamPolicyMatchesDeclared as v, reEnableInstanceApiTermination as va, isMarkedCoordinate as vc, ownValue as vd, effectiveDeletionPolicy as vi, recordProvenPublicExpression as vl, calculateResourceDrift as vn, JSON_LISTING_HOLE_VALUE as vo, findDestructiveChanges as vr, refuseMalformedResourcesForDestroy as vs, diffSecurity as vt, describeDockerCapturedOutput as vu, planIndexContributorInsightsOps as w, IntrinsicFunctionResolver as wa, noEchoLeavesOf as wc, injectAwsRegion as wd, reserveStackCreateToken as wi, S3StateBackend as wl, isReplacementOrphan as wn, deployRefusesOrphanRowsReason as wo, withMovedTo as wr, repairMalformedResourceEntriesForReadOnly as ws, planOrphanAdoption as wt, getDockerCmd as wu, contributorInsightsRefusals as x, unsettledPropertiesOf as xa, maskWholeValue as xc, displayAssemblyPath as xd, unsupportedFinalSnapshotError as xi, isSingleDynamicReferenceToken as xl, undeclaredEmptyObservedKeys as xn, UNREADABLE_ORPHANS_CONTAINER_ROW as xo, hintSidesOf as xr, repairMalformedOrphanRecordsForReadOnly as xs, mergeNoChangeOutputs as xt, dockerSpawnEnvWithSensitive as xu, streamTagsMatchDeclared as y, DiffCalculator as ya, maskAtCoordinates as yc, absoluteAssemblyPathEscape as yd, isFinalSnapshotError as yi, wholeStringLeavesOf as yl, equalModuloMarkedMask as yn, STATE_REGION_DIVERGED as yo, formatDestructiveChange as yr, refuseMalformedResourcesForExport as ys, isSecretBearingReferenceString as yt, describeDockerExecFailure as yu, relayedIndexBusyDelete as z, applyRoleArnIfSet as za, literalSplitDelimitersOf as zc, definedAttributes as zi, hasReasonlessBaselineRefusal as zl, redactedDeleteAddressSkip as zn, malformedOrphanRowsKeptWarning as zo, red as zr, MULTI_REGION_RECREATE_BLOCKED_TYPES as zs, collectNestedChildUnaddressed as zt, getLegacyStateBucketName as zu };
|
|
54773
|
+
//# sourceMappingURL=deploy-engine-DZO2SOQJ.js.map
|