@go-to-k/cdkd 0.296.6 → 0.296.8
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-C1TlpooI.js → asg-provider-BDJ1qN0J.js} +2 -2
- package/dist/{asg-provider-C1TlpooI.js.map → asg-provider-BDJ1qN0J.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-BPcBCyUE.js → deploy-engine-iXgQFHYR.js} +594 -408
- package/dist/deploy-engine-iXgQFHYR.js.map +1 -0
- package/dist/{iam-role-provider-CVIClaZV.js → iam-role-provider-B1Ma2zVK.js} +117 -6
- package/dist/iam-role-provider-B1Ma2zVK.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/{neptune-provider-CvY6ekmg.js → neptune-provider-C-WMp2hQ.js} +2 -2
- package/dist/{neptune-provider-CvY6ekmg.js.map → neptune-provider-C-WMp2hQ.js.map} +1 -1
- package/dist/{program-CAlg2KEF.js → program-CPziYRDp.js} +130 -78
- package/dist/program-CPziYRDp.js.map +1 -0
- package/dist/{provider-classes-oRTqcSCp.js → provider-classes-CxXTKgEM.js} +177 -117
- package/dist/provider-classes-CxXTKgEM.js.map +1 -0
- package/dist/{rds-provider-DeGFzOUc.js → rds-provider-C193wAF8.js} +2 -2
- package/dist/{rds-provider-DeGFzOUc.js.map → rds-provider-C193wAF8.js.map} +1 -1
- package/dist/{version-BgqcIKdb.js → version-Br6yDF8t.js} +2 -2
- package/dist/{version-BgqcIKdb.js.map → version-Br6yDF8t.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-BPcBCyUE.js.map +0 -1
- package/dist/iam-role-provider-CVIClaZV.js.map +0 -1
- package/dist/program-CAlg2KEF.js.map +0 -1
- package/dist/provider-classes-oRTqcSCp.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js"
|
|
|
2
2
|
import { A as displayIdent, C as withoutGeneratedFallbackName, D as UNRENDERABLE, E as STACK_REF_MAX_CODE_POINTS, F as plainIdentOr, I as safeMsg, M as displayStackName, N as isPasteableIdent, R as truncateCodePoints, S as withStackName, T as SECRET_REF_MAX_CODE_POINTS, _ as generateResourceNameWithFallback, b as looksLikeCdkdGeneratedName, c as installLogLineMaskerSource, g as generateResourceName, h as explicitNamePropertyFor, j as displaySafe, k as displayAwsMessage, l as getLiveRenderer, n as getLogger, p as applyDefaultNameForFallback, r as isStdoutReservedForPayload, s as currentLogLineMasker, v as getCurrentSkipPrefix, x as withSkipPrefix, y as getCurrentStackName } from "./logger-DAaB7GFO.js";
|
|
3
3
|
import { $n as markRedactedCause, $t as LockError, A as isTerminalDeleteFailure, At as CUSTOM_RESOURCE_RESPONSE_PREFIX, Bn as isAmbiguousCcHandlerErrorCode, Bt as clientDefaultsFor, C as refusalTypeShown, Cn as physicalIdShownBesideCommand, Ct as buildForceUnlockCommand, D as ProtectionFlipRegistry, Dn as shellQuote, Dt as formatLockOperation, En as shellBoundedDisplay, Et as formatLockExpiry, Fn as isRecreateRetryableError, Ft as producerRecordKey, Gn as retryClassificationText, H as pasteableAwsCommand, Hn as isIamPropagationError, Ht as AccountIdUnavailableError, In as isReplayedNameCollisionFrom, J as isInterruptedWaitError, Jn as safeStringify$1, Kn as describeAwsFailure, Kt as CrossAccountSecretRefusalError, Lt as withPasteableAwsProfile, M as observeThenDisableProtection, Mn as hasReplayMayCollide, Mt as injectiveKey, N as protectionFlipKey, Nn as isNameCollisionErrorFrom, O as compensateProtectionFlip, On as withheldTargetClause, Ot as formatLockOwner, Pn as isNameCooldownError, Q as canonicalizeRoute53QueryName, Qn as markNonRetryable, R as DELETION_PROTECTION_DOC_POINTER, Rn as markReplayMayCollide, Rt as ambientClientDefaults, S as quotedRemedyLogicalId, Sn as pasteableCommand, St as UNREPRODUCIBLE_LOCK_CLAUSE, T as resolveExplicitPhysicalId, Tn as quotedOrDescribed, U as protectedReplacementAdvice, Un as isRetryableTransientError, Ut as AssetError, Vn as isAmbiguousOutcomeError, Vt as credentialFingerprint, Wn as isTransientServerError, Wt as CdkdError, X as ElapsedBudgetRegistry, Xn as isMarkedNonRetryable, Xt as IntrinsicResolutionRefusalError, Y as startInterruptWatch, Yt as DynamicReferenceRegionAmbiguousError, Z as monotonicNowMs, Zn as isThrottlingError, _n as SHELL_ACTIVE_WHY, _t as hasCreatedBeforeFailure, an as ResourceTimeoutError, at as segmentAfterAnchor, b as isQuotableImportValue, bt as markAuxiliaryFailure, ct as createMaskedRetryLogger, d as prepareRemovalForUpdate, dt as maskerOrIdentity, en as MacroExpansionError, er as wrapMaskedAwsError, et as compositeIdSeparatorRefusal, f as removalWarning, ft as withDerivedNameMasks, g as assertRegionMatch, gn as SHELL_ACTIVE, gt as createdBeforeFailure, h as RESOURCE_NOT_FOUND, i as holdsSecretDerivedEntry, in as ProvisioningError, it as resourceTypeShown, jn as isUpdateUnsupportedError, jt as DEFAULT_STATE_PREFIX, k as deleteWithProtectionCompensation, kt as sanitizeRecoveryValue, l as withUnchangedSecretPrincipalLists, ln as StateError, lt as isSecretDerivedValue, m as withoutInjectedRemovals, mt as carryCreatedBeforeFailure, nt as logicalIdShown, on as ResourceUpdateNotSupportedError, ot as stateOrphanRecordRemedy, pn as normalizeAwsError, pt as RETRY_AUXILIARY_OWNER, qt as DependencyError, st as createMaskedLogSinks, tn as MalformedProducerRecordRefusalError, un as SynthesisError, ut as maskDeep, vn as UNSHOWABLE_VALUE, vt as isAuxiliaryFailure, wn as plainOrDescribed, x as normalizeAwsTagsToCfn, xn as isInertUnquoted, xt as markCreatedBeforeFailure, yn as commandHole, yt as isAuxiliaryMarkOf, zn as formatRetryClassificationSignals, zt as ambientCredentialConfig } from "./iam-policy-targets-td1X_kKN.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-D0q0z4dG.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-Br6yDF8t.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
8
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -6822,6 +6822,330 @@ function positionListByCrossStackSource(bag, source, secrets) {
|
|
|
6822
6822
|
return certifiedListForLeaf(secrets, association, bag);
|
|
6823
6823
|
}
|
|
6824
6824
|
|
|
6825
|
+
//#endregion
|
|
6826
|
+
//#region src/deployment/secret-redaction/fresh-noecho.ts
|
|
6827
|
+
function embedsFreshNoEchoValue(text, secrets) {
|
|
6828
|
+
const fresh = freshNoEchoValuesOf.get(secrets);
|
|
6829
|
+
if (fresh === void 0) return false;
|
|
6830
|
+
for (const value of fresh) if (isMaskOnlyPlaintext(secrets, value) && text.includes(value)) return true;
|
|
6831
|
+
return false;
|
|
6832
|
+
}
|
|
6833
|
+
function carriesFreshNoEchoValue(value, secrets) {
|
|
6834
|
+
const isFresh = freshNoEchoLeafTest(secrets);
|
|
6835
|
+
if (isFresh === void 0) return false;
|
|
6836
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6837
|
+
const walk = (node) => {
|
|
6838
|
+
if (typeof node === "string") return isFresh(node);
|
|
6839
|
+
if (node === null || typeof node !== "object") return false;
|
|
6840
|
+
if (seen.has(node)) return false;
|
|
6841
|
+
seen.add(node);
|
|
6842
|
+
if (Array.isArray(node)) return node.some((item) => walk(item));
|
|
6843
|
+
return Object.values(node).some((child) => walk(child));
|
|
6844
|
+
};
|
|
6845
|
+
return walk(value);
|
|
6846
|
+
}
|
|
6847
|
+
function freshNoEchoLeafPositions(value, secrets) {
|
|
6848
|
+
const isFresh = freshNoEchoLeafTest(secrets);
|
|
6849
|
+
if (isFresh === void 0) return [];
|
|
6850
|
+
const leaves = [];
|
|
6851
|
+
const ancestors = /* @__PURE__ */ new Set();
|
|
6852
|
+
const walk = (node, path) => {
|
|
6853
|
+
if (typeof node === "string") {
|
|
6854
|
+
if (isFresh(node)) leaves.push({
|
|
6855
|
+
path,
|
|
6856
|
+
plaintext: node
|
|
6857
|
+
});
|
|
6858
|
+
return;
|
|
6859
|
+
}
|
|
6860
|
+
if (node === null || typeof node !== "object") return;
|
|
6861
|
+
if (ancestors.has(node)) return;
|
|
6862
|
+
ancestors.add(node);
|
|
6863
|
+
if (Array.isArray(node)) node.forEach((item, index) => walk(item, [...path, index]));
|
|
6864
|
+
else for (const [key, child] of Object.entries(node)) walk(child, [...path, key]);
|
|
6865
|
+
ancestors.delete(node);
|
|
6866
|
+
};
|
|
6867
|
+
walk(value, []);
|
|
6868
|
+
return leaves;
|
|
6869
|
+
}
|
|
6870
|
+
function freshNoEchoLeafTest(secrets) {
|
|
6871
|
+
const fresh = freshNoEchoValuesOf.get(secrets);
|
|
6872
|
+
if (fresh === void 0 || fresh.size === 0) return void 0;
|
|
6873
|
+
const needles = containmentNeedlesOf(secrets).filter((needle) => fresh.has(needle));
|
|
6874
|
+
return (leaf) => fresh.has(leaf) && isMaskOnlyPlaintext(secrets, leaf) || leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
|
|
6875
|
+
}
|
|
6876
|
+
function containmentNeedlesOf(secrets) {
|
|
6877
|
+
const values = containmentValuesOf.get(secrets);
|
|
6878
|
+
if (values === void 0 || values.size === 0) return [];
|
|
6879
|
+
const needles = [];
|
|
6880
|
+
for (const value of values) if (value.length >= 4 && isMaskOnlyPlaintext(secrets, value)) needles.push(value);
|
|
6881
|
+
return needles;
|
|
6882
|
+
}
|
|
6883
|
+
function isStrictlyInsideASpan(spans, start, end) {
|
|
6884
|
+
return spans.some((span) => span.start <= start && end <= span.end && (span.start !== start || span.end !== end));
|
|
6885
|
+
}
|
|
6886
|
+
function embedsNeedleOutsideReferences(leaf, needles, secrets) {
|
|
6887
|
+
let spans;
|
|
6888
|
+
for (const needle of needles) for (let at = leaf.indexOf(needle); at >= 0; at = leaf.indexOf(needle, at + 1)) {
|
|
6889
|
+
spans ??= isDynamicReferenceString(leaf) ? resolvableReferenceSpans(leaf, new Set(secrets.values())) : [];
|
|
6890
|
+
if (!isStrictlyInsideASpan(spans, at, at + needle.length)) return true;
|
|
6891
|
+
}
|
|
6892
|
+
return false;
|
|
6893
|
+
}
|
|
6894
|
+
function flattenEmbeddedNoEchoLeaves(value, secrets) {
|
|
6895
|
+
const needles = containmentNeedlesOf(secrets);
|
|
6896
|
+
if (needles.length === 0) return value;
|
|
6897
|
+
const flattens = (leaf) => leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
|
|
6898
|
+
const walk = (node) => {
|
|
6899
|
+
if (typeof node === "string") return flattens(node) ? "***" : node;
|
|
6900
|
+
if (node === null || typeof node !== "object") return node;
|
|
6901
|
+
if (Array.isArray(node)) {
|
|
6902
|
+
let changed = false;
|
|
6903
|
+
const out = node.map((item) => {
|
|
6904
|
+
const next = walk(item);
|
|
6905
|
+
if (next !== item) changed = true;
|
|
6906
|
+
return next;
|
|
6907
|
+
});
|
|
6908
|
+
return changed ? out : node;
|
|
6909
|
+
}
|
|
6910
|
+
if (isOrdinaryDate(node)) {
|
|
6911
|
+
const persisted = node.toJSON();
|
|
6912
|
+
return typeof persisted === "string" && flattens(persisted) ? "***" : node;
|
|
6913
|
+
}
|
|
6914
|
+
let out;
|
|
6915
|
+
for (const [key, child] of Object.entries(node)) {
|
|
6916
|
+
const next = walk(child);
|
|
6917
|
+
if (next === child) continue;
|
|
6918
|
+
out ??= Object.assign(Object.create(null), node);
|
|
6919
|
+
out[key] = next;
|
|
6920
|
+
}
|
|
6921
|
+
return out ?? node;
|
|
6922
|
+
};
|
|
6923
|
+
return walk(value);
|
|
6924
|
+
}
|
|
6925
|
+
function substringNeedlesOf(secrets) {
|
|
6926
|
+
const needles = [];
|
|
6927
|
+
for (const plaintext of secrets.keys()) if (!isMaskOnlyPlaintext(secrets, plaintext)) needles.push(plaintext);
|
|
6928
|
+
return needles;
|
|
6929
|
+
}
|
|
6930
|
+
function recordedExpressionsOf(secrets) {
|
|
6931
|
+
const expressions = /* @__PURE__ */ new Set();
|
|
6932
|
+
for (const [plaintext, expression] of secrets) if (!isMaskOnlyPlaintext(secrets, plaintext)) expressions.add(expression);
|
|
6933
|
+
return expressions;
|
|
6934
|
+
}
|
|
6935
|
+
const recoverableMaskedOutputs = /* @__PURE__ */ new Map();
|
|
6936
|
+
function maskedOutputKey(identity, stackName, region, outputKey) {
|
|
6937
|
+
return `${identity}\u0000${stackName}\u0000${region}\u0000${outputKey}`;
|
|
6938
|
+
}
|
|
6939
|
+
function recordRecoverableMaskedOutput(identity, stackName, region, outputKey, plaintext) {
|
|
6940
|
+
recoverableMaskedOutputs.set(maskedOutputKey(identity, stackName, region, outputKey), plaintext);
|
|
6941
|
+
}
|
|
6942
|
+
function recoverMaskedOutput(identity, stackName, region, outputKey) {
|
|
6943
|
+
return recoverableMaskedOutputs.get(maskedOutputKey(identity, stackName, region, outputKey));
|
|
6944
|
+
}
|
|
6945
|
+
|
|
6946
|
+
//#endregion
|
|
6947
|
+
//#region src/deployment/secret-redaction/nested-stack.ts
|
|
6948
|
+
const NESTED_STACK_RESOURCE_TYPE$4 = "AWS::CloudFormation::Stack";
|
|
6949
|
+
const nestedStackParameterExpressions = /* @__PURE__ */ new WeakMap();
|
|
6950
|
+
const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
|
|
6951
|
+
function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
|
|
6952
|
+
if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
|
|
6953
|
+
if (secrets.size === 0) return;
|
|
6954
|
+
if (!isPlainObject$4(resolvedProperties) || !isPlainObject$4(sourceProperties)) return;
|
|
6955
|
+
if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
|
|
6956
|
+
if (!Object.hasOwn(sourceProperties, "Parameters")) return;
|
|
6957
|
+
const resolvedParameters = resolvedProperties["Parameters"];
|
|
6958
|
+
const sourceParameters = sourceProperties["Parameters"];
|
|
6959
|
+
if (!isPlainObject$4(resolvedParameters) || !isPlainObject$4(sourceParameters)) return;
|
|
6960
|
+
const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
|
|
6961
|
+
let table = nestedStackParameterExpressions.get(secrets);
|
|
6962
|
+
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
6963
|
+
if (typeof resolvedValue !== "string" || !secrets.has(resolvedValue)) continue;
|
|
6964
|
+
const expression = positioned[name];
|
|
6965
|
+
if (typeof expression !== "string") continue;
|
|
6966
|
+
if (!isSingleDynamicReferenceToken(expression)) continue;
|
|
6967
|
+
const sourceLeaf = sourceParameters[name];
|
|
6968
|
+
if (typeof sourceLeaf === "string" && expression !== sourceLeaf) continue;
|
|
6969
|
+
if (expression === resolvedValue) continue;
|
|
6970
|
+
const seenResolvingTo = plaintextIndexOf(secrets).get(expression);
|
|
6971
|
+
if (seenResolvingTo !== void 0 && seenResolvingTo !== resolvedValue) continue;
|
|
6972
|
+
if (typeof sourceLeaf === "string" && resolvedPlaintextOf(secrets, expression) !== resolvedValue) continue;
|
|
6973
|
+
if (table === void 0) {
|
|
6974
|
+
table = /* @__PURE__ */ new Map();
|
|
6975
|
+
nestedStackParameterExpressions.set(secrets, table);
|
|
6976
|
+
}
|
|
6977
|
+
storeAssociation(table, name, expression, resolvedValue);
|
|
6978
|
+
}
|
|
6979
|
+
const framesByValue = /* @__PURE__ */ new Map();
|
|
6980
|
+
const tokensOf = /* @__PURE__ */ new Map();
|
|
6981
|
+
const frameSpellings = /* @__PURE__ */ new Map();
|
|
6982
|
+
const frameSpellingOf = (name) => {
|
|
6983
|
+
if (!frameSpellings.has(name)) frameSpellings.set(name, computeFrameSpelling(name));
|
|
6984
|
+
return frameSpellings.get(name);
|
|
6985
|
+
};
|
|
6986
|
+
const computeFrameSpelling = (name) => {
|
|
6987
|
+
const resolvedValue = resolvedParameters[name];
|
|
6988
|
+
if (typeof resolvedValue !== "string") return void 0;
|
|
6989
|
+
const sourceLeaf = sourceParameters[name];
|
|
6990
|
+
if (typeof sourceLeaf === "string") return sourceLeaf;
|
|
6991
|
+
if (!isPlainObject$4(sourceLeaf)) return void 0;
|
|
6992
|
+
const written = positioned[name];
|
|
6993
|
+
if (typeof written !== "string") return void 0;
|
|
6994
|
+
const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
|
|
6995
|
+
const spans = rendered === void 0 ? [] : dynamicReferenceSpans(rendered);
|
|
6996
|
+
if (rendered !== void 0 && spans.length === 1) {
|
|
6997
|
+
const [span] = spans;
|
|
6998
|
+
const ownToken = rendered.slice(span.start, span.end);
|
|
6999
|
+
if (written !== resolvedValue && SPELLED_SECRET_REFERENCE_PREFIXES.some((prefix) => ownToken.startsWith(prefix))) return written;
|
|
7000
|
+
}
|
|
7001
|
+
const substituted = substitutedSpellingOf(secrets, sourceLeaf, resolvedValue);
|
|
7002
|
+
if (substituted === void 0) return void 0;
|
|
7003
|
+
return written === resolvedValue || written === substituted ? substituted : void 0;
|
|
7004
|
+
};
|
|
7005
|
+
const certifiedSpellingOf = (name) => {
|
|
7006
|
+
const sourceLeaf = sourceParameters[name];
|
|
7007
|
+
if (typeof sourceLeaf === "string") return positioned[name] === sourceLeaf ? sourceLeaf : void 0;
|
|
7008
|
+
return frameSpellingOf(name);
|
|
7009
|
+
};
|
|
7010
|
+
const unwrittenValues = /* @__PURE__ */ new Set();
|
|
7011
|
+
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
7012
|
+
if (typeof resolvedValue !== "string") continue;
|
|
7013
|
+
const spelling = frameSpellingOf(name);
|
|
7014
|
+
const frame = spelling === void 0 ? void 0 : singleSpanFrame(resolvedValue, spelling);
|
|
7015
|
+
const frames = framesByValue.get(resolvedValue) ?? /* @__PURE__ */ new Set();
|
|
7016
|
+
const unframed = frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle;
|
|
7017
|
+
frames.add(unframed ? UNFRAMED_SPELLING : `${frame.prefix.length}:${frame.prefix}${frame.suffix}`);
|
|
7018
|
+
framesByValue.set(resolvedValue, frames);
|
|
7019
|
+
if (!unframed) {
|
|
7020
|
+
const tokens = tokensOf.get(resolvedValue) ?? /* @__PURE__ */ new Set();
|
|
7021
|
+
tokens.add(frame.token);
|
|
7022
|
+
tokensOf.set(resolvedValue, tokens);
|
|
7023
|
+
if (typeof sourceParameters[name] !== "string" && positioned[name] !== spelling) unwrittenValues.add(resolvedValue);
|
|
7024
|
+
}
|
|
7025
|
+
}
|
|
7026
|
+
for (const value of unwrittenValues) if (tokensOf.get(value)?.size !== 1) framesByValue.get(value)?.add(UNFRAMED_SPELLING);
|
|
7027
|
+
const rowWithoutParameters = {};
|
|
7028
|
+
for (const [key, value] of Object.entries(resolvedProperties)) if (key !== "Parameters") rowWithoutParameters[key] = value;
|
|
7029
|
+
const outsideLeaves = wholeStringLeavesOf(rowWithoutParameters);
|
|
7030
|
+
const framed = /* @__PURE__ */ new Map();
|
|
7031
|
+
const framedByName = [];
|
|
7032
|
+
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
7033
|
+
if (typeof resolvedValue !== "string") continue;
|
|
7034
|
+
const spelling = certifiedSpellingOf(name);
|
|
7035
|
+
if (spelling === void 0) continue;
|
|
7036
|
+
if (redactSecretsForState(resolvedValue, secrets) !== resolvedValue) continue;
|
|
7037
|
+
const frame = singleSpanFrame(resolvedValue, spelling);
|
|
7038
|
+
if (frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle) continue;
|
|
7039
|
+
if (framesByValue.get(resolvedValue)?.size !== 1) continue;
|
|
7040
|
+
const isNeedle = resolvedValue.length >= 4;
|
|
7041
|
+
const rewrites = (leaf) => leaf === resolvedValue || isNeedle && leaf.includes(resolvedValue);
|
|
7042
|
+
let embedded = false;
|
|
7043
|
+
for (const leaf of outsideLeaves) if (rewrites(leaf)) {
|
|
7044
|
+
embedded = true;
|
|
7045
|
+
break;
|
|
7046
|
+
}
|
|
7047
|
+
for (const other of Object.values(resolvedParameters)) {
|
|
7048
|
+
if (embedded) break;
|
|
7049
|
+
if (typeof other === "string") {
|
|
7050
|
+
if (other !== resolvedValue && rewrites(other)) embedded = true;
|
|
7051
|
+
continue;
|
|
7052
|
+
}
|
|
7053
|
+
for (const leaf of wholeStringLeavesOf(other)) if (rewrites(leaf)) {
|
|
7054
|
+
embedded = true;
|
|
7055
|
+
break;
|
|
7056
|
+
}
|
|
7057
|
+
}
|
|
7058
|
+
if (embedded) continue;
|
|
7059
|
+
framedByName.push([
|
|
7060
|
+
name,
|
|
7061
|
+
spelling,
|
|
7062
|
+
resolvedValue
|
|
7063
|
+
]);
|
|
7064
|
+
if (secrets.get(frame.middle) !== frame.token && tokensOf.get(resolvedValue)?.size !== 1) continue;
|
|
7065
|
+
framed.set(resolvedValue, spelling);
|
|
7066
|
+
}
|
|
7067
|
+
for (const [plaintext, expression] of framed) secrets.set(plaintext, expression);
|
|
7068
|
+
for (const [name, expression, plaintext] of framedByName) {
|
|
7069
|
+
if (table === void 0) {
|
|
7070
|
+
table = /* @__PURE__ */ new Map();
|
|
7071
|
+
nestedStackParameterExpressions.set(secrets, table);
|
|
7072
|
+
}
|
|
7073
|
+
storeAssociation(table, name, expression, plaintext);
|
|
7074
|
+
}
|
|
7075
|
+
}
|
|
7076
|
+
function inheritNestedStackParameterAssociations(childSecrets, parentSecrets) {
|
|
7077
|
+
const table = nestedStackParameterExpressions.get(parentSecrets);
|
|
7078
|
+
if (table === void 0 || table.size === 0) return;
|
|
7079
|
+
let associations = crossStackAssociations.get(childSecrets);
|
|
7080
|
+
for (const [name, association] of table) {
|
|
7081
|
+
const key = crossStackSourceKey({ Ref: name });
|
|
7082
|
+
if (key === void 0) continue;
|
|
7083
|
+
if (associations === void 0) {
|
|
7084
|
+
associations = /* @__PURE__ */ new Map();
|
|
7085
|
+
crossStackAssociations.set(childSecrets, associations);
|
|
7086
|
+
}
|
|
7087
|
+
if (typeof association === "symbol") {
|
|
7088
|
+
associations.set(key, association);
|
|
7089
|
+
continue;
|
|
7090
|
+
}
|
|
7091
|
+
storeAssociation(associations, key, association.expression, association.plaintext);
|
|
7092
|
+
}
|
|
7093
|
+
}
|
|
7094
|
+
function inheritedParameterExpression(parentSecrets, parameterName, resolvedValue) {
|
|
7095
|
+
const association = nestedStackParameterExpressions.get(parentSecrets)?.get(parameterName);
|
|
7096
|
+
if (association === void 0 || typeof association === "symbol") return void 0;
|
|
7097
|
+
if (Array.isArray(resolvedValue)) return certifiedListForLeaf(parentSecrets, association, resolvedValue);
|
|
7098
|
+
return certifiedExpressionForLeaf(parentSecrets, association, resolvedValue);
|
|
7099
|
+
}
|
|
7100
|
+
const inheritedParameterReads = /* @__PURE__ */ new WeakMap();
|
|
7101
|
+
const POISONED_PARAMETER_READS = Symbol("cdkd.inherited-parameter-reads.poisoned");
|
|
7102
|
+
function recordInheritedParameterRead(childSecrets, parentSecrets, parameterName) {
|
|
7103
|
+
const reads = inheritedParameterReads.get(childSecrets);
|
|
7104
|
+
if (reads === void 0) {
|
|
7105
|
+
inheritedParameterReads.set(childSecrets, {
|
|
7106
|
+
parent: parentSecrets,
|
|
7107
|
+
names: /* @__PURE__ */ new Set([parameterName])
|
|
7108
|
+
});
|
|
7109
|
+
return;
|
|
7110
|
+
}
|
|
7111
|
+
if (typeof reads === "symbol") return;
|
|
7112
|
+
if (reads.parent !== parentSecrets) {
|
|
7113
|
+
inheritedParameterReads.set(childSecrets, POISONED_PARAMETER_READS);
|
|
7114
|
+
return;
|
|
7115
|
+
}
|
|
7116
|
+
reads.names.add(parameterName);
|
|
7117
|
+
}
|
|
7118
|
+
function redactInheritedParameterValue(parentSecrets, parameterName, value) {
|
|
7119
|
+
return inheritedParameterExpression(parentSecrets, parameterName, value) ?? redactSecretsForState(value, parentSecrets);
|
|
7120
|
+
}
|
|
7121
|
+
function positionByInheritedParameter(bag, source, secrets) {
|
|
7122
|
+
const keys = Object.keys(source);
|
|
7123
|
+
if (keys.length !== 1 || keys[0] !== "Ref") return void 0;
|
|
7124
|
+
const name = source["Ref"];
|
|
7125
|
+
if (typeof name !== "string") return void 0;
|
|
7126
|
+
const reads = inheritedParameterReads.get(secrets);
|
|
7127
|
+
if (reads === void 0 || typeof reads === "symbol" || !reads.names.has(name)) return;
|
|
7128
|
+
if (typeof bag !== "string" && !Array.isArray(bag)) return void 0;
|
|
7129
|
+
if (carriesChildOnlyPlaintext(bag, secrets, reads.parent)) return void 0;
|
|
7130
|
+
const answer = redactInheritedParameterValue(reads.parent, name, bag);
|
|
7131
|
+
if (!deepEqualJsonValue(redactSecretsForState(answer, secrets), answer)) return void 0;
|
|
7132
|
+
return answer;
|
|
7133
|
+
}
|
|
7134
|
+
function carriesChildOnlyPlaintext(value, childSecrets, parentSecrets) {
|
|
7135
|
+
const parentNeedles = new Set(substringNeedlesOf(parentSecrets));
|
|
7136
|
+
const childNeedles = new Set(substringNeedlesOf(childSecrets));
|
|
7137
|
+
const childOnly = [...childSecrets.keys()].filter((plaintext) => plaintext !== "" && (!parentSecrets.has(plaintext) || childNeedles.has(plaintext) && !parentNeedles.has(plaintext)));
|
|
7138
|
+
for (const needle of parentNeedles) if (needle.length >= 4 && !childSecrets.has(needle)) childOnly.push(needle);
|
|
7139
|
+
if (childOnly.length === 0) return false;
|
|
7140
|
+
const visit = (node) => {
|
|
7141
|
+
if (typeof node === "string") return childOnly.some((plaintext) => node.includes(plaintext));
|
|
7142
|
+
if (Array.isArray(node)) return node.some(visit);
|
|
7143
|
+
if (node !== null && typeof node === "object") return Object.values(node).some(visit);
|
|
7144
|
+
return false;
|
|
7145
|
+
};
|
|
7146
|
+
return visit(value);
|
|
7147
|
+
}
|
|
7148
|
+
|
|
6825
7149
|
//#endregion
|
|
6826
7150
|
//#region src/deployment/secret-redaction/redact-path.ts
|
|
6827
7151
|
function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
|
|
@@ -6835,6 +7159,10 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
6835
7159
|
}
|
|
6836
7160
|
return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
|
|
6837
7161
|
}
|
|
7162
|
+
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$4(source)) {
|
|
7163
|
+
const inherited = positionByInheritedParameter(bag, source, secrets);
|
|
7164
|
+
if (inherited !== void 0) return inherited;
|
|
7165
|
+
}
|
|
6838
7166
|
if (typeof bag === "string" && isPlainObject$4(source)) {
|
|
6839
7167
|
const certified = positionByCrossStackSource(bag, source, secrets);
|
|
6840
7168
|
if (certified !== void 0) return certified;
|
|
@@ -7189,127 +7517,6 @@ function deriveReadbackNeedles(bag, source, secrets, rules) {
|
|
|
7189
7517
|
};
|
|
7190
7518
|
}
|
|
7191
7519
|
|
|
7192
|
-
//#endregion
|
|
7193
|
-
//#region src/deployment/secret-redaction/fresh-noecho.ts
|
|
7194
|
-
function embedsFreshNoEchoValue(text, secrets) {
|
|
7195
|
-
const fresh = freshNoEchoValuesOf.get(secrets);
|
|
7196
|
-
if (fresh === void 0) return false;
|
|
7197
|
-
for (const value of fresh) if (isMaskOnlyPlaintext(secrets, value) && text.includes(value)) return true;
|
|
7198
|
-
return false;
|
|
7199
|
-
}
|
|
7200
|
-
function carriesFreshNoEchoValue(value, secrets) {
|
|
7201
|
-
const isFresh = freshNoEchoLeafTest(secrets);
|
|
7202
|
-
if (isFresh === void 0) return false;
|
|
7203
|
-
const seen = /* @__PURE__ */ new Set();
|
|
7204
|
-
const walk = (node) => {
|
|
7205
|
-
if (typeof node === "string") return isFresh(node);
|
|
7206
|
-
if (node === null || typeof node !== "object") return false;
|
|
7207
|
-
if (seen.has(node)) return false;
|
|
7208
|
-
seen.add(node);
|
|
7209
|
-
if (Array.isArray(node)) return node.some((item) => walk(item));
|
|
7210
|
-
return Object.values(node).some((child) => walk(child));
|
|
7211
|
-
};
|
|
7212
|
-
return walk(value);
|
|
7213
|
-
}
|
|
7214
|
-
function freshNoEchoLeafPositions(value, secrets) {
|
|
7215
|
-
const isFresh = freshNoEchoLeafTest(secrets);
|
|
7216
|
-
if (isFresh === void 0) return [];
|
|
7217
|
-
const leaves = [];
|
|
7218
|
-
const ancestors = /* @__PURE__ */ new Set();
|
|
7219
|
-
const walk = (node, path) => {
|
|
7220
|
-
if (typeof node === "string") {
|
|
7221
|
-
if (isFresh(node)) leaves.push({
|
|
7222
|
-
path,
|
|
7223
|
-
plaintext: node
|
|
7224
|
-
});
|
|
7225
|
-
return;
|
|
7226
|
-
}
|
|
7227
|
-
if (node === null || typeof node !== "object") return;
|
|
7228
|
-
if (ancestors.has(node)) return;
|
|
7229
|
-
ancestors.add(node);
|
|
7230
|
-
if (Array.isArray(node)) node.forEach((item, index) => walk(item, [...path, index]));
|
|
7231
|
-
else for (const [key, child] of Object.entries(node)) walk(child, [...path, key]);
|
|
7232
|
-
ancestors.delete(node);
|
|
7233
|
-
};
|
|
7234
|
-
walk(value, []);
|
|
7235
|
-
return leaves;
|
|
7236
|
-
}
|
|
7237
|
-
function freshNoEchoLeafTest(secrets) {
|
|
7238
|
-
const fresh = freshNoEchoValuesOf.get(secrets);
|
|
7239
|
-
if (fresh === void 0 || fresh.size === 0) return void 0;
|
|
7240
|
-
const needles = containmentNeedlesOf(secrets).filter((needle) => fresh.has(needle));
|
|
7241
|
-
return (leaf) => fresh.has(leaf) && isMaskOnlyPlaintext(secrets, leaf) || leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
|
|
7242
|
-
}
|
|
7243
|
-
function containmentNeedlesOf(secrets) {
|
|
7244
|
-
const values = containmentValuesOf.get(secrets);
|
|
7245
|
-
if (values === void 0 || values.size === 0) return [];
|
|
7246
|
-
const needles = [];
|
|
7247
|
-
for (const value of values) if (value.length >= 4 && isMaskOnlyPlaintext(secrets, value)) needles.push(value);
|
|
7248
|
-
return needles;
|
|
7249
|
-
}
|
|
7250
|
-
function isStrictlyInsideASpan(spans, start, end) {
|
|
7251
|
-
return spans.some((span) => span.start <= start && end <= span.end && (span.start !== start || span.end !== end));
|
|
7252
|
-
}
|
|
7253
|
-
function embedsNeedleOutsideReferences(leaf, needles, secrets) {
|
|
7254
|
-
let spans;
|
|
7255
|
-
for (const needle of needles) for (let at = leaf.indexOf(needle); at >= 0; at = leaf.indexOf(needle, at + 1)) {
|
|
7256
|
-
spans ??= isDynamicReferenceString(leaf) ? resolvableReferenceSpans(leaf, new Set(secrets.values())) : [];
|
|
7257
|
-
if (!isStrictlyInsideASpan(spans, at, at + needle.length)) return true;
|
|
7258
|
-
}
|
|
7259
|
-
return false;
|
|
7260
|
-
}
|
|
7261
|
-
function flattenEmbeddedNoEchoLeaves(value, secrets) {
|
|
7262
|
-
const needles = containmentNeedlesOf(secrets);
|
|
7263
|
-
if (needles.length === 0) return value;
|
|
7264
|
-
const flattens = (leaf) => leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
|
|
7265
|
-
const walk = (node) => {
|
|
7266
|
-
if (typeof node === "string") return flattens(node) ? "***" : node;
|
|
7267
|
-
if (node === null || typeof node !== "object") return node;
|
|
7268
|
-
if (Array.isArray(node)) {
|
|
7269
|
-
let changed = false;
|
|
7270
|
-
const out = node.map((item) => {
|
|
7271
|
-
const next = walk(item);
|
|
7272
|
-
if (next !== item) changed = true;
|
|
7273
|
-
return next;
|
|
7274
|
-
});
|
|
7275
|
-
return changed ? out : node;
|
|
7276
|
-
}
|
|
7277
|
-
if (isOrdinaryDate(node)) {
|
|
7278
|
-
const persisted = node.toJSON();
|
|
7279
|
-
return typeof persisted === "string" && flattens(persisted) ? "***" : node;
|
|
7280
|
-
}
|
|
7281
|
-
let out;
|
|
7282
|
-
for (const [key, child] of Object.entries(node)) {
|
|
7283
|
-
const next = walk(child);
|
|
7284
|
-
if (next === child) continue;
|
|
7285
|
-
out ??= Object.assign(Object.create(null), node);
|
|
7286
|
-
out[key] = next;
|
|
7287
|
-
}
|
|
7288
|
-
return out ?? node;
|
|
7289
|
-
};
|
|
7290
|
-
return walk(value);
|
|
7291
|
-
}
|
|
7292
|
-
function substringNeedlesOf(secrets) {
|
|
7293
|
-
const needles = [];
|
|
7294
|
-
for (const plaintext of secrets.keys()) if (!isMaskOnlyPlaintext(secrets, plaintext)) needles.push(plaintext);
|
|
7295
|
-
return needles;
|
|
7296
|
-
}
|
|
7297
|
-
function recordedExpressionsOf(secrets) {
|
|
7298
|
-
const expressions = /* @__PURE__ */ new Set();
|
|
7299
|
-
for (const [plaintext, expression] of secrets) if (!isMaskOnlyPlaintext(secrets, plaintext)) expressions.add(expression);
|
|
7300
|
-
return expressions;
|
|
7301
|
-
}
|
|
7302
|
-
const recoverableMaskedOutputs = /* @__PURE__ */ new Map();
|
|
7303
|
-
function maskedOutputKey(identity, stackName, region, outputKey) {
|
|
7304
|
-
return `${identity}\u0000${stackName}\u0000${region}\u0000${outputKey}`;
|
|
7305
|
-
}
|
|
7306
|
-
function recordRecoverableMaskedOutput(identity, stackName, region, outputKey, plaintext) {
|
|
7307
|
-
recoverableMaskedOutputs.set(maskedOutputKey(identity, stackName, region, outputKey), plaintext);
|
|
7308
|
-
}
|
|
7309
|
-
function recoverMaskedOutput(identity, stackName, region, outputKey) {
|
|
7310
|
-
return recoverableMaskedOutputs.get(maskedOutputKey(identity, stackName, region, outputKey));
|
|
7311
|
-
}
|
|
7312
|
-
|
|
7313
7520
|
//#endregion
|
|
7314
7521
|
//#region src/deployment/secret-redaction/redact-state.ts
|
|
7315
7522
|
function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RULES) {
|
|
@@ -8023,161 +8230,6 @@ function hasMaskableValues(secrets) {
|
|
|
8023
8230
|
return logOnly !== void 0 && logOnly.size > 0;
|
|
8024
8231
|
}
|
|
8025
8232
|
|
|
8026
|
-
//#endregion
|
|
8027
|
-
//#region src/deployment/secret-redaction/nested-stack.ts
|
|
8028
|
-
const NESTED_STACK_RESOURCE_TYPE$4 = "AWS::CloudFormation::Stack";
|
|
8029
|
-
const nestedStackParameterExpressions = /* @__PURE__ */ new WeakMap();
|
|
8030
|
-
const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
|
|
8031
|
-
function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
|
|
8032
|
-
if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
|
|
8033
|
-
if (secrets.size === 0) return;
|
|
8034
|
-
if (!isPlainObject$4(resolvedProperties) || !isPlainObject$4(sourceProperties)) return;
|
|
8035
|
-
if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
|
|
8036
|
-
if (!Object.hasOwn(sourceProperties, "Parameters")) return;
|
|
8037
|
-
const resolvedParameters = resolvedProperties["Parameters"];
|
|
8038
|
-
const sourceParameters = sourceProperties["Parameters"];
|
|
8039
|
-
if (!isPlainObject$4(resolvedParameters) || !isPlainObject$4(sourceParameters)) return;
|
|
8040
|
-
const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
|
|
8041
|
-
let table = nestedStackParameterExpressions.get(secrets);
|
|
8042
|
-
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
8043
|
-
if (typeof resolvedValue !== "string" || !secrets.has(resolvedValue)) continue;
|
|
8044
|
-
const expression = positioned[name];
|
|
8045
|
-
if (typeof expression !== "string") continue;
|
|
8046
|
-
if (!isSingleDynamicReferenceToken(expression)) continue;
|
|
8047
|
-
const sourceLeaf = sourceParameters[name];
|
|
8048
|
-
if (typeof sourceLeaf === "string" && expression !== sourceLeaf) continue;
|
|
8049
|
-
if (expression === resolvedValue) continue;
|
|
8050
|
-
const seenResolvingTo = plaintextIndexOf(secrets).get(expression);
|
|
8051
|
-
if (seenResolvingTo !== void 0 && seenResolvingTo !== resolvedValue) continue;
|
|
8052
|
-
if (typeof sourceLeaf === "string" && resolvedPlaintextOf(secrets, expression) !== resolvedValue) continue;
|
|
8053
|
-
if (table === void 0) {
|
|
8054
|
-
table = /* @__PURE__ */ new Map();
|
|
8055
|
-
nestedStackParameterExpressions.set(secrets, table);
|
|
8056
|
-
}
|
|
8057
|
-
storeAssociation(table, name, expression, resolvedValue);
|
|
8058
|
-
}
|
|
8059
|
-
const framesByValue = /* @__PURE__ */ new Map();
|
|
8060
|
-
const tokensOf = /* @__PURE__ */ new Map();
|
|
8061
|
-
const frameSpellings = /* @__PURE__ */ new Map();
|
|
8062
|
-
const frameSpellingOf = (name) => {
|
|
8063
|
-
if (!frameSpellings.has(name)) frameSpellings.set(name, computeFrameSpelling(name));
|
|
8064
|
-
return frameSpellings.get(name);
|
|
8065
|
-
};
|
|
8066
|
-
const computeFrameSpelling = (name) => {
|
|
8067
|
-
const resolvedValue = resolvedParameters[name];
|
|
8068
|
-
if (typeof resolvedValue !== "string") return void 0;
|
|
8069
|
-
const sourceLeaf = sourceParameters[name];
|
|
8070
|
-
if (typeof sourceLeaf === "string") return sourceLeaf;
|
|
8071
|
-
if (!isPlainObject$4(sourceLeaf)) return void 0;
|
|
8072
|
-
const written = positioned[name];
|
|
8073
|
-
if (typeof written !== "string") return void 0;
|
|
8074
|
-
const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
|
|
8075
|
-
const spans = rendered === void 0 ? [] : dynamicReferenceSpans(rendered);
|
|
8076
|
-
if (rendered !== void 0 && spans.length === 1) {
|
|
8077
|
-
const [span] = spans;
|
|
8078
|
-
const ownToken = rendered.slice(span.start, span.end);
|
|
8079
|
-
if (written !== resolvedValue && SPELLED_SECRET_REFERENCE_PREFIXES.some((prefix) => ownToken.startsWith(prefix))) return written;
|
|
8080
|
-
}
|
|
8081
|
-
const substituted = substitutedSpellingOf(secrets, sourceLeaf, resolvedValue);
|
|
8082
|
-
if (substituted === void 0) return void 0;
|
|
8083
|
-
return written === resolvedValue || written === substituted ? substituted : void 0;
|
|
8084
|
-
};
|
|
8085
|
-
const certifiedSpellingOf = (name) => {
|
|
8086
|
-
const sourceLeaf = sourceParameters[name];
|
|
8087
|
-
if (typeof sourceLeaf === "string") return positioned[name] === sourceLeaf ? sourceLeaf : void 0;
|
|
8088
|
-
return frameSpellingOf(name);
|
|
8089
|
-
};
|
|
8090
|
-
const unwrittenValues = /* @__PURE__ */ new Set();
|
|
8091
|
-
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
8092
|
-
if (typeof resolvedValue !== "string") continue;
|
|
8093
|
-
const spelling = frameSpellingOf(name);
|
|
8094
|
-
const frame = spelling === void 0 ? void 0 : singleSpanFrame(resolvedValue, spelling);
|
|
8095
|
-
const frames = framesByValue.get(resolvedValue) ?? /* @__PURE__ */ new Set();
|
|
8096
|
-
const unframed = frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle;
|
|
8097
|
-
frames.add(unframed ? UNFRAMED_SPELLING : `${frame.prefix.length}:${frame.prefix}${frame.suffix}`);
|
|
8098
|
-
framesByValue.set(resolvedValue, frames);
|
|
8099
|
-
if (!unframed) {
|
|
8100
|
-
const tokens = tokensOf.get(resolvedValue) ?? /* @__PURE__ */ new Set();
|
|
8101
|
-
tokens.add(frame.token);
|
|
8102
|
-
tokensOf.set(resolvedValue, tokens);
|
|
8103
|
-
if (typeof sourceParameters[name] !== "string" && positioned[name] !== spelling) unwrittenValues.add(resolvedValue);
|
|
8104
|
-
}
|
|
8105
|
-
}
|
|
8106
|
-
for (const value of unwrittenValues) if (tokensOf.get(value)?.size !== 1) framesByValue.get(value)?.add(UNFRAMED_SPELLING);
|
|
8107
|
-
const rowWithoutParameters = {};
|
|
8108
|
-
for (const [key, value] of Object.entries(resolvedProperties)) if (key !== "Parameters") rowWithoutParameters[key] = value;
|
|
8109
|
-
const outsideLeaves = wholeStringLeavesOf(rowWithoutParameters);
|
|
8110
|
-
const framed = /* @__PURE__ */ new Map();
|
|
8111
|
-
const framedByName = [];
|
|
8112
|
-
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
8113
|
-
if (typeof resolvedValue !== "string") continue;
|
|
8114
|
-
const spelling = certifiedSpellingOf(name);
|
|
8115
|
-
if (spelling === void 0) continue;
|
|
8116
|
-
if (redactSecretsForState(resolvedValue, secrets) !== resolvedValue) continue;
|
|
8117
|
-
const frame = singleSpanFrame(resolvedValue, spelling);
|
|
8118
|
-
if (frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle) continue;
|
|
8119
|
-
if (framesByValue.get(resolvedValue)?.size !== 1) continue;
|
|
8120
|
-
const isNeedle = resolvedValue.length >= 4;
|
|
8121
|
-
const rewrites = (leaf) => leaf === resolvedValue || isNeedle && leaf.includes(resolvedValue);
|
|
8122
|
-
let embedded = false;
|
|
8123
|
-
for (const leaf of outsideLeaves) if (rewrites(leaf)) {
|
|
8124
|
-
embedded = true;
|
|
8125
|
-
break;
|
|
8126
|
-
}
|
|
8127
|
-
for (const other of Object.values(resolvedParameters)) {
|
|
8128
|
-
if (embedded) break;
|
|
8129
|
-
if (typeof other === "string") {
|
|
8130
|
-
if (other !== resolvedValue && rewrites(other)) embedded = true;
|
|
8131
|
-
continue;
|
|
8132
|
-
}
|
|
8133
|
-
for (const leaf of wholeStringLeavesOf(other)) if (rewrites(leaf)) {
|
|
8134
|
-
embedded = true;
|
|
8135
|
-
break;
|
|
8136
|
-
}
|
|
8137
|
-
}
|
|
8138
|
-
if (embedded) continue;
|
|
8139
|
-
framedByName.push([
|
|
8140
|
-
name,
|
|
8141
|
-
spelling,
|
|
8142
|
-
resolvedValue
|
|
8143
|
-
]);
|
|
8144
|
-
if (secrets.get(frame.middle) !== frame.token && tokensOf.get(resolvedValue)?.size !== 1) continue;
|
|
8145
|
-
framed.set(resolvedValue, spelling);
|
|
8146
|
-
}
|
|
8147
|
-
for (const [plaintext, expression] of framed) secrets.set(plaintext, expression);
|
|
8148
|
-
for (const [name, expression, plaintext] of framedByName) {
|
|
8149
|
-
if (table === void 0) {
|
|
8150
|
-
table = /* @__PURE__ */ new Map();
|
|
8151
|
-
nestedStackParameterExpressions.set(secrets, table);
|
|
8152
|
-
}
|
|
8153
|
-
storeAssociation(table, name, expression, plaintext);
|
|
8154
|
-
}
|
|
8155
|
-
}
|
|
8156
|
-
function inheritNestedStackParameterAssociations(childSecrets, parentSecrets) {
|
|
8157
|
-
const table = nestedStackParameterExpressions.get(parentSecrets);
|
|
8158
|
-
if (table === void 0 || table.size === 0) return;
|
|
8159
|
-
let associations = crossStackAssociations.get(childSecrets);
|
|
8160
|
-
for (const [name, association] of table) {
|
|
8161
|
-
const key = crossStackSourceKey({ Ref: name });
|
|
8162
|
-
if (key === void 0) continue;
|
|
8163
|
-
if (associations === void 0) {
|
|
8164
|
-
associations = /* @__PURE__ */ new Map();
|
|
8165
|
-
crossStackAssociations.set(childSecrets, associations);
|
|
8166
|
-
}
|
|
8167
|
-
if (typeof association === "symbol") {
|
|
8168
|
-
associations.set(key, association);
|
|
8169
|
-
continue;
|
|
8170
|
-
}
|
|
8171
|
-
storeAssociation(associations, key, association.expression, association.plaintext);
|
|
8172
|
-
}
|
|
8173
|
-
}
|
|
8174
|
-
function inheritedParameterExpression(parentSecrets, parameterName, resolvedValue) {
|
|
8175
|
-
const association = nestedStackParameterExpressions.get(parentSecrets)?.get(parameterName);
|
|
8176
|
-
if (association === void 0 || typeof association === "symbol") return void 0;
|
|
8177
|
-
if (Array.isArray(resolvedValue)) return certifiedListForLeaf(parentSecrets, association, resolvedValue);
|
|
8178
|
-
return certifiedExpressionForLeaf(parentSecrets, association, resolvedValue);
|
|
8179
|
-
}
|
|
8180
|
-
|
|
8181
8233
|
//#endregion
|
|
8182
8234
|
//#region src/deployment/secret-redaction/unresolved-token-frame.ts
|
|
8183
8235
|
function liveMatchesUnresolvedTokenFrame(send, live, unresolvedTokens, secrets) {
|
|
@@ -15185,22 +15237,27 @@ function accountArgs(recovery) {
|
|
|
15185
15237
|
flag: "--state-prefix",
|
|
15186
15238
|
value: prefix,
|
|
15187
15239
|
hole: "prefix",
|
|
15188
|
-
opts:
|
|
15240
|
+
opts: prefixGate(prefix)
|
|
15189
15241
|
});
|
|
15190
15242
|
return args;
|
|
15191
15243
|
}
|
|
15244
|
+
function prefixGate(prefix) {
|
|
15245
|
+
return prefix.split("/").every((seg) => isPasteableIdent(seg)) ? {} : { plainIdent: true };
|
|
15246
|
+
}
|
|
15192
15247
|
const ACCOUNT_FLAG_BY_HOLE = {
|
|
15193
15248
|
profile: "--profile",
|
|
15194
15249
|
bucket: "--state-bucket",
|
|
15195
15250
|
prefix: "--state-prefix"
|
|
15196
15251
|
};
|
|
15197
|
-
function withheldAccountClause(
|
|
15198
|
-
const
|
|
15252
|
+
function withheldAccountClause(recovery, where) {
|
|
15253
|
+
const slashPrefix = recovery?.statePrefix?.includes("/") === true;
|
|
15254
|
+
const parts = withheldAccountValues(recovery).filter((w) => ACCOUNT_FLAG_BY_HOLE[w.hole] !== void 0).map((w) => `the '${ACCOUNT_FLAG_BY_HOLE[w.hole]}' value this run was given ${w.hole === "prefix" && w.reason === "not-plain" && slashPrefix ? PREFIX_NOT_PLAIN_WHY : accountReason(w.reason)}`);
|
|
15199
15255
|
if (parts.length === 0) return "";
|
|
15200
15256
|
const sentence = parts.join(", and ");
|
|
15201
15257
|
const holes = parts.length === 1 ? "a quoted hole in its place" : "quoted holes in their place";
|
|
15202
15258
|
return `${sentence.charAt(0).toUpperCase()}${sentence.slice(1)}, so ${where} ${holes}: replace each such hole whole, quotes included, with the shell-quoted value you passed this run. `;
|
|
15203
15259
|
}
|
|
15260
|
+
const PREFIX_NOT_PLAIN_WHY = "has a '/'-separated part that is not a plain identifier (a letter or digit, then letters, digits, '~', '_', '.' or '-'), the only shape printed in a command beside a labelled line";
|
|
15204
15261
|
function accountReason(reason) {
|
|
15205
15262
|
switch (reason) {
|
|
15206
15263
|
case "altered": return "does not render exactly";
|
|
@@ -15231,7 +15288,7 @@ function confirmKeyListing(recovery) {
|
|
|
15231
15288
|
return accountArgs(recovery).length === 0 ? `'cdkd state list --long'` : `'cdkd state list --long' run with the same account flags as the command lines below`;
|
|
15232
15289
|
}
|
|
15233
15290
|
function destroyAccountClause(recovery) {
|
|
15234
|
-
const clause = withheldAccountClause(
|
|
15291
|
+
const clause = withheldAccountClause(recovery, "the command lines below print");
|
|
15235
15292
|
return clause === "" ? "" : ` ${clause.trimEnd()}`;
|
|
15236
15293
|
}
|
|
15237
15294
|
function refuseMalformedResourcesForDestroy(state, stackName, region, recovery) {
|
|
@@ -15246,8 +15303,7 @@ function divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBody
|
|
|
15246
15303
|
const kind = describeRegionValueKind(divergentBodyRegion);
|
|
15247
15304
|
const opening = exact ? `cdkd will not destroy stack ${shellQuote(safeIdentifier(stackName, cap))} (${shellQuote(safeIdentifier(keyRegion, cap))}): the state record read from that region's key carries a 'region' of its own (${kind}) that is not the key's, and ${lists}` : `cdkd will not destroy the state record this command loaded: it carries a 'region' of its own (${kind}) that is not the region of the key it was read from, and ${lists}`;
|
|
15248
15305
|
const listing = withheldListingPointer(recovery);
|
|
15249
|
-
const
|
|
15250
|
-
const remedy = exact ? "Re-run with --verbose to see what the record's region field holds, then either destroy against the region the resources are really in, or repair that field to match the key it is stored under and re-run. " + withheldAccountClause(withheldAccounts, "the command at the end of this message prints") + "To drop the record and leave the live resources standing, spelled out rather than pasteable because that command DELETES a record: " + dropRecordTemplate(recovery) : "This record's stack name or region does NOT render exactly — what any surrounding output shows is a sanitized form, and another record may render identically — so this message names no target and offers no command against one. List the records with " + (listing.line === void 0 ? `${WITHHELD_LISTING_POINTER}. Inspect it with: ${inspectCommand(void 0, void 0)}` : `${listing.pointer}.` + destroyAccountClause(recovery) + `\n${listing.line}\nInspect it with: ${inspectCommand(void 0, void 0, recovery)}`);
|
|
15306
|
+
const remedy = exact ? "Re-run with --verbose to see what the record's region field holds, then either destroy against the region the resources are really in, or repair that field to match the key it is stored under and re-run. " + withheldAccountClause(recovery, "the command at the end of this message prints") + "To drop the record and leave the live resources standing, spelled out rather than pasteable because that command DELETES a record: " + dropRecordTemplate(recovery) : "This record's stack name or region does NOT render exactly — what any surrounding output shows is a sanitized form, and another record may render identically — so this message names no target and offers no command against one. List the records with " + (listing.line === void 0 ? `${WITHHELD_LISTING_POINTER}. Inspect it with: ${inspectCommand(void 0, void 0)}` : `${listing.pointer}.` + destroyAccountClause(recovery) + `\n${listing.line}\nInspect it with: ${inspectCommand(void 0, void 0, recovery)}`);
|
|
15251
15307
|
return `${opening} ${resourceCount === void 0 ? `— so cdkd can neither count what it would delete nor tell which region it is in` : `— so cdkd cannot tell which region those resources are in`}. cdkd stamps the key's region into every record it writes, so this record was not written by cdkd. Destroying against the key's region would issue every delete there; if the record's own region is the honest half, each delete comes back not-found, which this command reads as ALREADY DELETED — it would report success, remove the record, and leave every resource standing in the other region with nothing naming it. ${remedy}`;
|
|
15252
15308
|
}
|
|
15253
15309
|
function refuseDivergentRecordRegionForDestroy(state, stackName, keyRegion, divergentBodyRegion, recovery, provenOrphans = 0) {
|
|
@@ -15256,14 +15312,14 @@ function refuseDivergentRecordRegionForDestroy(state, stackName, keyRegion, dive
|
|
|
15256
15312
|
if (resourceCount === 0 && provenOrphans === 0) return;
|
|
15257
15313
|
throw markNonRetryable(new CdkdError(divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBodyRegion, resourceCount, recovery, provenOrphans), STATE_REGION_DIVERGED));
|
|
15258
15314
|
}
|
|
15259
|
-
function malformedDeployResourcesRefusalMessage(rawStackName, rawRegion) {
|
|
15315
|
+
function malformedDeployResourcesRefusalMessage(rawStackName, rawRegion, recovery) {
|
|
15260
15316
|
const stackName = absentIfEmpty(rawStackName);
|
|
15261
15317
|
const region = absentIfEmpty(rawRegion);
|
|
15262
|
-
return `${malformedStateDiagnosis(stackName, region)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: an unreadable map reads as ZERO recorded resources, so every resource the template declares is planned as a CREATE and the deploy re-provisions a stack that already exists, colliding on each deterministic name and duplicating the rest, then saves a well-formed record over the only evidence anything was wrong. Reading the bag as EMPTY produces that same plan rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the stack with this map read as EMPTY and warns that it did. ${inspectClause(stackName, region)}Inspect it with: ${inspectCommand(stackName, region)}`;
|
|
15318
|
+
return `${malformedStateDiagnosis(stackName, region)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: an unreadable map reads as ZERO recorded resources, so every resource the template declares is planned as a CREATE and the deploy re-provisions a stack that already exists, colliding on each deterministic name and duplicating the rest, then saves a well-formed record over the only evidence anything was wrong. Reading the bag as EMPTY produces that same plan rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the stack with this map read as EMPTY and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect it with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15263
15319
|
}
|
|
15264
|
-
function refuseMalformedResourcesForDeploy(state, stackName, region) {
|
|
15320
|
+
function refuseMalformedResourcesForDeploy(state, stackName, region, recovery) {
|
|
15265
15321
|
if (hasReadableResources(state)) return;
|
|
15266
|
-
throw markNonRetryable(new CdkdError(malformedDeployResourcesRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED));
|
|
15322
|
+
throw markNonRetryable(new CdkdError(malformedDeployResourcesRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
|
|
15267
15323
|
}
|
|
15268
15324
|
const EXPORT_LEGACY_LEAD = "The record was loaded from its legacy key, which carries no region segment — 'cdkd state show' reads such a record only when its body names a region, and a 'cdkd deploy' will not migrate it while it is torn — so inspect the object directly";
|
|
15269
15325
|
const EXPORT_DELETES_STATE = "'cdkd export' migrates the resources this record lists into CloudFormation and then DELETES the cdkd state, so it refuses rather than continuing, under '--dry-run' too.";
|
|
@@ -15276,19 +15332,19 @@ function refuseMalformedResourcesForExport(state, stackName, region, recovery) {
|
|
|
15276
15332
|
if (hasReadableResources(state)) return;
|
|
15277
15333
|
throw new CdkdError(malformedExportResourcesRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED);
|
|
15278
15334
|
}
|
|
15279
|
-
function malformedRenderedContainersWarning(rawStackName, rawRegion, containers) {
|
|
15335
|
+
function malformedRenderedContainersWarning(rawStackName, rawRegion, containers, recovery) {
|
|
15280
15336
|
const stackName = absentIfEmpty(rawStackName);
|
|
15281
15337
|
const region = absentIfEmpty(rawRegion);
|
|
15282
15338
|
const names = containers.map((name) => `'${safeIdentifier(name, 128)}'`).join(", ");
|
|
15283
|
-
return `${stackClause(stackName, region)} has a non-object ${names} — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so rendering one INVENTS a row per character or element. Continuing with it EMPTY: this view shows no rows there, which is not the same as the record holding none. A per-resource container is named once however many resources hold one. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15339
|
+
return `${stackClause(stackName, region)} has a non-object ${names} — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so rendering one INVENTS a row per character or element. Continuing with it EMPTY: this view shows no rows there, which is not the same as the record holding none. A per-resource container is named once however many resources hold one. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15284
15340
|
}
|
|
15285
15341
|
function absentIfEmpty(value) {
|
|
15286
15342
|
return value === "" ? void 0 : value;
|
|
15287
15343
|
}
|
|
15288
|
-
function malformedResourcesWarning(rawStackName, rawRegion) {
|
|
15344
|
+
function malformedResourcesWarning(rawStackName, rawRegion, recovery) {
|
|
15289
15345
|
const stackName = absentIfEmpty(rawStackName);
|
|
15290
15346
|
const region = absentIfEmpty(rawRegion);
|
|
15291
|
-
return `${malformedStateDiagnosis(stackName, region)} Continuing with an EMPTY resource set: this command's output describes zero resources, which is not the same as the stack having none. ${inspectClause(stackName, region)}Inspect it with: ${inspectCommand(stackName, region)}`;
|
|
15347
|
+
return `${malformedStateDiagnosis(stackName, region)} Continuing with an EMPTY resource set: this command's output describes zero resources, which is not the same as the stack having none. ${inspectClause(stackName, region, recovery)}Inspect it with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15292
15348
|
}
|
|
15293
15349
|
function repairMalformedOutputsForReadOnly(state) {
|
|
15294
15350
|
if (hasReadableOutputs(state)) return false;
|
|
@@ -15296,10 +15352,10 @@ function repairMalformedOutputsForReadOnly(state) {
|
|
|
15296
15352
|
return true;
|
|
15297
15353
|
}
|
|
15298
15354
|
const DEPLOY_REFUSES_OUTPUTS_SENTENCE = "'cdkd deploy' REFUSES this record when it loads it, over this same unreadable 'outputs' map, rather than rebuilding the map over it — repair the stored value before deploying.";
|
|
15299
|
-
function malformedOutputsWarning(rawStackName, rawRegion) {
|
|
15355
|
+
function malformedOutputsWarning(rawStackName, rawRegion, recovery) {
|
|
15300
15356
|
const stackName = absentIfEmpty(rawStackName);
|
|
15301
15357
|
const region = absentIfEmpty(rawRegion);
|
|
15302
|
-
return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. Where the stored value is a string or a list, 'Object.entries' walks it as readily as a map, so diffing it INVENTS a REMOVE row per character or element carrying the record's own characters; where it is a number, a boolean or null, it yields no comparison at all. Continuing with it EMPTY: every output this diff resolves is reported as an ADD and no stored key is reported as a REMOVE, which is not the same as the record holding none. ${DEPLOY_REFUSES_OUTPUTS_SENTENCE} ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
|
|
15358
|
+
return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. Where the stored value is a string or a list, 'Object.entries' walks it as readily as a map, so diffing it INVENTS a REMOVE row per character or element carrying the record's own characters; where it is a number, a boolean or null, it yields no comparison at all. Continuing with it EMPTY: every output this diff resolves is reported as an ADD and no stored key is reported as a REMOVE, which is not the same as the record holding none. ${DEPLOY_REFUSES_OUTPUTS_SENTENCE} ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
|
|
15303
15359
|
}
|
|
15304
15360
|
function refuseMalformedState(state, stackName, region, recovery) {
|
|
15305
15361
|
if (hasReadableResources(state)) return;
|
|
@@ -15310,15 +15366,15 @@ function malformedOutputsRefusalMessage(rawStackName, rawRegion, recovery) {
|
|
|
15310
15366
|
const region = absentIfEmpty(rawRegion);
|
|
15311
15367
|
return inspectTail(`${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first.`, stackName, region, recovery);
|
|
15312
15368
|
}
|
|
15313
|
-
function malformedExportSourceWarning(rawStackName, rawRegion) {
|
|
15369
|
+
function malformedExportSourceWarning(rawStackName, rawRegion, recovery) {
|
|
15314
15370
|
const stackName = absentIfEmpty(rawStackName);
|
|
15315
15371
|
const region = absentIfEmpty(rawRegion);
|
|
15316
|
-
return `${stackClause(stackName, region)} has no readable 'outputs' map or 'exportNames' list — the record is malformed or truncated. It contributes NO exports to this region's index, which is not the same as the stack exporting none: an Fn::ImportValue of a name this stack really publishes will fail in the CONSUMER stack, naming that stack rather than this record. Continuing with the other producers — enumerating a string or a list here would instead publish one FABRICATED export per character or element. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15372
|
+
return `${stackClause(stackName, region)} has no readable 'outputs' map or 'exportNames' list — the record is malformed or truncated. It contributes NO exports to this region's index, which is not the same as the stack exporting none: an Fn::ImportValue of a name this stack really publishes will fail in the CONSUMER stack, naming that stack rather than this record. Continuing with the other producers — enumerating a string or a list here would instead publish one FABRICATED export per character or element. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15317
15373
|
}
|
|
15318
|
-
function malformedExportNamesWarning(rawStackName, rawRegion) {
|
|
15374
|
+
function malformedExportNamesWarning(rawStackName, rawRegion, recovery) {
|
|
15319
15375
|
const stackName = absentIfEmpty(rawStackName);
|
|
15320
15376
|
const region = absentIfEmpty(rawRegion);
|
|
15321
|
-
return `${stackClause(stackName, region)} has an unusable 'exportNames' list — the record is malformed or truncated. It is read as an EMPTY export set, which is not the same as the record holding one: no stored key is reported as an export, so a row that should carry an '[export]' tag renders without it. Reading it as UNKNOWN instead would be worse — that falls back to the pre-v9 rule where every output name is importable. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
|
|
15377
|
+
return `${stackClause(stackName, region)} has an unusable 'exportNames' list — the record is malformed or truncated. It is read as an EMPTY export set, which is not the same as the record holding one: no stored key is reported as an export, so a row that should carry an '[export]' tag renders without it. Reading it as UNKNOWN instead would be worse — that falls back to the pre-v9 rule where every output name is importable. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
|
|
15322
15378
|
}
|
|
15323
15379
|
function refuseMalformedOutputs(state, stackName, region, recovery) {
|
|
15324
15380
|
if (hasReadableOutputs(state)) return;
|
|
@@ -15333,10 +15389,10 @@ function repairMalformedOrphansForReadOnly(state) {
|
|
|
15333
15389
|
state.orphans = [];
|
|
15334
15390
|
return true;
|
|
15335
15391
|
}
|
|
15336
|
-
function malformedOrphansWarning(rawStackName, rawRegion) {
|
|
15392
|
+
function malformedOrphansWarning(rawStackName, rawRegion, recovery) {
|
|
15337
15393
|
const stackName = absentIfEmpty(rawStackName);
|
|
15338
15394
|
const region = absentIfEmpty(rawRegion);
|
|
15339
|
-
return `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. Readers reach it on a bare '?? []' or '?.length', which admits a string, a number, a plain object and null alike: a string is WALKED, one garbage orphan per character, and the others read as no orphans at all. Continuing with it EMPTY: this view previews no adoption and names no orphan, which is NOT the same as the record holding none — resources from an earlier failed deploy may still be live in AWS. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
|
|
15395
|
+
return `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. Readers reach it on a bare '?? []' or '?.length', which admits a string, a number, a plain object and null alike: a string is WALKED, one garbage orphan per character, and the others read as no orphans at all. Continuing with it EMPTY: this view previews no adoption and names no orphan, which is NOT the same as the record holding none — resources from an earlier failed deploy may still be live in AWS. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
|
|
15340
15396
|
}
|
|
15341
15397
|
function malformedOrphansRefusalMessage(rawStackName, rawRegion, recovery) {
|
|
15342
15398
|
const stackName = absentIfEmpty(rawStackName);
|
|
@@ -15370,19 +15426,19 @@ function refuseMalformedOutputsForDestroy(state, stackName, region, recovery) {
|
|
|
15370
15426
|
if (hasReadableOutputs(state)) return;
|
|
15371
15427
|
throw markNonRetryable(new CdkdError(malformedDestroyOutputsRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
|
|
15372
15428
|
}
|
|
15373
|
-
function malformedNestedChildOutputsRefusalMessage(rawChildStackName, rawRegion) {
|
|
15429
|
+
function malformedNestedChildOutputsRefusalMessage(rawChildStackName, rawRegion, recovery) {
|
|
15374
15430
|
const childStackName = absentIfEmpty(rawChildStackName);
|
|
15375
15431
|
const region = absentIfEmpty(rawRegion);
|
|
15376
|
-
return `${stackClause(childStackName, region, "nested stack child")} has no readable 'outputs' map — the record is malformed or truncated. The parent's 'Outputs.<Key>' attributes are REBUILT from this bag and persisted into the PARENT's record, and 'Object.entries' walks a string or a list as readily as a map — so a six-character value would become six fabricated parent attributes that every Fn::GetAtt against this nested stack then resolves into live AWS calls. The deploy refuses rather than fabricating them. Repair or remove the child's record first. ${inspectClause(childStackName, region)}Inspect it with: ` + inspectCommand(childStackName, region);
|
|
15432
|
+
return `${stackClause(childStackName, region, "nested stack child")} has no readable 'outputs' map — the record is malformed or truncated. The parent's 'Outputs.<Key>' attributes are REBUILT from this bag and persisted into the PARENT's record, and 'Object.entries' walks a string or a list as readily as a map — so a six-character value would become six fabricated parent attributes that every Fn::GetAtt against this nested stack then resolves into live AWS calls. The deploy refuses rather than fabricating them. Repair or remove the child's record first. ${inspectClause(childStackName, region, recovery)}Inspect it with: ` + inspectCommand(childStackName, region, recovery);
|
|
15377
15433
|
}
|
|
15378
|
-
function refuseMalformedNestedChildOutputs(state, childStackName, region) {
|
|
15434
|
+
function refuseMalformedNestedChildOutputs(state, childStackName, region, recovery) {
|
|
15379
15435
|
if (hasReadableOutputs(state)) return;
|
|
15380
|
-
throw markNonRetryable(new CdkdError(malformedNestedChildOutputsRefusalMessage(childStackName, region), STATE_RESOURCES_MALFORMED));
|
|
15436
|
+
throw markNonRetryable(new CdkdError(malformedNestedChildOutputsRefusalMessage(childStackName, region, recovery), STATE_RESOURCES_MALFORMED));
|
|
15381
15437
|
}
|
|
15382
|
-
function malformedLocalOutputsWarning(rawStackName, rawRegion) {
|
|
15438
|
+
function malformedLocalOutputsWarning(rawStackName, rawRegion, recovery) {
|
|
15383
15439
|
const stackName = absentIfEmpty(rawStackName);
|
|
15384
15440
|
const region = absentIfEmpty(rawRegion);
|
|
15385
|
-
return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so reading it would hand this local run one FABRICATED output per character or element. Continuing with it EMPTY: every reference to an output of this record resolves to nothing and is dropped, which is not the same as the record holding none. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
|
|
15441
|
+
return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so reading it would hand this local run one FABRICATED output per character or element. Continuing with it EMPTY: every reference to an output of this record resolves to nothing and is dropped, which is not the same as the record holding none. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
|
|
15386
15442
|
}
|
|
15387
15443
|
const NAMED_UNREADABLE_PROPERTY_BAGS = 5;
|
|
15388
15444
|
function stackClause(stackName, region, kind = "") {
|
|
@@ -15433,7 +15489,7 @@ function inspectCommand(stackName, region, recovery) {
|
|
|
15433
15489
|
return inspectGate(stackName, region, recovery).command;
|
|
15434
15490
|
}
|
|
15435
15491
|
function inspectClause(stackName, region, recovery) {
|
|
15436
|
-
const accounts = withheldAccountClause(
|
|
15492
|
+
const accounts = withheldAccountClause(recovery, "the command at the end of this line prints");
|
|
15437
15493
|
if (stackName === void 0) return accounts;
|
|
15438
15494
|
const { withheld } = inspectGate(stackName, region, recovery);
|
|
15439
15495
|
const parts = [inspectWithheldPart("stack name above", withheld, "stack", true), inspectWithheldPart("region above", withheld, "region", false)].filter((part) => part !== "");
|
|
@@ -15490,10 +15546,10 @@ function unreadableResourcePropertyBags(state) {
|
|
|
15490
15546
|
if (!hasReadableResources(state)) return [];
|
|
15491
15547
|
return Object.entries(state.resources).filter(([, entry]) => isReadableBag(entry) && !isReadableBag(entry.properties)).map(([logicalId]) => logicalId);
|
|
15492
15548
|
}
|
|
15493
|
-
function refuseMalformedResourceProperties(state, stackName, region) {
|
|
15549
|
+
function refuseMalformedResourceProperties(state, stackName, region, recovery) {
|
|
15494
15550
|
const unreadable = unreadableResourcePropertyBags(state);
|
|
15495
15551
|
if (unreadable.length === 0) return;
|
|
15496
|
-
throw markNonRetryable(new CdkdError(malformedResourcePropertiesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED));
|
|
15552
|
+
throw markNonRetryable(new CdkdError(malformedResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED));
|
|
15497
15553
|
}
|
|
15498
15554
|
function repairMalformedResourcePropertiesForReadOnly(state) {
|
|
15499
15555
|
const unreadable = unreadableResourcePropertyBags(state);
|
|
@@ -15515,10 +15571,10 @@ function namedPropertyBagsDiagnosis(stackName, region, logicalIds, describeUnsaf
|
|
|
15515
15571
|
function namedPropertyBagsClause(stackName, region, logicalIds) {
|
|
15516
15572
|
return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} Comparing a template against one reports every property the template declares as ADDED (a string bag also invents one change per character), and a create-only property among them is a REPLACEMENT of the live resource.`;
|
|
15517
15573
|
}
|
|
15518
|
-
function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds) {
|
|
15574
|
+
function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15519
15575
|
const stackName = absentIfEmpty(rawStackName);
|
|
15520
15576
|
const region = absentIfEmpty(rawRegion);
|
|
15521
|
-
return `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a DELETE and re-create of resources the template did not change, and reading the bag as empty produces that same verdict rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack with those maps read as EMPTY and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ${inspectCommand(stackName, region)}`;
|
|
15577
|
+
return `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a DELETE and re-create of resources the template did not change, and reading the bag as empty produces that same verdict rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack with those maps read as EMPTY and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15522
15578
|
}
|
|
15523
15579
|
function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15524
15580
|
const stackName = absentIfEmpty(rawStackName);
|
|
@@ -15551,7 +15607,7 @@ function withheldIdentityClause(stackName, region) {
|
|
|
15551
15607
|
return ` — the stack name or region above did not render exactly, so take them from the 'Find the exact name' command below — replace each quoted hole, quotes included, with ${JSON_LISTING_HOLE_VALUE} — rather than from this message`;
|
|
15552
15608
|
}
|
|
15553
15609
|
function withheldRecoveryClause(recovery) {
|
|
15554
|
-
const clause = withheldAccountClause(
|
|
15610
|
+
const clause = withheldAccountClause(recovery, "the command lines below print").trimEnd();
|
|
15555
15611
|
if (clause === "") return "";
|
|
15556
15612
|
return ` — ${clause.charAt(0).toLowerCase()}${clause.slice(1, -1)}`;
|
|
15557
15613
|
}
|
|
@@ -15603,26 +15659,26 @@ function refuseMalformedResourcePropertiesForOrphan(state, removedLogicalIds, st
|
|
|
15603
15659
|
if (unreadable.length === 0) return;
|
|
15604
15660
|
throw new CdkdError(malformedOrphanResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
|
|
15605
15661
|
}
|
|
15606
|
-
function malformedResourcePropertiesWarning(rawStackName, rawRegion, logicalIds) {
|
|
15662
|
+
function malformedResourcePropertiesWarning(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15607
15663
|
const stackName = absentIfEmpty(rawStackName);
|
|
15608
15664
|
const region = absentIfEmpty(rawRegion);
|
|
15609
|
-
return `${namedPropertyBagsClause(stackName, region, logicalIds)} Continuing with those maps EMPTY: what these records are stored as holding is NOT what this preview compares against. Where the template still declares the resource, every property it declares previews as an addition and a create-only one as a replacement; where it no longer declares it, the DELETE row shows an empty previous side instead of the stored one. Do NOT run 'cdkd deploy' against this record — it REFUSES on the same defect rather than acting on this preview. ${inspectClause(stackName, region)}See the stored values with: ${inspectCommand(stackName, region)}`;
|
|
15665
|
+
return `${namedPropertyBagsClause(stackName, region, logicalIds)} Continuing with those maps EMPTY: what these records are stored as holding is NOT what this preview compares against. Where the template still declares the resource, every property it declares previews as an addition and a create-only one as a replacement; where it no longer declares it, the DELETE row shows an empty previous side instead of the stored one. Do NOT run 'cdkd deploy' against this record — it REFUSES on the same defect rather than acting on this preview. ${inspectClause(stackName, region, recovery)}See the stored values with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15610
15666
|
}
|
|
15611
15667
|
const DRIFT_PROPERTIES_ROLE = "To 'cdkd drift' this map is the baseline wherever no 'observedProperties' is recorded — a stored string reads as one drifted key per character, and an EMPTY reading compares nothing and reports the resource clean — and it is where cdkd finds the secret positions it must mask.";
|
|
15612
|
-
function malformedDriftResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds) {
|
|
15668
|
+
function malformedDriftResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15613
15669
|
const stackName = absentIfEmpty(rawStackName);
|
|
15614
15670
|
const region = absentIfEmpty(rawRegion);
|
|
15615
|
-
return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} 'cdkd drift --accept' and '--revert' WRITE this record back, so they refuse rather than continuing. ${DRIFT_PROPERTIES_ROLE} Continuing would let '--accept' save, and '--revert' push to the live resource, a verdict about properties this record does not hold. Nothing was written and no AWS resource was modified. Repair or remove the record first; plain 'cdkd drift' compares the rest of the stack and reports these resources as not compared. ${inspectClause(stackName, region)}Inspect the record with: ${inspectCommand(stackName, region)}`;
|
|
15671
|
+
return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} 'cdkd drift --accept' and '--revert' WRITE this record back, so they refuse rather than continuing. ${DRIFT_PROPERTIES_ROLE} Continuing would let '--accept' save, and '--revert' push to the live resource, a verdict about properties this record does not hold. Nothing was written and no AWS resource was modified. Repair or remove the record first; plain 'cdkd drift' compares the rest of the stack and reports these resources as not compared. ${inspectClause(stackName, region, recovery)}Inspect the record with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15616
15672
|
}
|
|
15617
|
-
function refuseMalformedResourcePropertiesForDrift(state, stackName, region) {
|
|
15673
|
+
function refuseMalformedResourcePropertiesForDrift(state, stackName, region, recovery) {
|
|
15618
15674
|
const unreadable = unreadableResourcePropertyBags(state);
|
|
15619
15675
|
if (unreadable.length === 0) return;
|
|
15620
|
-
throw new CdkdError(malformedDriftResourcePropertiesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED);
|
|
15676
|
+
throw new CdkdError(malformedDriftResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
|
|
15621
15677
|
}
|
|
15622
|
-
function malformedDriftResourcePropertiesWarning(rawStackName, rawRegion, logicalIds) {
|
|
15678
|
+
function malformedDriftResourcePropertiesWarning(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15623
15679
|
const stackName = absentIfEmpty(rawStackName);
|
|
15624
15680
|
const region = absentIfEmpty(rawRegion);
|
|
15625
|
-
return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} ${DRIFT_PROPERTIES_ROLE} So 'cdkd drift' does NOT compare these resources: each is reported as not compared, and the run does not exit clean. The rest of the stack is compared as usual. 'cdkd drift --accept' / '--revert' and 'cdkd deploy' REFUSE this record. ${inspectClause(stackName, region)}See the stored values with: ${inspectCommand(stackName, region)}`;
|
|
15681
|
+
return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} ${DRIFT_PROPERTIES_ROLE} So 'cdkd drift' does NOT compare these resources: each is reported as not compared, and the run does not exit clean. The rest of the stack is compared as usual. 'cdkd drift --accept' / '--revert' and 'cdkd deploy' REFUSE this record. ${inspectClause(stackName, region, recovery)}See the stored values with: ${inspectCommand(stackName, region, recovery)}`;
|
|
15626
15682
|
}
|
|
15627
15683
|
function malformedExportResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15628
15684
|
const stackName = absentIfEmpty(rawStackName);
|
|
@@ -15652,15 +15708,15 @@ function repairMalformedResourceEntriesForReadOnly(state) {
|
|
|
15652
15708
|
for (const logicalId of unreadable) delete state.resources[logicalId];
|
|
15653
15709
|
return unreadable;
|
|
15654
15710
|
}
|
|
15655
|
-
function malformedResourceEntriesWarning(rawStackName, rawRegion, logicalIds) {
|
|
15711
|
+
function malformedResourceEntriesWarning(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15656
15712
|
const stackName = absentIfEmpty(rawStackName);
|
|
15657
15713
|
const region = absentIfEmpty(rawRegion);
|
|
15658
|
-
return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: this command's output describes the remaining resources only, which is not the same as the stack holding none of these. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15714
|
+
return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: this command's output describes the remaining resources only, which is not the same as the stack holding none of these. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15659
15715
|
}
|
|
15660
|
-
function malformedOrphanRecordsWarning(rawStackName, rawRegion, logicalIds, alsoRejectsTornMaps) {
|
|
15716
|
+
function malformedOrphanRecordsWarning(rawStackName, rawRegion, logicalIds, alsoRejectsTornMaps, recovery) {
|
|
15661
15717
|
const stackName = absentIfEmpty(rawStackName);
|
|
15662
15718
|
const region = absentIfEmpty(rawRegion);
|
|
15663
|
-
return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read as resources — ${namedOrphanRows(logicalIds)} — because they are not objects, have no string 'logicalId' or share it with another row, or their 'state' is not an object, names no resource type${alsoRejectsTornMaps ? ", has no non-empty string 'physicalId', or holds a 'properties' or 'attributes' map that is not an object" : ` or has no non-empty string 'physicalId'`}. Continuing WITHOUT them: ${alsoRejectsTornMaps ? `they are excluded from the secret scan, so nothing this run does can certify them` : "they are not previewed for adoption, and 'cdkd deploy' refuses the record over them rather than dropping them as this command does"}. These ids were read from 'orphans'; the 'resources' map carries its own warning when it is damaged too. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15719
|
+
return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read as resources — ${namedOrphanRows(logicalIds)} — because they are not objects, have no string 'logicalId' or share it with another row, or their 'state' is not an object, names no resource type${alsoRejectsTornMaps ? ", has no non-empty string 'physicalId', or holds a 'properties' or 'attributes' map that is not an object" : ` or has no non-empty string 'physicalId'`}. Continuing WITHOUT them: ${alsoRejectsTornMaps ? `they are excluded from the secret scan, so nothing this run does can certify them` : "they are not previewed for adoption, and 'cdkd deploy' refuses the record over them rather than dropping them as this command does"}. These ids were read from 'orphans'; the 'resources' map carries its own warning when it is damaged too. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15664
15720
|
}
|
|
15665
15721
|
function namedEntriesClause(stackName, region, logicalIds) {
|
|
15666
15722
|
const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
|
|
@@ -15673,15 +15729,15 @@ function malformedResourceEntriesRefusalMessage(rawStackName, rawRegion, logical
|
|
|
15673
15729
|
const region = absentIfEmpty(rawRegion);
|
|
15674
15730
|
return `${namedEntriesClause(stackName, region, logicalIds)} This command can WRITE state, so it refuses rather than skipping them: saving over the record would report a clean run for entries nothing could read, and would leave the next command to fail on them with no more to go on. Nothing was locked, read from AWS or written FOR THIS STACK. ${inspectClause(stackName, region, recovery)}Inspect it with: ` + inspectCommand(stackName, region, recovery);
|
|
15675
15731
|
}
|
|
15676
|
-
function refuseMalformedResourceEntriesForDeploy(state, stackName, region) {
|
|
15732
|
+
function refuseMalformedResourceEntriesForDeploy(state, stackName, region, recovery) {
|
|
15677
15733
|
const unreadable = unreadableResourceEntries(state);
|
|
15678
15734
|
if (unreadable.length === 0) return;
|
|
15679
|
-
throw markNonRetryable(new CdkdError(malformedDeployResourceEntriesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED));
|
|
15735
|
+
throw markNonRetryable(new CdkdError(malformedDeployResourceEntriesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED));
|
|
15680
15736
|
}
|
|
15681
|
-
function malformedDeployResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds) {
|
|
15737
|
+
function malformedDeployResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15682
15738
|
const stackName = absentIfEmpty(rawStackName);
|
|
15683
15739
|
const region = absentIfEmpty(rawRegion);
|
|
15684
|
-
return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a row that is not an object reads as a resource cdkd does not manage, so the template's resource of that id is planned as a CREATE (a second copy of a live resource, or a name collision), and a row with no resource type is planned as a TYPE CHANGE, which replaces the live resource. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack without those rows and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
|
|
15740
|
+
return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a row that is not an object reads as a resource cdkd does not manage, so the template's resource of that id is planned as a CREATE (a second copy of a live resource, or a name collision), and a row with no resource type is planned as a TYPE CHANGE, which replaces the live resource. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack without those rows and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
|
|
15685
15741
|
}
|
|
15686
15742
|
function refuseMalformedResourceEntriesForDestroy(state, stackName, region, recovery) {
|
|
15687
15743
|
const unreadable = unreadableResourceEntries(state);
|
|
@@ -15719,20 +15775,20 @@ function malformedImportUnrepairedEntriesRefusalMessage(rawStackName, rawRegion,
|
|
|
15719
15775
|
const region = absentIfEmpty(rawRegion);
|
|
15720
15776
|
return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd import' was asked to re-import these rows and their import did not succeed (each is reported above), so the record it would save still holds them unreadable; it refuses rather than saving a row it could not replace. Nothing was written FOR THIS STACK, and the resources this run did import stay as they are in AWS. Fix what the import reported, or repair the rows by hand, and re-run. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
|
|
15721
15777
|
}
|
|
15722
|
-
function malformedScrubResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds) {
|
|
15778
|
+
function malformedScrubResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15723
15779
|
const stackName = absentIfEmpty(rawStackName);
|
|
15724
15780
|
const region = absentIfEmpty(rawRegion);
|
|
15725
|
-
return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd scrub' REBUILDS and SAVES the resource map whenever anything in the stack changed, so it refuses rather than continuing: a null row either stops the rewrite on a bare TypeError under the lock (the template still positions it and this stack recorded a secret) or is copied into the rebuilt map as it stands — reported clean when no secret was recorded at all, saved back the moment another record changed; a string or number the template positions is spread into an object and saved as one; and a row with no resource type is rewritten and saved still without one. Nothing was written FOR THIS STACK. Repair or remove the row first; '--dry-run' audits the rest of the record without it and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
|
|
15781
|
+
return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd scrub' REBUILDS and SAVES the resource map whenever anything in the stack changed, so it refuses rather than continuing: a null row either stops the rewrite on a bare TypeError under the lock (the template still positions it and this stack recorded a secret) or is copied into the rebuilt map as it stands — reported clean when no secret was recorded at all, saved back the moment another record changed; a string or number the template positions is spread into an object and saved as one; and a row with no resource type is rewritten and saved still without one. Nothing was written FOR THIS STACK. Repair or remove the row first; '--dry-run' audits the rest of the record without it and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
|
|
15726
15782
|
}
|
|
15727
|
-
function malformedLocalResourcesWarning(rawStackName, rawRegion) {
|
|
15783
|
+
function malformedLocalResourcesWarning(rawStackName, rawRegion, recovery) {
|
|
15728
15784
|
const stackName = absentIfEmpty(rawStackName);
|
|
15729
15785
|
const region = absentIfEmpty(rawRegion);
|
|
15730
|
-
return `${malformedStateDiagnosis(stackName, region)} Continuing with it EMPTY: every 'Ref' and 'Fn::GetAtt' in this run's environment that names a resource of this record resolves to nothing and is dropped, and a bare '--assume-role' falls back to the developer's credentials — which is not the same as the record holding no resources. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
|
|
15786
|
+
return `${malformedStateDiagnosis(stackName, region)} Continuing with it EMPTY: every 'Ref' and 'Fn::GetAtt' in this run's environment that names a resource of this record resolves to nothing and is dropped, and a bare '--assume-role' falls back to the developer's credentials — which is not the same as the record holding no resources. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
|
|
15731
15787
|
}
|
|
15732
|
-
function malformedLocalResourceEntriesWarning(rawStackName, rawRegion, logicalIds) {
|
|
15788
|
+
function malformedLocalResourceEntriesWarning(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15733
15789
|
const stackName = absentIfEmpty(rawStackName);
|
|
15734
15790
|
const region = absentIfEmpty(rawRegion);
|
|
15735
|
-
return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: a 'Ref' or 'Fn::GetAtt' in this run's environment that names one of these ids resolves to nothing and is dropped, and a bare '--assume-role' read through one falls back to the developer's credentials — which is not the same as the record holding no such resource. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15791
|
+
return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: a 'Ref' or 'Fn::GetAtt' in this run's environment that names one of these ids resolves to nothing and is dropped, and a bare '--assume-role' read through one falls back to the developer's credentials — which is not the same as the record holding no such resource. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15736
15792
|
}
|
|
15737
15793
|
function refuseMalformedResourceEntriesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
|
|
15738
15794
|
const removed = new Set(removedLogicalIds);
|
|
@@ -15781,10 +15837,10 @@ function hasAddressablePhysicalId(entry) {
|
|
|
15781
15837
|
const physicalId = entry.physicalId;
|
|
15782
15838
|
return typeof physicalId === "string" && physicalId.trim() !== "";
|
|
15783
15839
|
}
|
|
15784
|
-
function unaddressableUpdateRefusalMessage(rawStackName, rawRegion, logicalId, resourceType) {
|
|
15840
|
+
function unaddressableUpdateRefusalMessage(rawStackName, rawRegion, logicalId, resourceType, recovery) {
|
|
15785
15841
|
const stackName = absentIfEmpty(rawStackName);
|
|
15786
15842
|
const region = absentIfEmpty(rawRegion);
|
|
15787
|
-
return `${stackClause(stackName, region)} holds a record for ${displayIdent(logicalId)} (${displayIdent(resourceType)}) with no non-empty string 'physicalId', so cdkd cannot address that resource in AWS and did not try to update it. 'cdkd deploy' fails on it rather than skipping it, since a skipped update would end the deploy without the template's change. Nothing was sent for this resource. Repair the record's 'physicalId' and re-run. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
|
|
15843
|
+
return `${stackClause(stackName, region)} holds a record for ${displayIdent(logicalId)} (${displayIdent(resourceType)}) with no non-empty string 'physicalId', so cdkd cannot address that resource in AWS and did not try to update it. 'cdkd deploy' fails on it rather than skipping it, since a skipped update would end the deploy without the template's change. Nothing was sent for this resource. Repair the record's 'physicalId' and re-run. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
|
|
15788
15844
|
}
|
|
15789
15845
|
function unpreviewableOrphanRecords(state) {
|
|
15790
15846
|
if (!Array.isArray(state.orphans)) return [];
|
|
@@ -15873,10 +15929,10 @@ function refuseMalformedOrphansForOrphan(state, stackName, region, recovery) {
|
|
|
15873
15929
|
function deployRefusesOrphanRowsReason(logicalIds) {
|
|
15874
15930
|
return `${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — carry a 'properties' or 'attributes' map that cannot be read. This preview KEEPS them, so any adoption shown for them is one 'cdkd deploy' will not perform: it refuses the record over the same rows, and the deploy this previews will not start.`;
|
|
15875
15931
|
}
|
|
15876
|
-
function malformedOrphanRowsKeptWarning(rawStackName, rawRegion, logicalIds) {
|
|
15932
|
+
function malformedOrphanRowsKeptWarning(rawStackName, rawRegion, logicalIds, recovery) {
|
|
15877
15933
|
const stackName = absentIfEmpty(rawStackName);
|
|
15878
15934
|
const region = absentIfEmpty(rawRegion);
|
|
15879
|
-
return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — whose 'properties' or 'attributes' map is not an object. This preview KEEPS them. 'cdkd deploy' of THIS stack does NOT: it refuses the whole record over these rows and will not start until they are repaired. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
|
|
15935
|
+
return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — whose 'properties' or 'attributes' map is not an object. This preview KEEPS them. 'cdkd deploy' of THIS stack does NOT: it refuses the whole record over these rows and will not start until they are repaired. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
|
|
15880
15936
|
}
|
|
15881
15937
|
function namedOrphanRows(logicalIds) {
|
|
15882
15938
|
const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
|
|
@@ -17993,7 +18049,7 @@ async function resolveGetAtt(getAtt, context) {
|
|
|
17993
18049
|
const [rawLogicalId, rawAttributeName] = getAtt;
|
|
17994
18050
|
logicalId = rawLogicalId;
|
|
17995
18051
|
const resolvedAttributeName = await this.resolveValue(rawAttributeName, context);
|
|
17996
|
-
if (typeof resolvedAttributeName !== "string") throw new Error(`Fn::GetAtt attribute name for ${this.displayMasked(logicalId, context)} must resolve to a string, got ${typeof resolvedAttributeName}: ${stringifyValue(this.maskValueLeaves(resolvedAttributeName, context))}`);
|
|
18052
|
+
if (typeof resolvedAttributeName !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAtt attribute name for ${this.displayMasked(logicalId, context)} must resolve to a string, got ${typeof resolvedAttributeName}: ${stringifyValue(this.maskValueLeaves(resolvedAttributeName, context))}`));
|
|
17997
18053
|
attributeName = resolvedAttributeName;
|
|
17998
18054
|
} else {
|
|
17999
18055
|
const split = splitGetAttStringForm(getAtt);
|
|
@@ -18335,8 +18391,8 @@ function pinSecretVerdict(expression, secret, scope) {
|
|
|
18335
18391
|
async function resolveImportValue(importValueArg, context) {
|
|
18336
18392
|
const sourceKey = crossStackSourceKey({ "Fn::ImportValue": importValueArg });
|
|
18337
18393
|
const exportName = await this.resolveValue(importValueArg, context);
|
|
18338
|
-
if (typeof exportName !== "string") throw new Error(`Fn::ImportValue: export name must resolve to a string, got ${typeof exportName}`);
|
|
18339
|
-
if (!context.stateBackend) throw new Error("Fn::ImportValue: state backend is required for cross-stack references");
|
|
18394
|
+
if (typeof exportName !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::ImportValue: export name must resolve to a string, got ${typeof exportName}`));
|
|
18395
|
+
if (!context.stateBackend) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::ImportValue: state backend is required for cross-stack references"));
|
|
18340
18396
|
const loggedExportName = this.displayMasked(exportName, context);
|
|
18341
18397
|
this.logger.debug(`Resolving Fn::ImportValue: ${loggedExportName}`);
|
|
18342
18398
|
if (context.exportIndex) {
|
|
@@ -18516,32 +18572,32 @@ function getCfnClient(region) {
|
|
|
18516
18572
|
//#endregion
|
|
18517
18573
|
//#region src/deployment/intrinsic-resolver/stack-output.ts
|
|
18518
18574
|
async function resolveGetStackOutput(arg, context) {
|
|
18519
|
-
if (!arg || typeof arg !== "object" || Array.isArray(arg)) throw new Error(`Fn::GetStackOutput: argument must be an object with StackName/OutputName/Region/RoleArn, got ${arg === null ? "null" : Array.isArray(arg) ? "array" : typeof arg}`);
|
|
18575
|
+
if (!arg || typeof arg !== "object" || Array.isArray(arg)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: argument must be an object with StackName/OutputName/Region/RoleArn, got ${arg === null ? "null" : Array.isArray(arg) ? "array" : typeof arg}`));
|
|
18520
18576
|
const args = arg;
|
|
18521
|
-
if (!("StackName" in args)) throw new Error("Fn::GetStackOutput: StackName is required");
|
|
18522
|
-
if (!("OutputName" in args)) throw new Error("Fn::GetStackOutput: OutputName is required");
|
|
18577
|
+
if (!("StackName" in args)) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: StackName is required"));
|
|
18578
|
+
if (!("OutputName" in args)) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: OutputName is required"));
|
|
18523
18579
|
const sourceKey = crossStackSourceKey({ "Fn::GetStackOutput": args });
|
|
18524
18580
|
const stackName = await this.resolveValue(args["StackName"], context);
|
|
18525
|
-
if (typeof stackName !== "string" || stackName === "") throw new Error(`Fn::GetStackOutput: StackName must resolve to a non-empty string, got ${typeof stackName}`);
|
|
18581
|
+
if (typeof stackName !== "string" || stackName === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: StackName must resolve to a non-empty string, got ${typeof stackName}`));
|
|
18526
18582
|
const outputName = await this.resolveValue(args["OutputName"], context);
|
|
18527
|
-
if (typeof outputName !== "string" || outputName === "") throw new Error(`Fn::GetStackOutput: OutputName must resolve to a non-empty string, got ${typeof outputName}`);
|
|
18583
|
+
if (typeof outputName !== "string" || outputName === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: OutputName must resolve to a non-empty string, got ${typeof outputName}`));
|
|
18528
18584
|
let region = this.resolverRegion;
|
|
18529
18585
|
let loggedRegionText = this.logTextOfLeaf(region, context);
|
|
18530
18586
|
if ("Region" in args && args["Region"] !== void 0 && args["Region"] !== null) {
|
|
18531
18587
|
const resolvedRegion = await this.resolveValue(args["Region"], context);
|
|
18532
|
-
if (typeof resolvedRegion !== "string" || resolvedRegion === "") throw new Error(`Fn::GetStackOutput: Region must resolve to a non-empty string, got ${typeof resolvedRegion}`);
|
|
18588
|
+
if (typeof resolvedRegion !== "string" || resolvedRegion === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: Region must resolve to a non-empty string, got ${typeof resolvedRegion}`));
|
|
18533
18589
|
const requestedRegion = canonicalizeRegion(resolvedRegion);
|
|
18534
|
-
if (!isClientSafeRegion(requestedRegion)) throw new Error(`Fn::GetStackOutput: ${this.displayMaskedIdent(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context, 64)} is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`);
|
|
18590
|
+
if (!isClientSafeRegion(requestedRegion)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: ${this.displayMaskedIdent(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context, 64)} is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`));
|
|
18535
18591
|
region = requestedRegion;
|
|
18536
18592
|
loggedRegionText = this.regionLogText(resolvedRegion, context);
|
|
18537
18593
|
}
|
|
18538
18594
|
let roleArn;
|
|
18539
18595
|
if ("RoleArn" in args && args["RoleArn"] !== void 0 && args["RoleArn"] !== null) {
|
|
18540
18596
|
const raw = args["RoleArn"];
|
|
18541
|
-
if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`);
|
|
18597
|
+
if (typeof raw !== "string" || raw === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`));
|
|
18542
18598
|
roleArn = raw;
|
|
18543
18599
|
}
|
|
18544
|
-
if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} in the same region ${this.displayMaskedIdent(loggedRegionText, context)}`);
|
|
18600
|
+
if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: cannot reference own stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} in the same region ${this.displayMaskedIdent(loggedRegionText, context)}`));
|
|
18545
18601
|
const loggedStackName = this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS);
|
|
18546
18602
|
const loggedOutputName = this.displayMaskedIdent(outputName, context);
|
|
18547
18603
|
const loggedRegion = this.displayMasked(loggedRegionText, context);
|
|
@@ -18559,7 +18615,7 @@ async function resolveGetStackOutput(arg, context) {
|
|
|
18559
18615
|
if (cfnOutputs) {
|
|
18560
18616
|
if (!Object.hasOwn(cfnOutputs, outputName)) {
|
|
18561
18617
|
const available = this.describeAvailableOutputs(Object.keys(cfnOutputs), context);
|
|
18562
|
-
throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in CloudFormation stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
|
|
18618
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in CloudFormation stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`));
|
|
18563
18619
|
}
|
|
18564
18620
|
const value = cfnOutputs[outputName];
|
|
18565
18621
|
this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName} (from CloudFormation stack outputs; weak reference — producer is not cdkd-managed)`);
|
|
@@ -18572,7 +18628,7 @@ async function resolveGetStackOutput(arg, context) {
|
|
|
18572
18628
|
const outputs = stateData.state.outputs ?? {};
|
|
18573
18629
|
if (!Object.hasOwn(outputs, outputName)) {
|
|
18574
18630
|
const available = this.describeAvailableOutputs(Object.keys(outputs), context);
|
|
18575
|
-
throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
|
|
18631
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`));
|
|
18576
18632
|
}
|
|
18577
18633
|
const value = outputs[outputName];
|
|
18578
18634
|
this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName}${roleArn ? `, RoleArn=${shownRoleArn}` : ""} (${carriesDynamicReference(value) ? "redacted dynamic reference" : "literal value"})`);
|
|
@@ -18825,7 +18881,7 @@ async function applyRoleArnIfSet(opts) {
|
|
|
18825
18881
|
//#endregion
|
|
18826
18882
|
//#region src/deployment/intrinsic-resolver/stack-state.ts
|
|
18827
18883
|
async function getSameAccountStackState(stackName, region, context) {
|
|
18828
|
-
if (!context.stateBackend) throw new Error("Fn::GetStackOutput: state backend is required for cross-stack references");
|
|
18884
|
+
if (!context.stateBackend) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: state backend is required for cross-stack references"));
|
|
18829
18885
|
return context.stateBackend.getState(stackName, region);
|
|
18830
18886
|
}
|
|
18831
18887
|
async function getCrossAccountStackState(roleArn, stackName, region, context) {
|
|
@@ -18834,7 +18890,7 @@ async function getCrossAccountStackState(roleArn, stackName, region, context) {
|
|
|
18834
18890
|
const shownRoleArn = displayIdent(roleArn, { maxCodePoints: 613 });
|
|
18835
18891
|
const bounded = !/\s/.test(roleArn) && shownRoleArn === roleArn ? `'${shownRoleArn}'` : shellBoundedDisplay(shownRoleArn);
|
|
18836
18892
|
const subject = bounded === "a value that cannot be shown safely here" ? `the RoleArn argument (${UNSHOWABLE_VALUE})` : `RoleArn ${bounded}`;
|
|
18837
|
-
throw new Error(`Fn::GetStackOutput: ${subject} is not a valid IAM role ARN. Expected shape: arn:<partition>:iam::<12-digit-account-id>:role/<role-name> (e.g. arn:aws:iam::123456789012:role/MyRole, arn:aws-us-gov:iam::...).`);
|
|
18893
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: ${subject} is not a valid IAM role ARN. Expected shape: arn:<partition>:iam::<12-digit-account-id>:role/<role-name> (e.g. arn:aws:iam::123456789012:role/MyRole, arn:aws-us-gov:iam::...).`));
|
|
18838
18894
|
}
|
|
18839
18895
|
const credentials = await assumeRoleForCrossAccountStateRead(roleArn);
|
|
18840
18896
|
const { bucket, region: bucketRegion } = await resolveCrossAccountStateBucket(parsed.accountId, credentials);
|
|
@@ -19139,7 +19195,7 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
|
|
|
19139
19195
|
versionId = remainingParts[2] || "";
|
|
19140
19196
|
} else secretId = afterService;
|
|
19141
19197
|
if (!versionStage) versionStage = "AWSCURRENT";
|
|
19142
|
-
if (!secretId) throw new Error("Dynamic reference: secretsmanager SECRET_ID is required");
|
|
19198
|
+
if (!secretId) throw markNonRetryable(/* @__PURE__ */ new Error("Dynamic reference: secretsmanager SECRET_ID is required"));
|
|
19143
19199
|
const loggedSecretId = this.displayMasked(nameLogText(secretId), context);
|
|
19144
19200
|
const loggedJsonKey = this.displayMasked(nameLogText(jsonKey), context);
|
|
19145
19201
|
this.logger.debug(`Resolving dynamic reference: secretsmanager:${loggedSecretId}:SecretString:${loggedJsonKey}:${this.displayMasked(nameLogText(versionStage), context)}:${this.displayMasked(nameLogText(versionId), context)}`);
|
|
@@ -19154,14 +19210,14 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
|
|
|
19154
19210
|
[versionStage, this.displayMasked(nameLogText(versionStage), context)],
|
|
19155
19211
|
[versionId, this.displayMasked(nameLogText(versionId), context)]
|
|
19156
19212
|
], context))).SecretString;
|
|
19157
|
-
if (!secretString) throw new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`);
|
|
19213
|
+
if (!secretString) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`));
|
|
19158
19214
|
if (jsonKey) try {
|
|
19159
19215
|
const parsed = JSON.parse(secretString);
|
|
19160
19216
|
const keyValue = Object.hasOwn(parsed, jsonKey) ? parsed[jsonKey] : void 0;
|
|
19161
|
-
if (keyValue === void 0) throw new Error(`Dynamic reference: key ${quotedRender(loggedJsonKey, "'")} not found in secret ${quotedRender(loggedSecretId, "'")}`);
|
|
19217
|
+
if (keyValue === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: key ${quotedRender(loggedJsonKey, "'")} not found in secret ${quotedRender(loggedSecretId, "'")}`));
|
|
19162
19218
|
return stringifyValue(keyValue);
|
|
19163
19219
|
} catch (error) {
|
|
19164
|
-
if (error instanceof SyntaxError) throw new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} is not valid JSON but JSON_KEY ${quotedRender(loggedJsonKey, "'")} was specified`);
|
|
19220
|
+
if (error instanceof SyntaxError) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} is not valid JSON but JSON_KEY ${quotedRender(loggedJsonKey, "'")} was specified`));
|
|
19165
19221
|
throw error;
|
|
19166
19222
|
}
|
|
19167
19223
|
return secretString;
|
|
@@ -19180,7 +19236,7 @@ async function sendWithThrottleRetry(operation, label, masks) {
|
|
|
19180
19236
|
}
|
|
19181
19237
|
async function resolveSSMReference(parts, decrypt, service, context, nameLogText) {
|
|
19182
19238
|
const parameterName = parts.slice(1).join(":");
|
|
19183
|
-
if (!parameterName) throw new Error(`Dynamic reference: ${service} PARAMETER_NAME is required`);
|
|
19239
|
+
if (!parameterName) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: ${service} PARAMETER_NAME is required`));
|
|
19184
19240
|
const loggedParameterName = this.displayMasked(nameLogText(parameterName), context);
|
|
19185
19241
|
this.logger.debug(`Resolving dynamic reference: ${service}:${loggedParameterName}`);
|
|
19186
19242
|
const client = this.clientsForRegion(this.explicitRegion).ssm;
|
|
@@ -19190,7 +19246,7 @@ async function resolveSSMReference(parts, decrypt, service, context, nameLogText
|
|
|
19190
19246
|
});
|
|
19191
19247
|
const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}`, this.namedRequestMasks([[parameterName, loggedParameterName]], context));
|
|
19192
19248
|
const paramValue = response.Parameter?.Value;
|
|
19193
|
-
if (paramValue === void 0 || paramValue === null) throw new Error(`Dynamic reference: SSM parameter ${quotedRender(loggedParameterName, "'")} not found or has no value`);
|
|
19249
|
+
if (paramValue === void 0 || paramValue === null) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: SSM parameter ${quotedRender(loggedParameterName, "'")} not found or has no value`));
|
|
19194
19250
|
const paramType = response.Parameter?.Type;
|
|
19195
19251
|
const secure = paramType !== "String" && paramType !== "StringList";
|
|
19196
19252
|
if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(parameterName, String(paramType)))) {
|
|
@@ -19234,7 +19290,7 @@ async function resolveJoin(joinArgs, context, source) {
|
|
|
19234
19290
|
const [delimiter, rawValues] = joinArgs;
|
|
19235
19291
|
let values = rawValues;
|
|
19236
19292
|
if (!Array.isArray(values)) values = await this.resolveValue(values, context);
|
|
19237
|
-
if (!Array.isArray(values)) throw new Error(`Fn::Join's second argument must be a list (an array literal or a list-returning intrinsic such as Fn::Cidr / Fn::GetAZs / Fn::Split / a Ref to a list-typed parameter — any List<...> type or CommaDelimitedList), but resolved to ${typeof values}`);
|
|
19293
|
+
if (!Array.isArray(values)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Join's second argument must be a list (an array literal or a list-returning intrinsic such as Fn::Cidr / Fn::GetAZs / Fn::Split / a Ref to a list-typed parameter — any List<...> type or CommaDelimitedList), but resolved to ${typeof values}`));
|
|
19238
19294
|
const literalList = Array.isArray(rawValues);
|
|
19239
19295
|
const resolvedParts = await allSettledKeepingFirstRejection(() => values.map(async (v) => {
|
|
19240
19296
|
if (typeof v === "string") {
|
|
@@ -19317,7 +19373,7 @@ async function resolveSelect(selectArgs, context) {
|
|
|
19317
19373
|
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Select: the index${sourceClause} must resolve to a non-negative integer (a number, or its decimal string with no leading zero), got ${this.describeOperandShape(resolvedIndex, context)}. Use a literal, a Ref to a parameter or an Fn::FindInMap that yields one.`));
|
|
19318
19374
|
}
|
|
19319
19375
|
const resolvedList = await this.resolveValue(list, context);
|
|
19320
|
-
if (!Array.isArray(resolvedList)) throw new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`);
|
|
19376
|
+
if (!Array.isArray(resolvedList)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`));
|
|
19321
19377
|
const loggedPosition = this.displayMasked(String(position), context);
|
|
19322
19378
|
if (position >= resolvedList.length) {
|
|
19323
19379
|
if (loggedPosition !== String(position)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Select: the index ${loggedPosition} is out of bounds (array length: ${resolvedList.length}), and it resolves from a secret value, so cdkd will not write it into the OutOfBounds placeholder.`));
|
|
@@ -19653,7 +19709,7 @@ async function resolveConditionReference(conditionName, context) {
|
|
|
19653
19709
|
return false;
|
|
19654
19710
|
}
|
|
19655
19711
|
async function resolveAnd(conditions, context) {
|
|
19656
|
-
if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw new Error(`Fn::And requires between 2 and 10 conditions, got ${conditions.length}`);
|
|
19712
|
+
if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::And requires between 2 and 10 conditions, got ${conditions.length}`));
|
|
19657
19713
|
const results = [];
|
|
19658
19714
|
for (const condition of conditions) {
|
|
19659
19715
|
const resolved = await this.resolveValue(condition, context);
|
|
@@ -19664,7 +19720,7 @@ async function resolveAnd(conditions, context) {
|
|
|
19664
19720
|
return result;
|
|
19665
19721
|
}
|
|
19666
19722
|
async function resolveOr(conditions, context) {
|
|
19667
|
-
if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw new Error(`Fn::Or requires between 2 and 10 conditions, got ${conditions.length}`);
|
|
19723
|
+
if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Or requires between 2 and 10 conditions, got ${conditions.length}`));
|
|
19668
19724
|
const results = [];
|
|
19669
19725
|
for (const condition of conditions) {
|
|
19670
19726
|
const resolved = await this.resolveValue(condition, context);
|
|
@@ -19675,7 +19731,7 @@ async function resolveOr(conditions, context) {
|
|
|
19675
19731
|
return result;
|
|
19676
19732
|
}
|
|
19677
19733
|
async function resolveNot(notArgs, context) {
|
|
19678
|
-
if (!Array.isArray(notArgs) || notArgs.length !== 1) throw new Error(`Fn::Not requires exactly one condition, got ${Array.isArray(notArgs) ? notArgs.length : 0}`);
|
|
19734
|
+
if (!Array.isArray(notArgs) || notArgs.length !== 1) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Not requires exactly one condition, got ${Array.isArray(notArgs) ? notArgs.length : 0}`));
|
|
19679
19735
|
const [condition] = notArgs;
|
|
19680
19736
|
const resolved = await this.resolveValue(condition, context);
|
|
19681
19737
|
const result = !resolved;
|
|
@@ -19693,20 +19749,20 @@ async function resolveFindInMap(findInMapArgs, context) {
|
|
|
19693
19749
|
const map = mappings != null && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
|
|
19694
19750
|
if (!mappings) {
|
|
19695
19751
|
if (hasDefaultValue) return await resolveDefault();
|
|
19696
|
-
throw new Error(`Fn::FindInMap: no Mappings section found in template`);
|
|
19752
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: no Mappings section found in template`));
|
|
19697
19753
|
}
|
|
19698
19754
|
if (!map) {
|
|
19699
19755
|
if (hasDefaultValue) return await resolveDefault();
|
|
19700
|
-
throw new Error(`Fn::FindInMap: mapping ${quotedRender(this.displayMasked(mapName, context), "'")} not found in Mappings section`);
|
|
19756
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: mapping ${quotedRender(this.displayMasked(mapName, context), "'")} not found in Mappings section`));
|
|
19701
19757
|
}
|
|
19702
19758
|
const topLevel = Object.hasOwn(map, topLevelKey) ? map[topLevelKey] : void 0;
|
|
19703
19759
|
if (!topLevel || typeof topLevel !== "object") {
|
|
19704
19760
|
if (hasDefaultValue) return await resolveDefault();
|
|
19705
|
-
throw new Error(`Fn::FindInMap: top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")}`);
|
|
19761
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")}`));
|
|
19706
19762
|
}
|
|
19707
19763
|
if (!Object.hasOwn(topLevel, secondLevelKey)) {
|
|
19708
19764
|
if (hasDefaultValue) return await resolveDefault();
|
|
19709
|
-
throw new Error(`Fn::FindInMap: second-level key ${quotedRender(this.displayMasked(secondLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")} under top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")}`);
|
|
19765
|
+
throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: second-level key ${quotedRender(this.displayMasked(secondLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")} under top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")}`));
|
|
19710
19766
|
}
|
|
19711
19767
|
const result = topLevel[secondLevelKey];
|
|
19712
19768
|
this.logger.debug(`Resolved Fn::FindInMap: ${this.logRender(mapName, context)}.${this.logRender(topLevelKey, context)}.${this.logRender(secondLevelKey, context)} resolved to ${this.logRender(JSON.stringify(this.maskValueLeaves(result, context)), context, { structured: true })}`);
|
|
@@ -19714,7 +19770,7 @@ async function resolveFindInMap(findInMapArgs, context) {
|
|
|
19714
19770
|
}
|
|
19715
19771
|
async function resolveBase64(value, context) {
|
|
19716
19772
|
const resolvedValue = await this.resolveValue(value, context);
|
|
19717
|
-
if (typeof resolvedValue !== "string") throw new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`);
|
|
19773
|
+
if (typeof resolvedValue !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`));
|
|
19718
19774
|
if (context.skipDynamicReferences === true && keepsSecretReferenceToken(resolvedValue) && !(context.recordedSecretValues !== void 0 && embedsFreshNoEchoValue(resolvedValue, context.recordedSecretValues))) {
|
|
19719
19775
|
this.logger.debug(safeMsg`Resolved Fn::Base64: ${this.logRender(this.logTextOfLeaf(resolvedValue, context), context)} resolved to ${"***"} (an unresolved secret reference, compared as the mask the deploy persists)`);
|
|
19720
19776
|
return "***";
|
|
@@ -19742,7 +19798,7 @@ async function resolveGetAZs(value, context) {
|
|
|
19742
19798
|
let loggedRegionText;
|
|
19743
19799
|
if (typeof resolvedValue === "string" && resolvedValue !== "") {
|
|
19744
19800
|
const requested = canonicalizeRegion(resolvedValue);
|
|
19745
|
-
if (!isClientSafeRegion(requested)) throw new Error(`Fn::GetAZs: the value ${quotedRender(this.displayMasked(this.logTextOfLeaf(resolvedValue, context) !== resolvedValue ? "***" : resolvedValue, context).slice(0, 64), "'")} is not a valid AWS region name. A region is substituted into the AWS service hostname, so cdkd will not build a client from it.`);
|
|
19801
|
+
if (!isClientSafeRegion(requested)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAZs: the value ${quotedRender(this.displayMasked(this.logTextOfLeaf(resolvedValue, context) !== resolvedValue ? "***" : resolvedValue, context).slice(0, 64), "'")} is not a valid AWS region name. A region is substituted into the AWS service hostname, so cdkd will not build a client from it.`));
|
|
19746
19802
|
region = requested;
|
|
19747
19803
|
clientRegion = requested;
|
|
19748
19804
|
loggedRegionText = this.regionLogText(resolvedValue, context);
|
|
@@ -19771,7 +19827,7 @@ async function resolveGetAZs(value, context) {
|
|
|
19771
19827
|
const masks = this.namedRequestMasks([[region, loggedRegion]], context);
|
|
19772
19828
|
throw new Error(`Fn::GetAZs: failed to describe availability zones for region ${quotedRender(loggedRegion, "'")}: ${masks.text(error instanceof Error ? error.message : String(error))}`);
|
|
19773
19829
|
}
|
|
19774
|
-
if (azNames.length === 0) throw new Error(`Fn::GetAZs: no availability zones returned for region ${quotedRender(this.displayMasked(loggedRegionText ?? region, context), "'")}. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`);
|
|
19830
|
+
if (azNames.length === 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAZs: no availability zones returned for region ${quotedRender(this.displayMasked(loggedRegionText ?? region, context), "'")}. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`));
|
|
19775
19831
|
cachedAvailabilityZones.set(azCacheKey, azNames);
|
|
19776
19832
|
this.logger.debug(`Resolved Fn::GetAZs: ${this.logRender(loggedRegionText ?? region, context)} resolved to ${this.logRender(JSON.stringify(this.maskValueLeaves(azNames, context)), context, { structured: true })}`);
|
|
19777
19833
|
return azNames;
|
|
@@ -19797,7 +19853,7 @@ async function resolveCidr(args, context) {
|
|
|
19797
19853
|
const ipBlock = await this.resolveValue(rawIpBlock, context);
|
|
19798
19854
|
const count = Number(await this.resolveValue(rawCount, context));
|
|
19799
19855
|
const cidrBits = Number(await this.resolveValue(rawCidrBits, context));
|
|
19800
|
-
if (!ipBlock || typeof ipBlock !== "string") throw new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`);
|
|
19856
|
+
if (!ipBlock || typeof ipBlock !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`));
|
|
19801
19857
|
this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${this.displayMasked(String(count), context)}, cidrBits=${this.displayMasked(String(cidrBits), context)}`);
|
|
19802
19858
|
const isIpv6 = ipBlock.includes(":");
|
|
19803
19859
|
const results = [];
|
|
@@ -20095,7 +20151,7 @@ async function resolveParameters(template, userParameters, options) {
|
|
|
20095
20151
|
let referencedNames;
|
|
20096
20152
|
for (const [name, definition] of Object.entries(templateParameters)) {
|
|
20097
20153
|
const paramDef = definition;
|
|
20098
|
-
if (isUnboundTemplateParameter(name, template, userParameters)) throw new Error(`Parameter ${maskInherited(name)} is required but no value was provided and no default exists`);
|
|
20154
|
+
if (isUnboundTemplateParameter(name, template, userParameters)) throw markNonRetryable(/* @__PURE__ */ new Error(`Parameter ${maskInherited(name)} is required but no value was provided and no default exists`));
|
|
20099
20155
|
if (userParameters && Object.hasOwn(userParameters, name)) {
|
|
20100
20156
|
const userValue = userParameters[name];
|
|
20101
20157
|
if (userValue !== void 0) {
|
|
@@ -20197,6 +20253,7 @@ function recordInheritedParameterSecrets(parameterName, value, context) {
|
|
|
20197
20253
|
for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
20198
20254
|
const own = inheritedParameterExpression(inherited, parameterName, plaintext);
|
|
20199
20255
|
recorded.set(plaintext, typeof own === "string" ? own : expression);
|
|
20256
|
+
recordInheritedParameterRead(recorded, inherited, parameterName);
|
|
20200
20257
|
carryFreshNoEchoMark(inherited, recorded, plaintext);
|
|
20201
20258
|
}
|
|
20202
20259
|
}
|
|
@@ -20420,7 +20477,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
20420
20477
|
if ("Fn::GetAZs" in obj) return await this.resolveGetAZs(obj["Fn::GetAZs"], context);
|
|
20421
20478
|
if ("Fn::Cidr" in obj) return await this.resolveCidr(obj["Fn::Cidr"], context);
|
|
20422
20479
|
const unknownIntrinsicKey = detectUnknownIntrinsicKey(obj);
|
|
20423
|
-
if (unknownIntrinsicKey !== void 0) throw buildUnknownIntrinsicError(unknownIntrinsicKey);
|
|
20480
|
+
if (unknownIntrinsicKey !== void 0) throw markNonRetryable(buildUnknownIntrinsicError(unknownIntrinsicKey));
|
|
20424
20481
|
const resolved = {};
|
|
20425
20482
|
for (const [key, val] of Object.entries(obj)) {
|
|
20426
20483
|
const resolvedVal = context.abandonedResolutions === void 0 ? await this.resolveValue(val, context) : await this.resolveKeyUnit(key, val, context, context.abandonedResolutions);
|
|
@@ -20618,10 +20675,10 @@ var DiffCalculator = class DiffCalculator {
|
|
|
20618
20675
|
conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue) {
|
|
20619
20676
|
return this.replacementRules.conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue);
|
|
20620
20677
|
}
|
|
20621
|
-
async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs) {
|
|
20678
|
+
async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs, refusalRecovery) {
|
|
20622
20679
|
const changes = /* @__PURE__ */ new Map();
|
|
20623
|
-
refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0);
|
|
20624
|
-
refuseMalformedResourceProperties(currentState, void 0, void 0);
|
|
20680
|
+
refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0, refusalRecovery);
|
|
20681
|
+
refuseMalformedResourceProperties(currentState, void 0, void 0, refusalRecovery);
|
|
20625
20682
|
const currentResources = currentState.resources;
|
|
20626
20683
|
const desiredResources = desiredTemplate.Resources;
|
|
20627
20684
|
this.logger.debug("Calculating diff...");
|
|
@@ -22050,7 +22107,7 @@ var CloudControlProvider = class {
|
|
|
22050
22107
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
22051
22108
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
22052
22109
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
22053
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
22110
|
+
const { ASGProvider } = await import("./asg-provider-BDJ1qN0J.js");
|
|
22054
22111
|
const delegateRegion = ambientRegion();
|
|
22055
22112
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
22056
22113
|
if (asgProvider === void 0) {
|
|
@@ -22156,7 +22213,7 @@ var CloudControlProvider = class {
|
|
|
22156
22213
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
22157
22214
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
22158
22215
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
22159
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
22216
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-C193wAF8.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-C-WMp2hQ.js"))).NeptuneProvider({ region: ccRegion });
|
|
22160
22217
|
this.sdkDeleteDelegates.set(family, {
|
|
22161
22218
|
region: ccRegion,
|
|
22162
22219
|
provider
|
|
@@ -27483,8 +27540,17 @@ function sanitizeSnapshotBase(physicalId) {
|
|
|
27483
27540
|
return base;
|
|
27484
27541
|
}
|
|
27485
27542
|
function finalSnapshotNamePrefix(physicalId, resourceType) {
|
|
27543
|
+
return finalSnapshotNameCut(physicalId, resourceType).prefix;
|
|
27544
|
+
}
|
|
27545
|
+
function finalSnapshotNameCut(physicalId, resourceType) {
|
|
27486
27546
|
const maxLength = resourceType === "AWS::ElastiCache::CacheCluster" || resourceType === "AWS::ElastiCache::ReplicationGroup" ? 50 : 255;
|
|
27487
|
-
|
|
27547
|
+
const sanitized = sanitizeSnapshotBase(physicalId);
|
|
27548
|
+
const base = sanitized.slice(0, maxLength - 22).replace(/-+$/, "");
|
|
27549
|
+
return {
|
|
27550
|
+
prefix: `${base}-final-`,
|
|
27551
|
+
sanitized,
|
|
27552
|
+
kept: base.length
|
|
27553
|
+
};
|
|
27488
27554
|
}
|
|
27489
27555
|
function buildFinalSnapshotIdentifier(physicalId, resourceType, now = /* @__PURE__ */ new Date()) {
|
|
27490
27556
|
const ts = now.toISOString().replace(/[-:]/g, "").replace(/\..*$/, "").replace("T", "-").toLowerCase();
|
|
@@ -27827,6 +27893,24 @@ function recordRollbackSkip(scope, op, reason) {
|
|
|
27827
27893
|
reason: scope.mask(reason)
|
|
27828
27894
|
});
|
|
27829
27895
|
}
|
|
27896
|
+
function rollbackCannotAddress(record, opResourceType, route, physicalId) {
|
|
27897
|
+
return !(record?.resourceType === "AWS::CloudFormation::Stack" && opResourceType === "AWS::CloudFormation::Stack" && record.provisionedBy !== "cc-api" && route !== "cc-api") && !hasAddressablePhysicalId({ physicalId });
|
|
27898
|
+
}
|
|
27899
|
+
function retainedSurvivorId(record, op) {
|
|
27900
|
+
if (hasAddressablePhysicalId(record)) return record.physicalId;
|
|
27901
|
+
if (hasAddressablePhysicalId(op)) return op.physicalId;
|
|
27902
|
+
}
|
|
27903
|
+
const UNADDRESSABLE_SKIP_CAUSE = "Its recorded 'physicalId' is not a non-empty string, so cdkd cannot address the resource in AWS and sent nothing for it; the rollback left it and its state record exactly as they are.";
|
|
27904
|
+
const UNADDRESSABLE_JOURNAL_SKIP_CAUSE = "Its rollback-journal entry's 'physicalId' is not a non-empty string and no state record holds the resource, so cdkd cannot address it in AWS and sent nothing for it; if it was created in AWS, delete it manually.";
|
|
27905
|
+
function skipUnaddressableReplay(scope, logger, op, what, source = "record") {
|
|
27906
|
+
if (source === "journal") {
|
|
27907
|
+
logger.warn(safeMsg` Rollback: Cannot ${what} ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}) ` + "— its rollback journal entry has no non-empty string 'physicalId' and no state record holds it, so cdkd cannot address it in AWS and sent nothing for it. If it was created in AWS, delete it manually.");
|
|
27908
|
+
recordRollbackSkip(scope, op, UNADDRESSABLE_JOURNAL_SKIP_CAUSE);
|
|
27909
|
+
return;
|
|
27910
|
+
}
|
|
27911
|
+
logger.warn(safeMsg` Rollback: Cannot ${what} ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}) ` + "— its state record has no non-empty string 'physicalId', so cdkd cannot address it in AWS and sent nothing for it. The resource and its state record are left exactly as they are. Repair the record's 'physicalId' (inspect it with `cdkd state show`), then re-converge it with `cdkd deploy`.");
|
|
27912
|
+
recordRollbackSkip(scope, op, UNADDRESSABLE_SKIP_CAUSE);
|
|
27913
|
+
}
|
|
27830
27914
|
function effectiveProvisionedBy(record, fallbackProvisionedBy) {
|
|
27831
27915
|
return record?.provisionedBy ?? fallbackProvisionedBy;
|
|
27832
27916
|
}
|
|
@@ -28132,8 +28216,24 @@ function secretNameNeedlesOf(logicalId, record, secrets, options) {
|
|
|
28132
28216
|
if (embeddedBag !== void 0 && physicalId !== void 0) {
|
|
28133
28217
|
for (const needle of printingCorpusOf(embeddedBag).keys()) if (needle !== "" && (needle === physicalId || needle.length >= 4 && physicalId.includes(needle))) add(needle);
|
|
28134
28218
|
}
|
|
28219
|
+
if (physicalId !== void 0) for (const spelling of finalSnapshotSpellingsOf(physicalId, record?.resourceType, needles)) add(spelling);
|
|
28135
28220
|
return needles.size > 0 ? needles : void 0;
|
|
28136
28221
|
}
|
|
28222
|
+
function finalSnapshotSpellingsOf(physicalId, resourceType, needles) {
|
|
28223
|
+
if (typeof resourceType !== "string" || !(ATOMIC_FINAL_SNAPSHOT_TYPES.has(resourceType) || PRE_DELETE_SNAPSHOT_TYPES.has(resourceType))) return [];
|
|
28224
|
+
const { prefix, sanitized, kept } = finalSnapshotNameCut(physicalId, resourceType);
|
|
28225
|
+
const spellings = [];
|
|
28226
|
+
for (const needle of needles) {
|
|
28227
|
+
const folded = needle.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-{2,}/g, "-");
|
|
28228
|
+
if (folded.length < 4) continue;
|
|
28229
|
+
for (let at = sanitized.indexOf(folded); at !== -1; at = sanitized.indexOf(folded, at + 1)) {
|
|
28230
|
+
if (at >= kept) break;
|
|
28231
|
+
if (at + folded.length > kept) spellings.push(prefix);
|
|
28232
|
+
else if (folded !== needle) spellings.push(folded);
|
|
28233
|
+
}
|
|
28234
|
+
}
|
|
28235
|
+
return spellings;
|
|
28236
|
+
}
|
|
28137
28237
|
function secretNamesReadBy(logicalId, record, resources, judge = () => ({
|
|
28138
28238
|
secrets: void 0,
|
|
28139
28239
|
embedded: void 0
|
|
@@ -28565,6 +28665,15 @@ function classifyRollbackOp(op, stateResources, orphanLogicalIds) {
|
|
|
28565
28665
|
oldProperties: op.previousState.properties,
|
|
28566
28666
|
newProperties: current.properties
|
|
28567
28667
|
})) return "skip-already-done";
|
|
28668
|
+
const retainedOld = op.oldResourceRetained ?? op.previousState.updateReplacePolicy === "Retain";
|
|
28669
|
+
if (rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
|
|
28670
|
+
if (!resolveReplacementOldType(op).ok) return "refuse-replacement-routing";
|
|
28671
|
+
return retainedOld ? "reverse-replacement-readopt" : "reverse-replacement";
|
|
28672
|
+
}
|
|
28673
|
+
if (retainedOld && op.physicalId !== void 0 && !hasAddressablePhysicalId(op)) {
|
|
28674
|
+
if (!resolveReplacementOldType(op).ok) return "refuse-replacement-routing";
|
|
28675
|
+
return "reverse-replacement-readopt";
|
|
28676
|
+
}
|
|
28568
28677
|
if (op.physicalId !== void 0 && current.physicalId !== op.physicalId) {
|
|
28569
28678
|
if (sameTypeAsOld && deepEqual$1(current.properties, op.previousState.properties)) return "skip-already-done";
|
|
28570
28679
|
return "skip-mismatch";
|
|
@@ -28584,7 +28693,7 @@ function classifyFailedOp(op, stateResources, siblings = []) {
|
|
|
28584
28693
|
if (op.physicalIdRecoveredFromError === true) {
|
|
28585
28694
|
if (current) {
|
|
28586
28695
|
if (current.physicalId === op.physicalId) return "skip-failed-noop";
|
|
28587
|
-
if (!isReplacedRecord(op, current)) return "skip-failed-mismatch";
|
|
28696
|
+
if (!isReplacedRecord(op, current) && !isProvenDistinctRecord(op, current)) return "skip-failed-mismatch";
|
|
28588
28697
|
}
|
|
28589
28698
|
if (stateHoldsPhysicalId(stateResources, op.resourceType, op.physicalId)) return "skip-failed-noop";
|
|
28590
28699
|
const orphanPolicy = effectiveDeletionPolicy(op.resourceType, op.deletionPolicy, op.attemptedProperties);
|
|
@@ -28611,7 +28720,21 @@ function isReplacedRecord(op, record) {
|
|
|
28611
28720
|
return isReplacementOrphan(op) && record !== void 0 && record.physicalId === op.replacedPhysicalId && record.resourceType === op.replacedResourceType;
|
|
28612
28721
|
}
|
|
28613
28722
|
function failedOpOwnRecord(op, stateResources) {
|
|
28614
|
-
return
|
|
28723
|
+
return recordUnderIdIsNotOwn(op, stateResources) ? void 0 : stateResources[op.logicalId];
|
|
28724
|
+
}
|
|
28725
|
+
const provenDistinctFrom = /* @__PURE__ */ new WeakMap();
|
|
28726
|
+
function markProvenDistinctFromRecord(op, record) {
|
|
28727
|
+
provenDistinctFrom.set(op, {
|
|
28728
|
+
physicalId: record.physicalId,
|
|
28729
|
+
resourceType: record.resourceType
|
|
28730
|
+
});
|
|
28731
|
+
}
|
|
28732
|
+
function isProvenDistinctRecord(op, record) {
|
|
28733
|
+
const verdict = provenDistinctFrom.get(op);
|
|
28734
|
+
return verdict !== void 0 && record !== void 0 && record.physicalId === verdict.physicalId && record.resourceType === verdict.resourceType;
|
|
28735
|
+
}
|
|
28736
|
+
function recordUnderIdIsNotOwn(op, stateResources) {
|
|
28737
|
+
return isReplacementOrphan(op) || isProvenDistinctRecord(op, Object.hasOwn(stateResources, op.logicalId) ? stateResources[op.logicalId] : void 0);
|
|
28615
28738
|
}
|
|
28616
28739
|
function replacementNeverSwapped(op, siblings) {
|
|
28617
28740
|
return siblings.some((s) => s !== op && isReplacementOrphan(s) && s.logicalId === op.logicalId && s.replacedPhysicalId === op.physicalId);
|
|
@@ -28892,6 +29015,10 @@ async function replayDelete(s) {
|
|
|
28892
29015
|
return;
|
|
28893
29016
|
}
|
|
28894
29017
|
const deleteProvisionedBy = effectiveProvisionedBy(stateResources[op.logicalId], op.provisionedBy);
|
|
29018
|
+
if (rollbackCannotAddress(stateResources[op.logicalId], op.resourceType, deleteProvisionedBy, op.physicalId)) {
|
|
29019
|
+
skipUnaddressableReplay(s, logger, op, "delete created resource");
|
|
29020
|
+
return;
|
|
29021
|
+
}
|
|
28895
29022
|
s.createRollbackRoute = deleteProvisionedBy;
|
|
28896
29023
|
const snapshotPolicy = action === "delete-with-final-snapshot";
|
|
28897
29024
|
const takeFinalSnapshot = snapshotPolicy && ctx.skipFinalSnapshot !== true;
|
|
@@ -28937,10 +29064,24 @@ async function replayReadopt(s) {
|
|
|
28937
29064
|
const { op, stateResources, stackName, ctx, result, inlinePolicyWriters, afterOp, logger, mask } = s;
|
|
28938
29065
|
const current = stateResources[op.logicalId];
|
|
28939
29066
|
const prev = op.previousState;
|
|
29067
|
+
const oldShown = hasAddressablePhysicalId({ physicalId: prev.physicalId }) ? displaySafe(mask(prev.physicalId)) : "no recorded id";
|
|
29068
|
+
const unprovenCopyRefusal = (reason) => {
|
|
29069
|
+
const remedy = orphanRemedy(op.logicalId, ctx);
|
|
29070
|
+
return ownRemedyError(markNonRetryable(new CdkdError(safeMsg`Cannot reverse the replacement of ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}): ` + reason + ` The retained old resource (${oldShown}) is named only by the rollback journal, so the JOURNAL is kept. Check both resources by hand.` + (remedy.offered ? ` To leave this one as it is, re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")} with the command below; that also drops the journal's only record of the retained old resource (${oldShown}), so note that id first.` : ` No repair of the state record makes this op succeed on a re-run.`) + remedy.clause + remedy.line, STATE_RESOURCES_MALFORMED)));
|
|
29071
|
+
};
|
|
29072
|
+
const opIdUnusable = op.physicalId !== void 0 && !hasAddressablePhysicalId(op);
|
|
29073
|
+
if (!rollbackRetainsNewResource(current) && rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
|
|
29074
|
+
if (opIdUnusable) throw unprovenCopyRefusal("neither its state record nor its rollback journal entry has a non-empty string 'physicalId' for the replacement's new resource, so cdkd cannot address that resource in AWS or tell which resource it is, and sent nothing.");
|
|
29075
|
+
const target = op.physicalId === void 0 ? void 0 : refusalPhysicalId(mask(String(op.physicalId)));
|
|
29076
|
+
const repair = target === void 0 ? `Repair the record's 'physicalId' to the id of the replacement's NEW resource (inspect it with \`cdkd state show\`): the journal does not record that id, and the re-run DELETES the resource the repaired record names as the new copy, so name the right one. Then re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")}.` : `Repair the record's 'physicalId' to ${target}, the replacement's new resource the journal records (inspect it with \`cdkd state show\`); the re-run deletes it and re-adopts the old one. Any other id stops the revert and drops the journal's only record of the retained old resource (${oldShown}). Then re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")}.` + (describedPhysicalIdPointer(target) !== "" ? " That id is left out of the prose above: it is not a plain identifier — read it from the rollback journal." : target.includes("***") ? ` That id is shown masked — read the full value from the rollback journal.` : "");
|
|
29077
|
+
throw new CdkdError(safeMsg`Cannot reverse the replacement of ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}): ` + `its state record has no non-empty string 'physicalId', so cdkd cannot address the new resource in AWS to delete it, and sent nothing. The retained old resource (${oldShown}) is named only by the rollback journal, so the JOURNAL is kept. ` + repair, STATE_RESOURCES_MALFORMED);
|
|
29078
|
+
}
|
|
29079
|
+
if (!rollbackRetainsNewResource(current) && opIdUnusable && current.physicalId !== op.physicalId) throw unprovenCopyRefusal("its rollback journal entry has no non-empty string 'physicalId' for the replacement's new resource, so cdkd cannot tell whether the resource state records under this id is that one, and did not delete it; nothing was sent.");
|
|
28940
29080
|
logger.info(` Rollback: Reversing replacement of ${safe(op.logicalId)} (${safe(op.resourceType)}) — deleting the new resource and re-adopting the retained old one (${displaySafe(mask(prev.physicalId))})`);
|
|
28941
29081
|
let survivorReason;
|
|
29082
|
+
const survivorId = retainedSurvivorId(current, op);
|
|
28942
29083
|
if (rollbackRetainsNewResource(current)) {
|
|
28943
|
-
const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType,
|
|
29084
|
+
const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, survivorId ?? "no recorded id", `State is restored to the old resource (${prev.physicalId}).`, mask);
|
|
28944
29085
|
logger.warn(survivorMessages.warn);
|
|
28945
29086
|
survivorReason = survivorMessages.reason;
|
|
28946
29087
|
result.warnings++;
|
|
@@ -28978,7 +29119,7 @@ async function replayReadopt(s) {
|
|
|
28978
29119
|
resourceType: op.resourceType,
|
|
28979
29120
|
...op.provisionedBy && { provisionedBy: op.provisionedBy },
|
|
28980
29121
|
...survivorReason !== void 0 && {
|
|
28981
|
-
physicalId:
|
|
29122
|
+
...survivorId !== void 0 && { physicalId: survivorId },
|
|
28982
29123
|
reason: mask(survivorReason),
|
|
28983
29124
|
...survivorProvisionedBy && { provisionedBy: survivorProvisionedBy }
|
|
28984
29125
|
}
|
|
@@ -29007,6 +29148,10 @@ async function replayRevert(s) {
|
|
|
29007
29148
|
recordRollbackSkip(s, op, ABSENT_BASELINE_SKIP_CAUSE);
|
|
29008
29149
|
return;
|
|
29009
29150
|
}
|
|
29151
|
+
if (rollbackCannotAddress(current, op.resourceType, op.provisionedBy, current.physicalId)) {
|
|
29152
|
+
skipUnaddressableReplay(s, logger, op, "restore");
|
|
29153
|
+
return;
|
|
29154
|
+
}
|
|
29010
29155
|
logger.info(` Rollback: Restoring ${safe(op.logicalId)} (${safe(op.resourceType)}) to previous state`);
|
|
29011
29156
|
const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
|
|
29012
29157
|
resourceType: op.resourceType,
|
|
@@ -29086,6 +29231,10 @@ async function replayReverseReplacement(s) {
|
|
|
29086
29231
|
recordRollbackSkip(s, op, ABSENT_BASELINE_SKIP_CAUSE);
|
|
29087
29232
|
return;
|
|
29088
29233
|
}
|
|
29234
|
+
if (!rollbackRetainsNewResource(current) && rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
|
|
29235
|
+
skipUnaddressableReplay(s, logger, op, "reverse the replacement of");
|
|
29236
|
+
return;
|
|
29237
|
+
}
|
|
29089
29238
|
const resolvedPrevProps = await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId) ?? {};
|
|
29090
29239
|
refuseMaskedReplayBaseline(resolvedPrevProps, op.logicalId);
|
|
29091
29240
|
opMasker.addNamed({
|
|
@@ -29228,8 +29377,9 @@ async function replayReverseReplacement(s) {
|
|
|
29228
29377
|
if (!adoptedLiveNewResource) inlinePolicyWriters.record(op.logicalId, "create", stateResources[op.logicalId], false, createProvisionedBy);
|
|
29229
29378
|
await afterOp?.(op.logicalId);
|
|
29230
29379
|
let survivorReason;
|
|
29380
|
+
const survivorId = retainedSurvivorId(current, op);
|
|
29231
29381
|
if (!deletedNewFirst && !adoptedLiveNewResource && rollbackRetainsNewResource(current)) {
|
|
29232
|
-
const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType,
|
|
29382
|
+
const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, survivorId ?? "no recorded id", `State records the re-created old resource (${stateResources[op.logicalId]?.physicalId ?? prev.physicalId}).`, mask);
|
|
29233
29383
|
logger.warn(survivorMessages.warn);
|
|
29234
29384
|
survivorReason = survivorMessages.reason;
|
|
29235
29385
|
result.warnings++;
|
|
@@ -29261,7 +29411,7 @@ async function replayReverseReplacement(s) {
|
|
|
29261
29411
|
resourceType: op.resourceType,
|
|
29262
29412
|
...op.provisionedBy && { provisionedBy: op.provisionedBy },
|
|
29263
29413
|
...survivorReason !== void 0 && {
|
|
29264
|
-
physicalId:
|
|
29414
|
+
...survivorId !== void 0 && { physicalId: survivorId },
|
|
29265
29415
|
reason: mask(survivorReason),
|
|
29266
29416
|
...survivorProvisionedBy && { provisionedBy: survivorProvisionedBy }
|
|
29267
29417
|
},
|
|
@@ -29548,7 +29698,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
29548
29698
|
result.orphaned.push(orphaned);
|
|
29549
29699
|
options.onOrphan?.(orphaned);
|
|
29550
29700
|
}
|
|
29551
|
-
if (!
|
|
29701
|
+
if (!recordUnderIdIsNotOwn(op, stateResources)) delete stateResources[op.logicalId];
|
|
29552
29702
|
await noteRetainedResource(op.resourceType, op.logicalId);
|
|
29553
29703
|
logger.info(` Rollback: leaving partially-created ${safe(op.logicalId)} (${safe(op.resourceType)}) in AWS (DeletionPolicy: Retain)` + (failedCreateRecord ? " — removed from state" : " — it was never in state"));
|
|
29554
29704
|
await options.afterOp?.(op.logicalId);
|
|
@@ -29566,6 +29716,10 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
29566
29716
|
case "delete-failed-create-with-final-snapshot": {
|
|
29567
29717
|
const failedCreateRecord = failedOpOwnRecord(op, stateResources);
|
|
29568
29718
|
const deleteProvisionedBy = effectiveProvisionedBy(failedCreateRecord, op.provisionedBy);
|
|
29719
|
+
if (rollbackCannotAddress(failedCreateRecord, op.resourceType, deleteProvisionedBy, op.physicalId)) {
|
|
29720
|
+
skipUnaddressableReplay(skipScope, logger, op, "delete partially-created resource", failedCreateRecord ? "record" : "journal");
|
|
29721
|
+
break;
|
|
29722
|
+
}
|
|
29569
29723
|
createRollbackRoute = deleteProvisionedBy;
|
|
29570
29724
|
const snapshotPolicy = action === "delete-failed-create-with-final-snapshot";
|
|
29571
29725
|
const takeFinalSnapshot = snapshotPolicy && ctx.skipFinalSnapshot !== true;
|
|
@@ -29603,7 +29757,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
29603
29757
|
result.warnings++;
|
|
29604
29758
|
result.leftInPlace++;
|
|
29605
29759
|
}
|
|
29606
|
-
if (!
|
|
29760
|
+
if (!recordUnderIdIsNotOwn(op, stateResources)) delete stateResources[op.logicalId];
|
|
29607
29761
|
await options.afterOp?.(op.logicalId);
|
|
29608
29762
|
ctx.recordEvent?.({
|
|
29609
29763
|
eventType: "ROLLBACK_RESOURCE_SUCCEEDED",
|
|
@@ -29627,6 +29781,10 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
29627
29781
|
recordRollbackSkip(skipScope, op, ABSENT_BASELINE_SKIP_CAUSE);
|
|
29628
29782
|
break;
|
|
29629
29783
|
}
|
|
29784
|
+
if (rollbackCannotAddress(current, op.resourceType, op.provisionedBy ?? current.provisionedBy, current.physicalId)) {
|
|
29785
|
+
skipUnaddressableReplay(skipScope, logger, op, "force-revert failed UPDATE of");
|
|
29786
|
+
break;
|
|
29787
|
+
}
|
|
29630
29788
|
logger.info(` Rollback: force-reverting failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) to its pre-deploy properties (--revert-failed; remote state is unknown)`);
|
|
29631
29789
|
const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
|
|
29632
29790
|
resourceType: op.resourceType,
|
|
@@ -29703,7 +29861,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
29703
29861
|
error: maskedRollbackEventError(revertError, mask)
|
|
29704
29862
|
});
|
|
29705
29863
|
}
|
|
29706
|
-
inlinePolicyWriters.noteOutcome(op, action === "skip-failed-noop" || action === "skip-failed-mismatch" || action === "skip-failed-superseded" || action === "skip-failed-replaced-deleted" || ownRecord(stateResources, op.logicalId) !== recordBefore ||
|
|
29864
|
+
inlinePolicyWriters.noteOutcome(op, action === "skip-failed-noop" || action === "skip-failed-mismatch" || action === "skip-failed-superseded" || action === "skip-failed-replaced-deleted" || ownRecord(stateResources, op.logicalId) !== recordBefore || recordUnderIdIsNotOwn(op, stateResources) && !pending.has(op) && (action === "delete-failed-create" || action === "delete-failed-create-with-final-snapshot" || action === "orphan-failed-create-retain"));
|
|
29707
29865
|
}
|
|
29708
29866
|
if (result.interrupted) await restoreHeldInlinePolicies(inlinePolicyWriters, stateResources, stackName, ctx, result, { refuseAll: true });
|
|
29709
29867
|
if (emitEnvelope) ctx.recordEvent?.({
|
|
@@ -30313,7 +30471,7 @@ async function settleJournaledOrphansOnSuccess(args) {
|
|
|
30313
30471
|
logger.info(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created that no state record holds; acting on them per their DeletionPolicy before the journal is removed:`);
|
|
30314
30472
|
for (const line of journaledOrphanLines(orphans, logger)) logger.info(line);
|
|
30315
30473
|
try {
|
|
30316
|
-
const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted);
|
|
30474
|
+
const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted, ctx);
|
|
30317
30475
|
const acting = {
|
|
30318
30476
|
segments: orphans.segments.map(({ segment, ops }) => ({
|
|
30319
30477
|
segment,
|
|
@@ -30372,7 +30530,7 @@ async function settleJournaledOrphansOnSuccess(args) {
|
|
|
30372
30530
|
keepJournal: true
|
|
30373
30531
|
};
|
|
30374
30532
|
}
|
|
30375
|
-
async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted) {
|
|
30533
|
+
async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted, identityCtx) {
|
|
30376
30534
|
const unreadable = /* @__PURE__ */ new Set();
|
|
30377
30535
|
const tracked = /* @__PURE__ */ new Set();
|
|
30378
30536
|
let interrupted = false;
|
|
@@ -30387,9 +30545,20 @@ async function applySuccessRule(orphans, stateResources, deployLogicalIds, forei
|
|
|
30387
30545
|
tracked.add(op);
|
|
30388
30546
|
continue;
|
|
30389
30547
|
}
|
|
30390
|
-
|
|
30391
|
-
|
|
30392
|
-
|
|
30548
|
+
const hasRecord = Object.prototype.hasOwnProperty.call(stateResources, op.logicalId);
|
|
30549
|
+
const record = hasRecord ? stateResources[op.logicalId] : void 0;
|
|
30550
|
+
const recordUnderId = hasRecord && !isReplacedRecord(op, record);
|
|
30551
|
+
if (recordUnderId || deployLogicalIds.has(op.logicalId)) {
|
|
30552
|
+
const verdict = recordUnderId ? await recordIdentity(op, record, identityCtx, logger) : "unknown";
|
|
30553
|
+
if (verdict === "same") {
|
|
30554
|
+
tracked.add(op);
|
|
30555
|
+
continue;
|
|
30556
|
+
}
|
|
30557
|
+
if (verdict !== "different") {
|
|
30558
|
+
op.physicalIdRecoveredFromError = false;
|
|
30559
|
+
continue;
|
|
30560
|
+
}
|
|
30561
|
+
markProvenDistinctFromRecord(op, record);
|
|
30393
30562
|
}
|
|
30394
30563
|
const holding = await foreignHolder(op.resourceType, op.physicalId);
|
|
30395
30564
|
if (holding === void 0) continue;
|
|
@@ -30406,6 +30575,23 @@ async function applySuccessRule(orphans, stateResources, deployLogicalIds, forei
|
|
|
30406
30575
|
tracked
|
|
30407
30576
|
};
|
|
30408
30577
|
}
|
|
30578
|
+
async function recordIdentity(op, record, ctx, logger) {
|
|
30579
|
+
if (typeof record !== "object" || record === null || record.resourceType !== op.resourceType || typeof record.physicalId !== "string" || record.physicalId === "" || !op.physicalId) return "unknown";
|
|
30580
|
+
try {
|
|
30581
|
+
const { provider } = ctx.providerRegistry.getProviderFor({
|
|
30582
|
+
resourceType: op.resourceType,
|
|
30583
|
+
provisionedBy: op.provisionedBy
|
|
30584
|
+
});
|
|
30585
|
+
if (typeof provider.isSameResource !== "function") return "unknown";
|
|
30586
|
+
return await provider.isSameResource(op.physicalId, {
|
|
30587
|
+
physicalId: record.physicalId,
|
|
30588
|
+
...record.provisionedBy !== void 0 && { provisionedBy: record.provisionedBy }
|
|
30589
|
+
}, op.resourceType, { expectedRegion: ctx.region });
|
|
30590
|
+
} catch (err) {
|
|
30591
|
+
logger.debug(safeMsg`Could not compare ${logicalIdShown(op.logicalId)}'s journaled resource with its state record (${displaySafe(err instanceof Error ? err.name : typeof err)}).`);
|
|
30592
|
+
return "unknown";
|
|
30593
|
+
}
|
|
30594
|
+
}
|
|
30409
30595
|
function makeForeignHolderScan(stateBackend) {
|
|
30410
30596
|
let scan;
|
|
30411
30597
|
const key = (type, id) => JSON.stringify([type, id]);
|
|
@@ -31307,7 +31493,7 @@ function redactParametersForDiff(parameterValues) {
|
|
|
31307
31493
|
const inherited = this.options.inheritedSecrets;
|
|
31308
31494
|
if (!inherited || inherited.size === 0) return parameterValues;
|
|
31309
31495
|
const out = Object.create(null);
|
|
31310
|
-
for (const [name, value] of Object.entries(parameterValues)) out[name] =
|
|
31496
|
+
for (const [name, value] of Object.entries(parameterValues)) out[name] = redactInheritedParameterValue(inherited, name, value);
|
|
31311
31497
|
return out;
|
|
31312
31498
|
}
|
|
31313
31499
|
function rememberRecoverableMaskedOutputs(stackName, resolved, redacted) {
|
|
@@ -31527,7 +31713,7 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
|
|
|
31527
31713
|
recordedAttributes: currentResource.attributes
|
|
31528
31714
|
});
|
|
31529
31715
|
} catch (deleteError) {
|
|
31530
|
-
throw new Error(maskSecretsInText(`Failed to delete old resource ${logicalId} (${currentResource.physicalId}) during the --replace delete-first fallback: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, secrets));
|
|
31716
|
+
throw new Error(maskSecretsInText(`Failed to delete old resource ${logicalId} (${currentResource.physicalId}) during the --replace delete-first fallback: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, secrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, secrets) : void 0 });
|
|
31531
31717
|
}
|
|
31532
31718
|
reportDeleteGuards(deleteResult, {
|
|
31533
31719
|
physicalId: currentResource.physicalId,
|
|
@@ -31550,7 +31736,7 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
|
|
|
31550
31736
|
isRetryable: isRecreateRetryableError
|
|
31551
31737
|
});
|
|
31552
31738
|
} catch (recreateError) {
|
|
31553
|
-
throw new Error(maskSecretsInText(`Failed to re-create ${logicalId} after the --replace delete-first fallback already deleted the old resource (${currentResource.physicalId}): ${recreateError instanceof Error ? recreateError.message : String(recreateError)}. Re-run the deploy to create it fresh.`, secrets), { cause: recreateError instanceof Error ? recreateError : void 0 });
|
|
31739
|
+
throw new Error(maskSecretsInText(`Failed to re-create ${logicalId} after the --replace delete-first fallback already deleted the old resource (${currentResource.physicalId}): ${recreateError instanceof Error ? recreateError.message : String(recreateError)}. Re-run the deploy to create it fresh.`, secrets), { cause: recreateError instanceof Error ? maskSecretsInError(recreateError, secrets) : void 0 });
|
|
31554
31740
|
}
|
|
31555
31741
|
}
|
|
31556
31742
|
function typeChangeNameQuestion(resourceType, input) {
|
|
@@ -34970,7 +35156,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
|
|
|
34970
35156
|
return;
|
|
34971
35157
|
}
|
|
34972
35158
|
this.refuseRedactedAttributeReads(logicalId, resourceType, context);
|
|
34973
|
-
if (!(currentResource.resourceType === "AWS::CloudFormation::Stack" && currentResource.provisionedBy !== "cc-api") && !hasAddressablePhysicalId(currentResource)) throw markRefusedBeforeApplying(markNonRetryable(new CdkdError(unaddressableUpdateRefusalMessage(stackName, this.stackRegion, logicalId, oldResourceType), STATE_RESOURCES_MALFORMED)));
|
|
35159
|
+
if (!(currentResource.resourceType === "AWS::CloudFormation::Stack" && currentResource.provisionedBy !== "cc-api") && !hasAddressablePhysicalId(currentResource)) throw markRefusedBeforeApplying(markNonRetryable(new CdkdError(unaddressableUpdateRefusalMessage(stackName, this.stackRegion, logicalId, oldResourceType, this.options.refusalRecovery), STATE_RESOURCES_MALFORMED)));
|
|
34974
35160
|
this.attemptedResolvedProps.set(logicalId, resolvedProps);
|
|
34975
35161
|
const noEchoHeldPaths = /* @__PURE__ */ new Set();
|
|
34976
35162
|
if (change.propertyChanges?.some((pc) => pc.requiresReplacement) === true) {
|
|
@@ -35234,7 +35420,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
|
|
|
35234
35420
|
recordedAttributes: currentResource.attributes
|
|
35235
35421
|
});
|
|
35236
35422
|
} catch (deleteError) {
|
|
35237
|
-
throw new Error(`Failed to destroy old resource ${logicalId} (${currentResource.physicalId}) during ${recreateFlagName}: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}
|
|
35423
|
+
throw new Error(maskSecretsInText(`Failed to destroy old resource ${logicalId} (${currentResource.physicalId}) during ${recreateFlagName}: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, updateSecrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, updateSecrets) : void 0 });
|
|
35238
35424
|
}
|
|
35239
35425
|
reportDeleteGuards(recreateDeleteResult, {
|
|
35240
35426
|
physicalId: currentResource.physicalId,
|
|
@@ -37167,12 +37353,12 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
37167
37353
|
};
|
|
37168
37354
|
const currentEtag = currentStateData?.etag;
|
|
37169
37355
|
this.healBaseline = currentState.resources ?? {};
|
|
37170
|
-
refuseMalformedOutputs(currentState, stackName, this.stackRegion);
|
|
37171
|
-
refuseMalformedResourcesForDeploy(currentState, stackName, this.stackRegion);
|
|
37172
|
-
refuseMalformedResourceEntriesForDeploy(currentState, stackName, this.stackRegion);
|
|
37173
|
-
refuseMalformedResourceProperties(currentState, stackName, this.stackRegion);
|
|
37174
|
-
refuseMalformedOrphans(currentState, stackName, this.stackRegion);
|
|
37175
|
-
refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion);
|
|
37356
|
+
refuseMalformedOutputs(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37357
|
+
refuseMalformedResourcesForDeploy(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37358
|
+
refuseMalformedResourceEntriesForDeploy(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37359
|
+
refuseMalformedResourceProperties(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37360
|
+
refuseMalformedOrphans(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37361
|
+
refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
37176
37362
|
const migrationPending = currentStateData?.migrationPending ?? false;
|
|
37177
37363
|
this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
|
|
37178
37364
|
if (this.options.onCurrentStateLoaded) await this.options.onCurrentStateLoaded(stackName, currentStateData?.state);
|
|
@@ -37269,7 +37455,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
37269
37455
|
sources: maskedInputSourcesForDiff,
|
|
37270
37456
|
rebaselined: /* @__PURE__ */ new Map()
|
|
37271
37457
|
};
|
|
37272
|
-
const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs);
|
|
37458
|
+
const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery);
|
|
37273
37459
|
createOnlyPrefetch.cancel();
|
|
37274
37460
|
for (const [logicalId, fingerprints] of maskedInputs?.rebaselined ?? []) {
|
|
37275
37461
|
const record = currentState.resources[logicalId];
|
|
@@ -37947,5 +38133,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
|
|
|
37947
38133
|
DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
|
|
37948
38134
|
|
|
37949
38135
|
//#endregion
|
|
37950
|
-
export { resourcesNamingDeclaredParameter as $, createSecretMasker as $a, repairMalformedResourceEntriesForReadOnly as $i, deleteSkipReason as $n, ensureAssetStorage as $o, deployRefusesOrphanRowsReason as $r, derivePartitionAndUrlSuffix as $s, effectiveDeletionPolicy as $t, resolveDynamoDbDeleteBudgetClock as A, requireConfigObject as Aa, refuseMalformedOrphans as Ai, acquireIdempotencyToken as An, acceptedCreateOnlyDropsOf as Ao, s3BucketWebsiteUrl as Ar, getDefaultStateBucketName as As, planRollback as At, getPriorAttempts as B, TemplateParser as Ba, refuseMalformedResourceEntriesForImportSave as Bi, CC_BROKEN_REASON as Bn, orphansCarriedFrom as Bo, AWS_NO_VALUE as Br, stateBucketExistenceConfirmed as Bs, updatePartialMessage as Bt, perType as C, coerceCfnInteger as Ca, malformedScrubResourceEntriesRefusalMessage as Ci, findDestructiveChanges as Cn, WHOLE_DYNAMIC_REFERENCE_PATTERN as Co, callerEnvCredentials as Cr, warnFinchArgvExposure as Cs, getStackRecords as Ct, beginDeleteWait as D, readConfigString as Da, refuseMalformedNestedChildOutputs as Di, ledgerForStack as Dn, S3StateBackend as Do, s3BucketDomainName as Dr, getDockerImageBySourceHash as Ds, isJournaledOrphan as Dt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as E, configStringRefusal as Ea, refuseDivergentRecordRegionForDestroy as Ei, earliestDefined as En, isLockInfoExpired as Eo, s3BucketArn as Er, AssetManifestLoader as Es, demoteSupersededOrphans as Et, waitForIndexesSettled as F, withRetry as Fa, refuseMalformedResourceAttributesForOrphan as Fi, refuseMalformedDesiredTags as Fn, hasUnverifiableParameterRefusal as Fo, isImpossibleEmptyStoredAttribute as Fr, resolveCaptureObservedState as Fs, inheritProducerRegions as Ft, cyan as G, createUnionSecretMasker as Ga, refuseMalformedResourcePropertiesForOrphan as Gi, getCurrentResourceSecrets as Gn, WorkGraph as Go, withSharedDrainBudget as Gr, MIGRATE_TMP_PREFIX as Gs, orphanRecordsPrintingBag as Gt, formatResourceLine as H, inheritNestedStackParameterAssociations as Ha, refuseMalformedResourcePropertiesForDestroy as Hi, ccBrokenReason as Hn, AssetPublisher as Ho, isStalePlaceholderArnAttribute as Hr, ssmResolvedValueType as Hs, completedReplayEntries as Ht, ECR_AUTO_DELETE_IMAGES_TAG as I, canonicalLambdaFunctionName as Ia, refuseMalformedResourceEntries as Ii, tagMapAsList as In, importableOutputKeys as Io, carriesDynamicReference as Ir, resolveSkipPrefix as Is, REDACTED_DELETE_ADDRESS_SKIP_REASON as It, red as J, logOnlyValueCount as Ja, refuseMalformedResourcesForExport as Ji, slowCcOperationTimeoutMs as Jn, loadPublishableAssetManifest as Jo, JSON_LISTING_HOLE_VALUE as Jr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Js, ATOMIC_FINAL_SNAPSHOT_TYPES as Jt, gray as K, hasMaskableValues as Ka, refuseMalformedResourcesForDeploy as Ki, withPrintingSecrets as Kn, buildAssetRedirectMap as Ko, parameterInputsFor as Kr, findLargeInlineResources as Ks, secretNamePrintingBag as Kt, S3_AUTO_DELETE_OBJECTS_TAG as L, lambdaFunctionNameForMask as La, refuseMalformedResourceEntriesForDeploy as Li, tagPlanWarning as Ln, importableOutputs as Lo, carriesFetchableDynamicReference as Lr, resolveStateBucketWithDefault as Ls, isRedactedRecordedValue as Lt, DELETE_INDEX_WAIT_PROCEED_NOTE as M, prefetchCreateOnlyPropertyPaths as Ma, refuseMalformedOrphansForOrphan as Mi, DBPROXY_TAG_OPTIONS as Mn, exportNamesCarriedFrom as Mo, isUnboundTemplateParameter as Mr, loadCdkJson as Ms, resolveReplacementOldType as Mt, INDEX_SETTLE_POLL_INTERVAL_MS as N, templateResourceTypes as Na, refuseMalformedOutputs as Ni, planTagDiff as Nn, hasReadableExportSet as No, parameterTypeMayLoseSecretIdentity as Nr, resolveApp as Ns, findNestedStackTypeChanges as Nt, compensateRemovedDeletionProtection as O, replayWarn as Oa, refuseMalformedOrphanRecords as Oi, reserveStackCreateToken as On, rebuildClientForBucketRegion as Oo, s3BucketDualStackDomainName as Or, Synthesizer as Os, isReplacementOrphan as Ot, deleteTableWithIndexBusyRetry as P, describeTypeWithThrottleRetry as Pa, refuseMalformedOutputsForDestroy as Pi, readTagList as Pn, hasReasonlessBaselineRefusal as Po, getAccountInfo as Pr, resolveAutoAssetStorage as Ps, getCurrentProducerRegions as Pt, reachableDivergentParameters as Q, shareLogOnlyValues as Qa, repairMalformedOutputsForReadOnly as Qi, deleteIndeterminateGuards as Qn, assertAssetBucketRegion as Qo, UNREADABLE_RESOURCES_MAP_ROW as Qr, canonicalizeRegion as Qs, createPreDeleteFinalSnapshot as Qt, hasCdkAutoDeleteTag as R, sameLambdaFunctionAddress as Ra, refuseMalformedResourceEntriesForDestroy as Ri, definedAttributes as Rn, isReadableBag as Ro, isNamelessDynamicReferenceError as Rr, resolveStateBucketWithDefaultAndSource as Rs, redactedDeleteAddressFields as Rt, isProtectionValueActive as S, coerceCfnBoolean as Sa, malformedResourcesWarning as Si, constructPathOf as Sn, TEMPLATE_SOURCED_RULES as So, applyCallerIdentityCredentials as Sr, runDockerStreaming as Ss, destroyStackRecordsView as St, DynamoDBGlobalTableProvider as T, configIntegerRefusal as Ta, previewableOrphanRecords as Ti, RollbackInlinePolicyWriters as Tn, LockManager as To, isSettledInstanceState as Tr, stripControlChars as Ts, recordAfterRollbackUpdate as Tt, createReadOnlyAttributeHealerFactory as U, recordNestedStackParameterExpressions as Ua, refuseMalformedResourcePropertiesForDrift as Ui, wouldReturnToSdkProvider as Un, isSensitiveAttributeName as Uo, refStateLookupFromResource as Ur, CFN_TEMPLATE_BODY_LIMIT as Us, journaledOrphanPrintingBag as Ut, markRefusedBeforeApplying as V, liveMatchesUnresolvedTokenFrame as Va, refuseMalformedResourceEntriesForOrphan as Vi, ProviderRegistry as Vn, shouldRetainResource as Vo, cfnRefValueFromPhysicalId as Vr, warnDeprecatedNoPrefixCliFlag as Vs, updatePartialReason as Vt, bold as W, carryLogOnlyValues as Wa, refuseMalformedResourcePropertiesForExport as Wi, isCustomResourceType as Wn, stringifyValue as Wo, parseWebACLArn as Wr, CFN_TEMPLATE_URL_LIMIT as Ws, maskEventTextWithBoundBags as Wt, computeParameterTaint as X, recordLogOnlyParameterValue as Xa, repairMalformedOrphanRecordsForReadOnly as Xi, unchangedBehindSecretReference as Xn, AssetModeResolver as Xo, STATE_RESOURCES_MALFORMED as Xr, expectedOwnerParam as Xs, buildFinalSnapshotIdentifier as Xt, yellow as Y, printingCorpusOf as Ya, refuseMalformedState as Yi, ccProtectionRegistryTypes as Yn, rewriteTemplateAssetReferences as Yo, STATE_REGION_DIVERGED as Yr, decodeListingKey as Ys, PRE_DELETE_SNAPSHOT_TYPES as Yt, namesAnyDeclaredParameter as Z, recordLogOnlyValue as Za, repairMalformedOrphansForReadOnly as Zi, UNSPECIFIED_SKIP_REASON as Zn, BOOTSTRAP_MARKER_PREFIX as Zo, UNREADABLE_ORPHANS_CONTAINER_ROW as Zr, PARTITION_TABLE as Zs, ccRoutedFinalSnapshotError as Zt, makeCanonicalizePropertiesFn as _, WARM_THROUGHPUT_MEMBERS as _a, malformedOutputsRefusalMessage as _i, isExportAliasCollision as _n, recordProvenPublicExpression as _o, assertSendableRoleArn as _r, isMalformedEnvKey as _s, getCurrentNestedStackContext as _t, findNestedTemplateTreeDefect as a, findActionableSilentDrops as aa, hasPlainPrototype$1 as ac, isReadableResourceEntry as ai, extractDeploymentEventError as an, scrubResourceRecord as ao, isTerminationProtectionPropagationError as ar, validateContainerRepoName as as, makeSiblingClaimReader as at, recordedProtectionNote as b, toCfnInteger as ba, malformedResourceEntriesWarning as bi, DEFAULT_RESOURCE_WARN_AFTER_MS as bn, STATE_SOURCED_CROSS_GENERATION_RULES as bo, sendableAssumeRoleCommand as br, redactedDockerCause as bs, replayRollback as bt, renderNestedTemplateTreeDefect as c, withoutSilentDropProperties as ca, absoluteAssemblyPathEscape as cc, malformedExportSourceWarning as ci, exportAliasCollisionScrubWarning as cn, dynamicReferenceTokens as co, reEnableInstanceApiTermination as cr, resolveDockerContextDirectory as cs, displacedOpClause as ct, conditionInputsFrom as d, findReplacedReadersOfRecreateTargets as da, renderAssemblyPathEscape as dc, malformedLocalResourcesWarning as di, secretSafeKeyDisplay as dn, identityKeyFor as do, IntrinsicFunctionResolver as dr, describeDockerFailure as ds, getNestedRevertRun as dt, repairMalformedResourcePropertiesForReadOnly as ea, AssemblyReader as ec, displayLogicalId as ei, isFinalSnapshotError as en, errorCauseChain as eo, withIndeterminateGuard as er, getBootstrapMarkerKey as es, deleteJournaledOrphans as et, parentSuppliedValues as f, shownType as fa, resolveAssemblyPath as fc, malformedOrphanRecordsRefusalMessage as fi, exportNameSecretExposure as fn, carriesSecretMask as fo, classifyReplaySecretRegion as fr, dockerSpawnEnvWithSensitive as fs, nestedChildStackName as ft, mergeNoChangeOutputs as g, renderStatefulReason as ga, malformedOrphansWarning as gi, collectPublishedOutputNames as gn, recordNoEchoAttributeValues as go, assertFlagRoleArn as gr, isDockerClientEnvKey as gs, withNestedRevertRun as gt, keptWholeReasonText as h, isStatefulRecreateTargetSync as ha, malformedOrphansRefusalMessage as hi, collectDeclaredOutputNames as hn, recordMaskOnlyValuesIn as ho, applyRoleArnIfSet as hr, getDockerCmd as hs, revertedNestedRowIds as ht, childTemplateLoader as i, unreadableResourceEntries as ia, hasOwnKey as ic, isReadableOrphanRecord as ii, DeploymentEventsStore as in, redactSecretsForState as io, ec2InstanceProtectionSite as ir, validateAssetBucketName as is, sameJournaledOrphans as it, resolveDynamoDbDeleteBudgetMs as j, requireConfigString as ja, refuseMalformedOrphansForDestroy as ji, DBPROXY_TAGS_WHAT as jn, describeRegionValueKind as jo, coerceParameterTypedValue as jr, getLegacyStateBucketName as js, replacementNeverSwapped as jt, deleteBudgetKey as k, requireConfigArray as ka, refuseMalformedOrphanRecordsForDestroy as ki, withCreateTokenLedger as kn, splitImportedOps as ko, s3BucketRegionalDomainName as kr, synthesisStatusMessage as ks, planFailedOps as kt, templateIdentity as l, NO_CC_HANDLERS_REASON as la, describeFileReadFailure as lc, malformedLocalOutputsWarning as li, secretBearing as ln, isUncertifiedBaselineMaskPosition as lo, DiffCalculator as lr, describeDockerCapturedOutput as ls, displacedPhysicalIdShown as lt, isSecretBearingReferenceString as m, isStatefulRecreateTargetForReplace as ma, resolveBucketRegion as mc, malformedOrphanRowsKeptWarning as mi, noEchoParameterValueSeed as mn, recordMaskOnlyValue as mo, regionLessSecretName as mr, formatDockerLoginError as ms, revertNestedChildFromJournal as mt, IMPLICIT_DELETE_DEPENDENCIES as n, unpreviewableOrphanRecords as na, processStackMessages as nc, hasReadableOutputs as ni, unsupportedFinalSnapshotError as nn, maskSecretsInText as no, markWaitAbandoned as nr, parseBootstrapMarker as ns, journaledOrphanLines as nt, isAbsoluteAssetPath as o, findSilentDropProperties as oa, nullPrototypeRecord as oc, malformedDriftResourcePropertiesWarning as oi, WITHHELD_NAME_DISPLAY as on, recoverMaskedOutput as oo, observeThenDisableInstanceApiTermination as or, buildDenyExternalAccessPolicy as os, planOrphanAdoption as ot, readRecordedConditionVerdicts as p, MULTI_REGION_RECREATE_BLOCKED_TYPES as pa, clearBucketRegionCache as pc, malformedOrphanRecordsWarning as pi, isWholeDynamicReferenceValue as pn, provenPublicValue as po, producerRegionsFromState as pr, finchSecretArgvRefusal as ps, recordDisplacedSkips as pt, green as q, literalSplitDelimitersOf as qa, refuseMalformedResourcesForDestroy as qi, CloudControlProvider as qn, createAssetRedirectResolver as qo, passedParameterClassesOf as qr, uploadCfnTemplate as qs, stateSecretNameNeedles as qt, computeImplicitDeleteEdges as r, unreadableOrphanRecords as ra, defineOwnKey as rc, hasReadableResources as ri, DeploymentEventsReader as rn, markSameGenerationBag as ro, disableInstanceApiTermination as rr, readBootstrapMarkerBody as rs, loadJournaledOrphans as rt, listNestedTemplateRows as s, unwrittenCreateOnlyReplacement as sa, ownValue as sc, malformedExportNamesWarning as si, displayTextOrWithheld as sn, DYNAMIC_REFERENCE_TOKEN_SCAN as so, reDisableInstanceApiTermination as sr, buildDockerImage as ss, NESTED_PENDING_PARENT_REASON as st, DeployEngine as t, repairMalformedResourcesForReadOnly as ta, StageLoadError as tc, hasReadableOrphans as ti, refusesFinalSnapshot as tn, maskSecretsInError as to, isWaitAbandonedError as tr, isCrossRegionRedirect as ts, isHandledOrphan as tt, conditionFingerprint as u, hasNoCloudControlHandlers as ua, displayAssemblyPath as uc, malformedLocalResourceEntriesWarning as ui, secretBearingStateKeyWarning as un, pathCrossesDottedKey as uo, INTRINSIC_KEYS as ur, describeDockerExecFailure as us, dropSettledNestedJournals as ut, withResourceDeadline as v, coerceWarmThroughput as va, malformedOutputsWarning as vi, bindingSkippedOutputs as vn, wholeStringLeavesOf as vo, explicitRoleArnOrThrow as vr, partitionSensitiveEnv as vs, withNestedStackContext as vt, readProtection as w, configBooleanRefusal as wa, malformedStateRefusalMessage as wi, formatDestructiveChange as wn, isSingleDynamicReferenceToken as wo, envCredentialsAreAssumedRole as wr, escapeRegExp$3 as ws, withStackRecords as wt, PROTECTION_PROPERTY_BY_TYPE as x, toFiniteNumber as xa, malformedResourcePropertiesWarning as xi, maskingRetryLogger as xn, STATE_SOURCED_READBACK_RULES as xo, AWS_CREDENTIAL_ENV_KEYS as xr, runDockerForeground as xs, awaitInFlightSibling as xt, recordedProtectionEvidence as y, isWarmThroughputDecrease as ya, malformedRenderedContainersWarning as yi, DEFAULT_RESOURCE_TIMEOUT_MS as yn, STATE_SOURCED_BASELINE_RULES as yo, isIamRoleArn as yr, redactDockerArgvValues as ys, replayFailedOperations as yt, isTruthyCfnBoolean as z, DagBuilder as za, refuseMalformedResourceEntriesForImport as zi, stringifyIfAssigned as zn, orphansAfterRollback as zo, keepsSecretReferenceToken as zr, resolveUseCdkBootstrapAssets as zs, redactedDeleteAddressSkip as zt };
|
|
37951
|
-
//# sourceMappingURL=deploy-engine-
|
|
38136
|
+
export { resourcesNamingDeclaredParameter as $, maskSecretsInError as $a, repairMalformedResourceEntriesForReadOnly as $i, deleteSkipReason as $n, ensureAssetStorage as $o, deployRefusesOrphanRowsReason as $r, derivePartitionAndUrlSuffix as $s, effectiveDeletionPolicy as $t, resolveDynamoDbDeleteBudgetClock as A, requireConfigObject as Aa, refuseMalformedOrphans as Ai, acquireIdempotencyToken as An, acceptedCreateOnlyDropsOf as Ao, s3BucketWebsiteUrl as Ar, getDefaultStateBucketName as As, planRollback as At, getPriorAttempts as B, TemplateParser as Ba, refuseMalformedResourceEntriesForImportSave as Bi, CC_BROKEN_REASON as Bn, orphansCarriedFrom as Bo, AWS_NO_VALUE as Br, stateBucketExistenceConfirmed as Bs, updatePartialMessage as Bt, perType as C, coerceCfnInteger as Ca, malformedScrubResourceEntriesRefusalMessage as Ci, findDestructiveChanges as Cn, WHOLE_DYNAMIC_REFERENCE_PATTERN as Co, callerEnvCredentials as Cr, warnFinchArgvExposure as Cs, getStackRecords as Ct, beginDeleteWait as D, readConfigString as Da, refuseMalformedNestedChildOutputs as Di, ledgerForStack as Dn, S3StateBackend as Do, s3BucketDomainName as Dr, getDockerImageBySourceHash as Ds, isJournaledOrphan as Dt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as E, configStringRefusal as Ea, refuseDivergentRecordRegionForDestroy as Ei, earliestDefined as En, isLockInfoExpired as Eo, s3BucketArn as Er, AssetManifestLoader as Es, demoteSupersededOrphans as Et, waitForIndexesSettled as F, withRetry as Fa, refuseMalformedResourceAttributesForOrphan as Fi, refuseMalformedDesiredTags as Fn, hasUnverifiableParameterRefusal as Fo, isImpossibleEmptyStoredAttribute as Fr, resolveCaptureObservedState as Fs, inheritProducerRegions as Ft, cyan as G, literalSplitDelimitersOf as Ga, refuseMalformedResourcePropertiesForOrphan as Gi, getCurrentResourceSecrets as Gn, WorkGraph as Go, withSharedDrainBudget as Gr, MIGRATE_TMP_PREFIX as Gs, orphanRecordsPrintingBag as Gt, formatResourceLine as H, carryLogOnlyValues as Ha, refuseMalformedResourcePropertiesForDestroy as Hi, ccBrokenReason as Hn, AssetPublisher as Ho, isStalePlaceholderArnAttribute as Hr, ssmResolvedValueType as Hs, completedReplayEntries as Ht, ECR_AUTO_DELETE_IMAGES_TAG as I, canonicalLambdaFunctionName as Ia, refuseMalformedResourceEntries as Ii, tagMapAsList as In, importableOutputKeys as Io, carriesDynamicReference as Ir, resolveSkipPrefix as Is, REDACTED_DELETE_ADDRESS_SKIP_REASON as It, red as J, recordLogOnlyParameterValue as Ja, refuseMalformedResourcesForExport as Ji, slowCcOperationTimeoutMs as Jn, loadPublishableAssetManifest as Jo, JSON_LISTING_HOLE_VALUE as Jr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Js, ATOMIC_FINAL_SNAPSHOT_TYPES as Jt, gray as K, logOnlyValueCount as Ka, refuseMalformedResourcesForDeploy as Ki, withPrintingSecrets as Kn, buildAssetRedirectMap as Ko, parameterInputsFor as Kr, findLargeInlineResources as Ks, secretNamePrintingBag as Kt, S3_AUTO_DELETE_OBJECTS_TAG as L, lambdaFunctionNameForMask as La, refuseMalformedResourceEntriesForDeploy as Li, tagPlanWarning as Ln, importableOutputs as Lo, carriesFetchableDynamicReference as Lr, resolveStateBucketWithDefault as Ls, isRedactedRecordedValue as Lt, DELETE_INDEX_WAIT_PROCEED_NOTE as M, prefetchCreateOnlyPropertyPaths as Ma, refuseMalformedOrphansForOrphan as Mi, DBPROXY_TAG_OPTIONS as Mn, exportNamesCarriedFrom as Mo, isUnboundTemplateParameter as Mr, loadCdkJson as Ms, resolveReplacementOldType as Mt, INDEX_SETTLE_POLL_INTERVAL_MS as N, templateResourceTypes as Na, refuseMalformedOutputs as Ni, planTagDiff as Nn, hasReadableExportSet as No, parameterTypeMayLoseSecretIdentity as Nr, resolveApp as Ns, findNestedStackTypeChanges as Nt, compensateRemovedDeletionProtection as O, replayWarn as Oa, refuseMalformedOrphanRecords as Oi, reserveStackCreateToken as On, rebuildClientForBucketRegion as Oo, s3BucketDualStackDomainName as Or, Synthesizer as Os, isReplacementOrphan as Ot, deleteTableWithIndexBusyRetry as P, describeTypeWithThrottleRetry as Pa, refuseMalformedOutputsForDestroy as Pi, readTagList as Pn, hasReasonlessBaselineRefusal as Po, getAccountInfo as Pr, resolveAutoAssetStorage as Ps, getCurrentProducerRegions as Pt, reachableDivergentParameters as Q, errorCauseChain as Qa, repairMalformedOutputsForReadOnly as Qi, deleteIndeterminateGuards as Qn, assertAssetBucketRegion as Qo, UNREADABLE_RESOURCES_MAP_ROW as Qr, canonicalizeRegion as Qs, createPreDeleteFinalSnapshot as Qt, hasCdkAutoDeleteTag as R, sameLambdaFunctionAddress as Ra, refuseMalformedResourceEntriesForDestroy as Ri, definedAttributes as Rn, isReadableBag as Ro, isNamelessDynamicReferenceError as Rr, resolveStateBucketWithDefaultAndSource as Rs, redactedDeleteAddressFields as Rt, isProtectionValueActive as S, coerceCfnBoolean as Sa, malformedResourcesWarning as Si, constructPathOf as Sn, TEMPLATE_SOURCED_RULES as So, applyCallerIdentityCredentials as Sr, runDockerStreaming as Ss, destroyStackRecordsView as St, DynamoDBGlobalTableProvider as T, configIntegerRefusal as Ta, previewableOrphanRecords as Ti, RollbackInlinePolicyWriters as Tn, LockManager as To, isSettledInstanceState as Tr, stripControlChars as Ts, recordAfterRollbackUpdate as Tt, createReadOnlyAttributeHealerFactory as U, createUnionSecretMasker as Ua, refuseMalformedResourcePropertiesForDrift as Ui, wouldReturnToSdkProvider as Un, isSensitiveAttributeName as Uo, refStateLookupFromResource as Ur, CFN_TEMPLATE_BODY_LIMIT as Us, journaledOrphanPrintingBag as Ut, markRefusedBeforeApplying as V, liveMatchesUnresolvedTokenFrame as Va, refuseMalformedResourceEntriesForOrphan as Vi, ProviderRegistry as Vn, shouldRetainResource as Vo, cfnRefValueFromPhysicalId as Vr, warnDeprecatedNoPrefixCliFlag as Vs, updatePartialReason as Vt, bold as W, hasMaskableValues as Wa, refuseMalformedResourcePropertiesForExport as Wi, isCustomResourceType as Wn, stringifyValue as Wo, parseWebACLArn as Wr, CFN_TEMPLATE_URL_LIMIT as Ws, maskEventTextWithBoundBags as Wt, computeParameterTaint as X, shareLogOnlyValues as Xa, repairMalformedOrphanRecordsForReadOnly as Xi, unchangedBehindSecretReference as Xn, AssetModeResolver as Xo, STATE_RESOURCES_MALFORMED as Xr, expectedOwnerParam as Xs, buildFinalSnapshotIdentifier as Xt, yellow as Y, recordLogOnlyValue as Ya, refuseMalformedState as Yi, ccProtectionRegistryTypes as Yn, rewriteTemplateAssetReferences as Yo, STATE_REGION_DIVERGED as Yr, decodeListingKey as Ys, PRE_DELETE_SNAPSHOT_TYPES as Yt, namesAnyDeclaredParameter as Z, createSecretMasker as Za, repairMalformedOrphansForReadOnly as Zi, UNSPECIFIED_SKIP_REASON as Zn, BOOTSTRAP_MARKER_PREFIX as Zo, UNREADABLE_ORPHANS_CONTAINER_ROW as Zr, PARTITION_TABLE as Zs, ccRoutedFinalSnapshotError as Zt, makeCanonicalizePropertiesFn as _, WARM_THROUGHPUT_MEMBERS as _a, malformedOutputsRefusalMessage as _i, isExportAliasCollision as _n, recordProvenPublicExpression as _o, assertSendableRoleArn as _r, isMalformedEnvKey as _s, getCurrentNestedStackContext as _t, findNestedTemplateTreeDefect as a, findActionableSilentDrops as aa, hasPlainPrototype$1 as ac, isReadableResourceEntry as ai, extractDeploymentEventError as an, dynamicReferenceTokens as ao, isTerminationProtectionPropagationError as ar, validateContainerRepoName as as, makeSiblingClaimReader as at, recordedProtectionNote as b, toCfnInteger as ba, malformedResourceEntriesWarning as bi, DEFAULT_RESOURCE_WARN_AFTER_MS as bn, STATE_SOURCED_CROSS_GENERATION_RULES as bo, sendableAssumeRoleCommand as br, redactedDockerCause as bs, replayRollback as bt, renderNestedTemplateTreeDefect as c, withoutSilentDropProperties as ca, absoluteAssemblyPathEscape as cc, malformedExportSourceWarning as ci, exportAliasCollisionScrubWarning as cn, inheritNestedStackParameterAssociations as co, reEnableInstanceApiTermination as cr, resolveDockerContextDirectory as cs, displacedOpClause as ct, conditionInputsFrom as d, findReplacedReadersOfRecreateTargets as da, renderAssemblyPathEscape as dc, malformedLocalResourcesWarning as di, secretSafeKeyDisplay as dn, identityKeyFor as do, IntrinsicFunctionResolver as dr, describeDockerFailure as ds, getNestedRevertRun as dt, repairMalformedResourcePropertiesForReadOnly as ea, AssemblyReader as ec, displayLogicalId as ei, isFinalSnapshotError as en, maskSecretsInText as eo, withIndeterminateGuard as er, getBootstrapMarkerKey as es, deleteJournaledOrphans as et, parentSuppliedValues as f, shownType as fa, resolveAssemblyPath as fc, malformedOrphanRecordsRefusalMessage as fi, exportNameSecretExposure as fn, carriesSecretMask as fo, classifyReplaySecretRegion as fr, dockerSpawnEnvWithSensitive as fs, nestedChildStackName as ft, mergeNoChangeOutputs as g, renderStatefulReason as ga, malformedOrphansWarning as gi, collectPublishedOutputNames as gn, recordNoEchoAttributeValues as go, assertFlagRoleArn as gr, isDockerClientEnvKey as gs, withNestedRevertRun as gt, keptWholeReasonText as h, isStatefulRecreateTargetSync as ha, malformedOrphansRefusalMessage as hi, collectDeclaredOutputNames as hn, recordMaskOnlyValuesIn as ho, applyRoleArnIfSet as hr, getDockerCmd as hs, revertedNestedRowIds as ht, childTemplateLoader as i, unreadableResourceEntries as ia, hasOwnKey as ic, isReadableOrphanRecord as ii, DeploymentEventsStore as in, DYNAMIC_REFERENCE_TOKEN_SCAN as io, ec2InstanceProtectionSite as ir, validateAssetBucketName as is, sameJournaledOrphans as it, resolveDynamoDbDeleteBudgetMs as j, requireConfigString as ja, refuseMalformedOrphansForDestroy as ji, DBPROXY_TAGS_WHAT as jn, describeRegionValueKind as jo, coerceParameterTypedValue as jr, getLegacyStateBucketName as js, replacementNeverSwapped as jt, deleteBudgetKey as k, requireConfigArray as ka, refuseMalformedOrphanRecordsForDestroy as ki, withCreateTokenLedger as kn, splitImportedOps as ko, s3BucketRegionalDomainName as kr, synthesisStatusMessage as ks, planFailedOps as kt, templateIdentity as l, NO_CC_HANDLERS_REASON as la, describeFileReadFailure as lc, malformedLocalOutputsWarning as li, secretBearing as ln, recordNestedStackParameterExpressions as lo, DiffCalculator as lr, describeDockerCapturedOutput as ls, displacedPhysicalIdShown as lt, isSecretBearingReferenceString as m, isStatefulRecreateTargetForReplace as ma, resolveBucketRegion as mc, malformedOrphanRowsKeptWarning as mi, noEchoParameterValueSeed as mn, recordMaskOnlyValue as mo, regionLessSecretName as mr, formatDockerLoginError as ms, revertNestedChildFromJournal as mt, IMPLICIT_DELETE_DEPENDENCIES as n, unpreviewableOrphanRecords as na, processStackMessages as nc, hasReadableOutputs as ni, unsupportedFinalSnapshotError as nn, redactSecretsForState as no, markWaitAbandoned as nr, parseBootstrapMarker as ns, journaledOrphanLines as nt, isAbsoluteAssetPath as o, findSilentDropProperties as oa, nullPrototypeRecord as oc, malformedDriftResourcePropertiesWarning as oi, WITHHELD_NAME_DISPLAY as on, isUncertifiedBaselineMaskPosition as oo, observeThenDisableInstanceApiTermination as or, buildDenyExternalAccessPolicy as os, planOrphanAdoption as ot, readRecordedConditionVerdicts as p, MULTI_REGION_RECREATE_BLOCKED_TYPES as pa, clearBucketRegionCache as pc, malformedOrphanRecordsWarning as pi, isWholeDynamicReferenceValue as pn, provenPublicValue as po, producerRegionsFromState as pr, finchSecretArgvRefusal as ps, recordDisplacedSkips as pt, green as q, printingCorpusOf as qa, refuseMalformedResourcesForDestroy as qi, CloudControlProvider as qn, createAssetRedirectResolver as qo, passedParameterClassesOf as qr, uploadCfnTemplate as qs, stateSecretNameNeedles as qt, computeImplicitDeleteEdges as r, unreadableOrphanRecords as ra, defineOwnKey as rc, hasReadableResources as ri, DeploymentEventsReader as rn, scrubResourceRecord as ro, disableInstanceApiTermination as rr, readBootstrapMarkerBody as rs, loadJournaledOrphans as rt, listNestedTemplateRows as s, unwrittenCreateOnlyReplacement as sa, ownValue as sc, malformedExportNamesWarning as si, displayTextOrWithheld as sn, pathCrossesDottedKey as so, reDisableInstanceApiTermination as sr, buildDockerImage as ss, NESTED_PENDING_PARENT_REASON as st, DeployEngine as t, repairMalformedResourcesForReadOnly as ta, StageLoadError as tc, hasReadableOrphans as ti, refusesFinalSnapshot as tn, markSameGenerationBag as to, isWaitAbandonedError as tr, isCrossRegionRedirect as ts, isHandledOrphan as tt, conditionFingerprint as u, hasNoCloudControlHandlers as ua, displayAssemblyPath as uc, malformedLocalResourceEntriesWarning as ui, secretBearingStateKeyWarning as un, recoverMaskedOutput as uo, INTRINSIC_KEYS as ur, describeDockerExecFailure as us, dropSettledNestedJournals as ut, withResourceDeadline as v, coerceWarmThroughput as va, malformedOutputsWarning as vi, bindingSkippedOutputs as vn, wholeStringLeavesOf as vo, explicitRoleArnOrThrow as vr, partitionSensitiveEnv as vs, withNestedStackContext as vt, readProtection as w, configBooleanRefusal as wa, malformedStateRefusalMessage as wi, formatDestructiveChange as wn, isSingleDynamicReferenceToken as wo, envCredentialsAreAssumedRole as wr, escapeRegExp$3 as ws, withStackRecords as wt, PROTECTION_PROPERTY_BY_TYPE as x, toFiniteNumber as xa, malformedResourcePropertiesWarning as xi, maskingRetryLogger as xn, STATE_SOURCED_READBACK_RULES as xo, AWS_CREDENTIAL_ENV_KEYS as xr, runDockerForeground as xs, awaitInFlightSibling as xt, recordedProtectionEvidence as y, isWarmThroughputDecrease as ya, malformedRenderedContainersWarning as yi, DEFAULT_RESOURCE_TIMEOUT_MS as yn, STATE_SOURCED_BASELINE_RULES as yo, isIamRoleArn as yr, redactDockerArgvValues as ys, replayFailedOperations as yt, isTruthyCfnBoolean as z, DagBuilder as za, refuseMalformedResourceEntriesForImport as zi, stringifyIfAssigned as zn, orphansAfterRollback as zo, keepsSecretReferenceToken as zr, resolveUseCdkBootstrapAssets as zs, redactedDeleteAddressSkip as zt };
|
|
38137
|
+
//# sourceMappingURL=deploy-engine-iXgQFHYR.js.map
|